Ctags: طلب الميزة: سمات Perl مع (has)

تم إنشاؤها على ٣١ مارس ٢٠١٩  ·  14تعليقات  ·  مصدر: universal-ctags/ctags

حاليًا ، يمتد Perl مع Moose و Mouse و Moo و Mo وما شابه ذلك. تحتوي جميع هذه الوحدات على قاسم مشترك واحد - يتم إنشاء محددات السمات الخاصة بهم باستخدام has . أعتقد أننا يمكن أن نفترض أن أي شيء يتبع اتفاقية موس التي وضعها ،

has $name|@$names => %options هي سمة تم تشكيلها بشكل صحيح لأحد أنظمة بناء الكائنات العديدة الموجودة هناك.

سيتعين علينا تغطية أشياء مثل

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

ال 14 كومينتر

dtikhonov ، هل يمكنك إلقاء نظرة على هذا؟

موس وآخرون. هي مجرد وحدات و has هي استدعاء دالة ، وليست كلمة أساسية لـ Perl. إن تضمين دعم Moose في محلل ctags Perl من شأنه أن يضعنا على منحدر زلق ، حيث توجد العديد من وحدات Perl التي تقدم استدعاءات وظيفية تشبه الكلمات الرئيسية.

... أنا مهتم جدًا بهذا الموضوع. خلال السنوات الثلاث الماضية ، قمت بتحسين علامات ctags للتعامل مع DSLs.

راجع http://docs.ctags.io/en/latest/running-multi-parsers.html؟highlight=subparser#tagging -definitions-of-upper-level-language-sub-base حول رؤيتي.

يمكن تشغيل محلل موس في محلل 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 بمسح جدول الرموز الداخلي لـ ctags المسمى cork للعثور على كائن لغة Perl
تم وضع علامة "package" على النوع بواسطة محلل Perl. قد يجد محلل Moose الفرعي "Point" في جدول الرموز.
تم وضع علامة عليه بالفعل بواسطة المحلل اللغوي لـ Perl. ومع ذلك ، يقوم المحلل اللغوي Moose بعمل علامة جديدة لـ "Point" مع نوع "class" من لغة "Moose".

يدفع محلل Moose الفرعي "Point" إلى حزمة النطاق.
يعثر محلل Moose الفرعي على "has" ككلمة رئيسية. يقوم الموزع الفرعي لـ Moose بعمل علامة لـ "x" التي تم العثور عليها كرمز مميز تالي لـ "has". إنشاء علامة لـ "x" ، " النطاق: class : Point language: Moose " مرفق بـ "x" ...

حول محلل C ++ ، لقد قمت بالفعل بتنفيذ هذه الفكرة.
المحلل اللغوي الفرعي QtMoc مخصص لتحليل كود C ++ باستخدام Qt. يتعرف المحلل الفرعي QtMoc على الإشارة والفتحة ، والتي يتم تقديمها كلغة من لغة C ++.

لتنفيذ محلل فرعي ، يجب أن أحصل على إذن من المشرف على المحلل اللغوي الأساسي.
أعتقد أن dtikhonov ليس إيجابيًا جدًا لأن إدخال محلل فرعي يجعل كود محلل أساسي معقدًا.

إذا كان هناك تعارض بيني وبين مشرف المحلل اللغوي ، والذي يريد تقديم محلل فرعي إلى المحلل اللغوي ، فسأنسحب من تطبيق الموزع الفرعي لأن وجود مشرف محلل هو أهم شيء في مشروع u-ctags.

dtikhonov ، إذا كنت مهتمًا بفكرة تطبيق Moose كمحلل فرعي ، فأخبرني بذلك.
سأقوم بعمل نموذج أولي لإظهار التأثير على الكود المصدري لمحلل Perl.

شكرا لقرائتك.

أدرك أنها وظيفة ، تحت الغطاء. لكن هذه تفاصيل تنفيذية. بنفس المعنى ، الحزم هي "فئات" عندما تقوم بالبرمجة بطريقة كائنية التوجه ، و "Subs" هي طرق. تتغير كل هذه التسميات عند استخدام كائن الموجه بيرل ، ولكن في كل حالة يمكنك الاستفادة من المصطلحات غير OO. في جميع الحالات المذكورة أعلاه ، على الرغم من وجود تعقيدات إضافية في استنتاج النموذج الذي كتب المستخدم رمزه. ومع ذلك ، فإن كلمة "لديها" تفتقر إلى تلك التعقيدات. إذا رأيت أنه لديك تفسيران محتملان (أ) فأنت تستدعي دالة "لديها" وفي هذه الحالة يكون السلوك المطلوب هو عدم فعل أي شيء ، كما نفعل الآن ؛ أو ، (ب) أنك تستخدم إعلان سمة Moose-esque.

يوضح الاقتباس "Moose et al" من إجابتك مدى قوة هذا الاصطلاح في Perl لاستخدام أطر عمل إنشاء الوحدات (التي تتضمن إعلان السمات has ). يعد Moose بسهولة أحد أكثر الوحدات النمطية شيوعًا لـ Perl (يحتوي على عدد من النجوم على Metacpan أكثر من DBI و LWP).

