Skip to content

Commit

Permalink
fix: race condition in workspace scanner
Browse files Browse the repository at this point in the history
This time without the infinite loop for workspaces with circular
references.
  • Loading branch information
wkillerud committed Aug 24, 2024
1 parent f8c70cb commit eaaa96d
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 9 deletions.
15 changes: 13 additions & 2 deletions packages/language-server/src/workspace-scanner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,17 +56,19 @@ export default class WorkspaceScanner {
try {
let document: TextDocument | null | undefined =
this.#ls.getCachedTextDocument(uri);

if (!document) {
const content = await this.#fs.readFile(uri);

document = getSCSSRegionsDocument(
TextDocument.create(uri.toString(), "scss", 1, content),
);
if (!document) return;
this.#ls.parseStylesheet(document);
}

this.#ls.parseStylesheet(document);
const links = await this.#ls.findDocumentLinks(document);

for (const link of links) {
if (
!link.target ||
Expand All @@ -77,8 +79,17 @@ export default class WorkspaceScanner {
continue;
}

let uri = URI.parse(link.target);
let visited: TextDocument | null | undefined =
this.#ls.getCachedTextDocument(uri);

if (visited) {
// avoid infinite loop if circular references
continue;
}

try {
await this.parse(URI.parse(link.target), depth + 1);
await this.parse(uri, depth + 1);
} catch {
// do nothing
}
Expand Down
4 changes: 0 additions & 4 deletions packages/language-services/src/language-model-cache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,10 +128,6 @@ export class LanguageModelCache {
return Object.values(this.#languageModels).map((cached) => cached.document);
}

getCachedTextDocument(uri: string): TextDocument | undefined {
return this.#languageModels[uri]?.document;
}

has(uri: string) {
return typeof this.#languageModels[uri] !== "undefined";
}
Expand Down
2 changes: 1 addition & 1 deletion packages/language-services/src/language-services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ class LanguageServiceImpl implements LanguageService {
}

getCachedTextDocument(uri: URI): TextDocument | undefined {
return this.#cache.getCachedTextDocument(uri.toString());
return this.#cache.getDocument(uri.toString());
}

getColorPresentations(document: TextDocument, color: Color, range: Range) {
Expand Down
4 changes: 2 additions & 2 deletions vscode-extension/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@
"build": "webpack --mode development",
"start:web": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=.",
"lint": "eslint \"**/*.ts\" --cache",
"test:e2e": "node ./test/e2e/runTest.js",
"test:e2e": "node ./test/e2e/runTest.js && node ./test/new-e2e/runTest.js",
"pretest:web": "webpack --config ./webpack.test-web.config.js ",
"test:web": "node ./test/web/runTest.js"
},
Expand All @@ -141,4 +141,4 @@
"publisherId": "02638283-c13a-4acf-9f26-24bdcfdfce24",
"isPreReleaseVersion": false
}
}
}

0 comments on commit eaaa96d

Please sign in to comment.