Ctags: Feature Request: Perl-Attribute mit (hat)

Erstellt am 31. März 2019  ·  14Kommentare  ·  Quelle: universal-ctags/ctags

Derzeit wird Perl um Moose, Mouse, Moo und Mo und dergleichen erweitert. Diese Module haben alle eine Gemeinsamkeit – ihre Attributselektoren werden mit has . Ich glaube, wir können davon ausgehen, dass alles, was der von Moose aufgestellten Konvention folgt,

has $name|@$names => %options ist ein richtig geformtes Attribut für eines der vielen Objektbausysteme da draußen.

Wir müssten Dinge abdecken wie

has "foo" => ()
has ("foo" => ())
has [qw/foo bar/] => ()
has ([qw/foo bar/] => ())
Parser buenhancement

Alle 14 Kommentare

@dtikhonov , könntest du dir das ansehen?

Mooseet al. sind nur Module und has ist ein Funktionsaufruf, kein Perl-Schlüsselwort. Die Unterstützung von Moose in den ctags-Perl-Parser einzubeziehen, würde uns auf einen rutschigen Abhang bringen, da es viele Perl-Module gibt, die Funktionsaufrufe einführen, die wie Schlüsselwörter aussehen.

...ich interessiere mich sehr für dieses Thema. In den letzten 3 Jahren habe ich Ctags verbessert, um DSLs zu handhaben.

Siehe http://docs.ctags.io/en/latest/running-multi-parsers.html?highlight=subparser#tagging -definitions-of-higher-upper-level-language-sub-base über meine Vision.

Der Moose-Subparser kann auf dem Perl-Parser ausgeführt werden.


package Point;
use Moose; # automatically turns on strict and warnings

has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');

sub clear {
    my $self = shift;
    $self->x(0);
    $self->y(0);
}

package Point3D;
use Moose;

extends 'Point';

has 'z' => (is => 'rw', isa => 'Int');

after 'clear' => sub {
    my $self = shift;
    $self->z(0);
};

Wenn der Perl-Parser ein Schlüsselwort "use" findet, benachrichtigt der Perl-Parser die registrierten Unterparser darüber.
Moose Subparser ist ein solcher Subparser.
Der Moose-Subparser aktiviert sich selbst, wenn der mitgeteilte Modulname "Moose" lautet.
Der Moose-Subparser durchsucht die interne Symboltabelle von ctags namens cork, um ein Perl-Sprachobjekt zu finden
vom Perl-Parser als "Paket" gekennzeichnet. Der Moose-Subparser findet möglicherweise "Point" in der Symboltabelle.
Es ist bereits vom Perl-Parser markiert. Der Moose-Parser erstellt jedoch ein neues Tag für "Point" mit "class"-Art der "Moose"-Sprache.

Der Moose-Subparser schiebt den "Point" in den Bereichsstapel.
Der Moose-Subparser findet "has" als Schlüsselwort. Der Moose-Subparser erstellt ein Tag für "x", das als nächstes Token zu "has" gefunden wird. Das Erstellen des Tags für "x", " scope:class :Point language:Moose " wird an "x" angehängt...

Über C++-Parser habe ich diese Idee bereits umgesetzt.
Der QtMoc-Subparser dient zum Parsen von C++-Code mit Qt. Der QtMoc-Subparser erkennt Signal und Slot, die als Dialekt der Sprache C++ eingeführt werden.

Um einen Subparser zu implementieren, muss ich die Erlaubnis des Betreuers seines Basisparsers einholen.
Ich denke, @dtikhonov ist nicht so positiv, weil die Einführung eines Subparsers den Code des Basisparsers kompliziert macht.

Wenn es einen Konflikt zwischen einem Parser-Betreuer und mir gibt, der dem Parser einen Subparser hinzufügen möchte, werde ich mich von der Implementierung des Subparsers zurückziehen, da ein Parser-Betreuer das Wichtigste im u-ctags-Projekt ist.

@dtikhonov , wenn Sie daran interessiert sind, Moose als Subparser zu implementieren, lassen Sie es mich wissen.
Ich werde einen Prototyp erstellen, um die Auswirkungen auf den Quellcode des Perl-Parsers zu zeigen.

Vielen Dank fürs Lesen.

Mir ist klar, dass es eine Funktion ist, unter der Haube. Aber das ist ein Implementierungsdetail. Im gleichen Sinne sind Pakete "Klassen", wenn Sie objektorientiert programmieren, und "Subs" sind Methoden. All diese Nomenklatur ändert sich, wenn Sie objektorientiertes Perl verwenden, aber in jedem Fall können Sie die Nicht-OO-Terminologie verwenden. In allen oben genannten Fällen gibt es jedoch zusätzliche Komplexität bei der Ableitung, für welches Paradigma der Benutzer den Code geschrieben hat. Das heißt, "hat" fehlt diese Komplexität. Wenn Sie es sehen, haben Sie zwei mögliche Interpretationen (a) Sie rufen eine Funktion "hat" auf. In diesem Fall wäre das gewünschte Verhalten, nichts zu tun, wie wir es jetzt tun; oder (b) Sie verwenden eine Moose-artige Attributdeklaration.

