Skip to content

Commit 1a579d1

Browse files
authored
Merge pull request #14284 from Microsoft/jsDocUpperCasePrimitiveTypes
Allow primitive types in JSDoc to start wtih uppercase letters
2 parents 2d4b4c9 + fd80409 commit 1a579d1

File tree

7 files changed

+538
-23
lines changed

7 files changed

+538
-23
lines changed

src/compiler/checker.ts

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5897,15 +5897,52 @@ namespace ts {
58975897
return getTypeFromNonGenericTypeReference(node, symbol);
58985898
}
58995899

5900+
function getPrimitiveTypeFromJSDocTypeReference(node: JSDocTypeReference): Type {
5901+
if (isIdentifier(node.name)) {
5902+
switch (node.name.text) {
5903+
case "String":
5904+
return stringType;
5905+
case "Number":
5906+
return numberType;
5907+
case "Boolean":
5908+
return booleanType;
5909+
case "Void":
5910+
return voidType;
5911+
case "Undefined":
5912+
return undefinedType;
5913+
case "Null":
5914+
return nullType;
5915+
case "Object":
5916+
return anyType;
5917+
case "Function":
5918+
return anyFunctionType;
5919+
case "Array":
5920+
case "array":
5921+
return !node.typeArguments || !node.typeArguments.length ? createArrayType(anyType) : undefined;
5922+
case "Promise":
5923+
case "promise":
5924+
return !node.typeArguments || !node.typeArguments.length ? createPromiseType(anyType) : undefined;
5925+
}
5926+
}
5927+
}
5928+
5929+
function getTypeFromJSDocNullableTypeNode(node: JSDocNullableType) {
5930+
const type = getTypeFromTypeNode(node.type);
5931+
return strictNullChecks ? getUnionType([type, nullType]) : type;
5932+
}
5933+
59005934
function getTypeFromTypeReference(node: TypeReferenceNode | ExpressionWithTypeArguments | JSDocTypeReference): Type {
59015935
const links = getNodeLinks(node);
59025936
if (!links.resolvedType) {
59035937
let symbol: Symbol;
59045938
let type: Type;
59055939
if (node.kind === SyntaxKind.JSDocTypeReference) {
5906-
const typeReferenceName = getTypeReferenceName(node);
5907-
symbol = resolveTypeReferenceName(typeReferenceName);
5908-
type = getTypeReferenceType(node, symbol);
5940+
type = getPrimitiveTypeFromJSDocTypeReference(<JSDocTypeReference>node);
5941+
if (!type) {
5942+
const typeReferenceName = getTypeReferenceName(node);
5943+
symbol = resolveTypeReferenceName(typeReferenceName);
5944+
type = getTypeReferenceType(node, symbol);
5945+
}
59095946
}
59105947
else {
59115948
// We only support expressions that are simple qualified names. For other expressions this produces undefined.
@@ -6812,12 +6849,6 @@ namespace ts {
68126849
return neverType;
68136850
case SyntaxKind.ObjectKeyword:
68146851
return nonPrimitiveType;
6815-
case SyntaxKind.JSDocNullKeyword:
6816-
return nullType;
6817-
case SyntaxKind.JSDocUndefinedKeyword:
6818-
return undefinedType;
6819-
case SyntaxKind.JSDocNeverKeyword:
6820-
return neverType;
68216852
case SyntaxKind.ThisType:
68226853
case SyntaxKind.ThisKeyword:
68236854
return getTypeFromThisTypeNode(node);
@@ -6844,8 +6875,9 @@ namespace ts {
68446875
return getTypeFromUnionTypeNode(<UnionTypeNode>node);
68456876
case SyntaxKind.IntersectionType:
68466877
return getTypeFromIntersectionTypeNode(<IntersectionTypeNode>node);
6847-
case SyntaxKind.ParenthesizedType:
68486878
case SyntaxKind.JSDocNullableType:
6879+
return getTypeFromJSDocNullableTypeNode(<JSDocNullableType>node);
6880+
case SyntaxKind.ParenthesizedType:
68496881
case SyntaxKind.JSDocNonNullableType:
68506882
case SyntaxKind.JSDocConstructorType:
68516883
case SyntaxKind.JSDocThisType:

src/compiler/types.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -381,9 +381,6 @@
381381
JSDocPropertyTag,
382382
JSDocTypeLiteral,
383383
JSDocLiteralType,
384-
JSDocNullKeyword,
385-
JSDocUndefinedKeyword,
386-
JSDocNeverKeyword,
387384

388385
// Synthesized list
389386
SyntaxList,
@@ -423,9 +420,9 @@
423420
LastBinaryOperator = CaretEqualsToken,
424421
FirstNode = QualifiedName,
425422
FirstJSDocNode = JSDocTypeExpression,
426-
LastJSDocNode = JSDocNeverKeyword,
423+
LastJSDocNode = JSDocLiteralType,
427424
FirstJSDocTagNode = JSDocComment,
428-
LastJSDocTagNode = JSDocNeverKeyword
425+
LastJSDocTagNode = JSDocLiteralType
429426
}
430427

431428
export const enum NodeFlags {
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
//// [tests/cases/conformance/salsa/jsDocTypes.ts] ////
2+
3+
//// [a.js]
4+
5+
/** @type {String} */
6+
var S;
7+
8+
/** @type {string} */
9+
var s;
10+
11+
/** @type {Number} */
12+
var N;
13+
14+
/** @type {number} */
15+
var n;
16+
17+
/** @type {Boolean} */
18+
var B;
19+
20+
/** @type {boolean} */
21+
var b;
22+
23+
/** @type {Void} */
24+
var V;
25+
26+
/** @type {void} */
27+
var v;
28+
29+
/** @type {Undefined} */
30+
var U;
31+
32+
/** @type {undefined} */
33+
var u;
34+
35+
/** @type {Null} */
36+
var Nl;
37+
38+
/** @type {null} */
39+
var nl;
40+
41+
/** @type {Array} */
42+
var A;
43+
44+
/** @type {array} */
45+
var a;
46+
47+
/** @type {Promise} */
48+
var P;
49+
50+
/** @type {promise} */
51+
var p;
52+
53+
/** @type {?number} */
54+
var nullable;
55+
56+
/** @type {Object} */
57+
var Obj;
58+
59+
60+
61+
//// [b.ts]
62+
var S: string;
63+
var s: string;
64+
var N: number;
65+
var n: number
66+
var B: boolean;
67+
var b: boolean;
68+
var V :void;
69+
var v: void;
70+
var U: undefined;
71+
var u: undefined;
72+
var Nl: null;
73+
var nl: null;
74+
var A: any[];
75+
var a: any[];
76+
var P: Promise<any>;
77+
var p: Promise<any>;
78+
var nullable: number | null;
79+
var Obj: any;
80+
81+
82+
//// [a.js]
83+
/** @type {String} */
84+
var S;
85+
/** @type {string} */
86+
var s;
87+
/** @type {Number} */
88+
var N;
89+
/** @type {number} */
90+
var n;
91+
/** @type {Boolean} */
92+
var B;
93+
/** @type {boolean} */
94+
var b;
95+
/** @type {Void} */
96+
var V;
97+
/** @type {void} */
98+
var v;
99+
/** @type {Undefined} */
100+
var U;
101+
/** @type {undefined} */
102+
var u;
103+
/** @type {Null} */
104+
var Nl;
105+
/** @type {null} */
106+
var nl;
107+
/** @type {Array} */
108+
var A;
109+
/** @type {array} */
110+
var a;
111+
/** @type {Promise} */
112+
var P;
113+
/** @type {promise} */
114+
var p;
115+
/** @type {?number} */
116+
var nullable;
117+
/** @type {Object} */
118+
var Obj;
119+
//// [b.js]
120+
var S;
121+
var s;
122+
var N;
123+
var n;
124+
var B;
125+
var b;
126+
var V;
127+
var v;
128+
var U;
129+
var u;
130+
var Nl;
131+
var nl;
132+
var A;
133+
var a;
134+
var P;
135+
var p;
136+
var nullable;
137+
var Obj;
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
=== tests/cases/conformance/salsa/a.js ===
2+
3+
/** @type {String} */
4+
var S;
5+
>S : Symbol(S, Decl(a.js, 2, 3), Decl(b.ts, 0, 3))
6+
7+
/** @type {string} */
8+
var s;
9+
>s : Symbol(s, Decl(a.js, 5, 3), Decl(b.ts, 1, 3))
10+
11+
/** @type {Number} */
12+
var N;
13+
>N : Symbol(N, Decl(a.js, 8, 3), Decl(b.ts, 2, 3))
14+
15+
/** @type {number} */
16+
var n;
17+
>n : Symbol(n, Decl(a.js, 11, 3), Decl(b.ts, 3, 3))
18+
19+
/** @type {Boolean} */
20+
var B;
21+
>B : Symbol(B, Decl(a.js, 14, 3), Decl(b.ts, 4, 3))
22+
23+
/** @type {boolean} */
24+
var b;
25+
>b : Symbol(b, Decl(a.js, 17, 3), Decl(b.ts, 5, 3))
26+
27+
/** @type {Void} */
28+
var V;
29+
>V : Symbol(V, Decl(a.js, 20, 3), Decl(b.ts, 6, 3))
30+
31+
/** @type {void} */
32+
var v;
33+
>v : Symbol(v, Decl(a.js, 23, 3), Decl(b.ts, 7, 3))
34+
35+
/** @type {Undefined} */
36+
var U;
37+
>U : Symbol(U, Decl(a.js, 26, 3), Decl(b.ts, 8, 3))
38+
39+
/** @type {undefined} */
40+
var u;
41+
>u : Symbol(u, Decl(a.js, 29, 3), Decl(b.ts, 9, 3))
42+
43+
/** @type {Null} */
44+
var Nl;
45+
>Nl : Symbol(Nl, Decl(a.js, 32, 3), Decl(b.ts, 10, 3))
46+
47+
/** @type {null} */
48+
var nl;
49+
>nl : Symbol(nl, Decl(a.js, 35, 3), Decl(b.ts, 11, 3))
50+
51+
/** @type {Array} */
52+
var A;
53+
>A : Symbol(A, Decl(a.js, 38, 3), Decl(b.ts, 12, 3))
54+
55+
/** @type {array} */
56+
var a;
57+
>a : Symbol(a, Decl(a.js, 41, 3), Decl(b.ts, 13, 3))
58+
59+
/** @type {Promise} */
60+
var P;
61+
>P : Symbol(P, Decl(a.js, 44, 3), Decl(b.ts, 14, 3))
62+
63+
/** @type {promise} */
64+
var p;
65+
>p : Symbol(p, Decl(a.js, 47, 3), Decl(b.ts, 15, 3))
66+
67+
/** @type {?number} */
68+
var nullable;
69+
>nullable : Symbol(nullable, Decl(a.js, 50, 3), Decl(b.ts, 16, 3))
70+
71+
/** @type {Object} */
72+
var Obj;
73+
>Obj : Symbol(Obj, Decl(a.js, 53, 3), Decl(b.ts, 17, 3))
74+
75+
76+
77+
=== tests/cases/conformance/salsa/b.ts ===
78+
var S: string;
79+
>S : Symbol(S, Decl(a.js, 2, 3), Decl(b.ts, 0, 3))
80+
81+
var s: string;
82+
>s : Symbol(s, Decl(a.js, 5, 3), Decl(b.ts, 1, 3))
83+
84+
var N: number;
85+
>N : Symbol(N, Decl(a.js, 8, 3), Decl(b.ts, 2, 3))
86+
87+
var n: number
88+
>n : Symbol(n, Decl(a.js, 11, 3), Decl(b.ts, 3, 3))
89+
90+
var B: boolean;
91+
>B : Symbol(B, Decl(a.js, 14, 3), Decl(b.ts, 4, 3))
92+
93+
var b: boolean;
94+
>b : Symbol(b, Decl(a.js, 17, 3), Decl(b.ts, 5, 3))
95+
96+
var V :void;
97+
>V : Symbol(V, Decl(a.js, 20, 3), Decl(b.ts, 6, 3))
98+
99+
var v: void;
100+
>v : Symbol(v, Decl(a.js, 23, 3), Decl(b.ts, 7, 3))
101+
102+
var U: undefined;
103+
>U : Symbol(U, Decl(a.js, 26, 3), Decl(b.ts, 8, 3))
104+
105+
var u: undefined;
106+
>u : Symbol(u, Decl(a.js, 29, 3), Decl(b.ts, 9, 3))
107+
108+
var Nl: null;
109+
>Nl : Symbol(Nl, Decl(a.js, 32, 3), Decl(b.ts, 10, 3))
110+
111+
var nl: null;
112+
>nl : Symbol(nl, Decl(a.js, 35, 3), Decl(b.ts, 11, 3))
113+
114+
var A: any[];
115+
>A : Symbol(A, Decl(a.js, 38, 3), Decl(b.ts, 12, 3))
116+
117+
var a: any[];
118+
>a : Symbol(a, Decl(a.js, 41, 3), Decl(b.ts, 13, 3))
119+
120+
var P: Promise<any>;
121+
>P : Symbol(P, Decl(a.js, 44, 3), Decl(b.ts, 14, 3))
122+
>Promise : Symbol(Promise, Decl(lib.d.ts, --, --))
123+
124+
var p: Promise<any>;
125+
>p : Symbol(p, Decl(a.js, 47, 3), Decl(b.ts, 15, 3))
126+
>Promise : Symbol(Promise, Decl(lib.d.ts, --, --))
127+
128+
var nullable: number | null;
129+
>nullable : Symbol(nullable, Decl(a.js, 50, 3), Decl(b.ts, 16, 3))
130+
131+
var Obj: any;
132+
>Obj : Symbol(Obj, Decl(a.js, 53, 3), Decl(b.ts, 17, 3))
133+

0 commit comments

Comments
 (0)