Ctags: Demande de fonctionnalité : Attributs Perl avec (a)

Créé le 31 mars 2019  ·  14Commentaires  ·  Source: universal-ctags/ctags

Actuellement, Perl est étendu avec Moose, Mouse, Moo et Mo, etc. Ces modules ont tous un point commun : leurs sélecteurs d'attributs sont établis avec has . Je crois que nous pouvons supposer que tout ce qui suit la convention établie par Moose de,

has $name|@$names => %options est un attribut correctement formé pour l'un des nombreux systèmes de construction d'objets disponibles.

Nous devrions couvrir des choses comme

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

Tous les 14 commentaires

@dtikhonov ,

Moose et al. ne sont que des modules et has est un appel de fonction, pas un mot-clé Perl. Inclure la prise en charge de Moose dans l'analyseur ctags Perl nous placerait sur une pente glissante, car il existe de nombreux modules Perl qui introduisent des appels de fonction qui ressemblent à des mots-clés.

...Je suis très intéressé par ce sujet. Depuis 3 ans, j'ai amélioré les ctags pour gérer les DSL.

Voir http://docs.ctags.io/en/latest/running-multi-parsers.html?highlight=subparser#tagging -definitions-of-higher-upper-level-language-sub-base à propos de ma vision.

Le sous-analyseur Moose peut s'exécuter sur l'analyseur Perl.


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

Lorsque l'analyseur Perl trouve un mot-clé "utilisation", l'analyseur Perl le notifie aux sous-analyseurs enregistrés.
Le sous-analyseur Moose est un tel sous-analyseur.
Le sous-analyseur Moose s'active si le nom du module notifié est "Moose".
Le sous-analyseur Moose analyse la table de symboles interne de ctags nommée cork pour trouver un objet en langage Perl
type "package" marqué par l'analyseur Perl. Le sous-analyseur Moose peut trouver « Point » dans la table des symboles.
Il est déjà balisé par l'analyseur Perl. Cependant, l'analyseur Moose crée une nouvelle balise pour "Point" avec le type "class" du langage "Moose".

Le sous-analyseur Moose pousse le "Point" vers la pile de portée.
Le sous-analyseur Moose trouve "a" comme mot-clé. Le sous-analyseur Moose crée une balise pour « x » trouvée comme prochain jeton de « has ». La création de la balise pour "x", " scope:class :Point language:Moose " est attachée à "x"...

A propos de l'analyseur C++, j'ai déjà implémenté cette idée.
Le sous-analyseur QtMoc sert à analyser le code C++ à l'aide de Qt. Le sous-analyseur QtMoc reconnaît le signal et le slot, qui sont présentés comme un dialecte du langage C++.

Pour implémenter un sous-analyseur, je dois obtenir l'autorisation du mainteneur de son analyseur de base.
Je suppose que @dtikhonov n'est pas si positif car l'introduction d'un sous-analyseur rend le code de l'analyseur de base compliqué.

S'il y a un conflit entre un responsable d'analyseur et moi, qui souhaite introduire un sous-analyseur dans l'analyseur, je me retirerai de l'implémentation du sous-analyseur car avoir un responsable d'analyseur est la chose la plus importante dans le projet u-ctags.

@dtikhonov , si l'idée d'implémenter Moose en tant que sous-analyseur vous intéresse, faites-le moi savoir.
Je vais faire un prototype pour montrer l'impact sur le code source de l'analyseur Perl.

Merci pour la lecture.

Je me rends compte que c'est une fonction, sous le capot. Mais, c'est un détail de mise en œuvre. Dans le même sens, les packages sont des "classes" lorsque vous programmez en mode orienté objet, et les "subs" sont des méthodes. Toute cette nomenclature change lorsque vous utilisez Perl orienté objet, mais dans chaque cas, vous pouvez utiliser la terminologie non-OO. Dans tous les cas ci-dessus, il y a cependant des complexités supplémentaires à déduire pour quel paradigme l'utilisateur a écrit le code. Cela dit, "a" n'a pas ces complexités. Si vous le voyez, vous avez deux interprétations possibles (a) vous appelez une fonction « has », auquel cas le comportement souhaité serait de ne rien faire, comme nous le faisons maintenant ; ou, (b) vous utilisez une déclaration d'attribut Moose-esque.

