Skip to content

Commit

Permalink
Lazy evaluation of voidElements (#187)
Browse files Browse the repository at this point in the history
  • Loading branch information
johnsoncodehk authored Jun 24, 2024
1 parent ca7588a commit 907177e
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 11 deletions.
21 changes: 12 additions & 9 deletions src/services/htmlCompletion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ export class HTMLCompletion {
};
const completionParticipants = this.completionParticipants;
const dataProviders = this.dataManager.getDataProviders().filter(p => p.isApplicable(document.languageId) && (!settings || settings[p.getId()] !== false));
const voidElements = this.dataManager.getVoidElements(dataProviders);
const doesSupportMarkdown = this.doesSupportMarkdown();

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

function getReplaceRange(replaceStart: number, replaceEnd: number = offset): Range {
if (replaceStart > offset) {
Expand Down Expand Up @@ -169,6 +169,7 @@ export class HTMLCompletion {
if (settings && settings.hideAutoCompleteProposals) {
return result;
}
voidElements ??= this.dataManager.getVoidElements(dataProviders);
if (!this.dataManager.isVoidElement(tag, voidElements)) {
const pos = document.positionAt(tagCloseEnd);
result.items.push({
Expand Down Expand Up @@ -534,16 +535,18 @@ export class HTMLCompletion {
}
const char = document.getText().charAt(offset - 1);
if (char === '>') {
const voidElements = this.dataManager.getVoidElements(document.languageId);
const node = htmlDocument.findNodeBefore(offset);
if (node && node.tag && !this.dataManager.isVoidElement(node.tag, voidElements) && node.start < offset && (!node.endTagStart || node.endTagStart > offset)) {
const scanner = createScanner(document.getText(), node.start);
let token = scanner.scan();
while (token !== TokenType.EOS && scanner.getTokenEnd() <= offset) {
if (token === TokenType.StartTagClose && scanner.getTokenEnd() === offset) {
return `$0</${node.tag}>`;
if (node && node.tag && node.start < offset && (!node.endTagStart || node.endTagStart > offset)) {
const voidElements = this.dataManager.getVoidElements(document.languageId);
if (!this.dataManager.isVoidElement(node.tag, voidElements)) {
const scanner = createScanner(document.getText(), node.start);
let token = scanner.scan();
while (token !== TokenType.EOS && scanner.getTokenEnd() <= offset) {
if (token === TokenType.StartTagClose && scanner.getTokenEnd() === offset) {
return `$0</${node.tag}>`;
}
token = scanner.scan();
}
token = scanner.scan();
}
}
} else if (char === '/') {
Expand Down
8 changes: 6 additions & 2 deletions src/services/htmlFolding.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,13 @@ export class HTMLFolding {
}

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

function addRange(range: FoldingRange) {
ranges.push(range);
Expand All @@ -111,7 +111,11 @@ export class HTMLFolding {
break;
}
case TokenType.StartTagClose:
if (!lastTagName || !this.dataManager.isVoidElement(lastTagName, voidElements)) {
if (!lastTagName) {
break;
}
voidElements ??= this.dataManager.getVoidElements(document.languageId);
if (!this.dataManager.isVoidElement(lastTagName, voidElements)) {
break;
}
// fallthrough
Expand Down

0 comments on commit 907177e

Please sign in to comment.