Ctags: PHP heredoc (<<

Dibuat pada 20 Nov 2020  ·  8Komentar  ·  Sumber: universal-ctags/ctags

RINGKASAN:

Pembuatan tag berhenti ketika sintaks PHP heredoc ( <<< ) ditemukan dalam file. Karena sintaks nowdoc PHP pada dasarnya sama, itu adalah elemen bahasa lain yang merusak penguraian file.

Nama pengurai:

tidak yakin tentang ini. Dengan asumsi PHP

Baris perintah yang Anda gunakan untuk menjalankan ctags:
$ ctags --options=NONE foo.php
Isi file masukan:
<?php

class LivingBeings {

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

    public function doSomethingElse()
    {
    }
}
Keluaran tag yang Anda tidak puas dengan:

Metode doSomethingElse tidak tercantum dalam file. Segera setelah saya mengomentari bagian heredoc , metode ini diindeks secara normal, seperti yang Anda lihat di bagian "keluaran yang diharapkan" di depan.

!_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
Output tag yang Anda harapkan:
!_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
Versi ctag:
$ 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
Bagaimana Anda mendapatkan biner ctags:

Membangunnya secara lokal:

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

Semua 8 komentar

@jespinal , apakah Anda berbicara tentang perubahan ini: 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 itu tidak cukup, karena penanda akhir dulu harus berada di jalurnya sendiri , sedangkan versi baru menghilangkan batasan itu. Saya tidak menemukan penjelasannya dengan sangat jelas:

Implementasi yang saya usulkan menghindari masalah ini dengan memeriksa untuk melihat apakah ada kelanjutan dari penanda yang ditemukan, dan jika demikian, maka apakah itu membentuk pengidentifikasi yang valid.

tetapi saya akan mengatakan bahwa itu berarti bahwa kecuali ada karakter pengenal setelah baris yang diawali dengan penanda pengakhiran, itu memang penanda pengakhiran. Jadi END; adalah penghentian (mengingat penandanya adalah END ), tetapi ENDFOO tidak.

BTW, karena ini adalah perubahan sintaksis yang tidak kompatibel, saya tidak tahu apa yang ingin kami lakukan. Tapi saya kira jika PHP senang untuk memecahkannya, kita juga bisa, terutama karena itu tidak mungkin menimbulkan masalah. Idealnya saya kira kita akan menggunakan sintaks saat ini untuk *.php[1-6] dan yang baru untuk sisanya, tetapi itu mungkin terlalu merepotkan untuk nilainya.

@jespinal , apakah Anda berbicara tentang perubahan ini: https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes ?

Maaf, @masatake , untuk beberapa alasan saya tidak diberitahu tentang pertanyaan Anda.

Ya, saya sedang berbicara tentang perubahan itu. Tapi itu sebenarnya diimplementasikan di PHP 7.3 (versi stabil saat ini adalah 7.4, dan versi 8 sudah dekat). Saya tidak yakin mengapa ini tidak dilaporkan sebelumnya mengingat basis pengguna yang luas dari keduanya, ctags dan PHP.

Saya menambahkan beberapa tangkapan layar cuplikan kode yang berasal dari contoh sebelumnya untuk (semoga) menjelaskan apa yang mereka anggap sintaks valid/tidak valid sehubungan dengan sintaks heredoc/nowdoc baru (RFC tidak cukup jelas, saya berpikir).

Dalam contoh ini, ' TEXT ' (yang kedua) adalah penanda akhir. Jadi, yang ketiga ' TEXT; adalah string yang tidak valid secara sintaksis dalam tampilan parser, seperti yang diharapkan hanya titik koma atau koma:

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

Kasus serupa dengan yang sebelumnya:
test-003-2020-11-24 22-37-04

Apakah itu titik koma atau koma, parser php akan senang. Misalnya

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

Di mata parser, ini sama dengan:

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

Berikut ini adalah contoh yang valid, karena parser mengetahui bahwa ' TEXT ' dan ' TEXTUAL ' adalah dua string yang berbeda:

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

Berikut beberapa cuplikan yang tidak valid karena lekukan yang salah. Khususnya, untuk pernyataan RFC: "Jika penanda penutup menjorok lebih jauh dari garis tubuh mana pun, maka ParseError akan dilemparkan:"

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

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

@jespinal terima kasih, tetapi jika Anda memiliki teks normatif itu lebih baik :) Selalu sulit untuk menebak logika hanya berdasarkan beberapa kasus, sedangkan jika kami memiliki teks normatif, kami hanya dapat mengimplementasikannya dan semoga berhasil. Dan sebenarnya, saya pikir kita sudah cukup dengan tautan @masatake dan info Anda :+1:

@masatake Saya tidak menjanjikan apa-apa mengingat sedikit waktu yang saya temukan akhir-akhir ini, tetapi saya akan mencoba untuk segera melihatnya kecuali -- Anda mengalahkan saya :)

BTW @jespinal jika tidak ada yang mengeluh saya benar-benar berpikir itu karena sangat sedikit penggunaan sintaks tersebut, dan kami mendukung sintaks pra-7.3, jadi satu-satunya kasus di mana orang akan melihat masalah adalah dengan penggunaan sintaks 7.3+, yang menyiratkan menggunakan neredoc/nowdoc di tempat pertama :)

Anda tidak aktif untuk sementara waktu. Jadi saya tidak berharap mendapat komentar dari Anda.
Tapi, sekarang kami mendapatkan tanda "ditugaskan sendiri" dari Anda. @b4n , terima kasih atas

@masatake Anda bijaksana untuk tidak berharap banyak dari saya, karena saya memang tidak menemukan waktu untuk banyak kontribusi UCtags/Geany akhir-akhir ini :disappointed: . Saya mencoba mencari cara untuk mengalokasikan waktu di sini lagi, jadi saya harap saya akan lebih aktif lagi, tetapi saya belum bisa berjanji.

Meskipun demikian, lihat #2734 untuk perbaikan masalah yang dihadapi :)

Terima kasih!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat