@zzzen/pyright-internal 1.2.0-dev.20231008 → 1.2.0-dev.20231022

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 (145) hide show
  1. package/dist/analyzer/checker.js +33 -37
  2. package/dist/analyzer/checker.js.map +1 -1
  3. package/dist/analyzer/codeFlowEngine.js +2 -2
  4. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  5. package/dist/analyzer/constraintSolver.js +262 -168
  6. package/dist/analyzer/constraintSolver.js.map +1 -1
  7. package/dist/analyzer/constructors.js +3 -4
  8. package/dist/analyzer/constructors.js.map +1 -1
  9. package/dist/analyzer/decorators.js +3 -1
  10. package/dist/analyzer/decorators.js.map +1 -1
  11. package/dist/analyzer/parseTreeUtils.d.ts +1 -1
  12. package/dist/analyzer/patternMatching.js +4 -0
  13. package/dist/analyzer/patternMatching.js.map +1 -1
  14. package/dist/analyzer/program.js +7 -1
  15. package/dist/analyzer/program.js.map +1 -1
  16. package/dist/analyzer/properties.d.ts +2 -2
  17. package/dist/analyzer/properties.js +10 -4
  18. package/dist/analyzer/properties.js.map +1 -1
  19. package/dist/analyzer/protocols.js +119 -174
  20. package/dist/analyzer/protocols.js.map +1 -1
  21. package/dist/analyzer/service.js +13 -13
  22. package/dist/analyzer/service.js.map +1 -1
  23. package/dist/analyzer/sourceFile.d.ts +3 -2
  24. package/dist/analyzer/sourceFile.js +31 -11
  25. package/dist/analyzer/sourceFile.js.map +1 -1
  26. package/dist/analyzer/sourceFileInfo.d.ts +4 -4
  27. package/dist/analyzer/sourceFileInfo.js +2 -0
  28. package/dist/analyzer/sourceFileInfo.js.map +1 -1
  29. package/dist/analyzer/staticExpressions.js +2 -1
  30. package/dist/analyzer/staticExpressions.js.map +1 -1
  31. package/dist/analyzer/typeEvaluator.js +138 -123
  32. package/dist/analyzer/typeEvaluator.js.map +1 -1
  33. package/dist/analyzer/typeEvaluatorTypes.d.ts +4 -3
  34. package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
  35. package/dist/analyzer/typeGuards.js +101 -33
  36. package/dist/analyzer/typeGuards.js.map +1 -1
  37. package/dist/analyzer/typePrinter.js +4 -1
  38. package/dist/analyzer/typePrinter.js.map +1 -1
  39. package/dist/analyzer/typeUtils.d.ts +13 -2
  40. package/dist/analyzer/typeUtils.js +130 -51
  41. package/dist/analyzer/typeUtils.js.map +1 -1
  42. package/dist/analyzer/typeVarContext.d.ts +4 -1
  43. package/dist/analyzer/typeVarContext.js +7 -2
  44. package/dist/analyzer/typeVarContext.js.map +1 -1
  45. package/dist/analyzer/typedDicts.js +99 -27
  46. package/dist/analyzer/typedDicts.js.map +1 -1
  47. package/dist/analyzer/types.d.ts +6 -2
  48. package/dist/analyzer/types.js +49 -17
  49. package/dist/analyzer/types.js.map +1 -1
  50. package/dist/backgroundThreadBase.js +5 -1
  51. package/dist/backgroundThreadBase.js.map +1 -1
  52. package/dist/common/configOptions.d.ts +2 -1
  53. package/dist/common/configOptions.js +9 -5
  54. package/dist/common/configOptions.js.map +1 -1
  55. package/dist/common/extensibility.d.ts +0 -2
  56. package/dist/common/extensibility.js.map +1 -1
  57. package/dist/common/fileSystem.d.ts +9 -4
  58. package/dist/common/fileSystem.js +8 -1
  59. package/dist/common/fileSystem.js.map +1 -1
  60. package/dist/common/pathUtils.d.ts +8 -5
  61. package/dist/common/pathUtils.js +90 -33
  62. package/dist/common/pathUtils.js.map +1 -1
  63. package/dist/common/realFileSystem.d.ts +7 -1
  64. package/dist/common/realFileSystem.js +35 -22
  65. package/dist/common/realFileSystem.js.map +1 -1
  66. package/dist/common/serviceProviderExtensions.d.ts +3 -4
  67. package/dist/common/serviceProviderExtensions.js +3 -6
  68. package/dist/common/serviceProviderExtensions.js.map +1 -1
  69. package/dist/common/uriParser.d.ts +10 -1
  70. package/dist/common/uriParser.js.map +1 -1
  71. package/dist/languageServerBase.d.ts +4 -4
  72. package/dist/languageServerBase.js +3 -17
  73. package/dist/languageServerBase.js.map +1 -1
  74. package/dist/languageService/autoImporter.d.ts +1 -1
  75. package/dist/languageService/completionProvider.d.ts +2 -2
  76. package/dist/languageService/completionProvider.js +20 -23
  77. package/dist/languageService/completionProvider.js.map +1 -1
  78. package/dist/languageService/hoverProvider.d.ts +6 -2
  79. package/dist/languageService/hoverProvider.js +33 -65
  80. package/dist/languageService/hoverProvider.js.map +1 -1
  81. package/dist/languageService/navigationUtils.d.ts +1 -1
  82. package/dist/languageService/navigationUtils.js +2 -2
  83. package/dist/languageService/navigationUtils.js.map +1 -1
  84. package/dist/languageService/referencesProvider.d.ts +9 -2
  85. package/dist/languageService/referencesProvider.js +19 -12
  86. package/dist/languageService/referencesProvider.js.map +1 -1
  87. package/dist/languageService/tooltipUtils.js +1 -3
  88. package/dist/languageService/tooltipUtils.js.map +1 -1
  89. package/dist/localization/localize.d.ts +4 -3
  90. package/dist/localization/localize.js +1 -1
  91. package/dist/localization/localize.js.map +1 -1
  92. package/dist/localization/package.nls.cs.json +7 -1
  93. package/dist/localization/package.nls.de.json +7 -1
  94. package/dist/localization/package.nls.en-us.json +1 -1
  95. package/dist/localization/package.nls.es.json +7 -1
  96. package/dist/localization/package.nls.fr.json +7 -1
  97. package/dist/localization/package.nls.it.json +7 -1
  98. package/dist/localization/package.nls.ja.json +7 -1
  99. package/dist/localization/package.nls.ko.json +7 -1
  100. package/dist/localization/package.nls.pl.json +7 -1
  101. package/dist/localization/package.nls.pt-br.json +7 -1
  102. package/dist/localization/package.nls.qps-ploc.json +7 -1
  103. package/dist/localization/package.nls.ru.json +7 -1
  104. package/dist/localization/package.nls.tr.json +7 -1
  105. package/dist/localization/package.nls.zh-cn.json +7 -1
  106. package/dist/localization/package.nls.zh-tw.json +7 -1
  107. package/dist/pyright.js +2 -1
  108. package/dist/pyright.js.map +1 -1
  109. package/dist/pyrightFileSystem.d.ts +1 -16
  110. package/dist/pyrightFileSystem.js +1 -60
  111. package/dist/pyrightFileSystem.js.map +1 -1
  112. package/dist/readonlyAugmentedFileSystem.d.ts +1 -4
  113. package/dist/readonlyAugmentedFileSystem.js +0 -10
  114. package/dist/readonlyAugmentedFileSystem.js.map +1 -1
  115. package/dist/server.js +2 -1
  116. package/dist/server.js.map +1 -1
  117. package/dist/tests/config.test.js +5 -3
  118. package/dist/tests/config.test.js.map +1 -1
  119. package/dist/tests/fourslash/completions.indexer.keys.getitem.fourslash.js +56 -10
  120. package/dist/tests/fourslash/completions.indexer.keys.getitem.fourslash.js.map +1 -1
  121. package/dist/tests/harness/fourslash/testState.d.ts +5 -2
  122. package/dist/tests/harness/fourslash/testState.js +13 -14
  123. package/dist/tests/harness/fourslash/testState.js.map +1 -1
  124. package/dist/tests/harness/vfs/filesystem.d.ts +2 -2
  125. package/dist/tests/harness/vfs/filesystem.js +4 -0
  126. package/dist/tests/harness/vfs/filesystem.js.map +1 -1
  127. package/dist/tests/harness/vfs/pathValidation.js +10 -1
  128. package/dist/tests/harness/vfs/pathValidation.js.map +1 -1
  129. package/dist/tests/importResolver.test.js +0 -9
  130. package/dist/tests/importResolver.test.js.map +1 -1
  131. package/dist/tests/pathUtils.test.js +2 -2
  132. package/dist/tests/pathUtils.test.js.map +1 -1
  133. package/dist/tests/pyrightFileSystem.test.js +0 -20
  134. package/dist/tests/pyrightFileSystem.test.js.map +1 -1
  135. package/dist/tests/typeEvaluator1.test.js +4 -0
  136. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  137. package/dist/tests/typeEvaluator2.test.js +14 -2
  138. package/dist/tests/typeEvaluator2.test.js.map +1 -1
  139. package/dist/tests/typeEvaluator3.test.js +5 -1
  140. package/dist/tests/typeEvaluator3.test.js.map +1 -1
  141. package/dist/tests/typeEvaluator4.test.js +10 -2
  142. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  143. package/dist/tests/typeEvaluator5.test.js +7 -1
  144. package/dist/tests/typeEvaluator5.test.js.map +1 -1
  145. package/package.json +1 -1
