fix(48031): show circularity error for self referential get accessor annotations (#48050)

This commit is contained in:
Oleksandr T 2022-03-26 00:36:22 +02:00 committed by GitHub
parent e7426251b0
commit f4d76e5b93
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 92 additions and 5 deletions

View File

@ -9628,13 +9628,17 @@ namespace ts {
}
let type = resolveTypeOfAccessors(symbol, writing);
if (!popTypeResolution()) {
type = anyType;
if (noImplicitAny) {
const getter = getDeclarationOfKind<AccessorDeclaration>(symbol, SyntaxKind.GetAccessor);
error(getter, Diagnostics._0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions, symbolToString(symbol));
const getter = getDeclarationOfKind<AccessorDeclaration>(symbol, SyntaxKind.GetAccessor);
if (getter) {
if (getEffectiveTypeAnnotationNode(getter)) {
error(getter.name, Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol));
}
else if (noImplicitAny) {
error(getter, Diagnostics._0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions, symbolToString(symbol));
}
}
type = anyType;
}
return type;
}

View File

@ -0,0 +1,10 @@
tests/cases/compiler/circularGetAccessor.ts(2,9): error TS2502: 'foo' is referenced directly or indirectly in its own type annotation.
==== tests/cases/compiler/circularGetAccessor.ts (1 errors) ====
declare class C {
get foo(): typeof this.foo;
~~~
!!! error TS2502: 'foo' is referenced directly or indirectly in its own type annotation.
}

View File

@ -0,0 +1,7 @@
//// [circularGetAccessor.ts]
declare class C {
get foo(): typeof this.foo;
}
//// [circularGetAccessor.js]

View File

@ -0,0 +1,11 @@
=== tests/cases/compiler/circularGetAccessor.ts ===
declare class C {
>C : Symbol(C, Decl(circularGetAccessor.ts, 0, 0))
get foo(): typeof this.foo;
>foo : Symbol(C.foo, Decl(circularGetAccessor.ts, 0, 17))
>this.foo : Symbol(C.foo, Decl(circularGetAccessor.ts, 0, 17))
>this : Symbol(C, Decl(circularGetAccessor.ts, 0, 0))
>foo : Symbol(C.foo, Decl(circularGetAccessor.ts, 0, 17))
}

View File

@ -0,0 +1,11 @@
=== tests/cases/compiler/circularGetAccessor.ts ===
declare class C {
>C : C
get foo(): typeof this.foo;
>foo : any
>this.foo : any
>this : this
>foo : any
}

View File

@ -0,0 +1,10 @@
tests/cases/compiler/circularGetAccessor.ts(2,9): error TS2502: 'foo' is referenced directly or indirectly in its own type annotation.
==== tests/cases/compiler/circularGetAccessor.ts (1 errors) ====
declare class C {
get foo(): typeof this.foo;
~~~
!!! error TS2502: 'foo' is referenced directly or indirectly in its own type annotation.
}

View File

@ -0,0 +1,7 @@
//// [circularGetAccessor.ts]
declare class C {
get foo(): typeof this.foo;
}
//// [circularGetAccessor.js]

View File

@ -0,0 +1,11 @@
=== tests/cases/compiler/circularGetAccessor.ts ===
declare class C {
>C : Symbol(C, Decl(circularGetAccessor.ts, 0, 0))
get foo(): typeof this.foo;
>foo : Symbol(C.foo, Decl(circularGetAccessor.ts, 0, 17))
>this.foo : Symbol(C.foo, Decl(circularGetAccessor.ts, 0, 17))
>this : Symbol(C, Decl(circularGetAccessor.ts, 0, 0))
>foo : Symbol(C.foo, Decl(circularGetAccessor.ts, 0, 17))
}

View File

@ -0,0 +1,11 @@
=== tests/cases/compiler/circularGetAccessor.ts ===
declare class C {
>C : C
get foo(): typeof this.foo;
>foo : any
>this.foo : any
>this : this
>foo : any
}

View File

@ -0,0 +1,5 @@
// @noImplicitAny: true, false
declare class C {
get foo(): typeof this.foo;
}