PowerShell / EditorSyntax

PowerShell syntax highlighting for editors (VS Code, Atom, SublimeText, TextMate, etc.) and GitHub!
MIT License
132 stars 45 forks source link

Rewrite Variable Logic From Scratch #137

Open omniomi opened 6 years ago

omniomi commented 6 years ago

There are multiple issues with variables as they stand now in the grammar some of which have been reported and some of which haven't:

There are also questions about the correct scope of properties and methods (mentioned #131) and questions about to what extent the grammar should be concerned with user expectation/"most themes" vs either correctness (subjective) or consistency (with which languages?) (#130 and #129).

Background

The following cases need to be covered with as little repetition / complexity as possible:

The following gotchas need to be taken in to account:

Planned Format/Rules

??? tbd

Re: Scope selection -> See #138

msftrncs commented 6 years ago

Is there a means in the grammar system to be able to specify an optional repository object as needing to immediately follow another object? (similar to "include" but working after the "end" match? I think such a means would simplify trying to catch everywhere that a property/method can be used. Obviously the match (or begin) regex would need to start with '\G' (or it would have to be assumed).

omniomi commented 6 years ago

@msftrncs sadly no. tmLanguage is incredibly limiting. You effectively have to use non-capturing lookheads and lookbehinds or wrangle nested includes. There's a slightly more powerful format based on the tmLanguage system called .sublime-syntax that has better context control but VS Code doesn't support it.

msftrncs commented 6 years ago

I mentioned elsewhere that I had improved matching for ${} variables. I think this regex segment would work for the inner part of the variable name: (note it forces the previous section possessive)

+([^`{}]|`[`{}]?)+

instead of:

([^}]*[^}`])

or combine a couple patterns in to one for: (not including optional property)

(?i:(\$)(\{)(?:(global|local|private|script|using|workflow):|((?:\p{L}|\d|_)+:)|:)?+([^`{}]|`[`{}]?)+(\}))

PowerShell appears to accept any and all backticks, translating those that are valid to their corresponding character including linefeed and tabs, in addition to the allowing the { and }, throwing the unmatched ones away. I think it would even be possible to scope the escapes. The only quirky case I am not sure about is that ${`} is an empty name and not accepted. Also, for some reason the original matching was accepting ${env:} which is not valid, so I added the possessive qualifier to the drive portion, which also fixes $env:, then also adding |: so that a blank drive is allowed, but a $: or ${:} is not,

None of this handles the :: static member

This was all tested with VS Code against the 'TheBigTestFile'.

stoinov commented 6 years ago

Just to note that at the moment splatting is incorrectly highlighted when inside quotes: "Some text with @splatting" This should be just a normal quoted text instead of variable looking one.