Das Zitat von "Moose et al" aus Ihrer Antwort zeigt, wie stark diese Konvention in Perl ist, diese Modul-Builder-Frameworks zu verwenden (die die has -Attributdeklaration umfassen). Moose ist mit Sicherheit eines der beliebtesten Module für Perl (es hat mehr Sterne auf metacpan als DBI und LWP).

Ich sage nicht, dass wir keine falsch-positiven Ergebnisse haben könnten , aber ich kenne niemanden, der ein Modul veröffentlicht hat, das nicht dieser Konvention entspricht und vielen Menschen helfen wird. Darüber hinaus bezweifle ich wirklich, dass diese Ctags eher theoretisch als nur praktisch sind.

@masatake die Idee des Subparsers klingt besser und vollständiger als meine Implementierung, und perl macht tatsächlich bereits etwas Ähnliches, indem es gegen use testet und intern unterschiedliche Semantiken für einige dieser Module aufruft.

https://github.com/universal-ctags/ctags/blob/master/parsers/perl.c#L348

Ich denke, das Problem besteht darin, dass Sie die Liste der Module aufzählen müssen, die den Moose-Parser auslösen, was nicht so schlimm wäre. Sie müssten auch davon ausgehen, dass niemand eine Unterklasse von Moose ausführt, was schwierig ist, aber wenn sie das tun würden, würden sie im schlimmsten Fall den Moose-Unterparser verlieren. Und ich bin damit einverstanden - es wäre nicht schlimmer als das, was sie haben.

Wenn Sie Hilfe beim Schreiben eines C-Parsers für Moose benötigen, kann ich auch dabei helfen.

Ich bin fast der Meinung, dass diese Art von statischem Parser für Perl und Moose auch außerhalb von Ctags nützlich wäre. Derzeit ist das Parsen von Perl unsicher, und es gibt keine Garantien. Dies würde es anderen Projekten ermöglichen, beispielsweise Testabdeckung auf Perl sicher auszuführen.

@masatake , Perl 5 ist ein so langsames Ziel, dass es nicht viel zu pflegen gibt, daher war meine Aufgabe als Betreuer von perl.c einfach. Ich habe die Subparser-Dokumentation, auf die Sie verwiesen haben, durchgesehen - ich kann nur sagen: Wow! Um ehrlich zu sein, habe ich die Entwicklung von Universal Ctags nicht genau verfolgt und ich sehe, dass Sie große Fortschritte gemacht haben.

@EvanCarroll , Code-Talks: perl.c . Teile davon sind geradezu hässlich und im Nachhinein hätte man manches anders umsetzen müssen. Bezüglich der Verwendung von "benutzen": berühren, Punkt genommen.

Cool Cool. Mal sehen was ich dann am Wochenende machen kann. Ich werde mir auch die Arbeit am Subparser-Framework ansehen.

Ein Prototyp funktioniert.
@EvanCarroll , Sie können ab #2070 beginnen.

Ich konzentriere mich auf den TypeScript-Parser. Also werde ich eine Weile nicht an #2070 arbeiten.
Hacken Sie, wie Sie möchten.

[yamato@slave]~/var/ctags/perl-moose/Units/simple-moose.d% cat input.pl
cat input.pl
# Taken from https://metacpan.org/pod/Moose
package Point;
use Moose; # automatically turns on strict and warnings

has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');

sub clear {
    my $self = shift;
    $self->x(0);
    $self->y(0);
}

package Point3D;
use Moose;

extends 'Point';

has 'z' => (is => 'rw', isa => 'Int');

after 'clear' => sub {
    my $self = shift;
    $self->z(0);
};

no Moose;
package Line;

[yamato@slave]~/var/ctags/perl-moose/Units/simple-moose.d%  ./ctags --fields=+lineK --sort=no -o - --extras=+s ./input.pl
 ./ctags --fields=+lineK --sort=no -o - --extras=+s ./input.pl
