diff --git a/packages/compiler-cli/src/diagnostics/expression_diagnostics.ts b/packages/compiler-cli/src/diagnostics/expression_diagnostics.ts index 2253d2c077814..135be11753fbf 100644 --- a/packages/compiler-cli/src/diagnostics/expression_diagnostics.ts +++ b/packages/compiler-cli/src/diagnostics/expression_diagnostics.ts @@ -335,4 +335,4 @@ function offsetSpan(span: Span, amount: number): Span { function spanOf(sourceSpan: ParseSourceSpan): Span { return {start: sourceSpan.start.offset, end: sourceSpan.end.offset}; -} \ No newline at end of file +} diff --git a/packages/compiler-cli/src/diagnostics/typescript_symbols.ts b/packages/compiler-cli/src/diagnostics/typescript_symbols.ts index 6f2d0728662f3..99c63d9155336 100644 --- a/packages/compiler-cli/src/diagnostics/typescript_symbols.ts +++ b/packages/compiler-cli/src/diagnostics/typescript_symbols.ts @@ -557,7 +557,7 @@ class PipeSymbol implements Symbol { selectSignature(types: Symbol[]): Signature|undefined { let signature = selectSignature(this.tsType, this.context, types) !; - if (types.length == 1) { + if (types.length > 0) { const parameterType = types[0]; if (parameterType instanceof TypeWrapper) { let resultType: ts.Type|undefined = undefined; @@ -575,7 +575,7 @@ class PipeSymbol implements Symbol { } break; case 'slice': - resultType = getTypeParameterOf(parameterType.tsType, 'Array'); + resultType = parameterType.tsType; break; } if (resultType) { diff --git a/packages/language-service/test/diagnostics_spec.ts b/packages/language-service/test/diagnostics_spec.ts index 8672897401366..daaa615435ec9 100644 --- a/packages/language-service/test/diagnostics_spec.ts +++ b/packages/language-service/test/diagnostics_spec.ts @@ -76,6 +76,26 @@ describe('diagnostics', () => { } }); + it('should not produce diagnostics for slice pipe with arguments', () => { + mockHost.override(TEST_TEMPLATE, ` +
+ {{h.name}} +
`); + const diags = ngLS.getDiagnostics(TEST_TEMPLATE); + expect(diags).toEqual([]); + }); + + it('should produce diagnostics for slice pipe with args when member is invalid', () => { + mockHost.override(TEST_TEMPLATE, ` +
+ {{h.age}} +
`); + const diags = ngLS.getDiagnostics(TEST_TEMPLATE); + expect(diags.length).toBe(1); + expect(diags[0].messageText) + .toBe(`Identifier 'age' is not defined. 'Hero' does not contain such a member`); + }); + describe('in expression-cases.ts', () => { it('should report access to an unknown field', () => { const diags = ngLS.getDiagnostics(EXPRESSION_CASES).map(d => d.messageText); diff --git a/packages/language-service/test/project/app/parsing-cases.ts b/packages/language-service/test/project/app/parsing-cases.ts index a67b216bf04ac..8418fea484384 100644 --- a/packages/language-service/test/project/app/parsing-cases.ts +++ b/packages/language-service/test/project/app/parsing-cases.ts @@ -188,6 +188,7 @@ export class TestComponent { export class TemplateReference { title = 'Some title'; hero: Hero = {id: 1, name: 'Windstorm'}; + heroes: Hero[] = [this.hero]; anyValue: any; myClick(event: any) {} }