Skip to content

Commit 1b585dd

Browse files
committed
Type params introduced by @template are in scope
The test to make sure that type parameters are in scope for instantiation previously ignored type parameters created by `@template`. Now it correctly says that they are in scope.
1 parent 13b7d17 commit 1b585dd

File tree

2 files changed

+12
-12
lines changed

2 files changed

+12
-12
lines changed

src/compiler/checker.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6178,24 +6178,24 @@ namespace ts {
61786178
return undefined;
61796179
}
61806180

6181-
function getTypeParametersFromJSDocTemplate(declaration: SignatureDeclaration): TypeParameter[] {
6181+
function getTypeParametersFromJSDocTemplate(declaration: SignatureDeclaration): TypeParameterDeclaration[] {
61826182
if (declaration.flags & NodeFlags.JavaScriptFile) {
61836183
const templateTag = getJSDocTemplateTag(declaration);
6184-
if (templateTag) {
6185-
return getTypeParametersFromDeclaration(templateTag.typeParameters);
6186-
}
6184+
return templateTag && templateTag.typeParameters;
61876185
}
6188-
61896186
return undefined;
61906187
}
61916188

61926189
// Return list of type parameters with duplicates removed (duplicate identifier errors are generated in the actual
61936190
// type checking functions).
61946191
function getTypeParametersFromDeclaration(typeParameterDeclarations: TypeParameterDeclaration[]): TypeParameter[] {
6195-
const result: TypeParameter[] = [];
6192+
let result: TypeParameter[];
61966193
forEach(typeParameterDeclarations, node => {
61976194
const tp = getDeclaredTypeOfTypeParameter(node.symbol);
61986195
if (!contains(result, tp)) {
6196+
if (!result) {
6197+
result = [];
6198+
}
61996199
result.push(tp);
62006200
}
62016201
});
@@ -6392,8 +6392,7 @@ namespace ts {
63926392
getDeclaredTypeOfClassOrInterface(getMergedSymbol((<ClassDeclaration>declaration.parent).symbol))
63936393
: undefined;
63946394
const typeParameters = classType ? classType.localTypeParameters :
6395-
declaration.typeParameters ? getTypeParametersFromDeclaration(declaration.typeParameters) :
6396-
getTypeParametersFromJSDocTemplate(declaration);
6395+
getTypeParametersFromDeclaration(declaration.typeParameters || getTypeParametersFromJSDocTemplate(declaration));
63976396
const returnType = getSignatureReturnTypeFromDeclaration(declaration, isJSConstructSignature, classType);
63986397
const typePredicate = declaration.type && declaration.type.kind === SyntaxKind.TypePredicate ?
63996398
createTypePredicateFromTypePredicateNode(declaration.type as TypePredicateNode) :
@@ -8167,9 +8166,10 @@ namespace ts {
81678166
case SyntaxKind.ClassExpression:
81688167
case SyntaxKind.InterfaceDeclaration:
81698168
case SyntaxKind.TypeAliasDeclaration:
8170-
const declaration = node as DeclarationWithTypeParameters;
8171-
if (declaration.typeParameters) {
8172-
for (const d of declaration.typeParameters) {
8169+
const typeParameters = (node as DeclarationWithTypeParameters).typeParameters ||
8170+
getTypeParametersFromJSDocTemplate(node as SignatureDeclaration);
8171+
if (typeParameters) {
8172+
for (const d of typeParameters) {
81738173
if (contains(mappedTypes, getDeclaredTypeOfTypeParameter(getSymbolOfNode(d)))) {
81748174
return true;
81758175
}

src/compiler/utilities.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1448,7 +1448,7 @@ namespace ts {
14481448
return node && firstOrUndefined(getJSDocTags(node, kind));
14491449
}
14501450

1451-
export function getJSDocs(node: Node): (JSDoc | JSDocTag)[] {
1451+
export function getJSDocs(node: Node): (JSDoc | JSDocTag)[] {
14521452
if (isJSDocTypedefTag(node)) {
14531453
return [node.parent];
14541454
}

0 commit comments

Comments
 (0)