zsh: no such file or directory: ./ctags
[yamato@slave]~/var/ctags/perl-moose/Units/simple-moose.d% ../../ctags --fields=+lineK --sort=no -o - --extras=+s ./input.pl
../../ctags --fields=+lineK --sort=no -o - --extras=+s ./input.pl
Point   ./input.pl  /^package Point;$/;"    package line:2  language:Perl
Point   ./input.pl  /^package Point;$/;"    class   line:2  language:Moose
x   ./input.pl  /^has 'x' => (is => 'rw', isa => 'Int');$/;"    attribute   line:5  language:Moose  class:Point
y   ./input.pl  /^has 'y' => (is => 'rw', isa => 'Int');$/;"    attribute   line:6  language:Moose  class:Point
clear   ./input.pl  /^sub clear {$/;"   subroutine  line:8  language:Perl
clear   ./input.pl  /^sub clear {$/;"   method  line:8  language:Moose  class:Point
Point3D ./input.pl  /^package Point3D;$/;"  package line:14 language:Perl
Point3D ./input.pl  /^package Point3D;$/;"  class   line:14 language:Moose  inherits:Point  end:26
z   ./input.pl  /^has 'z' => (is => 'rw', isa => 'Int');$/;"    attribute   line:19 language:Moose  class:Point3D
clear   ./input.pl  /^after 'clear' => sub {$/;"    attribute   line:21 language:Moose  class:Point3D
Line    ./input.pl  /^package Line;$/;" package line:27 language:Perl
[yamato@slave]~/var/ctags/perl-moose/Units/simple-moose.d% ./ctags --list-subparsers
./ctags --list-subparsers
zsh: no such file or directory: ./ctags
[yamato@slave]~/var/ctags/perl-moose/Units/simple-moose.d% ../../ctags --list-subparsers
../../ctags --list-subparsers
#NAME                BASEPARSER        DIRECTIONS
AnsiblePlaybook      Yaml              base <> sub {bidirectional}
Autoconf             M4                base <> sub {bidirectional}
Automake             Make              base <= sub {dedicated}
ITcl                 Tcl               base <> sub {bidirectional}
JAXRS                Java              base => sub {shared}
LinuxKernel          C                 base => sub {shared}
LinuxOVS             C                 base => sub {shared}
Moose                Perl              base <> sub {bidirectional}
OpenVSwitch          C                 base => sub {shared}
PythonLoggingConfig  Iniconf           base <> sub {bidirectional}
PythonMain           Python            base => sub {shared}
PythonTuned          Python            base => sub {shared}
QtMoc                C++               base <> sub {bidirectional}
RSpec                Ruby              base => sub {shared}
SystemdUnit          Iniconf           base <= sub {dedicated}
TclOO                Tcl               base <> sub {bidirectional}
YumRepo              Iniconf           base <= sub {dedicated}
selinuxPolicy        selinuxPolicyBase base => sub {shared}
servlet              Java              base => sub {shared}
[yamato@slave]~/var/ctags/perl-moose% ./ctags --list-kinds-full=Moose   
#LETTER NAME      ENABLED REFONLY NROLES MASTER DESCRIPTION
a       attribute yes     no      0      NONE   attributes
c       class     yes     no      0      NONE   classes
m       method    yes     no      0      NONE   methods

Ein Prototyp funktioniert. @EvanCarroll , Sie können ab #2070 beginnen.

Das war schnell! 👍

@masatake beeindruckend. Gibt es noch mehr zu tun? Wie ich sehe, haben Sie findAttribute und die Sprachrückrufreferenz implementiert?

@masatake beeindruckend. Gibt es noch mehr zu tun?

Das würde ich gerne wissen :-).
Wenn ich verpasst habe, was Sie wollten, lassen Sie es mich bitte wissen.
Ich habe nur wenige Teile des Dokuments von Moose gelesen.

@masatake cooler Deal, ich habe den Patch mit github überprüft. Wenn du nicht dazu kommst, schaue ich am Wochenende mal nach. =) Aber Sie werden es wahrscheinlich in 0,0001 Sekunden geschafft haben.

Aber Sie werden es wahrscheinlich in 0,0001 Sekunden geschafft haben.

Es ist nicht wahr.

Um den Parser zu verbessern, brauchen wir 4 Dinge: Wissen über die interne API von ctags, Wissen über die Zielsprache, Elch, Zeit und Leidenschaft:-P.

Ich habe keine Kenntnisse über Moose. Dieser ist der wichtigste.
zB erfasst der aktuelle Parser keine Regel, die an eine Klasse mit with angehängt und mit "use Moose::Rule" definiert wurde. Was ich weiß ist nur "Regel". Möglicherweise wissen Sie jedoch, dass mehr Elemente von Ctags erfasst werden sollten.

Erwarten Sie nicht, dass Ctags solche Regeln erfassen?
Wenn eine Regel an eine Klasse angehängt ist, sollte das Tag für die Klasse meiner Meinung nach ein Feld namens "Regel:" Feld.

Diese Anfragen von einer Person, die die Zielsprache kennt, werden benötigt, um dieses Projekt zu entwickeln.

Einige davon kann ich umsetzen. Sie können andere implementieren. Wir können später implementieren, wenn solche Anfragen sind.

Wir können die aktuelle Implementierung erweitern, um Mouse, Moo und Mo zu unterstützen. Wir können alles für Sie tun
wollen, OHNE den ursprünglichen Perl-Parser zu modifizieren.

Entschuldigung, ich habe festgestellt, dass Sie mir bereits in #2070 wichtige Kommentare gegeben haben. Danke.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

fabiensabatie picture fabiensabatie  ·  3Kommentare

liuchengxu picture liuchengxu  ·  8Kommentare

lvc picture lvc  ·  3Kommentare

alphaCTzo7G picture alphaCTzo7G  ·  7Kommentare

cweagans picture cweagans  ·  13Kommentare