Ctags: JavaScript: mais marcação assíncrona

Criado em 7 out. 2018  ·  13Comentários  ·  Fonte: universal-ctags/ctags

O nome do analisador: javascript

A linha de comando que você usou para executar ctags:

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

O conteúdo do arquivo de entrada:

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

A saída das tags com a qual você não está satisfeito:

$ 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

A saída de tags que você espera:

não tenho certeza? mas basicamente o acima, mas com uma tag para o método de classe assíncrona

A versão das 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

Como você obtém ctags binários: homebrew

Eu tentei resolver isso sozinho, mas não há o suficiente para eu começar sozinho. como um aparte, eu procurei um bate-papo da comunidade e percebi que vocês estão se comunicando usando problemas (daí este problema).

o que eu tentei:

$ 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 => {}
+}

como um aparte, há algum artigo sobre como esse código funciona? Não sou um desenvolvedor AC, mas quando inspecionei outros PRs que adicionaram tags assíncronas ao analisador js, não notei muitas mudanças na lógica fora de Units/ . é usar magia negra para derivar definições de tag do arquivo expected.tags ?! ajudar em como posso ajudar seria legal!

Parser buenhancement

Todos 13 comentários

O motivo de você não obter uma tag para attrs não é async , mas porque o analisador JS atualmente não entende a sintaxe do método que você usou. Também não estou familiarizado com ele, mas vou tentar estudá-lo para adicionar suporte para ele.
Você pode verificar que remover async não ajuda a marcar o método.

como um aparte, há algum artigo sobre como esse código funciona? Não sou um desenvolvedor AC, mas quando inspecionei outros PRs que adicionaram tags assíncronas ao analisador js, não notei muitas mudanças na lógica fora de Units/ . é usar magia negra para derivar definições de tag do arquivo expected.tags ?! ajudar em como posso ajudar seria legal!

Infelizmente não há muito mais documentação do que o próprio código e, esperançosamente, alguns comentários nele. Mas não, não está usando tanto magia negra; o commit que adicionou async "support" (41c2c77ea6da1f42fcd891948de04d7b1ad2c958) adicionou algum código ao analisador javaScript: adicionou async como uma palavra-chave, além do manuseio especialmente em 4 lugares.

Para ser justo, essa sintaxe não é padrão. As propriedades estáticas / de instância ainda não estão definidas em pedra. Mas acho que seria útil adicionar nada menos.

Notei uma palavra-chave sap no analisador que não reconheço, para que serve @ b4n? Estou tão curioso 😄

Para ser justo, essa sintaxe não é padrão. As propriedades estáticas / de instância ainda não estão definidas em pedra. Mas acho que seria útil adicionar nada menos.

Onde posso obter mais informações sobre a sintaxe não padrão?

LANG=JavaScript ; Nós, desenvolvedores do u-ctags, não especialistas de $LANG . Referências de linguagem relacionadas, informações padrão / não padrão, o status de padronização, pequenos exemplos de entradas, saída de tags esperadas concretas para as entradas,
a grande base de código que usa o recurso e o impacto dos usuários, etc. são necessários para resolver o problema.
Esta informação me move.
(Devo colocar as frases acima em algum lugar .github / ISSUE_TEMPLATE.md.)

Percebi uma palavra-chave sap no analisador que não reconheço. Para que serve @ b4n? Estou tão curiosa sorriso

Herdamos a palavra-chave de Exuberant-ctags, de onde Universal-ctags foi bifurcada.

Notei uma palavra-chave sap no analisador que não reconheço, para que serve @ b4n? Estou tão curioso 😄

Como @masatake disse, vem de antes do meu tempo :) Mas de qualquer maneira, é um hack triste para melhorar o apoio ao SAPUI5 quadro IIUC (Eu só descobri que parece ser OpenUI5 agora).

Gostaria de apresentar o sub analisador OpenUI5 ou SAPUI5 no analisador JavaScript.
Todos os tipos definidos no analisador JavaScript para SAPUI5 devem ser movidos para o subparser.
@jayceekay , gostaria de saber a URL ou algo para a documentação explicando async .

Se não estiver em um padrão popular, pensarei em introduzir um subparser para ele.

async quebrará se Class tiver get ou set antes dele. verifique o código de exemplo abaixo:

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
    }
};

E uma coisa não relacionada a async , xx e yy também ignorada.

Não reproduzido.

[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
A versão universal-ctags do Homebrew está desatualizada e não pode ser atualizada até agora.

@KazuakiM , você poderia olhar para o problema sobre o Homebrew relatado por @ maple-leaf?

@folha de Carvalho
Desinstalei o universal-ctags e reinstalei-o novamente agora.
Ou tente brew reinstall universal-ctags .

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

Você pode, por favor, dizer isso de novo?

@masatake @KazuakiM Eu tento brew reinstall universal-ctags e funciona. Parece que o homebrew não consegue atualizar a versão HEAD, problema: https://github.com/Homebrew/legacy-homebrew/issues/13197

@folha de Carvalho
Obrigado, você tenta uninstall & install --HEAD ?

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

@KazuakiM Acabei de experimentar e funciona também.

Esta página foi útil?
0 / 5 - 0 avaliações