Ctags: 機胜リク゚スト持っおいるPerl属性

䜜成日 2019幎03月31日  Â·  14コメント  Â·  ゜ヌス: universal-ctags/ctags

珟圚、PerlはMoose、Mouse、Moo、Moなどで拡匵されおいたす。 これらのモゞュヌルにはすべお1぀の共通点がありたす。぀たり、属性セレクタヌはhas確立されたす。 私たちは、ムヌスが確立した次の慣習に埓うものは䜕でも、

has $name|@$names => %optionsは、そこにある倚くのオブゞェクトビルドシステムの1぀に察しお適切に圢成された属性です。

私たちは次のようなこずをカバヌする必芁がありたす

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

党おのコメント14件

@dtikhonov 、これを芋お

ムヌスら。 は単なるモゞュヌルであり、 hasは関数呌び出しであり、Perlキヌワヌドではありたせん。 Mooseのサポヌトをctagsに含めるず、キヌワヌドのように芋える関数呌び出しを導入するPerlモゞュヌルが倚数あるため、Perlパヌサヌは滑りやすい坂道になりたす。

...私はこのトピックに非垞に興味がありたす。 過去3幎間、DSLを凊理するためにctagを改善したした。

私のビゞョンに぀いおは、 http //docs.ctags.io/en/latest/running-multi-parsers.htmlhighlight = subparsertagging-definitions-of-higher-upper-level-language-sub-baseを参照しおください。

Mooseサブパヌサヌは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);
};

Perlパヌサヌがキヌワヌド「use」を芋぀けるず、Perlパヌサヌはそれを登録枈みのサブパヌサヌに通知したす。
ムヌスサブパヌサヌはそのようなサブパヌサヌです。
通知されたモゞュヌル名が「Moose」の堎合、Mooseサブパヌサヌはそれ自䜓をアクティブにしたす。
Mooseサブパヌサヌは、corkずいう名前のctags内郚シンボルテヌブルをスキャンしお、Perl蚀語オブゞェクトを芋぀けたす。
Perlパヌサヌによっお「パッケヌゞ」の皮類ずしおマヌクされおいたす。 Mooseサブパヌサヌは、シンボルテヌブルで「ポむント」を芋぀ける堎合がありたす。
すでにPerlパヌサヌによっおタグ付けされおいたす。 ただし、Mooseパヌサヌは、「クラス」の皮類の「Moose」蚀語を䜿甚しお「Point」の新しいタグを䜜成したす。

Mooseサブパヌサヌは、「ポむント」をスコヌプスタックにプッシュしたす。
Mooseサブパヌサヌは、キヌワヌドずしお「has」を芋぀けたす。 Mooseサブパヌサヌは、「has」の次のトヌクンずしお芋぀かった「x」のタグを䜜成したす。 「x」、「 scopeclass Point languageMoose 」のタグを䜜成するず、「x」に付加されたす。

C ++パヌサヌに぀いおは、すでにこのアむデアを実装しおいたす。
QtMocサブパヌサヌは、Qtを䜿甚しおC ++コヌドを解析するためのものです。 QtMocサブパヌサヌは、C ++蚀語の方蚀ずしお導入されたシグナルずスロットを認識したす。

サブパヌサヌを実装するには、そのベヌスパヌサヌのメンテナヌから蚱可を埗る必芁がありたす。
サブパヌサヌを導入するずベヌスパヌサヌのコヌドが耇雑になるため、@

パヌサヌメンテナヌず、パヌサヌにサブパヌサヌを導入したい私ずの間に矛盟がある堎合、パヌサヌメンテナヌを持぀こずがu-ctagsプロゞェクトで最も重芁なこずであるため、サブパヌサヌの実装を䞭止したす。

@ dtikhonov 、Mooseをサブパヌサヌずしお実装するアむデアに興味がある堎合は、私に知らせおください。
Perlパヌサヌの゜ヌスコヌドぞの圱響を瀺すプロトタむプを䜜成したす。

読んでくれおありがずう。

私はそれが内郚の機胜であるこずを理解しおいたす。 しかし、それは実装の詳现です。 同じ意味で、オブゞェクト指向方匏でプログラミングしおいる堎合、パッケヌゞは「クラス」であり、「サブ」はメ゜ッドです。 Object Oriented perlを䜿甚するず、その呜名法はすべお倉曎されたすが、いずれの堎合も、オブゞェクト指向以倖の甚語を䜿甚できたす。 䞊蚘のすべおの堎合においお、ナヌザヌがどのパラダむムのためにコヌドを曞いたかを掚枬するこずには耇雑さが加わりたす。 ずは蚀うものの、「持っおいる」にはそれらの耇雑さが欠けおいたす。 考えられる解釈が2぀ある堎合は、a関数を「has」ず呌んでいたす。この堎合、珟圚のように、䜕もしないこずが望たしい動䜜になりたす。 たたは、bMoose颚の属性宣蚀を䜿甚しおいたす。

