Ctags: JavaScript: más etiquetado asíncrono

Creado en 7 oct. 2018  ·  13Comentarios  ·  Fuente: universal-ctags/ctags

El nombre del analizador: javascript

La línea de comando que usó para ejecutar ctags:

$ ctags --options=NONE Units/parser-javascript.r/js-async2.d/input-more-async.js

El contenido del archivo de entrada:

$ cat Units/parser-javascript.r/js-async2.d/input-more-async.js
class ES6Class {
  anotherAsyncMethod = async attrs => {}
}

La salida de etiquetas con la que no está satisfecho:

$ cat tags
!_TAG_FILE_FORMAT       2       /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED       1       /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_OUTPUT_MODE       u-ctags /u-ctags or e-ctags/
!_TAG_PROGRAM_AUTHOR    Universal Ctags Team    //
!_TAG_PROGRAM_NAME      Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL       https://ctags.io/       /official site/
!_TAG_PROGRAM_VERSION   0.0.0   /00be957/
ES6Class        Units/parser-javascript.r/js-async2.d/input-more-async.js       /^class ES6Clas
s {$/;" c

La salida de etiquetas que espera:

¿no estoy seguro? pero básicamente lo anterior, pero con una etiqueta para el método de clase asincrónica

La versión de ctags:

$ ctags --version
Universal Ctags 0.0.0(00be957), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Jul  8 2018, 17:27:03
  URL: https://ctags.io/
  Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +xpath, +case-inse
nsitive-filenames

¿Cómo se obtienen los ctags binarios? homebrew

Traté de abordar esto por mí mismo, pero no hay suficiente para comenzar solo. aparte, fui a buscar un chat comunitario y me di cuenta de que ustedes se están comunicando usando problemas (de ahí este problema).

lo que intenté:

$ git diff --cached
diff --git a/Units/parser-javascript.r/js-async2.d/expected.tags b/Units/parser-javascript.r/js
-async2.d/expected.tags
index 18b00b08..8f058db6 100644
--- a/Units/parser-javascript.r/js-async2.d/expected.tags
+++ b/Units/parser-javascript.r/js-async2.d/expected.tags
@@ -7,3 +7,4 @@ method1 input.js        /^  method1 : function() {$/;"  m       class:Class
 method2        input.js        /^  method2 : async function() {$/;"    m       class:Class
 method3        input.js        /^  method3() {$/;"     m       class:Class
 method4        input.js        /^  async method4() {$/;"       m       class:Class
+anotherAsyncMethod     input.js        /^anotherAsyncMethod = async attrs => {}$/;"    m
       class:ES6Class
diff --git a/Units/parser-javascript.r/js-async2.d/input-more-async.js b/Units/parser-javascrip
t.r/js-async2.d/input-more-async.js
new file mode 100644
index 00000000..42fcfd36
--- /dev/null
+++ b/Units/parser-javascript.r/js-async2.d/input-more-async.js
@@ -0,0 +1,3 @@
+class ES6Class {
+  anotherAsyncMethod = async attrs => {}
+}

aparte, ¿hay algún artículo sobre cómo funciona este código? No soy un desarrollador de CA, pero cuando inspeccioné otros PR que agregaron etiquetas asíncronas al analizador js, no noté muchos cambios en la lógica fuera de Units/ . ¿Está usando magia negra para derivar definiciones de etiquetas del archivo expected.tags ? ¡Ayudarme sobre cómo puedo ayudar sería genial!

Parser buenhancement

Todos 13 comentarios

La razón por la que no obtiene una etiqueta para attrs no es async , sino que el analizador JS actualmente no comprende la sintaxis del método que utilizó. Tampoco estoy familiarizado con él, pero intentaré estudiarlo para agregarle soporte.
Puede comprobar que eliminar async no ayuda a que se etiquete el método.

aparte, ¿hay algún artículo sobre cómo funciona este código? No soy un desarrollador de CA, pero cuando inspeccioné otros PR que agregaron etiquetas asíncronas al analizador js, no noté muchos cambios en la lógica fuera de Units/ . ¿Está usando magia negra para derivar definiciones de etiquetas del archivo expected.tags ? ¡Ayudarme sobre cómo puedo ayudar sería genial!

Desafortunadamente, no hay mucha más documentación que el código en sí y, con suerte, algunos comentarios en él. Pero no, no se usa tanto la magia negra; la confirmación que agregó async "support" (41c2c77ea6da1f42fcd891948de04d7b1ad2c958) agregó algo de código al analizador de javaScript: agregó async como palabra clave, además de manejarlo especialmente en 4 lugares.

Para ser justos, esa es una sintaxis no estándar. Las propiedades estáticas / de instancia aún no están escritas en piedra. Pero supongo que sería útil agregar nada menos.

Noté una palabra clave sap en el analizador que no reconozco, ¿para qué sirve @ b4n? Tengo tanta curiosidad 😄

Para ser justos, esa es una sintaxis no estándar. Las propiedades estáticas / de instancia aún no están escritas en piedra. Pero supongo que sería útil agregar nada menos.

¿Dónde puedo obtener más información sobre la sintaxis no estándar?

LANG=JavaScript ; Nosotros, desarrolladores de u-ctags, no expertos en $LANG . Referencias de idiomas relacionados, información estándar / no estándar, el estado de la estandarización, pequeñas entradas de ejemplo, salida de etiquetas concretas esperadas para las entradas,
la gran base de código que utiliza la función y el impacto de los usuarios, etc. son necesarios para trabajar en el problema.
Esta información ME impulsa.
(Debería poner las oraciones anteriores en algún lugar .github / ISSUE_TEMPLATE.md.)

Noté una palabra clave sap en el analizador que no reconozco, ¿qué es para @ b4n? Soy tan curiosa sonrisa

Heredamos la palabra clave de Exuberant-ctags, de donde se bifurcó Universal-ctags.

Noté una palabra clave sap en el analizador que no reconozco, ¿para qué sirve @ b4n? Tengo tanta curiosidad 😄

Como @masatake dicho, se trata de delante de mi tiempo :) Pero de todos modos, es un hack triste para mejorar el apoyo a la SAPUI5 marco IIUC (Me acabo de enterar que parece ser OpenUI5 ahora).

Me gustaría presentar el sub analizador OpenUI5 o SAPUI5 en el analizador JavaScript.
Todos los tipos definidos en el analizador de JavaScript para SAPUI5 deben moverse al sub analizador.
@jayceekay , me gustaría saber la URL o algo para la documentación que explique async .

Si no está en un estándar popular, pensaré en introducir subparser para él.

async se romperá si Class tiene get o set antes. compruebe el código de ejemplo a continuación:

class Test {
    async before() { // ctags will recognize this
    }

    get xx() {
        return 1;
    }

    async after() { // ctags will NOT recognize this
    }

    set yy(val) {
        return 2;
    }

    async after2() { // ctags will NOT recognize this
    }
};

Y una cosa que no está relacionada con async , xx y yy también se ignora.

No reproducido.

[jet@living]/tmp% u-ctags --version
u-ctags --version
Universal Ctags 0.0.0(0730e66d), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Jul 25 2019, 03:06:32
  URL: https://ctags.io/
  Optional compiled features: +wildcards, +regex, +iconv, +debug, +option-directory, +xpath, +json, +interactive, +sandbox, +yaml, +aspell, +packcc
[jet@living]/tmp% cat /tmp/foo.js 
cat /tmp/foo.js 
class Test {
    async before() { // ctags will recognize this
    }

    get xx() {
        return 1;
    }

    async after() { // ctags will NOT recognize this
    }

    set yy(val) {
        return 2;
    }

    async after2() { // ctags will NOT recognize this
    }
};
[jet@living]/tmp% u-ctags -o - /tmp/foo.js 
u-ctags -o - /tmp/foo.js 
Test    /tmp/foo.js /^class Test {$/;"  c
after   /tmp/foo.js /^    async after() { \/\/ ctags will NOT recognize this$/;"    m   class:Test
after2  /tmp/foo.js /^    async after2() { \/\/ ctags will NOT recognize this$/;"   m   class:Test
before  /tmp/foo.js /^    async before() { \/\/ ctags will recognize this$/;"   m   class:Test
xx  /tmp/foo.js /^    get xx() {$/;"    G   class:Test
yy  /tmp/foo.js /^    set yy(val) {$/;" S   class:Test
[jet@living]/tmp% u-ctags --options=NONE  -o - /tmp/foo.js 
u-ctags --options=NONE  -o - /tmp/foo.js 
u-ctags: Notice: No options will be read from files or environment
Test    /tmp/foo.js /^class Test {$/;"  c
after   /tmp/foo.js /^    async after() { \/\/ ctags will NOT recognize this$/;"    m   class:Test
after2  /tmp/foo.js /^    async after2() { \/\/ ctags will NOT recognize this$/;"   m   class:Test
before  /tmp/foo.js /^    async before() { \/\/ ctags will recognize this$/;"   m   class:Test
xx  /tmp/foo.js /^    get xx() {$/;"    G   class:Test
yy  /tmp/foo.js /^    set yy(val) {$/;" S   class:Test
[jet@living]/tmp% 

image
La versión de Homebrew universal-ctags está desactualizada y no se puede actualizar hasta ahora.

@KazuakiM , ¿podrías mirar el problema sobre Homebrew reportado por @ maple-leaf?

@hoja de arce
Desinstalé universal-ctags y luego lo reinstalé nuevamente.
O prueba brew reinstall universal-ctags .

ope log)
https://gist.github.com/KazuakiM/69f58a05f07e3f6dd6ea3d76bc977bea

¿Podrías decir eso de nuevo?

@masatake @KazuakiM Intento brew reinstall universal-ctags , y funciona. Parece que homebrew no puede actualizar la versión HEAD, problema: https://github.com/Homebrew/legacy-homebrew/issues/13197

@hoja de arce
Gracias, ¿intentas uninstall & install --HEAD ?

$ brew uninstall universal-ctags
$ brew install --HEAD universal-ctags

@KazuakiM Acabo de intentarlo y también funciona.

¿Fue útil esta página
0 / 5 - 0 calificaciones