@@ -168,14 +168,12 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
168
168
  // have the proper variance.
169
169
  this._validateProtocolTypeParamVariance(node, classTypeResult.classType);
170
170
  }
171
- // Skip the overrides check for stub files. Many of the built-in
172
- // typeshed stub files trigger this diagnostic. Also skip the slots
173
- // check because class variables declared in a stub file are
174
- // interpreted as instance variables.
171
+ // Skip the slots check because class variables declared in a stub
172
+ // file are interpreted as instance variables.
175
173
  if (!this._fileInfo.isStubFile) {
176
- this._validateBaseClassOverrides(classTypeResult.classType);
177
174
  this._validateSlotsClassVarConflict(classTypeResult.classType);
178
175
  }
176
+ this._validateBaseClassOverrides(classTypeResult.classType);
179
177
  this._validateMultipleInheritanceBaseClasses(classTypeResult.classType, node.name);
180
178
  this._validateMultipleInheritanceCompatibility(classTypeResult.classType, node.name);
181
179
  this._validateConstructorConsistency(classTypeResult.classType);
@@ -590,8 +588,11 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
590
588
  return true;
591
589
  }
592
590
  visitYield(node) {
593
- const yieldType = node.expression ? this._evaluator.getType(node.expression) : types_1.NoneType.createInstance();
594
- this._validateYieldType(node, yieldType || types_1.UnknownType.create());
591
+ var _a;
592
+ const yieldTypeResult = node.expression
593
+ ? this._evaluator.getTypeResult(node.expression)
594
+ : { type: types_1.NoneType.createInstance() };
595
+ this._validateYieldType(node, (_a = yieldTypeResult === null || yieldTypeResult === void 0 ? void 0 : yieldTypeResult.type) !== null && _a !== void 0 ? _a : types_1.UnknownType.create(), yieldTypeResult === null || yieldTypeResult === void 0 ? void 0 : yieldTypeResult.expectedTypeDiagAddendum);
595
596
  return true;
596
597
  }
