@zzzen/pyright-internal 1.2.0-dev.20261018 → 1.2.0-dev.20261101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analyzer/binder.js +20 -9
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.js +4 -0
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowEngine.js +3 -3
- package/dist/analyzer/codeFlowEngine.js.map +1 -1
- package/dist/analyzer/dataClasses.js +14 -5
- package/dist/analyzer/dataClasses.js.map +1 -1
- package/dist/analyzer/decorators.d.ts +1 -1
- package/dist/analyzer/decorators.js +22 -2
- package/dist/analyzer/decorators.js.map +1 -1
- package/dist/analyzer/namedTuples.d.ts +2 -1
- package/dist/analyzer/namedTuples.js +63 -35
- package/dist/analyzer/namedTuples.js.map +1 -1
- package/dist/analyzer/operations.js +45 -1
- package/dist/analyzer/operations.js.map +1 -1
- package/dist/analyzer/parseTreeUtils.d.ts +2 -0
- package/dist/analyzer/parseTreeUtils.js +43 -0
- package/dist/analyzer/parseTreeUtils.js.map +1 -1
- package/dist/analyzer/patternMatching.js +3 -1
- package/dist/analyzer/patternMatching.js.map +1 -1
- package/dist/analyzer/sentinel.js +7 -1
- package/dist/analyzer/sentinel.js.map +1 -1
- package/dist/analyzer/sourceFile.js +13 -6
- package/dist/analyzer/sourceFile.js.map +1 -1
- package/dist/analyzer/tupleComparison.d.ts +6 -0
- package/dist/analyzer/tupleComparison.js +731 -0
- package/dist/analyzer/tupleComparison.js.map +1 -0
- package/dist/analyzer/tuples.js +35 -4
- package/dist/analyzer/tuples.js.map +1 -1
- package/dist/analyzer/typeEvaluator.js +232 -20
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +1 -1
- package/dist/analyzer/typeEvaluatorTypes.js +2 -3
- package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
- package/dist/analyzer/typeGuards.d.ts +1 -0
- package/dist/analyzer/typeGuards.js +257 -41
- package/dist/analyzer/typeGuards.js.map +1 -1
- package/dist/analyzer/typeUtils.js +3 -0
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/types.d.ts +14 -0
- package/dist/analyzer/types.js +215 -10
- package/dist/analyzer/types.js.map +1 -1
- package/dist/common/processUtils.d.ts +6 -0
- package/dist/common/processUtils.js +56 -1
- package/dist/common/processUtils.js.map +1 -1
- package/dist/common/textEditTracker.js +1 -1
- package/dist/common/textEditTracker.js.map +1 -1
- package/dist/common/windowsProcessTree.d.ts +2 -0
- package/dist/common/windowsProcessTree.js +23 -0
- package/dist/common/windowsProcessTree.js.map +1 -1
- package/dist/common/windowsProcessTree.json +23 -3
- package/dist/languageServerBase.d.ts +3 -0
- package/dist/languageServerBase.js +44 -12
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/callHierarchyProvider.js +6 -6
- package/dist/languageService/callHierarchyProvider.js.map +1 -1
- package/dist/languageService/referencesProvider.js +3 -3
- package/dist/languageService/referencesProvider.js.map +1 -1
- package/dist/languageService/renameProvider.js +1 -1
- package/dist/languageService/renameProvider.js.map +1 -1
- package/dist/languageService/symbolIndexer.js +2 -2
- package/dist/languageService/symbolIndexer.js.map +1 -1
- package/dist/localization/localize.d.ts +2 -0
- package/dist/localization/localize.js +2 -0
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.en-us.json +8 -0
- package/dist/parser/parseTreeTokenReuse.d.ts +34 -0
- package/dist/parser/parseTreeTokenReuse.js +897 -0
- package/dist/parser/parseTreeTokenReuse.js.map +1 -0
- package/dist/parser/tokenizer.d.ts +10 -1
- package/dist/parser/tokenizer.js +184 -130
- package/dist/parser/tokenizer.js.map +1 -1
- package/dist/tests/checker.test.js +8 -0
- package/dist/tests/checker.test.js.map +1 -1
- package/dist/tests/fourSlashParser.test.js +35 -0
- package/dist/tests/fourSlashParser.test.js.map +1 -1
- package/dist/tests/harness/fourslash/fourSlashParser.js +14 -4
- package/dist/tests/harness/fourslash/fourSlashParser.js.map +1 -1
- package/dist/tests/languageServer.test.js +15 -0
- package/dist/tests/languageServer.test.js.map +1 -1
- package/dist/tests/lsp/languageServer.js +6 -6
- package/dist/tests/lsp/languageServer.js.map +1 -1
- package/dist/tests/mypyPrimerAnalysis.test.js +133 -0
- package/dist/tests/mypyPrimerAnalysis.test.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +3 -1
- package/dist/tests/typeEvaluator1.test.js.map +1 -1
- package/dist/tests/typeEvaluator2.test.js +54 -1
- package/dist/tests/typeEvaluator2.test.js.map +1 -1
- package/dist/tests/typeEvaluator4.test.js +10 -3
- package/dist/tests/typeEvaluator4.test.js.map +1 -1
- package/dist/tests/typeEvaluator6.test.js +35 -0
- package/dist/tests/typeEvaluator6.test.js.map +1 -1
- package/dist/tests/typeEvaluator7.test.js +20 -0
- package/dist/tests/typeEvaluator7.test.js.map +1 -1
- package/dist/tests/typeEvaluator8.test.js +1291 -1
- package/dist/tests/typeEvaluator8.test.js.map +1 -1
- package/dist/tests/types.test.js +55 -0
- package/dist/tests/types.test.js.map +1 -1
- package/dist/typeServer/programWrapper.js +8 -2
- package/dist/typeServer/programWrapper.js.map +1 -1
- package/dist/typeServer/server.d.ts +12 -2
- package/dist/typeServer/server.js +97 -0
- package/dist/typeServer/server.js.map +1 -1
- package/package.json +1 -1
package/dist/analyzer/types.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* Representation of types used during type analysis within Python.
|
|
9
9
|
*/
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
exports.TypeVarType = exports.ParamSpecType = exports.TypeVarScopeType = exports.TypeVarKind = exports.Variance = exports.UnionType = exports.TypeCondition = exports.AnyType = exports.NeverType = exports.OverloadedType = exports.FunctionType = exports.FunctionTypeFlags = exports.FunctionParam = exports.FunctionParamFlags = exports.ClassType = exports.ClassTypeFlags = exports.ModuleType = exports.OverloadResultType = exports.UnknownType = exports.UnboundType = exports.TypeBase = exports.maxTypeRecursionCount = exports.SentinelLiteral = exports.EnumLiteral = exports.UnificationScopeId = exports.TypeFlags = exports.TypeCategory = void 0;
|
|
11
|
+
exports.maxSubtypesForInferredType = exports.TypeVarType = exports.ParamSpecType = exports.TypeVarScopeType = exports.TypeVarKind = exports.Variance = exports.UnionType = exports.TypeCondition = exports.AnyType = exports.NeverType = exports.OverloadedType = exports.FunctionType = exports.FunctionTypeFlags = exports.FunctionParam = exports.FunctionParamFlags = exports.ClassType = exports.ClassTypeFlags = exports.ModuleType = exports.OverloadResultType = exports.UnknownType = exports.UnboundType = exports.TypeBase = exports.maxTypeRecursionCount = exports.SentinelLiteral = exports.EnumLiteral = exports.UnificationScopeId = exports.TypeFlags = exports.TypeCategory = void 0;
|
|
12
12
|
exports.isPositionOnlySeparator = isPositionOnlySeparator;
|
|
13
13
|
exports.isKeywordOnlySeparator = isKeywordOnlySeparator;
|
|
14
14
|
exports.isNever = isNever;
|
|
@@ -40,6 +40,11 @@ exports.removeUnknownFromUnion = removeUnknownFromUnion;
|
|
|
40
40
|
exports.removeUnbound = removeUnbound;
|
|
41
41
|
exports.removeFromUnion = removeFromUnion;
|
|
42
42
|
exports.findSubtype = findSubtype;
|
|
43
|
+
exports.getInferredTupleLiteralBase = getInferredTupleLiteralBase;
|
|
44
|
+
exports.getTupleLiteralTypeComplexity = getTupleLiteralTypeComplexity;
|
|
45
|
+
exports.retainInferredTupleLiterals = retainInferredTupleLiterals;
|
|
46
|
+
exports.preserveInferredTupleLiterals = preserveInferredTupleLiterals;
|
|
47
|
+
exports.exceedsInferredTupleLiteralProduct = exceedsInferredTupleLiteralProduct;
|
|
43
48
|
exports.combineTypes = combineTypes;
|
|
44
49
|
exports.isSameWithoutLiteralValue = isSameWithoutLiteralValue;
|
|
45
50
|
const collectionUtils_1 = require("../common/collectionUtils");
|
|
@@ -539,6 +544,16 @@ var ClassType;
|
|
|
539
544
|
if (includeSubclasses) {
|
|
540
545
|
newInstance.priv.includeSubclasses = true;
|
|
541
546
|
}
|
|
547
|
+
const inferred = newInstance.props?.inferredTupleLiteral;
|
|
548
|
+
if (inferred) {
|
|
549
|
+
const convert = (base) => isInstantiableClass(base) ? cloneAsInstance(base, includeSubclasses) : base;
|
|
550
|
+
TypeBase.addProps(newInstance).inferredTupleLiteral = {
|
|
551
|
+
...inferred,
|
|
552
|
+
baseType: isUnion(inferred.baseType)
|
|
553
|
+
? combineTypes(inferred.baseType.priv.subtypes.map(convert))
|
|
554
|
+
: convert(inferred.baseType),
|
|
555
|
+
};
|
|
556
|
+
}
|
|
542
557
|
return newInstance;
|
|
543
558
|
}
|
|
544
559
|
ClassType.cloneAsInstance = cloneAsInstance;
|
|
@@ -550,6 +565,16 @@ var ClassType;
|
|
|
550
565
|
if (includeSubclasses) {
|
|
551
566
|
newInstance.priv.includeSubclasses = true;
|
|
552
567
|
}
|
|
568
|
+
const inferred = newInstance.props?.inferredTupleLiteral;
|
|
569
|
+
if (inferred) {
|
|
570
|
+
const convert = (base) => isClassInstance(base) ? cloneAsInstantiable(base, includeSubclasses) : base;
|
|
571
|
+
TypeBase.addProps(newInstance).inferredTupleLiteral = {
|
|
572
|
+
...inferred,
|
|
573
|
+
baseType: isUnion(inferred.baseType)
|
|
574
|
+
? combineTypes(inferred.baseType.priv.subtypes.map(convert))
|
|
575
|
+
: convert(inferred.baseType),
|
|
576
|
+
};
|
|
577
|
+
}
|
|
553
578
|
return newInstance;
|
|
554
579
|
}
|
|
555
580
|
ClassType.cloneAsInstantiable = cloneAsInstantiable;
|
|
@@ -569,6 +594,35 @@ var ClassType;
|
|
|
569
594
|
if (isEmptyContainer !== undefined) {
|
|
570
595
|
newClassType.priv.isEmptyContainer = isEmptyContainer;
|
|
571
596
|
}
|
|
597
|
+
const inferredTupleLiteral = classType.props?.inferredTupleLiteral;
|
|
598
|
+
const hasInferredEntries = tupleTypeArgs
|
|
599
|
+
? tupleTypeArgs.some((arg) => arg.type.props?.inferredTupleLiteral)
|
|
600
|
+
: typeArgs?.some((type) => type.props?.inferredTupleLiteral);
|
|
601
|
+
const unchangedTupleArgs = (inferredTupleLiteral || hasInferredEntries) &&
|
|
602
|
+
tupleTypeArgs &&
|
|
603
|
+
tupleTypeArgs.length === classType.priv.tupleTypeArgs?.length &&
|
|
604
|
+
tupleTypeArgs.every((arg, index) => arg.type === classType.priv.tupleTypeArgs[index].type &&
|
|
605
|
+
arg.isUnbounded === classType.priv.tupleTypeArgs[index].isUnbounded &&
|
|
606
|
+
arg.isOptional === classType.priv.tupleTypeArgs[index].isOptional);
|
|
607
|
+
if (inferredTupleLiteral && !unchangedTupleArgs) {
|
|
608
|
+
TypeBase.addProps(newClassType).inferredTupleLiteral = undefined;
|
|
609
|
+
}
|
|
610
|
+
if (hasInferredEntries && !unchangedTupleArgs) {
|
|
611
|
+
const baseType = TypeBase.cloneType(newClassType);
|
|
612
|
+
TypeBase.addProps(baseType).inferredTupleLiteral = undefined;
|
|
613
|
+
baseType.priv.typeArgs = typeArgs?.map(getInferredTupleLiteralBase);
|
|
614
|
+
baseType.priv.tupleTypeArgs = tupleTypeArgs?.map((arg) => ({
|
|
615
|
+
...arg,
|
|
616
|
+
type: getInferredTupleLiteralBase(arg.type),
|
|
617
|
+
}));
|
|
618
|
+
const complexity = ClassType.isBuiltIn(newClassType, 'tuple')
|
|
619
|
+
? getTupleLiteralTypeComplexity([newClassType])
|
|
620
|
+
: undefined;
|
|
621
|
+
if (!complexity) {
|
|
622
|
+
return baseType;
|
|
623
|
+
}
|
|
624
|
+
TypeBase.addProps(newClassType).inferredTupleLiteral = { baseType, ...complexity };
|
|
625
|
+
}
|
|
572
626
|
return newClassType;
|
|
573
627
|
}
|
|
574
628
|
ClassType.specialize = specialize;
|
|
@@ -584,6 +638,9 @@ var ClassType;
|
|
|
584
638
|
function cloneWithLiteral(classType, value) {
|
|
585
639
|
const newClassType = TypeBase.cloneType(classType);
|
|
586
640
|
newClassType.priv.literalValue = value;
|
|
641
|
+
if (value === undefined && newClassType.props?.inferredTupleLiteral) {
|
|
642
|
+
TypeBase.addProps(newClassType).inferredTupleLiteral = undefined;
|
|
643
|
+
}
|
|
587
644
|
// Remove type alias information because the type will no longer match
|
|
588
645
|
// that of the type alias definition if we change the literal type.
|
|
589
646
|
if (newClassType.props?.typeAliasInfo) {
|
|
@@ -2765,11 +2822,132 @@ function findSubtype(type, filter) {
|
|
|
2765
2822
|
}
|
|
2766
2823
|
return filter(type) ? type : undefined;
|
|
2767
2824
|
}
|
|
2825
|
+
exports.maxSubtypesForInferredType = 64;
|
|
2826
|
+
function getInferredTupleLiteralBase(type) {
|
|
2827
|
+
return type.props?.inferredTupleLiteral?.baseType ?? type;
|
|
2828
|
+
}
|
|
2829
|
+
// Bound both the representation and its possible combinations before building unions.
|
|
2830
|
+
function getTupleLiteralTypeComplexity(types, isUnionCombination = false) {
|
|
2831
|
+
let size = 0;
|
|
2832
|
+
const visit = (type, depth) => {
|
|
2833
|
+
if (++size > exports.maxSubtypesForInferredType || depth > exports.maxTypeRecursionCount) {
|
|
2834
|
+
return undefined;
|
|
2835
|
+
}
|
|
2836
|
+
if (isUnion(type)) {
|
|
2837
|
+
let alternatives = 0;
|
|
2838
|
+
for (const subtype of type.priv.subtypes) {
|
|
2839
|
+
const count = visit(subtype, depth + 1);
|
|
2840
|
+
if (count === undefined || (alternatives += count) > exports.maxSubtypesForInferredType) {
|
|
2841
|
+
return undefined;
|
|
2842
|
+
}
|
|
2843
|
+
}
|
|
2844
|
+
return alternatives;
|
|
2845
|
+
}
|
|
2846
|
+
if (!isClass(type)) {
|
|
2847
|
+
return undefined;
|
|
2848
|
+
}
|
|
2849
|
+
if (ClassType.isBuiltIn(type, 'tuple') && type.priv.tupleTypeArgs) {
|
|
2850
|
+
let alternatives = 1;
|
|
2851
|
+
for (const arg of type.priv.tupleTypeArgs) {
|
|
2852
|
+
if (arg.isUnbounded || arg.isOptional) {
|
|
2853
|
+
return undefined;
|
|
2854
|
+
}
|
|
2855
|
+
const count = visit(arg.type, depth + 1);
|
|
2856
|
+
if (count === undefined || (alternatives *= count) > exports.maxSubtypesForInferredType) {
|
|
2857
|
+
return undefined;
|
|
2858
|
+
}
|
|
2859
|
+
}
|
|
2860
|
+
return alternatives;
|
|
2861
|
+
}
|
|
2862
|
+
return type.priv.typeArgs?.length ? undefined : 1;
|
|
2863
|
+
};
|
|
2864
|
+
let alternatives = isUnionCombination ? 0 : 1;
|
|
2865
|
+
for (const type of types) {
|
|
2866
|
+
const count = visit(type, 0);
|
|
2867
|
+
if (count === undefined) {
|
|
2868
|
+
return undefined;
|
|
2869
|
+
}
|
|
2870
|
+
alternatives = isUnionCombination ? alternatives + count : alternatives * count;
|
|
2871
|
+
if (alternatives > exports.maxSubtypesForInferredType) {
|
|
2872
|
+
return undefined;
|
|
2873
|
+
}
|
|
2874
|
+
}
|
|
2875
|
+
return { size, alternatives };
|
|
2876
|
+
}
|
|
2877
|
+
function retainInferredTupleLiterals(type, baseType) {
|
|
2878
|
+
if (type === baseType) {
|
|
2879
|
+
return baseType;
|
|
2880
|
+
}
|
|
2881
|
+
const complexity = getTupleLiteralTypeComplexity([type]);
|
|
2882
|
+
if (!complexity || isTypeSame(type, baseType)) {
|
|
2883
|
+
return baseType;
|
|
2884
|
+
}
|
|
2885
|
+
if (isUnion(type) &&
|
|
2886
|
+
type.priv.subtypes.some((subtype) => isClass(subtype) && subtype.priv.literalValue !== undefined)) {
|
|
2887
|
+
type = _combineTypes(type.priv.subtypes.map((subtype) => isClass(subtype) && subtype.priv.literalValue !== undefined
|
|
2888
|
+
? retainInferredTupleLiterals(subtype, ClassType.cloneWithLiteral(subtype, /* value */ undefined))
|
|
2889
|
+
: subtype));
|
|
2890
|
+
}
|
|
2891
|
+
const retainedType = TypeBase.cloneType(type);
|
|
2892
|
+
TypeBase.addProps(retainedType).inferredTupleLiteral = { baseType, ...complexity };
|
|
2893
|
+
return retainedType;
|
|
2894
|
+
}
|
|
2895
|
+
// A validated annotation opts into its literal precision, independently of inference.
|
|
2896
|
+
function preserveInferredTupleLiterals(type) {
|
|
2897
|
+
if (!type.props?.inferredTupleLiteral) {
|
|
2898
|
+
return type;
|
|
2899
|
+
}
|
|
2900
|
+
if (isUnion(type)) {
|
|
2901
|
+
return combineTypes(type.priv.subtypes.map(preserveInferredTupleLiterals));
|
|
2902
|
+
}
|
|
2903
|
+
const result = TypeBase.cloneType(type);
|
|
2904
|
+
TypeBase.addProps(result).inferredTupleLiteral = undefined;
|
|
2905
|
+
if (isClass(result)) {
|
|
2906
|
+
result.priv.typeArgs = result.priv.typeArgs?.map(preserveInferredTupleLiterals);
|
|
2907
|
+
result.priv.tupleTypeArgs = result.priv.tupleTypeArgs?.map((arg) => ({
|
|
2908
|
+
...arg,
|
|
2909
|
+
type: preserveInferredTupleLiterals(arg.type),
|
|
2910
|
+
}));
|
|
2911
|
+
}
|
|
2912
|
+
return result;
|
|
2913
|
+
}
|
|
2914
|
+
function exceedsInferredTupleLiteralProduct(left, right) {
|
|
2915
|
+
const leftInfo = left.props?.inferredTupleLiteral;
|
|
2916
|
+
const rightInfo = right.props?.inferredTupleLiteral;
|
|
2917
|
+
if (!leftInfo && !rightInfo) {
|
|
2918
|
+
return false;
|
|
2919
|
+
}
|
|
2920
|
+
const leftCount = leftInfo?.alternatives ?? getTupleLiteralTypeComplexity([left])?.alternatives;
|
|
2921
|
+
const rightCount = rightInfo?.alternatives ?? getTupleLiteralTypeComplexity([right])?.alternatives;
|
|
2922
|
+
return leftCount === undefined || rightCount === undefined || leftCount * rightCount > exports.maxSubtypesForInferredType;
|
|
2923
|
+
}
|
|
2768
2924
|
// Combines multiple types into a single type. If the types are
|
|
2769
2925
|
// the same, only one is returned. If they differ, they
|
|
2770
2926
|
// are combined into a UnionType. NeverTypes are filtered out.
|
|
2771
2927
|
// If no types remain in the end, a NeverType is returned.
|
|
2772
2928
|
function combineTypes(subtypes, options) {
|
|
2929
|
+
if (subtypes.length === 1) {
|
|
2930
|
+
return subtypes[0];
|
|
2931
|
+
}
|
|
2932
|
+
if (!subtypes.some((type) => type.props?.inferredTupleLiteral)) {
|
|
2933
|
+
return _combineTypes(subtypes, options);
|
|
2934
|
+
}
|
|
2935
|
+
if (subtypes.every((type) => type === subtypes[0])) {
|
|
2936
|
+
return subtypes[0];
|
|
2937
|
+
}
|
|
2938
|
+
const baseType = _combineTypes(subtypes.map(getInferredTupleLiteralBase), options);
|
|
2939
|
+
const complexity = getTupleLiteralTypeComplexity(subtypes, /* isUnion */ true);
|
|
2940
|
+
if (!complexity) {
|
|
2941
|
+
return baseType;
|
|
2942
|
+
}
|
|
2943
|
+
const structuralCount = subtypes.reduce((count, type) => count +
|
|
2944
|
+
(isUnion(type) ? type.priv.subtypes : [type]).filter((subtype) => isClass(subtype) && !!subtype.priv.tupleTypeArgs).length, 0);
|
|
2945
|
+
if ((structuralCount * (structuralCount - 1)) / 2 > exports.maxSubtypesForInferredType) {
|
|
2946
|
+
return baseType;
|
|
2947
|
+
}
|
|
2948
|
+
return retainInferredTupleLiterals(_combineTypes(subtypes, options), baseType);
|
|
2949
|
+
}
|
|
2950
|
+
function _combineTypes(subtypes, options) {
|
|
2773
2951
|
let neverTypes;
|
|
2774
2952
|
// Filter out any Never or NoReturn types.
|
|
2775
2953
|
[neverTypes, subtypes] = (0, collectionUtils_1.partition)(subtypes, isNever);
|
|
@@ -2898,26 +3076,20 @@ function _addTypeIfUnique(unionType, typeToAdd, elideRedundantLiterals) {
|
|
|
2898
3076
|
if (ClassType.isBuiltIn(typeToAdd, 'str') &&
|
|
2899
3077
|
typeToAdd.priv.literalValue !== undefined &&
|
|
2900
3078
|
literalMaps.literalStrMap !== undefined) {
|
|
2901
|
-
|
|
2902
|
-
UnionType.addType(unionType, typeToAdd);
|
|
2903
|
-
}
|
|
3079
|
+
_addLiteralTypeIfUnique(unionType, literalMaps.literalStrMap, typeToAdd.priv.literalValue, typeToAdd);
|
|
2904
3080
|
return;
|
|
2905
3081
|
}
|
|
2906
3082
|
else if (ClassType.isBuiltIn(typeToAdd, 'int') &&
|
|
2907
3083
|
typeToAdd.priv.literalValue !== undefined &&
|
|
2908
3084
|
literalMaps.literalIntMap !== undefined) {
|
|
2909
|
-
|
|
2910
|
-
UnionType.addType(unionType, typeToAdd);
|
|
2911
|
-
}
|
|
3085
|
+
_addLiteralTypeIfUnique(unionType, literalMaps.literalIntMap, typeToAdd.priv.literalValue, typeToAdd);
|
|
2912
3086
|
return;
|
|
2913
3087
|
}
|
|
2914
3088
|
else if (ClassType.isEnumClass(typeToAdd) &&
|
|
2915
3089
|
typeToAdd.priv.literalValue !== undefined &&
|
|
2916
3090
|
literalMaps.literalEnumMap !== undefined) {
|
|
2917
3091
|
const enumLiteral = typeToAdd.priv.literalValue;
|
|
2918
|
-
|
|
2919
|
-
UnionType.addType(unionType, typeToAdd);
|
|
2920
|
-
}
|
|
3092
|
+
_addLiteralTypeIfUnique(unionType, literalMaps.literalEnumMap, enumLiteral.getName(), typeToAdd);
|
|
2921
3093
|
return;
|
|
2922
3094
|
}
|
|
2923
3095
|
}
|
|
@@ -2933,6 +3105,7 @@ function _addTypeIfUnique(unionType, typeToAdd, elideRedundantLiterals) {
|
|
|
2933
3105
|
}
|
|
2934
3106
|
// Does this type already exist in the types array?
|
|
2935
3107
|
if (isTypeSame(type, typeToAdd, { honorTypeForm: true })) {
|
|
3108
|
+
unionType.priv.subtypes[i] = _mergeInferredTupleLiterals(type, typeToAdd);
|
|
2936
3109
|
return;
|
|
2937
3110
|
}
|
|
2938
3111
|
// Handle the case where pseudo-generic classes with different
|
|
@@ -2999,4 +3172,36 @@ function _addTypeIfUnique(unionType, typeToAdd, elideRedundantLiterals) {
|
|
|
2999
3172
|
}
|
|
3000
3173
|
UnionType.addType(unionType, typeToAdd);
|
|
3001
3174
|
}
|
|
3175
|
+
function _addLiteralTypeIfUnique(unionType, literalMap, key, typeToAdd) {
|
|
3176
|
+
const previous = literalMap.get(key);
|
|
3177
|
+
if (!previous) {
|
|
3178
|
+
UnionType.addType(unionType, typeToAdd);
|
|
3179
|
+
}
|
|
3180
|
+
else if (previous.props?.inferredTupleLiteral || typeToAdd.props?.inferredTupleLiteral) {
|
|
3181
|
+
const merged = _mergeInferredTupleLiterals(previous, typeToAdd);
|
|
3182
|
+
unionType.priv.subtypes[unionType.priv.subtypes.indexOf(previous)] = merged;
|
|
3183
|
+
literalMap.set(key, merged);
|
|
3184
|
+
}
|
|
3185
|
+
}
|
|
3186
|
+
function _mergeInferredTupleLiterals(type, other) {
|
|
3187
|
+
if (type === other ||
|
|
3188
|
+
(!type.props?.inferredTupleLiteral && !other.props?.inferredTupleLiteral) ||
|
|
3189
|
+
!isClass(type) ||
|
|
3190
|
+
!isClass(other)) {
|
|
3191
|
+
return type;
|
|
3192
|
+
}
|
|
3193
|
+
const result = TypeBase.cloneType(type);
|
|
3194
|
+
result.priv.typeArgs = type.priv.typeArgs?.map((arg, index) => combineTypes([arg, other.priv.typeArgs?.[index] ?? arg]));
|
|
3195
|
+
result.priv.tupleTypeArgs = type.priv.tupleTypeArgs?.map((arg, index) => ({
|
|
3196
|
+
...arg,
|
|
3197
|
+
type: combineTypes([arg.type, other.priv.tupleTypeArgs?.[index].type ?? arg.type]),
|
|
3198
|
+
}));
|
|
3199
|
+
const complexity = getTupleLiteralTypeComplexity([result]);
|
|
3200
|
+
(0, debug_1.assert)(complexity !== undefined);
|
|
3201
|
+
TypeBase.addProps(result).inferredTupleLiteral = {
|
|
3202
|
+
baseType: combineTypes([getInferredTupleLiteralBase(type), getInferredTupleLiteralBase(other)]),
|
|
3203
|
+
...complexity,
|
|
3204
|
+
};
|
|
3205
|
+
return result;
|
|
3206
|
+
}
|
|
3002
3207
|
//# sourceMappingURL=types.js.map
|