@@ -3095,8 +3095,8 @@ namespace ts {
3095
3095
function resolveExternalModuleSymbol(moduleSymbol: Symbol, dontResolveAlias?: boolean): Symbol;
3096
3096
function resolveExternalModuleSymbol(moduleSymbol: Symbol | undefined, dontResolveAlias?: boolean): Symbol | undefined;
3097
3097
function resolveExternalModuleSymbol(moduleSymbol: Symbol, dontResolveAlias?: boolean): Symbol {
3098
- if (moduleSymbol) {
3099
- const exportEquals = resolveSymbol(moduleSymbol.exports! .get(InternalSymbolName.ExportEquals), dontResolveAlias);
3098
+ if (moduleSymbol?.exports ) {
3099
+ const exportEquals = resolveSymbol(moduleSymbol.exports.get(InternalSymbolName.ExportEquals), dontResolveAlias);
3100
3100
const exported = getCommonJsExportEquals(getMergedSymbol(exportEquals), getMergedSymbol(moduleSymbol));
3101
3101
return getMergedSymbol(exported) || moduleSymbol;
3102
3102
}
@@ -4066,9 +4066,10 @@ namespace ts {
4066
4066
tracker: tracker && tracker.trackSymbol ? tracker : { trackSymbol: noop, moduleResolverHost: flags! & NodeBuilderFlags.DoNotIncludeSymbolChain ? {
4067
4067
getCommonSourceDirectory: (host as Program).getCommonSourceDirectory ? () => (host as Program).getCommonSourceDirectory() : () => "",
4068
4068
getSourceFiles: () => host.getSourceFiles(),
4069
- getCurrentDirectory: maybeBind(host, host.getCurrentDirectory),
4069
+ getCurrentDirectory: () => host.getCurrentDirectory( ),
4070
4070
getProbableSymlinks: maybeBind(host, host.getProbableSymlinks),
4071
- useCaseSensitiveFileNames: maybeBind(host, host.useCaseSensitiveFileNames)
4071
+ useCaseSensitiveFileNames: maybeBind(host, host.useCaseSensitiveFileNames),
4072
+ redirectTargetsMap: host.redirectTargetsMap,
4072
4073
} : undefined },
4073
4074
encounteredError: false,
4074
4075
visitedTypes: undefined,
@@ -5028,9 +5029,7 @@ namespace ts {
5028
5029
specifierCompilerOptions,
5029
5030
contextFile,
5030
5031
moduleResolverHost,
5031
- host.getSourceFiles(),
5032
5032
{ importModuleSpecifierPreference: isBundle ? "non-relative" : "relative" },
5033
- host.redirectTargetsMap,
5034
5033
));
5035
5034
links.specifierCache = links.specifierCache || createMap();
5036
5035
links.specifierCache.set(contextFile.path, specifier);
@@ -6450,7 +6449,7 @@ namespace ts {
6450
6449
const getCanonicalFileName = createGetCanonicalFileName(!!host.useCaseSensitiveFileNames);
6451
6450
const resolverHost = {
6452
6451
getCanonicalFileName,
6453
- getCurrentDirectory: context.tracker.moduleResolverHost.getCurrentDirectory ? () => context.tracker.moduleResolverHost!.getCurrentDirectory!() : () => "" ,
6452
+ getCurrentDirectory: () => context.tracker.moduleResolverHost!.getCurrentDirectory() ,
6454
6453
getCommonSourceDirectory: () => context.tracker.moduleResolverHost!.getCommonSourceDirectory()
6455
6454
};
6456
6455
const newName = getResolvedExternalModuleName(resolverHost, targetFile);
@@ -22684,8 +22683,8 @@ namespace ts {
22684
22683
// Grammar checking
22685
22684
checkGrammarObjectLiteralExpression(node, inDestructuringPattern);
22686
22685
22687
- let propertiesTable: SymbolTable ;
22688
- const allPropertiesTable = createSymbolTable();
22686
+ const allPropertiesTable = strictNullChecks ? createSymbolTable() : undefined ;
22687
+ let propertiesTable = createSymbolTable();
22689
22688
let propertiesArray: Symbol[] = [];
22690
22689
let spread: Type = emptyObjectType;
22691
22690
@@ -22701,7 +22700,6 @@ namespace ts {
22701
22700
let patternWithComputedProperties = false;
22702
22701
let hasComputedStringProperty = false;
22703
22702
let hasComputedNumberProperty = false;
22704
- propertiesTable = createSymbolTable();
22705
22703
22706
22704
let offset = 0;
22707
22705
for (let i = 0; i < node.properties.length; i++) {
@@ -22767,7 +22765,7 @@ namespace ts {
22767
22765
prop.type = type;
22768
22766
prop.target = member;
22769
22767
member = prop;
22770
- allPropertiesTable.set(prop.escapedName, prop);
22768
+ allPropertiesTable? .set(prop.escapedName, prop);
22771
22769
}
22772
22770
else if (memberDecl.kind === SyntaxKind.SpreadAssignment) {
22773
22771
if (languageVersion < ScriptTarget.ES2015) {
@@ -22785,16 +22783,9 @@ namespace ts {
22785
22783
error(memberDecl, Diagnostics.Spread_types_may_only_be_created_from_object_types);
22786
22784
return errorType;
22787
22785
}
22788
- for (const right of getPropertiesOfType(type)) {
22789
- const rightType = getTypeOfSymbol(right);
22790
- const left = allPropertiesTable.get(right.escapedName);
22791
- if (strictNullChecks &&
22792
- left &&
22793
- !maybeTypeOfKind(rightType, TypeFlags.Nullable)) {
22794
- error(left.valueDeclaration, Diagnostics._0_is_specified_more_than_once_so_this_usage_will_be_overwritten, unescapeLeadingUnderscores(left.escapedName));
22795
- }
22786
+ if (allPropertiesTable) {
22787
+ checkSpreadPropOverrides(type, allPropertiesTable, memberDecl);
22796
22788
}
22797
-
22798
22789
spread = getSpreadType(spread, type, node.symbol, objectFlags, inConstContext);
22799
22790
offset = i + 1;
22800
22791
continue;
@@ -22965,6 +22956,7 @@ namespace ts {
22965
22956
*/
22966
22957
function createJsxAttributesTypeFromAttributesProperty(openingLikeElement: JsxOpeningLikeElement, checkMode: CheckMode | undefined) {
22967
22958
const attributes = openingLikeElement.attributes;
22959
+ const allAttributesTable = strictNullChecks ? createSymbolTable() : undefined;
22968
22960
let attributesTable = createSymbolTable();
22969
22961
let spread: Type = emptyJsxObjectType;
22970
22962
let hasSpreadAnyType = false;
@@ -22988,6 +22980,7 @@ namespace ts {
22988
22980
attributeSymbol.type = exprType;
22989
22981
attributeSymbol.target = member;
22990
22982
attributesTable.set(attributeSymbol.escapedName, attributeSymbol);
22983
+ allAttributesTable?.set(attributeSymbol.escapedName, attributeSymbol);
22991
22984
if (attributeDecl.name.escapedText === jsxChildrenPropertyName) {
22992
22985
explicitlySpecifyChildrenAttribute = true;
22993
22986
}
@@ -23004,6 +22997,9 @@ namespace ts {
23004
22997
}
23005
22998
if (isValidSpreadType(exprType)) {
23006
22999
spread = getSpreadType(spread, exprType, attributes.symbol, objectFlags, /*readonly*/ false);
23000
+ if (allAttributesTable) {
23001
+ checkSpreadPropOverrides(exprType, allAttributesTable, attributeDecl);
23002
+ }
23007
23003
}
23008
23004
else {
23009
23005
typeToIntersect = typeToIntersect ? getIntersectionType([typeToIntersect, exprType]) : exprType;
@@ -23088,6 +23084,16 @@ namespace ts {
23088
23084
return childrenTypes;
23089
23085
}
23090
23086
23087
+ function checkSpreadPropOverrides(type: Type, props: SymbolTable, spread: SpreadAssignment | JsxSpreadAttribute) {
23088
+ for (const right of getPropertiesOfType(type)) {
23089
+ const left = props.get(right.escapedName);
23090
+ if (left && !maybeTypeOfKind(getTypeOfSymbol(right), TypeFlags.Nullable)) {
23091
+ const diagnostic = error(left.valueDeclaration, Diagnostics._0_is_specified_more_than_once_so_this_usage_will_be_overwritten, unescapeLeadingUnderscores(left.escapedName));
23092
+ addRelatedInfo(diagnostic, createDiagnosticForNode(spread, Diagnostics.This_spread_always_overwrites_this_property));
23093
+ }
23094
+ }
23095
+ }
23096
+
23091
23097
/**
23092
23098
* Check attributes property of opening-like element. This function is called during chooseOverload to get call signature of a JSX opening-like element.
23093
23099
* (See "checkApplicableSignatureForJsxOpeningLikeElement" for how the function is used)
0 commit comments