Skip to content

Commit e97a88f

Browse files
committed
fix: fix resolveNamedType cannot resolve type parameter in contextual element
1 parent 5cc1e34 commit e97a88f

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

src/program.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2841,6 +2841,10 @@ export abstract class Element {
28412841
return this.parent.lookup(name, isType);
28422842
}
28432843

2844+
lookupGenericType(name: string): Type | null {
2845+
return this.parent.lookupGenericType(name);
2846+
}
2847+
28442848
/** Adds an element as a member of this one. Reports and returns `false` if a duplicate. */
28452849
add(name: string, element: DeclaredElement, localIdentifierIfImport: IdentifierExpression | null = null): bool {
28462850
var originalDeclaration = element.declaration;
@@ -3124,6 +3128,10 @@ export class File extends Element {
31243128
return this.program.lookup(name); // has no meaningful parent
31253129
}
31263130

3131+
override lookupGenericType(name: string): Type | null {
3132+
return null;
3133+
}
3134+
31273135
/** Ensures that an element is an export of this file. */
31283136
ensureExport(name: string, element: DeclaredElement): void {
31293137
var exports = this.exports;
@@ -3687,6 +3695,14 @@ export class Function extends TypedElement {
36873695
registerConcreteElement(program, this);
36883696
}
36893697

3698+
override lookupGenericType(name: string): Type | null {
3699+
let contextualTypeArguments = this.contextualTypeArguments;
3700+
if (contextualTypeArguments && contextualTypeArguments.has(name)) {
3701+
return assert(contextualTypeArguments.get(name));
3702+
}
3703+
return this.parent.lookupGenericType(name);
3704+
}
3705+
36903706
/** Gets the name of the parameter at the specified index. */
36913707
getParameterName(index: i32): string {
36923708
var parameters = (<FunctionDeclaration>this.declaration).signature.parameters;
@@ -4297,6 +4313,14 @@ export class Class extends TypedElement {
42974313
registerConcreteElement(program, this);
42984314
}
42994315

4316+
override lookupGenericType(name: string): Type | null {
4317+
let contextualTypeArguments = this.contextualTypeArguments;
4318+
if (contextualTypeArguments && contextualTypeArguments.has(name)) {
4319+
return assert(contextualTypeArguments.get(name));
4320+
}
4321+
return this.parent.lookupGenericType(name);
4322+
}
4323+
43004324
/** Sets the base class. */
43014325
setBase(base: Class): void {
43024326
assert(!this.base);

src/resolver.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,13 @@ export class Resolver extends DiagnosticEmitter {
188188
// Look up in contextual types if a simple type
189189
if (isSimpleType) {
190190
let simpleName = nameNode.identifier.text;
191+
let type: Type | null = null;
191192
if (ctxTypes && ctxTypes.has(simpleName)) {
192-
let type = assert(ctxTypes.get(simpleName));
193+
type = assert(ctxTypes.get(simpleName));
194+
} else {
195+
type = ctxElement.lookupGenericType(simpleName);
196+
}
197+
if (type) {
193198
if (typeArgumentNodes && typeArgumentNodes.length > 0) {
194199
if (reportMode == ReportMode.REPORT) {
195200
this.error(
@@ -763,7 +768,7 @@ export class Resolver extends DiagnosticEmitter {
763768
}
764769
let defaultType = typeParameterNode.defaultType;
765770
if (defaultType) {
766-
let resolvedDefaultType = this.resolveType(defaultType, ctxFlow.actualFunction, contextualTypeArguments, reportMode);
771+
let resolvedDefaultType = this.resolveType(defaultType, prototype, contextualTypeArguments, reportMode);
767772
if (!resolvedDefaultType) return null;
768773
resolvedTypeArguments[i] = resolvedDefaultType;
769774
continue;

0 commit comments

Comments
 (0)