أنا لا أقول أنه لا

masatake تبدو فكرة الموزع الفرعي أفضل وأكثر اكتمالاً من تطبيقي ، وقد قام بيرل بالفعل بشيء مماثل عن طريق الاختبار مقابل use واستدعاء دلالات مختلفة لبعض هذه الوحدات داخليًا.

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

أعتقد أن المشكلة هناك هي أنه سيتعين عليك تعداد قائمة الوحدات التي تؤدي إلى تشغيل محلل Moose الذي لن يكون سيئًا للغاية. سيكون عليك أيضًا أن تفترض أنه لا يوجد أحد يدير فئة فرعية من Moose وهو أمر صعب ، ولكن إذا كانوا يفعلون ذلك ، فإن السيناريو الأسوأ هو أنهم سيفقدون محلل Moose الفرعي. وأنا موافق على ذلك - لن يكون الأمر أسوأ مما لديهم.

إذا كنت تريد مساعدة في كتابة محلل C لـ Moose ، فيمكنني المساعدة في ذلك أيضًا.

أنا على وشك أن أفكر في أن هذا النوع من المحلل اللغوي الثابت لـ Perl و Moose سيكون مفيدًا خارج ctags أيضًا. تحليل perl حاليًا غير آمن ، ولا توجد ضمانات. سيسمح هذا لمشاريع أخرى بإجراء تغطية اختبارية على Perl ، على سبيل المثال.

masatake ، يعد Perl 5 هدفًا بطيئًا بحيث لا يوجد الكثير للحفاظ عليه ، لذا فإن وظيفتي perl.c كانت سهلة. لقد قمت بمسح وثائق الموزع الفرعي التي أشرت إليها - كل ما يمكنني قوله هو: رائع! لأكون صريحًا ، لم أتابع تطوير Universal Ctags عن كثب وأرى أنك قطعت خطوات كبيرة.

EvanCarroll ، محادثات الشفرة: لا تتردد في تجربة ذلك. أنا لست متزوجًا من perl.c أيضًا. أجزاء منه قبيحة تمامًا ، وفي الإدراك المتأخر ، كان يجب تنفيذ بعض الأشياء بشكل مختلف. فيما يتعلق باستخدام "الاستخدام": لمس ، النقطة التي اتخذت.

رائع رائع. سأرى ما يمكنني إنجازه في نهاية هذا الأسبوع بعد ذلك. سوف أتحقق من العمل في إطار عمل الموزع الفرعي أيضًا.

نموذج أولي يعمل.
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.

كان هذا سريعا! 👍

تضمين التغريدة هل هناك المزيد من العمل للقيام به؟ أرى أنك نفذت findAttribute ومرجع رد الاتصال للغة؟

تضمين التغريدة هل هناك المزيد من العمل للقيام به؟

هذا هو ما أود أن أعرفه :-).
إذا فاتني ما تريد ، من فضلك أعلمني.
قرأت فقط أجزاء قليلة من وثيقة موس.

masatake صفقة رائعة ، لقد راجعت التصحيح مع جيثب. إذا لم تتمكن من الالتفاف عليها ، فسوف ألقي نظرة في نهاية هذا الأسبوع. =) ولكن من المحتمل أن يتم ذلك في 0.0001 ثانية.

ولكن من المحتمل أن يتم ذلك في 0.0001 ثانية.

هذا غير صحيح.

لتحسين المحلل اللغوي ، نحتاج إلى 4 أشياء: المعرفة حول واجهة برمجة تطبيقات ctags الداخلية ، ومعرفة اللغة الهدف ، والموظ ، والوقت ، والشغف :-P.

ليس لدي معرفة عن الموظ. هذا هو الاهم
على سبيل المثال ، لا يلتقط المحلل اللغوي الحالي قاعدة مرتبطة بفصل بـ with ، ويتم تعريفه بـ "use Moose :: Rule". ما أعرفه هو فقط "القاعدة". ومع ذلك ، قد تعرف المزيد من العناصر التي يجب أن تلتقطها ctags.

ألا تتوقع أن تلتقط ctags مثل هذه القواعد؟
إذا تم إرفاق قاعدة بفصل ، أعتقد أن علامة الفصل يجب أن تحتوي على حقل باسم "القاعدة:" حقل.

هذه الطلبات من شخص يعرف اللغة الهدف مطلوبة لتنمية هذا المشروع.

يمكنني تنفيذ بعضها. يمكنك تطبيق أخرى. يمكننا التنفيذ لاحقًا إذا كانت مثل هذه الطلبات.

يمكننا تمديد التنفيذ الحالي لدعم Mouse و Moo و Mo. يمكننا فعل أي شيء لك
تريد دون تعديل محلل Perl الأصلي.

آسف ، لقد وجدت أنك قدمت لي تعليقات مهمة في # 2070 بالفعل. شكرا لك.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات