Ctags: PHP heredoc (<<

에 λ§Œλ“  2020λ…„ 11μ›” 20일  Β·  8μ½”λ©˜νŠΈ  Β·  좜처: universal-ctags/ctags

μš”μ•½:

νŒŒμΌμ—μ„œ PHP heredoc ( <<< ) ꡬ문이 발견되면 νƒœκ·Έ 생성이 μ€‘μ§€λ©λ‹ˆλ‹€. nowdoc PHP ꡬ문은 기본적으둜 λ™μΌν•˜λ―€λ‘œ 파일 ꡬ문 뢄석을 μ€‘λ‹¨ν•˜λŠ” 또 λ‹€λ₯Έ μ–Έμ–΄ μš”μ†Œμž…λ‹ˆλ‹€.

νŒŒμ„œμ˜ 이름 :

이것에 λŒ€ν•΄ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. PHP κ°€μ •

ctagsλ₯Ό μ‹€ν–‰ν•˜λŠ” 데 μ‚¬μš©ν•œ λͺ…λ Ή 쀄 :
$ ctags --options=NONE foo.php
μž…λ ₯ 파일의 λ‚΄μš© :
<?php

class LivingBeings {

    public function doSomething()
    {
        $foo = <<<FOO
        FOO;
    }

    public function doSomethingElse()
    {
    }
}
λ§Œμ‘±μŠ€λŸ½μ§€ μ•Šμ€ νƒœκ·Έ 좜λ ₯ :

doSomethingElse λ©”μ„œλ“œκ°€ νŒŒμΌμ— λ‚˜μ—΄λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. heredoc 뢀뢄을 ​​주석 μ²˜λ¦¬ν•˜μžλ§ˆμž μ•žμ˜ "μ˜ˆμƒ 좜λ ₯"μ„Ήμ…˜μ—μ„œ λ³Ό 수 μžˆλ“―μ΄ λ©”μ„œλ“œλŠ” μ •μƒμ μœΌλ‘œ μΈλ±μ‹±λ©λ‹ˆλ‹€.

!_TAG_FILE_FORMAT   2   /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED   1   /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_OUTPUT_EXCMD  mixed   /number, pattern, mixed, or combine/
!_TAG_OUTPUT_FILESEP    slash   /slash or backslash/
!_TAG_OUTPUT_MODE   u-ctags /u-ctags or e-ctags/
!_TAG_PATTERN_LENGTH_LIMIT  96  /0 for no limit/
!_TAG_PROC_CWD  /tmp/   //
!_TAG_PROGRAM_AUTHOR    Universal Ctags Team    //
!_TAG_PROGRAM_NAME  Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL   https://ctags.io/   /official site/
!_TAG_PROGRAM_VERSION   5.9.0   /5a136315/
LivingBeings    foo.php /^class LivingBeings {$/;"  c
doSomething foo.php /^    public function doSomething()$/;" f   class:LivingBeings
μ˜ˆμƒλ˜λŠ” νƒœκ·Έ 좜λ ₯ :
!_TAG_FILE_FORMAT   2   /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED   1   /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_OUTPUT_EXCMD  mixed   /number, pattern, mixed, or combine/
!_TAG_OUTPUT_FILESEP    slash   /slash or backslash/
!_TAG_OUTPUT_MODE   u-ctags /u-ctags or e-ctags/
!_TAG_PATTERN_LENGTH_LIMIT  96  /0 for no limit/
!_TAG_PROC_CWD  /tmp/   //
!_TAG_PROGRAM_AUTHOR    Universal Ctags Team    //
!_TAG_PROGRAM_NAME  Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL   https://ctags.io/   /official site/
!_TAG_PROGRAM_VERSION   5.9.0   /5a136315/
LivingBeings    foo.php /^class LivingBeings {$/;"  c
doSomething foo.php /^    public function doSomething()$/;" f   class:LivingBeings
doSomethingElse foo.php /^    public function doSomethingElse()$/;" f   class:LivingBeings
ctags의 버전 :
$ ctags --version
Universal Ctags 5.9.0(5a136315), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Nov 20 2020, 11:46:20
  URL: https://ctags.io/
  Optional compiled features: +wildcards, +regex, +iconv, +option-directory, +xpath, +yaml, +packcc
ctags λ°”μ΄λ„ˆλ¦¬λ₯Ό μ–»λŠ” 방법 :

λ‘œμ»¬μ—μ„œ λΉŒλ“œ :

$ cd ctags_source
$ make clean && make distclean
$ ./autogen.sh
$ ./configure --prefix=$HOME
$ make
$ make install
Parser buenhancement

λͺ¨λ“  8 λŒ“κΈ€

@jespinal ,이 λ³€κ²½ 사항에 λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ? https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes ?

$ git diff |cat
git diff |cat
diff --git a/parsers/php.c b/parsers/php.c
index e3fdc241..ace25561 100644
--- a/parsers/php.c
+++ b/parsers/php.c
@@ -682,6 +682,8 @@ static void parseHeredoc (vString *const string)
            int extra = EOF;

            c = getcFromInputFile ();
+           if (c == ' ' || c == '\t')
+               c = getcFromInputFile ();
            for (len = 0; c != 0 && (c - delimiter[len]) == 0; len++)
                c = getcFromInputFile ();

$ cat input.php
cat input.php
<?php
// Taken from https://github.com/universal-ctags/ctags/issues/2717
// submitted by <strong i="5">@jespinal</strong>
class LivingBeings {

    public function doSomething()
    {
        $foo = <<<FOO
        FOO;
    }

    public function doSomethingElse()
    {
    }
}
$ u-ctags -o - input.php
u-ctags -o - input.php
LivingBeings    input.php   /^class LivingBeings {$/;"  c
doSomething input.php   /^    public function doSomething()$/;" f   class:LivingBeings
$

@masatake λ§ŒμœΌλ‘œλŠ” μΆ©λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ°€ 자체 쀄에 μžˆμ–΄μ•Όν–ˆκΈ° λ•Œλ¬Έμ— μƒˆ 버전은 ν•΄λ‹Ή μ œν•œμ„ ν•΄μ œν•©λ‹ˆλ‹€. μ„€λͺ…이 λͺ…ν™•ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‚΄κ°€ μ œμ•ˆν•˜λŠ” κ΅¬ν˜„μ€ 발견 된 마컀의 연속성이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜κ³ , κ·Έλ ‡λ‹€λ©΄ μœ νš¨ν•œ μ‹λ³„μžλ₯Ό ν˜•μ„±ν•˜λŠ”μ§€ ν™•μΈν•˜μ—¬μ΄ 문제λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” μ’…λ£Œ λ§ˆμ»€κ°€ μ ‘λ‘μ‚¬λ‘œ 뢙은 쀄 뒀에 μ‹λ³„μž λ¬Έμžκ°€ μ—†μœΌλ©΄ μ‹€μ œλ‘œ μ’…λ£Œ λ§ˆμ»€λΌλŠ” 것을 μ˜λ―Έν•œλ‹€κ³  λ§ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ END; λŠ” μ’…λ£Œ (λ§ˆμ»€κ°€ END 이면)μ΄μ§€λ§Œ ENDFOO λŠ” 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€.

BTW, 이것은 이전 버전과 ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” ꡬ문 λ³€κ²½μ΄λ―€λ‘œ μš°λ¦¬κ°€ 그것에 λŒ€ν•΄ 무엇을 μ›ν•˜λŠ”μ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ PHPκ°€ 기꺼이 그것을 κΉ¨ 뜨리면 μš°λ¦¬λ„ ν•  수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 특히 문제λ₯Ό μΌμœΌν‚¬ κ°€λŠ₯성이 거의 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ΄μƒμ μœΌλ‘œλŠ” *.php[1-6] λŒ€ν•΄ ν˜„μž¬ ꡬ문을 μ‚¬μš©ν•˜κ³  λ‚˜λ¨Έμ§€μ—λŠ” μƒˆ ꡬ문을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μ§€λ§Œ κ°€μΉ˜κ°€μžˆλŠ” κ²½μš°μ—λŠ” λ„ˆλ¬΄ λ§Žμ€ λ¬Έμ œκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

@jespinal ,이 λ³€κ²½ 사항에 λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ? https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes ?

μ£„μ†‘ν•©λ‹ˆλ‹€. @masatake , μ–΄λ–€ 이유둜 μ§ˆλ¬Έμ— λŒ€ν•œ μ•Œλ¦Όμ„λ°›μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

예, μ €λŠ” κ·Έ 변화에 λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 그것은 μ‹€μ œλ‘œ PHP 7.3μ—μ„œ κ΅¬ν˜„λ˜μ—ˆμŠ΅λ‹ˆλ‹€ (ν˜„μž¬ μ•ˆμ • 버전은 7.4이고 버전 8이 μ€€λΉ„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€). ctags와 PHP의 λ°©λŒ€ν•œ μ‚¬μš©μž κΈ°λ°˜μ„ κ³ λ €ν•  λ•Œ 이것이 μ™œ μ΄μ „μ—λ³΄κ³ λ˜μ§€ μ•Šμ•˜λŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

μƒˆλ‘œμš΄ heredoc / nowdoc ꡬ문과 κ΄€λ ¨ν•˜μ—¬ μœ νš¨ν•œ / μœ νš¨ν•˜μ§€ μ•Šμ€ ꡬ문에 λŒ€ν•΄ μ„€λͺ…ν•˜κΈ° μœ„ν•΄ 이전 μ˜ˆμ œμ—μ„œ νŒŒμƒ 된 μ½”λ“œ 슀 λ‹ˆνŽ«μ˜ λͺ‡ ​​가지 슀크린 샷을 μΆ”κ°€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€ (RFCλŠ” μΆ©λΆ„νžˆ λͺ…ν™•ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μƒκ°ν•œλ‹€).

이 μ˜ˆμ—μ„œ ' TEXT '(두 번째 ν•­λͺ©)은 μ’…λ£Œ λ§ˆμ»€μž…λ‹ˆλ‹€. λ”°λΌμ„œ μ„Έ 번째 ' TEXT; λŠ” μ„Έλ―Έμ½œλ‘  λ˜λŠ” μ‰Όν‘œ 만 μ˜ˆμƒν•˜λ―€λ‘œ ꡬ문 λΆ„μ„κΈ°λ³΄κΈ°μ—μ„œ ꡬ문 적으둜 μœ νš¨ν•˜μ§€ μ•Šμ€ λ¬Έμžμ—΄μž…λ‹ˆλ‹€.

test-001-2020-11-24 22-33-30

이전 사둀와 μœ μ‚¬ν•œ 경우 :
test-003-2020-11-24 22-37-04

μ„Έλ―Έμ½œλ‘ μ΄λ‚˜ μ‰Όν‘œ μ˜€λ‹€λ©΄ PHP νŒŒμ„œλŠ” 기뻀을 κ²ƒμž…λ‹ˆλ‹€. 예

        echo <<<TEXT
            some string 
        TEXT, 'some other string';

νŒŒμ„œμ˜ κ΄€μ μ—μ„œ 이것은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

    echo 'some string', 'some other string';

λ‹€μŒμ€ νŒŒμ„œκ°€ ' TEXT '및 ' TEXTUAL 'κ°€ 두 개의 λ‹€λ₯Έ λ¬Έμžμ—΄μž„μ„ μ•Œκ³  μžˆμœΌλ―€λ‘œ μœ νš¨ν•œ μ˜ˆμž…λ‹ˆλ‹€.

test-002-2020-11-24 22-36-25

λ‹€μŒμ€ 잘λͺ»λœ λ“€μ—¬ μ“°κΈ°λ‘œ μΈν•œ 잘λͺ»λœ 슀 λ‹ˆνŽ«μž…λ‹ˆλ‹€. 특히, RFC 문에 : "λ‹«λŠ” λ§ˆμ»€κ°€ 본문의 μ–΄λ–€ 쀄보닀 더 λ“€μ—¬ μ“°κΈ°λ˜λ©΄ ParseErrorκ°€ λ°œμƒν•©λ‹ˆλ‹€."

test-004-2020-11-24 22-38-11

test-005-2020-11-24 22-39-38

@jespinal κ°μ‚¬ν•©λ‹ˆλ‹€.ν•˜μ§€λ§Œ 더 λ‚˜μ€ κ·œλ²” 적 ν…μŠ€νŠΈκ°€ μžˆλ‹€λ©΄ :) λͺ‡ 가지 κ²½μš°μ—λ§Œ 논리λ₯Ό μΆ”μΈ‘ν•˜λŠ” 것이 항상 κΉŒλ‹€ λ‘­μŠ΅λ‹ˆλ‹€. 반면 κ·œλ²” 적 ν…μŠ€νŠΈκ°€ μžˆλ‹€λ©΄ 그것을 κ΅¬ν˜„ν•  수 있고 잘 μž‘λ™ ν•  κ²ƒμž…λ‹ˆλ‹€. 그리고 μ‹€μ œλ‘œ @masatake 의 링크와 κ·€ν•˜μ˜ μ •λ³΄λ‘œ μΆ©λΆ„ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€ : +1 :

@masatake λ‚˜λŠ” μ΅œκ·Όμ— λ‚΄κ°€ 찾은 μž‘μ€ μ‹œκ°„μ„ κ°μ•ˆν•  λ•Œ 아무것도 μ•½μ†ν•˜μ§€ μ•Šμ§€λ§Œ, 당신이 λ‚˜λ₯Ό 이기지 μ•ŠλŠ” ν•œ 곧 이것을 보렀고 λ…Έλ ₯ν•  κ²ƒμž…λ‹ˆλ‹€ :)

BTW @jespinal λ§Œμ•½ 아무도 λΆˆν‰ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ λ‚˜λŠ” μ •λ§λ‘œ κ·Έ ꡬ문을 거의 μ‚¬μš©ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ΄λΌκ³  μƒκ°ν•˜λ©° μš°λ¦¬λŠ” 7.3 이전 ꡬ문을 μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— λ¬Έμ œκ°€ λ°œμƒν•˜λŠ” μœ μΌν•œ κ²½μš°λŠ” neredoc / nowdoc μ‚¬μš©μ„ μ˜λ―Έν•˜λŠ” 7.3 μ΄μƒμ˜ ꡬ문 μ‚¬μš©μ— μžˆμŠ΅λ‹ˆλ‹€. μ²˜μŒμ— :)

μž μ‹œ λ™μ•ˆ ν™œλ™ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ λ‹Ήμ‹ μ—κ²Œμ„œ μ½”λ©˜νŠΈλ₯Όλ°›μ„ 쀄은 λͺ°λžμŠ΅λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ 이제 μš°λ¦¬λŠ” κ·€ν•˜λ‘œλΆ€ν„° "자체 ν• λ‹Ή"ν‘œμ‹œλ₯Όλ°›μŠ΅λ‹ˆλ‹€. @ b4n , μ œκ³΅ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

@masatake 당신은 λ‚˜μ—κ²Œ λ§Žμ€ 것을 κΈ°λŒ€ν•˜μ§€ μ•ŠλŠ” 것이 ν˜„λͺ…ν–ˆλ‹€. μ΅œκ·Όμ— UCtags / Geany κΈ°μ—¬λ₯Ό 많이 ν•  μ‹œκ°„μ„ 찾지 λͺ»ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€. : disappointed :. μ—¬κΈ°μ„œ λ‹€μ‹œ μ‹œκ°„μ„ ν• λ‹Ήν•˜λŠ” 방법을 μ°ΎμœΌλ €κ³ ν•΄μ„œ μ’€ 더 ν™œλ™μ  이길 바라지 만 아직 약속 ν•  μˆ˜λŠ” μ—†λ‹€.

κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  λ‹Ήλ©΄ν•œ λ¬Έμ œμ— λŒ€ν•œ μˆ˜μ • 사항은 # 2734λ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€. :)

κ°μ‚¬ν•©λ‹ˆλ‹€!

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