@zzzen/pyright-internal 1.2.0-dev.20230604 → 1.2.0-dev.20230611

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 (78) hide show
  1. package/dist/analyzer/checker.js +42 -29
  2. package/dist/analyzer/checker.js.map +1 -1
  3. package/dist/analyzer/constraintSolver.js +13 -10
  4. package/dist/analyzer/constraintSolver.js.map +1 -1
  5. package/dist/analyzer/importResolver.d.ts +2 -0
  6. package/dist/analyzer/importResolver.js +57 -35
  7. package/dist/analyzer/importResolver.js.map +1 -1
  8. package/dist/analyzer/operations.js +2 -0
  9. package/dist/analyzer/operations.js.map +1 -1
  10. package/dist/analyzer/program.js +10 -8
  11. package/dist/analyzer/program.js.map +1 -1
  12. package/dist/analyzer/protocols.js +182 -183
  13. package/dist/analyzer/protocols.js.map +1 -1
  14. package/dist/analyzer/service.js +13 -0
  15. package/dist/analyzer/service.js.map +1 -1
  16. package/dist/analyzer/typeEvaluator.js +65 -64
  17. package/dist/analyzer/typeEvaluator.js.map +1 -1
  18. package/dist/analyzer/typeEvaluatorTypes.d.ts +2 -0
  19. package/dist/analyzer/typeUtils.d.ts +11 -11
  20. package/dist/analyzer/typeUtils.js +106 -64
  21. package/dist/analyzer/typeUtils.js.map +1 -1
  22. package/dist/backgroundAnalysisBase.d.ts +1 -1
  23. package/dist/backgroundAnalysisBase.js +2 -2
  24. package/dist/backgroundAnalysisBase.js.map +1 -1
  25. package/dist/backgroundThreadBase.d.ts +12 -9
  26. package/dist/backgroundThreadBase.js +28 -20
  27. package/dist/backgroundThreadBase.js.map +1 -1
  28. package/dist/common/charCodes.d.ts +147 -0
  29. package/dist/common/charCodes.js +164 -0
  30. package/dist/common/charCodes.js.map +1 -0
  31. package/dist/common/fileSystem.d.ts +1 -0
  32. package/dist/common/fileSystem.js.map +1 -1
  33. package/dist/common/pathUtils.js.map +1 -1
  34. package/dist/common/realFileSystem.js +3 -0
  35. package/dist/common/realFileSystem.js.map +1 -1
  36. package/dist/languageServerBase.d.ts +3 -3
  37. package/dist/languageServerBase.js +2 -2
  38. package/dist/languageServerBase.js.map +1 -1
  39. package/dist/languageService/definitionProvider.d.ts +2 -0
  40. package/dist/languageService/definitionProvider.js +82 -74
  41. package/dist/languageService/definitionProvider.js.map +1 -1
  42. package/dist/languageService/hoverProvider.d.ts +16 -8
  43. package/dist/languageService/hoverProvider.js +53 -53
  44. package/dist/languageService/hoverProvider.js.map +1 -1
  45. package/dist/localization/localize.d.ts +6 -6
  46. package/dist/localization/localize.js +2 -3
  47. package/dist/localization/localize.js.map +1 -1
  48. package/dist/localization/package.nls.en-us.json +2 -3
  49. package/dist/parser/characterStream.js.map +1 -1
  50. package/dist/parser/characters.js.map +1 -1
  51. package/dist/parser/stringTokenUtils.js.map +1 -1
  52. package/dist/parser/tokenizer.js +10 -1
  53. package/dist/parser/tokenizer.js.map +1 -1
  54. package/dist/pyrightFileSystem.d.ts +1 -0
  55. package/dist/pyrightFileSystem.js +3 -0
  56. package/dist/pyrightFileSystem.js.map +1 -1
  57. package/dist/readonlyAugmentedFileSystem.d.ts +1 -0
  58. package/dist/readonlyAugmentedFileSystem.js +3 -0
  59. package/dist/readonlyAugmentedFileSystem.js.map +1 -1
  60. package/dist/tests/checker.test.js +1 -1
  61. package/dist/tests/harness/fourslash/testLanguageService.d.ts +1 -0
  62. package/dist/tests/harness/fourslash/testLanguageService.js +3 -0
  63. package/dist/tests/harness/fourslash/testLanguageService.js.map +1 -1
  64. package/dist/tests/harness/fourslash/testState.js +2 -2
  65. package/dist/tests/harness/fourslash/testState.js.map +1 -1
  66. package/dist/tests/harness/vfs/filesystem.d.ts +12 -1
  67. package/dist/tests/harness/vfs/filesystem.js +33 -6
  68. package/dist/tests/harness/vfs/filesystem.js.map +1 -1
  69. package/dist/tests/tokenizer.test.js +13 -2
  70. package/dist/tests/tokenizer.test.js.map +1 -1
  71. package/dist/tests/typeEvaluator1.test.js +5 -1
  72. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  73. package/dist/tests/typeEvaluator3.test.js +5 -1
  74. package/dist/tests/typeEvaluator3.test.js.map +1 -1
  75. package/dist/workspaceFactory.d.ts +2 -0
  76. package/dist/workspaceFactory.js +11 -2
  77. package/dist/workspaceFactory.js.map +1 -1
  78. package/package.json +1 -2
