Skip to content

Commit 907177e

Browse files
Lazy evaluation of voidElements (#187)
1 parent ca7588a commit 907177e

2 files changed

Lines changed: 18 additions & 11 deletions

File tree

src/services/htmlCompletion.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ export class HTMLCompletion {
6464
};
6565
const completionParticipants = this.completionParticipants;
6666
const dataProviders = this.dataManager.getDataProviders().filter(p => p.isApplicable(document.languageId) && (!settings || settings[p.getId()] !== false));
67-
const voidElements = this.dataManager.getVoidElements(dataProviders);
6867
const doesSupportMarkdown = this.doesSupportMarkdown();
6968

7069
const text = document.getText();
@@ -78,6 +77,7 @@ export class HTMLCompletion {
7877
const scanner = createScanner(text, node.start);
7978
let currentTag: string = '';
8079
let currentAttributeName: string;
80+
let voidElements: string[] | undefined;
8181

8282
function getReplaceRange(replaceStart: number, replaceEnd: number = offset): Range {
8383
if (replaceStart > offset) {
@@ -169,6 +169,7 @@ export class HTMLCompletion {
169169
if (settings && settings.hideAutoCompleteProposals) {
170170
return result;
171171
}
172+
voidElements ??= this.dataManager.getVoidElements(dataProviders);
172173
if (!this.dataManager.isVoidElement(tag, voidElements)) {
173174
const pos = document.positionAt(tagCloseEnd);
174175
result.items.push({
@@ -534,16 +535,18 @@ export class HTMLCompletion {
534535
}
535536
const char = document.getText().charAt(offset - 1);
536537
if (char === '>') {
537-
const voidElements = this.dataManager.getVoidElements(document.languageId);
538538
const node = htmlDocument.findNodeBefore(offset);
539-
if (node && node.tag && !this.dataManager.isVoidElement(node.tag, voidElements) && node.start < offset && (!node.endTagStart || node.endTagStart > offset)) {
540-
const scanner = createScanner(document.getText(), node.start);
541-
let token = scanner.scan();
542-
while (token !== TokenType.EOS && scanner.getTokenEnd() <= offset) {
543-
if (token === TokenType.StartTagClose && scanner.getTokenEnd() === offset) {
544-
return `$0</${node.tag}>`;
539+
if (node && node.tag && node.start < offset && (!node.endTagStart || node.endTagStart > offset)) {
540+
const voidElements = this.dataManager.getVoidElements(document.languageId);
541+
if (!this.dataManager.isVoidElement(node.tag, voidElements)) {
542+
const scanner = createScanner(document.getText(), node.start);
543+
let token = scanner.scan();
544+
while (token !== TokenType.EOS && scanner.getTokenEnd() <= offset) {
545+
if (token === TokenType.StartTagClose && scanner.getTokenEnd() === offset) {
546+
return `$0</${node.tag}>`;
547+
}
548+
token = scanner.scan();
545549
}
546-
token = scanner.scan();
547550
}
548551
}
549552
} else if (char === '/') {

src/services/htmlFolding.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,13 @@ export class HTMLFolding {
8484
}
8585

8686
public getFoldingRanges(document: TextDocument, context: { rangeLimit?: number } | undefined): FoldingRange[] {
87-
const voidElements = this.dataManager.getVoidElements(document.languageId);
8887
const scanner = createScanner(document.getText());
8988
let token = scanner.scan();
9089
const ranges: FoldingRange[] = [];
9190
const stack: { startLine: number, tagName: string }[] = [];
9291
let lastTagName = null;
9392
let prevStart = -1;
93+
let voidElements: string[] | undefined;
9494

9595
function addRange(range: FoldingRange) {
9696
ranges.push(range);
@@ -111,7 +111,11 @@ export class HTMLFolding {
111111
break;
112112
}
113113
case TokenType.StartTagClose:
114-
if (!lastTagName || !this.dataManager.isVoidElement(lastTagName, voidElements)) {
114+
if (!lastTagName) {
115+
break;
116+
}
117+
voidElements ??= this.dataManager.getVoidElements(document.languageId);
118+
if (!this.dataManager.isVoidElement(lastTagName, voidElements)) {
115119
break;
116120
}
117121
// fallthrough

0 commit comments

Comments
 (0)