597
598
  visitYieldFrom(node) {
@@ -619,7 +620,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
619
620
  (_d = (_c = this._evaluator.getTypeOfIterator({ type: yieldFromType }, /* isAsync */ false, node)) === null || _c === void 0 ? void 0 : _c.type) !== null && _d !== void 0 ? _d : types_1.UnknownType.create();
620
621
  }
621
622
  }
622
- this._validateYieldType(node, yieldType, sendType);
623
+ this._validateYieldType(node, yieldType, /* expectedDiagAddendum */ undefined, sendType);
623
624
  return true;
624
625
  }
625
626
  visitRaise(node) {
@@ -2645,12 +2646,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
2645
2646
  }
2646
2647
  break;
2647
2648
  case 3 /* None */:
2648
- if (!isInstanceCheck) {
2649
- isSupported = false;
2650
- }
2651
- else {
2652
- isSupported = types_1.TypeBase.isInstantiable(subtype);
2653
- }
2649
+ isSupported = types_1.TypeBase.isInstantiable(subtype);
2654
2650
  break;
2655
2651
  case 5 /* Function */:
2656
2652
  if (!types_1.TypeBase.isInstantiable(subtype) || subtype.isCallableWithTypeArgs) {
@@ -3634,8 +3630,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3634
3630
  }
