Skip to content

Commit 88cc930

Browse files
authored
fix(catalog): resolve definition for unopened workspace files (#97)
* fix(catalog): resolve definition for unopened workspace files * update
1 parent 225bde7 commit 88cc930

9 files changed

Lines changed: 51 additions & 25 deletions

File tree

packages/language-server/src/workspace.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,15 @@ const getPackageManagerRequestType = new RequestType<
1717
GetPackageManagerRequest.ErrorType
1818
>(GET_PACKAGE_MANAGER_METHOD)
1919

20-
function createLanguageServerAdapter(folderUri: URI, connection: Connection): WorkspaceAdapter {
20+
function createLanguageServerAdapter(folderUri: URI, connection: Connection, server: LanguageServer): WorkspaceAdapter {
2121
return {
2222
async readFile(path: string): Promise<string> {
23-
return await readFile(folderUri.with({ path }).fsPath, 'utf-8')
23+
const uri = folderUri.with({ path })
24+
const doc = server.documents.get(uri)
25+
if (doc)
26+
return doc.getText()
27+
28+
return await readFile(uri.fsPath, 'utf-8')
2429
},
2530

2631
async fileExists(path: string): Promise<boolean> {
@@ -102,7 +107,7 @@ export class WorkspaceState implements IWorkspaceState {
102107

103108
return await WorkspaceContext.create(
104109
folderUri.path,
105-
createLanguageServerAdapter(folderUri, this.#connection),
110+
createLanguageServerAdapter(folderUri, this.#connection, this.#server),
106111
)
107112
},
108113
{

packages/language-service/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"npmx-language-core": "workspace:*",
2727
"npmx-shared": "workspace:*",
2828
"semver": "catalog:inline",
29+
"vscode-languageserver-textdocument": "catalog:inline",
2930
"vscode-uri": "catalog:lsp"
3031
}
3132
}

packages/language-service/src/plugins/catalog.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { DependencyInfo } from 'npmx-language-core/workspace'
33
import type { IWorkspaceState } from '../types'
44
import { isPackageManifest, normalizeCatalogName } from 'npmx-language-core/utils'
55
import { URI } from 'vscode-uri'
6-
import { getResolvedDependencyAtOffset } from '../utils/range'
6+
import { getDocumentByUri, getResolvedDependencyAtOffset } from '../utils/document'
77

88
export function create(workspaceState: IWorkspaceState): LanguageServicePlugin {
99
function getDependencyFileUri(documentUri: string): URI | undefined {
@@ -103,12 +103,10 @@ export function create(workspaceState: IWorkspaceState): LanguageServicePlugin {
103103
return
104104

105105
const workspaceFileUri = dependencyFileUri.with({ path: workspaceContext.workspaceFilePath })
106-
const sourceScript = context.language.scripts.get(workspaceFileUri)
107-
if (!sourceScript)
106+
const workspaceDocument = await getDocumentByUri(context, workspaceFileUri)
107+
if (!workspaceDocument)
108108
return
109109

110-
const workspaceDocument = context.documents.get(sourceScript.id, sourceScript.languageId, sourceScript.snapshot)
111-
112110
const [targetStart, targetEnd] = targetDependency.specRange
113111
const originStart = document.positionAt(dependency.specRange[0])
114112
const originEnd = document.positionAt(dependency.specRange[1])

packages/language-service/src/plugins/hover.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { jsrPackageUrl, npmxDocsUrl, npmxPackageUrl } from 'npmx-language-core/l
55
import { getImportSpecifierAtOffset, isDependencyFile } from 'npmx-language-core/utils'
66
import { URI } from 'vscode-uri'
77
import { getConfig } from '../config'
8-
import { getResolvedDependencyAtOffset } from '../utils/range'
8+
import { getResolvedDependencyAtOffset } from '../utils/document'
99

1010
export function create(workspaceState: IWorkspaceState): LanguageServicePlugin {
1111
const SPACER = '&nbsp;'

packages/language-service/src/plugins/version-completion.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { IWorkspaceState } from '../types'
33
import { isDependencyFile } from 'npmx-language-core/utils'
44
import { URI } from 'vscode-uri'
55
import { getConfig } from '../config'
6-
import { getResolvedDependencyAtOffset } from '../utils/range'
6+
import { getResolvedDependencyAtOffset } from '../utils/document'
77
import { formatUpgradeVersion } from '../utils/version'
88

99
const PRERELEASE_PATTERN = /-.+/
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import type { LanguageServiceContext } from '@volar/language-service'
2+
import type { OffsetRange } from 'npmx-language-core/types'
3+
import type { DependencyInfo } from 'npmx-language-core/workspace'
4+
import type { URI } from 'vscode-uri'
5+
import { TextDocument } from 'vscode-languageserver-textdocument'
6+
7+
export async function getDocumentByUri(context: LanguageServiceContext, uri: URI) {
8+
const sourceScript = context.language.scripts.get(uri, true)
9+
if (sourceScript)
10+
return context.documents.get(sourceScript.id, sourceScript.languageId, sourceScript.snapshot)
11+
12+
const text = await context.env.fs!.readFile(uri)
13+
if (text == null)
14+
return
15+
16+
return TextDocument.create(uri.toString(), 'json', 0, text)
17+
}
18+
19+
function isOffsetInRange(offset: number, [start, end]: OffsetRange): boolean {
20+
return offset >= start && offset <= end
21+
}
22+
23+
export function getResolvedDependencyAtOffset(
24+
dependencies: DependencyInfo[],
25+
offset: number,
26+
): DependencyInfo | undefined {
27+
return dependencies.find((dep) =>
28+
isOffsetInRange(offset, dep.nameRange) || isOffsetInRange(offset, dep.specRange),
29+
)
30+
}

packages/language-service/src/utils/range.ts

Lines changed: 0 additions & 15 deletions
This file was deleted.

pnpm-lock.yaml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pnpm-workspace.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ catalogs:
2626
reactive-vscode: ^1.0.0-beta.2
2727
semver: ^7.7.4
2828
vscode-find-up: ^0.1.1
29+
vscode-languageserver-textdocument: ^1.0.12
2930
yaml: ^2.8.3
3031
lsp:
3132
'@volar/language-server': ^2.4.28

0 commit comments

Comments
 (0)