Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
fix(language-service): Improve signature selection for pipes with args (
#33456)

Pipes with arguments like `slice:0` or `slice:0:1` should not produce
diagnostic errors.

PR closes angular/vscode-ng-language-service#345

PR Close #33456
  • Loading branch information
kyliau authored and AndrewKushnir committed Oct 29, 2019
1 parent 5ed6abe commit 1de7579
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 3 deletions.
Expand Up @@ -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};
}
}
4 changes: 2 additions & 2 deletions packages/compiler-cli/src/diagnostics/typescript_symbols.ts
Expand Up @@ -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;
Expand All @@ -575,7 +575,7 @@ class PipeSymbol implements Symbol {
}
break;
case 'slice':
resultType = getTypeParameterOf(parameterType.tsType, 'Array');
resultType = parameterType.tsType;
break;
}
if (resultType) {
Expand Down
20 changes: 20 additions & 0 deletions packages/language-service/test/diagnostics_spec.ts
Expand Up @@ -76,6 +76,26 @@ describe('diagnostics', () => {
}
});

it('should not produce diagnostics for slice pipe with arguments', () => {
mockHost.override(TEST_TEMPLATE, `
<div *ngFor="let h of heroes | slice:0:1">
{{h.name}}
</div>`);
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, `
<div *ngFor="let h of heroes | slice:0:1">
{{h.age}}
</div>`);
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);
Expand Down
Expand Up @@ -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) {}
}
Expand Down

0 comments on commit 1de7579

Please sign in to comment.