Skip to content

Commit 6456af6

Browse files
committed
Fixes
1 parent cf0f713 commit 6456af6

File tree

3 files changed

+42
-24
lines changed

3 files changed

+42
-24
lines changed

src/completion.ts

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
CompletionItemProvider,
1010
CompletionList,
1111
Diagnostic,
12+
DiagnosticCollection,
1213
DiagnosticSeverity,
1314
Disposable,
1415
languages,
@@ -27,22 +28,15 @@ export class ClassCompletionItemProvider implements CompletionItemProvider, Disp
2728
readonly cache = new Map<string, Map<string, CompletionItem>>();
2829
readonly extends = new Map<string, Set<string>>();
2930
readonly watchers = new Map<string, Disposable>();
30-
readonly collection = languages.createDiagnosticCollection();
31+
readonly collection: DiagnosticCollection;
3132
readonly isRemote = /^https?:\/\//i;
3233
readonly canComplete = /(id|class|className)\s*=\s*("|')(?:(?!\2).)*$/si;
3334
readonly findLinkRel = /rel\s*=\s*("|')((?:(?!\1).)+)\1/si;
3435
readonly findLinkHref = /href\s*=\s*("|')((?:(?!\1).)+)\1/si;
3536
readonly findExtended = /(?:{{<|{%\s*extends|@extends\s*\()\s*("|')?([./A-Za-z_0-9\\\-]+)\1\s*(?:\)|%}|}})/i;
3637

37-
constructor(enabledLanguages: string[]) {
38-
let debounce: NodeJS.Timeout;
39-
40-
workspace.onDidChangeTextDocument(e => {
41-
if (enabledLanguages.includes(e.document.languageId)) {
42-
clearTimeout(debounce);
43-
debounce = setTimeout(() => this.validate(e.document), 1000);
44-
}
45-
});
38+
constructor(collection: DiagnosticCollection) {
39+
this.collection = collection;
4640
}
4741

4842
dispose() {

src/extension.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,37 @@ import { ExtensionContext, languages, workspace, commands } from "vscode";
44
export function activate(context: ExtensionContext) {
55
const config = workspace.getConfiguration("css");
66
const enabledLanguages = config.get<string[]>("enabledLanguages", ["html"]);
7-
const provider = new ClassCompletionItemProvider(enabledLanguages);
7+
const collection = languages.createDiagnosticCollection();
8+
const provider = new ClassCompletionItemProvider(collection);
9+
10+
workspace.textDocuments.forEach(document => {
11+
if (enabledLanguages.includes(document.languageId)) {
12+
provider.validate(document);
13+
}
14+
});
15+
16+
let timeout: NodeJS.Timeout;
817

918
context.subscriptions.push(
19+
workspace.onDidOpenTextDocument(document => {
20+
if (enabledLanguages.includes(document.languageId)) {
21+
provider.validate(document);
22+
}
23+
}),
24+
25+
workspace.onDidChangeTextDocument(e => {
26+
if (enabledLanguages.includes(e.document.languageId)) {
27+
clearTimeout(timeout);
28+
timeout = setTimeout(() => provider.validate(e.document), 500);
29+
}
30+
}),
31+
1032
languages.registerCompletionItemProvider(
1133
enabledLanguages,
1234
provider
1335
),
36+
37+
collection,
1438
provider
1539
);
1640
}

src/test/suite/completion.test.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
import * as assert from "assert";
22
import { ClassCompletionItemProvider } from "../../completion";
33
import { MockCancellationToken, MockCompletionContext, MockDocument } from "./mocks";
4-
import { CompletionItem, Position, Uri } from "vscode";
4+
import { CompletionItem, Position, Uri, languages } from "vscode";
55

66
suite("ClassCompletionItemProvider Test Suite", () => {
77

8-
const langs = ["html"];
8+
const collection = languages.createDiagnosticCollection();
99
const position = new Position(0, 0);
1010
const token = new MockCancellationToken(false);
1111
const context = new MockCompletionContext();
1212

1313
test("RegEx: isRemote", () => {
14-
const provider = new ClassCompletionItemProvider(langs);
14+
const provider = new ClassCompletionItemProvider(collection);
1515

1616
assert.strictEqual(provider.isRemote.test("http://example.com/example.css"), true);
1717
assert.strictEqual(provider.isRemote.test("https://example.com/example.css"), true);
1818
});
1919

2020
test("RegEx: canComplete", () => {
21-
const provider = new ClassCompletionItemProvider(langs);
21+
const provider = new ClassCompletionItemProvider(collection);
2222

2323
assert.strictEqual(provider.canComplete.test(""), false);
2424
assert.strictEqual(provider.canComplete.test("class=\""), true);
@@ -53,47 +53,47 @@ suite("ClassCompletionItemProvider Test Suite", () => {
5353
});
5454

5555
test("RegEx: findLinkRel", () => {
56-
const provider = new ClassCompletionItemProvider(langs);
56+
const provider = new ClassCompletionItemProvider(collection);
5757

5858
assert.strictEqual(provider.findLinkRel.exec(`
5959
<link rel="stylesheet" href="http://example.com/example.css">
6060
"`)?.[2], "stylesheet");
6161
});
6262

6363
test("RegEx: findLinkHref", () => {
64-
const provider = new ClassCompletionItemProvider(langs);
64+
const provider = new ClassCompletionItemProvider(collection);
6565

6666
assert.strictEqual(provider.findLinkHref.exec(`
6767
<link rel="stylesheet" href="http://example.com/example.css">
6868
"`)?.[2], "http://example.com/example.css");
6969
});
7070

7171
test("RegEx: findExtended (Twig)", () => {
72-
const provider = new ClassCompletionItemProvider(langs);
72+
const provider = new ClassCompletionItemProvider(collection);
7373

7474
assert.strictEqual(provider.findExtended.exec(`
7575
{% extends "base" %}
7676
`)?.[2], "base");
7777
});
7878

7979
test("RegEx: findExtended (Mustache)", () => {
80-
const provider = new ClassCompletionItemProvider(langs);
80+
const provider = new ClassCompletionItemProvider(collection);
8181

8282
assert.strictEqual(provider.findExtended.exec(`
8383
{{< base }}
8484
`)?.[2], "base");
8585
});
8686

8787
test("RegEx: findExtended (Blade)", () => {
88-
const provider = new ClassCompletionItemProvider(langs);
88+
const provider = new ClassCompletionItemProvider(collection);
8989

9090
assert.strictEqual(provider.findExtended.exec(`
9191
@extends('base')
9292
`)?.[2], "base");
9393
});
9494

9595
test("Rejects outside class attribute", (done) => {
96-
const provider = new ClassCompletionItemProvider(langs);
96+
const provider = new ClassCompletionItemProvider(collection);
9797
const document = new MockDocument("<a class=\"\"></a>");
9898

9999
const result = provider.provideCompletionItems(
@@ -106,7 +106,7 @@ suite("ClassCompletionItemProvider Test Suite", () => {
106106
});
107107

108108
test("Completes from style tag", async () => {
109-
const provider = new ClassCompletionItemProvider(langs);
109+
const provider = new ClassCompletionItemProvider(collection);
110110
const document = new MockDocument("<style>.test{}</style><a class=\"");
111111

112112
const items = await (provider.provideCompletionItems(
@@ -119,7 +119,7 @@ suite("ClassCompletionItemProvider Test Suite", () => {
119119
});
120120

121121
test("Completes from link tag", async () => {
122-
const provider = new ClassCompletionItemProvider(langs);
122+
const provider = new ClassCompletionItemProvider(collection);
123123
const document = new MockDocument(`
124124
<link
125125
href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
@@ -143,7 +143,7 @@ suite("ClassCompletionItemProvider Test Suite", () => {
143143
"https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
144144
];
145145
}
146-
}(langs);
146+
}(collection);
147147

148148
const document = new MockDocument("<a class=\"");
149149

0 commit comments

Comments
 (0)