@zzzen/pyright-internal 1.2.0-dev.20250202 → 1.2.0-dev.20250209
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 +1 -0
- package/dist/analyzer/binder.js.map +1 -1
- package/dist/analyzer/checker.d.ts +1 -0
- package/dist/analyzer/checker.js +23 -5
- package/dist/analyzer/checker.js.map +1 -1
- package/dist/analyzer/codeFlowEngine.js +2 -2
- package/dist/analyzer/codeFlowEngine.js.map +1 -1
- package/dist/analyzer/parameterUtils.d.ts +4 -1
- package/dist/analyzer/parameterUtils.js +7 -3
- package/dist/analyzer/parameterUtils.js.map +1 -1
- package/dist/analyzer/typeEvaluator.js +111 -80
- package/dist/analyzer/typeEvaluator.js.map +1 -1
- package/dist/analyzer/typeUtils.d.ts +2 -1
- package/dist/analyzer/typeUtils.js +8 -2
- package/dist/analyzer/typeUtils.js.map +1 -1
- package/dist/analyzer/typedDicts.js +25 -10
- package/dist/analyzer/typedDicts.js.map +1 -1
- package/dist/localization/localize.d.ts +4 -1
- package/dist/localization/localize.js +2 -1
- package/dist/localization/localize.js.map +1 -1
- package/dist/localization/package.nls.en-us.json +7 -3
- package/dist/parser/parser.js +6 -3
- package/dist/parser/parser.js.map +1 -1
- package/dist/parser/tokenizer.js +9 -7
- package/dist/parser/tokenizer.js.map +1 -1
- package/dist/tests/fourslash/completions.vardecls.fourslash.js +2 -1
- package/dist/tests/fourslash/completions.vardecls.fourslash.js.map +1 -1
- package/dist/tests/fourslash/hover.async.fourslash.js +1 -1
- package/dist/tests/fourslash/hover.async.fourslash.js.map +1 -1
- package/dist/tests/typeEvaluator1.test.js +1 -1
- package/dist/tests/typeEvaluator2.test.js +1 -1
- package/dist/tests/typeEvaluator4.test.js +2 -2
- package/dist/tests/typeEvaluator5.test.js +3 -3
- package/dist/tests/typeEvaluator6.test.js +2 -2
- package/dist/tests/typeEvaluator7.test.js +5 -1
- package/dist/tests/typeEvaluator7.test.js.map +1 -1
- package/package.json +1 -1
@@ -61,6 +61,7 @@ const constraintSolver_1 = require("./constraintSolver");
|
|
61
61
|
const constraintTracker_1 = require("./constraintTracker");
|
62
62
|
const constructors_1 = require("./constructors");
|
63
63
|
const dataClasses_1 = require("./dataClasses");
|
64
|
+
const declaration_1 = require("./declaration");
|
64
65
|
const declarationUtils_1 = require("./declarationUtils");
|
65
66
|
const decorators_1 = require("./decorators");
|
66
67
|
const enums_1 = require("./enums");
|
@@ -149,7 +150,10 @@ const maxDeclarationsToUseForInference = 64;
|
|
149
150
|
const maxEffectiveTypeEvaluationAttempts = 16;
|
150
151
|
// Maximum number of combinatoric argument type expansions allowed
|
151
152
|
// when resolving an overload.
|
152
|
-
const
|
153
|
+
const maxTotalOverloadArgTypeExpansionCount = 256;
|
154
|
+
// Maximum size of an enum that will be expanded during overload
|
155
|
+
// argument type expansion.
|
156
|
+
const maxSingleOverloadArgTypeExpansionCount = 64;
|
153
157
|
// Maximum number of recursive function return type inference attempts
|
154
158
|
// that can be concurrently pending before we give up.
|
155
159
|
const maxInferFunctionReturnRecursionCount = 12;
|
@@ -1469,7 +1473,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
1469
1473
|
!types_1.ClassType.isBuiltIn(metaclass, 'type') &&
|
1470
1474
|
!types_1.ClassType.isSameGenericClass(metaclass, objectType)) {
|
1471
1475
|
const descMemberInfo = getTypeOfClassMemberName(errorNode, metaclass, memberName, usage,
|
1472
|
-
/* diag */ undefined, flags | 512 /* MemberAccessFlags.SkipAttributeAccessOverride */, objectType, recursionCount);
|
1476
|
+
/* diag */ undefined, flags | 512 /* MemberAccessFlags.SkipAttributeAccessOverride */ | 4096 /* MemberAccessFlags.SkipTypedDictEntries */, objectType, recursionCount);
|
1473
1477
|
if (descMemberInfo) {
|
1474
1478
|
const isProperty = (0, types_1.isClassInstance)(descMemberInfo.type) && types_1.ClassType.isPropertyClass(descMemberInfo.type);
|
1475
1479
|
if ((0, typeUtils_1.isDescriptorInstance)(descMemberInfo.type, /* requireSetter */ true) || isProperty) {
|
@@ -1479,7 +1483,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
1479
1483
|
}
|
1480
1484
|
let subDiag;
|
1481
1485
|
if (!skipObjectTypeLookup) {
|
1482
|
-
let effectiveFlags = flags
|
1486
|
+
let effectiveFlags = flags | 4096 /* MemberAccessFlags.SkipTypedDictEntries */;
|
1483
1487
|
if (objectTypeIsInstantiable) {
|
1484
1488
|
effectiveFlags |=
|
1485
1489
|
16 /* MemberAccessFlags.SkipInstanceMembers */ |
|
@@ -2936,12 +2940,10 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
2936
2940
|
break;
|
2937
2941
|
}
|
2938
2942
|
case 56 /* ParseNodeType.Unpack */: {
|
2939
|
-
|
2940
|
-
|
2941
|
-
|
2942
|
-
|
2943
|
-
}, ignoreEmptyContainers, srcExpr);
|
2944
|
-
}
|
2943
|
+
assignTypeToExpression(target.d.expr, {
|
2944
|
+
type: getBuiltInObject(target.d.expr, 'list', [typeResult.type]),
|
2945
|
+
isIncomplete: typeResult.isIncomplete,
|
2946
|
+
}, srcExpr, ignoreEmptyContainers, allowAssignmentToFinalVar, expectedTypeDiagAddendum);
|
2945
2947
|
break;
|
2946
2948
|
}
|
2947
2949
|
case 0 /* ParseNodeType.Error */: {
|
@@ -6733,7 +6735,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
6733
6735
|
}
|
6734
6736
|
expandedArgTypes = expandArgTypes(contextFreeArgTypes, expandedArgTypes);
|
6735
6737
|
// Check for combinatoric explosion and break out of loop.
|
6736
|
-
if (!expandedArgTypes || expandedArgTypes.length >
|
6738
|
+
if (!expandedArgTypes || expandedArgTypes.length > maxTotalOverloadArgTypeExpansionCount) {
|
6737
6739
|
break;
|
6738
6740
|
}
|
6739
6741
|
}
|
@@ -6802,12 +6804,12 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
6802
6804
|
if ((0, types_1.isClassInstance)(subtype)) {
|
6803
6805
|
// Expand any bool or Enum literals.
|
6804
6806
|
const expandedLiteralTypes = (0, typeGuards_1.enumerateLiteralsForType)(evaluatorInterface, subtype);
|
6805
|
-
if (expandedLiteralTypes) {
|
6807
|
+
if (expandedLiteralTypes && expandedLiteralTypes.length <= maxSingleOverloadArgTypeExpansionCount) {
|
6806
6808
|
(0, collectionUtils_1.appendArray)(expandedTypes, expandedLiteralTypes);
|
6807
6809
|
return;
|
6808
6810
|
}
|
6809
6811
|
// Expand any fixed-size tuples.
|
6810
|
-
const expandedTuples = (0, tuples_1.expandTuple)(subtype,
|
6812
|
+
const expandedTuples = (0, tuples_1.expandTuple)(subtype, maxSingleOverloadArgTypeExpansionCount);
|
6811
6813
|
if (expandedTuples) {
|
6812
6814
|
(0, collectionUtils_1.appendArray)(expandedTypes, expandedTuples);
|
6813
6815
|
return;
|
@@ -7370,7 +7372,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
7370
7372
|
// This logic is based on PEP 3102: https://www.python.org/dev/peps/pep-3102/
|
7371
7373
|
function matchArgsToParams(errorNode, argList, typeResult, overloadIndex) {
|
7372
7374
|
const overload = typeResult.type;
|
7373
|
-
const paramDetails = (0, parameterUtils_1.getParamListDetails)(overload);
|
7375
|
+
const paramDetails = (0, parameterUtils_1.getParamListDetails)(overload, { disallowExtraKwargsForTd: true });
|
7374
7376
|
const paramSpec = types_1.FunctionType.getParamSpecFromArgsKwargs(overload);
|
7375
7377
|
let argIndex = 0;
|
7376
7378
|
let matchedUnpackedListOfUnknownLength = false;
|
@@ -7844,8 +7846,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
7844
7846
|
const kwargsParam = paramDetails.params[paramDetails.kwargsIndex];
|
7845
7847
|
validateArgTypeParams.push({
|
7846
7848
|
paramCategory: 2 /* ParamCategory.KwargsDict */,
|
7847
|
-
paramType: kwargsParam.
|
7848
|
-
requiresTypeVarMatching: (0, typeUtils_1.requiresSpecialization)(kwargsParam.
|
7849
|
+
paramType: kwargsParam.type,
|
7850
|
+
requiresTypeVarMatching: (0, typeUtils_1.requiresSpecialization)(kwargsParam.type),
|
7849
7851
|
argument: {
|
7850
7852
|
argCategory: 2 /* ArgCategory.UnpackedDictionary */,
|
7851
7853
|
typeResult: { type: extraItemsType },
|
@@ -10223,7 +10225,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
10223
10225
|
return generatorTypeArgs.length >= 2 ? generatorTypeArgs[2] : types_1.UnknownType.create();
|
10224
10226
|
}
|
10225
10227
|
// Handle old-style (pre-await) Coroutines as a special case.
|
10226
|
-
if ((0, types_1.isClassInstance)(yieldFromSubtype) &&
|
10228
|
+
if ((0, types_1.isClassInstance)(yieldFromSubtype) &&
|
10229
|
+
types_1.ClassType.isBuiltIn(yieldFromSubtype, ['Coroutine', 'CoroutineType'])) {
|
10227
10230
|
return types_1.UnknownType.create();
|
10228
10231
|
}
|
10229
10232
|
// Handle simple iterables.
|
@@ -12067,6 +12070,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
12067
12070
|
if (fileInfo.isStubFile) {
|
12068
12071
|
exprFlags |= 4 /* EvalFlags.ForwardRefs */;
|
12069
12072
|
}
|
12073
|
+
let sawClosedOrExtraItems = false;
|
12070
12074
|
node.d.arguments.forEach((arg) => {
|
12071
12075
|
// Ignore unpacked arguments.
|
12072
12076
|
if (arg.d.argCategory === 2 /* ArgCategory.UnpackedDictionary */) {
|
@@ -12249,15 +12253,22 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
12249
12253
|
else if (arg.d.name.d.value === 'total' && !constArgValue) {
|
12250
12254
|
classType.shared.flags |= 32 /* ClassTypeFlags.CanOmitDictValues */;
|
12251
12255
|
}
|
12252
|
-
else if (arg.d.name.d.value === 'closed'
|
12253
|
-
|
12254
|
-
|
12255
|
-
|
12256
|
-
|
12257
|
-
|
12258
|
-
|
12256
|
+
else if (arg.d.name.d.value === 'closed') {
|
12257
|
+
if (constArgValue) {
|
12258
|
+
// This is an experimental feature because PEP 728 hasn't been accepted yet.
|
12259
|
+
if (AnalyzerNodeInfo.getFileInfo(node).diagnosticRuleSet.enableExperimentalFeatures) {
|
12260
|
+
classType.shared.flags |=
|
12261
|
+
8 /* ClassTypeFlags.TypedDictMarkedClosed */ |
|
12262
|
+
16 /* ClassTypeFlags.TypedDictEffectivelyClosed */;
|
12263
|
+
if (classType.shared.typedDictExtraItemsExpr) {
|
12264
|
+
addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.typedDictExtraItemsClosed(), classType.shared.typedDictExtraItemsExpr);
|
12265
|
+
}
|
12259
12266
|
}
|
12260
12267
|
}
|
12268
|
+
if (sawClosedOrExtraItems) {
|
12269
|
+
addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.typedDictExtraItemsClosed(), arg.d.valueExpr);
|
12270
|
+
}
|
12271
|
+
sawClosedOrExtraItems = true;
|
12261
12272
|
}
|
12262
12273
|
}
|
12263
12274
|
else if (arg.d.name.d.value === 'extra_items') {
|
@@ -12271,6 +12282,10 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
12271
12282
|
addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.typedDictExtraItemsClosed(), classType.shared.typedDictExtraItemsExpr);
|
12272
12283
|
}
|
12273
12284
|
}
|
12285
|
+
if (sawClosedOrExtraItems) {
|
12286
|
+
addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.typedDictExtraItemsClosed(), arg.d.valueExpr);
|
12287
|
+
}
|
12288
|
+
sawClosedOrExtraItems = true;
|
12274
12289
|
}
|
12275
12290
|
else {
|
12276
12291
|
addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.typedDictInitsubclassParameter().format({ name: arg.d.name.d.value }), arg);
|
@@ -13550,8 +13565,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
13550
13565
|
}
|
13551
13566
|
}
|
13552
13567
|
if (!awaitableReturnType || !isGenerator) {
|
13553
|
-
// Wrap in either an Awaitable or a
|
13554
|
-
const awaitableType =
|
13568
|
+
// Wrap in either an Awaitable or a CoroutineType, which is a subclass of Awaitable.
|
13569
|
+
const awaitableType = useCoroutine ? getTypesType(node, 'CoroutineType') : getTypingType(node, 'Awaitable');
|
13555
13570
|
if (awaitableType && (0, types_1.isInstantiableClass)(awaitableType)) {
|
13556
13571
|
awaitableReturnType = types_1.ClassType.cloneAsInstance(types_1.ClassType.specialize(awaitableType, useCoroutine ? [types_1.AnyType.create(), types_1.AnyType.create(), returnType] : [returnType]));
|
13557
13572
|
}
|
@@ -13670,7 +13685,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
13670
13685
|
isYieldResultUsed = true;
|
13671
13686
|
const iteratorTypeResult = getTypeOfExpression(yieldNode.d.expr);
|
13672
13687
|
if ((0, types_1.isClassInstance)(iteratorTypeResult.type) &&
|
13673
|
-
types_1.ClassType.isBuiltIn(iteratorTypeResult.type, 'Coroutine')) {
|
13688
|
+
types_1.ClassType.isBuiltIn(iteratorTypeResult.type, ['Coroutine', 'CoroutineType'])) {
|
13674
13689
|
const yieldType = iteratorTypeResult.type.priv.typeArgs &&
|
13675
13690
|
iteratorTypeResult.type.priv.typeArgs.length > 0
|
13676
13691
|
? iteratorTypeResult.type.priv.typeArgs[0]
|
@@ -16331,6 +16346,12 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
16331
16346
|
}
|
16332
16347
|
declsToConsider.push(resolvedDecl);
|
16333
16348
|
});
|
16349
|
+
// If all of the decls come from augmented assignments, we won't be able to
|
16350
|
+
// determine its type. At least one declaration must be a simple assignment.
|
16351
|
+
if (declsToConsider.every((decl) => (0, declaration_1.isVariableDeclaration)(decl) &&
|
16352
|
+
ParseTreeUtils.isNodeContainedWithinNodeType(decl.node, 5 /* ParseNodeType.AugmentedAssignment */))) {
|
16353
|
+
declsToConsider.splice(0);
|
16354
|
+
}
|
16334
16355
|
const result = getTypeOfSymbolForDecls(symbol, declsToConsider, effectiveTypeCacheKey);
|
16335
16356
|
result.includesVariableDecl = includesVariableDecl;
|
16336
16357
|
result.includesIllegalTypeAliasDecl = includesIllegalTypeAliasDecl;
|
@@ -18781,66 +18802,76 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
|
|
18781
18802
|
}
|
18782
18803
|
if (srcStartOfNamed >= 0) {
|
18783
18804
|
srcParamDetails.params.forEach((srcParamInfo, index) => {
|
18784
|
-
if (index
|
18785
|
-
|
18786
|
-
|
18787
|
-
|
18788
|
-
|
18789
|
-
|
18790
|
-
|
18791
|
-
|
18792
|
-
|
18793
|
-
|
18794
|
-
|
18795
|
-
|
18796
|
-
|
18797
|
-
|
18798
|
-
|
18799
|
-
|
18800
|
-
|
18801
|
-
// Make sure we can assign the type to the Kwargs.
|
18802
|
-
if (!assignParam(destParamDetails.params[destParamDetails.kwargsIndex].type, srcParamType, destParamDetails.params[destParamDetails.kwargsIndex].index, diag?.createAddendum(), constraints, flags, recursionCount)) {
|
18803
|
-
canAssign = false;
|
18804
|
-
}
|
18805
|
-
}
|
18806
|
-
else if (srcParamInfo.defaultType) {
|
18807
|
-
// Assign default arg values in case they are needed for
|
18808
|
-
// populating TypeVar constraints.
|
18809
|
-
const defaultArgType = srcParamInfo.defaultType ?? srcParamInfo.defaultType;
|
18810
|
-
if (defaultArgType &&
|
18811
|
-
!assignType(srcParamInfo.type, defaultArgType, diag?.createAddendum(), constraints, flags, recursionCount)) {
|
18812
|
-
if ((flags & 32 /* AssignTypeFlags.PartialOverloadOverlap */) === 0) {
|
18813
|
-
canAssign = false;
|
18814
|
-
}
|
18815
|
-
}
|
18816
|
-
}
|
18805
|
+
if (index < srcStartOfNamed) {
|
18806
|
+
return;
|
18807
|
+
}
|
18808
|
+
if (!srcParamInfo.param.name ||
|
18809
|
+
srcParamInfo.param.category !== 0 /* ParamCategory.Simple */ ||
|
18810
|
+
srcParamInfo.kind === parameterUtils_1.ParamKind.Positional) {
|
18811
|
+
return;
|
18812
|
+
}
|
18813
|
+
const destParamInfo = destParamMap.get(srcParamInfo.param.name);
|
18814
|
+
const paramDiag = diag?.createAddendum();
|
18815
|
+
const srcParamType = srcParamInfo.type;
|
18816
|
+
if (!destParamInfo) {
|
18817
|
+
if (destParamDetails.kwargsIndex === undefined && !srcParamInfo.defaultType) {
|
18818
|
+
if (paramDiag) {
|
18819
|
+
paramDiag.addMessage(localize_1.LocAddendum.namedParamMissingInDest().format({
|
18820
|
+
name: srcParamInfo.param.name,
|
18821
|
+
}));
|
18817
18822
|
}
|
18818
|
-
|
18819
|
-
|
18820
|
-
|
18821
|
-
|
18822
|
-
|
18823
|
-
|
18824
|
-
|
18825
|
-
|
18826
|
-
|
18827
|
-
|
18828
|
-
|
18829
|
-
|
18830
|
-
|
18831
|
-
|
18832
|
-
|
18833
|
-
}
|
18834
|
-
if (destParamInfo.defaultType && !srcParamInfo.defaultType) {
|
18835
|
-
diag?.createAddendum().addMessage(localize_1.LocAddendum.functionParamDefaultMissing().format({
|
18836
|
-
name: srcParamInfo.param.name,
|
18837
|
-
}));
|
18823
|
+
canAssign = false;
|
18824
|
+
}
|
18825
|
+
else if (destParamDetails.kwargsIndex !== undefined) {
|
18826
|
+
// Make sure we can assign the type to the Kwargs.
|
18827
|
+
if (!assignParam(destParamDetails.params[destParamDetails.kwargsIndex].type, srcParamType, destParamDetails.params[destParamDetails.kwargsIndex].index, diag?.createAddendum(), constraints, flags, recursionCount)) {
|
18828
|
+
canAssign = false;
|
18829
|
+
}
|
18830
|
+
}
|
18831
|
+
else if (srcParamInfo.defaultType) {
|
18832
|
+
// Assign default arg values in case they are needed for
|
18833
|
+
// populating TypeVar constraints.
|
18834
|
+
const defaultArgType = srcParamInfo.defaultType ?? srcParamInfo.defaultType;
|
18835
|
+
if (defaultArgType &&
|
18836
|
+
!assignType(srcParamInfo.type, defaultArgType, diag?.createAddendum(), constraints, flags, recursionCount)) {
|
18837
|
+
if ((flags & 32 /* AssignTypeFlags.PartialOverloadOverlap */) === 0) {
|
18838
18838
|
canAssign = false;
|
18839
18839
|
}
|
18840
|
-
destParamMap.delete(srcParamInfo.param.name);
|
18841
18840
|
}
|
18842
18841
|
}
|
18842
|
+
return;
|
18843
|
+
}
|
18844
|
+
// If we're performing a partial overload match and both the source
|
18845
|
+
// and dest parameters provide defaults, assume that there could
|
18846
|
+
// be a match.
|
18847
|
+
if (srcParamInfo.defaultType && destParamInfo.defaultType) {
|
18848
|
+
if ((flags & 32 /* AssignTypeFlags.PartialOverloadOverlap */) !== 0) {
|
18849
|
+
destParamMap.delete(srcParamInfo.param.name);
|
18850
|
+
return;
|
18851
|
+
}
|
18852
|
+
}
|
18853
|
+
const destParamType = destParamInfo.type;
|
18854
|
+
const specializedDestParamType = constraints
|
18855
|
+
? solveAndApplyConstraints(destParamType, constraints)
|
18856
|
+
: destParamType;
|
18857
|
+
if (!assignParam(destParamInfo.type, srcParamType,
|
18858
|
+
/* paramIndex */ undefined, paramDiag?.createAddendum(), constraints, flags, recursionCount)) {
|
18859
|
+
if (paramDiag) {
|
18860
|
+
paramDiag.addMessage(localize_1.LocAddendum.namedParamTypeMismatch().format({
|
18861
|
+
name: srcParamInfo.param.name,
|
18862
|
+
sourceType: printType(specializedDestParamType),
|
18863
|
+
destType: printType(srcParamType),
|
18864
|
+
}));
|
18865
|
+
}
|
18866
|
+
canAssign = false;
|
18867
|
+
}
|
18868
|
+
if (destParamInfo.defaultType && !srcParamInfo.defaultType) {
|
18869
|
+
diag?.createAddendum().addMessage(localize_1.LocAddendum.functionParamDefaultMissing().format({
|
18870
|
+
name: srcParamInfo.param.name,
|
18871
|
+
}));
|
18872
|
+
canAssign = false;
|
18843
18873
|
}
|
18874
|
+
destParamMap.delete(srcParamInfo.param.name);
|
18844
18875
|
});
|
18845
18876
|
}
|
18846
18877
|
// See if there are any unmatched named parameters.
|