microsoft / microsoft/TypeScript

TypeScript language service cannot find subclass references/implementation of mixin methods

Open
#58,307 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Experience Enhancement Help Wanted Suggestion
Dominant language
Go
Stars
111k
Forks
14.3k
Avg merge
1d 19h
Merged PRs (30d)
117

Description

🔎 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

https://www.typescriptlang.org/play?#code/C4TwDgpgBAwg9gOwM7AE4FcDGw6oCrjQC8UAhgEYqqnZQIQDuUAFAHTtinUC2SAXGQQgA2gF0AlFCIA+QSABQAM3QJsAS0RQAYnDhaAPHigQAHsAgIAJkliIqWHPkLTmAIVJIIAvJIDe8qECySjQaYChMABsPGx04YzMLayh3Tyh-IMzgqjCoRV1mcQEANzg1SwBuAKCAX2rA1AhgdFQEbV0quvkomJSuBPMrWN0tZgB5cgArCGw-eryCvzqaoA

💻 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:

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the Playground reproduction and the referenced inheritance-search logic in src/services/findAllReferences.ts, around lines 2283-2302. Investigate how mixin classes are represented and how the language service searches inherited symbols. Done means Find All/Go to References, Rename symbol, and Find All/Go to Implementation connect Foo.foo with Bar.foo.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
developer-experience, tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.