microsoft / microsoft/TypeScript
TypeScript language service cannot find subclass references/implementation of mixin methods
まだ誰も着手していません。
- 主要言語
- Go
- スター
- 111k
- フォーク
- 14.4k
- 平均マージ
- 1日 19時間
- マージ済み PR(30日)
- 117
説明
🔎 Search Terms
mixin mixins reference references implementation implementations find go to goto language service server protocol lsp
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about _________
⏯ Playground Link
💻 Code
type ConstructorType = abstract new (...params: any[]) => any
function FooF<T extends ConstructorType>(Base: T) {
abstract class Foo extends Base {
abstract foo(): void;
}
return Foo;
}
class Bar extends FooF(Object) {
foo() {}
}
🙁 Actual behavior
Note: I noticed this in my editor and not using the TS language service API directly, but I'm assuming the problem is at the Language Service layer
In the TS playground, if you try to "Find All / Go to References", "Rename symbol", or "Find All / Go to Implementation" (in VS Code, for example) for Foo.foo, it won't find/update Bar.foo.
🙂 Expected behavior
I would expect TS to recognize that Bar.foo is a reference/implementation of Foo.foo. Note that TS does correctly require Bar to implement foo, so the compiler already has some idea that they are connected.
I know it's not within the scope of this repo but I'll mention it in case it helps with anything, but FWIW while IntelliJ also fails at finding references/implementations (probably because it defers to the TS Language service), IntelliJ also provides a "Go to Super method" function that does correctly jump from Bar.foo to Foo.foo.
Additional information about the issue
After snooping around the source a little, my guess is that either:
- something around how TS represents mixin classes, as kind of un-named class expressions e.g.
((abstract new (...params: any[]) => Foo) & { prototype: FooF<any>.Foo; }) & Tinstead oftypeof Foo & Tin the above example (visible if you hover overFooF), and/or - something around how TS searches for whether a symbol inherits from another symbol so explicitly checks the extends clause (https://github.com/microsoft/TypeScript/blob/2e58032f067fbe0d6efbdc970b54b6d72c349aa8/src/services/findAllReferences.ts#L2283-L2302) could be improved
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
Playground の再現と、src/services/findAllReferences.ts の 2283-2302 行付近にある参照先の継承検索ロジックから始めます。mixin クラスがどのように表現され、Language Service が継承されたシンボルをどのように検索するかを調査してください。Find All/Go to References、Rename symbol、Find All/Go to Implementation が Foo.foo と Bar.foo を関連付ければ完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- developer-experience, tooling
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 38/100