From fc08ff5a36cd48a7b619f8c37dd42e3fa89389af Mon Sep 17 00:00:00 2001 From: Jack Williams Date: Thu, 1 Mar 2018 03:07:53 +0000 Subject: [PATCH 1/3] Check for symbol types in template expressions --- src/compiler/checker.ts | 4 ++- .../noImplicitSymbolToString.errors.txt | 21 +++++++++++++++ .../reference/noImplicitSymbolToString.js | 18 +++++++++++++ .../noImplicitSymbolToString.symbols | 21 +++++++++++++++ .../reference/noImplicitSymbolToString.types | 26 +++++++++++++++++++ .../compiler/noImplicitSymbolToString.ts | 8 ++++++ 6 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/noImplicitSymbolToString.errors.txt create mode 100644 tests/baselines/reference/noImplicitSymbolToString.js create mode 100644 tests/baselines/reference/noImplicitSymbolToString.symbols create mode 100644 tests/baselines/reference/noImplicitSymbolToString.types create mode 100644 tests/cases/compiler/noImplicitSymbolToString.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9579ba80d0f..19e5e2a880c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -19361,7 +19361,9 @@ namespace ts { // A place where we actually *are* concerned with the expressions' types are // in tagged templates. forEach(node.templateSpans, templateSpan => { - checkExpression(templateSpan.expression); + if (maybeTypeOfKind(checkExpression(templateSpan.expression), TypeFlags.ESSymbolLike)) { + error(templateSpan.expression, Diagnostics.Type_0_cannot_be_converted_to_type_1, typeToString(esSymbolType), typeToString(stringType)); + } }); return stringType; diff --git a/tests/baselines/reference/noImplicitSymbolToString.errors.txt b/tests/baselines/reference/noImplicitSymbolToString.errors.txt new file mode 100644 index 00000000000..43f5bb88864 --- /dev/null +++ b/tests/baselines/reference/noImplicitSymbolToString.errors.txt @@ -0,0 +1,21 @@ +tests/cases/compiler/noImplicitSymbolToString.ts(6,30): error TS2352: Type 'symbol' cannot be converted to type 'string'. +tests/cases/compiler/noImplicitSymbolToString.ts(7,30): error TS2469: The '+' operator cannot be applied to type 'symbol'. +tests/cases/compiler/noImplicitSymbolToString.ts(8,8): error TS2469: The '+=' operator cannot be applied to type 'symbol'. + + +==== tests/cases/compiler/noImplicitSymbolToString.ts (3 errors) ==== + // Fix #19666 + + let symbol!: symbol; + let str = "hello "; + + const templateStr = `hello ${symbol}`; + ~~~~~~ +!!! error TS2352: Type 'symbol' cannot be converted to type 'string'. + const appendStr = "hello " + symbol; + ~~~~~~ +!!! error TS2469: The '+' operator cannot be applied to type 'symbol'. + str += symbol; + ~~~~~~ +!!! error TS2469: The '+=' operator cannot be applied to type 'symbol'. + \ No newline at end of file diff --git a/tests/baselines/reference/noImplicitSymbolToString.js b/tests/baselines/reference/noImplicitSymbolToString.js new file mode 100644 index 00000000000..c7e62c7a86e --- /dev/null +++ b/tests/baselines/reference/noImplicitSymbolToString.js @@ -0,0 +1,18 @@ +//// [noImplicitSymbolToString.ts] +// Fix #19666 + +let symbol!: symbol; +let str = "hello "; + +const templateStr = `hello ${symbol}`; +const appendStr = "hello " + symbol; +str += symbol; + + +//// [noImplicitSymbolToString.js] +// Fix #19666 +var symbol; +var str = "hello "; +var templateStr = "hello " + symbol; +var appendStr = "hello " + symbol; +str += symbol; diff --git a/tests/baselines/reference/noImplicitSymbolToString.symbols b/tests/baselines/reference/noImplicitSymbolToString.symbols new file mode 100644 index 00000000000..a043aecefb1 --- /dev/null +++ b/tests/baselines/reference/noImplicitSymbolToString.symbols @@ -0,0 +1,21 @@ +=== tests/cases/compiler/noImplicitSymbolToString.ts === +// Fix #19666 + +let symbol!: symbol; +>symbol : Symbol(symbol, Decl(noImplicitSymbolToString.ts, 2, 3)) + +let str = "hello "; +>str : Symbol(str, Decl(noImplicitSymbolToString.ts, 3, 3)) + +const templateStr = `hello ${symbol}`; +>templateStr : Symbol(templateStr, Decl(noImplicitSymbolToString.ts, 5, 5)) +>symbol : Symbol(symbol, Decl(noImplicitSymbolToString.ts, 2, 3)) + +const appendStr = "hello " + symbol; +>appendStr : Symbol(appendStr, Decl(noImplicitSymbolToString.ts, 6, 5)) +>symbol : Symbol(symbol, Decl(noImplicitSymbolToString.ts, 2, 3)) + +str += symbol; +>str : Symbol(str, Decl(noImplicitSymbolToString.ts, 3, 3)) +>symbol : Symbol(symbol, Decl(noImplicitSymbolToString.ts, 2, 3)) + diff --git a/tests/baselines/reference/noImplicitSymbolToString.types b/tests/baselines/reference/noImplicitSymbolToString.types new file mode 100644 index 00000000000..45a69c5e950 --- /dev/null +++ b/tests/baselines/reference/noImplicitSymbolToString.types @@ -0,0 +1,26 @@ +=== tests/cases/compiler/noImplicitSymbolToString.ts === +// Fix #19666 + +let symbol!: symbol; +>symbol : symbol + +let str = "hello "; +>str : string +>"hello " : "hello " + +const templateStr = `hello ${symbol}`; +>templateStr : string +>`hello ${symbol}` : string +>symbol : symbol + +const appendStr = "hello " + symbol; +>appendStr : string +>"hello " + symbol : string +>"hello " : "hello " +>symbol : symbol + +str += symbol; +>str += symbol : string +>str : string +>symbol : symbol + diff --git a/tests/cases/compiler/noImplicitSymbolToString.ts b/tests/cases/compiler/noImplicitSymbolToString.ts new file mode 100644 index 00000000000..5340e2cd972 --- /dev/null +++ b/tests/cases/compiler/noImplicitSymbolToString.ts @@ -0,0 +1,8 @@ +// Fix #19666 + +let symbol!: symbol; +let str = "hello "; + +const templateStr = `hello ${symbol}`; +const appendStr = "hello " + symbol; +str += symbol; From 4e5c7be228ea95352279d46e5c4566fe460644ff Mon Sep 17 00:00:00 2001 From: Jack Williams Date: Tue, 6 Mar 2018 10:46:16 +0000 Subject: [PATCH 2/3] Add test case for taggedTemplate with symbol param and number return --- ...ggedTemplateStringWithSymbolExpression01.js | 17 +++++++++++++++++ ...emplateStringWithSymbolExpression01.symbols | 16 ++++++++++++++++ ...dTemplateStringWithSymbolExpression01.types | 18 ++++++++++++++++++ ...ggedTemplateStringWithSymbolExpression01.ts | 6 ++++++ 4 files changed, 57 insertions(+) create mode 100644 tests/baselines/reference/taggedTemplateStringWithSymbolExpression01.js create mode 100644 tests/baselines/reference/taggedTemplateStringWithSymbolExpression01.symbols create mode 100644 tests/baselines/reference/taggedTemplateStringWithSymbolExpression01.types create mode 100644 tests/cases/compiler/taggedTemplateStringWithSymbolExpression01.ts diff --git a/tests/baselines/reference/taggedTemplateStringWithSymbolExpression01.js b/tests/baselines/reference/taggedTemplateStringWithSymbolExpression01.js new file mode 100644 index 00000000000..4f02e7644f7 --- /dev/null +++ b/tests/baselines/reference/taggedTemplateStringWithSymbolExpression01.js @@ -0,0 +1,17 @@ +//// [taggedTemplateStringWithSymbolExpression01.ts] +// taggedTemplateStringWithSymbolExpression01.ts + +declare function foo(template: any, val: symbol): number; +let x!: symbol; + +let result: number = foo`${x}`; + + +//// [taggedTemplateStringWithSymbolExpression01.js] +// taggedTemplateStringWithSymbolExpression01.ts +var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; +var x; +var result = foo(__makeTemplateObject(["", ""], ["", ""]), x); diff --git a/tests/baselines/reference/taggedTemplateStringWithSymbolExpression01.symbols b/tests/baselines/reference/taggedTemplateStringWithSymbolExpression01.symbols new file mode 100644 index 00000000000..743d31193d4 --- /dev/null +++ b/tests/baselines/reference/taggedTemplateStringWithSymbolExpression01.symbols @@ -0,0 +1,16 @@ +=== tests/cases/compiler/taggedTemplateStringWithSymbolExpression01.ts === +// taggedTemplateStringWithSymbolExpression01.ts + +declare function foo(template: any, val: symbol): number; +>foo : Symbol(foo, Decl(taggedTemplateStringWithSymbolExpression01.ts, 0, 0)) +>template : Symbol(template, Decl(taggedTemplateStringWithSymbolExpression01.ts, 2, 21)) +>val : Symbol(val, Decl(taggedTemplateStringWithSymbolExpression01.ts, 2, 35)) + +let x!: symbol; +>x : Symbol(x, Decl(taggedTemplateStringWithSymbolExpression01.ts, 3, 3)) + +let result: number = foo`${x}`; +>result : Symbol(result, Decl(taggedTemplateStringWithSymbolExpression01.ts, 5, 3)) +>foo : Symbol(foo, Decl(taggedTemplateStringWithSymbolExpression01.ts, 0, 0)) +>x : Symbol(x, Decl(taggedTemplateStringWithSymbolExpression01.ts, 3, 3)) + diff --git a/tests/baselines/reference/taggedTemplateStringWithSymbolExpression01.types b/tests/baselines/reference/taggedTemplateStringWithSymbolExpression01.types new file mode 100644 index 00000000000..f1a16a7f8ef --- /dev/null +++ b/tests/baselines/reference/taggedTemplateStringWithSymbolExpression01.types @@ -0,0 +1,18 @@ +=== tests/cases/compiler/taggedTemplateStringWithSymbolExpression01.ts === +// taggedTemplateStringWithSymbolExpression01.ts + +declare function foo(template: any, val: symbol): number; +>foo : (template: any, val: symbol) => number +>template : any +>val : symbol + +let x!: symbol; +>x : symbol + +let result: number = foo`${x}`; +>result : number +>foo`${x}` : number +>foo : (template: any, val: symbol) => number +>`${x}` : string +>x : symbol + diff --git a/tests/cases/compiler/taggedTemplateStringWithSymbolExpression01.ts b/tests/cases/compiler/taggedTemplateStringWithSymbolExpression01.ts new file mode 100644 index 00000000000..0cbf3c00e38 --- /dev/null +++ b/tests/cases/compiler/taggedTemplateStringWithSymbolExpression01.ts @@ -0,0 +1,6 @@ +// taggedTemplateStringWithSymbolExpression01.ts + +declare function foo(template: any, val: symbol): number; +let x!: symbol; + +let result: number = foo`${x}`; From 5338500c05605f19c6295c8451f1918a638a6282 Mon Sep 17 00:00:00 2001 From: Jack Williams Date: Tue, 6 Mar 2018 10:46:43 +0000 Subject: [PATCH 3/3] Update symbol template test case with errors to include union types --- .../reference/noImplicitSymbolToString.errors.txt | 13 ++++++++++++- .../baselines/reference/noImplicitSymbolToString.js | 8 ++++++++ .../reference/noImplicitSymbolToString.symbols | 11 +++++++++++ .../reference/noImplicitSymbolToString.types | 12 ++++++++++++ tests/cases/compiler/noImplicitSymbolToString.ts | 5 +++++ 5 files changed, 48 insertions(+), 1 deletion(-) diff --git a/tests/baselines/reference/noImplicitSymbolToString.errors.txt b/tests/baselines/reference/noImplicitSymbolToString.errors.txt index 43f5bb88864..6dae5c5d76f 100644 --- a/tests/baselines/reference/noImplicitSymbolToString.errors.txt +++ b/tests/baselines/reference/noImplicitSymbolToString.errors.txt @@ -1,9 +1,11 @@ tests/cases/compiler/noImplicitSymbolToString.ts(6,30): error TS2352: Type 'symbol' cannot be converted to type 'string'. tests/cases/compiler/noImplicitSymbolToString.ts(7,30): error TS2469: The '+' operator cannot be applied to type 'symbol'. tests/cases/compiler/noImplicitSymbolToString.ts(8,8): error TS2469: The '+=' operator cannot be applied to type 'symbol'. +tests/cases/compiler/noImplicitSymbolToString.ts(13,47): error TS2352: Type 'symbol' cannot be converted to type 'string'. +tests/cases/compiler/noImplicitSymbolToString.ts(13,90): error TS2352: Type 'symbol' cannot be converted to type 'string'. -==== tests/cases/compiler/noImplicitSymbolToString.ts (3 errors) ==== +==== tests/cases/compiler/noImplicitSymbolToString.ts (5 errors) ==== // Fix #19666 let symbol!: symbol; @@ -18,4 +20,13 @@ tests/cases/compiler/noImplicitSymbolToString.ts(8,8): error TS2469: The '+=' op str += symbol; ~~~~~~ !!! error TS2469: The '+=' operator cannot be applied to type 'symbol'. + + let symbolUnionNumber!: symbol | number; + let symbolUnionString!: symbol | string; + + const templateStrUnion = `union with number ${symbolUnionNumber} and union with string ${symbolUnionString}`; + ~~~~~~~~~~~~~~~~~ +!!! error TS2352: Type 'symbol' cannot be converted to type 'string'. + ~~~~~~~~~~~~~~~~~ +!!! error TS2352: Type 'symbol' cannot be converted to type 'string'. \ No newline at end of file diff --git a/tests/baselines/reference/noImplicitSymbolToString.js b/tests/baselines/reference/noImplicitSymbolToString.js index c7e62c7a86e..836d5abe8a9 100644 --- a/tests/baselines/reference/noImplicitSymbolToString.js +++ b/tests/baselines/reference/noImplicitSymbolToString.js @@ -7,6 +7,11 @@ let str = "hello "; const templateStr = `hello ${symbol}`; const appendStr = "hello " + symbol; str += symbol; + +let symbolUnionNumber!: symbol | number; +let symbolUnionString!: symbol | string; + +const templateStrUnion = `union with number ${symbolUnionNumber} and union with string ${symbolUnionString}`; //// [noImplicitSymbolToString.js] @@ -16,3 +21,6 @@ var str = "hello "; var templateStr = "hello " + symbol; var appendStr = "hello " + symbol; str += symbol; +var symbolUnionNumber; +var symbolUnionString; +var templateStrUnion = "union with number " + symbolUnionNumber + " and union with string " + symbolUnionString; diff --git a/tests/baselines/reference/noImplicitSymbolToString.symbols b/tests/baselines/reference/noImplicitSymbolToString.symbols index a043aecefb1..b2a08e151ab 100644 --- a/tests/baselines/reference/noImplicitSymbolToString.symbols +++ b/tests/baselines/reference/noImplicitSymbolToString.symbols @@ -19,3 +19,14 @@ str += symbol; >str : Symbol(str, Decl(noImplicitSymbolToString.ts, 3, 3)) >symbol : Symbol(symbol, Decl(noImplicitSymbolToString.ts, 2, 3)) +let symbolUnionNumber!: symbol | number; +>symbolUnionNumber : Symbol(symbolUnionNumber, Decl(noImplicitSymbolToString.ts, 9, 3)) + +let symbolUnionString!: symbol | string; +>symbolUnionString : Symbol(symbolUnionString, Decl(noImplicitSymbolToString.ts, 10, 3)) + +const templateStrUnion = `union with number ${symbolUnionNumber} and union with string ${symbolUnionString}`; +>templateStrUnion : Symbol(templateStrUnion, Decl(noImplicitSymbolToString.ts, 12, 5)) +>symbolUnionNumber : Symbol(symbolUnionNumber, Decl(noImplicitSymbolToString.ts, 9, 3)) +>symbolUnionString : Symbol(symbolUnionString, Decl(noImplicitSymbolToString.ts, 10, 3)) + diff --git a/tests/baselines/reference/noImplicitSymbolToString.types b/tests/baselines/reference/noImplicitSymbolToString.types index 45a69c5e950..c21c0e07bfd 100644 --- a/tests/baselines/reference/noImplicitSymbolToString.types +++ b/tests/baselines/reference/noImplicitSymbolToString.types @@ -24,3 +24,15 @@ str += symbol; >str : string >symbol : symbol +let symbolUnionNumber!: symbol | number; +>symbolUnionNumber : number | symbol + +let symbolUnionString!: symbol | string; +>symbolUnionString : string | symbol + +const templateStrUnion = `union with number ${symbolUnionNumber} and union with string ${symbolUnionString}`; +>templateStrUnion : string +>`union with number ${symbolUnionNumber} and union with string ${symbolUnionString}` : string +>symbolUnionNumber : number | symbol +>symbolUnionString : string | symbol + diff --git a/tests/cases/compiler/noImplicitSymbolToString.ts b/tests/cases/compiler/noImplicitSymbolToString.ts index 5340e2cd972..16690d6d845 100644 --- a/tests/cases/compiler/noImplicitSymbolToString.ts +++ b/tests/cases/compiler/noImplicitSymbolToString.ts @@ -6,3 +6,8 @@ let str = "hello "; const templateStr = `hello ${symbol}`; const appendStr = "hello " + symbol; str += symbol; + +let symbolUnionNumber!: symbol | number; +let symbolUnionString!: symbol | string; + +const templateStrUnion = `union with number ${symbolUnionNumber} and union with string ${symbolUnionString}`;