Open OldStarchy opened 8 months ago
Another use case relevant to the original title of this issue "Expose type information to syntax highlighter" being able to mark functions that mutate / return this
different to those that are "const" and return a new value, this would help to catch errors like
const normalized = vec.normalize();
console.log(normalized === vec); // true (woops, needed .clone())
π Search Terms
"expose type syntax highlight", "semantic syntax highlighting for promise", "highlight variables based on type"
β Viability Checklist
β Suggestion
Expose (some) type information to the syntax highlighter for semantic styling so we can highlight variables / function calls of particular types.
π Motivating Example
Hungarian notation has long since marked as something to be avoided, yet a common practice I see is naming async functions with an
Async
suffix, or with anawait
prefix.This indicates that whether or not something returns a promise is important enough that we're marking async functions with these prefixes/suffixes.
Hungarian notation went away because IDE's improved and we could start to rely on it to give us type information (on hover) and via type checking.
While researching this I stumbled upon the semantic highlighting config in VSCode and decided to take a leaf out of rusts book which underlines
mut
values and tried to apply an underline to any variableT
whereT extends Thenable<any>
.However the best I could get was to mark functions tagged as async as this is the only information available to the syntax highlighter (as seen by running the "Developer: Inspect Editor Tokens and Scopes" command)
But this falls over in a few places
It also doesn't do anything for thenable valued variables
In my head, the ideal situation is that a textmate modifier is added to any variable whose value (or method whose return type) exclusively extends
Promise
(orThenable
). That wayprom
would be underlined.I understand there will be some complexities and many edge cases for figuring this out; its not necessarily true that
Promise
refers to a promiseor
also
There may be ways around these problems (maybe something like
T extends Promise<any> ? Promise<any> extends T ? true : false : false
)π» Use Cases