Ctags: Permintaan Fitur: Atribut Perl dengan (memiliki)

Dibuat pada 31 Mar 2019  ·  14Komentar  ·  Sumber: universal-ctags/ctags

Saat ini Perl diperpanjang dengan Moose, Mouse, Moo, dan Mo, dan sejenisnya. Semua modul ini memiliki satu kesamaan -- pemilih atributnya dibuat dengan has . Saya percaya kita dapat membuat asumsi bahwa apa pun yang mengikuti konvensi yang ditetapkan Moose,

has $name|@$names => %options adalah atribut yang dibentuk dengan benar untuk salah satu dari banyak sistem pembuatan objek di luar sana.

Kita harus menutupi hal-hal seperti

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

Semua 14 komentar

@dtikhonov , bisakah Anda melihat ini?

Moose dkk. hanya modul dan has adalah panggilan fungsi, bukan kata kunci Perl. Menyertakan dukungan untuk Moose ke dalam parser ctags Perl akan menempatkan kita pada kemiringan yang licin, karena ada banyak modul Perl yang memperkenalkan pemanggilan fungsi yang terlihat seperti kata kunci.

...Saya sangat tertarik dengan topik ini. 3 tahun terakhir, saya telah meningkatkan ctag untuk menangani DSL.

Lihat http://docs.ctags.io/en/latest/running-multi-parsers.html?highlight=subparser#tagging -definitions-of-higher-upper-level-language-sub-base tentang visi saya.

Subparser rusa dapat berjalan di parser 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);
};

Ketika parser Perl menemukan kata kunci "gunakan", parser Perl memberitahukannya ke subparser terdaftar.
Subparser rusa adalah subparser seperti itu.
Subparser Moose mengaktifkan dirinya sendiri jika nama modul yang diberitahukan adalah "Moose".
Subparser Moose memindai tabel simbol internal ctag bernama gabus untuk menemukan objek bahasa Perl
jenis "paket" yang ditandai oleh parser Perl. Subparser Moose dapat menemukan "Titik" di tabel simbol.
Itu sudah ditandai oleh parser Perl. Namun, pengurai Moose membuat tag baru untuk "Titik" dengan jenis bahasa "Moose" "kelas".

Subparser Moose mendorong "Titik" ke tumpukan lingkup.
Subparser Moose menemukan "memiliki" sebagai kata kunci. Subparser Moose membuat tag untuk "x" ditemukan sebagai token berikutnya untuk "memiliki". Pembuatan tag untuk "x", " scope:class :Point language:Moose " dilampirkan ke "x"...

Tentang parser C++, saya sudah menerapkan ide ini.
Subparser QtMoc adalah untuk mengurai kode C++ menggunakan Qt. Subparser QtMoc mengenali sinyal dan slot, yang diperkenalkan sebagai dialek bahasa C++.

Untuk mengimplementasikan subparser, saya harus mendapatkan izin dari pengelola parser dasarnya.
Saya kira @dtikhonov tidak begitu positif karena memperkenalkan subparser membuat kode parser dasar menjadi rumit.

Jika ada konflik antara pengelola parser dan saya, yang ingin memperkenalkan subparser ke parser, saya akan mundur dari implementasi subparser karena memiliki pengelola parser adalah hal terpenting dalam proyek u-ctags.

@dtikhonov , jika Anda tertarik dengan gagasan menerapkan Moose sebagai subparser, beri tahu saya.
Saya akan membuat prototipe untuk menunjukkan dampak pada kode sumber parser Perl.

Terima kasih telah membaca.

Saya menyadari itu fungsi, di bawah tenda. Tapi, itu detail implementasi. Dalam pengertian yang sama, paket adalah "kelas" ketika Anda memprogram dengan cara berorientasi objek, dan "subs" adalah metode. Semua nomenklatur itu berubah ketika Anda menggunakan Perl Berorientasi Objek, tetapi dalam setiap kasus Anda dapat menggunakan terminologi non-OO. Dalam semua kasus di atas, ada kerumitan tambahan dalam menyimpulkan paradigma mana yang telah ditulis kodenya oleh pengguna. Yang mengatakan, "memiliki" tidak memiliki kompleksitas itu. Jika Anda melihatnya, Anda memiliki dua kemungkinan interpretasi (a) Anda memanggil fungsi "memiliki" dalam hal ini perilaku yang diinginkan adalah tidak melakukan apa pun, seperti yang kita lakukan sekarang; atau, (b) Anda menggunakan deklarasi atribut Moose-esque.

Kutipan "Moose et al" dari respons Anda menunjukkan seberapa kuat konvensi itu di Perl untuk menggunakan kerangka kerja pembuat modul ini (yang mencakup deklarasi has -attribute). Moose adalah salah satu modul paling populer untuk Perl (memiliki lebih banyak bintang di metacpan daripada DBI dan LWP).

