@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.
- package/dist/analyzer/checker.js +42 -29
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/constraintSolver.js +13 -10
- package/dist/analyzer/constraintSolver.js.map +1 -1
- package/dist/analyzer/importResolver.d.ts +2 -0
- package/dist/analyzer/importResolver.js +57 -35
- package/dist/analyzer/importResolver.js.map +1 -1
- package/dist/analyzer/operations.js +2 -0
- package/dist/analyzer/operations.js.map +1 -1
- package/dist/analyzer/program.js +10 -8
- package/dist/analyzer/program.js.map +1 -1
- package/dist/analyzer/protocols.js +182 -183
- package/dist/analyzer/protocols.js.map +1 -1
- package/dist/analyzer/service.js +13 -0
- package/dist/analyzer/service.js.map +1 -1
- package/dist/analyzer/typeEvaluator.js +65 -64
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeEvaluatorTypes.d.ts +2 -0
- package/dist/analyzer/typeUtils.d.ts +11 -11
- package/dist/analyzer/typeUtils.js +106 -64
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/backgroundAnalysisBase.d.ts +1 -1
- package/dist/backgroundAnalysisBase.js +2 -2
- package/dist/backgroundAnalysisBase.js.map +1 -1
- package/dist/backgroundThreadBase.d.ts +12 -9
- package/dist/backgroundThreadBase.js +28 -20
- package/dist/backgroundThreadBase.js.map +1 -1
- package/dist/common/charCodes.d.ts +147 -0
- package/dist/common/charCodes.js +164 -0
- package/dist/common/charCodes.js.map +1 -0
- package/dist/common/fileSystem.d.ts +1 -0
- package/dist/common/fileSystem.js.map +1 -1
- package/dist/common/pathUtils.js.map +1 -1
- package/dist/common/realFileSystem.js +3 -0
- package/dist/common/realFileSystem.js.map +1 -1
- package/dist/languageServerBase.d.ts +3 -3
- package/dist/languageServerBase.js +2 -2
- package/dist/languageServerBase.js.map +1 -1
- package/dist/languageService/definitionProvider.d.ts +2 -0
- package/dist/languageService/definitionProvider.js +82 -74
- package/dist/languageService/definitionProvider.js.map +1 -1
- package/dist/languageService/hoverProvider.d.ts +16 -8
- package/dist/languageService/hoverProvider.js +53 -53
- package/dist/languageService/hoverProvider.js.map +1 -1
- package/dist/localization/localize.d.ts +6 -6
- package/dist/localization/localize.js +2 -3
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.en-us.json +2 -3
- package/dist/parser/characterStream.js.map +1 -1
- package/dist/parser/characters.js.map +1 -1
- package/dist/parser/stringTokenUtils.js.map +1 -1
- package/dist/parser/tokenizer.js +10 -1
- package/dist/parser/tokenizer.js.map +1 -1
- package/dist/pyrightFileSystem.d.ts +1 -0
- package/dist/pyrightFileSystem.js +3 -0
- package/dist/pyrightFileSystem.js.map +1 -1
- package/dist/readonlyAugmentedFileSystem.d.ts +1 -0
- package/dist/readonlyAugmentedFileSystem.js +3 -0
- package/dist/readonlyAugmentedFileSystem.js.map +1 -1
- package/dist/tests/checker.test.js +1 -1
- package/dist/tests/harness/fourslash/testLanguageService.d.ts +1 -0
- package/dist/tests/harness/fourslash/testLanguageService.js +3 -0
- package/dist/tests/harness/fourslash/testLanguageService.js.map +1 -1
- package/dist/tests/harness/fourslash/testState.js +2 -2
- package/dist/tests/harness/fourslash/testState.js.map +1 -1
- package/dist/tests/harness/vfs/filesystem.d.ts +12 -1
- package/dist/tests/harness/vfs/filesystem.js +33 -6
- package/dist/tests/harness/vfs/filesystem.js.map +1 -1
- package/dist/tests/tokenizer.test.js +13 -2
- package/dist/tests/tokenizer.test.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +5 -1
- package/dist/tests/typeEvaluator1.test.js.map +1 -1
- package/dist/tests/typeEvaluator3.test.js +5 -1
- package/dist/tests/typeEvaluator3.test.js.map +1 -1
- package/dist/workspaceFactory.d.ts +2 -0
- package/dist/workspaceFactory.js +11 -2
- package/dist/workspaceFactory.js.map +1 -1
- 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
|
57
|
+
export interface SignatureWithOffsets {
|
57
58
|
type: FunctionType;
|
58
|
-
|
59
|
+
expressionOffsets: number[];
|
59
60
|
}
|
60
61
|
export declare class UniqueSignatureTracker {
|
61
|
-
|
62
|
+
private _signaturesSeen;
|
62
63
|
constructor();
|
63
|
-
findSignature(signature: FunctionType):
|
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.
|
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.
|
111
|
+
this._signaturesSeen = [];
|
106
112
|
}
|
107
113
|
findSignature(signature) {
|
108
|
-
return this.
|
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.
|
121
|
+
if (!existingSignature.expressionOffsets.some((o) => o === offset)) {
|
122
|
+
existingSignature.expressionOffsets.push(offset);
|
123
|
+
}
|
116
124
|
}
|
117
125
|
else {
|
118
|
-
this.
|
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
|
1696
|
-
|
1697
|
-
|
1698
|
-
|
1699
|
-
|
1700
|
-
|
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
|
-
|
1703
|
-
|
1704
|
-
|
1705
|
-
|
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
|
-
|
1708
|
-
|
1709
|
-
|
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
|
-
|
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
|
-
|
2775
|
-
|
2776
|
-
|
2777
|
-
|
2778
|
-
|
2779
|
-
|
2780
|
-
|
2781
|
-
|
2782
|
-
|
2783
|
-
|
2784
|
-
|
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
|
}
|