Ctags: JavaScript: mehr asynchrones Tagging

Erstellt am 7. Okt. 2018  ·  13Kommentare  ·  Quelle: universal-ctags/ctags

Der Name des Parsers: javascript

Die Befehlszeile, die Sie zum Ausführen von ctags verwendet haben:

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

Der Inhalt der Eingabedatei:

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

Die Tag-Ausgabe, mit der Sie nicht zufrieden sind:

$ 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

Die erwartete Ausgabe der Tags:

nicht sicher? aber im Grunde das obige, aber mit einem Tag für die async-Klassenmethode

Die Ctags-Version:

$ 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

Wie bekomme ich Ctags binär: homebrew

Ich habe versucht, das selbst anzugehen, aber es reicht nicht für mich, alleine anzufangen. Nebenbei habe ich nach einem Community-Chat gesucht und festgestellt, dass ihr über Probleme kommuniziert (daher dieses Problem).

was ich probiert habe:

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

Gibt es nebenbei noch Artikel darüber, wie dieser Code funktioniert? Ich bin kein AC-Entwickler, aber als ich andere PRs untersucht habe, die dem js-Parser asynchrone Tags hinzugefügt haben, habe ich außerhalb von Units/ keine großen Änderungen an der Logik bemerkt. verwendet es schwarze Magie, um Tag-Definitionen aus der expected.tags Datei abzuleiten?! Hilfe wie ich helfen kann wäre cool!

Parser buenhancement

Alle 13 Kommentare

Der Grund, warum Sie kein Tag für attrs ist nicht async , sondern dass der JS-Parser derzeit die von Ihnen verwendete Methodensyntax nicht versteht. Ich bin damit auch nicht vertraut, aber ich werde versuchen, es zu studieren, um es zu unterstützen.
Sie können überprüfen, ob das Entfernen von async nicht hilft, die Methode mit einem Tag zu versehen.

Gibt es nebenbei noch Artikel darüber, wie dieser Code funktioniert? Ich bin kein AC-Entwickler, aber als ich andere PRs untersucht habe, die dem js-Parser asynchrone Tags hinzugefügt haben, habe ich außerhalb von Units/ keine großen Änderungen an der Logik bemerkt. verwendet es schwarze Magie, um Tag-Definitionen aus der expected.tags Datei abzuleiten?! Hilfe wie ich helfen kann wäre cool!

Leider gibt es nicht viel mehr Dokumentation als den Code selbst und hoffentlich ein paar Kommentare darin. Aber nein, es wird nicht so viel schwarze Magie verwendet; der Commit, der async "support" (41c2c77ea6da1f42fcd891948de04d7b1ad2c958) hinzufügte, fügte dem JavaScript-Parser etwas Code hinzu: Er fügte async als Schlüsselwort hinzu und behandelte es speziell an 4 Stellen.

Um fair zu sein, das ist eine Nicht-Standard-Syntax. Die statischen/Instanzeigenschaften sind noch nicht in Stein gemeißelt. Aber ich denke, es wäre nützlich, nicht weniger hinzuzufügen.

Ich habe ein sap Schlüsselwort im Parser bemerkt, das ich nicht kenne. Was ist das für @b4n? Ich bin so neugierig 😄

Um fair zu sein, das ist eine Nicht-Standard-Syntax. Die statischen/Instanzeigenschaften sind noch nicht in Stein gemeißelt. Aber ich denke, es wäre nützlich, nicht weniger hinzuzufügen.

Wo erhalte ich weitere Informationen zur Nicht-Standard-Syntax?

LANG=JavaScript ; Wir, u-ctags-Entwickler, keine Experten von $LANG . Zugehörige Sprachreferenzen, Standard-/Nicht-Standard-Informationen, Stand der Standardisierung, kleine Beispieleingaben, konkrete erwartete Tag-Ausgabe für die Eingaben,
die große Codebasis, die die Funktion verwendet, und die Auswirkungen der Benutzer usw. werden benötigt, um an dem Problem zu arbeiten.
Diese Information treibt mich an.
(Ich sollte die obigen Sätze irgendwo in .github/ISSUE_TEMPLATE.md einfügen.)

Ich habe im Parser ein sap-Schlüsselwort bemerkt, das ich nicht kenne. Was ist das für @b4n? Ich bin so neugierig lächeln

Wir erben das Schlüsselwort von Exuberant-ctags, von wo Universal-ctags abgezweigt wurde.

Ich habe ein sap Schlüsselwort im Parser bemerkt, das ich nicht kenne. Was ist das für @b4n? Ich bin so neugierig 😄

Wie @masatake sagte, es stammt aus meiner Zeit :) Aber wie auch immer, es ist ein trauriger Hack zur Verbesserung der Unterstützung für das SAPUI5- Framework IIUC (ich habe gerade herausgefunden, dass es jetzt OpenUI5 zu sein scheint).

Ich möchte den OpenUI5- oder SAPUI5-Sub-Parser auf dem JavaScript-Parser vorstellen.
Alle im JavaScript-Parser für SAPUI5 definierten Arten sollten in den Subparser verschoben werden.
@jayceekay , ich würde gerne die URL oder etwas für die Dokumentation wissen, die async .

Wenn es nicht in einem gängigen Standard enthalten ist, werde ich darüber nachdenken, einen Subparser dafür einzuführen.

async wird abgebrochen, wenn Class get oder set davor hat. Überprüfen Sie den folgenden Beispielcode:

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

Und eine Sache, die nicht mit async zu tun hat, xx und yy ebenfalls ignoriert.

Nicht reproduziert.

[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
Die Homebrew-Universal-Ctags-Version ist veraltet und kann bisher nicht aktualisiert werden.

@KazuakiM , könnten Sie sich das von @maple-leaf gemeldete Problem zu Homebrew ansehen?

@Ahornblatt
Ich habe universal-ctags deinstalliert und jetzt wieder neu installiert.
Oder versuchen Sie es mit brew reinstall universal-ctags .

offenes Protokoll)
https://gist.github.com/KazuakiM/69f58a05f07e3f6dd6ea3d76bc977bea

Können Sie das bitte noch einmal sagen?

@masatake @KazuakiM Ich versuche brew reinstall universal-ctags und es funktioniert. Anscheinend kann Homebrew die HEAD-Version nicht aktualisieren, Problem: https://github.com/Homebrew/legacy-homebrew/issues/13197

@Ahornblatt
Danke, versuchen Sie es mit uninstall & install --HEAD ?

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

@KazuakiM Ich habe es gerade versucht und funktioniert auch.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen