From 421ea01aa9bd1e8b95bc95e9a48847fd09215ad7 Mon Sep 17 00:00:00 2001 From: Tycho Grouwstra Date: Fri, 25 Aug 2017 22:20:29 +0800 Subject: [PATCH 1/4] make it parse --- src/compiler/checker.ts | 6 +++--- tests/cases/compiler/nonNullType.ts | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 tests/cases/compiler/nonNullType.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 4405a31db28f7..311854ff46f3c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7986,8 +7986,8 @@ namespace ts { return getTypeFromIntersectionTypeNode(node); case SyntaxKind.JSDocNullableType: return getTypeFromJSDocNullableTypeNode(node); - case SyntaxKind.ParenthesizedType: case SyntaxKind.JSDocNonNullableType: + case SyntaxKind.ParenthesizedType: case SyntaxKind.JSDocOptionalType: case SyntaxKind.JSDocTypeExpression: return getTypeFromTypeNode((node).type); @@ -22374,7 +22374,8 @@ namespace ts { return checkUnionOrIntersectionType(node); case SyntaxKind.ParenthesizedType: case SyntaxKind.TypeOperator: - return checkSourceElement((node).type); + case SyntaxKind.JSDocNonNullableType: + return checkSourceElement((node).type); case SyntaxKind.JSDocComment: return checkJSDocComment(node as JSDoc); case SyntaxKind.JSDocParameterTag: @@ -22383,7 +22384,6 @@ namespace ts { checkSignatureDeclaration(node as JSDocFunctionType); // falls through case SyntaxKind.JSDocVariadicType: - case SyntaxKind.JSDocNonNullableType: case SyntaxKind.JSDocNullableType: case SyntaxKind.JSDocAllType: case SyntaxKind.JSDocUnknownType: diff --git a/tests/cases/compiler/nonNullType.ts b/tests/cases/compiler/nonNullType.ts new file mode 100644 index 0000000000000..8bc6ee9897f9e --- /dev/null +++ b/tests/cases/compiler/nonNullType.ts @@ -0,0 +1,7 @@ +// @strictNullChecks: true +type z = string | undefined | null | never; +type a = string | undefined | null | never; +type b = a!; +type Assert = T!; +type c = Assert; + From 7312b32c965b4fb17ace431404221c5dd12d86c0 Mon Sep 17 00:00:00 2001 From: Tycho Grouwstra Date: Fri, 25 Aug 2017 22:41:46 +0800 Subject: [PATCH 2/4] simple test works, but too eager for generics --- src/compiler/checker.ts | 7 ++++++- src/compiler/emitter.ts | 8 ++++++++ tests/baselines/reference/nonNullType.js | 11 +++++++++++ tests/baselines/reference/nonNullType.symbols | 18 ++++++++++++++++++ tests/baselines/reference/nonNullType.types | 19 +++++++++++++++++++ tests/cases/compiler/nonNullType.ts | 8 +++----- 6 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 tests/baselines/reference/nonNullType.js create mode 100644 tests/baselines/reference/nonNullType.symbols create mode 100644 tests/baselines/reference/nonNullType.types diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 311854ff46f3c..83e56a92940ed 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7987,10 +7987,11 @@ namespace ts { case SyntaxKind.JSDocNullableType: return getTypeFromJSDocNullableTypeNode(node); case SyntaxKind.JSDocNonNullableType: + return getTypeFromNonNullableType((node).type); case SyntaxKind.ParenthesizedType: case SyntaxKind.JSDocOptionalType: case SyntaxKind.JSDocTypeExpression: - return getTypeFromTypeNode((node).type); + return getTypeFromTypeNode((node).type); case SyntaxKind.FunctionType: case SyntaxKind.ConstructorType: case SyntaxKind.TypeLiteral: @@ -8016,6 +8017,10 @@ namespace ts { } } + function getTypeFromNonNullableType(node: TypeNode) { + return getNonNullableType(getTypeFromTypeNode(node)); + } + function instantiateList(items: T[], mapper: TypeMapper, instantiator: (item: T, mapper: TypeMapper) => T): T[] { if (items && items.length) { const result: T[] = []; diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 5444c618353bd..4df9f9a8682bf 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -703,6 +703,9 @@ namespace ts { return emitEnumMember(node); // JSDoc nodes (ignored) + case SyntaxKind.JSDocNonNullableType: + return emitNonNullType(node); + // Transformation nodes (ignored) } @@ -1413,6 +1416,11 @@ namespace ts { write("!"); } + function emitNonNullType(node: JSDocNonNullableType) { + emit(node.type); + write("!"); + } + function emitMetaProperty(node: MetaProperty) { writeToken(node.keywordToken, node.pos); write("."); diff --git a/tests/baselines/reference/nonNullType.js b/tests/baselines/reference/nonNullType.js new file mode 100644 index 0000000000000..2b87ad3e6bd51 --- /dev/null +++ b/tests/baselines/reference/nonNullType.js @@ -0,0 +1,11 @@ +//// [nonNullType.ts] +let a: string | undefined | null | never; +let b: typeof a!; +type Assert = T!; +let c: Assert; + + +//// [nonNullType.js] +var a; +var b; +var c; diff --git a/tests/baselines/reference/nonNullType.symbols b/tests/baselines/reference/nonNullType.symbols new file mode 100644 index 0000000000000..1b4aa2a4cb5ac --- /dev/null +++ b/tests/baselines/reference/nonNullType.symbols @@ -0,0 +1,18 @@ +=== tests/cases/compiler/nonNullType.ts === +let a: string | undefined | null | never; +>a : Symbol(a, Decl(nonNullType.ts, 0, 3)) + +let b: typeof a!; +>b : Symbol(b, Decl(nonNullType.ts, 1, 3)) +>a : Symbol(a, Decl(nonNullType.ts, 0, 3)) + +type Assert = T!; +>Assert : Symbol(Assert, Decl(nonNullType.ts, 1, 17)) +>T : Symbol(T, Decl(nonNullType.ts, 2, 12)) +>T : Symbol(T, Decl(nonNullType.ts, 2, 12)) + +let c: Assert; +>c : Symbol(c, Decl(nonNullType.ts, 3, 3)) +>Assert : Symbol(Assert, Decl(nonNullType.ts, 1, 17)) +>a : Symbol(a, Decl(nonNullType.ts, 0, 3)) + diff --git a/tests/baselines/reference/nonNullType.types b/tests/baselines/reference/nonNullType.types new file mode 100644 index 0000000000000..4d18132b8e76a --- /dev/null +++ b/tests/baselines/reference/nonNullType.types @@ -0,0 +1,19 @@ +=== tests/cases/compiler/nonNullType.ts === +let a: string | undefined | null | never; +>a : string | null | undefined +>null : null + +let b: typeof a!; +>b : string +>a : string | null | undefined + +type Assert = T!; +>Assert : T +>T : T +>T : T + +let c: Assert; +>c : string | null | undefined +>Assert : T +>a : string | null | undefined + diff --git a/tests/cases/compiler/nonNullType.ts b/tests/cases/compiler/nonNullType.ts index 8bc6ee9897f9e..f080dc7c1e234 100644 --- a/tests/cases/compiler/nonNullType.ts +++ b/tests/cases/compiler/nonNullType.ts @@ -1,7 +1,5 @@ // @strictNullChecks: true -type z = string | undefined | null | never; -type a = string | undefined | null | never; -type b = a!; +let a: string | undefined | null | never; +let b: typeof a!; type Assert = T!; -type c = Assert; - +let c: Assert; From df75dff64c34fe5501a456446454751fcadcd803 Mon Sep 17 00:00:00 2001 From: Tycho Grouwstra Date: Fri, 25 Aug 2017 22:53:47 +0800 Subject: [PATCH 3/4] tests --- .../reference/jsdocDisallowedInTypescript.errors.txt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/baselines/reference/jsdocDisallowedInTypescript.errors.txt b/tests/baselines/reference/jsdocDisallowedInTypescript.errors.txt index 554b7af58227c..9a0fb0c68e2f4 100644 --- a/tests/baselines/reference/jsdocDisallowedInTypescript.errors.txt +++ b/tests/baselines/reference/jsdocDisallowedInTypescript.errors.txt @@ -8,13 +8,11 @@ tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(13,14): error TS802 tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(14,11): error TS8020: JSDoc types can only be used inside documentation comments. tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(15,8): error TS8020: JSDoc types can only be used inside documentation comments. tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(16,15): error TS8020: JSDoc types can only be used inside documentation comments. -tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(17,11): error TS8020: JSDoc types can only be used inside documentation comments. -tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(18,17): error TS8020: JSDoc types can only be used inside documentation comments. tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(19,5): error TS2322: Type 'undefined' is not assignable to type 'number | null'. tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(19,17): error TS8020: JSDoc types can only be used inside documentation comments. -==== tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts (14 errors) ==== +==== tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts (12 errors) ==== // grammar error from checker var ara: Array. = [1,2,3]; ~ @@ -52,11 +50,7 @@ tests/cases/conformance/jsdoc/jsdocDisallowedInTypescript.ts(19,17): error TS802 ~~~~~~~~~~ !!! error TS8020: JSDoc types can only be used inside documentation comments. var most: !string = 'definite'; - ~~~~~~~ -!!! error TS8020: JSDoc types can only be used inside documentation comments. var postfixdef: number! = 101; - ~~~~~~~ -!!! error TS8020: JSDoc types can only be used inside documentation comments. var postfixopt: number? = undefined; ~~~~~~~~~~ !!! error TS2322: Type 'undefined' is not assignable to type 'number | null'. From e97f18457c157adecf14cfd7284d4415db522632 Mon Sep 17 00:00:00 2001 From: Tycho Grouwstra Date: Fri, 25 Aug 2017 23:22:18 +0800 Subject: [PATCH 4/4] temporarily ditch now-passing test --- tests/cases/fourslash/codeFixChangeJSDocSyntax7.ts | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 tests/cases/fourslash/codeFixChangeJSDocSyntax7.ts diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax7.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax7.ts deleted file mode 100644 index c80d08b3bac58..0000000000000 --- a/tests/cases/fourslash/codeFixChangeJSDocSyntax7.ts +++ /dev/null @@ -1,4 +0,0 @@ -/// -//// var x: [|!number|] = 12; - -verify.rangeAfterCodeFix("number");