diff --git a/packages/language-service/src/completions.ts b/packages/language-service/src/completions.ts index 79ea098da0..de3c53cdc3 100644 --- a/packages/language-service/src/completions.ts +++ b/packages/language-service/src/completions.ts @@ -469,11 +469,15 @@ class ExpressionVisitor extends NullTemplateVisitor { if (s.name.startsWith('__') || !s.public || this.completions.has(s.name)) { continue; } + + // The pipe method should not include parentheses. + // e.g. {{ value_expression | slice : start [ : end ] }} + const shouldInsertParentheses = s.callable && s.kind !== ng.CompletionKind.PIPE; this.completions.set(s.name, { name: s.name, kind: s.kind as ng.CompletionKind, sortText: s.name, - insertText: s.callable ? `${s.name}()` : s.name, + insertText: shouldInsertParentheses ? `${s.name}()` : s.name, }); } } diff --git a/packages/language-service/test/completions_spec.ts b/packages/language-service/test/completions_spec.ts index e94977dd9f..4f8e03f5c5 100644 --- a/packages/language-service/test/completions_spec.ts +++ b/packages/language-service/test/completions_spec.ts @@ -208,6 +208,18 @@ describe('completions', () => { })); }); + it('for methods of pipe should not include parentheses', () => { + mockHost.override(TEST_TEMPLATE, `

{{title | lowe~{pipe-method} }}`); + const marker = mockHost.getLocationMarkerFor(TEST_TEMPLATE, 'pipe-method'); + const completions = ngLS.getCompletionsAt(TEST_TEMPLATE, marker.start); + expect(completions).toBeDefined(); + expect(completions !.entries).toContain(jasmine.objectContaining({ + name: 'lowercase', + kind: CompletionKind.PIPE as any, + insertText: 'lowercase', + })); + }); + describe('in external template', () => { it('should be able to get entity completions in external template', () => { const marker = mockHost.getLocationMarkerFor(TEST_TEMPLATE, 'entity-amp');