Saya tidak mengatakan kami tidak dapat memiliki kesalahan positif, tetapi saya tidak tahu siapa pun yang telah menerbitkan modul yang tidak mengikuti konvensi ini dan itu akan membantu banyak orang. Selain itu, saya benar-benar ragu bahwa ctag ini secara teoritis terdengar daripada hanya praktis.

@masatake ide subparser terdengar lebih baik dan lebih lengkap daripada implementasi saya, dan Perl sebenarnya sudah melakukan sesuatu yang serupa dengan menguji terhadap use dan menerapkan semantik yang berbeda untuk beberapa modul tersebut secara internal.

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

Saya kira masalahnya adalah Anda harus menghitung daftar modul yang memicu pengurai Moose yang tidak akan terlalu buruk. Anda juga harus berasumsi bahwa tidak ada yang menjalankan subkelas Moose yang rumit, tetapi jika mereka melakukan itu skenario terburuknya adalah mereka akan kehilangan Moose-subparser. Dan, saya setuju dengan itu -- itu tidak akan lebih buruk dari apa yang mereka miliki.

Jika Anda ingin bantuan menulis parser C untuk Moose, saya juga dapat membantu.

Saya hampir berpikir bahwa pengurai statis semacam ini untuk Perl dan Moose akan berguna di luar ctag juga. Saat ini parsing perl tidak aman, dan tidak ada jaminan. Ini akan memungkinkan proyek lain untuk menjalankan cakupan pengujian dengan aman di Perl, misalnya.

@masatake , Perl 5 adalah target yang bergerak lambat sehingga tidak banyak yang harus dipertahankan, jadi pekerjaan saya sebagai pengelola perl.c menjadi mudah. Saya memindai melalui dokumentasi subparser yang Anda rujuk -- yang bisa saya katakan hanyalah: wow! Sejujurnya, saya belum mengikuti pengembangan Universal Ctags secara dekat dan saya melihat Anda telah membuat langkah besar.

@EvanCarroll , pembicaraan kode: jangan ragu untuk mencobanya. Saya juga tidak menikah dengan perl.c . Bagian-bagiannya benar-benar jelek dan, jika dipikir-pikir, beberapa hal seharusnya diterapkan secara berbeda. Berkenaan dengan penggunaan "penggunaan": sentuhan, titik diambil.

Keren keren. Saya akan melihat apa yang bisa saya lakukan akhir pekan ini. Saya akan memeriksa pekerjaan pada kerangka kerja subparser juga.

Sebuah prototipe bekerja.
@EvanCarroll , Anda dapat mulai dari #2070.

Saya fokus pada pengurai TypeScript. Jadi saya tidak akan mengerjakan #2070 untuk sementara.
Retas sesuka Anda.

[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

Sebuah prototipe bekerja. @EvanCarroll , Anda dapat mulai dari #2070.

Itu cepat! 👍

@masatake mengesankan. Apakah ada pekerjaan lagi yang harus dilakukan? Saya melihat Anda telah menerapkan findAttribute dan referensi panggilan balik bahasa?

@masatake mengesankan. Apakah ada pekerjaan lagi yang harus dilakukan?

Itulah yang saya ingin tahu :-).
Jika saya melewatkan apa yang Anda inginkan, tolong beri tahu saya.
Saya hanya membaca beberapa bagian dari dokumen Moose.

@masatake keren, saya meninjau tambalan dengan github. Jika Anda tidak bisa melakukannya, saya akan melihatnya akhir pekan ini. =) Tapi Anda mungkin akan menyelesaikannya dalam 0,0001 detik.

Tapi Anda mungkin akan menyelesaikannya dalam 0,0001 detik.

Itu tidak benar.

Untuk meningkatkan parser, kita membutuhkan 4 hal: pengetahuan tentang API internal ctag, pengetahuan tentang bahasa target, Moose, waktu, dan gairah:-P.

Saya tidak memiliki pengetahuan tentang Moose. Yang satu ini yang paling penting.
misalnya parser saat ini tidak menangkap aturan yang dilampirkan ke kelas dengan with , dan didefinisikan dengan "use Moose::Rule". Yang saya tahu hanyalah "aturan". Namun, Anda mungkin tahu lebih banyak item yang harus ditangkap oleh ctag.

Tidakkah Anda berharap ctag menangkap aturan seperti itu?
Jika aturan dilampirkan ke kelas, saya pikir tag untuk kelas harus memiliki bidang bernama "aturan:" bidang.

Permintaan dari seseorang yang mengetahui bahasa target diperlukan untuk mengembangkan proyek ini.

Saya dapat menerapkan beberapa di antaranya. Anda dapat menerapkan yang lain. Kami dapat menerapkannya nanti jika permintaan seperti itu.

Kami dapat memperluas implementasi saat ini untuk mendukung Mouse, Moo, dan Mo. Kami dapat melakukan apa pun yang Anda inginkan
inginkan TANPA memodifikasi parser Perl asli.

Maaf, saya menemukan Anda memberi saya komentar penting di #2070. Terima kasih.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat