@@ -82,6 +82,7 @@ namespace ts {
82
82
const noImplicitAny = getStrictOptionValue(compilerOptions, "noImplicitAny");
83
83
const noImplicitThis = getStrictOptionValue(compilerOptions, "noImplicitThis");
84
84
const keyofStringsOnly = !!compilerOptions.keyofStringsOnly;
85
+ const freshObjectLiteralFlag = compilerOptions.suppressExcessPropertyErrors ? 0 : ObjectFlags.FreshLiteral;
85
86
86
87
const emitResolver = createResolver();
87
88
const nodeBuilder = createNodeBuilder();
@@ -10000,8 +10001,8 @@ namespace ts {
10000
10001
emptyArray,
10001
10002
getNonReadonlyIndexSignature(stringIndexInfo),
10002
10003
getNonReadonlyIndexSignature(numberIndexInfo));
10003
- spread.flags |= typeFlags | TypeFlags.ContainsObjectLiteral;
10004
- ( spread as ObjectType) .objectFlags |= objectFlags | ( ObjectFlags.ObjectLiteral | ObjectFlags.ContainsSpread) ;
10004
+ spread.flags |= TypeFlags.ContainsObjectLiteral | typeFlags ;
10005
+ spread.objectFlags |= ObjectFlags.ObjectLiteral | ObjectFlags.ContainsSpread | objectFlags ;
10005
10006
return spread;
10006
10007
}
10007
10008
@@ -11553,7 +11554,7 @@ namespace ts {
11553
11554
isSimpleTypeRelatedTo(source, target, relation, reportErrors ? reportError : undefined)) return Ternary.True;
11554
11555
11555
11556
const isComparingJsxAttributes = !!(getObjectFlags(source) & ObjectFlags.JsxAttributes);
11556
- if (isObjectLiteralType(source) && source.flags & TypeFlags .FreshLiteral) {
11557
+ if (isObjectLiteralType(source) && getObjectFlags( source) & ObjectFlags .FreshLiteral) {
11557
11558
const discriminantType = target.flags & TypeFlags.Union ? findMatchingDiscriminantType(source, target as UnionType) : undefined;
11558
11559
if (hasExcessProperties(<FreshObjectLiteralType>source, target, discriminantType, reportErrors)) {
11559
11560
if (reportErrors) {
@@ -13284,7 +13285,7 @@ namespace ts {
13284
13285
* Leave signatures alone since they are not subject to the check.
13285
13286
*/
13286
13287
function getRegularTypeOfObjectLiteral(type: Type): Type {
13287
- if (!(isObjectLiteralType(type) && type.flags & TypeFlags .FreshLiteral)) {
13288
+ if (!(isObjectLiteralType(type) && getObjectFlags( type) & ObjectFlags .FreshLiteral)) {
13288
13289
return type;
13289
13290
}
13290
13291
const regularType = (<FreshObjectLiteralType>type).regularType;
@@ -13300,7 +13301,7 @@ namespace ts {
13300
13301
resolved.constructSignatures,
13301
13302
resolved.stringIndexInfo,
13302
13303
resolved.numberIndexInfo);
13303
- regularNew.flags = resolved.flags & ~TypeFlags.FreshLiteral ;
13304
+ regularNew.flags = resolved.flags;
13304
13305
regularNew.objectFlags |= ObjectFlags.ObjectLiteral | (getObjectFlags(resolved) & ObjectFlags.JSLiteral);
13305
13306
(<FreshObjectLiteralType>type).regularType = regularNew;
13306
13307
return regularNew;
@@ -17637,7 +17638,7 @@ namespace ts {
17637
17638
let propertiesTable: SymbolTable;
17638
17639
let propertiesArray: Symbol[] = [];
17639
17640
let spread: Type = emptyObjectType;
17640
- let propagatedFlags: TypeFlags = TypeFlags.FreshLiteral ;
17641
+ let propagatedFlags: TypeFlags = 0 ;
17641
17642
17642
17643
const contextualType = getApparentTypeOfContextualType(node);
17643
17644
const contextualTypeHasPattern = contextualType && contextualType.pattern &&
@@ -17722,7 +17723,7 @@ namespace ts {
17722
17723
checkExternalEmitHelpers(memberDecl, ExternalEmitHelpers.Assign);
17723
17724
}
17724
17725
if (propertiesArray.length > 0) {
17725
- spread = getSpreadType(spread, createObjectLiteralType(), node.symbol, propagatedFlags, /*objectFlags*/ 0 );
17726
+ spread = getSpreadType(spread, createObjectLiteralType(), node.symbol, propagatedFlags, ObjectFlags.FreshLiteral );
17726
17727
propertiesArray = [];
17727
17728
propertiesTable = createSymbolTable();
17728
17729
hasComputedStringProperty = false;
@@ -17734,7 +17735,7 @@ namespace ts {
17734
17735
error(memberDecl, Diagnostics.Spread_types_may_only_be_created_from_object_types);
17735
17736
return errorType;
17736
17737
}
17737
- spread = getSpreadType(spread, type, node.symbol, propagatedFlags, /*objectFlags*/ 0 );
17738
+ spread = getSpreadType(spread, type, node.symbol, propagatedFlags, ObjectFlags.FreshLiteral );
17738
17739
offset = i + 1;
17739
17740
continue;
17740
17741
}
@@ -17784,7 +17785,7 @@ namespace ts {
17784
17785
17785
17786
if (spread !== emptyObjectType) {
17786
17787
if (propertiesArray.length > 0) {
17787
- spread = getSpreadType(spread, createObjectLiteralType(), node.symbol, propagatedFlags, /*objectFlags*/ 0 );
17788
+ spread = getSpreadType(spread, createObjectLiteralType(), node.symbol, propagatedFlags, ObjectFlags.FreshLiteral );
17788
17789
}
17789
17790
return spread;
17790
17791
}
@@ -17795,9 +17796,8 @@ namespace ts {
17795
17796
const stringIndexInfo = hasComputedStringProperty ? getObjectLiteralIndexInfo(node.properties, offset, propertiesArray, IndexKind.String) : undefined;
17796
17797
const numberIndexInfo = hasComputedNumberProperty ? getObjectLiteralIndexInfo(node.properties, offset, propertiesArray, IndexKind.Number) : undefined;
17797
17798
const result = createAnonymousType(node.symbol, propertiesTable, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
17798
- const freshObjectLiteralFlag = compilerOptions.suppressExcessPropertyErrors ? 0 : TypeFlags.FreshLiteral;
17799
- result.flags |= TypeFlags.ContainsObjectLiteral | freshObjectLiteralFlag | (typeFlags & TypeFlags.PropagatingFlags);
17800
- result.objectFlags |= ObjectFlags.ObjectLiteral;
17799
+ result.flags |= TypeFlags.ContainsObjectLiteral | typeFlags & TypeFlags.PropagatingFlags;
17800
+ result.objectFlags |= ObjectFlags.ObjectLiteral | freshObjectLiteralFlag;
17801
17801
if (isJSObjectLiteral) {
17802
17802
result.objectFlags |= ObjectFlags.JSLiteral;
17803
17803
}
@@ -17807,7 +17807,7 @@ namespace ts {
17807
17807
if (inDestructuringPattern) {
17808
17808
result.pattern = node;
17809
17809
}
17810
- propagatedFlags |= ( result.flags & TypeFlags.PropagatingFlags) ;
17810
+ propagatedFlags |= result.flags & TypeFlags.PropagatingFlags;
17811
17811
return result;
17812
17812
}
17813
17813
}
@@ -17898,14 +17898,15 @@ namespace ts {
17898
17898
let hasSpreadAnyType = false;
17899
17899
let typeToIntersect: Type | undefined;
17900
17900
let explicitlySpecifyChildrenAttribute = false;
17901
- let propagatingFlags: TypeFlags = 0;
17901
+ let typeFlags: TypeFlags = 0;
17902
+ let objectFlags: ObjectFlags = ObjectFlags.JsxAttributes;
17902
17903
const jsxChildrenPropertyName = getJsxElementChildrenPropertyName(getJsxNamespaceAt(openingLikeElement));
17903
17904
17904
17905
for (const attributeDecl of attributes.properties) {
17905
17906
const member = attributeDecl.symbol;
17906
17907
if (isJsxAttribute(attributeDecl)) {
17907
17908
const exprType = checkJsxAttribute(attributeDecl, checkMode);
17908
- propagatingFlags |= ( exprType.flags & TypeFlags.PropagatingFlags) ;
17909
+ typeFlags |= exprType.flags & TypeFlags.PropagatingFlags;
17909
17910
17910
17911
const attributeSymbol = createSymbol(SymbolFlags.Property | SymbolFlags.Transient | member.flags, member.escapedName);
17911
17912
attributeSymbol.declarations = member.declarations;
@@ -17923,15 +17924,15 @@ namespace ts {
17923
17924
else {
17924
17925
Debug.assert(attributeDecl.kind === SyntaxKind.JsxSpreadAttribute);
17925
17926
if (attributesTable.size > 0) {
17926
- spread = getSpreadType(spread, createJsxAttributesType(), attributes.symbol, propagatingFlags, ObjectFlags.JsxAttributes );
17927
+ spread = getSpreadType(spread, createJsxAttributesType(), attributes.symbol, typeFlags, objectFlags );
17927
17928
attributesTable = createSymbolTable();
17928
17929
}
17929
17930
const exprType = checkExpressionCached(attributeDecl.expression, checkMode);
17930
17931
if (isTypeAny(exprType)) {
17931
17932
hasSpreadAnyType = true;
17932
17933
}
17933
17934
if (isValidSpreadType(exprType)) {
17934
- spread = getSpreadType(spread, exprType, attributes.symbol, propagatingFlags, ObjectFlags.JsxAttributes );
17935
+ spread = getSpreadType(spread, exprType, attributes.symbol, typeFlags, objectFlags );
17935
17936
}
17936
17937
else {
17937
17938
typeToIntersect = typeToIntersect ? getIntersectionType([typeToIntersect, exprType]) : exprType;
@@ -17941,7 +17942,7 @@ namespace ts {
17941
17942
17942
17943
if (!hasSpreadAnyType) {
17943
17944
if (attributesTable.size > 0) {
17944
- spread = getSpreadType(spread, createJsxAttributesType(), attributes.symbol, propagatingFlags, ObjectFlags.JsxAttributes );
17945
+ spread = getSpreadType(spread, createJsxAttributesType(), attributes.symbol, typeFlags, objectFlags );
17945
17946
}
17946
17947
}
17947
17948
@@ -17969,7 +17970,7 @@ namespace ts {
17969
17970
const childPropMap = createSymbolTable();
17970
17971
childPropMap.set(jsxChildrenPropertyName, childrenPropSymbol);
17971
17972
spread = getSpreadType(spread, createAnonymousType(attributes.symbol, childPropMap, emptyArray, emptyArray, /*stringIndexInfo*/ undefined, /*numberIndexInfo*/ undefined),
17972
- attributes.symbol, propagatingFlags, ObjectFlags.JsxAttributes );
17973
+ attributes.symbol, typeFlags, objectFlags );
17973
17974
17974
17975
}
17975
17976
}
@@ -17988,10 +17989,10 @@ namespace ts {
17988
17989
* @param attributesTable a symbol table of attributes property
17989
17990
*/
17990
17991
function createJsxAttributesType() {
17992
+ objectFlags |= freshObjectLiteralFlag;
17991
17993
const result = createAnonymousType(attributes.symbol, attributesTable, emptyArray, emptyArray, /*stringIndexInfo*/ undefined, /*numberIndexInfo*/ undefined);
17992
- const freshObjectLiteralFlag = compilerOptions.suppressExcessPropertyErrors ? 0 : TypeFlags.FreshLiteral;
17993
- result.flags |= (propagatingFlags |= TypeFlags.ContainsObjectLiteral | freshObjectLiteralFlag);
17994
- result.objectFlags |= ObjectFlags.ObjectLiteral | ObjectFlags.JsxAttributes;
17994
+ result.flags |= TypeFlags.ContainsObjectLiteral | typeFlags;
17995
+ result.objectFlags |= ObjectFlags.ObjectLiteral | objectFlags;
17995
17996
return result;
17996
17997
}
17997
17998
}
0 commit comments