La citation "Moose et al" de votre réponse montre à quel point cette convention est forte en Perl pour utiliser ces frameworks de constructeur de modules (qui englobent la déclaration d'attribut has ). Moose est facilement l'un des modules les plus populaires pour Perl (il a plus d'étoiles sur metacpan que DBI et LWP).

Je ne dis pas que nous ne pouvions pas avoir de faux positifs, mais je ne connais personne qui a publié un module qui ne respecte pas cette convention et cela devrait aider beaucoup de gens. De plus, je doute vraiment que ce ctags soit théoriquement solide plutôt que simplement pratique.

@masatake, l'idée du sous-analyseur semble meilleure et plus complète que mon implémentation, et perl fait déjà quelque chose de similaire en testant contre use et en invoquant une sémantique différente pour certains de ces modules en interne.

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

Je suppose que le problème, c'est qu'il faudrait énumérer la liste des modules qui déclenchent l'analyseur Moose, ce qui ne serait pas trop mal. Vous devez également supposer que personne n'exécute une sous-classe de Moose, ce qui est délicat, mais s'ils le faisaient, le pire des cas serait qu'ils perdraient le sous-analyseur Moose. Et, je suis d'accord avec ça - ce ne serait pas pire que ce qu'ils ont.

Si vous voulez de l'aide pour écrire un analyseur C pour Moose, je peux aussi vous aider.

Je suis presque convaincu que ce type d'analyseur statique pour Perl et Moose serait également utile en dehors des ctags. Actuellement, l'analyse de perl n'est pas sécurisée et il n'y a aucune garantie. Cela permettrait à d'autres projets d'exécuter en toute sécurité une couverture de test sur Perl, par exemple.

@masatake , Perl 5 est une cible si lente qu'il n'y a pas grand-chose à maintenir, donc mon travail en tant que mainteneur de perl.c a été facile. J'ai parcouru la documentation du sous-analyseur que vous avez référencée - tout ce que je peux dire, c'est : wow ! Pour être franc, je n'ai pas suivi de près le développement d'Universal Ctags et je vois que vous avez fait de grands progrès.

@EvanCarroll , le code parle : n'hésitez pas à perl.c . Certaines parties sont carrément laides et, avec le recul, certaines choses auraient dû être mises en œuvre différemment. En ce qui concerne l'usage de « use » : toucher, point pris.

Cool cool. Je vais voir ce que je peux faire ce week-end alors. Je vais également vérifier le travail sur le framework subparser.

Un prototype fonctionne.
@EvanCarroll , vous pouvez commencer à partir de #2070.

Je me concentre sur l'analyseur TypeScript. Je ne travaillerai donc pas sur le #2070 pendant un certain temps.
Hackez à votre guise.

[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

Un prototype fonctionne. @EvanCarroll , vous pouvez commencer à partir de #2070.

C'était rapide! 👍

@masatake impressionnant. Y a-t-il encore du travail à faire ? Je vois que vous avez implémenté findAttribute et la référence de rappel de langue ?

@masatake impressionnant. Y a-t-il encore du travail à faire ?

C'est ce que j'aimerais savoir :-).
Si j'ai raté ce que vous vouliez, s'il vous plaît, faites-le moi savoir.
Je n'ai lu que quelques parties du document de Moose.

@masatake cool deal, j'ai revu le patch avec github. Si vous n'y arrivez pas, j'y jetterai un œil ce week-end. =) Mais vous l'aurez probablement fait en 0,0001 secondes.

Mais vous l'aurez probablement fait en 0,0001 seconde.

Ce n'est pas vrai.

Pour améliorer l'analyseur, nous avons besoin de 4 choses : des connaissances sur l'API interne de ctags, des connaissances sur la langue cible, Moose, le temps et la passion :-P.

Je ne connais pas Moose. Celui-ci est le plus important.
par exemple, l'analyseur actuel ne capture pas une règle attachée à une classe avec with , et définie avec "use Moose::Rule". Ce que je sais n'est que "règle". Cependant, vous savez peut-être plus d'éléments que les ctags doivent capturer.

Ne vous attendez-vous pas à ce que les ctags capturent de telles règles ?
Si une règle est attachée à une classe, je pense que la balise de la classe devrait avoir un champ nommé "règle :" domaine.

Ces demandes d'une personne connaissant la langue cible sont nécessaires pour faire grandir ce projet.

Je peux mettre en œuvre certains d'entre eux. Vous pouvez en implémenter d'autres. Nous pouvons mettre en œuvre plus tard si de telles demandes sont.

Nous pouvons étendre l'implémentation actuelle pour prendre en charge Mouse, Moo et Mo. Nous pouvons faire tout ce que vous
voulez SANS modifier l'analyseur syntaxique Perl d'origine.

Désolé, j'ai trouvé que vous m'aviez déjà donné des commentaires importants dans #2070. Merci.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

lvc picture lvc  ·  8Commentaires

blueyed picture blueyed  ·  4Commentaires

jayceekay picture jayceekay  ·  13Commentaires

jespinal picture jespinal  ·  8Commentaires

liuchengxu picture liuchengxu  ·  8Commentaires