diff --git a/src/LanguageServer.spec.ts b/src/LanguageServer.spec.ts index 48535c302..3283c51fb 100644 --- a/src/LanguageServer.spec.ts +++ b/src/LanguageServer.spec.ts @@ -1554,7 +1554,7 @@ describe('LanguageServer', () => { }); expect(locations.length).to.equal(1); - const location: Location = locations[0]; + const location: Location = locations[0] as Location; expect(location.uri).to.equal(functionDocument.uri); expect(location.range.start.line).to.equal(5); expect(location.range.start.character).to.equal(16); @@ -1569,7 +1569,7 @@ describe('LanguageServer', () => { }); expect(locations.length).to.equal(1); - const location: Location = locations[0]; + const location: Location = locations[0] as Location; expect(location.uri).to.equal(functionDocument.uri); expect(location.range.start.line).to.equal(5); expect(location.range.start.character).to.equal(16); @@ -1594,7 +1594,7 @@ describe('LanguageServer', () => { position: util.createPosition(3, 36) }); expect(locations.length).to.equal(1); - const location: Location = locations[0]; + const location: Location = locations[0] as Location; expect(location.uri).to.equal(referenceDocument.uri); expect(location.range.start.line).to.equal(2); expect(location.range.start.character).to.equal(20); @@ -1629,7 +1629,7 @@ describe('LanguageServer', () => { position: util.createPosition(3, 30) }); expect(locations.length).to.equal(1); - const location: Location = locations[0]; + const location: Location = locations[0] as Location; expect(location.uri).to.equal(functionDocument.uri); expect(location.range.start.line).to.equal(2); expect(location.range.start.character).to.equal(20); diff --git a/src/LanguageServer.ts b/src/LanguageServer.ts index 2a77f1d48..9be8ca54a 100644 --- a/src/LanguageServer.ts +++ b/src/LanguageServer.ts @@ -578,7 +578,7 @@ export class LanguageServer { const srcPath = util.uriToPath(params.textDocument.uri); - const result = this.projectManager.getDefinition({ srcPath: srcPath, position: params.position }); + const result = await this.projectManager.getDefinition({ srcPath: srcPath, position: params.position }); return result; } diff --git a/src/Program.ts b/src/Program.ts index 33158af17..d6c97cf55 100644 --- a/src/Program.ts +++ b/src/Program.ts @@ -1,7 +1,7 @@ import * as assert from 'assert'; import * as fsExtra from 'fs-extra'; import * as path from 'path'; -import type { CodeAction, CompletionItem, Position, Range, SignatureInformation, Location, DocumentSymbol, CancellationToken } from 'vscode-languageserver'; +import type { CodeAction, CompletionItem, Position, Range, SignatureInformation, Location, LocationLink, DocumentSymbol, CancellationToken } from 'vscode-languageserver'; import { CancellationTokenSource, CompletionItemKind } from 'vscode-languageserver'; import type { BsConfig, FinalizedBsConfig } from './BsConfig'; import { Scope } from './Scope'; @@ -1001,7 +1001,7 @@ export class Program { * Given a position in a file, if the position is sitting on some type of identifier, * go to the definition of that identifier (where this thing was first defined) */ - public getDefinition(srcPath: string, position: Position): Location[] { + public getDefinition(srcPath: string, position: Position): Array { let file = this.getFile(srcPath); if (!file) { return []; @@ -1017,12 +1017,10 @@ export class Program { this.plugins.emit('beforeProvideDefinition', event); this.plugins.emit('provideDefinition', event); this.plugins.emit('afterProvideDefinition', event); + return event.definitions; } - /** - * Get hover information for a file and position - */ public getHover(srcPath: string, position: Position): Hover[] { let file = this.getFile(srcPath); let result: Hover[]; diff --git a/src/Scope.ts b/src/Scope.ts index be25f0033..22182b159 100644 --- a/src/Scope.ts +++ b/src/Scope.ts @@ -1,4 +1,4 @@ -import type { CompletionItem, Position, Range, Location } from 'vscode-languageserver'; +import type { CompletionItem, Position, Range, Location, LocationLink } from 'vscode-languageserver'; import * as path from 'path'; import { CompletionItemKind } from 'vscode-languageserver'; import chalk from 'chalk'; @@ -1261,7 +1261,7 @@ export class Scope { * Get the definition (where was this thing first defined) of the symbol under the position * @deprecated use `DefinitionProvider.process()` */ - public getDefinition(file: BscFile, position: Position): Location[] { + public getDefinition(file: BscFile, position: Position): Array { // Overridden in XMLScope. Brs files use implementation in BrsFile return []; } diff --git a/src/XmlScope.spec.ts b/src/XmlScope.spec.ts index 885cbf79b..4097cc411 100644 --- a/src/XmlScope.spec.ts +++ b/src/XmlScope.spec.ts @@ -73,7 +73,7 @@ describe('XmlScope', () => { `); const definition = program.getDefinition(childXmlFile.srcPath, Position.create(1, 48)); expect(definition).to.be.lengthOf(1); - expect(definition[0].uri).to.equal(util.pathToUri(parentXmlFile.srcPath)); + expect((definition[0] as any).uri).to.equal(util.pathToUri(parentXmlFile.srcPath)); }); }); diff --git a/src/XmlScope.ts b/src/XmlScope.ts index 81180ba40..435b16311 100644 --- a/src/XmlScope.ts +++ b/src/XmlScope.ts @@ -1,4 +1,4 @@ -import type { Location, Position } from 'vscode-languageserver'; +import type { Location, LocationLink, Position } from 'vscode-languageserver'; import { Scope } from './Scope'; import { DiagnosticMessages } from './DiagnosticMessages'; import type { XmlFile } from './files/XmlFile'; @@ -169,7 +169,7 @@ export class XmlScope extends Scope { * Get the definition (where was this thing first defined) of the symbol under the position * @deprecated use `DefinitionProvider.process()` */ - public getDefinition(file: BscFile, position: Position): Location[] { + public getDefinition(file: BscFile, position: Position): Array { return new DefinitionProvider({ program: this.program, file: file, diff --git a/src/bscPlugin/definition/DefinitionProvider.spec.ts b/src/bscPlugin/definition/DefinitionProvider.spec.ts index ae43ef351..302abfadc 100644 --- a/src/bscPlugin/definition/DefinitionProvider.spec.ts +++ b/src/bscPlugin/definition/DefinitionProvider.spec.ts @@ -6,6 +6,8 @@ import { createSandbox } from 'sinon'; import { DefinitionProvider } from './DefinitionProvider'; import { URI } from 'vscode-uri'; import { tempDir } from '../../testHelpers.spec'; +import * as fsExtra from 'fs-extra'; +import * as path from 'path'; const sinon = createSandbox(); describe('DefinitionProvider', () => { @@ -194,4 +196,396 @@ describe('DefinitionProvider', () => { range: util.createRange(1, 0, 1, 0) }]); }); + + it('handles script tag uri go-to-definition', () => { + const brsFile = program.setFile('components/MainScene.brs', ` + sub main() + end sub + `); + const xmlFile = program.setFile('components/MainScene.xml', ` + +