From 10a91c54269db9e85315dc486f178e18182c800b Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 17 Jul 2017 16:14:42 -0700 Subject: [PATCH 1/4] JSDoc:Object creates index signature And `Object` creates a numeric index signature. Other uses still create `any` as before. --- src/compiler/checker.ts | 13 +++++++++++-- .../baselines/reference/jsdocIndexSignature.symbols | 13 +++++++++++++ tests/baselines/reference/jsdocIndexSignature.types | 13 +++++++++++++ .../cases/conformance/jsdoc/jsdocIndexSignature.ts | 10 ++++++++++ 4 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/jsdocIndexSignature.symbols create mode 100644 tests/baselines/reference/jsdocIndexSignature.types create mode 100644 tests/cases/conformance/jsdoc/jsdocIndexSignature.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index dafa75372e1bf..8dd81d1b623d5 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6872,6 +6872,17 @@ namespace ts { function getPrimitiveTypeFromJSDocTypeReference(node: TypeReferenceNode): Type { if (isIdentifier(node.typeName)) { + if (node.typeName.text === "Object") { + if (node.typeArguments && node.typeArguments.length === 2) { + const from = getTypeFromTypeNode(node.typeArguments[0]); + const to = getTypeFromTypeNode(node.typeArguments[1]); + let index = createIndexInfo(to, /*isReadonly*/ false); + if (from === stringType || from === numberType) { + return createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, from === stringType ? index : undefined, from === numberType ? index : undefined) + } + } + return anyType; + } switch (node.typeName.text) { case "String": return stringType; @@ -6885,8 +6896,6 @@ namespace ts { return undefinedType; case "Null": return nullType; - case "Object": - return anyType; case "Function": case "function": return globalFunctionType; diff --git a/tests/baselines/reference/jsdocIndexSignature.symbols b/tests/baselines/reference/jsdocIndexSignature.symbols new file mode 100644 index 0000000000000..8814fc18b6f1f --- /dev/null +++ b/tests/baselines/reference/jsdocIndexSignature.symbols @@ -0,0 +1,13 @@ +=== tests/cases/conformance/jsdoc/indices.js === +/** @type {Object.} */ +var o1; +>o1 : Symbol(o1, Decl(indices.js, 1, 3)) + +/** @type {Object.} */ +var o2; +>o2 : Symbol(o2, Decl(indices.js, 3, 3)) + +/** @type {Object.} */ +var o3; +>o3 : Symbol(o3, Decl(indices.js, 5, 3)) + diff --git a/tests/baselines/reference/jsdocIndexSignature.types b/tests/baselines/reference/jsdocIndexSignature.types new file mode 100644 index 0000000000000..4c1feaa2721f1 --- /dev/null +++ b/tests/baselines/reference/jsdocIndexSignature.types @@ -0,0 +1,13 @@ +=== tests/cases/conformance/jsdoc/indices.js === +/** @type {Object.} */ +var o1; +>o1 : { [x: string]: number; } + +/** @type {Object.} */ +var o2; +>o2 : { [x: number]: boolean; } + +/** @type {Object.} */ +var o3; +>o3 : any + diff --git a/tests/cases/conformance/jsdoc/jsdocIndexSignature.ts b/tests/cases/conformance/jsdoc/jsdocIndexSignature.ts new file mode 100644 index 0000000000000..fdf9e06e61eb0 --- /dev/null +++ b/tests/cases/conformance/jsdoc/jsdocIndexSignature.ts @@ -0,0 +1,10 @@ +// @allowJs: true +// @checkJs: true +// @noEmit: true +// @Filename: indices.js +/** @type {Object.} */ +var o1; +/** @type {Object.} */ +var o2; +/** @type {Object.} */ +var o3; From 1173dc104a57967dc6ccc48681deb8f561f098c7 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 17 Jul 2017 16:18:09 -0700 Subject: [PATCH 2/4] Improve naming and style a little --- src/compiler/checker.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 8dd81d1b623d5..bc1ad88de2c09 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6874,11 +6874,11 @@ namespace ts { if (isIdentifier(node.typeName)) { if (node.typeName.text === "Object") { if (node.typeArguments && node.typeArguments.length === 2) { - const from = getTypeFromTypeNode(node.typeArguments[0]); - const to = getTypeFromTypeNode(node.typeArguments[1]); - let index = createIndexInfo(to, /*isReadonly*/ false); - if (from === stringType || from === numberType) { - return createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, from === stringType ? index : undefined, from === numberType ? index : undefined) + const indexed = getTypeFromTypeNode(node.typeArguments[0]); + const target = getTypeFromTypeNode(node.typeArguments[1]); + let index = createIndexInfo(target, /*isReadonly*/ false); + if (indexed === stringType || indexed === numberType) { + return createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, indexed === stringType && index, indexed === numberType && index) } } return anyType; From 3b7a07c4414fe113e5157eaa49df446dca1afbbd Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 17 Jul 2017 16:21:54 -0700 Subject: [PATCH 3/4] Fix lint --- src/compiler/checker.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index bc1ad88de2c09..dc93563354221 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6876,9 +6876,9 @@ namespace ts { if (node.typeArguments && node.typeArguments.length === 2) { const indexed = getTypeFromTypeNode(node.typeArguments[0]); const target = getTypeFromTypeNode(node.typeArguments[1]); - let index = createIndexInfo(target, /*isReadonly*/ false); + const index = createIndexInfo(target, /*isReadonly*/ false); if (indexed === stringType || indexed === numberType) { - return createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, indexed === stringType && index, indexed === numberType && index) + return createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, indexed === stringType && index, indexed === numberType && index); } } return anyType; From 047ab9b0e351f230bb0140fb0fee27be5806b4cd Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Mon, 17 Jul 2017 16:23:42 -0700 Subject: [PATCH 4/4] Update name of `getIntendedTypeFromJSDocTypeReference` --- src/compiler/checker.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index dc93563354221..d8615c592bc0d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -6870,7 +6870,7 @@ namespace ts { return node.flags & NodeFlags.JSDoc && node.kind === SyntaxKind.TypeReference; } - function getPrimitiveTypeFromJSDocTypeReference(node: TypeReferenceNode): Type { + function getIntendedTypeFromJSDocTypeReference(node: TypeReferenceNode): Type { if (isIdentifier(node.typeName)) { if (node.typeName.text === "Object") { if (node.typeArguments && node.typeArguments.length === 2) { @@ -6921,7 +6921,7 @@ namespace ts { let type: Type; let meaning = SymbolFlags.Type; if (isJSDocTypeReference(node)) { - type = getPrimitiveTypeFromJSDocTypeReference(node); + type = getIntendedTypeFromJSDocTypeReference(node); meaning |= SymbolFlags.Value; } if (!type) {