This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch feature/vscode-htl in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git
commit 59267375bf1e70b076bed9ff6a74142be7cc5cf6 Author: Robert Munteanu <[email protected]> AuthorDate: Thu Dec 9 13:41:23 2021 +0100 Completions: support completions based on data-sly-list --- vscode-htl/src/htlCompletionItemProvider.ts | 32 ++++++++++++++++++++--------- vscode-htl/src/test/suite/extension.test.ts | 14 +++++++++++++ 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/vscode-htl/src/htlCompletionItemProvider.ts b/vscode-htl/src/htlCompletionItemProvider.ts index d0601ad..b952beb 100644 --- a/vscode-htl/src/htlCompletionItemProvider.ts +++ b/vscode-htl/src/htlCompletionItemProvider.ts @@ -8,6 +8,7 @@ import {CompletionDataAccess, CompletionDefinition, LocalCompletionDefinition} f const slyUseRegexp = /data-sly-use\.([a-zA-Z0-9]+)=/g; const identifierAccess = /([a-zA-Z0-9]+)\./g; +const slyListOrRepeat = /data-sly-(list|repeat)="\${([a-zA-Z0-9\.]+)}"/g; export class HtlCompletionItemProvider implements vscode.CompletionItemProvider { @@ -44,32 +45,44 @@ export class HtlCompletionItemProvider implements vscode.CompletionItemProvider for ( const match of rawAttrs.matchAll(slyUseRegexp) ) { documentCompletions.push(new LocalCompletionDefinition(match[1], "java.lang.Object", "")); } - if ( rawAttrs.indexOf('data-sly-repeat=') >= 0 || rawAttrs.indexOf('data-sly-list') >= 0) { - // TODO - resolve item if possible - documentCompletions.push(new LocalCompletionDefinition("item", "java.lang.Object", "")); + // assumption: we don't have both attributes in a single tag + for ( const match of rawAttrs.matchAll(slyListOrRepeat) ) { + let javaType, ignored; + [javaType, ignored] = this.resolveReference(match[2], this.completionData.getGlobalCompletions()); + documentCompletions.push(new LocalCompletionDefinition("item", javaType ?? "java.lang.Object", "")); documentCompletions.push(new LocalCompletionDefinition("itemList", "$io.sightly.ItemList", "")); + break; } // TODO - support named data-sly-repeat completions, e.g. data-sly-repeat.meh=... }); let completionProperties = this.completionData.getGlobalCompletions().concat(documentCompletions); - - let completionCandidate = ""; + let javaType; // 2. recursively resolve any nested properties + [javaType, completionProperties] = this.resolveReference(completionContext, completionProperties); + + // provide completions based on properties ( top-level bindings or nested ones) + return completionProperties.map ( element => this.toCompletionItem(element) ); + } + + private resolveReference(completionContext: string, globalCompletionDefinitions: CompletionDefinition[]): [string | undefined, CompletionDefinition[] ] { + let completionProperties = globalCompletionDefinitions; + let javaType = undefined; for ( const match of completionContext.matchAll(identifierAccess)) { - completionCandidate = match[1]; + let completionCandidate = match[1]; let matchingDefinition = completionProperties.find( e => e.name === completionCandidate ); if ( matchingDefinition ) { - completionProperties = this.completionData.findPropertyCompletions(matchingDefinition.javaType); + javaType = matchingDefinition.javaType; + completionProperties = this.completionData.findPropertyCompletions(javaType); } else { + javaType = undefined; completionProperties = []; break; } } - // provide completions based on properties ( top-level bindings or nested ones) - return completionProperties.map ( element => this.toCompletionItem(element) ); + return [javaType, completionProperties]; } private toCompletionItem(completionDefinition: CompletionDefinition) { @@ -86,6 +99,5 @@ export class HtlCompletionItemProvider implements vscode.CompletionItemProvider item.documentation = new vscode.MarkdownString(description); return item; - } } \ No newline at end of file diff --git a/vscode-htl/src/test/suite/extension.test.ts b/vscode-htl/src/test/suite/extension.test.ts index 706e0f0..2b5354a 100644 --- a/vscode-htl/src/test/suite/extension.test.ts +++ b/vscode-htl/src/test/suite/extension.test.ts @@ -68,6 +68,20 @@ suite('Extension Test Suite', () => { assert.deepStrictEqual(itemListVariables?.sort(), ["index", "count", "first", "middle", "last", "odd", "even"].sort()); }); + test('completion test with data-sly-list and known item', () => { + let document = ` + <html> + <body data-sly-list="\${resource.parent.children}"> + <div>\${ item. }</div> + </body> + </html> + `; + let completions = completionProvider.provideCompletionItems0('<div>${ item.', document); + // test a subset, otherwise it's too cumbersome + let completionVariables = completions?.map ( c => c.label.toString()).slice(0,5); + assert.deepStrictEqual(completionVariables?.sort(), ["children", "name", "parent", "path", "resourceType"]); + }); + test('completion test for request', () => { let document = ` <html>
