pest-parser / pest.vim

Vim syntax highlighting for pest PEG grammar files.
MIT License
31 stars 7 forks source link

Cannot detect declarations in other files #10

Open Elsie19 opened 1 month ago

Elsie19 commented 1 month ago

I have the following tree:

.
├── Cargo.lock
├── Cargo.toml
└── src
    ├── main.rs
    ├── parse
    │   ├── grammar.rs
    │   └── internals
    │       ├── base.pest
    │       ├── command_substitution.pest
    │       ├── strings.pest
    │       └── variables.pest
    └── parse.rs

In src/parse/grammar.rs I have the following code:

use pest_derive::Parser;

#[derive(Parser)]
#[grammar = "parse/internals/strings.pest"]
#[grammar = "parse/internals/variables.pest"]
#[grammar = "parse/internals/command_substitution.pest"]
#[grammar = "parse/internals/base.pest"]
pub struct ElviParser;

Notice the placement of strings.pest and variables.pest: how variables.pest is defined after strings.pest.

If I edit variables.pest, I get the following error:

// Main rules
normalVariable = @{ variableIdent ~ "=" ~ anyString }   ■ Rule anyString is undefined

variableIdent = { !ASCII_DIGIT ~ (ASCII_ALPHANUMERIC | "_")+ }

Where anyString is defined in strings.pest. It compiles correctly, it's just the LSP not understanding this.

tomtau commented 1 month ago

I think this is due to https://github.com/pest-parser/pest-ide-tools/issues/24 ? @Jamalam360

Jamalam360 commented 1 month ago

Yeah, the language server does not support split grammars. There is a comment on the issue that tomtau mentioned that explains why.

The solution for this would be for Pest files themselves to contain 'import' statements; something which I think is planned for Pest 3?

Elsie19 commented 1 month ago

Would you be able to put together something where if I put:

// import: from/src/grammar.pest

it would import from there or is that out of scope?

Jamalam360 commented 1 month ago

It would need support on Pest's side - the LSP calls the Pest meta grammar and uses it's returned Pairs to get the location of symbols in the document.

It's doable on the LSP side with some refactoring, but the feature doesn't seem to be used all that often and if Pest 3 is around the corner it seems like a waste of time to be honest.