LuaLS / LuaLS/lua-language-server

The `set` pattern for `single range char` is not working in glob

Offen
#2,754 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
Lua
Sterne
4.4k
Forks
442
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

How are you using the lua-language-server?

Visual Studio Code Extension (sumneko.lua)

Which OS are you using?

Windows

What is the issue affecting?

Diagnostics/Syntax Checking

Expected Behaviour

I am testing the glob like pattern used in Lua.doc.<scope>Name, and the set pattern seems not working for single character.

  • .luarc.jsonc
{
    "doc.privateName": [
        "_[aeiouA-Z]"   // underscore followed by any upper letter, or lower letters a|e|i|o|u
    ]
}
  • test.lua
---@class A
local A = {}
A._A = 1
A._Z = 1
A._a = 1
A._e = 1
A._z = 1
A._AA = 1
A._aa = 1

---@type A
local t = {}
print(t._A)     -- warning
print(t._Z)     -- warning
print(t._a)     -- warning
print(t._e)     -- warning
print(t._z)     -- ok
print(t._AA)    -- ok
print(t._aa)    -- ok
Actual Behaviour
---@type A
local t = {}
print(t._A)     -- warning
print(t._Z)     -- warning
print(t._a)     -- ok (false negative)
print(t._e)     -- ok (false negative)
print(t._z)     -- ok
print(t._AA)    -- ok
print(t._aa)    -- ok
  • the single range word aeiou is not working as expected
Reproduction steps

Use the provided snippet

Additional Notes

I know that the glob pattern syntax in defined using LPeg: https://github.com/LuaLS/lua-language-server/blob/ddc96bd1ec0be95a985ab82531763578bf7eb793/script/glob/glob.lua#L19-L46
I am not familiar with LPeg, but by adding a print(#range, range[1], range[2]) inside mt:range() here, those single range word seems don't even get parsed. 😕 https://github.com/LuaLS/lua-language-server/blob/ddc96bd1ec0be95a985ab82531763578bf7eb793/script/glob/matcher.lua#L99-L100

With a bit of testing, the RangeUnit definition seems should be changed from:

    ['RangeUnit']   = m.Ct(m.C(m.V'RangeWord') * m.P'-' * m.C(m.V'RangeWord'))
                    + m.V'RangeWord',

to =>

    ['RangeUnit']   = m.Ct(m.C(m.V'RangeWord') * m.P'-' * m.C(m.V'RangeWord'))
                    + m.Ct(m.C(m.V'RangeWord')),

Then the set logic for single range character starts to work 🎉
But I don't know why it works this way 🙈


Can anyone comment on my above suggested change?
If this is correct, I am going to open a PR. 🙂

Log File

No response

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginnen Sie mit script/glob/glob.lua und script/glob/matcher.lua, insbesondere mit der RangeUnit-Grammatik und mt:range(). Reproduzieren Sie das Verhalten mit den bereitgestellten Snippets .luarc.jsonc und test.lua und überprüfen Sie anschließend, dass Bereiche mit einem einzelnen Zeichen den erwarteten Großbuchstaben- und Vokalfällen entsprechen, ohne das Verhalten bei mehreren Zeichen zu ändern.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
lua
Bereich
devtools
Issue-Typ
Bug
Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Aktivitätsstatus
Veraltet
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.