@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.
Files changed (105) hide show
  1. package/dist/analyzer/binder.js +20 -9
  2. package/dist/analyzer/binder.js.map +1 -1
  3. package/dist/analyzer/checker.js +4 -0
  4. package/dist/analyzer/checker.js.map +1 -1
  5. package/dist/analyzer/codeFlowEngine.js +3 -3
  6. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  7. package/dist/analyzer/dataClasses.js +14 -5
  8. package/dist/analyzer/dataClasses.js.map +1 -1
  9. package/dist/analyzer/decorators.d.ts +1 -1
  10. package/dist/analyzer/decorators.js +22 -2
  11. package/dist/analyzer/decorators.js.map +1 -1
  12. package/dist/analyzer/namedTuples.d.ts +2 -1
  13. package/dist/analyzer/namedTuples.js +63 -35
  14. package/dist/analyzer/namedTuples.js.map +1 -1
  15. package/dist/analyzer/operations.js +45 -1
  16. package/dist/analyzer/operations.js.map +1 -1
  17. package/dist/analyzer/parseTreeUtils.d.ts +2 -0
  18. package/dist/analyzer/parseTreeUtils.js +43 -0
  19. package/dist/analyzer/parseTreeUtils.js.map +1 -1
  20. package/dist/analyzer/patternMatching.js +3 -1
  21. package/dist/analyzer/patternMatching.js.map +1 -1
  22. package/dist/analyzer/sentinel.js +7 -1
  23. package/dist/analyzer/sentinel.js.map +1 -1
  24. package/dist/analyzer/sourceFile.js +13 -6
  25. package/dist/analyzer/sourceFile.js.map +1 -1
  26. package/dist/analyzer/tupleComparison.d.ts +6 -0
  27. package/dist/analyzer/tupleComparison.js +731 -0
  28. package/dist/analyzer/tupleComparison.js.map +1 -0
  29. package/dist/analyzer/tuples.js +35 -4
  30. package/dist/analyzer/tuples.js.map +1 -1
  31. package/dist/analyzer/typeEvaluator.js +232 -20
  32. package/dist/analyzer/typeEvaluator.js.map +1 -1
  33. package/dist/analyzer/typeEvaluatorTypes.d.ts +1 -1
  34. package/dist/analyzer/typeEvaluatorTypes.js +2 -3
  35. package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
  36. package/dist/analyzer/typeGuards.d.ts +1 -0
  37. package/dist/analyzer/typeGuards.js +257 -41
  38. package/dist/analyzer/typeGuards.js.map +1 -1
  39. package/dist/analyzer/typeUtils.js +3 -0
  40. package/dist/analyzer/typeUtils.js.map +1 -1
  41. package/dist/analyzer/types.d.ts +14 -0
  42. package/dist/analyzer/types.js +215 -10
  43. package/dist/analyzer/types.js.map +1 -1
  44. package/dist/common/processUtils.d.ts +6 -0
  45. package/dist/common/processUtils.js +56 -1
  46. package/dist/common/processUtils.js.map +1 -1
  47. package/dist/common/textEditTracker.js +1 -1
  48. package/dist/common/textEditTracker.js.map +1 -1
  49. package/dist/common/windowsProcessTree.d.ts +2 -0
  50. package/dist/common/windowsProcessTree.js +23 -0
  51. package/dist/common/windowsProcessTree.js.map +1 -1
  52. package/dist/common/windowsProcessTree.json +23 -3
  53. package/dist/languageServerBase.d.ts +3 -0
  54. package/dist/languageServerBase.js +44 -12
  55. package/dist/languageServerBase.js.map +1 -1
  56. package/dist/languageService/callHierarchyProvider.js +6 -6
  57. package/dist/languageService/callHierarchyProvider.js.map +1 -1
  58. package/dist/languageService/referencesProvider.js +3 -3
  59. package/dist/languageService/referencesProvider.js.map +1 -1
  60. package/dist/languageService/renameProvider.js +1 -1
  61. package/dist/languageService/renameProvider.js.map +1 -1
  62. package/dist/languageService/symbolIndexer.js +2 -2
  63. package/dist/languageService/symbolIndexer.js.map +1 -1
  64. package/dist/localization/localize.d.ts +2 -0
  65. package/dist/localization/localize.js +2 -0
  66. package/dist/localization/localize.js.map +1 -1
  67. package/dist/localization/package.nls.en-us.json +8 -0
  68. package/dist/parser/parseTreeTokenReuse.d.ts +34 -0
  69. package/dist/parser/parseTreeTokenReuse.js +897 -0
  70. package/dist/parser/parseTreeTokenReuse.js.map +1 -0
  71. package/dist/parser/tokenizer.d.ts +10 -1
  72. package/dist/parser/tokenizer.js +184 -130
  73. package/dist/parser/tokenizer.js.map +1 -1
  74. package/dist/tests/checker.test.js +8 -0
  75. package/dist/tests/checker.test.js.map +1 -1
  76. package/dist/tests/fourSlashParser.test.js +35 -0
  77. package/dist/tests/fourSlashParser.test.js.map +1 -1
  78. package/dist/tests/harness/fourslash/fourSlashParser.js +14 -4
  79. package/dist/tests/harness/fourslash/fourSlashParser.js.map +1 -1
  80. package/dist/tests/languageServer.test.js +15 -0
  81. package/dist/tests/languageServer.test.js.map +1 -1
  82. package/dist/tests/lsp/languageServer.js +6 -6
  83. package/dist/tests/lsp/languageServer.js.map +1 -1
  84. package/dist/tests/mypyPrimerAnalysis.test.js +133 -0
  85. package/dist/tests/mypyPrimerAnalysis.test.js.map +1 -1
  86. package/dist/tests/typeEvaluator1.test.js +3 -1
  87. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  88. package/dist/tests/typeEvaluator2.test.js +54 -1
  89. package/dist/tests/typeEvaluator2.test.js.map +1 -1
  90. package/dist/tests/typeEvaluator4.test.js +10 -3
  91. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  92. package/dist/tests/typeEvaluator6.test.js +35 -0
  93. package/dist/tests/typeEvaluator6.test.js.map +1 -1
  94. package/dist/tests/typeEvaluator7.test.js +20 -0
  95. package/dist/tests/typeEvaluator7.test.js.map +1 -1
  96. package/dist/tests/typeEvaluator8.test.js +1291 -1
  97. package/dist/tests/typeEvaluator8.test.js.map +1 -1
  98. package/dist/tests/types.test.js +55 -0
  99. package/dist/tests/types.test.js.map +1 -1
  100. package/dist/typeServer/programWrapper.js +8 -2
  101. package/dist/typeServer/programWrapper.js.map +1 -1
  102. package/dist/typeServer/server.d.ts +12 -2
  103. package/dist/typeServer/server.js +97 -0
  104. package/dist/typeServer/server.js.map +1 -1
  105. package/package.json +1 -1
@@ -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
- if (!literalMaps.literalStrMap.has(typeToAdd.priv.literalValue)) {
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
- if (!literalMaps.literalIntMap.has(typeToAdd.priv.literalValue)) {
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
- if (!literalMaps.literalEnumMap.has(enumLiteral.getName())) {
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