3635
3631
  newMemberType = this._evaluator.bindFunctionToClassOrObject(classType, newMemberType,
3636
3632
  /* memberClass */ undefined,
3637
- /* errorNode */ undefined,
3638
- /* recursionCount */ undefined,
3639
3633
  /* treatConstructorAsClassMember */ true);
3640
3634
  if (!newMemberType) {
3641
3635
  return;
@@ -3745,10 +3739,6 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
3745
3739
  if (matchingMroClass && (0, types_1.isInstantiableClass)(matchingMroClass)) {
3746
3740
  const matchingMroObject = types_1.ClassType.cloneAsInstance(matchingMroClass);
3747
3741
  const baseClassMroObject = types_1.ClassType.cloneAsInstance(specializedBaseClassMroClass);
3748
- // If the types match exactly, we can shortcut the remainder of the MRO chain.
3749
- // if (isTypeSame(matchingMroObject, baseClassMroObject)) {
3750
- // break;
3751
- // }
3752
3742
  if (!this._evaluator.assignType(matchingMroObject, baseClassMroObject)) {
3753
3743
  const diag = new diagnostic_1.DiagnosticAddendum();
3754
3744
  const baseClassObject = (0, typeUtils_1.convertToInstance)(baseClass);
@@ -4073,7 +4063,9 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4073
4063
  if (memberName === '_') {
4074
4064
  return;
4075
4065
  }
4076
- const baseType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(baseClassAndSymbol.symbol), baseClassAndSymbol.classType);
4066
+ const baseClass = baseClassAndSymbol.classType;
4067
+ const childClassSelf = (0, typeUtils_1.selfSpecializeClass)(childClassType);
4068
+ const baseType = (0, typeUtils_1.partiallySpecializeType)(this._evaluator.getEffectiveTypeOfSymbol(baseClassAndSymbol.symbol), baseClass, types_1.ClassType.cloneAsInstance(childClassSelf));
4077
4069
  if ((0, types_1.isFunction)(baseType) || (0, types_1.isOverloadedFunction)(baseType)) {
4078
4070
  const diagAddendum = new diagnostic_1.DiagnosticAddendum();
4079
4071
  if ((0, types_1.isFunction)(overrideType) || (0, types_1.isOverloadedFunction)(overrideType)) {
@@ -4083,8 +4075,12 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4083
4075
  // false positives.
4084
4076
  const enforceParamNameMatch = !SymbolNameUtils.isDunderName(memberName);
4085
4077
  // Don't check certain magic functions or private symbols.
4078
+ // Also, skip this check if the class is a TypedDict. The methods for a TypedDict
4079
+ // are synthesized, and they can result in many overloads. We assume they
4080
+ // are correct and will not produce any errors.
4086
4081
  if (!exemptMethods.some((exempt) => exempt === memberName) &&
4087
- !SymbolNameUtils.isPrivateName(memberName)) {
4082
+ !SymbolNameUtils.isPrivateName(memberName) &&
4083
+ !types_1.ClassType.isTypedDictClass(childClassType)) {
4088
4084
  if (!this._evaluator.validateOverrideMethod(baseType, overrideType, childClassType, diagAddendum, enforceParamNameMatch)) {
4089
4085
  const decl = (0, types_1.isFunction)(overrideType) && overrideType.details.declaration
4090
4086
  ? overrideType.details.declaration
@@ -4092,7 +4088,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4092
4088
  if (decl) {
4093
4089
  const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleMethodOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleMethodOverride, localize_1.Localizer.Diagnostic.incompatibleMethodOverride().format({
4094
4090
  name: memberName,
4095
- className: baseClassAndSymbol.classType.details.name,
4091
+ className: baseClass.details.name,
4096
4092
  }) + diagAddendum.getString(), decl.type === 5 /* Function */ ? decl.node.name : decl.node);
4097
4093
  const origDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(baseClassAndSymbol.symbol);
4098
4094
  if (diag && origDecl) {
@@ -4108,7 +4104,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4108
4104
  if (decl && decl.type === 5 /* Function */) {
4109
4105
  const diag = this._evaluator.addError(localize_1.Localizer.Diagnostic.finalMethodOverride().format({
4110
4106
  name: memberName,
4111
- className: baseClassAndSymbol.classType.details.name,
4107
+ className: baseClass.details.name,
4112
4108
  }), decl.node.name);
4113
4109
  const origDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(baseClassAndSymbol.symbol);
4114
4110
  if (diag && origDecl) {
@@ -4122,13 +4118,13 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4122
4118
  // Special-case overrides of methods in '_TypedDict', since
4123
4119
  // TypedDict attributes aren't manifest as attributes but rather
4124
4120
  // as named keys.
4125
- if (!types_1.ClassType.isBuiltIn(baseClassAndSymbol.classType, '_TypedDict')) {
4121
+ if (!types_1.ClassType.isBuiltIn(baseClass, '_TypedDict')) {
4126
4122
  const decls = overrideSymbol.getDeclarations();
4127
4123
  if (decls.length > 0) {
4128
4124
  const lastDecl = decls[decls.length - 1];
4129
4125
  const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleMethodOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleMethodOverride, localize_1.Localizer.Diagnostic.methodOverridden().format({
4130
4126
  name: memberName,
4131
- className: baseClassAndSymbol.classType.details.name,
4127
+ className: baseClass.details.name,
4132
4128
  type: this._evaluator.printType(overrideType),
4133
4129
  }), lastDecl.node);
4134
4130
  const origDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(baseClassAndSymbol.symbol);
@@ -4146,14 +4142,14 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4146
4142
  if (decls.length > 0) {
4147
4143
  this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleMethodOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleMethodOverride, localize_1.Localizer.Diagnostic.propertyOverridden().format({
4148
4144
  name: memberName,
4149
- className: baseClassAndSymbol.classType.details.name,
4145
+ className: baseClass.details.name,
4150
4146
  }), decls[decls.length - 1].node);
4151
4147
  }
4152
4148
  }
4153
4149
  else {
4154
4150
  const basePropFields = baseType.details.fields;
4155
4151
  const subclassPropFields = overrideType.details.fields;
4156
- const baseClassType = baseClassAndSymbol.classType;
4152
+ const baseClassType = baseClass;
4157
4153
  ['fget', 'fset', 'fdel'].forEach((methodName) => {
4158
4154
  const diagAddendum = new diagnostic_1.DiagnosticAddendum();
4159
4155
  const baseClassPropMethod = basePropFields.get(methodName);
@@ -4218,9 +4214,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4218
4214
  let isInvariant = (primaryDecl === null || primaryDecl === void 0 ? void 0 : primaryDecl.type) === 1 /* Variable */ && !primaryDecl.isFinal;
4219
4215
  // If the entry is a member of a frozen dataclass, it is immutable,
4220
4216
  // so it does not need to be invariant.
4221
- if (types_1.ClassType.isFrozenDataClass(baseClassAndSymbol.classType) &&
4222
- baseClassAndSymbol.classType.details.dataClassEntries) {
4223
- const dataclassEntry = baseClassAndSymbol.classType.details.dataClassEntries.find((entry) => entry.name === memberName);
4217
+ if (types_1.ClassType.isFrozenDataClass(baseClass) && baseClass.details.dataClassEntries) {
4218
+ const dataclassEntry = baseClass.details.dataClassEntries.find((entry) => entry.name === memberName);
4224
4219
  if (dataclassEntry) {
4225
4220
  isInvariant = false;
4226
4221
  }
@@ -4239,7 +4234,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4239
4234
  }
4240
4235
  const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleVariableOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleVariableOverride, localize_1.Localizer.Diagnostic.symbolOverridden().format({
4241
4236
  name: memberName,
4242
- className: baseClassAndSymbol.classType.details.name,
4237
+ className: baseClass.details.name,
4243
4238
  }) + diagAddendum.getString(), (_a = (0, declarationUtils_1.getNameNodeForDeclaration)(lastDecl)) !== null && _a !== void 0 ? _a : lastDecl.node);
4244
4239
  const origDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(baseClassAndSymbol.symbol);
4245
4240
  if (diag && origDecl) {
@@ -4252,7 +4247,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4252
4247
  if (!isBaseVarFinal && overrideFinalVarDecl) {
4253
4248
  const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleVariableOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleVariableOverride, localize_1.Localizer.Diagnostic.variableFinalOverride().format({
4254
4249
  name: memberName,
4255
- className: baseClassAndSymbol.classType.details.name,
4250
+ className: baseClass.details.name,
4256
4251
  }), lastDecl.node);
4257
4252
  if (diag) {
4258
4253
  diag.addRelatedInfo(localize_1.Localizer.DiagnosticAddendum.overriddenSymbol(), overrideFinalVarDecl.path, overrideFinalVarDecl.range);
@@ -4281,7 +4276,7 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4281
4276
  : localize_1.Localizer.Diagnostic.instanceVarOverridesClassVar();
4282
4277
  const diag = this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportIncompatibleVariableOverride, diagnosticRules_1.DiagnosticRule.reportIncompatibleVariableOverride, unformattedMessage.format({
4283
4278
  name: memberName,
4284
- className: baseClassAndSymbol.classType.details.name,
4279
+ className: baseClass.details.name,
4285
4280
  }), (_b = (0, declarationUtils_1.getNameNodeForDeclaration)(lastDecl)) !== null && _b !== void 0 ? _b : lastDecl.node);
4286
4281
  const origDecl = (0, symbolUtils_1.getLastTypedDeclaredForSymbol)(baseClassAndSymbol.symbol);
4287
4282
  if (diag && origDecl) {
@@ -4525,8 +4520,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4525
4520
  }
4526
4521
  // Determines whether a yield or yield from node is compatible with the
4527
4522
  // return type annotation of the containing function.
4528
- _validateYieldType(node, yieldType, sendType) {
4529
- var _a;
4523
+ _validateYieldType(node, yieldType, expectedDiagAddendum, sendType) {
4524
+ var _a, _b, _c, _d;
4530
4525
  const enclosingFunctionNode = ParseTreeUtils.getEnclosingFunction(node);
4531
4526
  if (!enclosingFunctionNode || !enclosingFunctionNode.returnTypeAnnotation) {
4532
4527
  return;
@@ -4567,7 +4562,8 @@ class Checker extends parseTreeWalker_1.ParseTreeWalker {
4567
4562
  const errorMessage = enclosingFunctionNode.isAsync
4568
4563
  ? localize_1.Localizer.Diagnostic.generatorAsyncReturnType()
4569
4564
  : localize_1.Localizer.Diagnostic.generatorSyncReturnType();
4570
- this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, errorMessage.format({ yieldType: this._evaluator.printType(yieldType) }) + diagAddendum.getString(), (_a = node.expression) !== null && _a !== void 0 ? _a : node);
4565
+ this._evaluator.addDiagnostic(this._fileInfo.diagnosticRuleSet.reportGeneralTypeIssues, diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, errorMessage.format({ yieldType: this._evaluator.printType(yieldType) }) +
4566
+ ((_a = expectedDiagAddendum === null || expectedDiagAddendum === void 0 ? void 0 : expectedDiagAddendum.getString()) !== null && _a !== void 0 ? _a : diagAddendum.getString()), (_b = node.expression) !== null && _b !== void 0 ? _b : node, (_d = (_c = expectedDiagAddendum === null || expectedDiagAddendum === void 0 ? void 0 : expectedDiagAddendum.getEffectiveTextRange()) !== null && _c !== void 0 ? _c : node.expression) !== null && _d !== void 0 ? _d : node);
4571
4567
  }
4572
4568
  }
4573
4569
  // Determines whether any of the except statements are unreachable because