@zzzen/pyright-internal 1.2.0-dev.20250413 → 1.2.0-dev.20250802

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 (277) hide show
  1. package/dist/analyzer/analyzerFileInfo.d.ts +0 -1
  2. package/dist/analyzer/analyzerFileInfo.js.map +1 -1
  3. package/dist/analyzer/analyzerNodeInfo.js +1 -1
  4. package/dist/analyzer/analyzerNodeInfo.js.map +1 -1
  5. package/dist/analyzer/binder.d.ts +2 -1
  6. package/dist/analyzer/binder.js +45 -38
  7. package/dist/analyzer/binder.js.map +1 -1
  8. package/dist/analyzer/checker.js +81 -44
  9. package/dist/analyzer/checker.js.map +1 -1
  10. package/dist/analyzer/codeFlowEngine.js +19 -7
  11. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  12. package/dist/analyzer/codeFlowTypes.d.ts +9 -8
  13. package/dist/analyzer/codeFlowTypes.js +9 -8
  14. package/dist/analyzer/codeFlowTypes.js.map +1 -1
  15. package/dist/analyzer/codeFlowUtils.js +4 -2
  16. package/dist/analyzer/codeFlowUtils.js.map +1 -1
  17. package/dist/analyzer/dataClasses.js +7 -2
  18. package/dist/analyzer/dataClasses.js.map +1 -1
  19. package/dist/analyzer/docStringUtils.js +3 -1
  20. package/dist/analyzer/docStringUtils.js.map +1 -1
  21. package/dist/analyzer/importResolver.d.ts +0 -1
  22. package/dist/analyzer/importResolver.js +2 -25
  23. package/dist/analyzer/importResolver.js.map +1 -1
  24. package/dist/analyzer/importResult.d.ts +0 -1
  25. package/dist/analyzer/importStatementUtils.js +5 -3
  26. package/dist/analyzer/importStatementUtils.js.map +1 -1
  27. package/dist/analyzer/namedTuples.js +10 -0
  28. package/dist/analyzer/namedTuples.js.map +1 -1
  29. package/dist/analyzer/operations.js +1 -1
  30. package/dist/analyzer/operations.js.map +1 -1
  31. package/dist/analyzer/packageTypeVerifier.js +5 -3
  32. package/dist/analyzer/packageTypeVerifier.js.map +1 -1
  33. package/dist/analyzer/parameterUtils.js +10 -3
  34. package/dist/analyzer/parameterUtils.js.map +1 -1
  35. package/dist/analyzer/parseTreeUtils.d.ts +3 -4
  36. package/dist/analyzer/parseTreeUtils.js +19 -225
  37. package/dist/analyzer/parseTreeUtils.js.map +1 -1
  38. package/dist/analyzer/patternMatching.js +4 -0
  39. package/dist/analyzer/patternMatching.js.map +1 -1
  40. package/dist/analyzer/program.d.ts +12 -2
  41. package/dist/analyzer/program.js +78 -75
  42. package/dist/analyzer/program.js.map +1 -1
  43. package/dist/analyzer/programTypes.d.ts +2 -2
  44. package/dist/analyzer/programTypes.js.map +1 -1
  45. package/dist/analyzer/properties.js +3 -5
  46. package/dist/analyzer/properties.js.map +1 -1
  47. package/dist/analyzer/protocols.js +13 -3
  48. package/dist/analyzer/protocols.js.map +1 -1
  49. package/dist/analyzer/sentinel.d.ts +4 -0
  50. package/dist/analyzer/sentinel.js +51 -0
  51. package/dist/analyzer/sentinel.js.map +1 -0
  52. package/dist/analyzer/service.d.ts +2 -2
  53. package/dist/analyzer/service.js +7 -6
  54. package/dist/analyzer/service.js.map +1 -1
  55. package/dist/analyzer/sourceFile.d.ts +5 -2
  56. package/dist/analyzer/sourceFile.js +53 -15
  57. package/dist/analyzer/sourceFile.js.map +1 -1
  58. package/dist/analyzer/sourceFileInfo.d.ts +10 -1
  59. package/dist/analyzer/sourceFileInfo.js +28 -0
  60. package/dist/analyzer/sourceFileInfo.js.map +1 -1
  61. package/dist/analyzer/sourceFileInfoUtils.js +4 -4
  62. package/dist/analyzer/sourceFileInfoUtils.js.map +1 -1
  63. package/dist/analyzer/sourceMapper.d.ts +1 -1
  64. package/dist/analyzer/sourceMapper.js +20 -20
  65. package/dist/analyzer/sourceMapper.js.map +1 -1
  66. package/dist/analyzer/symbol.d.ts +3 -0
  67. package/dist/analyzer/symbol.js +11 -0
  68. package/dist/analyzer/symbol.js.map +1 -1
  69. package/dist/analyzer/testWalker.js +2 -13
  70. package/dist/analyzer/testWalker.js.map +1 -1
  71. package/dist/analyzer/tracePrinter.js +1 -1
  72. package/dist/analyzer/tracePrinter.js.map +1 -1
  73. package/dist/analyzer/typeEvaluator.js +278 -147
  74. package/dist/analyzer/typeEvaluator.js.map +1 -1
  75. package/dist/analyzer/typeEvaluatorTypes.d.ts +8 -4
  76. package/dist/analyzer/typeEvaluatorTypes.js +15 -2
  77. package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
  78. package/dist/analyzer/typeGuards.js +47 -13
  79. package/dist/analyzer/typeGuards.js.map +1 -1
  80. package/dist/analyzer/typePrinter.js +10 -2
  81. package/dist/analyzer/typePrinter.js.map +1 -1
  82. package/dist/analyzer/typePrinterUtils.js +2 -2
  83. package/dist/analyzer/typePrinterUtils.js.map +1 -1
  84. package/dist/analyzer/typeUtils.d.ts +2 -0
  85. package/dist/analyzer/typeUtils.js +14 -3
  86. package/dist/analyzer/typeUtils.js.map +1 -1
  87. package/dist/analyzer/typedDicts.js +9 -5
  88. package/dist/analyzer/typedDicts.js.map +1 -1
  89. package/dist/analyzer/types.d.ts +9 -2
  90. package/dist/analyzer/types.js +39 -1
  91. package/dist/analyzer/types.js.map +1 -1
  92. package/dist/commands/dumpFileDebugInfoCommand.d.ts +96 -0
  93. package/dist/commands/dumpFileDebugInfoCommand.js +13 -2
  94. package/dist/commands/dumpFileDebugInfoCommand.js.map +1 -1
  95. package/dist/common/cancellationUtils.d.ts +1 -1
  96. package/dist/common/cancellationUtils.js +2 -2
  97. package/dist/common/cancellationUtils.js.map +1 -1
  98. package/dist/common/charCodes.d.ts +1 -1
  99. package/dist/common/charCodes.js +1 -1
  100. package/dist/common/charCodes.js.map +1 -1
  101. package/dist/common/configOptions.d.ts +1 -0
  102. package/dist/common/configOptions.js +5 -0
  103. package/dist/common/configOptions.js.map +1 -1
  104. package/dist/common/core.d.ts +1 -3
  105. package/dist/common/core.js +3 -4
  106. package/dist/common/core.js.map +1 -1
  107. package/dist/common/diagnostic.d.ts +1 -1
  108. package/dist/common/diagnosticRules.d.ts +1 -0
  109. package/dist/common/diagnosticRules.js +1 -0
  110. package/dist/common/diagnosticRules.js.map +1 -1
  111. package/dist/common/docRange.d.ts +6 -0
  112. package/dist/common/docRange.js +10 -0
  113. package/dist/common/docRange.js.map +1 -0
  114. package/dist/common/envVarUtils.js +1 -6
  115. package/dist/common/envVarUtils.js.map +1 -1
  116. package/dist/common/extensibility.d.ts +11 -2
  117. package/dist/common/extensibility.js.map +1 -1
  118. package/dist/common/fileBasedCancellationUtils.d.ts +1 -0
  119. package/dist/common/fileBasedCancellationUtils.js +1 -0
  120. package/dist/common/fileBasedCancellationUtils.js.map +1 -1
  121. package/dist/common/logTracker.d.ts +5 -1
  122. package/dist/common/logTracker.js +43 -26
  123. package/dist/common/logTracker.js.map +1 -1
  124. package/dist/common/pathUtils.d.ts +1 -1
  125. package/dist/common/pathUtils.js +3 -2
  126. package/dist/common/pathUtils.js.map +1 -1
  127. package/dist/common/realFileSystem.d.ts +1 -1
  128. package/dist/common/realFileSystem.js +2 -1
  129. package/dist/common/realFileSystem.js.map +1 -1
  130. package/dist/common/serviceProviderExtensions.js +2 -2
  131. package/dist/common/serviceProviderExtensions.js.map +1 -1
  132. package/dist/common/stringUtils.d.ts +0 -1
  133. package/dist/common/stringUtils.js +0 -42
  134. package/dist/common/stringUtils.js.map +1 -1
  135. package/dist/common/textEditTracker.js +5 -3
  136. package/dist/common/textEditTracker.js.map +1 -1
  137. package/dist/common/textRange.d.ts +5 -11
  138. package/dist/common/textRange.js +31 -56
  139. package/dist/common/textRange.js.map +1 -1
  140. package/dist/common/textRangeCollection.js +3 -2
  141. package/dist/common/textRangeCollection.js.map +1 -1
  142. package/dist/common/uri/baseUri.js +2 -1
  143. package/dist/common/uri/baseUri.js.map +1 -1
  144. package/dist/common/uri/uri.d.ts +5 -2
  145. package/dist/common/uri/uri.js +21 -5
  146. package/dist/common/uri/uri.js.map +1 -1
  147. package/dist/common/uri/uriUtils.d.ts +2 -2
  148. package/dist/common/uri/uriUtils.js +4 -3
  149. package/dist/common/uri/uriUtils.js.map +1 -1
  150. package/dist/common/workspaceEditUtils.js +9 -9
  151. package/dist/common/workspaceEditUtils.js.map +1 -1
  152. package/dist/languageServerBase.d.ts +5 -3
  153. package/dist/languageServerBase.js +44 -37
  154. package/dist/languageServerBase.js.map +1 -1
  155. package/dist/languageService/analyzerServiceExecutor.d.ts +3 -0
  156. package/dist/languageService/analyzerServiceExecutor.js +1 -0
  157. package/dist/languageService/analyzerServiceExecutor.js.map +1 -1
  158. package/dist/languageService/autoImporter.d.ts +2 -2
  159. package/dist/languageService/autoImporter.js +3 -3
  160. package/dist/languageService/autoImporter.js.map +1 -1
  161. package/dist/languageService/callHierarchyProvider.js +2 -3
  162. package/dist/languageService/callHierarchyProvider.js.map +1 -1
  163. package/dist/languageService/completionProvider.js +16 -13
  164. package/dist/languageService/completionProvider.js.map +1 -1
  165. package/dist/languageService/definitionProvider.d.ts +2 -1
  166. package/dist/languageService/definitionProvider.js.map +1 -1
  167. package/dist/languageService/documentSymbolCollector.d.ts +4 -1
  168. package/dist/languageService/documentSymbolCollector.js +9 -7
  169. package/dist/languageService/documentSymbolCollector.js.map +1 -1
  170. package/dist/languageService/hoverProvider.js +1 -9
  171. package/dist/languageService/hoverProvider.js.map +1 -1
  172. package/dist/languageService/importSorter.js +1 -0
  173. package/dist/languageService/importSorter.js.map +1 -1
  174. package/dist/languageService/navigationUtils.d.ts +1 -1
  175. package/dist/languageService/referencesProvider.d.ts +2 -1
  176. package/dist/languageService/referencesProvider.js +8 -7
  177. package/dist/languageService/referencesProvider.js.map +1 -1
  178. package/dist/languageService/renameProvider.js +4 -19
  179. package/dist/languageService/renameProvider.js.map +1 -1
  180. package/dist/languageService/tooltipUtils.d.ts +2 -0
  181. package/dist/languageService/tooltipUtils.js +2 -0
  182. package/dist/languageService/tooltipUtils.js.map +1 -1
  183. package/dist/languageService/workspaceSymbolProvider.js +1 -1
  184. package/dist/languageService/workspaceSymbolProvider.js.map +1 -1
  185. package/dist/localization/localize.d.ts +16 -2
  186. package/dist/localization/localize.js +16 -2
  187. package/dist/localization/localize.js.map +1 -1
  188. package/dist/localization/package.nls.cs.json +23 -9
  189. package/dist/localization/package.nls.de.json +18 -4
  190. package/dist/localization/package.nls.en-us.json +53 -3
  191. package/dist/localization/package.nls.es.json +18 -4
  192. package/dist/localization/package.nls.fr.json +22 -8
  193. package/dist/localization/package.nls.it.json +23 -9
  194. package/dist/localization/package.nls.ja.json +18 -4
  195. package/dist/localization/package.nls.ko.json +23 -9
  196. package/dist/localization/package.nls.pl.json +18 -4
  197. package/dist/localization/package.nls.pt-br.json +18 -4
  198. package/dist/localization/package.nls.qps-ploc.json +17 -3
  199. package/dist/localization/package.nls.ru.json +18 -4
  200. package/dist/localization/package.nls.tr.json +23 -9
  201. package/dist/localization/package.nls.zh-cn.json +18 -4
  202. package/dist/localization/package.nls.zh-tw.json +18 -4
  203. package/dist/parser/characters.d.ts +1 -8
  204. package/dist/parser/characters.js +6 -3
  205. package/dist/parser/characters.js.map +1 -1
  206. package/dist/parser/parseNodeUtils.d.ts +12 -0
  207. package/dist/parser/parseNodeUtils.js +136 -0
  208. package/dist/parser/parseNodeUtils.js.map +1 -0
  209. package/dist/parser/parseNodes.d.ts +12 -2
  210. package/dist/parser/parseNodes.js +17 -2
  211. package/dist/parser/parseNodes.js.map +1 -1
  212. package/dist/parser/parser.d.ts +5 -2
  213. package/dist/parser/parser.js +83 -47
  214. package/dist/parser/parser.js.map +1 -1
  215. package/dist/parser/tokenizer.d.ts +3 -3
  216. package/dist/parser/tokenizer.js +58 -38
  217. package/dist/parser/tokenizer.js.map +1 -1
  218. package/dist/parser/tokenizerTypes.d.ts +4 -3
  219. package/dist/parser/tokenizerTypes.js +4 -3
  220. package/dist/parser/tokenizerTypes.js.map +1 -1
  221. package/dist/pyright.js +1 -1
  222. package/dist/pyright.js.map +1 -1
  223. package/dist/server.js +3 -3
  224. package/dist/server.js.map +1 -1
  225. package/dist/tests/checker.test.js +2 -2
  226. package/dist/tests/common.test.js +6 -6
  227. package/dist/tests/common.test.js.map +1 -1
  228. package/dist/tests/fourslash/completions.autoimport.unicode.fourslash.js +29 -0
  229. package/dist/tests/fourslash/completions.autoimport.unicode.fourslash.js.map +1 -0
  230. package/dist/tests/fourslash/completions.declNames.method.fourslash.js +8 -8
  231. package/dist/tests/fourslash/import.pytyped.privateSymbols.fourslash.js +0 -18
  232. package/dist/tests/fourslash/import.pytyped.privateSymbols.fourslash.js.map +1 -1
  233. package/dist/tests/harness/fourslash/testState.d.ts +3 -2
  234. package/dist/tests/harness/fourslash/testState.js +9 -3
  235. package/dist/tests/harness/fourslash/testState.js.map +1 -1
  236. package/dist/tests/lsp/languageServer.js +1 -1
  237. package/dist/tests/lsp/languageServer.js.map +1 -1
  238. package/dist/tests/lsp/languageServerTestUtils.d.ts +1 -2
  239. package/dist/tests/lsp/languageServerTestUtils.js +2 -2
  240. package/dist/tests/lsp/languageServerTestUtils.js.map +1 -1
  241. package/dist/tests/parser.test.js +17 -0
  242. package/dist/tests/parser.test.js.map +1 -1
  243. package/dist/tests/positionUtils.test.js +1 -1
  244. package/dist/tests/service.test.js +4 -4
  245. package/dist/tests/service.test.js.map +1 -1
  246. package/dist/tests/sourceFile.test.js +21 -4
  247. package/dist/tests/sourceFile.test.js.map +1 -1
  248. package/dist/tests/stringUtils.test.js +0 -12
  249. package/dist/tests/stringUtils.test.js.map +1 -1
  250. package/dist/tests/testStateUtils.js +8 -3
  251. package/dist/tests/testStateUtils.js.map +1 -1
  252. package/dist/tests/testUtils.js +1 -1
  253. package/dist/tests/testUtils.js.map +1 -1
  254. package/dist/tests/tokenizer.test.js +5 -5
  255. package/dist/tests/tokenizer.test.js.map +1 -1
  256. package/dist/tests/typeEvaluator1.test.js +11 -13
  257. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  258. package/dist/tests/typeEvaluator2.test.js +15 -1
  259. package/dist/tests/typeEvaluator2.test.js.map +1 -1
  260. package/dist/tests/typeEvaluator4.test.js +16 -1
  261. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  262. package/dist/tests/typeEvaluator5.test.js +10 -4
  263. package/dist/tests/typeEvaluator5.test.js.map +1 -1
  264. package/dist/tests/typeEvaluator6.test.js +1 -1
  265. package/dist/tests/typeEvaluator7.test.js +9 -0
  266. package/dist/tests/typeEvaluator7.test.js.map +1 -1
  267. package/dist/tests/typeEvaluator8.test.js +8 -0
  268. package/dist/tests/typeEvaluator8.test.js.map +1 -1
  269. package/dist/tests/workspaceEditUtils.test.js +7 -9
  270. package/dist/tests/workspaceEditUtils.test.js.map +1 -1
  271. package/dist/types.d.ts +1 -1
  272. package/dist/workspaceFactory.d.ts +12 -1
  273. package/dist/workspaceFactory.js.map +1 -1
  274. package/package.json +2 -3
  275. package/dist/tests/fourslash/rename.args.fourslash.js +0 -72
  276. package/dist/tests/fourslash/rename.args.fourslash.js.map +0 -1
  277. /package/dist/tests/fourslash/{rename.args.fourslash.d.ts → completions.autoimport.unicode.fourslash.d.ts} +0 -0
