Agregando a ace-editor sabio autocomplete: Listar funciones y variables definidas por el usuario (lenguaje javascript)

Quiero agregar una list de funciones y variables definidas por el usuario para completarlas automáticamente. Para hacerlo, quiero examinar todo el usuario de código insertado en el documento, encontrar funciones definidas (y sus arguments), variables definidas y su scope, etc.

Pregunta principal

¿Están esos datos ya calculados en alguna parte del código fuente ace (o el complemento de idioma) y puedo tomarlos de alguna manera?

Lo que quiero

para exapmle, si el usuario insertó un código como este:

var var0 = 'abcd'; function foo(var1, var2){ var var3 = 'efg'; } 

Quiero agregar al cuadro de autocomplete, function llamada 'foo' con dos parameters: var1 y var2. Quiero agregar también var0 a la list de variables, y agregar var3 justo cuando el usuario escribe en el scope que está definido (en la function).

Lo que ya sé :

  • Sé cómo habilitar la autocompletación y la autocompletación en vivo.
  • Sé cómo agregar un nuevo completer
  • Sé que el autocompletado básico incorporado agrega todas las palabras en el documento indiscriminadamente
  • Sé sobre el complemento ace-tern , y no creo que quiera usarlo. Por ahora sigue siendo un hack, sin documentation, y no sé cómo habilitarlo.
  • Sé que Ace ya tiene algunos de los datos que estoy buscando . Por ejemplo, advierte cuando una variable se networkingefine cuando ya está definida en el mismo ámbito. Entonces tenía una list de variables y su scope. Supongo que está usando jshint, pero ¿hay alguna manera de atraparlo desde allí?
  • Leí una buena documentation y encontré muchos methods útiles que puedo usar para extraer los datos, si es necesario. La pregunta es si realmente necesito hacer esto yo mismo.

ACTUALIZACIÓN: insinué eso en mi respuesta, pero para aclararlo: Tern hará exactamente lo que estás pidiendo en lo que yo quiero . El fragment a continuación resuelve un problema más de proporcionar algún context que no desea que el usuario vea en el editor. Vea capturas de pantalla de su código utilizado en la demo en vivo de Ace.Tern

autocompletar para la función con dos parámetros dentro del alcance de la función tiene var0, var1, var2 y var3 local

Eso es opionizado, pero la mejor opción para agregar autocomplete en ace es Tern .

Tern acepta la opción de configuration typedef (descrita aquí: http://ternjs.net/doc/manual.html#typedef ), pero lo que es más interesante, aceptará su object js personalizado como un elemento secundario, es decir:

 var myContext = { name: 'myContext', obj: obj } 

Donde obj es tu object js. Luego, en la configuration Tern la usarás como:

defs: ['subrayado', myContext]

Que usará tanto el object personalizado como el module de subrayado para autocomplete.

Tern relacionado con la configuration de ace.js: (Ver https://github.com/sevin7676/Ace.Tern/blob/master/demo.html para comentarios sobre las opciones de configuration)

  var myContext = { ... } var editor = ace.edit("editor"); editor.getSession().setUseWorker(true); ace.config.loadModule('ace/ext/tern', function () { editor.setOptions({ enableTern: { defs: ['browser', 'ecma5', myContext], plugins: { doc_comment: { fullDocs: true } }, useWorker: true, startedCb: function () { console.log('editor.ternServer:', editor.ternServer); }, }, enableSnippets: true, enableBasicAutocompletion: true, }); });