Fix crash when circular reference in variance annotations (#48539)

* Fix crash when circular reference in variance annotations

* chore: clean code
This commit is contained in:
magic-akari 2022-04-04 23:33:47 +08:00 committed by GitHub
parent 2db17fdda2
commit 99620117be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 55 additions and 0 deletions

View File

@ -20640,6 +20640,9 @@ namespace ts {
function createMarkerType(symbol: Symbol, source: TypeParameter, target: Type) {
const mapper = makeUnaryTypeMapper(source, target);
const type = getDeclaredTypeOfSymbol(symbol);
if (isErrorType(type)) {
return type;
}
const result = symbol.flags & SymbolFlags.TypeAlias ?
getTypeAliasInstantiation(symbol, instantiateTypes(getSymbolLinks(symbol).typeParameters!, mapper)) :
createTypeReference(type as GenericType, instantiateTypes((type as GenericType).typeParameters, mapper));

View File

@ -0,0 +1,17 @@
tests/cases/conformance/types/typeParameters/typeParameterLists/varianceAnnotationsWithCircularlyReferencesError.ts(1,6): error TS2456: Type alias 'T1' circularly references itself.
tests/cases/conformance/types/typeParameters/typeParameterLists/varianceAnnotationsWithCircularlyReferencesError.ts(1,11): error TS2300: Duplicate identifier '(Missing)'.
tests/cases/conformance/types/typeParameters/typeParameterLists/varianceAnnotationsWithCircularlyReferencesError.ts(1,12): error TS1359: Identifier expected. 'in' is a reserved word that cannot be used here.
tests/cases/conformance/types/typeParameters/typeParameterLists/varianceAnnotationsWithCircularlyReferencesError.ts(2,6): error TS2456: Type alias 'T2' circularly references itself.
==== tests/cases/conformance/types/typeParameters/typeParameterLists/varianceAnnotationsWithCircularlyReferencesError.ts (4 errors) ====
type T1<in in> = T1 // Error: circularly references
~~
!!! error TS2456: Type alias 'T1' circularly references itself.
!!! error TS2300: Duplicate identifier '(Missing)'.
~~
!!! error TS1359: Identifier expected. 'in' is a reserved word that cannot be used here.
type T2<out out> = T2 // Error: circularly references
~~
!!! error TS2456: Type alias 'T2' circularly references itself.

View File

@ -0,0 +1,11 @@
//// [varianceAnnotationsWithCircularlyReferencesError.ts]
type T1<in in> = T1 // Error: circularly references
type T2<out out> = T2 // Error: circularly references
//// [varianceAnnotationsWithCircularlyReferencesError.js]
"use strict";
//// [varianceAnnotationsWithCircularlyReferencesError.d.ts]
declare type T1<in , > = T1;
declare type T2<out out> = T2;

View File

@ -0,0 +1,12 @@
=== tests/cases/conformance/types/typeParameters/typeParameterLists/varianceAnnotationsWithCircularlyReferencesError.ts ===
type T1<in in> = T1 // Error: circularly references
>T1 : Symbol(T1, Decl(varianceAnnotationsWithCircularlyReferencesError.ts, 0, 0))
> : Symbol((Missing), Decl(varianceAnnotationsWithCircularlyReferencesError.ts, 0, 8), Decl(varianceAnnotationsWithCircularlyReferencesError.ts, 0, 10))
> : Symbol((Missing), Decl(varianceAnnotationsWithCircularlyReferencesError.ts, 0, 8), Decl(varianceAnnotationsWithCircularlyReferencesError.ts, 0, 10))
>T1 : Symbol(T1, Decl(varianceAnnotationsWithCircularlyReferencesError.ts, 0, 0))
type T2<out out> = T2 // Error: circularly references
>T2 : Symbol(T2, Decl(varianceAnnotationsWithCircularlyReferencesError.ts, 0, 19))
>out : Symbol(out, Decl(varianceAnnotationsWithCircularlyReferencesError.ts, 1, 8))
>T2 : Symbol(T2, Decl(varianceAnnotationsWithCircularlyReferencesError.ts, 0, 19))

View File

@ -0,0 +1,7 @@
=== tests/cases/conformance/types/typeParameters/typeParameterLists/varianceAnnotationsWithCircularlyReferencesError.ts ===
type T1<in in> = T1 // Error: circularly references
>T1 : any
type T2<out out> = T2 // Error: circularly references
>T2 : any

View File

@ -0,0 +1,5 @@
// @strict: true
// @declaration: true
type T1<in in> = T1 // Error: circularly references
type T2<out out> = T2 // Error: circularly references