@@ -236,6 +236,7 @@ export interface TypeEvaluator {
236
236
  verifyRaiseExceptionType: (node: RaiseNode) => void;
237
237
  verifyDeleteExpression: (node: ExpressionNode) => void;
238
238
  validateOverloadedFunctionArguments: (errorNode: ExpressionNode, argList: FunctionArgument[], typeResult: TypeResult<OverloadedFunctionType>, typeVarContext: TypeVarContext | undefined, skipUnknownArgCheck: boolean, inferenceContext: InferenceContext | undefined) => CallResult;
239
+ validateInitSubclassArgs: (node: ClassNode, classType: ClassType) => void;
239
240
  isAfterNodeReachable: (node: ParseNode) => boolean;
240
241
  isNodeReachable: (node: ParseNode, sourceNode?: ParseNode | undefined) => boolean;
241
242
  isAsymmetricDescriptorAssignment: (node: ParseNode) => boolean;
@@ -285,6 +286,7 @@ export interface TypeEvaluator {
285
286
  inferReturnTypeIfNecessary: (type: Type) => void;
286
287
  inferTypeParameterVarianceForClass: (type: ClassType) => void;
287
288
  verifyTypeArgumentsAssignable: (destType: ClassType, srcType: ClassType, diag: DiagnosticAddendum | undefined, destTypeVarContext: TypeVarContext | undefined, srcTypeVarContext: TypeVarContext | undefined, flags: AssignTypeFlags, recursionCount: number) => boolean;
289
+ reportMissingTypeArguments: (node: ExpressionNode, type: Type, flags: EvaluatorFlags) => Type;
288
290
  isFinalVariable: (symbol: Symbol) => boolean;
289
291
  isFinalVariableDeclaration: (decl: Declaration) => boolean;
290
292
  isExplicitTypeAliasDeclaration: (decl: Declaration) => boolean;
@@ -52,23 +52,24 @@ export interface ApplyTypeVarOptions {
52
52
  export interface InferenceContext {
53
53
  expectedType: Type;
54
54
  isTypeIncomplete?: boolean;
55
+ signatureTracker?: UniqueSignatureTracker;
55
56
  }
56
- export interface SignatureWithCount {
57
+ export interface SignatureWithOffsets {
57
58
  type: FunctionType;
58
- count: number;
59
+ expressionOffsets: number[];
59
60
  }
60
61
  export declare class UniqueSignatureTracker {
61
- signaturesSeen: SignatureWithCount[];
62
+ private _signaturesSeen;
62
63
  constructor();
63
- findSignature(signature: FunctionType): SignatureWithCount | undefined;
64
- addSignature(signature: FunctionType): void;
64
+ findSignature(signature: FunctionType): SignatureWithOffsets | undefined;
65
+ addSignature(signature: FunctionType, offset: number): void;
65
66
  }
66
67
  export declare function isOptionalType(type: Type): boolean;
67
68
  export declare function isIncompleteUnknown(type: Type): boolean;
68
69
  export declare function isTypeVarSame(type1: TypeVarType, type2: Type): boolean;
69
- export declare function makeInferenceContext(expectedType: undefined, isTypeIncomplete?: boolean): undefined;
70
- export declare function makeInferenceContext(expectedType: Type, isTypeIncomplete?: boolean): InferenceContext;
71
- export declare function makeInferenceContext(expectedType: Type | undefined, isTypeIncomplete?: boolean): InferenceContext | undefined;
70
+ export declare function makeInferenceContext(expectedType: undefined, isTypeIncomplete?: boolean, signatureTracker?: UniqueSignatureTracker): undefined;
71
+ export declare function makeInferenceContext(expectedType: Type, isTypeIncomplete?: boolean, signatureTracker?: UniqueSignatureTracker): InferenceContext;
72
+ export declare function makeInferenceContext(expectedType: Type | undefined, isTypeIncomplete?: boolean, signatureTracker?: UniqueSignatureTracker): InferenceContext | undefined;
72
73
  export declare function mapSubtypes(type: Type, callback: (type: Type) => Type | undefined): Type;
73
74
  export declare function sortTypes(types: Type[]): Type[];
74
75
  export declare function doForEachSubtype(type: Type, callback: (type: Type, index: number, allSubtypes: Type[]) => void, sortSubtypes?: boolean): void;
@@ -100,7 +101,7 @@ export declare function isTupleClass(type: ClassType): boolean;
100
101
  export declare function isUnboundedTupleClass(type: ClassType): boolean | undefined;
101
102
  export declare function partiallySpecializeType(type: Type, contextClassType: ClassType, selfClass?: ClassType, typeClassType?: Type): Type;
102
103
  export declare function populateTypeVarContextForSelfType(typeVarContext: TypeVarContext, contextClassType: ClassType, selfClass: ClassType): void;
103
- export declare function ensureFunctionSignaturesAreUnique(type: Type, signatureTracker: UniqueSignatureTracker): Type;
104
+ export declare function ensureFunctionSignaturesAreUnique(type: Type, signatureTracker: UniqueSignatureTracker, expressionOffset: number): Type;
104
105
  export declare function applySolvedTypeVars(type: Type, typeVarContext: TypeVarContext, options?: ApplyTypeVarOptions): Type;
105
106
  export declare function applySourceContextTypeVars(destContext: TypeVarContext, srcContext: TypeVarContext): void;
106
107
  export declare function applySourceContextTypeVarsToSignature(destSignature: TypeVarSignatureContext, srcContext: TypeVarContext): void;
@@ -135,11 +136,10 @@ export declare function convertToInstantiable(type: Type): Type;
135
136
  export declare function getMembersForClass(classType: ClassType, symbolTable: SymbolTable, includeInstanceVars: boolean): void;
136
137
  export declare function getMembersForModule(moduleType: ModuleType, symbolTable: SymbolTable): void;
137
138
  export declare function containsAnyOrUnknown(type: Type, recurse: boolean): AnyType | UnknownType | undefined;
138
- export declare function isPartlyUnknown(type: Type, allowUnknownTypeArgsForClasses?: boolean): boolean;
139
+ export declare function isPartlyUnknown(type: Type, allowUnknownTypeArgsForClasses?: boolean, recursionCount?: number): boolean;
139
140
  export declare function explodeGenericClass(classType: ClassType): Type;
140
141
  export declare function combineSameSizedTuples(type: Type, tupleType: Type | undefined): Type;
141
142
  export declare function specializeTupleClass(classType: ClassType, typeArgs: TupleTypeArgument[], isTypeArgumentExplicit?: boolean, isUnpackedTuple?: boolean): ClassType;
142
- export declare function getCommonErasedType(types: Type[]): ClassType | undefined;
143
143
  export declare function removeParamSpecVariadicsFromSignature(type: FunctionType | OverloadedFunctionType): FunctionType | OverloadedFunctionType;
144
144
  export declare function removeParamSpecVariadicsFromFunction(type: FunctionType): FunctionType;
145
145
  export declare function getGeneratorTypeArgs(returnType: Type): Type[] | undefined;
@@ -9,7 +9,7 @@
9
9
  */
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
11
  exports.lookUpClassMember = exports.lookUpObjectMember = exports.getContainerDepth = exports.getProtocolSymbolsRecursive = exports.getProtocolSymbols = exports.transformExpectedType = exports.validateTypeVarDefault = exports.applyInScopePlaceholders = exports.applySourceContextTypeVarsToSignature = exports.applySourceContextTypeVars = exports.applySolvedTypeVars = exports.ensureFunctionSignaturesAreUnique = exports.populateTypeVarContextForSelfType = exports.partiallySpecializeType = exports.isUnboundedTupleClass = exports.isTupleClass = exports.isMaybeDescriptorInstance = exports.isDescriptorInstance = exports.isCallableType = exports.isProperty = exports.isEllipsisType = exports.getUnionSubtypeCount = exports.getLiteralTypeClassName = exports.containsLiteralType = exports.isLiteralTypeOrUnion = exports.isLiteralType = exports.getSpecializedTupleType = exports.getTypeVarScopeIds = exports.getTypeVarScopeId = exports.transformPossibleRecursiveTypeAlias = exports.isTypeAliasRecursive = exports.isTypeAliasPlaceholder = exports.getTypeCondition = exports.addConditionToType = exports.getFullNameOfType = exports.derivesFromAnyOrUnknown = exports.isUnionableType = exports.preserveUnknown = exports.areTypesSame = exports.doForEachSubtype = exports.sortTypes = exports.mapSubtypes = exports.makeInferenceContext = exports.isTypeVarSame = exports.isIncompleteUnknown = exports.isOptionalType = exports.UniqueSignatureTracker = exports.AssignTypeFlags = exports.ClassIteratorFlags = exports.ClassMemberLookupFlags = void 0;
12
- exports.convertParamSpecValueToType = exports.convertTypeToParamSpecValue = exports.getDeclaringModulesForType = exports.computeMroLinearization = exports.isVarianceOfTypeArgumentCompatible = exports.combineVariances = exports.requiresSpecialization = exports.requiresTypeArguments = exports.getGeneratorTypeArgs = exports.removeParamSpecVariadicsFromFunction = exports.removeParamSpecVariadicsFromSignature = exports.getCommonErasedType = exports.specializeTupleClass = exports.combineSameSizedTuples = exports.explodeGenericClass = exports.isPartlyUnknown = exports.containsAnyOrUnknown = exports.getMembersForModule = exports.getMembersForClass = exports.convertToInstantiable = exports.convertToInstance = exports.isEffectivelyInstantiable = exports.isMetaclassInstance = exports.isInstantiableMetaclass = exports.getGeneratorYieldType = exports.getDeclaredGeneratorReturnType = exports.synthesizeTypeVarForSelfCls = exports.derivesFromClassRecursive = exports.specializeForBaseClass = exports.buildTypeVarContext = exports.buildTypeVarContextFromSpecializedClass = exports.setTypeArgumentsRecursive = exports.specializeClassType = exports.isTypeVarLimitedToCallable = exports.getTypeVarArgumentsRecursive = exports.addTypeVarsToListIfUnique = exports.getClassFieldsRecursive = exports.getClassIterator = exports.getClassMemberIterator = void 0;
12
+ exports.convertParamSpecValueToType = exports.convertTypeToParamSpecValue = exports.getDeclaringModulesForType = exports.computeMroLinearization = exports.isVarianceOfTypeArgumentCompatible = exports.combineVariances = exports.requiresSpecialization = exports.requiresTypeArguments = exports.getGeneratorTypeArgs = exports.removeParamSpecVariadicsFromFunction = exports.removeParamSpecVariadicsFromSignature = exports.specializeTupleClass = exports.combineSameSizedTuples = exports.explodeGenericClass = exports.isPartlyUnknown = exports.containsAnyOrUnknown = exports.getMembersForModule = exports.getMembersForClass = exports.convertToInstantiable = exports.convertToInstance = exports.isEffectivelyInstantiable = exports.isMetaclassInstance = exports.isInstantiableMetaclass = exports.getGeneratorYieldType = exports.getDeclaredGeneratorReturnType = exports.synthesizeTypeVarForSelfCls = exports.derivesFromClassRecursive = exports.specializeForBaseClass = exports.buildTypeVarContext = exports.buildTypeVarContextFromSpecializedClass = exports.setTypeArgumentsRecursive = exports.specializeClassType = exports.isTypeVarLimitedToCallable = exports.getTypeVarArgumentsRecursive = exports.addTypeVarsToListIfUnique = exports.getClassFieldsRecursive = exports.getClassIterator = exports.getClassMemberIterator = void 0;
13
13
  const collectionUtils_1 = require("../common/collectionUtils");
14
14
  const debug_1 = require("../common/debug");
15
15
  const symbol_1 = require("./symbol");
@@ -100,22 +100,30 @@ var AssignTypeFlags;
100
100
  // employing narrowing or widening, and don't strip literals.
101
101
  AssignTypeFlags[AssignTypeFlags["PopulatingExpectedType"] = 1024] = "PopulatingExpectedType";
102
102
  })(AssignTypeFlags = exports.AssignTypeFlags || (exports.AssignTypeFlags = {}));
103
+ // Tracks whether a function signature has been seen before within
104
+ // an expression. For example, in the expression "foo(foo, foo)", the
105
+ // signature for "foo" will be seen three times at three different
106
+ // file offsets. If the signature is generic, we need to create unique
107
+ // type variables for each instance because they are independent of
108
+ // each other.
103
109
  class UniqueSignatureTracker {
104
110
  constructor() {
105
- this.signaturesSeen = [];
111
+ this._signaturesSeen = [];
106
112
  }
107
113
  findSignature(signature) {
108
- return this.signaturesSeen.find((s) => {
114
+ return this._signaturesSeen.find((s) => {
109
115
  return (0, types_1.isTypeSame)(signature, s.type);
110
116
  });
111
117
  }
112
- addSignature(signature) {
118
+ addSignature(signature, offset) {
113
119
  const existingSignature = this.findSignature(signature);
114
120
  if (existingSignature) {
115
- existingSignature.count++;
121
+ if (!existingSignature.expressionOffsets.some((o) => o === offset)) {
122
+ existingSignature.expressionOffsets.push(offset);
123
+ }
116
124
  }
117
125
  else {
118
- this.signaturesSeen.push({ type: signature, count: 1 });
126
+ this._signaturesSeen.push({ type: signature, expressionOffsets: [offset] });
119
127
  }
120
128
  }
121
129
  }
@@ -161,11 +169,11 @@ function isTypeVarSame(type1, type2) {
161
169
  return isCompatible;
162
170
  }
163
171
  exports.isTypeVarSame = isTypeVarSame;
164
- function makeInferenceContext(expectedType, isTypeIncomplete) {
172
+ function makeInferenceContext(expectedType, isTypeIncomplete, signatureTracker) {
165
173
  if (!expectedType) {
166
174
  return undefined;
167
175
  }
168
- return { expectedType, isTypeIncomplete };
176
+ return { expectedType, isTypeIncomplete, signatureTracker };
169
177
  }
170
178
  exports.makeInferenceContext = makeInferenceContext;
171
179
  // Calls a callback for each subtype and combines the results
@@ -726,8 +734,8 @@ function populateTypeVarContextForSelfType(typeVarContext, contextClassType, sel
726
734
  exports.populateTypeVarContextForSelfType = populateTypeVarContextForSelfType;
727
735
  // Looks for duplicate function types within the type and ensures that
728
736
  // if they are generic, they have unique type variables.
729
- function ensureFunctionSignaturesAreUnique(type, signatureTracker) {
730
- const transformer = new UniqueFunctionSignatureTransformer(signatureTracker);
737
+ function ensureFunctionSignaturesAreUnique(type, signatureTracker, expressionOffset) {
738
+ const transformer = new UniqueFunctionSignatureTransformer(signatureTracker, expressionOffset);
731
739
  return transformer.apply(type, 0);
732
740
  }
733
741
  exports.ensureFunctionSignaturesAreUnique = ensureFunctionSignaturesAreUnique;
@@ -1692,27 +1700,71 @@ function containsAnyOrUnknown(type, recurse) {
1692
1700
  }
1693
1701
  exports.containsAnyOrUnknown = containsAnyOrUnknown;
1694
1702
  // Determines if any part of the type contains "Unknown", including any type arguments.
1695
- function isPartlyUnknown(type, allowUnknownTypeArgsForClasses = false) {
1696
- class PartlyUnknownWalker extends typeWalker_1.TypeWalker {
1697
- constructor(_allowUnknownTypeArgsForClasses) {
1698
- super();
1699
- this._allowUnknownTypeArgsForClasses = _allowUnknownTypeArgsForClasses;
1700
- this.isPartlyUnknown = false;
1703
+ // This function does not use the TypeWalker because it is called very frequently,
1704
+ // and allocating a memory walker object for every call significantly increases
1705
+ // peak memory usage.
1706
+ function isPartlyUnknown(type, allowUnknownTypeArgsForClasses = false, recursionCount = 0) {
1707
+ var _a, _b;
1708
+ if (recursionCount > types_1.maxTypeRecursionCount) {
1709
+ return false;
1710
+ }
1711
+ recursionCount++;
1712
+ if ((0, types_1.isUnknown)(type)) {
1713
+ return true;
1714
+ }
1715
+ // If this is a generic type alias, see if any of its type arguments
1716
+ // are either unspecified or are partially known.
1717
+ if ((_a = type.typeAliasInfo) === null || _a === void 0 ? void 0 : _a.typeArguments) {
1718
+ if (type.typeAliasInfo.typeArguments.some((typeArg) => isPartlyUnknown(typeArg, allowUnknownTypeArgsForClasses, recursionCount))) {
1719
+ return true;
1701
1720
  }
1702
- visitUnknown(type) {
1703
- this.isPartlyUnknown = true;
1704
- // No need to keep walking.
1705
- this.cancelWalk();
1721
+ }
1722
+ // See if a union contains an unknown type.
1723
+ if ((0, types_1.isUnion)(type)) {
1724
+ return ((0, types_1.findSubtype)(type, (subtype) => isPartlyUnknown(subtype, allowUnknownTypeArgsForClasses, recursionCount)) !==
1725
+ undefined);
1726
+ }
1727
+ // See if an object or class has an unknown type argument.
1728
+ if ((0, types_1.isClass)(type)) {
1729
+ if (types_1.TypeBase.isInstance(type)) {
1730
+ allowUnknownTypeArgsForClasses = false;
1731
+ }
1732
+ if (!allowUnknownTypeArgsForClasses && !types_1.ClassType.isPseudoGenericClass(type)) {
1733
+ const typeArgs = ((_b = type.tupleTypeArguments) === null || _b === void 0 ? void 0 : _b.map((t) => t.type)) || type.typeArguments;
1734
+ if (typeArgs) {
1735
+ for (const argType of typeArgs) {
1736
+ if (isPartlyUnknown(argType, allowUnknownTypeArgsForClasses, recursionCount)) {
1737
+ return true;
1738
+ }
1739
+ }
1740
+ }
1706
1741
  }
1707
- visitClass(type) {
1708
- if (!this._allowUnknownTypeArgsForClasses || !types_1.TypeBase.isInstantiable(type)) {
1709
- super.visitClass(type);
1742
+ return false;
1743
+ }
1744
+ // See if a function has an unknown type.
1745
+ if ((0, types_1.isOverloadedFunction)(type)) {
1746
+ return types_1.OverloadedFunctionType.getOverloads(type).some((overload) => {
1747
+ return isPartlyUnknown(overload, /* allowUnknownTypeArgsForClasses */ false, recursionCount);
1748
+ });
1749
+ }
1750
+ if ((0, types_1.isFunction)(type)) {
1751
+ for (let i = 0; i < type.details.parameters.length; i++) {
1752
+ // Ignore parameters such as "*" that have no name.
1753
+ if (type.details.parameters[i].name) {
1754
+ const paramType = types_1.FunctionType.getEffectiveParameterType(type, i);
1755
+ if (isPartlyUnknown(paramType, /* allowUnknownTypeArgsForClasses */ false, recursionCount)) {
1756
+ return true;
1757
+ }
1710
1758
  }
1711
1759
  }
1760
+ if (type.details.declaredReturnType &&
1761
+ !types_1.FunctionType.isParamSpecValue(type) &&
1762
+ isPartlyUnknown(type.details.declaredReturnType, /* allowUnknownTypeArgsForClasses */ false, recursionCount)) {
1763
+ return true;
1764
+ }
1765
+ return false;
1712
1766
  }
1713
- const walker = new PartlyUnknownWalker(allowUnknownTypeArgsForClasses);
1714
- walker.walk(type);
1715
- return walker.isPartlyUnknown;
1767
+ return false;
1716
1768
  }
1717
1769
  exports.isPartlyUnknown = isPartlyUnknown;
1718
1770
  // If the specified type is a generic class with a single type argument
@@ -1800,31 +1852,6 @@ function specializeTupleClass(classType, typeArgs, isTypeArgumentExplicit = true
1800
1852
  return clonedClassType;
1801
1853
  }
1802
1854
  exports.specializeTupleClass = specializeTupleClass;
1803
- // If the array contains two or more class types that are all the same
1804
- // generic type, return the common "erased" type — a type that
1805
- // replaces all of the type arguments with Unknown.
1806
- function getCommonErasedType(types) {
1807
- if (types.length < 2) {
1808
- return undefined;
1809
- }
1810
- if (!(0, types_1.isClass)(types[0])) {
1811
- return undefined;
1812
- }
1813
- for (let i = 1; i < types.length; i++) {
1814
- const candidate = types[i];
1815
- if (!(0, types_1.isClass)(candidate) ||
1816
- types_1.TypeBase.isInstance(candidate) !== types_1.TypeBase.isInstance(types[0]) ||
1817
- !types_1.ClassType.isSameGenericClass(types[0], candidate)) {
1818
- return undefined;
1819
- }
1820
- }
1821
- if (isTupleClass(types[0])) {
1822
- return specializeTupleClass(types[0], [{ type: types_1.UnknownType.create(), isUnbounded: true }]);
1823
- }
1824
- return types_1.ClassType.cloneForSpecialization(types[0], types[0].details.typeParameters.map((t) => types_1.UnknownType.create()),
1825
- /* isTypeArgumentExplicit */ true);
1826
- }
1827
- exports.getCommonErasedType = getCommonErasedType;
1828
1855
  // If the type is a function or overloaded function that has a paramSpec
1829
1856
  // associated with it and P.args and P.kwargs at the end of the signature,
1830
1857
  // it removes these parameters from the function.
@@ -2758,9 +2785,18 @@ class TypeVarDefaultValidator extends TypeVarTransformer {
2758
2785
  }
2759
2786
  }
2760
2787
  class UniqueFunctionSignatureTransformer extends TypeVarTransformer {
2761
- constructor(_signatureTracker) {
2788
+ constructor(_signatureTracker, _expressionOffset) {
2762
2789
  super();
2763
2790
  this._signatureTracker = _signatureTracker;
2791
+ this._expressionOffset = _expressionOffset;
2792
+ }
2793
+ transformGenericTypeAlias(type, recursionCount) {
2794
+ // Don't transform type aliases.
2795
+ return type;
2796
+ }
2797
+ transformTypeVarsInClassType(classType, recursionCount) {
2798
+ // Don't transform classes.
2799
+ return classType;
2764
2800
  }
2765
2801
  transformTypeVarsInFunctionType(sourceType, recursionCount) {
2766
2802
  // If this function is not generic, there's no need to check for uniqueness.
@@ -2771,19 +2807,25 @@ class UniqueFunctionSignatureTransformer extends TypeVarTransformer {
2771
2807
  const existingSignature = this._signatureTracker.findSignature(sourceType);
2772
2808
  if (existingSignature) {
2773
2809
  const typeVarContext = new typeVarContext_1.TypeVarContext(getTypeVarScopeId(sourceType));
2774
- // Create new type variables with the same scope but with
2775
- // different (unique) names.
2776
- sourceType.details.typeParameters.forEach((typeParam) => {
2777
- let replacement = types_1.TypeVarType.cloneForNewName(typeParam, `${typeParam.details.name}(${existingSignature.count})`);
2778
- if (replacement.details.isParamSpec) {
2779
- replacement = convertTypeToParamSpecValue(replacement);
2780
- }
2781
- typeVarContext.setTypeVarType(typeParam, replacement);
2782
- });
2783
- updatedSourceType = applySolvedTypeVars(sourceType, typeVarContext);
2784
- (0, debug_1.assert)((0, types_1.isFunction)(updatedSourceType) || (0, types_1.isOverloadedFunction)(updatedSourceType));
2810
+ let offsetIndex = existingSignature.expressionOffsets.findIndex((offset) => offset === this._expressionOffset);
2811
+ if (offsetIndex < 0) {
2812
+ offsetIndex = existingSignature.expressionOffsets.length;
2813
+ }
2814
+ if (offsetIndex > 0) {
2815
+ // Create new type variables with the same scope but with
2816
+ // different (unique) names.
2817
+ sourceType.details.typeParameters.forEach((typeParam) => {
2818
+ let replacement = types_1.TypeVarType.cloneForNewName(typeParam, `${typeParam.details.name}(${offsetIndex})`);
2819
+ if (replacement.details.isParamSpec) {
2820
+ replacement = convertTypeToParamSpecValue(replacement);
2821
+ }
2822
+ typeVarContext.setTypeVarType(typeParam, replacement);
2823
+ });
2824
+ updatedSourceType = applySolvedTypeVars(sourceType, typeVarContext);
2825
+ (0, debug_1.assert)((0, types_1.isFunction)(updatedSourceType) || (0, types_1.isOverloadedFunction)(updatedSourceType));
2826
+ }
2785
2827
  }
2786
- this._signatureTracker.addSignature(sourceType);
2828
+ this._signatureTracker.addSignature(sourceType, this._expressionOffset);
2787
2829
  return updatedSourceType;
2788
2830
  }
2789
2831
  }