Skip to content

Commit 8887500

Browse files
committed
Removed canComplete
1 parent 7396ce6 commit 8887500

File tree

3 files changed

+24
-47
lines changed

3 files changed

+24
-47
lines changed

src/completion.ts

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ export type Validation = {
2727

2828
export type Selectors = {
2929
ids: Map<string, CompletionItem>,
30-
classes: Map<string, CompletionItem>
30+
idRanges: Range[],
31+
classes: Map<string, CompletionItem>,
32+
classRanges: Range[]
3133
};
3234

3335
export class SelectorCompletionItemProvider implements CompletionItemProvider, Disposable {
@@ -38,7 +40,6 @@ export class SelectorCompletionItemProvider implements CompletionItemProvider, D
3840
readonly selectors = new Map<string, Selectors>();
3941
readonly collection = languages.createDiagnosticCollection();
4042
readonly isRemote = /^https?:\/\//i;
41-
readonly canComplete = /(id|class|className)\s*=\s*("|')(?:(?!\2).)*$/si;
4243
readonly findLinkRel = /rel\s*=\s*("|')((?:(?!\1).)+)\1/si;
4344
readonly findLinkHref = /href\s*=\s*("|')((?:(?!\1).)+)\1/si;
4445
readonly findExtended = /(?:{{<|{{>|{%\s*extends|@extends\s*\()\s*("|')?([./A-Za-z_0-9\\\-]+)\1\s*(?:\)|%}|}})/i;
@@ -224,13 +225,15 @@ export class SelectorCompletionItemProvider implements CompletionItemProvider, D
224225

225226
const ids = new Map<string, CompletionItem>();
226227
const classes = new Map<string, CompletionItem>();
228+
const idRanges: Range[] = [];
229+
const classRanges: Range[] = [];
227230

228231
keys.forEach(key => this.cache.get(key)?.forEach((v, k) =>
229232
(v.kind === CompletionItemKind.Value ? ids : classes).set(k, v)));
230233

231234
const validation = this.getValidation(uri);
232235
const diagnostics: Diagnostic[] = [];
233-
const findAttribute = /(id|class|className)\s*=\s*("|')(.+?)\2/gsi;
236+
const findAttribute = /(id|class|className)\s*=\s*("|')(.*?)\2/gsi;
234237

235238
let attribute;
236239

@@ -239,6 +242,10 @@ export class SelectorCompletionItemProvider implements CompletionItemProvider, D
239242
- attribute[3].length
240243
+ attribute[3].indexOf(attribute[2]);
241244

245+
(attribute[1] === "id" ? idRanges : classRanges).push(new Range(
246+
document.positionAt(offset),
247+
document.positionAt(findAttribute.lastIndex - 1)));
248+
242249
const findSelector = /([a-zA-Z0-9_\-]+)(?![^(\[{]*[}\])])/gi;
243250

244251
let value;
@@ -265,7 +272,7 @@ export class SelectorCompletionItemProvider implements CompletionItemProvider, D
265272
}
266273

267274
this.collection.set(uri, diagnostics);
268-
this.selectors.set(uri.toString(), { ids, classes });
275+
this.selectors.set(uri.toString(), { ids, idRanges, classes, classRanges });
269276
}
270277

271278
provideCompletionItems(
@@ -275,13 +282,20 @@ export class SelectorCompletionItemProvider implements CompletionItemProvider, D
275282
context: CompletionContext)
276283
: ProviderResult<CompletionItem[] | CompletionList<CompletionItem>> {
277284

278-
const range = new Range(this.start, position);
279-
const text = document.getText(range);
280-
const canComplete = this.canComplete.exec(text);
281285
const selector = this.selectors.get(document.uri.toString());
282286

283-
return canComplete && selector
284-
? [...(canComplete[1] === "id" ? selector.ids : selector.classes).values()]
285-
: [];
287+
if (selector) {
288+
for (const range of selector.classRanges) {
289+
if (range.contains(position)) {
290+
return [...selector.classes.values()];
291+
}
292+
}
293+
294+
for (const range of selector.idRanges) {
295+
if (range.contains(position)) {
296+
return [...selector.ids.values()];
297+
}
298+
}
299+
}
286300
}
287301
}

src/test/suite/completion.test.ts

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -16,41 +16,6 @@ suite("SelectorCompletionItemProvider Test Suite", () => {
1616
assert.strictEqual(provider.isRemote.test("https://example.com/example.css"), true);
1717
});
1818

19-
test("RegEx: canComplete", () => {
20-
const provider = new SelectorCompletionItemProvider();
21-
22-
assert.strictEqual(provider.canComplete.test(""), false);
23-
assert.strictEqual(provider.canComplete.test("class=\""), true);
24-
assert.strictEqual(provider.canComplete.test("class=\"\""), false);
25-
assert.strictEqual(provider.canComplete.test("class = \""), true);
26-
assert.strictEqual(provider.canComplete.test("class = \"\""), false);
27-
28-
assert.strictEqual(provider.canComplete.test(`
29-
class = "someClass
30-
`), true);
31-
32-
assert.strictEqual(provider.canComplete.test(`
33-
class
34-
= "someClass
35-
`), true);
36-
assert.strictEqual(provider.canComplete.test(`
37-
class =
38-
"someClass
39-
40-
`), true);
41-
assert.strictEqual(provider.canComplete.test(`
42-
class =
43-
"someClass
44-
45-
"`), false);
46-
assert.strictEqual(provider.canComplete.test(`
47-
class = "some"
48-
class =
49-
"someClass
50-
51-
"`), false);
52-
});
53-
5419
test("RegEx: findLinkRel", () => {
5520
const provider = new SelectorCompletionItemProvider();
5621

src/test/suite/extension.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ suite("Extension Test Suite", () => {
1313
content: "<style>.some{}</style>\n<a class='some'></a>"
1414
});
1515

16-
await sleep(1000);
17-
1816
const list = await commands.executeCommand<CompletionList>(
1917
"vscode.executeCompletionItemProvider",
2018
document.uri,

0 commit comments

Comments
 (0)