@@ -75,6 +75,7 @@ const patternMatching_1 = require("./patternMatching");
75
75
  const properties_1 = require("./properties");
76
76
  const protocols_1 = require("./protocols");
77
77
  const ScopeUtils = __importStar(require("./scopeUtils"));
78
+ const sentinel_1 = require("./sentinel");
78
79
  const staticExpressions_1 = require("./staticExpressions");
79
80
  const symbol_1 = require("./symbol");
80
81
  const symbolNameUtils_1 = require("./symbolNameUtils");
@@ -487,7 +488,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
487
488
  prefetched = {};
488
489
  prefetched.objectClass = getBuiltInType(node, 'object');
489
490
  prefetched.typeClass = getBuiltInType(node, 'type');
490
- prefetched.functionClass = getBuiltInType(node, 'function');
491
+ prefetched.functionClass = getTypesType(node, 'FunctionType') ?? getBuiltInType(node, 'function');
492
+ prefetched.methodClass = getTypesType(node, 'MethodType');
491
493
  prefetched.unionTypeClass = getTypesType(node, 'UnionType');
492
494
  if (prefetched.unionTypeClass && (0, types_1.isClass)(prefetched.unionTypeClass)) {
493
495
  prefetched.unionTypeClass.shared.flags |= 8388608 /* ClassTypeFlags.SpecialFormClass */;
@@ -503,9 +505,11 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
503
505
  prefetched.dictClass = getBuiltInType(node, 'dict');
504
506
  prefetched.moduleTypeClass = getTypingType(node, 'ModuleType');
505
507
  prefetched.typedDictClass = getTypingType(node, 'TypedDict');
506
- prefetched.typedDictPrivateClass = getTypingType(node, '_TypedDict');
508
+ prefetched.typedDictPrivateClass =
509
+ getTypeCheckerInternalsType(node, 'TypedDictFallback') ?? getTypingType(node, '_TypedDict');
507
510
  prefetched.awaitableClass = getTypingType(node, 'Awaitable');
508
511
  prefetched.mappingClass = getTypingType(node, 'Mapping');
512
+ prefetched.templateClass = getTypeOfModule(node, 'Template', ['string', 'templatelib']);
509
513
  prefetched.supportsKeysAndGetItemClass = getTypeshedType(node, 'SupportsKeysAndGetItem');
510
514
  if (!prefetched.supportsKeysAndGetItemClass) {
511
515
  // Fall back on 'Mapping' if 'SupportsKeysAndGetItem' is not available.
@@ -943,7 +947,9 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
943
947
  const isBytes = firstBytesIndex >= 0;
944
948
  let isLiteralString = true;
945
949
  let isIncomplete = false;
950
+ let isTemplate = false;
946
951
  node.d.strings.forEach((expr) => {
952
+ // Handle implicit concatenation.
947
953
  const typeResult = getTypeOfString(expr);
948
954
  if (typeResult.isIncomplete) {
949
955
  isIncomplete = true;
@@ -956,13 +962,21 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
956
962
  else if (types_1.ClassType.isBuiltIn(typeResult?.type, 'LiteralString')) {
957
963
  isExprLiteralString = true;
958
964
  }
965
+ if (typeResult.type.shared.name === 'Template') {
966
+ isTemplate = true;
967
+ }
959
968
  }
960
969
  if (!isExprLiteralString) {
961
970
  isLiteralString = false;
962
971
  }
963
972
  });
964
- // Don't create a literal type if it's an f-string.
965
- if (node.d.strings.some((str) => str.nodeType === 30 /* ParseNodeType.FormatString */)) {
973
+ if (isTemplate) {
974
+ const templateType = prefetched?.templateClass && (0, types_1.isInstantiableClass)(prefetched?.templateClass)
975
+ ? types_1.ClassType.cloneAsInstance(prefetched.templateClass)
976
+ : types_1.UnknownType.create();
977
+ typeResult = { type: templateType, isIncomplete };
978
+ }
979
+ else if (node.d.strings.some((str) => str.nodeType === 30 /* ParseNodeType.FormatString */)) {
966
980
  if (isLiteralString) {
967
981
  const literalStringType = getTypingType(node, 'LiteralString');
968
982
  if (literalStringType && (0, types_1.isInstantiableClass)(literalStringType)) {
@@ -992,7 +1006,11 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
992
1006
  // TypeForm (really long, triple-quoted, etc.).
993
1007
  const stringNode = node.d.strings[0];
994
1008
  const tokenFlags = stringNode.d.token.flags;
995
- const disallowedTokenFlags = 32 /* StringTokenFlags.Bytes */ | 8 /* StringTokenFlags.Raw */ | 64 /* StringTokenFlags.Format */ | 4 /* StringTokenFlags.Triplicate */;
1009
+ const disallowedTokenFlags = 32 /* StringTokenFlags.Bytes */ |
1010
+ 8 /* StringTokenFlags.Raw */ |
1011
+ 64 /* StringTokenFlags.Format */ |
1012
+ 128 /* StringTokenFlags.Template */ |
1013
+ 4 /* StringTokenFlags.Triplicate */;
996
1014
  const maxTypeFormStringLength = 256;
997
1015
  if ((tokenFlags & disallowedTokenFlags) !== 0 ||
998
1016
  stringNode.d.token.escapedValue.length >= maxTypeFormStringLength) {
@@ -1037,6 +1055,12 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
1037
1055
  }
1038
1056
  return { type: types_1.UnknownType.create() };
1039
1057
  }
1058
+ if (tokenFlags & 128 /* StringTokenFlags.Template */) {
1059
+ if (reportTypeErrors) {
1060
+ addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.annotationTemplateString(), node);
1061
+ }
1062
+ return { type: types_1.UnknownType.create() };
1063
+ }
1040
1064
  // We didn't know at parse time that this string node was going
1041
1065
  // to be evaluated as a forward-referenced type. We need
1042
1066
  // to re-invoke the parser at this stage.
@@ -1059,8 +1083,14 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
1059
1083
  const isBytes = (node.d.token.flags & 32 /* StringTokenFlags.Bytes */) !== 0;
1060
1084
  let typeResult;
1061
1085
  let isIncomplete = false;
1062
- // Don't create a literal type if it's an f-string.
1063
- if (node.nodeType === 30 /* ParseNodeType.FormatString */) {
1086
+ if (node.nodeType === 49 /* ParseNodeType.String */) {
1087
+ typeResult = {
1088
+ type: cloneBuiltinObjectWithLiteral(node, isBytes ? 'bytes' : 'str', node.d.value),
1089
+ isIncomplete,
1090
+ };
1091
+ }
1092
+ else {
1093
+ const isTemplateString = (node.d.token.flags & 128 /* StringTokenFlags.Template */) !== 0;
1064
1094
  let isLiteralString = true;
1065
1095
  // If all of the format expressions are of type LiteralString, then
1066
1096
  // the resulting formatted string is also LiteralString.
@@ -1084,7 +1114,13 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
1084
1114
  isLiteralString = false;
1085
1115
  });
1086
1116
  });
1087
- if (!isBytes && isLiteralString) {
1117
+ if (isTemplateString) {
1118
+ const templateType = prefetched?.templateClass && (0, types_1.isInstantiableClass)(prefetched?.templateClass)
1119
+ ? types_1.ClassType.cloneAsInstance(prefetched.templateClass)
1120
+ : types_1.UnknownType.create();
1121
+ typeResult = { type: templateType, isIncomplete };
1122
+ }
1123
+ else if (!isBytes && isLiteralString) {
1088
1124
  const literalStringType = getTypingType(node, 'LiteralString');
1089
1125
  if (literalStringType && (0, types_1.isInstantiableClass)(literalStringType)) {
1090
1126
  typeResult = { type: types_1.ClassType.cloneAsInstance(literalStringType), isIncomplete };
@@ -1100,12 +1136,6 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
1100
1136
  }
1101
1137
  }
1102
1138
  }
1103
- else {
1104
- typeResult = {
1105
- type: cloneBuiltinObjectWithLiteral(node, isBytes ? 'bytes' : 'str', node.d.value),
1106
- isIncomplete,
1107
- };
1108
- }
1109
1139
  return typeResult;
1110
1140
  }
1111
1141
  function stripLiteralValue(type) {
@@ -1205,6 +1235,10 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
1205
1235
  if (types_1.TypeBase.isInstantiable(type)) {
1206
1236
  return false;
1207
1237
  }
1238
+ // Sentinels are always truthy.
1239
+ if ((0, typeUtils_1.isSentinelLiteral)(type)) {
1240
+ return false;
1241
+ }
1208
1242
  // Handle tuples specially.
1209
1243
  if ((0, typeUtils_1.isTupleClass)(type) && type.priv.tupleTypeArgs) {
1210
1244
  return (0, typeUtils_1.isUnboundedTupleClass)(type) || type.priv.tupleTypeArgs.length === 0;
@@ -1363,6 +1397,10 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
1363
1397
  // include, otherwise it should be removed.
1364
1398
  return isLiteralFalsy ? subtype : undefined;
1365
1399
  }
1400
+ // If the object is a sentinel, we can eliminate it.
1401
+ if ((0, typeUtils_1.isSentinelLiteral)(concreteSubtype)) {
1402
+ return undefined;
1403
+ }
1366
1404
  // If the object is a bool, make it "false", since
1367
1405
  // "true" is a truthy value.
1368
1406
  if (types_1.ClassType.isBuiltIn(concreteSubtype, 'bool')) {
@@ -1399,6 +1437,9 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
1399
1437
  if (concreteSubtype.priv.literalValue instanceof types_1.EnumLiteral) {
1400
1438
  isLiteralTruthy = !canBeFalsy(concreteSubtype);
1401
1439
  }
1440
+ else if (concreteSubtype.priv.literalValue instanceof types_1.SentinelLiteral) {
1441
+ isLiteralTruthy = true;
1442
+ }
1402
1443
  else {
1403
1444
  isLiteralTruthy = !!concreteSubtype.priv.literalValue;
1404
1445
  }
@@ -1786,29 +1827,46 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
1786
1827
  case 35 /* ParseNodeType.MemberAccess */: {
1787
1828
  const baseType = getTypeOfExpression(expression.d.leftExpr, 2 /* EvalFlags.MemberAccessBaseDefaults */).type;
1788
1829
  const baseTypeConcrete = makeTopLevelTypeVarsConcrete(baseType);
1789
- let classMemberInfo;
1790
- if ((0, types_1.isClassInstance)(baseTypeConcrete)) {
1791
- classMemberInfo = (0, typeUtils_1.lookUpObjectMember)(baseTypeConcrete, expression.d.member.d.value, 64 /* MemberAccessFlags.DeclaredTypesOnly */);
1792
- classOrObjectBase = baseTypeConcrete;
1793
- memberAccessClass = classMemberInfo?.classType;
1794
- // If this is an instance member (e.g. a dataclass field), don't
1795
- // bind it to the object if it's a function.
1796
- if (classMemberInfo?.isInstanceMember) {
1830
+ const memberName = expression.d.member.d.value;
1831
+ // Normally, baseTypeConcrete will not be a composite type (a union),
1832
+ // but this can occur. In this case, it's not clear how to handle this
1833
+ // correctly. For now, we'll just loop through the subtypes and
1834
+ // use one of them. We'll sort the subtypes for determinism.
1835
+ (0, typeUtils_1.doForEachSubtype)(baseTypeConcrete, (baseSubtype) => {
1836
+ if ((0, types_1.isClassInstance)(baseSubtype)) {
1837
+ const classMemberInfo = (0, typeUtils_1.lookUpObjectMember)(baseSubtype, memberName, 64 /* MemberAccessFlags.DeclaredTypesOnly */);
1838
+ classOrObjectBase = baseSubtype;
1839
+ memberAccessClass = classMemberInfo?.classType;
1840
+ symbol = classMemberInfo?.symbol;
1841
+ useDescriptorSetterType = true;
1842
+ // If this is an instance member (e.g. a dataclass field), don't
1843
+ // bind it to the object if it's a function.
1844
+ bindFunction = !classMemberInfo?.isInstanceMember;
1845
+ }
1846
+ else if ((0, types_1.isInstantiableClass)(baseSubtype)) {
1847
+ const classMemberInfo = (0, typeUtils_1.lookUpClassMember)(baseSubtype, memberName, 16 /* MemberAccessFlags.SkipInstanceMembers */ | 64 /* MemberAccessFlags.DeclaredTypesOnly */);
1848
+ classOrObjectBase = baseSubtype;
1849
+ memberAccessClass = classMemberInfo?.classType;
1850
+ symbol = classMemberInfo?.symbol;
1851
+ useDescriptorSetterType = false;
1852
+ bindFunction = true;
1853
+ }
1854
+ else if ((0, types_1.isModule)(baseSubtype)) {
1855
+ classOrObjectBase = undefined;
1856
+ memberAccessClass = undefined;
1857
+ symbol = types_1.ModuleType.getField(baseSubtype, memberName);
1858
+ if (symbol && !symbol.hasTypedDeclarations()) {
1859
+ // Do not use inferred types for the declared type.
1860
+ symbol = undefined;
1861
+ }
1862
+ useDescriptorSetterType = false;
1797
1863
  bindFunction = false;
1798
1864
  }
1799
- useDescriptorSetterType = true;
1800
- }
1801
- else if ((0, types_1.isInstantiableClass)(baseTypeConcrete)) {
1802
- classMemberInfo = (0, typeUtils_1.lookUpClassMember)(baseTypeConcrete, expression.d.member.d.value, 16 /* MemberAccessFlags.SkipInstanceMembers */ | 64 /* MemberAccessFlags.DeclaredTypesOnly */);
1803
- classOrObjectBase = baseTypeConcrete;
1804
- memberAccessClass = classMemberInfo?.classType;
1805
- }
1865
+ },
1866
+ /* sortSubtypes */ true);
1806
1867
  if ((0, types_1.isTypeVar)(baseType)) {
1807
1868
  selfType = baseType;
1808
1869
  }
1809
- if (classMemberInfo) {
1810
- symbol = classMemberInfo.symbol;
1811
- }
1812
1870
  break;
1813
1871
  }
1814
1872
  case 27 /* ParseNodeType.Index */: {
@@ -1850,6 +1908,30 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
1850
1908
  }
1851
1909
  break;
1852
1910
  }
1911
+ case 52 /* ParseNodeType.Tuple */: {
1912
+ // If this is a tuple expression with at least one item and no
1913
+ // unpacked items, and all of the items have declared types,
1914
+ // we can assume a declared type for the resulting tuple. This
1915
+ // is needed to enable bidirectional type inference when assigning
1916
+ // to an unpacked tuple.
1917
+ if (expression.d.items.length > 0 &&
1918
+ !expression.d.items.some((item) => item.nodeType === 56 /* ParseNodeType.Unpack */)) {
1919
+ const itemTypes = [];
1920
+ expression.d.items.forEach((expr) => {
1921
+ const itemType = getDeclaredTypeForExpression(expr, usage);
1922
+ if (itemType) {
1923
+ itemTypes.push(itemType);
1924
+ }
1925
+ });
1926
+ if (itemTypes.length === expression.d.items.length) {
1927
+ // If all items have a declared type, return a tuple of those types.
1928
+ return (0, tuples_1.makeTupleObject)(evaluatorInterface, itemTypes.map((t) => {
1929
+ return { type: t, isUnbounded: false };
1930
+ }));
1931
+ }
1932
+ }
1933
+ break;
1934
+ }
1853
1935
  }
1854
1936
  if (symbol) {
1855
1937
  let declaredType = getDeclaredTypeOfSymbol(symbol)?.type;
@@ -2116,6 +2198,9 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
2116
2198
  function getTypingType(node, symbolName) {
2117
2199
  return (getTypeOfModule(node, symbolName, ['typing']) ?? getTypeOfModule(node, symbolName, ['typing_extensions']));
2118
2200
  }
2201
+ function getTypeCheckerInternalsType(node, symbolName) {
2202
+ return getTypeOfModule(node, symbolName, ['_typeshed', '_type_checker_internals']);
2203
+ }
2119
2204
  function getTypesType(node, symbolName) {
2120
2205
  return getTypeOfModule(node, symbolName, ['types']);
2121
2206
  }
@@ -2166,7 +2251,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
2166
2251
  if (node.parent) {
2167
2252
  return getNodeReachability(node.parent, sourceNode);
2168
2253
  }
2169
- return typeEvaluatorTypes_1.Reachability.UnreachableAlways;
2254
+ return typeEvaluatorTypes_1.Reachability.UnreachableStructural;
2170
2255
  }
2171
2256
  const sourceFlowNode = sourceNode ? AnalyzerNodeInfo.getFlowNode(sourceNode) : undefined;
2172
2257
  return codeFlowEngine.getFlowNodeReachability(flowNode, sourceFlowNode);
@@ -2174,7 +2259,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
2174
2259
  function getAfterNodeReachability(node) {
2175
2260
  const returnFlowNode = AnalyzerNodeInfo.getAfterFlowNode(node);
2176
2261
  if (!returnFlowNode) {
2177
- return typeEvaluatorTypes_1.Reachability.UnreachableAlways;
2262
+ return typeEvaluatorTypes_1.Reachability.UnreachableStructural;
2178
2263
  }
2179
2264
  if (checkCodeFlowTooComplex(node)) {
2180
2265
  return typeEvaluatorTypes_1.Reachability.Reachable;
@@ -2183,7 +2268,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
2183
2268
  if (reachability !== typeEvaluatorTypes_1.Reachability.Reachable) {
2184
2269
  return reachability;
2185
2270
  }
2186
- if (!isFlowNodeReachableUsingNeverNarrowing(node, returnFlowNode)) {
2271
+ const executionScopeNode = ParseTreeUtils.getExecutionScopeNode(node);
2272
+ if (!isFlowNodeReachableUsingNeverNarrowing(executionScopeNode, returnFlowNode)) {
2187
2273
  return typeEvaluatorTypes_1.Reachability.UnreachableByAnalysis;
2188
2274
  }
2189
2275
  return typeEvaluatorTypes_1.Reachability.Reachable;
@@ -2191,7 +2277,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
2191
2277
  // Although isFlowNodeReachable indicates that the node is reachable, it
2192
2278
  // may not be reachable if we apply "never narrowing".
2193
2279
  function isFlowNodeReachableUsingNeverNarrowing(node, flowNode) {
2194
- const analyzer = getCodeFlowAnalyzerForNode(node.id, /* typeAtStart */ undefined);
2280
+ const analyzer = getCodeFlowAnalyzerForNode(node, /* typeAtStart */ undefined);
2195
2281
  if (checkCodeFlowTooComplex(node)) {
2196
2282
  return true;
2197
2283
  }
@@ -2219,12 +2305,6 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
2219
2305
  function addInformation(message, node, range) {
2220
2306
  return addDiagnosticWithSuppressionCheck('information', message, node, range);
2221
2307
  }
2222
- function addUnusedCode(node, textRange) {
2223
- if (!isDiagnosticSuppressedForNode(node)) {
2224
- const fileInfo = AnalyzerNodeInfo.getFileInfo(node);
2225
- fileInfo.diagnosticSink.addUnusedCodeWithTextRange(localize_1.LocMessage.unreachableCode(), textRange);
2226
- }
2227
- }
2228
2308
  function addUnreachableCode(node, reachability, textRange) {
2229
2309
  if (reachability === typeEvaluatorTypes_1.Reachability.Reachable) {
2230
2310
  return;
@@ -2232,10 +2312,14 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
2232
2312
  if (!isDiagnosticSuppressedForNode(node)) {
2233
2313
  const fileInfo = AnalyzerNodeInfo.getFileInfo(node);
2234
2314
  const reportTypeReachability = fileInfo.diagnosticRuleSet.enableReachabilityAnalysis;
2235
- if (reachability === typeEvaluatorTypes_1.Reachability.UnreachableAlways || reportTypeReachability) {
2236
- fileInfo.diagnosticSink.addUnreachableCodeWithTextRange(reachability === typeEvaluatorTypes_1.Reachability.UnreachableAlways
2237
- ? localize_1.LocMessage.unreachableCode()
2238
- : localize_1.LocMessage.unreachableCodeType(), textRange);
2315
+ if (reachability === typeEvaluatorTypes_1.Reachability.UnreachableStructural ||
2316
+ reachability === typeEvaluatorTypes_1.Reachability.UnreachableStaticCondition ||
2317
+ reportTypeReachability) {
2318
+ fileInfo.diagnosticSink.addUnreachableCodeWithTextRange(reachability === typeEvaluatorTypes_1.Reachability.UnreachableStructural
2319
+ ? localize_1.LocMessage.unreachableCodeStructure()
2320
+ : reachability === typeEvaluatorTypes_1.Reachability.UnreachableStaticCondition
2321
+ ? localize_1.LocMessage.unreachableCodeCondition()
2322
+ : localize_1.LocMessage.unreachableCodeType(), textRange);
2239
2323
  }
2240
2324
  }
2241
2325
  }
@@ -2652,7 +2736,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
2652
2736
  // If the type includes promotion types, expand these to their constituent types.
2653
2737
  function expandPromotionTypes(node, type, excludeBytes = false) {
2654
2738
  return (0, typeUtils_1.mapSubtypes)(type, (subtype) => {
2655
- if (!(0, types_1.isClass)(subtype) || !subtype.priv.includePromotions) {
2739
+ if (!(0, types_1.isClass)(subtype) || !subtype.priv.includePromotions || subtype.priv.literalValue !== undefined) {
2656
2740
  return subtype;
2657
2741
  }
2658
2742
  if (excludeBytes && types_1.ClassType.isBuiltIn(subtype, 'bytes')) {
@@ -3226,6 +3310,12 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
3226
3310
  type = types_1.UnknownType.create();
3227
3311
  }
3228
3312
  }
3313
+ // If we're expecting a type expression and got a sentinel literal instance,
3314
+ // treat it as its instantiable counterpart. This is similar to how None
3315
+ // is treated in a type expression context.
3316
+ if ((flags & 128 /* EvalFlags.InstantiableType */) !== 0 && (0, types_1.isClassInstance)(type) && (0, typeUtils_1.isSentinelLiteral)(type)) {
3317
+ type = types_1.ClassType.cloneAsInstantiable(type);
3318
+ }
3229
3319
  type = convertSpecialFormToRuntimeValue(type, flags);
3230
3320
  if ((flags & 256 /* EvalFlags.TypeExpression */) === 0) {
3231
3321
  reportUseOfTypeCheckOnly(type, node);
@@ -3299,6 +3389,9 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
3299
3389
  if ((0, types_1.isClass)(type) && !type.priv.includeSubclasses && types_1.ClassType.isValidTypeAliasClass(type)) {
3300
3390
  return true;
3301
3391
  }
3392
+ if ((0, typeUtils_1.isSentinelLiteral)(type)) {
3393
+ return true;
3394
+ }
3302
3395
  return false;
3303
3396
  }
3304
3397
  // Reports diagnostics if type isn't valid within a type expression.
@@ -3332,7 +3425,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
3332
3425
  // Isinstance treats traditional (non-PEP 695) type aliases that are unions
3333
3426
  // as tuples of classes rather than unions.
3334
3427
  if ((flags & 536870912 /* EvalFlags.IsinstanceArg */) !== 0) {
3335
- if ((0, types_1.isUnion)(type) && type.props?.typeAliasInfo && !type.props.typeAliasInfo.shared.isPep695Syntax) {
3428
+ if ((0, types_1.isUnion)(type) && type.props?.typeAliasInfo && !type.props.typeAliasInfo.shared.isTypeAliasType) {
3336
3429
  return type;
3337
3430
  }
3338
3431
  }
@@ -3861,6 +3954,14 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
3861
3954
  }
3862
3955
  case 6 /* TypeCategory.Class */: {
3863
3956
  let typeResult;
3957
+ // If this is a class-like function created via NewType, treat
3958
+ // it like a function for purposes of member accesses.
3959
+ if (types_1.ClassType.isNewTypeClass(baseType) &&
3960
+ !baseType.priv.includeSubclasses &&
3961
+ prefetched?.functionClass &&
3962
+ (0, types_1.isClass)(prefetched.functionClass)) {
3963
+ baseType = types_1.ClassType.cloneAsInstance(prefetched.functionClass);
3964
+ }
3864
3965
  const enumMemberResult = (0, enums_1.getTypeOfEnumMember)(evaluatorInterface, node, baseType, memberName, isIncomplete);
3865
3966
  if (enumMemberResult) {
3866
3967
  if (usage.method === 'get') {
@@ -4019,9 +4120,10 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
4019
4120
  }
4020
4121
  case 4 /* TypeCategory.Function */:
4021
4122
  case 5 /* TypeCategory.Overloaded */: {
4022
- if (memberName === '__self__') {
4023
- // The "__self__" member is not currently defined in the "function"
4024
- // class, so we'll special-case it here.
4123
+ const hasSelf = (0, types_1.isMethodType)(baseType);
4124
+ if (memberName === '__self__' && hasSelf) {
4125
+ // Handle "__self__" specially because MethodType defines
4126
+ // it simply as "object". We can do better here.
4025
4127
  let functionType;
4026
4128
  if ((0, types_1.isFunction)(baseType)) {
4027
4129
  functionType = baseType;
@@ -4032,18 +4134,11 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
4032
4134
  functionType = overloads[0];
4033
4135
  }
4034
4136
  }
4035
- if (functionType &&
4036
- functionType.priv.preBoundFlags !== undefined &&
4037
- (functionType.priv.preBoundFlags & 4 /* FunctionTypeFlags.StaticMethod */) === 0) {
4038
- type = functionType.priv.boundToType;
4039
- }
4137
+ type = functionType?.priv.boundToType;
4040
4138
  }
4041
4139
  else {
4042
- type = getTypeOfMemberAccessWithBaseType(node, {
4043
- type: prefetched?.functionClass
4044
- ? (0, typeUtils_1.convertToInstance)(prefetched.functionClass)
4045
- : types_1.UnknownType.create(),
4046
- }, usage, flags).type;
4140
+ const altType = hasSelf ? prefetched?.methodClass : prefetched?.functionClass;
4141
+ type = getTypeOfMemberAccessWithBaseType(node, { type: altType ? (0, typeUtils_1.convertToInstance)(altType) : types_1.UnknownType.create() }, usage, flags).type;
4047
4142
  }
4048
4143
  break;
4049
4144
  }
@@ -4054,7 +4149,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
4054
4149
  // member could not be accessed.
4055
4150
  if (!type) {
4056
4151
  const isFunctionRule = (0, types_1.isFunctionOrOverloaded)(baseType) ||
4057
- ((0, types_1.isClassInstance)(baseType) && types_1.ClassType.isBuiltIn(baseType, 'function'));
4152
+ ((0, types_1.isClassInstance)(baseType) && types_1.ClassType.isBuiltIn(baseType, ['function', 'FunctionType']));
4058
4153
  if (!baseTypeResult.isIncomplete) {
4059
4154
  let diagMessage = localize_1.LocMessage.memberAccess();
4060
4155
  if (usage.method === 'set') {
@@ -4066,7 +4161,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
4066
4161
  // If there is an expected type diagnostic addendum (used for assignments),
4067
4162
  // use that rather than the local diagnostic addendum because it will be
4068
4163
  // more informative.
4069
- if (usage.setExpectedTypeDiag) {
4164
+ if (usage.setExpectedTypeDiag && !usage.setExpectedTypeDiag.isEmpty()) {
4070
4165
  diag = usage.setExpectedTypeDiag;
4071
4166
  }
4072
4167
  // If the class is a TypedDict, and there's a key with the same name,
@@ -4229,7 +4324,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
4229
4324
  let memberAccessDeprecationInfo;
4230
4325
  type = (0, typeUtils_1.mapSubtypes)(type, (subtype) => {
4231
4326
  const concreteSubtype = makeTopLevelTypeVarsConcrete(subtype);
4232
- const isClassMember = !memberInfo || memberInfo.isClassMember;
4327
+ const isClassMember = !memberInfo || (memberInfo.isClassMember && !memberInfo.isSlotsMember);
4233
4328
  let resultType;
4234
4329
  if ((0, types_1.isClass)(concreteSubtype) && isClassMember && errorNode) {
4235
4330
  const descResult = applyDescriptorAccessMethod(subtype, concreteSubtype, memberInfo, classType, selfType, flags, errorNode, memberName, usage, diag);
@@ -4294,7 +4389,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
4294
4389
  isDescriptorError = true;
4295
4390
  }
4296
4391
  return resultType;
4297
- });
4392
+ }, { retainTypeAlias: true });
4298
4393
  if (!isDescriptorError && usage.method === 'set' && usage.setType) {
4299
4394
  if (errorNode && memberInfo.symbol.hasTypedDeclarations()) {
4300
4395
  // This is an assignment to a member with a declared type. Apply
@@ -6182,31 +6277,33 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
6182
6277
  secondArgType = getTypeOfExpression(node.d.args[1].d.valueExpr).type;
6183
6278
  const secondArgConcreteType = makeTopLevelTypeVarsConcrete(secondArgType);
6184
6279
  let reportError = false;
6185
- if ((0, types_1.isAnyOrUnknown)(secondArgConcreteType)) {
6186
- // Ignore unknown or any types.
6187
- }
6188
- else if ((0, types_1.isClassInstance)(secondArgConcreteType)) {
6189
- if ((0, types_1.isInstantiableClass)(concreteTargetClassType)) {
6190
- if (!(0, typeUtils_1.derivesFromClassRecursive)(types_1.ClassType.cloneAsInstantiable(secondArgConcreteType), concreteTargetClassType,
6191
- /* ignoreUnknown */ true)) {
6192
- reportError = true;
6193
- }
6280
+ (0, typeUtils_1.doForEachSubtype)(secondArgConcreteType, (secondArgSubtype) => {
6281
+ if ((0, types_1.isAnyOrUnknown)(secondArgSubtype)) {
6282
+ // Ignore unknown or any types.
6194
6283
  }
6195
- bindToType = secondArgConcreteType;
6196
- }
6197
- else if ((0, types_1.isInstantiableClass)(secondArgConcreteType)) {
6198
- if ((0, types_1.isInstantiableClass)(concreteTargetClassType)) {
6199
- if (!types_1.ClassType.isBuiltIn(concreteTargetClassType, 'type') &&
6200
- !(0, typeUtils_1.derivesFromClassRecursive)(secondArgConcreteType, concreteTargetClassType,
6284
+ else if ((0, types_1.isClassInstance)(secondArgSubtype)) {
6285
+ if ((0, types_1.isInstantiableClass)(concreteTargetClassType)) {
6286
+ if (!(0, typeUtils_1.derivesFromClassRecursive)(types_1.ClassType.cloneAsInstantiable(secondArgSubtype), concreteTargetClassType,
6201
6287
  /* ignoreUnknown */ true)) {
6202
- reportError = true;
6288
+ reportError = true;
6289
+ }
6203
6290
  }
6291
+ bindToType = secondArgSubtype;
6204
6292
  }
6205
- bindToType = secondArgConcreteType;
6206
- }
6207
- else {
6208
- reportError = true;
6209
- }
6293
+ else if ((0, types_1.isInstantiableClass)(secondArgSubtype)) {
6294
+ if ((0, types_1.isInstantiableClass)(concreteTargetClassType)) {
6295
+ if (!types_1.ClassType.isBuiltIn(concreteTargetClassType, 'type') &&
6296
+ !(0, typeUtils_1.derivesFromClassRecursive)(secondArgSubtype, concreteTargetClassType,
6297
+ /* ignoreUnknown */ true)) {
6298
+ reportError = true;
6299
+ }
6300
+ }
6301
+ bindToType = secondArgSubtype;
6302
+ }
6303
+ else {
6304
+ reportError = true;
6305
+ }
6306
+ });
6210
6307
  if (reportError) {
6211
6308
  addDiagnostic(diagnosticRules_1.DiagnosticRule.reportArgumentType, localize_1.LocMessage.superCallSecondArg().format({ type: printType(targetClassType) }), node.d.args[1].d.valueExpr);
6212
6309
  return { type: types_1.UnknownType.create() };
@@ -7137,6 +7234,16 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
7137
7234
  return subtype;
7138
7235
  }
7139
7236
  if ((0, types_1.isClass)(subtype)) {
7237
+ // Specifically handle the case where the subtype is a class-like
7238
+ // object created by calling NewType. At runtime, it's actually
7239
+ // a FunctionType object.
7240
+ if ((0, types_1.isClassInstance)(subtype) &&
7241
+ types_1.ClassType.isNewTypeClass(subtype) &&
7242
+ !subtype.priv.includeSubclasses) {
7243
+ if (prefetched?.functionClass) {
7244
+ return prefetched.functionClass;
7245
+ }
7246
+ }
7140
7247
  return (0, typeUtils_1.convertToInstantiable)(stripLiteralValue(subtype));
7141
7248
  }
7142
7249
  if (types_1.TypeBase.isInstance(subtype)) {
@@ -7198,6 +7305,12 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
7198
7305
  if (className === 'NewType') {
7199
7306
  return { returnType: createNewType(errorNode, argList) };
7200
7307
  }
7308
+ // Handle the Sentinel call specially.
7309
+ if (className === 'Sentinel') {
7310
+ if (AnalyzerNodeInfo.getFileInfo(errorNode).diagnosticRuleSet.enableExperimentalFeatures) {
7311
+ return { returnType: (0, sentinel_1.createSentinelType)(evaluatorInterface, errorNode, argList) };
7312
+ }
7313
+ }
7201
7314
  if (types_1.ClassType.isSpecialFormClass(expandedCallType)) {
7202
7315
  addDiagnostic(diagnosticRules_1.DiagnosticRule.reportCallIssue, localize_1.LocMessage.typeNotIntantiable().format({ type: className }), errorNode);
7203
7316
  return { returnType: types_1.UnknownType.create(), argumentErrors: true };
@@ -9348,7 +9461,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
9348
9461
  }
9349
9462
  }
9350
9463
  return getTypeOfTypeAliasCommon(nameNode, nameNode, valueExpr,
9351
- /* isPep695Syntax */ true,
9464
+ /* isPep695Syntax */ false,
9352
9465
  /* typeParamNodes */ undefined, () => typeParams);
9353
9466
  }
9354
9467
  function getBooleanValue(node) {
@@ -9433,13 +9546,13 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
9433
9546
  if (!isBaseClassAny) {
9434
9547
  // Synthesize an __init__ method that accepts only the specified type.
9435
9548
  const initType = types_1.FunctionType.createSynthesizedInstance('__init__');
9436
- types_1.FunctionType.addParam(initType, types_1.FunctionParam.create(0 /* ParamCategory.Simple */, types_1.ClassType.cloneAsInstance(classType), types_1.FunctionParamFlags.TypeDeclared, 'self'));
9549
+ types_1.FunctionType.addParam(initType, types_1.FunctionParam.create(0 /* ParamCategory.Simple */, types_1.AnyType.create(), types_1.FunctionParamFlags.TypeDeclared, 'self'));
9437
9550
  types_1.FunctionType.addParam(initType, types_1.FunctionParam.create(0 /* ParamCategory.Simple */, types_1.ClassType.cloneAsInstance(baseClass), types_1.FunctionParamFlags.TypeDeclared, '_x'));
9438
9551
  initType.shared.declaredReturnType = getNoneType();
9439
9552
  types_1.ClassType.getSymbolTable(classType).set('__init__', symbol_1.Symbol.createWithType(4 /* SymbolFlags.ClassMember */, initType));
9440
9553
  // Synthesize a trivial __new__ method.
9441
9554
  const newType = types_1.FunctionType.createSynthesizedInstance('__new__', 1 /* FunctionTypeFlags.ConstructorMethod */);
9442
- types_1.FunctionType.addParam(newType, types_1.FunctionParam.create(0 /* ParamCategory.Simple */, classType, types_1.FunctionParamFlags.TypeDeclared, 'cls'));
9555
+ types_1.FunctionType.addParam(newType, types_1.FunctionParam.create(0 /* ParamCategory.Simple */, types_1.AnyType.create(), types_1.FunctionParamFlags.TypeDeclared, 'cls'));
9443
9556
  types_1.FunctionType.addDefaultParams(newType);
9444
9557
  newType.shared.declaredReturnType = types_1.ClassType.cloneAsInstance(classType);
9445
9558
  newType.priv.constructorTypeVarScopeId = (0, typeUtils_1.getTypeVarScopeId)(classType);
@@ -10876,7 +10989,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
10876
10989
  }
10877
10990
  if ((flags & 256 /* EvalFlags.TypeExpression */) !== 0) {
10878
10991
  itemExpr.d.strings.forEach((stringNode) => {
10879
- if ((stringNode.d.token.flags & 512 /* StringTokenFlags.NamedUnicodeEscape */) !== 0) {
10992
+ if ((stringNode.d.token.flags & 1024 /* StringTokenFlags.NamedUnicodeEscape */) !== 0) {
10880
10993
  addDiagnostic(diagnosticRules_1.DiagnosticRule.reportInvalidTypeForm, localize_1.LocMessage.literalNamedUnicodeEscape(), stringNode);
10881
10994
  isValidTypeForm = false;
10882
10995
  }
@@ -11545,7 +11658,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
11545
11658
  names: variadics.map((v) => `"${v.shared.name}"`).join(', '),
11546
11659
  }), errorNode);
11547
11660
  }
11548
- if (!sharedInfo.isPep695Syntax && !isPep695TypeVarType) {
11661
+ if (!sharedInfo.isTypeAliasType && !isPep695TypeVarType) {
11549
11662
  const boundTypeVars = typeParams.filter((typeVar) => typeVar.priv.scopeId !== sharedInfo.typeVarScopeId &&
11550
11663
  typeVar.priv.scopeType === 0 /* TypeVarScopeType.Class */);
11551
11664
  if (boundTypeVars.length > 0) {
@@ -11564,7 +11677,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
11564
11677
  });
11565
11678
  // All PEP 695 type aliases are special forms because they are
11566
11679
  // TypeAliasType objects at runtime.
11567
- if (sharedInfo.isPep695Syntax || isPep695TypeVarType) {
11680
+ if (sharedInfo.isTypeAliasType || isPep695TypeVarType) {
11568
11681
  const typeAliasTypeClass = getTypingType(errorNode, 'TypeAliasType');
11569
11682
  if (typeAliasTypeClass && (0, types_1.isInstantiableClass)(typeAliasTypeClass)) {
11570
11683
  typeAlias = types_1.TypeBase.cloneAsSpecialForm(typeAlias, types_1.ClassType.cloneAsInstance(typeAliasTypeClass));
@@ -11618,7 +11731,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
11618
11731
  // The _TypedDict class is marked as abstract, but the
11619
11732
  // methods that are abstract are overridden and shouldn't
11620
11733
  // cause the TypedDict to be marked as abstract.
11621
- if ((0, types_1.isInstantiableClass)(baseClass) && types_1.ClassType.isBuiltIn(baseClass, '_TypedDict')) {
11734
+ if ((0, types_1.isInstantiableClass)(baseClass) &&
11735
+ types_1.ClassType.isBuiltIn(baseClass, ['_TypedDict', 'TypedDictFallback'])) {
11622
11736
  baseClass = types_1.ClassType.cloneWithNewFlags(baseClass, baseClass.shared.flags &
11623
11737
  ~(64 /* ClassTypeFlags.SupportsAbstractMethods */ | 1048576 /* ClassTypeFlags.TypeCheckOnly */));
11624
11738
  }
@@ -11840,7 +11954,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
11840
11954
  }
11841
11955
  }
11842
11956
  if (typeAliasNameNode) {
11843
- typeAliasPlaceholder = synthesizeTypeAliasPlaceholder(typeAliasNameNode, /* isPep695Syntax */ false);
11957
+ typeAliasPlaceholder = synthesizeTypeAliasPlaceholder(typeAliasNameNode);
11844
11958
  writeTypeCache(node, { type: typeAliasPlaceholder }, /* flags */ undefined);
11845
11959
  writeTypeCache(node.d.leftExpr, { type: typeAliasPlaceholder }, /* flags */ undefined);
11846
11960
  if (node.d.leftExpr.nodeType === 54 /* ParseNodeType.TypeAnnotation */) {
@@ -11900,7 +12014,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
11900
12014
  }
11901
12015
  // Synthesize a TypeVar that acts as a placeholder for a type alias. This allows
11902
12016
  // the type alias definition to refer to itself.
11903
- function synthesizeTypeAliasPlaceholder(nameNode, isPep695Syntax) {
12017
+ function synthesizeTypeAliasPlaceholder(nameNode, isTypeAliasType = false) {
11904
12018
  const placeholder = types_1.TypeVarType.createInstantiable(`__type_alias_${nameNode.d.value}`);
11905
12019
  placeholder.shared.isSynthesized = true;
11906
12020
  const typeVarScopeId = ParseTreeUtils.getScopeIdForNode(nameNode);
@@ -11911,7 +12025,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
11911
12025
  moduleName: fileInfo.moduleName,
11912
12026
  fileUri: fileInfo.fileUri,
11913
12027
  typeVarScopeId,
11914
- isPep695Syntax,
12028
+ isTypeAliasType,
11915
12029
  typeParams: undefined,
11916
12030
  computedVariance: undefined,
11917
12031
  };
@@ -11939,7 +12053,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
11939
12053
  }
11940
12054
  // Synthesize a type variable that represents the type alias while we're
11941
12055
  // evaluating it. This allows us to handle recursive definitions.
11942
- const typeAliasTypeVar = synthesizeTypeAliasPlaceholder(nameNode, isPep695Syntax);
12056
+ const typeAliasTypeVar = synthesizeTypeAliasPlaceholder(nameNode, /* isTypeAliasType */ true);
11943
12057
  // Write the type to the type cache to support recursive type alias definitions.
11944
12058
  writeTypeCache(nameNode, { type: typeAliasTypeVar }, /* flags */ undefined);
11945
12059
  // Set a partial type to handle recursive (self-referential) type aliases.
@@ -11953,10 +12067,22 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
11953
12067
  if (typeAliasTypeVar.shared.recursiveAlias) {
11954
12068
  typeAliasTypeVar.shared.recursiveAlias.typeParams = typeParams ?? [];
11955
12069
  }
11956
- const aliasTypeResult = getTypeOfExpressionExpectingType(valueNode, {
11957
- forwardRefs: true,
11958
- typeExpression: true,
11959
- });
12070
+ let aliasTypeResult;
12071
+ if (isPep695Syntax) {
12072
+ aliasTypeResult = getTypeOfExpressionExpectingType(valueNode, {
12073
+ forwardRefs: true,
12074
+ typeExpression: true,
12075
+ });
12076
+ }
12077
+ else {
12078
+ const flags = 128 /* EvalFlags.InstantiableType */ |
12079
+ 256 /* EvalFlags.TypeExpression */ |
12080
+ 8 /* EvalFlags.StrLiteralAsType */ |
12081
+ 32 /* EvalFlags.NoParamSpec */ |
12082
+ 64 /* EvalFlags.NoTypeVarTuple */ |
12083
+ 131072 /* EvalFlags.NoClassVar */;
12084
+ aliasTypeResult = getTypeOfExpression(valueNode, flags);
12085
+ }
11960
12086
  let isIncomplete = false;
11961
12087
  let aliasType = aliasTypeResult.type;
11962
12088
  if (aliasTypeResult.isIncomplete) {
@@ -12058,8 +12184,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
12058
12184
  if (fileInfo.isStubFile) {
12059
12185
  classFlags |= 262144 /* ClassTypeFlags.DefinedInStub */;
12060
12186
  }
12061
- const classType = types_1.ClassType.createInstantiable(node.d.name.d.value, ParseTreeUtils.getClassFullName(node, fileInfo.moduleName, node.d.name.d.value), fileInfo.moduleName, fileInfo.fileUri, classFlags,
12062
- /* typeSourceId */ 0,
12187
+ const classType = types_1.ClassType.createInstantiable(node.d.name.d.value, ParseTreeUtils.getClassFullName(node, fileInfo.moduleName, node.d.name.d.value), fileInfo.moduleName, fileInfo.fileUri, classFlags, ParseTreeUtils.getTypeSourceId(node),
12063
12188
  /* declaredMetaclass */ undefined,
12064
12189
  /* effectiveMetaclass */ undefined, ParseTreeUtils.getDocString(node.d.suite.d.statements));
12065
12190
  classType.shared.typeVarScopeId = ParseTreeUtils.getScopeIdForNode(node);
@@ -12231,11 +12356,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
12231
12356
  }
12232
12357
  // Determine if the class is abstract. Protocol classes support abstract methods
12233
12358
  // because they are constructed by the _ProtocolMeta metaclass, which derives
12234
- // from ABCMeta. We'll exclude built-in protocol classes because these are known
12235
- // not to contain any abstract methods and getAbstractMethods causes problems
12236
- // because of dependencies on some of these built-in protocol classes.
12237
- if (types_1.ClassType.supportsAbstractMethods(argType) ||
12238
- (types_1.ClassType.isProtocolClass(argType) && !types_1.ClassType.isBuiltIn(argType))) {
12359
+ // from ABCMeta.
12360
+ if (types_1.ClassType.supportsAbstractMethods(argType) || types_1.ClassType.isProtocolClass(argType)) {
12239
12361
  classType.shared.flags |= 64 /* ClassTypeFlags.SupportsAbstractMethods */;
12240
12362
  }
12241
12363
  if (types_1.ClassType.isPropertyClass(argType)) {
@@ -12386,8 +12508,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
12386
12508
  }
12387
12509
  else if (variadics.length > 0) {
12388
12510
  // Make sure a TypeVar with a default doesn't come after a TypeVarTuple.
12389
- const firstVariadicIndex = classType.shared.typeParams.findIndex((param) => (0, types_1.isTypeVarTuple)(param));
12390
- const typeVarWithDefaultIndex = classType.shared.typeParams.findIndex((param, index) => index > firstVariadicIndex && !(0, types_1.isParamSpec)(param) && param.shared.isDefaultExplicit);
12511
+ const firstVariadicIndex = typeParams.findIndex((param) => (0, types_1.isTypeVarTuple)(param));
12512
+ const typeVarWithDefaultIndex = typeParams.findIndex((param, index) => index > firstVariadicIndex && !(0, types_1.isParamSpec)(param) && param.shared.isDefaultExplicit);
12391
12513
  if (typeVarWithDefaultIndex >= 0) {
12392
12514
  addDiagnostic(diagnosticRules_1.DiagnosticRule.reportGeneralTypeIssues, localize_1.LocMessage.typeVarWithDefaultFollowsVariadic().format({
12393
12515
  typeVarName: typeParams[typeVarWithDefaultIndex].shared.name,
@@ -12551,7 +12673,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
12551
12673
  classType.shared.baseClasses.forEach((baseClass) => {
12552
12674
  if ((0, types_1.isClass)(baseClass) &&
12553
12675
  !types_1.ClassType.isTypedDictClass(baseClass) &&
12554
- !types_1.ClassType.isBuiltIn(baseClass, ['_TypedDict', 'Generic'])) {
12676
+ !types_1.ClassType.isBuiltIn(baseClass, ['_TypedDict', 'TypedDictFallback', 'Generic'])) {
12555
12677
  foundInvalidBaseClass = true;
12556
12678
  diag.addMessage(localize_1.LocAddendum.typedDictBaseClass().format({ type: baseClass.shared.name }));
12557
12679
  }
@@ -13472,11 +13594,12 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
13472
13594
  function inferParamTypeFromDefaultValue(paramValueExpr) {
13473
13595
  const defaultValueType = getTypeOfExpression(paramValueExpr, 1 /* EvalFlags.ConvertEllipsisToAny */).type;
13474
13596
  let inferredParamType;
13475
- // Is the default value a "None" or an instance of some private class (one
13476
- // whose name starts with an underscore)? If so, we will assume that the
13477
- // value is a singleton sentinel. The actual supported type is going to be
13478
- // a union of this type and Unknown.
13597
+ // Is the default value a "None", a sentinel, or an instance of some private
13598
+ // class (one whose name starts with an underscore)? If so, we will assume
13599
+ // that the value is a singleton sentinel. The actual supported type is
13600
+ // going to be a union of this type and Unknown.
13479
13601
  if ((0, typeUtils_1.isNoneInstance)(defaultValueType) ||
13602
+ (0, typeUtils_1.isSentinelLiteral)(defaultValueType) ||
13480
13603
  ((0, types_1.isClassInstance)(defaultValueType) && (0, symbolNameUtils_1.isPrivateOrProtectedName)(defaultValueType.shared.name))) {
13481
13604
  inferredParamType = (0, types_1.combineTypes)([defaultValueType, types_1.UnknownType.create()]);
13482
13605
  }
@@ -13748,7 +13871,10 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
13748
13871
  const inferredYieldType = (0, types_1.combineTypes)(inferredYieldTypes);
13749
13872
  // Inferred yield types need to be wrapped in a Generator or
13750
13873
  // AwaitableGenerator to produce the final result.
13751
- const generatorType = getTypingType(node, useAwaitableGenerator ? 'AwaitableGenerator' : 'Generator');
13874
+ const generatorType = useAwaitableGenerator
13875
+ ? getTypeCheckerInternalsType(node, 'AwaitableGenerator') ??
13876
+ getTypingType(node, 'AwaitableGenerator')
13877
+ : getTypingType(node, 'Generator');
13752
13878
  if (generatorType && (0, types_1.isInstantiableClass)(generatorType)) {
13753
13879
  const typeArgs = [];
13754
13880
  // The "send type" for the generator (the second type argument) is
@@ -14688,8 +14814,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
14688
14814
  }
14689
14815
  return undefined;
14690
14816
  }
14691
- function getCodeFlowAnalyzerForNode(nodeId, typeAtStart) {
14692
- let entries = codeFlowAnalyzerCache.get(nodeId);
14817
+ function getCodeFlowAnalyzerForNode(node, typeAtStart) {
14818
+ let entries = codeFlowAnalyzerCache.get(node.id);
14693
14819
  if (entries) {
14694
14820
  const cachedEntry = entries.find((entry) => {
14695
14821
  if (!typeAtStart || !entry.typeAtStart) {
@@ -14711,7 +14837,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
14711
14837
  }
14712
14838
  else {
14713
14839
  entries = [{ typeAtStart, codeFlowAnalyzer: analyzer }];
14714
- codeFlowAnalyzerCache.set(nodeId, entries);
14840
+ codeFlowAnalyzerCache.set(node.id, entries);
14715
14841
  }
14716
14842
  return analyzer;
14717
14843
  }
@@ -14747,7 +14873,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
14747
14873
  analyzer = getCodeFlowAnalyzerForReturnTypeInferenceContext();
14748
14874
  }
14749
14875
  else {
14750
- analyzer = getCodeFlowAnalyzerForNode(executionNode.id, options?.typeAtStart);
14876
+ analyzer = getCodeFlowAnalyzerForNode(executionNode, options?.typeAtStart);
14751
14877
  }
14752
14878
  const flowNode = AnalyzerNodeInfo.getFlowNode(startNode ?? reference);
14753
14879
  if (flowNode === undefined) {
@@ -15737,7 +15863,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
15737
15863
  const classTypeInfo = getTypeOfClass(classNode);
15738
15864
  return {
15739
15865
  type: classTypeInfo
15740
- ? (0, typeUtils_1.synthesizeTypeVarForSelfCls)(classTypeInfo.classType, /* isClsParam */ true)
15866
+ ? types_1.TypeVarType.cloneAsBound((0, typeUtils_1.synthesizeTypeVarForSelfCls)(classTypeInfo.classType, /* isClsParam */ true))
15741
15867
  : types_1.UnknownType.create(),
15742
15868
  };
15743
15869
  }
@@ -16157,8 +16283,7 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
16157
16283
  // in the event that its inferred type is instantiable or explicitly Any
16158
16284
  // (but not an ellipsis).
16159
16285
  if (isLegalImplicitTypeAliasType(inferredType)) {
16160
- const typeAliasTypeVar = synthesizeTypeAliasPlaceholder(resolvedDecl.typeAliasName,
16161
- /* isPep695Syntax */ false);
16286
+ const typeAliasTypeVar = synthesizeTypeAliasPlaceholder(resolvedDecl.typeAliasName);
16162
16287
  inferredType = transformTypeForTypeAlias(inferredType, resolvedDecl.node, typeAliasTypeVar,
16163
16288
  /* isPep695TypeVarType */ false);
16164
16289
  isUnambiguousType = true;
@@ -16952,7 +17077,6 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
16952
17077
  if (errorNode &&
16953
17078
  selfClass &&
16954
17079
  (0, types_1.isClass)(selfClass) &&
16955
- !selfClass.priv.includeSubclasses &&
16956
17080
  member.isInstanceMember &&
16957
17081
  (0, types_1.isClass)(member.unspecializedClassType) &&
16958
17082
  (flags & 1024 /* MemberAccessFlags.DisallowGenericInstanceVariableAccess */) !== 0 &&
@@ -17421,6 +17545,14 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
17421
17545
  }
17422
17546
  }
17423
17547
  }
17548
+ // If the source is a class-like type created by a call to NewType, treat it
17549
+ // as a FunctionClass instance rather than an instantiable class for
17550
+ // purposes of assignability. This reflects its actual runtime type.
17551
+ if ((0, types_1.isInstantiableClass)(srcType) && types_1.ClassType.isNewTypeClass(srcType) && !srcType.priv.includeSubclasses) {
17552
+ if (prefetched?.functionClass && (0, types_1.isInstantiableClass)(prefetched?.functionClass)) {
17553
+ srcType = types_1.ClassType.cloneAsInstance(prefetched.functionClass);
17554
+ }
17555
+ }
17424
17556
  if (recursionCount > types_1.maxTypeRecursionCount) {
17425
17557
  return true;
17426
17558
  }
@@ -17748,16 +17880,6 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
17748
17880
  concreteSrcType.priv.tupleTypeArgs) {
17749
17881
  return assignType(destType, (0, typeUtils_1.combineTupleTypeArgs)(concreteSrcType.priv.tupleTypeArgs), diag, constraints, flags, recursionCount);
17750
17882
  }
17751
- // Handle enum literals that are assignable to another (non-Enum) literal.
17752
- // This can happen for IntEnum and StrEnum members.
17753
- if (types_1.ClassType.isEnumClass(concreteSrcType) &&
17754
- concreteSrcType.priv.literalValue instanceof types_1.EnumLiteral &&
17755
- concreteSrcType.shared.mro.some((base) => (0, types_1.isClass)(base) && types_1.ClassType.isBuiltIn(base, ['int', 'str', 'bytes'])) &&
17756
- (0, types_1.isClassInstance)(concreteSrcType.priv.literalValue.itemType) &&
17757
- (0, typeUtils_1.isLiteralType)(concreteSrcType.priv.literalValue.itemType) &&
17758
- assignType(destType, concreteSrcType.priv.literalValue.itemType)) {
17759
- return true;
17760
- }
17761
17883
  if (destType.priv.literalValue !== undefined &&
17762
17884
  types_1.ClassType.isSameGenericClass(destType, concreteSrcType)) {
17763
17885
  const srcLiteral = concreteSrcType.priv.literalValue;
@@ -17797,9 +17919,10 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
17797
17919
  if (destCallbackType) {
17798
17920
  return assignType(destCallbackType, concreteSrcType, diag, constraints, flags, recursionCount);
17799
17921
  }
17800
- // All functions are considered instances of "builtins.function".
17801
- if (prefetched?.functionClass) {
17802
- return assignType(destType, (0, typeUtils_1.convertToInstance)(prefetched.functionClass), diag, constraints, flags, recursionCount);
17922
+ // All functions are considered instances of "types.FunctionType" or "types.MethodType".
17923
+ const altClass = (0, types_1.isMethodType)(concreteSrcType) ? prefetched?.methodClass : prefetched?.functionClass;
17924
+ if (altClass) {
17925
+ return assignType(destType, (0, typeUtils_1.convertToInstance)(altClass), diag, constraints, flags, recursionCount);
17803
17926
  }
17804
17927
  }
17805
17928
  else if ((0, types_1.isModule)(concreteSrcType)) {
@@ -18742,8 +18865,12 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
18742
18865
  if (srcParamSpec) {
18743
18866
  srcType = types_1.FunctionType.cloneRemoveParamSpecArgsKwargs(srcType);
18744
18867
  }
18745
- const destParamDetails = (0, parameterUtils_1.getParamListDetails)(destType);
18746
- const srcParamDetails = (0, parameterUtils_1.getParamListDetails)(srcType);
18868
+ const destParamDetails = (0, parameterUtils_1.getParamListDetails)(destType, {
18869
+ disallowExtraKwargsForTd: (flags & 131072 /* AssignTypeFlags.DisallowExtraKwargsForTd */) !== 0,
18870
+ });
18871
+ const srcParamDetails = (0, parameterUtils_1.getParamListDetails)(srcType, {
18872
+ disallowExtraKwargsForTd: (flags & 131072 /* AssignTypeFlags.DisallowExtraKwargsForTd */) !== 0,
18873
+ });
18747
18874
  adjustSourceParamDetailsForDestVariadic(isContra ? destParamDetails : srcParamDetails, isContra ? srcParamDetails : destParamDetails);
18748
18875
  const targetIncludesParamSpec = isContra ? !!srcParamSpec : !!destParamSpec;
18749
18876
  const destPositionalCount = destParamDetails.firstKeywordOnlyIndex ?? destParamDetails.params.length;
@@ -19125,12 +19252,16 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
19125
19252
  canAssign = false;
19126
19253
  }
19127
19254
  }
19128
- // If we're checking for full overlapping overloads and the source is
19129
- // a gradual form, the dest must also be a gradual form.
19130
- if ((flags & 16 /* AssignTypeFlags.OverloadOverlap */) !== 0 &&
19131
- types_1.FunctionType.isGradualCallableForm(srcType) &&
19132
- !types_1.FunctionType.isGradualCallableForm(destType)) {
19133
- canAssign = false;
19255
+ if ((flags & 16 /* AssignTypeFlags.OverloadOverlap */) !== 0) {
19256
+ // If we're checking for full overlapping overloads and the source is
19257
+ // a gradual form, the dest must also be a gradual form.
19258
+ if (types_1.FunctionType.isGradualCallableForm(srcType) && !types_1.FunctionType.isGradualCallableForm(destType)) {
19259
+ canAssign = false;
19260
+ }
19261
+ // If the src contains a ParamSpec the dest must also.
19262
+ if (srcParamSpec && !destParamSpec) {
19263
+ canAssign = false;
19264
+ }
19134
19265
  }
19135
19266
  // If the source and the dest are using the same ParamSpec, any additional
19136
19267
  // concatenated parameters must match.
@@ -20295,7 +20426,8 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
20295
20426
  getTypeClassType,
20296
20427
  getBuiltInObject,
20297
20428
  getTypingType,
20298
- assignTypeArgs: assignTypeArgs,
20429
+ getTypeCheckerInternalsType,
20430
+ assignTypeArgs,
20299
20431
  reportMissingTypeArgs,
20300
20432
  inferReturnTypeIfNecessary,
20301
20433
  inferVarianceForClass,
@@ -20303,7 +20435,6 @@ function createTypeEvaluator(importLookup, evaluatorOptions, wrapWithLogger) {
20303
20435
  isFinalVariableDeclaration,
20304
20436
  isExplicitTypeAliasDeclaration,
20305
20437
  addInformation,
20306
- addUnusedCode,
20307
20438
  addUnreachableCode,
20308
20439
  addDeprecated,
20309
20440
  addDiagnostic,