diff --git a/packages/language-service/src/completions.ts b/packages/language-service/src/completions.ts index 64abe85f5b..6c248bb727 100644 --- a/packages/language-service/src/completions.ts +++ b/packages/language-service/src/completions.ts @@ -15,7 +15,7 @@ import {getExpressionCompletions} from './expressions'; import {attributeNames, elementNames, eventNames, propertyNames} from './html_info'; import {InlineTemplate} from './template'; import * as ng from './types'; -import {diagnosticInfoFromTemplateInfo, findTemplateAstAt, getPathToNodeAtPosition, getSelectors, hasTemplateReference, inSpan, spanOf} from './utils'; +import {diagnosticInfoFromTemplateInfo, findTemplateAstAt, getPathToNodeAtPosition, getSelectors, inSpan, isStructuralDirective, spanOf} from './utils'; const HIDDEN_HTML_ELEMENTS: ReadonlySet = new Set(['html', 'script', 'noscript', 'base', 'body', 'title', 'head', 'link']); @@ -629,11 +629,11 @@ function angularAttributes(info: AstResult, elementName: string): AngularAttribu continue; } const summary = selectorMap.get(selector) !; - const isTemplateRef = hasTemplateReference(summary.type); + const hasTemplateRef = isStructuralDirective(summary.type); // attributes are listed in (attribute, value) pairs for (let i = 0; i < selector.attrs.length; i += 2) { const attr = selector.attrs[i]; - if (isTemplateRef) { + if (hasTemplateRef) { templateRefs.add(attr); } else { others.add(attr); diff --git a/packages/language-service/src/utils.ts b/packages/language-service/src/utils.ts index 4b8c062ee1..33ac9be37a 100644 --- a/packages/language-service/src/utils.ts +++ b/packages/language-service/src/utils.ts @@ -56,9 +56,11 @@ export function isNarrower(spanA: Span, spanB: Span): boolean { return spanA.start >= spanB.start && spanA.end <= spanB.end; } -export function hasTemplateReference(type: CompileTypeMetadata): boolean { +export function isStructuralDirective(type: CompileTypeMetadata): boolean { for (const diDep of type.diDeps) { - if (diDep.token && identifierName(diDep.token.identifier) === Identifiers.TemplateRef.name) { + const diDepName = identifierName(diDep.token?.identifier); + if (diDepName === Identifiers.TemplateRef.name || + diDepName === Identifiers.ViewContainerRef.name) { return true; } } diff --git a/packages/language-service/test/completions_spec.ts b/packages/language-service/test/completions_spec.ts index 2d6967570c..33cab0f1c0 100644 --- a/packages/language-service/test/completions_spec.ts +++ b/packages/language-service/test/completions_spec.ts @@ -129,6 +129,7 @@ describe('completions', () => { 'ngSwitchCase', 'ngSwitchDefault', 'ngPluralCase', + 'ngTemplateOutlet', ]); });