Cannot detect declarations in other files
Elsie19 opened this issue · 4 comments
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.
I think this is due to pest-parser/pest-ide-tools#24 ?
@Jamalam360
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?
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?
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.