Ctags: ๊ธฐ๋Šฅ ์š”์ฒญ: (has)๊ฐ€ ์žˆ๋Š” Perl ์†์„ฑ

์— ๋งŒ๋“  2019๋…„ 03์›” 31์ผ  ยท  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 , ์ด๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Moose et al. ๋ชจ๋“ˆ์ด๊ณ  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"์ธ ๊ฒฝ์šฐ ์ž์ฒด์ ์œผ๋กœ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
Moose ํ•˜์œ„ ํŒŒ์„œ๋Š” Perl ์–ธ์–ด ๊ฐœ์ฒด๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด cork๋ผ๋Š” ctags ๋‚ด๋ถ€ ๊ธฐํ˜ธ ํ…Œ์ด๋ธ”์„ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค.
Perl ํŒŒ์„œ์— ์˜ํ•ด "ํŒจํ‚ค์ง€" ์ข…๋ฅ˜๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. Moose ํ•˜์œ„ ํŒŒ์„œ๋Š” ๊ธฐํ˜ธ ํ…Œ์ด๋ธ”์—์„œ "Point"๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Perl ํŒŒ์„œ์— ์˜ํ•ด ์ด๋ฏธ ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Moose ํŒŒ์„œ๋Š” "Moose" ์–ธ์–ด์˜ "class" ์ข…๋ฅ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "Point"์— ๋Œ€ํ•œ ์ƒˆ ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Moose ํ•˜์œ„ ํŒŒ์„œ๋Š” "Point"๋ฅผ ๋ฒ”์œ„ ์Šคํƒ์œผ๋กœ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.
Moose ํ•˜์œ„ ํŒŒ์„œ๋Š” "has"๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ์ฐพ์Šต๋‹ˆ๋‹ค. Moose ์„œ๋ธŒํŒŒ์„œ๋Š” "has"์— ๋Œ€ํ•œ ๋‹ค์Œ ํ† ํฐ์œผ๋กœ ๋ฐœ๊ฒฌ๋œ "x"์— ๋Œ€ํ•œ ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. "x", " scope:class :Point language:Moose "์— ๋Œ€ํ•œ ํƒœ๊ทธ๋ฅผ "x"์— ๋ถ™์ž…๋‹ˆ๋‹ค...

C++ ํŒŒ์„œ์— ๋Œ€ํ•ด์„œ๋Š” ์ด๋ฏธ ์ด ์•„์ด๋””์–ด๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
QtMoc ์„œ๋ธŒํŒŒ์„œ๋Š” Qt๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ C++ ์ฝ”๋“œ๋ฅผ ํŒŒ์‹ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. QtMoc ์„œ๋ธŒํŒŒ์„œ๋Š” C++ ์–ธ์–ด์˜ ๋ฐฉ์–ธ์œผ๋กœ ๋„์ž…๋œ ์‹ ํ˜ธ์™€ ์Šฌ๋กฏ์„ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์œ„ ํŒŒ์„œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ ํŒŒ์„œ์˜ ์œ ์ง€ ๊ด€๋ฆฌ์ž๋กœ๋ถ€ํ„ฐ ํ—ˆ๊ฐ€๋ฅผ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
@dtikhonov ๋Š” ๊ทธ๋ ‡๊ฒŒ ๊ธ์ •์ ์ด์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์„œ ๋ฉ”์ธํ…Œ์ด๋„ˆ์™€ ํŒŒ์„œ์— ์„œ๋ธŒํŒŒ์„œ๋ฅผ ๋„์ž…ํ•˜๊ณ  ์‹ถ์€ ์ € ์‚ฌ์ด์— ๊ฐˆ๋“ฑ์ด ์ƒ๊ธด๋‹ค๋ฉด u-ctags ํ”„๋กœ์ ํŠธ์—์„œ ํŒŒ์„œ ๋ฉ”์ธํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ธŒํŒŒ์„œ ๊ตฌํ˜„์„ ํฌ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@dtikhonov , Moose๋ฅผ ์„œ๋ธŒํŒŒ์„œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์•„์ด๋””์–ด์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.
Perl ํŒŒ์„œ์˜ ์†Œ์Šค ์ฝ”๋“œ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ํ”„๋กœํ† ํƒ€์ž…์„ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฝ์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ธฐ๋Šฅ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ์˜๋ฏธ์—์„œ ํŒจํ‚ค์ง€๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ๋•Œ "ํด๋ž˜์Šค"์ด๊ณ  "์„œ๋ธŒ"๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ ํŽ„์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ชจ๋“  ๋ช…๋ช…๋ฒ•์ด ๋ณ€๊ฒฝ๋˜์ง€๋งŒ ๊ฐ ๊ฒฝ์šฐ์— ๋น„ OO ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์— ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ถ”๋ก ํ•˜๋Š” ๋ฐ ๋ณต์žก์„ฑ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, "์žˆ๋‹ค"๋Š” ๋ณต์žก์„ฑ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๋ณธ๋‹ค๋ฉด ๋‹น์‹ ์€ ๋‘ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ํ•ด์„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” (b) Moose-esque ์†์„ฑ ์„ ์–ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์‘๋‹ต์—์„œ "Moose et al" ์ธ์šฉ๋ฌธ์€ Perl์—์„œ ์ด๋Ÿฌํ•œ ๋ชจ๋“ˆ ๋นŒ๋” ํ”„๋ ˆ์ž„์›Œํฌ( has -attribute ์„ ์–ธ ํฌํ•จ)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ๊ทœ์น™์ด ์–ผ๋งˆ๋‚˜ ๊ฐ•๋ ฅํ•œ์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. Moose๋Š” Perl์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๋ชจ๋“ˆ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค(๋ฉ”ํƒ€ํŒ์— DBI ๋ฐ LWP๋ณด๋‹ค ๋ณ„์ด ๋” ๋งŽ์Œ).

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ์˜คํƒ(false-positive)์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๋‚˜๋Š” ์ด ๊ทœ์น™์„ ๋”ฐ๋ฅด์ง€ ์•Š๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์„ ๋„์šธ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ์„ ๊ฒŒ์‹œํ•œ ์‚ฌ๋žŒ์„ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, ๋‚˜๋Š” ์ด ctags๊ฐ€ ๋‹จ์ง€ ์‹ค์šฉ์ ์ด๊ธฐ๋ณด๋‹ค๋Š” ์ด๋ก ์ ์œผ๋กœ ๊ฑด์ „ํ•œ์ง€ ์ •๋ง ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

