JSDoc functions are now in scope for instantiation
Previously, `isSymbolInScopeOfMappedTypeParameter` did not understand JSDoc, so it would cause generic function declarations in JSDoc not be instantiated.
This commit is contained in:
parent
757af496e1
commit
8ae9c7de21
|
@ -6634,7 +6634,7 @@ namespace ts {
|
|||
// Starting with the parent of the symbol's declaration, check if the mapper maps any of
|
||||
// the type parameters introduced by enclosing declarations. We just pick the first
|
||||
// declaration since multiple declarations will all have the same parent anyway.
|
||||
let node = symbol.declarations[0].parent;
|
||||
let node: Node = symbol.declarations[0];
|
||||
while (node) {
|
||||
switch (node.kind) {
|
||||
case SyntaxKind.FunctionType:
|
||||
|
@ -6654,7 +6654,7 @@ namespace ts {
|
|||
case SyntaxKind.ClassExpression:
|
||||
case SyntaxKind.InterfaceDeclaration:
|
||||
case SyntaxKind.TypeAliasDeclaration:
|
||||
const declaration = <DeclarationWithTypeParameters>node;
|
||||
const declaration = node as DeclarationWithTypeParameters;
|
||||
if (declaration.typeParameters) {
|
||||
for (const d of declaration.typeParameters) {
|
||||
if (contains(mappedTypes, getDeclaredTypeOfTypeParameter(getSymbolOfNode(d)))) {
|
||||
|
@ -6669,6 +6669,14 @@ namespace ts {
|
|||
}
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.JSDocFunctionType:
|
||||
const func = node as JSDocFunctionType;
|
||||
for (const p of func.parameters) {
|
||||
if (contains(mappedTypes, getTypeOfNode(p))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SyntaxKind.ModuleDeclaration:
|
||||
case SyntaxKind.SourceFile:
|
||||
return false;
|
||||
|
|
19
tests/cases/fourslash/jsDocGenerics2.ts
Normal file
19
tests/cases/fourslash/jsDocGenerics2.ts
Normal file
|
@ -0,0 +1,19 @@
|
|||
///<reference path="fourslash.ts" />
|
||||
// @allowNonTsExtensions: true
|
||||
// @Filename: Foo.js
|
||||
|
||||
/////**
|
||||
//// * @param {T[]} arr
|
||||
//// * @param {(function(T):T)} valuator
|
||||
//// * @template T
|
||||
//// */
|
||||
////function SortFilter(arr,valuator)
|
||||
////{
|
||||
//// return arr;
|
||||
////}
|
||||
////var a/*1*/ = SortFilter([0, 1, 2], q/*2*/ => q);
|
||||
////var b/*3*/ = SortFilter([0, 1, 2], undefined);
|
||||
|
||||
verify.quickInfoAt('1', "var a: number[]");
|
||||
verify.quickInfoAt('2', '(parameter) q: number');
|
||||
verify.quickInfoAt('3', "var b: number[]");
|
Loading…
Reference in a new issue