Skip to content

Commit abf962f

Browse files
egammacvharris
authored andcommitted
Fix for issue zignd#85 Extension hangs / freezes VS Code in big folders
1 parent 0918647 commit abf962f

File tree

6 files changed

+42
-6
lines changed

6 files changed

+42
-6
lines changed

src/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ function cache(): Promise<void> {
3333
let failedLogsCount: number = 0;
3434

3535
console.log('Parsing documents and looking for CSS class definitions...');
36-
return async.each(uris, async (uri, callback) => {
36+
return async.eachLimit(uris, 100, async (uri, callback) => {
3737
try {
3838
Array.prototype.push.apply(definitions, await ParseEngineGateway.callParser(uri));
3939
callback();

src/parse-engine-gateway.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,36 @@
11
import * as vscode from 'vscode';
2+
import * as fs from 'fs';
3+
24
import CssClassDefinition from './common/css-class-definition';
35
import ParseEngine from './parse-engines/common/parse-engine';
6+
import SimpleTextDocument from './parse-engines/common/simple-textdocument';
47
import ParseEngineRegistry from './parse-engines/parse-engine-registry';
58

9+
async function readFile(file: string): Promise<string> {
10+
return new Promise<string>((resolve, reject) => {
11+
fs.readFile(file, (err, data) => {
12+
if (err) {
13+
reject(err);
14+
}
15+
resolve(data.toString());
16+
});
17+
});
18+
}
19+
20+
async function createSimpleTextDocument(uri:vscode.Uri): Promise<SimpleTextDocument> {
21+
let text = await readFile(uri.fsPath);
22+
let simpleDocument:SimpleTextDocument = {
23+
languageId: uri.fsPath.split('.').pop(),
24+
getText():string {
25+
return text;
26+
}
27+
}
28+
return simpleDocument;
29+
}
30+
631
class ParseEngineGateway {
732
public static async callParser(uri: vscode.Uri): Promise<CssClassDefinition[]> {
8-
let textDocument = await vscode.workspace.openTextDocument(uri);
33+
let textDocument = await createSimpleTextDocument(uri);
934
let parseEngine: ParseEngine = ParseEngineRegistry.getParseEngine(textDocument.languageId);
1035
let cssClassDefinitions: CssClassDefinition[] = await parseEngine.parse(textDocument);
1136
return cssClassDefinitions;
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import * as vscode from 'vscode';
21
import CssClassDefinition from './../../common/css-class-definition';
2+
import SimpleTextDocument from './simple-textdocument';
33

44
interface ParseEngine {
55
languageId: string;
66
extension: string;
7-
parse(textDocument: vscode.TextDocument): Promise<CssClassDefinition[]>;
7+
parse(textDocument: SimpleTextDocument): Promise<CssClassDefinition[]>;
88
}
99

1010
export default ParseEngine;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/**
2+
* A minimum standin for vscode.TextDocument that is passed to a `ParseEngine`.
3+
*/
4+
interface SimpleTextDocument {
5+
languageId:string;
6+
getText():string;
7+
}
8+
9+
export default SimpleTextDocument;

src/parse-engines/types/css-parse-engine.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ import * as css from 'css';
22
import * as vscode from 'vscode';
33
import CssClassDefinition from '../../common/css-class-definition';
44
import ParseEngine from '../common/parse-engine';
5+
import SimpleTextDocument from '../common/simple-textdocument';
56
import CssClassExtractor from '../common/css-class-extractor';
67

78
class CssParseEngine implements ParseEngine {
89
public languageId: string = 'css';
910
public extension: string = 'css';
1011

11-
public async parse(textDocument: vscode.TextDocument): Promise<CssClassDefinition[]> {
12+
public async parse(textDocument: SimpleTextDocument): Promise<CssClassDefinition[]> {
1213
let code: string = textDocument.getText();
1314
let codeAst: css.Stylesheet = css.parse(code);
1415

src/parse-engines/types/html-parse-engine.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ import * as vscode from 'vscode';
66
import CssClassDefinition from '../../common/css-class-definition';
77
import CssClassExtractor from '../common/css-class-extractor';
88
import ParseEngine from '../common/parse-engine';
9+
import SimpleTextDocument from '../common/simple-textdocument';
910

1011
class HtmlParseEngine implements ParseEngine {
1112
public languageId: string = 'html';
1213
public extension: string = 'html';
1314

14-
public parse(textDocument: vscode.TextDocument): Promise<CssClassDefinition[]> {
15+
public parse(textDocument: SimpleTextDocument): Promise<CssClassDefinition[]> {
1516
return new Promise((resolve, reject) => {
1617
const definitions: CssClassDefinition[] = [];
1718
const urls: string[] = [];

0 commit comments

Comments
 (0)