あなたの回答からの「Mooseetal」の匕甚は、これらのモゞュヌルビルダヌフレヌムワヌク has属性宣蚀を含むを䜿甚するためのPerlでのその芏則がどれほど匷力であるかを瀺しおいたす。 Mooseは簡単にPerlで最も人気のあるモゞュヌルの1぀ですDBIやLWPよりもmetacpanに倚くの星がありたす。

誀怜知が発生しなかったず蚀っおいるわけではありたせんが、この芏則に埓わないモゞュヌルを公開した人は誰も知りたせん。これは倚くの人々を助けるこずになりたす。 さらに、私はこのctagsが単に実甚的ずいうよりも理論的に健党であるずは本圓に疑っおいたす。

@masatakeサブパヌサヌのアむデアは私の実装よりも良く、より完党に聞こえたすuseに察しおテストし、それらのモゞュヌルのいく぀かに察しお内郚で異なるセマンティクスを呌び出すこずによっお、すでに同様のこずを行っおいたす。

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

問題は、Mooseパヌサヌをトリガヌするモゞュヌルのリストを列挙する必芁があるこずだず思いたすが、それほど悪くはありたせん。 たた、トリッキヌなMooseのサブクラスを実行しおいる人はいないず想定する必芁がありたすが、実行しおいる堎合、最悪のシナリオはMooseサブパヌサヌを倱うこずです。 そしお、私はそれで倧䞈倫です-それは圌らがそれを持っおいるものより悪くはないでしょう。

Moose甚のCパヌサヌの䜜成に぀いおサポヌトが必芁な堎合は、私もサポヌトできたす。

私は、PerlずMoose甚のこの皮の静的パヌサヌがctagsの倖でも圹立぀だろうず考えおいたす。 珟圚、perlの解析は安党ではなく、保蚌はありたせん。 これにより、たずえば、他のプロゞェクトがPerlでテストカバレッゞを安党に実行できるようになりたす。

@ masatake 、Perl 5は動きの遅いタヌゲットなので、維持するものがあたりないので、 perl.cのメンテナヌずしおの私の仕事は簡単でした。 私はあなたが参照したサブパヌサヌのドキュメントをスキャンしたした-私が蚀えるのはすごい 率盎に蚀っお、私はUniversal Ctagsの開発を綿密に远跡しおいたせんが、あなたは倧きな進歩を遂げたず思いたす。

@EvanCarroll 、コヌドトヌク気軜にperl.cず結婚しおいたせん。 その䞀郚は完党に醜いものであり、埌から考えるず、いく぀かのこずは別の方法で実装されるべきでした。 「䜿甚」の䜿甚に関しおtouche、取られたポむント。

かっこいい、かっこいい。 それでは、今週末に䜕ができるかを芋おいきたす。 サブパヌサヌフレヌムワヌクの䜜業もチェックしたす。

プロトタむプが機胜したす。
@ EvanCarroll 、2070から始めるこずができたす。

TypeScriptパヌサヌに焊点を圓おおいたす。 ですから、しばらくは2070の䜜業はしたせん。
奜きなようにハックしたす。

[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

プロトタむプが機胜したす。 @ EvanCarroll 、2070から始めるこずができたす。

それは速かった 👍

@masatake印象的。 これ以䞊やるべきこずはありたすか findAttributeず蚀語コヌルバックリファレンスを実装したようですが

@masatake印象的。 これ以䞊やるべきこずはありたすか

それが私が知りたいこずです:-)。
私があなたが望むものを逃したならば、私に知らせおください。
私はムヌスの文曞のほんの䞀郚しか読んでいたせん。

@masatakeクヌルな取匕、私はgithubでパッチを確認したした。 うたくいかない堎合は、今週末に芋おいきたす。 =しかし、おそらく0.0001秒で完了したす。

しかし、おそらく0.0001秒で完了したす。

それは本圓ではない。

パヌサヌを改善するには、ctags内郚APIに関する知識、タヌゲット蚀語に関する知識、Moose、時間、情熱の4぀が必芁です。-P。

私はムヌスに぀いおの知識がありたせん。 これが最も重芁です。
たずえば、珟圚のパヌサヌは、 withクラスにアタッチされ、「use Moose :: Rule」で定矩されたルヌルをキャプチャしたせん。 私が知っおいるのは「ルヌル」だけです。 ただし、ctagsがキャプチャする必芁のあるアむテムがもっずあるこずを知っおいるかもしれたせん。

ctagsがそのようなルヌルをキャプチャするこずを期埅したせんか
ルヌルがクラスに添付されおいる堎合、クラスのタグには「rule」ずいう名前のフィヌルドが必芁だず思いたす。" 分野。

このプロゞェクトを成長させるには、タヌゲット蚀語を知っおいる人からのこれらの芁求が必芁です。

私はそれらのいく぀かを実装するこずができたす。 他のものを実装するこずができたす。 そのような芁求があれば、埌で実装できたす。

珟圚の実装を拡匵しお、Mouse、Moo、およびMoをサポヌトできたす。
元のPerlパヌサヌを倉曎せずに必芁です。

申し蚳ありたせんが、2070ですでに重芁なコメントをいただいおいるこずがわかりたした。 ありがずうございたした。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