GraphQLSP
GraphQLSP copied to clipboard
refactor(graphqlsp): Add `getDeclarationOfIdentifier` helper
This mirrors the getDefinitionAtPosition
method in TypeScript's language service — specifically the GoToDefinition
component — to create a getDeclarationOfIdentifier
helper.
Since we're only looking up definitions of identifiers, we can actually cut out a lot of special cases and end up with a relatively lean implementation of looking up declarations for identifiers. Specifically, if we were to switch over to an implementation like this, it would cut out a lot of extra wrappers, namely positional values that require is to look up file positions. It also saves us some look up work of cases that are impossible, since we're always jumping to declarations (fewer AST cases to account for)
Additionally, the returned AST node is a lot more limited in the locations it can be in, since it's guaranteed to only ever be a declaration. To further help with this, a few modifications have been added to prevent us from jumping to type declarations, ambient declarations, and import/export/module specifiers (Although that's an artificial limitation)
The helpers also include:
- types to clarify which nodes can be reached
- a utility to return the actual values of declarations
- a resolver that gets the value of a declaration and keeps resolving if it's an identifier again