@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.
Files changed (37) hide show
  1. package/dist/analyzer/binder.js +1 -0
  2. package/dist/analyzer/binder.js.map +1 -1
  3. package/dist/analyzer/checker.d.ts +1 -0
  4. package/dist/analyzer/checker.js +23 -5
  5. package/dist/analyzer/checker.js.map +1 -1
  6. package/dist/analyzer/codeFlowEngine.js +2 -2
  7. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  8. package/dist/analyzer/parameterUtils.d.ts +4 -1
  9. package/dist/analyzer/parameterUtils.js +7 -3
  10. package/dist/analyzer/parameterUtils.js.map +1 -1
  11. package/dist/analyzer/typeEvaluator.js +111 -80
  12. package/dist/analyzer/typeEvaluator.js.map +1 -1
  13. package/dist/analyzer/typeUtils.d.ts +2 -1
  14. package/dist/analyzer/typeUtils.js +8 -2
  15. package/dist/analyzer/typeUtils.js.map +1 -1
  16. package/dist/analyzer/typedDicts.js +25 -10
  17. package/dist/analyzer/typedDicts.js.map +1 -1
  18. package/dist/localization/localize.d.ts +4 -1
  19. package/dist/localization/localize.js +2 -1
  20. package/dist/localization/localize.js.map +1 -1
  21. package/dist/localization/package.nls.en-us.json +7 -3
  22. package/dist/parser/parser.js +6 -3
  23. package/dist/parser/parser.js.map +1 -1
  24. package/dist/parser/tokenizer.js +9 -7
  25. package/dist/parser/tokenizer.js.map +1 -1
  26. package/dist/tests/fourslash/completions.vardecls.fourslash.js +2 -1
  27. package/dist/tests/fourslash/completions.vardecls.fourslash.js.map +1 -1
  28. package/dist/tests/fourslash/hover.async.fourslash.js +1 -1
  29. package/dist/tests/fourslash/hover.async.fourslash.js.map +1 -1
  30. package/dist/tests/typeEvaluator1.test.js +1 -1
  31. package/dist/tests/typeEvaluator2.test.js +1 -1
  32. package/dist/tests/typeEvaluator4.test.js +2 -2
  33. package/dist/tests/typeEvaluator5.test.js +3 -3
  34. package/dist/tests/typeEvaluator6.test.js +2 -2
  35. package/dist/tests/typeEvaluator7.test.js +5 -1
  36. package/dist/tests/typeEvaluator7.test.js.map +1 -1
  37. 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 maxOverloadArgTypeExpansionCount = 64;
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
- if (target.d.expr.nodeType === 38 /* ParseNodeType.Name */) {
2940
- assignTypeToNameNode(target.d.expr, {
2941
- type: getBuiltInObject(target.d.expr, 'list', [typeResult.type]),
2942
- isIncomplete: typeResult.isIncomplete,
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 > maxOverloadArgTypeExpansionCount) {
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, maxOverloadArgTypeExpansionCount);
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.declaredType,
7848
- requiresTypeVarMatching: (0, typeUtils_1.requiresSpecialization)(kwargsParam.declaredType),
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) && types_1.ClassType.isBuiltIn(yieldFromSubtype, 'Coroutine')) {
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' && constArgValue) {
12253
- // This is an experimental feature because PEP 728 hasn't been accepted yet.
12254
- if (AnalyzerNodeInfo.getFileInfo(node).diagnosticRuleSet.enableExperimentalFeatures) {
12255
- classType.shared.flags |=
12256
- 8 /* ClassTypeFlags.TypedDictMarkedClosed */ | 16 /* ClassTypeFlags.TypedDictEffectivelyClosed */;
12257
- if (classType.shared.typedDictExtraItemsExpr) {
12258
- addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.typedDictExtraItemsClosed(), classType.shared.typedDictExtraItemsExpr);
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 Coroutine, which is a subclass of Awaitable.
13554
- const awaitableType = getTypingType(node, useCoroutine ? 'Coroutine' : 'Awaitable');
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 >= srcStartOfNamed) {
18785
- if (srcParamInfo.param.name &&
18786
- srcParamInfo.param.category === 0 /* ParamCategory.Simple */ &&
18787
- srcParamInfo.kind !== parameterUtils_1.ParamKind.Positional) {
18788
- const destParamInfo = destParamMap.get(srcParamInfo.param.name);
18789
- const paramDiag = diag?.createAddendum();
18790
- const srcParamType = srcParamInfo.type;
18791
- if (!destParamInfo) {
18792
- if (destParamDetails.kwargsIndex === undefined && !srcParamInfo.defaultType) {
18793
- if (paramDiag) {
18794
- paramDiag.addMessage(localize_1.LocAddendum.namedParamMissingInDest().format({
18795
- name: srcParamInfo.param.name,
18796
- }));
18797
- }
18798
- canAssign = false;
18799
- }
18800
- else if (destParamDetails.kwargsIndex !== undefined) {
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
- else {
18819
- const destParamType = destParamInfo.type;
18820
- const specializedDestParamType = constraints
18821
- ? solveAndApplyConstraints(destParamType, constraints)
18822
- : destParamType;
18823
- if (!assignParam(destParamInfo.type, srcParamType,
18824
- /* paramIndex */ undefined, paramDiag?.createAddendum(), constraints, flags, recursionCount)) {
18825
- if (paramDiag) {
18826
- paramDiag.addMessage(localize_1.LocAddendum.namedParamTypeMismatch().format({
18827
- name: srcParamInfo.param.name,
18828
- sourceType: printType(specializedDestParamType),
18829
- destType: printType(srcParamType),
18830
- }));
18831
- }
18832
- canAssign = false;
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.