Ctags: Solicitud de función: atributos de Perl con (has)

Creado en 31 mar. 2019  ·  14Comentarios  ·  Fuente: universal-ctags/ctags

Actualmente, Perl está extendido con Moose, Mouse, Moo y Mo, y similares. Todos estos módulos tienen una característica en común: sus selectores de atributos se establecen con has . Creo que podemos suponer que cualquier cosa que siga la convención establecida por Moose de,

has $name|@$names => %options es un atributo formado correctamente para uno de los muchos sistemas de construcción de objetos que existen.

Tendríamos que cubrir cosas como

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

Todos 14 comentarios

@dtikhonov , ¿podrías mirar esto?

Moose y col. son solo módulos y has es una llamada a función, no una palabra clave de Perl. Incluir soporte para Moose en el analizador ctags Perl nos colocaría en una pendiente resbaladiza, ya que hay muchos módulos Perl que introducen llamadas a funciones que parecen palabras clave.

... Estoy muy interesado en este tema. En los últimos 3 años, he mejorado ctags para manejar DSL.

Consulte http://docs.ctags.io/en/latest/running-multi-parsers.html?highlight=subparser#tagging -definitions-of-high-upper-level-language-sub-base sobre mi visión.

El subanálisis de Moose se puede ejecutar en el analizador de 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);
};

Cuando el analizador de Perl encuentra una palabra clave "uso", el analizador de Perl lo notifica a los sub analizadores registrados.
El sub analizador de Moose es un sub analizador de este tipo.
El subanálisis de Moose se activa si el nombre del módulo notificado es "Moose".
El subanálisis de Moose escanea la tabla de símbolos internos de ctags denominada cork para encontrar un objeto de lenguaje Perl
marcado tipo "paquete" por el analizador de Perl. El subanálisis de Moose puede encontrar "Punto" en la tabla de símbolos.
Ya está etiquetado por el analizador de Perl. Sin embargo, el analizador de Moose crea una nueva etiqueta para "Point" con "clase" tipo de lenguaje "Moose".

El subanálisis de Moose empuja el "Punto" a la pila de alcance.
El subanálisis de Moose encuentra "tiene" como palabra clave. El subanálisis de Moose crea una etiqueta para "x" que se encuentra como el siguiente token de "tiene". La creación de la etiqueta para "x", " scope: class : Point language: Moose " se adjunta a "x" ...

Acerca del analizador de C ++, ya he implementado esta idea.
El sub analizador QtMoc es para analizar código C ++ usando Qt. El sub analizador QtMoc reconoce la señal y la ranura, que se introducen como un dialecto del lenguaje C ++.

Para implementar un sub analizador, tengo que obtener el permiso del responsable de mantenimiento de su analizador base.
Supongo que @dtikhonov no es tan positivo porque la introducción de un sub analizador hace que el código del analizador base sea complicado.

Si hay un conflicto entre un mantenedor del analizador y yo, que quiere introducir un sub-analizador en el analizador, me retiraré de la implementación del sub-analizador porque tener un mantenedor del analizador es lo más importante en el proyecto u-ctags.

@dtikhonov , si está interesado en la idea de implementar Moose como subparser, hágamelo saber.
Haré un prototipo para mostrar el impacto en el código fuente del analizador de Perl.

Gracias por leer.

Me doy cuenta de que es una función, debajo del capó. Pero ese es un detalle de implementación. En el mismo sentido, los paquetes son "clases" cuando está programando de manera orientada a objetos, y los "subs" son métodos. Toda esa nomenclatura cambia cuando usa perl orientado a objetos, pero en cada caso puede usar la terminología no orientada a objetos. En todos los casos anteriores, sin embargo, hay complejidades adicionales para inferir para qué paradigma el usuario ha escrito el código. Dicho esto, "tiene" carece de esas complejidades. Si lo ve tiene dos posibles interpretaciones (a) está llamando a una función "tiene" en cuyo caso el comportamiento deseado sería no hacer nada, como hacemos ahora; o, (b) estás usando una declaración de atributo al estilo de Moose.

La cita de "Moose et al" de su respuesta muestra cuán fuerte es esa convención en Perl para usar estos marcos de construcción de módulos (que abarcan la declaración has -attribute). Moose es fácilmente uno de los módulos más populares para Perl (tiene más estrellas en metacpan que DBI y LWP).