@masatake ํ•˜์œ„ ํŒŒ์„œ ์•„์ด๋””์–ด๋Š” ๋‚ด ๊ตฌํ˜„๋ณด๋‹ค ๋” ํ›Œ๋ฅญํ•˜๊ณ  use ์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋ชจ๋“ˆ ์ค‘ ์ผ๋ถ€์— ๋Œ€ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

๋ฌธ์ œ๋Š” ๋„ˆ๋ฌด ๋‚˜์˜์ง€ ์•Š์€ Moose-parser๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋ชจ๋“ˆ ๋ชฉ๋ก์„ ์—ด๊ฑฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๊นŒ๋‹ค๋กœ์šด Moose ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์•„๋ฌด๋„ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒฝ์šฐ ๋” ๋‚˜์œ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” Moose ํ•˜์œ„ ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ๋ฅผ ์žƒ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์ €๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์˜์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Moose์šฉ C ํŒŒ์„œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ํ•„์š”ํ•˜๋ฉด ์ €๋„ ๋„์™€๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Perl๊ณผ Moose๋ฅผ ์œ„ํ•œ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ •์  ํŒŒ์„œ๊ฐ€ ctags ๋ฐ–์—์„œ๋„ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํŽ„ ๊ตฌ๋ฌธ ๋ถ„์„์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ 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๋ถ€ํ„ฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋นจ๋ž๋‹ค! ๐Ÿ‘

@masatake ์ธ์ƒ์ ์ž…๋‹ˆ๋‹ค. ๋” ํ•  ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ? findAttribute ๋ฐ ์–ธ์–ด ์ฝœ๋ฐฑ ์ฐธ์กฐ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๊นŒ?

@masatake ์ธ์ƒ์ ์ž…๋‹ˆ๋‹ค. ๋” ํ•  ์ผ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค :-).
๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์„ ๋†“์ณค๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.
๋‚˜๋Š” ๋ฌด์Šค ๋ฌธ์„œ์˜ ์ผ๋ถ€๋งŒ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

@masatake ๋ฉ‹์ง„ ๊ฑฐ๋ž˜, github์œผ๋กœ ํŒจ์น˜๋ฅผ ๊ฒ€ํ† ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์•ˆ๋˜์‹œ๋ฉด ์ด๋ฒˆ ์ฃผ๋ง์— ํ•œ๋ฒˆ ๊ฐ€๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค. =) ํ•˜์ง€๋งŒ ์•„๋งˆ๋„ 0.0001์ดˆ ์•ˆ์— ์™„๋ฃŒ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์•„๋งˆ๋„ 0.0001์ดˆ ์•ˆ์— ์™„๋ฃŒ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์‹ค์ด ์•„๋‹ˆ๋‹ค.

ํŒŒ์„œ๋ฅผ ๊ฐœ์„ ํ•˜๋ ค๋ฉด ctags ๋‚ด๋ถ€ API์— ๋Œ€ํ•œ ์ง€์‹, ๋Œ€์ƒ ์–ธ์–ด์— ๋Œ€ํ•œ ์ง€์‹, Moose, ์‹œ๊ฐ„ ๋ฐ ์—ด์ •์˜ 4๊ฐ€์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

๋‚˜๋Š” ๋ฌด์Šค์— ๋Œ€ํ•œ ์ง€์‹์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ ํŒŒ์„œ๋Š” with ํด๋ž˜์Šค์— ์ฒจ๋ถ€๋œ ๊ทœ์น™์„ ์บก์ฒ˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ "Moose::Rule ์‚ฌ์šฉ"์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ๊ฒƒ์€ "๊ทœ์น™"๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ctags๊ฐ€ ์บก์ฒ˜ํ•ด์•ผ ํ•˜๋Š” ๋” ๋งŽ์€ ํ•ญ๋ชฉ์„ ์•Œ๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ctags๊ฐ€ ์ด๋Ÿฌํ•œ ๊ทœ์น™์„ ์บก์ฒ˜ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
๊ทœ์น™์ด ํด๋ž˜์Šค์— ์ฒจ๋ถ€๋œ ๊ฒฝ์šฐ ํด๋ž˜์Šค์˜ ํƒœ๊ทธ์—๋Š” "rule:"์ด๋ผ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค." ํ•„๋“œ.

๋Œ€์ƒ ์–ธ์–ด๋ฅผ ์•„๋Š” ์‚ฌ๋žŒ์˜ ์ด๋Ÿฌํ•œ ์š”์ฒญ์€ ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์„ฑ์žฅ์‹œํ‚ค๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋“ค ์ค‘ ์ผ๋ถ€๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ๋“ค์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์š”์ฒญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋‚˜์ค‘์— ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ตฌํ˜„์„ ํ™•์žฅํ•˜์—ฌ Mouse, Moo ๋ฐ Mo๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์›๋ž˜ Perl ํŒŒ์„œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์›ํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ #2070์—์„œ ์ค‘์š”ํ•œ ์˜๊ฒฌ์„ ๋ง์”€ํ•ด ์ฃผ์…จ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