Skip to content

Commit fb23e6d

Browse files
Merge pull request microsoft#12442 from RyanCavanaugh/portAugments
Port augments to 2.1
2 parents 761895d + daa9d59 commit fb23e6d

File tree

5 files changed

+59
-1
lines changed

5 files changed

+59
-1
lines changed

src/compiler/checker.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3797,6 +3797,16 @@ namespace ts {
37973797
}
37983798
baseType = getReturnTypeOfSignature(constructors[0]);
37993799
}
3800+
3801+
// In a JS file, you can use the @augments jsdoc tag to specify a base type with type parameters
3802+
const valueDecl = type.symbol.valueDeclaration;
3803+
if (valueDecl && isInJavaScriptFile(valueDecl)) {
3804+
const augTag = getJSDocAugmentsTag(type.symbol.valueDeclaration);
3805+
if (augTag) {
3806+
baseType = getTypeFromTypeNode(augTag.typeExpression.type);
3807+
}
3808+
}
3809+
38003810
if (baseType === unknownType) {
38013811
return;
38023812
}
@@ -3805,7 +3815,7 @@ namespace ts {
38053815
return;
38063816
}
38073817
if (type === baseType || hasBaseType(<InterfaceType>baseType, type)) {
3808-
error(type.symbol.valueDeclaration, Diagnostics.Type_0_recursively_references_itself_as_a_base_type,
3818+
error(valueDecl, Diagnostics.Type_0_recursively_references_itself_as_a_base_type,
38093819
typeToString(type, /*enclosingDeclaration*/ undefined, TypeFormatFlags.WriteArrayAsGenericType));
38103820
return;
38113821
}

src/compiler/parser.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,8 @@ namespace ts {
418418
return visitNode(cbNode, (<JSDocReturnTag>node).typeExpression);
419419
case SyntaxKind.JSDocTypeTag:
420420
return visitNode(cbNode, (<JSDocTypeTag>node).typeExpression);
421+
case SyntaxKind.JSDocAugmentsTag:
422+
return visitNode(cbNode, (<JSDocAugmentsTag>node).typeExpression);
421423
case SyntaxKind.JSDocTemplateTag:
422424
return visitNodes(cbNodes, (<JSDocTemplateTag>node).typeParameters);
423425
case SyntaxKind.JSDocTypedefTag:
@@ -6426,6 +6428,9 @@ namespace ts {
64266428
let tag: JSDocTag;
64276429
if (tagName) {
64286430
switch (tagName.text) {
6431+
case "augments":
6432+
tag = parseAugmentsTag(atToken, tagName);
6433+
break;
64296434
case "param":
64306435
tag = parseParamTag(atToken, tagName);
64316436
break;
@@ -6642,6 +6647,16 @@ namespace ts {
66426647
return finishNode(result);
66436648
}
66446649

6650+
function parseAugmentsTag(atToken: AtToken, tagName: Identifier): JSDocAugmentsTag {
6651+
const typeExpression = tryParseTypeExpression();
6652+
6653+
const result = <JSDocAugmentsTag>createNode(SyntaxKind.JSDocAugmentsTag, atToken.pos);
6654+
result.atToken = atToken;
6655+
result.tagName = tagName;
6656+
result.typeExpression = typeExpression;
6657+
return finishNode(result);
6658+
}
6659+
66456660
function parseTypedefTag(atToken: AtToken, tagName: Identifier): JSDocTypedefTag {
66466661
const typeExpression = tryParseTypeExpression();
66476662
skipWhitespace();

src/compiler/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ namespace ts {
349349
JSDocThisType,
350350
JSDocComment,
351351
JSDocTag,
352+
JSDocAugmentsTag,
352353
JSDocParameterTag,
353354
JSDocReturnTag,
354355
JSDocTypeTag,
@@ -1989,6 +1990,11 @@ namespace ts {
19891990
kind: SyntaxKind.JSDocTag;
19901991
}
19911992

1993+
export interface JSDocAugmentsTag extends JSDocTag {
1994+
kind: SyntaxKind.JSDocAugmentsTag;
1995+
typeExpression: JSDocTypeExpression;
1996+
}
1997+
19921998
export interface JSDocTemplateTag extends JSDocTag {
19931999
kind: SyntaxKind.JSDocTemplateTag;
19942000
typeParameters: NodeArray<TypeParameterDeclaration>;

src/compiler/utilities.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1539,6 +1539,10 @@ namespace ts {
15391539
return tag && tag.typeExpression && tag.typeExpression.type;
15401540
}
15411541

1542+
export function getJSDocAugmentsTag(node: Node): JSDocAugmentsTag {
1543+
return getFirstJSDocTag(node, SyntaxKind.JSDocAugmentsTag) as JSDocAugmentsTag;
1544+
}
1545+
15421546
export function getJSDocReturnTag(node: Node): JSDocReturnTag {
15431547
return getFirstJSDocTag(node, SyntaxKind.JSDocReturnTag) as JSDocReturnTag;
15441548
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
///<reference path="fourslash.ts" />
2+
3+
// @allowJs: true
4+
// @Filename: dummy.js
5+
6+
//// /**
7+
//// * @augments {Thing<string>}
8+
//// */
9+
//// class MyStringThing extends Thing {
10+
//// constructor() {
11+
//// var x = this.mine;
12+
//// x/**/;
13+
//// }
14+
//// }
15+
16+
// @Filename: declarations.d.ts
17+
//// declare class Thing<T> {
18+
//// mine: T;
19+
//// }
20+
21+
goTo.marker();
22+
verify.quickInfoIs("(local var) x: string");
23+

0 commit comments

Comments
 (0)