Merge pull request #38607 from a-tarasyuk/bug/38295
fix(38295): Duplicated object key in const not detected when the key is a number preceded by `-` or `+`
This commit is contained in:
commit
3340142dda
6 changed files with 354 additions and 0 deletions
|
@ -3092,6 +3092,12 @@ namespace ts {
|
||||||
else if (isStringOrNumericLiteralLike(nameExpression)) {
|
else if (isStringOrNumericLiteralLike(nameExpression)) {
|
||||||
return escapeLeadingUnderscores(nameExpression.text);
|
return escapeLeadingUnderscores(nameExpression.text);
|
||||||
}
|
}
|
||||||
|
else if (isSignedNumericLiteral(nameExpression)) {
|
||||||
|
if (nameExpression.operator === SyntaxKind.MinusToken) {
|
||||||
|
return tokenToString(nameExpression.operator) + nameExpression.operand.text as __String;
|
||||||
|
}
|
||||||
|
return nameExpression.operand.text as __String;
|
||||||
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
default:
|
default:
|
||||||
return Debug.assertNever(name);
|
return Debug.assertNever(name);
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
tests/cases/compiler/duplicateObjectLiteralProperty_computedName.ts(3,5): error TS2300: Duplicate identifier '[1]'.
|
||||||
|
tests/cases/compiler/duplicateObjectLiteralProperty_computedName.ts(8,5): error TS2300: Duplicate identifier '[+1]'.
|
||||||
|
tests/cases/compiler/duplicateObjectLiteralProperty_computedName.ts(13,5): error TS2300: Duplicate identifier '[+1]'.
|
||||||
|
tests/cases/compiler/duplicateObjectLiteralProperty_computedName.ts(23,5): error TS2300: Duplicate identifier '["+1"]'.
|
||||||
|
tests/cases/compiler/duplicateObjectLiteralProperty_computedName.ts(28,5): error TS2300: Duplicate identifier '[-1]'.
|
||||||
|
tests/cases/compiler/duplicateObjectLiteralProperty_computedName.ts(33,5): error TS2300: Duplicate identifier '["-1"]'.
|
||||||
|
|
||||||
|
|
||||||
|
==== tests/cases/compiler/duplicateObjectLiteralProperty_computedName.ts (6 errors) ====
|
||||||
|
const t1 = {
|
||||||
|
1: 1,
|
||||||
|
[1]: 0 // duplicate
|
||||||
|
~~~
|
||||||
|
!!! error TS2300: Duplicate identifier '[1]'.
|
||||||
|
}
|
||||||
|
|
||||||
|
const t2 = {
|
||||||
|
1: 1,
|
||||||
|
[+1]: 0 // duplicate
|
||||||
|
~~~~
|
||||||
|
!!! error TS2300: Duplicate identifier '[+1]'.
|
||||||
|
}
|
||||||
|
|
||||||
|
const t3 = {
|
||||||
|
"1": 1,
|
||||||
|
[+1]: 0 // duplicate
|
||||||
|
~~~~
|
||||||
|
!!! error TS2300: Duplicate identifier '[+1]'.
|
||||||
|
}
|
||||||
|
|
||||||
|
const t4 = {
|
||||||
|
"+1": 1,
|
||||||
|
[+1]: 0 // two different keys, "+1", "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
const t5 = {
|
||||||
|
"+1": 1,
|
||||||
|
["+1"]: 0 // duplicate
|
||||||
|
~~~~~~
|
||||||
|
!!! error TS2300: Duplicate identifier '["+1"]'.
|
||||||
|
}
|
||||||
|
|
||||||
|
const t6 = {
|
||||||
|
"-1": 1,
|
||||||
|
[-1]: 0 // duplicate
|
||||||
|
~~~~
|
||||||
|
!!! error TS2300: Duplicate identifier '[-1]'.
|
||||||
|
}
|
||||||
|
|
||||||
|
const t7 = {
|
||||||
|
"-1": 1,
|
||||||
|
["-1"]: 0 // duplicate
|
||||||
|
~~~~~~
|
||||||
|
!!! error TS2300: Duplicate identifier '["-1"]'.
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
//// [duplicateObjectLiteralProperty_computedName.ts]
|
||||||
|
const t1 = {
|
||||||
|
1: 1,
|
||||||
|
[1]: 0 // duplicate
|
||||||
|
}
|
||||||
|
|
||||||
|
const t2 = {
|
||||||
|
1: 1,
|
||||||
|
[+1]: 0 // duplicate
|
||||||
|
}
|
||||||
|
|
||||||
|
const t3 = {
|
||||||
|
"1": 1,
|
||||||
|
[+1]: 0 // duplicate
|
||||||
|
}
|
||||||
|
|
||||||
|
const t4 = {
|
||||||
|
"+1": 1,
|
||||||
|
[+1]: 0 // two different keys, "+1", "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
const t5 = {
|
||||||
|
"+1": 1,
|
||||||
|
["+1"]: 0 // duplicate
|
||||||
|
}
|
||||||
|
|
||||||
|
const t6 = {
|
||||||
|
"-1": 1,
|
||||||
|
[-1]: 0 // duplicate
|
||||||
|
}
|
||||||
|
|
||||||
|
const t7 = {
|
||||||
|
"-1": 1,
|
||||||
|
["-1"]: 0 // duplicate
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//// [duplicateObjectLiteralProperty_computedName.js]
|
||||||
|
var _a, _b, _c, _d, _e, _f, _g;
|
||||||
|
var t1 = (_a = {
|
||||||
|
1: 1
|
||||||
|
},
|
||||||
|
_a[1] = 0 // duplicate
|
||||||
|
,
|
||||||
|
_a);
|
||||||
|
var t2 = (_b = {
|
||||||
|
1: 1
|
||||||
|
},
|
||||||
|
_b[+1] = 0 // duplicate
|
||||||
|
,
|
||||||
|
_b);
|
||||||
|
var t3 = (_c = {
|
||||||
|
"1": 1
|
||||||
|
},
|
||||||
|
_c[+1] = 0 // duplicate
|
||||||
|
,
|
||||||
|
_c);
|
||||||
|
var t4 = (_d = {
|
||||||
|
"+1": 1
|
||||||
|
},
|
||||||
|
_d[+1] = 0 // two different keys, "+1", "1"
|
||||||
|
,
|
||||||
|
_d);
|
||||||
|
var t5 = (_e = {
|
||||||
|
"+1": 1
|
||||||
|
},
|
||||||
|
_e["+1"] = 0 // duplicate
|
||||||
|
,
|
||||||
|
_e);
|
||||||
|
var t6 = (_f = {
|
||||||
|
"-1": 1
|
||||||
|
},
|
||||||
|
_f[-1] = 0 // duplicate
|
||||||
|
,
|
||||||
|
_f);
|
||||||
|
var t7 = (_g = {
|
||||||
|
"-1": 1
|
||||||
|
},
|
||||||
|
_g["-1"] = 0 // duplicate
|
||||||
|
,
|
||||||
|
_g);
|
|
@ -0,0 +1,74 @@
|
||||||
|
=== tests/cases/compiler/duplicateObjectLiteralProperty_computedName.ts ===
|
||||||
|
const t1 = {
|
||||||
|
>t1 : Symbol(t1, Decl(duplicateObjectLiteralProperty_computedName.ts, 0, 5))
|
||||||
|
|
||||||
|
1: 1,
|
||||||
|
>1 : Symbol(1, Decl(duplicateObjectLiteralProperty_computedName.ts, 0, 12), Decl(duplicateObjectLiteralProperty_computedName.ts, 1, 9))
|
||||||
|
|
||||||
|
[1]: 0 // duplicate
|
||||||
|
>[1] : Symbol(1, Decl(duplicateObjectLiteralProperty_computedName.ts, 0, 12), Decl(duplicateObjectLiteralProperty_computedName.ts, 1, 9))
|
||||||
|
>1 : Symbol(1, Decl(duplicateObjectLiteralProperty_computedName.ts, 0, 12), Decl(duplicateObjectLiteralProperty_computedName.ts, 1, 9))
|
||||||
|
}
|
||||||
|
|
||||||
|
const t2 = {
|
||||||
|
>t2 : Symbol(t2, Decl(duplicateObjectLiteralProperty_computedName.ts, 5, 5))
|
||||||
|
|
||||||
|
1: 1,
|
||||||
|
>1 : Symbol(1, Decl(duplicateObjectLiteralProperty_computedName.ts, 5, 12))
|
||||||
|
|
||||||
|
[+1]: 0 // duplicate
|
||||||
|
>[+1] : Symbol([+1], Decl(duplicateObjectLiteralProperty_computedName.ts, 6, 9))
|
||||||
|
}
|
||||||
|
|
||||||
|
const t3 = {
|
||||||
|
>t3 : Symbol(t3, Decl(duplicateObjectLiteralProperty_computedName.ts, 10, 5))
|
||||||
|
|
||||||
|
"1": 1,
|
||||||
|
>"1" : Symbol("1", Decl(duplicateObjectLiteralProperty_computedName.ts, 10, 12))
|
||||||
|
|
||||||
|
[+1]: 0 // duplicate
|
||||||
|
>[+1] : Symbol([+1], Decl(duplicateObjectLiteralProperty_computedName.ts, 11, 11))
|
||||||
|
}
|
||||||
|
|
||||||
|
const t4 = {
|
||||||
|
>t4 : Symbol(t4, Decl(duplicateObjectLiteralProperty_computedName.ts, 15, 5))
|
||||||
|
|
||||||
|
"+1": 1,
|
||||||
|
>"+1" : Symbol("+1", Decl(duplicateObjectLiteralProperty_computedName.ts, 15, 12), Decl(duplicateObjectLiteralProperty_computedName.ts, 16, 12))
|
||||||
|
|
||||||
|
[+1]: 0 // two different keys, "+1", "1"
|
||||||
|
>[+1] : Symbol("+1", Decl(duplicateObjectLiteralProperty_computedName.ts, 15, 12), Decl(duplicateObjectLiteralProperty_computedName.ts, 16, 12))
|
||||||
|
}
|
||||||
|
|
||||||
|
const t5 = {
|
||||||
|
>t5 : Symbol(t5, Decl(duplicateObjectLiteralProperty_computedName.ts, 20, 5))
|
||||||
|
|
||||||
|
"+1": 1,
|
||||||
|
>"+1" : Symbol("+1", Decl(duplicateObjectLiteralProperty_computedName.ts, 20, 12), Decl(duplicateObjectLiteralProperty_computedName.ts, 21, 12))
|
||||||
|
|
||||||
|
["+1"]: 0 // duplicate
|
||||||
|
>["+1"] : Symbol("+1", Decl(duplicateObjectLiteralProperty_computedName.ts, 20, 12), Decl(duplicateObjectLiteralProperty_computedName.ts, 21, 12))
|
||||||
|
>"+1" : Symbol("+1", Decl(duplicateObjectLiteralProperty_computedName.ts, 20, 12), Decl(duplicateObjectLiteralProperty_computedName.ts, 21, 12))
|
||||||
|
}
|
||||||
|
|
||||||
|
const t6 = {
|
||||||
|
>t6 : Symbol(t6, Decl(duplicateObjectLiteralProperty_computedName.ts, 25, 5))
|
||||||
|
|
||||||
|
"-1": 1,
|
||||||
|
>"-1" : Symbol("-1", Decl(duplicateObjectLiteralProperty_computedName.ts, 25, 12), Decl(duplicateObjectLiteralProperty_computedName.ts, 26, 12))
|
||||||
|
|
||||||
|
[-1]: 0 // duplicate
|
||||||
|
>[-1] : Symbol("-1", Decl(duplicateObjectLiteralProperty_computedName.ts, 25, 12), Decl(duplicateObjectLiteralProperty_computedName.ts, 26, 12))
|
||||||
|
}
|
||||||
|
|
||||||
|
const t7 = {
|
||||||
|
>t7 : Symbol(t7, Decl(duplicateObjectLiteralProperty_computedName.ts, 30, 5))
|
||||||
|
|
||||||
|
"-1": 1,
|
||||||
|
>"-1" : Symbol("-1", Decl(duplicateObjectLiteralProperty_computedName.ts, 30, 12), Decl(duplicateObjectLiteralProperty_computedName.ts, 31, 12))
|
||||||
|
|
||||||
|
["-1"]: 0 // duplicate
|
||||||
|
>["-1"] : Symbol("-1", Decl(duplicateObjectLiteralProperty_computedName.ts, 30, 12), Decl(duplicateObjectLiteralProperty_computedName.ts, 31, 12))
|
||||||
|
>"-1" : Symbol("-1", Decl(duplicateObjectLiteralProperty_computedName.ts, 30, 12), Decl(duplicateObjectLiteralProperty_computedName.ts, 31, 12))
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
=== tests/cases/compiler/duplicateObjectLiteralProperty_computedName.ts ===
|
||||||
|
const t1 = {
|
||||||
|
>t1 : { 1: number; }
|
||||||
|
>{ 1: 1, [1]: 0 // duplicate} : { 1: number; }
|
||||||
|
|
||||||
|
1: 1,
|
||||||
|
>1 : number
|
||||||
|
>1 : 1
|
||||||
|
|
||||||
|
[1]: 0 // duplicate
|
||||||
|
>[1] : number
|
||||||
|
>1 : 1
|
||||||
|
>0 : 0
|
||||||
|
}
|
||||||
|
|
||||||
|
const t2 = {
|
||||||
|
>t2 : { 1: number; }
|
||||||
|
>{ 1: 1, [+1]: 0 // duplicate} : { 1: number; }
|
||||||
|
|
||||||
|
1: 1,
|
||||||
|
>1 : number
|
||||||
|
>1 : 1
|
||||||
|
|
||||||
|
[+1]: 0 // duplicate
|
||||||
|
>[+1] : number
|
||||||
|
>+1 : 1
|
||||||
|
>1 : 1
|
||||||
|
>0 : 0
|
||||||
|
}
|
||||||
|
|
||||||
|
const t3 = {
|
||||||
|
>t3 : { 1: number; }
|
||||||
|
>{ "1": 1, [+1]: 0 // duplicate} : { 1: number; }
|
||||||
|
|
||||||
|
"1": 1,
|
||||||
|
>"1" : number
|
||||||
|
>1 : 1
|
||||||
|
|
||||||
|
[+1]: 0 // duplicate
|
||||||
|
>[+1] : number
|
||||||
|
>+1 : 1
|
||||||
|
>1 : 1
|
||||||
|
>0 : 0
|
||||||
|
}
|
||||||
|
|
||||||
|
const t4 = {
|
||||||
|
>t4 : { "+1": number; 1: number; }
|
||||||
|
>{ "+1": 1, [+1]: 0 // two different keys, "+1", "1"} : { "+1": number; 1: number; }
|
||||||
|
|
||||||
|
"+1": 1,
|
||||||
|
>"+1" : number
|
||||||
|
>1 : 1
|
||||||
|
|
||||||
|
[+1]: 0 // two different keys, "+1", "1"
|
||||||
|
>[+1] : number
|
||||||
|
>+1 : 1
|
||||||
|
>1 : 1
|
||||||
|
>0 : 0
|
||||||
|
}
|
||||||
|
|
||||||
|
const t5 = {
|
||||||
|
>t5 : { "+1": number; }
|
||||||
|
>{ "+1": 1, ["+1"]: 0 // duplicate} : { "+1": number; }
|
||||||
|
|
||||||
|
"+1": 1,
|
||||||
|
>"+1" : number
|
||||||
|
>1 : 1
|
||||||
|
|
||||||
|
["+1"]: 0 // duplicate
|
||||||
|
>["+1"] : number
|
||||||
|
>"+1" : "+1"
|
||||||
|
>0 : 0
|
||||||
|
}
|
||||||
|
|
||||||
|
const t6 = {
|
||||||
|
>t6 : { [-1]: number; }
|
||||||
|
>{ "-1": 1, [-1]: 0 // duplicate} : { [-1]: number; }
|
||||||
|
|
||||||
|
"-1": 1,
|
||||||
|
>"-1" : number
|
||||||
|
>1 : 1
|
||||||
|
|
||||||
|
[-1]: 0 // duplicate
|
||||||
|
>[-1] : number
|
||||||
|
>-1 : -1
|
||||||
|
>1 : 1
|
||||||
|
>0 : 0
|
||||||
|
}
|
||||||
|
|
||||||
|
const t7 = {
|
||||||
|
>t7 : { [-1]: number; }
|
||||||
|
>{ "-1": 1, ["-1"]: 0 // duplicate} : { [-1]: number; }
|
||||||
|
|
||||||
|
"-1": 1,
|
||||||
|
>"-1" : number
|
||||||
|
>1 : 1
|
||||||
|
|
||||||
|
["-1"]: 0 // duplicate
|
||||||
|
>["-1"] : number
|
||||||
|
>"-1" : "-1"
|
||||||
|
>0 : 0
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
const t1 = {
|
||||||
|
1: 1,
|
||||||
|
[1]: 0 // duplicate
|
||||||
|
}
|
||||||
|
|
||||||
|
const t2 = {
|
||||||
|
1: 1,
|
||||||
|
[+1]: 0 // duplicate
|
||||||
|
}
|
||||||
|
|
||||||
|
const t3 = {
|
||||||
|
"1": 1,
|
||||||
|
[+1]: 0 // duplicate
|
||||||
|
}
|
||||||
|
|
||||||
|
const t4 = {
|
||||||
|
"+1": 1,
|
||||||
|
[+1]: 0 // two different keys, "+1", "1"
|
||||||
|
}
|
||||||
|
|
||||||
|
const t5 = {
|
||||||
|
"+1": 1,
|
||||||
|
["+1"]: 0 // duplicate
|
||||||
|
}
|
||||||
|
|
||||||
|
const t6 = {
|
||||||
|
"-1": 1,
|
||||||
|
[-1]: 0 // duplicate
|
||||||
|
}
|
||||||
|
|
||||||
|
const t7 = {
|
||||||
|
"-1": 1,
|
||||||
|
["-1"]: 0 // duplicate
|
||||||
|
}
|
Loading…
Reference in a new issue