microsoft / microsoft/TypeScript
Add `async`ness to semantic highlighting
まだ誰も着手していません。
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.4k
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 117
説明
🔍 Search Terms
"expose type syntax highlight", "semantic syntax highlighting for promise", "highlight variables based on type"
✅ Viability Checklist
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, new syntax sugar for JS, etc.)
- This isn't a request to add a new utility type: https://github.com/microsoft/TypeScript/wiki/No-New-Utility-Types
- This feature would agree with the rest of our Design Goals: https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals
⭐ 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 an await prefix.
fs.readFile();
await fs.readFileAsync();
await awaitMyFunction();
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 variable T where T 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)
"editor.semanticTokenColorCustomizations": {
"[Default Dark Modern]": {
"rules": {
"*.async": {
"underline": true,
},
},
}
},
But this falls over in a few places
interface Foo {
doThing(): Promise<string>;
}
class Bar extends Foo {
async doThing() { // <- underlines correctly here
return 'hi';
}
}
const bar = new Bar();
bar.doThing(); // <- and here
const barAsFoo: Foo = bar;
barAsFoo.doThing(); // <- no underline here.
It also doesn't do anything for thenable valued variables
const prom = bar.doThing(); // <- prom is not underlined
console.log('doing something else");
await prom;
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 (or Thenable). That way prom 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 promise
type Promise<TAction extends string = string> = `I promise I will ${TAction}`;
function getActionFromPromise(prom: Promise) {
const match = /^I promise I will (.*)$/.exec(prom);
return match[1];
}
console.log(getActionFromPromise('I promise I will not write esoteric code'));
or
function getUserData(): Promise<User> | null {
if (!db.isConnected()) return null;
return db.getUser(ctx.currentUserId);
}
also
function doNothing<T>(val: T): T {
return val;
}
const foo = doNothing(Promise.resolve());
There may be ways around these problems (maybe something like T extends Promise<any> ? Promise<any> extends T ? true : false : false)
💻 Use Cases
- What do you want to use this for? As mentioned in "motivating example"
- What shortcomings exist with current approaches? ' '
- What workarounds are you using in the meantime? ' '
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
TypeScript のセマンティック ハイライトの動作と、issue で説明されている VS Code のセマンティック ハイライト設定から始め、Developer: Inspect Editor Tokens and Scopes を使用して既存の async トークンを比較します。値が promise または thenable である変数とメソッドについて、列挙されている型およびユニオンのエッジケースを含め、サポートされるセマンティクスを特定します。合意された設計と、それに対応するセマンティック ハイライトの動作が決まれば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- tooling
- issue の種類
- 機能追加
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- 説明が足りない
- 初心者へのやさしさ
- 25/100