Skip to content

Commit 0ddcab3

Browse files
authored
Fix master: handle generating type name for late bound dupe message more nicely (#29572)
* Fix master: handle generating type name for late bound dupe message more nicely * Make literal type casts more specific in many places to better reflect the checks performed
1 parent c779fc7 commit 0ddcab3

File tree

1 file changed

+13
-13
lines changed

1 file changed

+13
-13
lines changed

src/compiler/checker.ts

+13-13
Original file line numberDiff line numberDiff line change
@@ -4855,7 +4855,7 @@ namespace ts {
48554855

48564856
function getLiteralPropertyNameText(name: PropertyName) {
48574857
const type = getLiteralTypeFromPropertyName(name);
4858-
return type.flags & (TypeFlags.StringLiteral | TypeFlags.NumberLiteral) ? "" + (<LiteralType>type).value : undefined;
4858+
return type.flags & (TypeFlags.StringLiteral | TypeFlags.NumberLiteral) ? "" + (<StringLiteralType | NumberLiteralType>type).value : undefined;
48594859
}
48604860

48614861
/** Return the inferred type for a binding element */
@@ -6450,12 +6450,12 @@ namespace ts {
64506450
/**
64516451
* Gets the symbolic name for a late-bound member from its type.
64526452
*/
6453-
function getLateBoundNameFromType(type: LiteralType | UniqueESSymbolType): __String {
6453+
function getLateBoundNameFromType(type: StringLiteralType | NumberLiteralType | UniqueESSymbolType): __String {
64546454
if (type.flags & TypeFlags.UniqueESSymbol) {
64556455
return `__@${type.symbol.escapedName}@${getSymbolId(type.symbol)}` as __String;
64566456
}
64576457
if (type.flags & (TypeFlags.StringLiteral | TypeFlags.NumberLiteral)) {
6458-
return escapeLeadingUnderscores("" + (<LiteralType>type).value);
6458+
return escapeLeadingUnderscores("" + (<StringLiteralType | NumberLiteralType>type).value);
64596459
}
64606460
return Debug.fail();
64616461
}
@@ -6534,7 +6534,7 @@ namespace ts {
65346534
// If we have an existing early-bound member, combine its declarations so that we can
65356535
// report an error at each declaration.
65366536
const declarations = earlySymbol ? concatenate(earlySymbol.declarations, lateSymbol.declarations) : lateSymbol.declarations;
6537-
const name = (<LiteralType>type).value || declarationNameToString(decl.name);
6537+
const name = !(type.flags & TypeFlags.UniqueESSymbol) && unescapeLeadingUnderscores(memberName) || declarationNameToString(decl.name);
65386538
forEach(declarations, declaration => error(getNameOfDeclaration(declaration) || declaration, Diagnostics.Property_0_was_also_declared_here, name));
65396539
error(decl.name || decl, Diagnostics.Duplicate_property_0, name);
65406540
lateSymbol = createSymbol(SymbolFlags.None, memberName, CheckFlags.Late);
@@ -9814,7 +9814,7 @@ namespace ts {
98149814
if (accessNode) {
98159815
const indexNode = getIndexNodeForAccessExpression(accessNode);
98169816
if (indexType.flags & (TypeFlags.StringLiteral | TypeFlags.NumberLiteral)) {
9817-
error(indexNode, Diagnostics.Property_0_does_not_exist_on_type_1, "" + (<LiteralType>indexType).value, typeToString(objectType));
9817+
error(indexNode, Diagnostics.Property_0_does_not_exist_on_type_1, "" + (<StringLiteralType | NumberLiteralType>indexType).value, typeToString(objectType));
98189818
}
98199819
else if (indexType.flags & (TypeFlags.String | TypeFlags.Number)) {
98209820
error(indexNode, Diagnostics.Type_0_has_no_matching_index_signature_for_type_1, typeToString(objectType), typeToString(indexType));
@@ -11759,11 +11759,11 @@ namespace ts {
1175911759
if (s & TypeFlags.StringLike && t & TypeFlags.String) return true;
1176011760
if (s & TypeFlags.StringLiteral && s & TypeFlags.EnumLiteral &&
1176111761
t & TypeFlags.StringLiteral && !(t & TypeFlags.EnumLiteral) &&
11762-
(<LiteralType>source).value === (<LiteralType>target).value) return true;
11762+
(<StringLiteralType>source).value === (<StringLiteralType>target).value) return true;
1176311763
if (s & TypeFlags.NumberLike && t & TypeFlags.Number) return true;
1176411764
if (s & TypeFlags.NumberLiteral && s & TypeFlags.EnumLiteral &&
1176511765
t & TypeFlags.NumberLiteral && !(t & TypeFlags.EnumLiteral) &&
11766-
(<LiteralType>source).value === (<LiteralType>target).value) return true;
11766+
(<NumberLiteralType>source).value === (<NumberLiteralType>target).value) return true;
1176711767
if (s & TypeFlags.BigIntLike && t & TypeFlags.BigInt) return true;
1176811768
if (s & TypeFlags.BooleanLike && t & TypeFlags.Boolean) return true;
1176911769
if (s & TypeFlags.ESSymbolLike && t & TypeFlags.ESSymbol) return true;
@@ -13687,8 +13687,8 @@ namespace ts {
1368713687
// no flags for all other types (including non-falsy literal types).
1368813688
function getFalsyFlags(type: Type): TypeFlags {
1368913689
return type.flags & TypeFlags.Union ? getFalsyFlagsOfTypes((<UnionType>type).types) :
13690-
type.flags & TypeFlags.StringLiteral ? (<LiteralType>type).value === "" ? TypeFlags.StringLiteral : 0 :
13691-
type.flags & TypeFlags.NumberLiteral ? (<LiteralType>type).value === 0 ? TypeFlags.NumberLiteral : 0 :
13690+
type.flags & TypeFlags.StringLiteral ? (<StringLiteralType>type).value === "" ? TypeFlags.StringLiteral : 0 :
13691+
type.flags & TypeFlags.NumberLiteral ? (<NumberLiteralType>type).value === 0 ? TypeFlags.NumberLiteral : 0 :
1369213692
type.flags & TypeFlags.BigIntLiteral ? isZeroBigInt(<BigIntLiteralType>type) ? TypeFlags.BigIntLiteral : 0 :
1369313693
type.flags & TypeFlags.BooleanLiteral ? (type === falseType || type === regularFalseType) ? TypeFlags.BooleanLiteral : 0 :
1369413694
type.flags & TypeFlags.PossiblyFalsy;
@@ -13711,8 +13711,8 @@ namespace ts {
1371113711
type === regularFalseType ||
1371213712
type === falseType ||
1371313713
type.flags & (TypeFlags.Void | TypeFlags.Undefined | TypeFlags.Null) ||
13714-
type.flags & TypeFlags.StringLiteral && (<LiteralType>type).value === "" ||
13715-
type.flags & TypeFlags.NumberLiteral && (<LiteralType>type).value === 0 ||
13714+
type.flags & TypeFlags.StringLiteral && (<StringLiteralType>type).value === "" ||
13715+
type.flags & TypeFlags.NumberLiteral && (<NumberLiteralType>type).value === 0 ||
1371613716
type.flags & TypeFlags.BigIntLiteral && isZeroBigInt(<BigIntLiteralType>type) ? type :
1371713717
neverType;
1371813718
}
@@ -15100,7 +15100,7 @@ namespace ts {
1510015100
return strictNullChecks ? TypeFacts.StringStrictFacts : TypeFacts.StringFacts;
1510115101
}
1510215102
if (flags & TypeFlags.StringLiteral) {
15103-
const isEmpty = (<LiteralType>type).value === "";
15103+
const isEmpty = (<StringLiteralType>type).value === "";
1510415104
return strictNullChecks ?
1510515105
isEmpty ? TypeFacts.EmptyStringStrictFacts : TypeFacts.NonEmptyStringStrictFacts :
1510615106
isEmpty ? TypeFacts.EmptyStringFacts : TypeFacts.NonEmptyStringFacts;
@@ -15109,7 +15109,7 @@ namespace ts {
1510915109
return strictNullChecks ? TypeFacts.NumberStrictFacts : TypeFacts.NumberFacts;
1511015110
}
1511115111
if (flags & TypeFlags.NumberLiteral) {
15112-
const isZero = (<LiteralType>type).value === 0;
15112+
const isZero = (<NumberLiteralType>type).value === 0;
1511315113
return strictNullChecks ?
1511415114
isZero ? TypeFacts.ZeroNumberStrictFacts : TypeFacts.NonZeroNumberStrictFacts :
1511515115
isZero ? TypeFacts.ZeroNumberFacts : TypeFacts.NonZeroNumberFacts;

0 commit comments

Comments
 (0)