No estoy diciendo que no podíamos tener ningún falsos positivos, pero no conozco a nadie que ha publicado un módulo que no sigue esta convención y se destaca para ayudar a mucha gente. Además, realmente dudo que estas etiquetas sean teóricamente sólidas en lugar de prácticas.

@masatake, la idea del subparser suena mejor y más completa que mi implementación, y perl ya hace algo similar probando contra use e invocando una semántica diferente para algunos de esos módulos internamente.

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

Supongo que el problema es que tendrías que enumerar la lista de módulos que activan el analizador de Moose, lo cual no estaría tan mal. También tendría que asumir que nadie está ejecutando una subclase de Moose, lo cual sería complicado, pero si lo estuvieran haciendo, el peor de los casos es que perderían el sub-analizador de Moose. Y estoy de acuerdo con eso, no sería peor que lo que tienen.

Si quieres ayuda para escribir un analizador de C para Moose, también puedo ayudarte.

Tengo casi la idea de que este tipo de analizador estático para Perl y Moose también sería útil fuera de ctags. Actualmente, el análisis de perl es inseguro y no hay garantías. Esto permitiría a otros proyectos ejecutar de forma segura la cobertura de prueba en Perl, por ejemplo.

@masatake , Perl 5 es un objetivo tan lento que no hay mucho que mantener, por lo que mi trabajo como mantenedor de perl.c ha sido fácil. Revisé la documentación del sub analizador a la que hizo referencia; todo lo que puedo decir es: ¡guau! Para ser franco, no he estado siguiendo de cerca el desarrollo de Universal Ctags y veo que has hecho grandes avances.

@EvanCarroll , el código habla: siéntase libre de perl.c . Algunas partes son completamente feas y, en retrospectiva, algunas cosas deberían haberse implementado de manera diferente. Con respecto al uso de "uso": toque, punto tomado.

Guay guay. Entonces veré qué puedo hacer este fin de semana. También revisaré el trabajo en el marco de subparser.

Un prototipo funciona.
@EvanCarroll , puedes empezar desde el # 2070.

Me estoy enfocando en el analizador de TypeScript. Así que no trabajaré en el # 2070 por un tiempo.
Hackea como quieras.

[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 prototipo funciona. @EvanCarroll , puedes empezar desde el # 2070.

¡Eso fue rápido! 👍

@masatake impresionante. ¿Hay más trabajo por hacer? Veo que ha implementado findAttribute y la referencia de devolución de llamada de idioma.

@masatake impresionante. ¿Hay más trabajo por hacer?

Ese es el que me gustaría saber :-).
Si me perdí lo que querías, por favor, avísame.
Leí solo algunas partes del documento de Moose.

@masatake trato genial, revisé el parche con github. Si no puede hacerlo, lo echaré un vistazo este fin de semana. =) Pero probablemente lo tendrás listo en 0,0001 segundos.

Pero probablemente lo tendrás listo en 0,0001 segundos.

No es cierto.

Para mejorar el analizador, necesitamos 4 cosas: conocimiento sobre la API interna de ctags, conocimiento sobre el idioma de destino, Moose, tiempo y pasión :-P.

No tengo conocimiento sobre Moose. Éste es el más importante.
por ejemplo, el analizador actual no captura una regla adjunta a una clase con with , y definida con "use Moose :: Rule". Lo que sé es sólo "regla". Sin embargo, es posible que sepa más elementos que las etiquetas deben capturar.

¿No espera que los ctags capturen tales reglas?
Si se adjunta una regla a una clase, creo que la etiqueta de la clase debería tener un campo llamado "regla:" campo.

Estas solicitudes de una persona que conoce el idioma de destino son necesarias para hacer crecer este proyecto.

Puedo implementar algunos de ellos. Puedes implementar otros. Podemos implementar más tarde si tales solicitudes son.

Podemos ampliar la implementación actual para que sea compatible con Mouse, Moo y Mo. Podemos hacer todo lo que desee
quiere SIN modificar el analizador Perl original.

Lo siento, descubrí que ya me diste comentarios importantes en el n. ° 2070. Gracias.

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

Temas relacionados

lvc picture lvc  ·  8Comentarios

cweagans picture cweagans  ·  13Comentarios

songouyang picture songouyang  ·  15Comentarios

sparkcanon picture sparkcanon  ·  3Comentarios

alphaCTzo7G picture alphaCTzo7G  ·  7Comentarios