@zzzen/pyright-internal 1.1.254 → 1.1.255

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 (1265) hide show
  1. package/package.json +3 -2
  2. package/src/analyzer/aliasDeclarationUtils.ts +169 -0
  3. package/src/analyzer/analysis.ts +92 -0
  4. package/src/analyzer/analyzerFileInfo.ts +56 -0
  5. package/src/analyzer/analyzerNodeInfo.ts +198 -0
  6. package/src/analyzer/backgroundAnalysisProgram.ts +311 -0
  7. package/src/analyzer/binder.ts +4081 -0
  8. package/src/analyzer/checker.ts +5507 -0
  9. package/src/analyzer/circularDependency.ts +52 -0
  10. package/src/analyzer/codeFlowEngine.ts +1548 -0
  11. package/src/analyzer/codeFlowTypes.ts +266 -0
  12. package/src/analyzer/codeFlowUtils.ts +436 -0
  13. package/src/analyzer/commentUtils.ts +174 -0
  14. package/src/analyzer/constraintSolver.ts +926 -0
  15. package/src/analyzer/constructorTransform.ts +317 -0
  16. package/src/analyzer/dataClasses.ts +999 -0
  17. package/src/analyzer/declaration.ts +252 -0
  18. package/src/analyzer/declarationUtils.ts +238 -0
  19. package/src/analyzer/docStringConversion.ts +850 -0
  20. package/src/analyzer/docStringUtils.ts +112 -0
  21. package/src/analyzer/functionTransform.ts +137 -0
  22. package/src/analyzer/importResolver.ts +2308 -0
  23. package/src/analyzer/importResult.ts +98 -0
  24. package/src/analyzer/importStatementUtils.ts +834 -0
  25. package/src/analyzer/namedTuples.ts +422 -0
  26. package/src/analyzer/packageTypeReport.ts +108 -0
  27. package/src/analyzer/packageTypeVerifier.ts +1466 -0
  28. package/src/analyzer/parentDirectoryCache.ts +88 -0
  29. package/src/analyzer/parseTreeCleaner.ts +35 -0
  30. package/src/analyzer/parseTreeUtils.ts +2165 -0
  31. package/src/analyzer/parseTreeWalker.ts +663 -0
  32. package/src/analyzer/patternMatching.ts +1356 -0
  33. package/src/analyzer/program.ts +2778 -0
  34. package/src/analyzer/properties.ts +534 -0
  35. package/src/analyzer/protocols.ts +660 -0
  36. package/src/analyzer/pyTypedUtils.ts +52 -0
  37. package/src/analyzer/pythonPathUtils.ts +201 -0
  38. package/src/analyzer/scope.ts +202 -0
  39. package/src/analyzer/scopeUtils.ts +81 -0
  40. package/src/analyzer/service.ts +1679 -0
  41. package/src/analyzer/sourceFile.ts +1401 -0
  42. package/src/analyzer/sourceMapper.ts +717 -0
  43. package/src/analyzer/staticExpressions.ts +308 -0
  44. package/src/analyzer/symbol.ts +249 -0
  45. package/src/analyzer/symbolNameUtils.ts +50 -0
  46. package/src/analyzer/symbolUtils.ts +49 -0
  47. package/src/analyzer/testWalker.ts +101 -0
  48. package/src/analyzer/tracePrinter.ts +264 -0
  49. package/src/analyzer/typeCache.ts +181 -0
  50. package/src/analyzer/typeDocStringUtils.ts +371 -0
  51. package/src/analyzer/typeEvaluator.ts +23395 -0
  52. package/src/analyzer/typeEvaluatorTypes.ts +452 -0
  53. package/src/analyzer/typeEvaluatorWithTracker.ts +161 -0
  54. package/src/analyzer/typeGuards.ts +1828 -0
  55. package/src/analyzer/typePrinter.ts +807 -0
  56. package/src/analyzer/typeStubWriter.ts +727 -0
  57. package/src/analyzer/typeUtils.ts +3126 -0
  58. package/src/analyzer/typeVarContext.ts +330 -0
  59. package/src/analyzer/typedDicts.ts +950 -0
  60. package/src/analyzer/types.ts +2857 -0
  61. package/src/backgroundAnalysis.ts +49 -0
  62. package/src/backgroundAnalysisBase.ts +606 -0
  63. package/src/backgroundThreadBase.ts +143 -0
  64. package/src/commands/commandController.ts +62 -0
  65. package/src/commands/commandResult.ts +21 -0
  66. package/src/commands/commands.ts +16 -0
  67. package/src/commands/createTypeStub.ts +56 -0
  68. package/src/commands/quickActionCommand.ts +40 -0
  69. package/src/commands/restartServer.ts +20 -0
  70. package/src/common/cancellationUtils.ts +71 -0
  71. package/src/common/chokidarFileWatcherProvider.ts +74 -0
  72. package/src/common/collectionUtils.ts +379 -0
  73. package/src/common/commandLineOptions.ts +132 -0
  74. package/src/common/configOptions.ts +1291 -0
  75. package/src/common/console.ts +201 -0
  76. package/src/common/core.ts +152 -0
  77. package/src/common/crypto.ts +60 -0
  78. package/src/common/debug.ts +144 -0
  79. package/src/common/deferred.ts +78 -0
  80. package/src/common/diagnostic.ts +191 -0
  81. package/src/common/diagnosticRules.ts +80 -0
  82. package/src/common/diagnosticSink.ts +150 -0
  83. package/src/common/editAction.ts +46 -0
  84. package/src/common/extensibility.ts +35 -0
  85. package/src/common/extensions.ts +21 -0
  86. package/src/common/fileBasedCancellationUtils.ts +274 -0
  87. package/src/common/fileSystem.ts +152 -0
  88. package/src/common/fullAccessHost.ts +203 -0
  89. package/src/common/host.ts +49 -0
  90. package/src/common/logTracker.ts +157 -0
  91. package/src/common/lspUtils.ts +18 -0
  92. package/src/common/memUtils.ts +36 -0
  93. package/src/common/pathConsts.ts +16 -0
  94. package/src/common/pathUtils.ts +987 -0
  95. package/src/common/positionUtils.ts +78 -0
  96. package/src/common/progressReporter.ts +53 -0
  97. package/src/common/pythonVersion.ts +74 -0
  98. package/src/common/realFileSystem.ts +433 -0
  99. package/src/common/stringUtils.ts +161 -0
  100. package/src/common/textEditUtils.ts +31 -0
  101. package/src/common/textRange.ts +225 -0
  102. package/src/common/textRangeCollection.ts +122 -0
  103. package/src/common/timing.ts +105 -0
  104. package/src/common/uriParser.ts +26 -0
  105. package/src/common/workspaceEditUtils.ts +100 -0
  106. package/src/languageServerBase.ts +1556 -0
  107. package/src/languageService/analyzerServiceExecutor.ts +144 -0
  108. package/src/languageService/autoImporter.ts +926 -0
  109. package/src/languageService/callHierarchyProvider.ts +476 -0
  110. package/src/languageService/codeActionProvider.ts +85 -0
  111. package/src/languageService/completionProvider.ts +3103 -0
  112. package/src/languageService/definitionProvider.ts +235 -0
  113. package/src/languageService/documentHighlightProvider.ts +61 -0
  114. package/src/languageService/documentSymbolCollector.ts +466 -0
  115. package/src/languageService/documentSymbolProvider.ts +466 -0
  116. package/src/languageService/hoverProvider.ts +499 -0
  117. package/src/languageService/importAdder.ts +437 -0
  118. package/src/languageService/importSorter.ts +196 -0
  119. package/src/languageService/indentationUtils.ts +813 -0
  120. package/src/languageService/quickActions.ts +113 -0
  121. package/src/languageService/referencesProvider.ts +316 -0
  122. package/src/languageService/renameModuleProvider.ts +1400 -0
  123. package/src/languageService/signatureHelpProvider.ts +227 -0
  124. package/src/languageService/tooltipUtils.ts +147 -0
  125. package/src/localization/localize.ts +1272 -0
  126. package/src/localization/package.nls.de.json +3 -0
  127. package/src/localization/package.nls.en-us.json +636 -0
  128. package/src/localization/package.nls.es.json +3 -0
  129. package/src/localization/package.nls.fr.json +3 -0
  130. package/src/localization/package.nls.ja.json +3 -0
  131. package/src/localization/package.nls.ru.json +3 -0
  132. package/src/localization/package.nls.zh-cn.json +3 -0
  133. package/src/localization/package.nls.zh-tw.json +3 -0
  134. package/src/nodeMain.ts +21 -0
  135. package/src/nodeServer.ts +30 -0
  136. package/src/parser/characterStream.ts +145 -0
  137. package/src/parser/characters.ts +285 -0
  138. package/src/parser/parseNodes.ts +2338 -0
  139. package/src/parser/parser.ts +4859 -0
  140. package/src/parser/stringTokenUtils.ts +564 -0
  141. package/src/parser/tokenizer.ts +1379 -0
  142. package/src/parser/tokenizerTypes.ts +420 -0
  143. package/src/parser/unicode.ts +2917 -0
  144. package/src/pyright.ts +824 -0
  145. package/src/pyrightFileSystem.ts +237 -0
  146. package/src/readonlyAugmentedFileSystem.ts +204 -0
  147. package/src/server.ts +298 -0
  148. package/src/tests/chainedSourceFiles.test.ts +183 -0
  149. package/src/tests/checker.test.ts +445 -0
  150. package/src/tests/collectionUtils.test.ts +178 -0
  151. package/src/tests/common.test.ts +117 -0
  152. package/src/tests/config.test.ts +291 -0
  153. package/src/tests/debug.test.ts +120 -0
  154. package/src/tests/deferred.test.ts +54 -0
  155. package/src/tests/diagnosticOverrides.test.ts +104 -0
  156. package/src/tests/docStringConversion.test.ts +823 -0
  157. package/src/tests/docStringUtils.test.ts +57 -0
  158. package/src/tests/documentSymbolCollector.test.ts +735 -0
  159. package/src/tests/filesystem.test.ts +215 -0
  160. package/src/tests/fourSlashParser.test.ts +330 -0
  161. package/src/tests/fourSlashRunner.test.ts +36 -0
  162. package/src/tests/fourslash/completions.autoimport.Lib.Found.Type.fourslash.ts +33 -0
  163. package/src/tests/fourslash/completions.autoimport.Lib.Found.duplication.fourslash.ts +47 -0
  164. package/src/tests/fourslash/completions.autoimport.Lib.NotFound.fourslash.ts +14 -0
  165. package/src/tests/fourslash/completions.autoimport.disabled.fourslash.ts +25 -0
  166. package/src/tests/fourslash/completions.autoimport.duplicates.fourslash.ts +36 -0
  167. package/src/tests/fourslash/completions.autoimport.fourslash.ts +29 -0
  168. package/src/tests/fourslash/completions.autoimport.fromImport.fourslash.ts +130 -0
  169. package/src/tests/fourslash/completions.autoimport.plainText.fourslash.ts +29 -0
  170. package/src/tests/fourslash/completions.autoimport.shadow.fourslash.ts +48 -0
  171. package/src/tests/fourslash/completions.autoimport.submodule.fourslash.ts +31 -0
  172. package/src/tests/fourslash/completions.autoimport.topLevel.fourslash.ts +57 -0
  173. package/src/tests/fourslash/completions.builtinDocstrings.fourslash.ts +117 -0
  174. package/src/tests/fourslash/completions.builtinOverride.fourslash.ts +22 -0
  175. package/src/tests/fourslash/completions.call.stringLiteral.fourslash.ts +55 -0
  176. package/src/tests/fourslash/completions.call.typedDict.fourslash.ts +247 -0
  177. package/src/tests/fourslash/completions.call.typedDict.list.fourslash.ts +163 -0
  178. package/src/tests/fourslash/completions.call.typedDict.states.fourslash.ts +135 -0
  179. package/src/tests/fourslash/completions.classVariable.fourslash.ts +37 -0
  180. package/src/tests/fourslash/completions.comment.fourslash.ts +28 -0
  181. package/src/tests/fourslash/completions.declNames.class.fourslash.ts +35 -0
  182. package/src/tests/fourslash/completions.declNames.exception.fourslash.ts +18 -0
  183. package/src/tests/fourslash/completions.declNames.for.fourslash.ts +30 -0
  184. package/src/tests/fourslash/completions.declNames.importAlias.fourslash.ts +15 -0
  185. package/src/tests/fourslash/completions.declNames.lambda.fourslash.ts +45 -0
  186. package/src/tests/fourslash/completions.declNames.method.fourslash.ts +71 -0
  187. package/src/tests/fourslash/completions.declNames.overload.fourslash.ts +156 -0
  188. package/src/tests/fourslash/completions.declNames.topLevelOverload.fourslash.ts +141 -0
  189. package/src/tests/fourslash/completions.dictionary.keys.complex.fourslash.ts +76 -0
  190. package/src/tests/fourslash/completions.dictionary.keys.expression.fourslash.ts +63 -0
  191. package/src/tests/fourslash/completions.dictionary.keys.literalTypes.fourslash.ts +161 -0
  192. package/src/tests/fourslash/completions.dictionary.keys.simple.fourslash.ts +151 -0
  193. package/src/tests/fourslash/completions.dictionary.keys.stringLiterals.fourslash.ts +116 -0
  194. package/src/tests/fourslash/completions.dictionary.keys.symbols.fourslash.ts +53 -0
  195. package/src/tests/fourslash/completions.enums.members.fourslash.ts +44 -0
  196. package/src/tests/fourslash/completions.excluded.fourslash.ts +12 -0
  197. package/src/tests/fourslash/completions.fourslash.ts +51 -0
  198. package/src/tests/fourslash/completions.fstring.fourslash.ts +33 -0
  199. package/src/tests/fourslash/completions.fstring.stringLiteral.fourslash.ts +96 -0
  200. package/src/tests/fourslash/completions.fuzzyMatching.fourslash.ts +30 -0
  201. package/src/tests/fourslash/completions.importDunderNames.fourslash.ts +31 -0
  202. package/src/tests/fourslash/completions.importSubmodule.fourslash.ts +26 -0
  203. package/src/tests/fourslash/completions.importsDuplicates.fourslash.ts +23 -0
  204. package/src/tests/fourslash/completions.inList.fourslash.ts +33 -0
  205. package/src/tests/fourslash/completions.included.fourslash.ts +12 -0
  206. package/src/tests/fourslash/completions.indexer.keys.getitem.fourslash.ts +57 -0
  207. package/src/tests/fourslash/completions.inherited.function.docFromStub.fourslash.ts +28 -0
  208. package/src/tests/fourslash/completions.inherited.overload.docFromScrWithStub.fourslash.ts +52 -0
  209. package/src/tests/fourslash/completions.inherited.overload.docFromStub.fourslash.ts +53 -0
  210. package/src/tests/fourslash/completions.inherited.property.docFromSrc.fourslash.ts +104 -0
  211. package/src/tests/fourslash/completions.inherited.property.docFromStub.fourslash.ts +108 -0
  212. package/src/tests/fourslash/completions.keywords.pythonVersion.fourslash.ts +72 -0
  213. package/src/tests/fourslash/completions.libCodeAndStub.fourslash.ts +79 -0
  214. package/src/tests/fourslash/completions.libCodeNoStub.fourslash.ts +69 -0
  215. package/src/tests/fourslash/completions.libStub.fourslash.ts +69 -0
  216. package/src/tests/fourslash/completions.literals.fourslash.ts +33 -0
  217. package/src/tests/fourslash/completions.localCode.fourslash.ts +74 -0
  218. package/src/tests/fourslash/completions.moduleContext.UnknownMemberOnInstance.fourslash.ts +17 -0
  219. package/src/tests/fourslash/completions.moduleContext.UnknownStaticFunctionOnClass.fourslash.ts +57 -0
  220. package/src/tests/fourslash/completions.moduleContext.libCodeNoStub.fourslash.ts +30 -0
  221. package/src/tests/fourslash/completions.overloads.fourslash.ts +40 -0
  222. package/src/tests/fourslash/completions.override.default.fourslash.ts +47 -0
  223. package/src/tests/fourslash/completions.override.default.importStub.ts +50 -0
  224. package/src/tests/fourslash/completions.override.default.imported.fourslash.ts +61 -0
  225. package/src/tests/fourslash/completions.override.default.stub.fourslash.ts +47 -0
  226. package/src/tests/fourslash/completions.override.fourslash.ts +47 -0
  227. package/src/tests/fourslash/completions.override.property.fourslash.ts +31 -0
  228. package/src/tests/fourslash/completions.override.property.stub.fourslash.ts +31 -0
  229. package/src/tests/fourslash/completions.override.staticAndClassmethod.fourslash.ts +64 -0
  230. package/src/tests/fourslash/completions.override.stub.fourslash.ts +47 -0
  231. package/src/tests/fourslash/completions.override2.fourslash.ts +71 -0
  232. package/src/tests/fourslash/completions.parameters.fourslash.ts +23 -0
  233. package/src/tests/fourslash/completions.params.fourslash.ts +24 -0
  234. package/src/tests/fourslash/completions.parentFolder.fourslash.ts +17 -0
  235. package/src/tests/fourslash/completions.parentFolders.fourslash.ts +77 -0
  236. package/src/tests/fourslash/completions.plainText.fourslash.ts +34 -0
  237. package/src/tests/fourslash/completions.private.fourslash.ts +64 -0
  238. package/src/tests/fourslash/completions.property.fourslash.ts +28 -0
  239. package/src/tests/fourslash/completions.propertyDocStrings.fourslash.ts +64 -0
  240. package/src/tests/fourslash/completions.self.fourslash.ts +43 -0
  241. package/src/tests/fourslash/completions.stringLiteral.escape.fourslash.ts +71 -0
  242. package/src/tests/fourslash/completions.stringLiteral.fourslash.ts +79 -0
  243. package/src/tests/fourslash/completions.typeAlias.fourslash.ts +29 -0
  244. package/src/tests/fourslash/completions.typeshed.fourslash.ts +9 -0
  245. package/src/tests/fourslash/completions.vardecls.fourslash.ts +40 -0
  246. package/src/tests/fourslash/completions.variableDocStrings.fourslash.ts +69 -0
  247. package/src/tests/fourslash/completions.wildcardimports.fourslash.ts +116 -0
  248. package/src/tests/fourslash/completions.with.fourslash.ts +26 -0
  249. package/src/tests/fourslash/diagnostics.missingModuleSource.fourslash.ts +69 -0
  250. package/src/tests/fourslash/findDefinitions.builtinClass.fourslash.ts +29 -0
  251. package/src/tests/fourslash/findDefinitions.classes.fourslash.ts +101 -0
  252. package/src/tests/fourslash/findDefinitions.definitionFilter.preferSource.fourslash.ts +29 -0
  253. package/src/tests/fourslash/findDefinitions.definitionFilter.preferSource.onlyStubs.ts +24 -0
  254. package/src/tests/fourslash/findDefinitions.definitionFilter.preferStub.fourslash.ts +29 -0
  255. package/src/tests/fourslash/findDefinitions.definitionFilter.preferStub.onlySource.fourslash.ts +25 -0
  256. package/src/tests/fourslash/findDefinitions.fields.fourslash.ts +131 -0
  257. package/src/tests/fourslash/findDefinitions.functions.fourslash.ts +87 -0
  258. package/src/tests/fourslash/findDefinitions.methods.fourslash.ts +162 -0
  259. package/src/tests/fourslash/findDefinitions.modules.fourslash.ts +50 -0
  260. package/src/tests/fourslash/findDefinitions.namespaceImport.fourslash.ts +40 -0
  261. package/src/tests/fourslash/findDefinitions.overloads.fourslash.ts +223 -0
  262. package/src/tests/fourslash/findDefinitions.parameters.fourslash.ts +162 -0
  263. package/src/tests/fourslash/findDefinitions.sourceAndStub.function.fourslash.ts +26 -0
  264. package/src/tests/fourslash/findDefinitions.sourceAndStub.innerClass.fourslash.ts +32 -0
  265. package/src/tests/fourslash/findDefinitions.sourceAndStub.innerClassMethod.fourslash.ts +33 -0
  266. package/src/tests/fourslash/findDefinitions.sourceAndStub.outerClass.fourslash.ts +28 -0
  267. package/src/tests/fourslash/findDefinitions.sourceAndStub.outerClassMethod.fourslash.ts +29 -0
  268. package/src/tests/fourslash/findDefinitions.sourceAndStub.outerClassPropertyReadOnly.fourslash.ts +31 -0
  269. package/src/tests/fourslash/findDefinitions.sourceAndStub.outerClassPropertyReadWrite.fourslash.ts +36 -0
  270. package/src/tests/fourslash/findDefinitions.sourceOnly.class.fourslash.ts +29 -0
  271. package/src/tests/fourslash/findDefinitions.sourceOnly.function1.fourslash.ts +28 -0
  272. package/src/tests/fourslash/findDefinitions.sourceOnly.function2.fourslash.ts +28 -0
  273. package/src/tests/fourslash/findDefinitions.sourceOnly.relativeImport1.fourslash.ts +22 -0
  274. package/src/tests/fourslash/findDefinitions.sourceOnly.relativeImport2.fourslash.ts +22 -0
  275. package/src/tests/fourslash/findDefinitions.stubOnly.fourslash.ts +61 -0
  276. package/src/tests/fourslash/findDefinitions.stubPackages.fourslash.ts +71 -0
  277. package/src/tests/fourslash/findDefinitions.typedDict.keys.fourslash.ts +99 -0
  278. package/src/tests/fourslash/findDefinitions.variables.fourslash.ts +88 -0
  279. package/src/tests/fourslash/findDefinitions.wildcardimports.fourslash.ts +117 -0
  280. package/src/tests/fourslash/findTypeDefinitions.builtinClass.fourslash.ts +26 -0
  281. package/src/tests/fourslash/findTypeDefinitions.classes.fourslash.ts +72 -0
  282. package/src/tests/fourslash/findTypeDefinitions.unions.fourslash.ts +26 -0
  283. package/src/tests/fourslash/findallreferences.classPropertyReadWrite.ts +39 -0
  284. package/src/tests/fourslash/findallreferences.fourslash.ts +34 -0
  285. package/src/tests/fourslash/findallreferences.importalias.fourslash.ts +34 -0
  286. package/src/tests/fourslash/findallreferences.invokedFromLibrary.fourslash.ts +52 -0
  287. package/src/tests/fourslash/findallreferences.module.nested.fourslash.ts +67 -0
  288. package/src/tests/fourslash/findallreferences.modules.duplicated.fourslash.ts +59 -0
  289. package/src/tests/fourslash/findallreferences.modules.fourslash.ts +46 -0
  290. package/src/tests/fourslash/findallreferences.modules.shadow.fourslash.ts +95 -0
  291. package/src/tests/fourslash/findallreferences.openFiles.fourslash.ts +37 -0
  292. package/src/tests/fourslash/findallreferences.parameter.fourslash.ts +24 -0
  293. package/src/tests/fourslash/findallreferences.sourceAndStub.class.fourslash.ts +33 -0
  294. package/src/tests/fourslash/findallreferences.sourceAndStub.classMethod.fourslash.ts +37 -0
  295. package/src/tests/fourslash/findallreferences.sourceAndStub.classPropertyReadOnly.fourslash.ts +40 -0
  296. package/src/tests/fourslash/findallreferences.sourceAndStub.classPropertyReadWrite.fourslash.skip.ts +48 -0
  297. package/src/tests/fourslash/findallreferences.sourceAndStub.function.fourslash.ts +35 -0
  298. package/src/tests/fourslash/findallreferences.variable.fourslash.ts +24 -0
  299. package/src/tests/fourslash/fourslash.ts +411 -0
  300. package/src/tests/fourslash/highlightreferences.attributes.fourslash.ts +31 -0
  301. package/src/tests/fourslash/hover.builtinDocstrings.fourslash.ts +64 -0
  302. package/src/tests/fourslash/hover.classNoInit.fourslash.ts +14 -0
  303. package/src/tests/fourslash/hover.docFromScr.stringFormat.fourslash.ts +52 -0
  304. package/src/tests/fourslash/hover.docFromSrc.fourslash.ts +83 -0
  305. package/src/tests/fourslash/hover.docFromSrc.pkg-vs-module1.fourslash.ts +26 -0
  306. package/src/tests/fourslash/hover.docFromSrc.pkg-vs-module2.fourslash.ts +26 -0
  307. package/src/tests/fourslash/hover.docFromSrc.relativeImport1.fourslash.ts +23 -0
  308. package/src/tests/fourslash/hover.docFromSrc.relativeImport2.fourslash.ts +22 -0
  309. package/src/tests/fourslash/hover.docFromSrc.relativeImport3.fourslash.ts +46 -0
  310. package/src/tests/fourslash/hover.docFromSrc.stubs-package.fourslash.ts +29 -0
  311. package/src/tests/fourslash/hover.docFromSrc.typeshed.fourslash.ts +20 -0
  312. package/src/tests/fourslash/hover.docstring.links.fourslash.ts +12 -0
  313. package/src/tests/fourslash/hover.docstring.overloads.fourslash.ts +41 -0
  314. package/src/tests/fourslash/hover.docstring.split.fourslash.ts +24 -0
  315. package/src/tests/fourslash/hover.fourslash.ts +20 -0
  316. package/src/tests/fourslash/hover.import.django.view.fourslash.ts +27 -0
  317. package/src/tests/fourslash/hover.import.fourslash.ts +11 -0
  318. package/src/tests/fourslash/hover.inherited.docFromSrc.fourslash.ts +63 -0
  319. package/src/tests/fourslash/hover.inherited.docFromSrcWithStub.fourslash.ts +54 -0
  320. package/src/tests/fourslash/hover.inherited.docFromStub.fourslash.ts +42 -0
  321. package/src/tests/fourslash/hover.inherited.overload.docFromSrcWithStub.fourslash.ts +46 -0
  322. package/src/tests/fourslash/hover.inherited.overload.docFromStub.fourslash.ts +47 -0
  323. package/src/tests/fourslash/hover.inherited.property.docFromSrcWithStub.fourslash.ts +87 -0
  324. package/src/tests/fourslash/hover.inherited.property.docFromStub.fourslash.ts +91 -0
  325. package/src/tests/fourslash/hover.init.fourslash.ts +39 -0
  326. package/src/tests/fourslash/hover.libCodeAndStub.fourslash.ts +52 -0
  327. package/src/tests/fourslash/hover.libCodeNoStub.fourslash.ts +41 -0
  328. package/src/tests/fourslash/hover.libStub.fourslash.ts +41 -0
  329. package/src/tests/fourslash/hover.optionalAliasParameter.fourslash.ts +14 -0
  330. package/src/tests/fourslash/hover.plainText.fourslash.ts +21 -0
  331. package/src/tests/fourslash/hover.typedDict.key.fourslash.ts +51 -0
  332. package/src/tests/fourslash/hover.variable.docString.fourslash.ts +41 -0
  333. package/src/tests/fourslash/hover.wildcardimports.fourslash.ts +80 -0
  334. package/src/tests/fourslash/import.publicSymbols.fourslash.ts +65 -0
  335. package/src/tests/fourslash/import.pytyped.dunderAll.fourslash.ts +77 -0
  336. package/src/tests/fourslash/import.pytyped.privateSymbols.fourslash.ts +65 -0
  337. package/src/tests/fourslash/import.pytyped.typeCheckingBasic.fourslash.ts +38 -0
  338. package/src/tests/fourslash/import.pytyped.typeCheckingOff.fourslash.ts +38 -0
  339. package/src/tests/fourslash/import.wildcard.fourslash.ts +27 -0
  340. package/src/tests/fourslash/importnotresolved.fourslash.ts +13 -0
  341. package/src/tests/fourslash/missingModuleSource.disablingInStrictMode.fourslash.ts +20 -0
  342. package/src/tests/fourslash/missingModuleSource.fourslash.ts +14 -0
  343. package/src/tests/fourslash/missingTypeStub.codeAction.fourslash.ts +33 -0
  344. package/src/tests/fourslash/missingTypeStub.command.multipart.fourslash.ts +48 -0
  345. package/src/tests/fourslash/missingTypeStub.command.singlefile.fourslash.ts +38 -0
  346. package/src/tests/fourslash/missingTypeStub.command.singlepart.fourslash.ts +38 -0
  347. package/src/tests/fourslash/missingTypeStub.fourslash.ts +20 -0
  348. package/src/tests/fourslash/missingTypeStub.invokeCodeAction.fourslash.ts +36 -0
  349. package/src/tests/fourslash/noerrors.fourslash.ts +9 -0
  350. package/src/tests/fourslash/orderImports1.command.fourslash.ts +20 -0
  351. package/src/tests/fourslash/orderImports2.command.fourslash.ts +24 -0
  352. package/src/tests/fourslash/rename.externallyHidden.fourslash.ts +24 -0
  353. package/src/tests/fourslash/rename.externallyHidden.params.fourslash.ts +24 -0
  354. package/src/tests/fourslash/rename.fourslash.ts +29 -0
  355. package/src/tests/fourslash/rename.library.fourslash.ts +29 -0
  356. package/src/tests/fourslash/rename.library.sourceAndStub.fourslash.ts +33 -0
  357. package/src/tests/fourslash/rename.multipleDecl.fourslash.ts +21 -0
  358. package/src/tests/fourslash/rename.sourceAndStub.fourslash.ts +37 -0
  359. package/src/tests/fourslash/rename.string.excluded.fourslash.ts +43 -0
  360. package/src/tests/fourslash/rename.string.fourslash.ts +26 -0
  361. package/src/tests/fourslash/signature.builtinDocstrings.fourslash.ts +63 -0
  362. package/src/tests/fourslash/signature.complicated.fourslash.ts +100 -0
  363. package/src/tests/fourslash/signature.cornercases.fourslash.ts +23 -0
  364. package/src/tests/fourslash/signature.docstrings.fourslash.ts +43 -0
  365. package/src/tests/fourslash/signature.docstrings.overloaded.fourslash.ts +50 -0
  366. package/src/tests/fourslash/signature.docstrings.wildcardimports.fourslash.ts +122 -0
  367. package/src/tests/fourslash/signature.overload.fourslash.ts +64 -0
  368. package/src/tests/fourslash/signature.simple.fourslash.ts +104 -0
  369. package/src/tests/harness/fourslash/fourSlashParser.ts +441 -0
  370. package/src/tests/harness/fourslash/fourSlashTypes.ts +134 -0
  371. package/src/tests/harness/fourslash/runner.ts +99 -0
  372. package/src/tests/harness/fourslash/testLanguageService.ts +142 -0
  373. package/src/tests/harness/fourslash/testState.Consts.ts +29 -0
  374. package/src/tests/harness/fourslash/testState.ts +1993 -0
  375. package/src/tests/harness/testAccessHost.ts +23 -0
  376. package/src/tests/harness/testHost.ts +177 -0
  377. package/src/tests/harness/utils.ts +355 -0
  378. package/src/tests/harness/vfs/factory.ts +199 -0
  379. package/src/tests/harness/vfs/filesystem.ts +1893 -0
  380. package/src/tests/harness/vfs/pathValidation.ts +154 -0
  381. package/src/tests/importAdder.test.ts +1361 -0
  382. package/src/tests/importResolver.test.ts +534 -0
  383. package/src/tests/importStatementUtils.test.ts +526 -0
  384. package/src/tests/indentationUtils.ptvs.test.ts +388 -0
  385. package/src/tests/indentationUtils.reindent.test.ts +403 -0
  386. package/src/tests/indentationUtils.test.ts +455 -0
  387. package/src/tests/ipythonMode.test.ts +365 -0
  388. package/src/tests/localizer.test.ts +47 -0
  389. package/src/tests/parseTreeUtils.test.ts +281 -0
  390. package/src/tests/parser.test.ts +99 -0
  391. package/src/tests/pathUtils.test.ts +321 -0
  392. package/src/tests/pyrightFileSystem.test.ts +183 -0
  393. package/src/tests/renameModule.folder.test.ts +261 -0
  394. package/src/tests/renameModule.fromImports.test.ts +952 -0
  395. package/src/tests/renameModule.imports.test.ts +450 -0
  396. package/src/tests/renameModule.misc.test.ts +765 -0
  397. package/src/tests/renameModule.relativePath.test.ts +277 -0
  398. package/src/tests/renameModuleTestUtils.ts +210 -0
  399. package/src/tests/samples/abstractClass1.py +51 -0
  400. package/src/tests/samples/abstractClass2.py +25 -0
  401. package/src/tests/samples/abstractClass3.py +30 -0
  402. package/src/tests/samples/abstractClass4.py +30 -0
  403. package/src/tests/samples/abstractClass5.py +42 -0
  404. package/src/tests/samples/abstractClass6.py +25 -0
  405. package/src/tests/samples/abstractClass7.py +22 -0
  406. package/src/tests/samples/abstractClass8.py +27 -0
  407. package/src/tests/samples/annotated1.py +72 -0
  408. package/src/tests/samples/annotatedVar1.py +22 -0
  409. package/src/tests/samples/annotatedVar2.py +28 -0
  410. package/src/tests/samples/annotatedVar3.py +54 -0
  411. package/src/tests/samples/annotatedVar4.py +24 -0
  412. package/src/tests/samples/annotatedVar5.py +37 -0
  413. package/src/tests/samples/annotatedVar6.py +22 -0
  414. package/src/tests/samples/annotatedVar7.py +13 -0
  415. package/src/tests/samples/annotatedVar8.py +29 -0
  416. package/src/tests/samples/annotations1.py +98 -0
  417. package/src/tests/samples/annotations2.py +33 -0
  418. package/src/tests/samples/annotations3.py +43 -0
  419. package/src/tests/samples/annotations4.py +54 -0
  420. package/src/tests/samples/annotations5.py +9 -0
  421. package/src/tests/samples/annotations6.py +29 -0
  422. package/src/tests/samples/assert1.py +22 -0
  423. package/src/tests/samples/assertType1.py +46 -0
  424. package/src/tests/samples/assignment1.py +58 -0
  425. package/src/tests/samples/assignment10.py +14 -0
  426. package/src/tests/samples/assignment2.py +40 -0
  427. package/src/tests/samples/assignment3.py +46 -0
  428. package/src/tests/samples/assignment4.py +20 -0
  429. package/src/tests/samples/assignment5.py +16 -0
  430. package/src/tests/samples/assignment6.py +25 -0
  431. package/src/tests/samples/assignment7.py +13 -0
  432. package/src/tests/samples/assignment8.py +40 -0
  433. package/src/tests/samples/assignment9.py +25 -0
  434. package/src/tests/samples/assignmentExpr1.py +23 -0
  435. package/src/tests/samples/assignmentExpr2.py +49 -0
  436. package/src/tests/samples/assignmentExpr3.py +27 -0
  437. package/src/tests/samples/assignmentExpr4.py +49 -0
  438. package/src/tests/samples/assignmentExpr5.py +15 -0
  439. package/src/tests/samples/assignmentExpr6.py +10 -0
  440. package/src/tests/samples/assignmentExpr7.py +13 -0
  441. package/src/tests/samples/assignmentExpr8.py +11 -0
  442. package/src/tests/samples/assignmentExpr9.py +28 -0
  443. package/src/tests/samples/async1.py +49 -0
  444. package/src/tests/samples/augmentedAssignment1.py +62 -0
  445. package/src/tests/samples/augmentedAssignment2.py +23 -0
  446. package/src/tests/samples/augmentedAssignment3.py +8 -0
  447. package/src/tests/samples/await1.py +23 -0
  448. package/src/tests/samples/await2.py +25 -0
  449. package/src/tests/samples/badToken1.py +6 -0
  450. package/src/tests/samples/builtins1.py +2 -0
  451. package/src/tests/samples/call1.py +93 -0
  452. package/src/tests/samples/call2.py +118 -0
  453. package/src/tests/samples/call3.py +168 -0
  454. package/src/tests/samples/call4.py +13 -0
  455. package/src/tests/samples/call5.py +95 -0
  456. package/src/tests/samples/call6.py +35 -0
  457. package/src/tests/samples/call7.py +57 -0
  458. package/src/tests/samples/callSite1.py +6 -0
  459. package/src/tests/samples/callSite2.py +12 -0
  460. package/src/tests/samples/callable1.py +53 -0
  461. package/src/tests/samples/callable2.py +58 -0
  462. package/src/tests/samples/callable3.py +28 -0
  463. package/src/tests/samples/callable4.py +32 -0
  464. package/src/tests/samples/callable5.py +40 -0
  465. package/src/tests/samples/callable6.py +83 -0
  466. package/src/tests/samples/callbackProtocol1.py +119 -0
  467. package/src/tests/samples/callbackProtocol2.py +29 -0
  468. package/src/tests/samples/callbackProtocol3.py +23 -0
  469. package/src/tests/samples/callbackProtocol4.py +73 -0
  470. package/src/tests/samples/callbackProtocol5.py +66 -0
  471. package/src/tests/samples/callbackProtocol6.py +66 -0
  472. package/src/tests/samples/callbackProtocol7.py +16 -0
  473. package/src/tests/samples/callbackProtocol8.py +16 -0
  474. package/src/tests/samples/capturedVariable1.py +106 -0
  475. package/src/tests/samples/circular1.py +16 -0
  476. package/src/tests/samples/circular2.py +38 -0
  477. package/src/tests/samples/circularBaseClass.py +17 -0
  478. package/src/tests/samples/classGetItem1.py +30 -0
  479. package/src/tests/samples/classVar1.py +41 -0
  480. package/src/tests/samples/classVar2.py +29 -0
  481. package/src/tests/samples/classVar3.py +46 -0
  482. package/src/tests/samples/classVar4.py +36 -0
  483. package/src/tests/samples/classes1.py +50 -0
  484. package/src/tests/samples/classes3.py +48 -0
  485. package/src/tests/samples/classes4.py +15 -0
  486. package/src/tests/samples/classes5.py +260 -0
  487. package/src/tests/samples/classes6.py +16 -0
  488. package/src/tests/samples/classes7.py +18 -0
  489. package/src/tests/samples/classes8.py +47 -0
  490. package/src/tests/samples/codeFlow1.py +65 -0
  491. package/src/tests/samples/codeFlow2.py +26 -0
  492. package/src/tests/samples/codeFlow3.py +8 -0
  493. package/src/tests/samples/codeFlow4.py +133 -0
  494. package/src/tests/samples/codeFlow5.py +10 -0
  495. package/src/tests/samples/codeFlow6.py +35 -0
  496. package/src/tests/samples/codeFlow7.py +35 -0
  497. package/src/tests/samples/comparison1.py +77 -0
  498. package/src/tests/samples/comparison2.py +37 -0
  499. package/src/tests/samples/complex1.py +17 -0
  500. package/src/tests/samples/constant1.py +40 -0
  501. package/src/tests/samples/constants1.py +64 -0
  502. package/src/tests/samples/constructor1.py +30 -0
  503. package/src/tests/samples/constructor10.py +19 -0
  504. package/src/tests/samples/constructor11.py +32 -0
  505. package/src/tests/samples/constructor12.py +20 -0
  506. package/src/tests/samples/constructor13.py +15 -0
  507. package/src/tests/samples/constructor2.py +180 -0
  508. package/src/tests/samples/constructor3.py +18 -0
  509. package/src/tests/samples/constructor4.py +25 -0
  510. package/src/tests/samples/constructor5.py +25 -0
  511. package/src/tests/samples/constructor6.py +70 -0
  512. package/src/tests/samples/constructor7.py +11 -0
  513. package/src/tests/samples/constructor8.py +99 -0
  514. package/src/tests/samples/constructor9.py +19 -0
  515. package/src/tests/samples/coroutines1.py +60 -0
  516. package/src/tests/samples/coroutines2.py +20 -0
  517. package/src/tests/samples/coroutines3.py +37 -0
  518. package/src/tests/samples/dataclass1.py +44 -0
  519. package/src/tests/samples/dataclass10.py +45 -0
  520. package/src/tests/samples/dataclass11.py +53 -0
  521. package/src/tests/samples/dataclass12.py +32 -0
  522. package/src/tests/samples/dataclass13.py +42 -0
  523. package/src/tests/samples/dataclass14.py +38 -0
  524. package/src/tests/samples/dataclass15.py +58 -0
  525. package/src/tests/samples/dataclass16.py +21 -0
  526. package/src/tests/samples/dataclass17.py +46 -0
  527. package/src/tests/samples/dataclass18.py +57 -0
  528. package/src/tests/samples/dataclass19.py +44 -0
  529. package/src/tests/samples/dataclass2.py +30 -0
  530. package/src/tests/samples/dataclass20.py +71 -0
  531. package/src/tests/samples/dataclass21.py +13 -0
  532. package/src/tests/samples/dataclass3.py +18 -0
  533. package/src/tests/samples/dataclass4.py +64 -0
  534. package/src/tests/samples/dataclass5.py +81 -0
  535. package/src/tests/samples/dataclass6.py +29 -0
  536. package/src/tests/samples/dataclass7.py +93 -0
  537. package/src/tests/samples/dataclass8.py +22 -0
  538. package/src/tests/samples/dataclass9.py +24 -0
  539. package/src/tests/samples/dataclassPostInit1.py +61 -0
  540. package/src/tests/samples/dataclassTransform1.py +71 -0
  541. package/src/tests/samples/dataclassTransform2.py +78 -0
  542. package/src/tests/samples/dataclassTransform3.py +83 -0
  543. package/src/tests/samples/dataclassTransform4.py +87 -0
  544. package/src/tests/samples/decorator1.py +20 -0
  545. package/src/tests/samples/decorator2.py +31 -0
  546. package/src/tests/samples/decorator3.py +27 -0
  547. package/src/tests/samples/decorator4.py +37 -0
  548. package/src/tests/samples/decorator5.py +29 -0
  549. package/src/tests/samples/decorator6.py +34 -0
  550. package/src/tests/samples/defaultInitializer1.py +26 -0
  551. package/src/tests/samples/deprecated1.py +37 -0
  552. package/src/tests/samples/descriptor1.py +134 -0
  553. package/src/tests/samples/descriptor2.py +29 -0
  554. package/src/tests/samples/dictionary1.py +42 -0
  555. package/src/tests/samples/dictionary2.py +14 -0
  556. package/src/tests/samples/dictionary3.py +30 -0
  557. package/src/tests/samples/dictionary4.py +106 -0
  558. package/src/tests/samples/dunderAll1.py +32 -0
  559. package/src/tests/samples/dunderAll2.py +16 -0
  560. package/src/tests/samples/dunderAll3.pyi +16 -0
  561. package/src/tests/samples/duplicateDeclaration1.py +115 -0
  562. package/src/tests/samples/duplicateDeclaration2.py +45 -0
  563. package/src/tests/samples/duplicateImports1.py +13 -0
  564. package/src/tests/samples/ellipsis1.pyi +48 -0
  565. package/src/tests/samples/emptyContainers1.py +89 -0
  566. package/src/tests/samples/enums1.py +52 -0
  567. package/src/tests/samples/enums2.py +15 -0
  568. package/src/tests/samples/enums3.py +24 -0
  569. package/src/tests/samples/enums4.py +23 -0
  570. package/src/tests/samples/enums5.py +16 -0
  571. package/src/tests/samples/enums6.py +33 -0
  572. package/src/tests/samples/enums7.py +54 -0
  573. package/src/tests/samples/enums8.py +14 -0
  574. package/src/tests/samples/expressions1.py +54 -0
  575. package/src/tests/samples/expressions2.py +29 -0
  576. package/src/tests/samples/expressions3.py +26 -0
  577. package/src/tests/samples/expressions4.py +23 -0
  578. package/src/tests/samples/expressions5.py +70 -0
  579. package/src/tests/samples/expressions6.py +14 -0
  580. package/src/tests/samples/expressions7.py +40 -0
  581. package/src/tests/samples/expressions8.py +26 -0
  582. package/src/tests/samples/expressions9.py +14 -0
  583. package/src/tests/samples/final1.py +14 -0
  584. package/src/tests/samples/final2.py +86 -0
  585. package/src/tests/samples/final3.py +179 -0
  586. package/src/tests/samples/final4.pyi +21 -0
  587. package/src/tests/samples/final5.py +18 -0
  588. package/src/tests/samples/forLoop1.py +88 -0
  589. package/src/tests/samples/forLoop2.py +48 -0
  590. package/src/tests/samples/fstring1.py +66 -0
  591. package/src/tests/samples/fstring2.py +12 -0
  592. package/src/tests/samples/fstring3.py +35 -0
  593. package/src/tests/samples/fstring4.py +17 -0
  594. package/src/tests/samples/fstring5.py +17 -0
  595. package/src/tests/samples/fstring6.py +14 -0
  596. package/src/tests/samples/function1.py +12 -0
  597. package/src/tests/samples/function10.py +20 -0
  598. package/src/tests/samples/function11.py +36 -0
  599. package/src/tests/samples/function2.py +7 -0
  600. package/src/tests/samples/function3.py +82 -0
  601. package/src/tests/samples/function4.py +13 -0
  602. package/src/tests/samples/function6.py +24 -0
  603. package/src/tests/samples/function7.py +13 -0
  604. package/src/tests/samples/function8.py +38 -0
  605. package/src/tests/samples/function9.py +75 -0
  606. package/src/tests/samples/functionAnnotation1.py +61 -0
  607. package/src/tests/samples/functionAnnotation2.py +26 -0
  608. package/src/tests/samples/functionAnnotation3.py +37 -0
  609. package/src/tests/samples/functionAnnotation4.py +22 -0
  610. package/src/tests/samples/functionMember1.py +18 -0
  611. package/src/tests/samples/functionMember2.py +45 -0
  612. package/src/tests/samples/generators1.py +122 -0
  613. package/src/tests/samples/generators10.py +18 -0
  614. package/src/tests/samples/generators11.py +27 -0
  615. package/src/tests/samples/generators12.py +25 -0
  616. package/src/tests/samples/generators13.py +65 -0
  617. package/src/tests/samples/generators14.py +19 -0
  618. package/src/tests/samples/generators15.py +26 -0
  619. package/src/tests/samples/generators2.py +31 -0
  620. package/src/tests/samples/generators3.py +42 -0
  621. package/src/tests/samples/generators4.py +33 -0
  622. package/src/tests/samples/generators5.py +24 -0
  623. package/src/tests/samples/generators6.py +14 -0
  624. package/src/tests/samples/generators7.py +18 -0
  625. package/src/tests/samples/generators8.py +12 -0
  626. package/src/tests/samples/generators9.py +19 -0
  627. package/src/tests/samples/generic1.py +41 -0
  628. package/src/tests/samples/genericTypes1.py +12 -0
  629. package/src/tests/samples/genericTypes10.py +38 -0
  630. package/src/tests/samples/genericTypes11.py +26 -0
  631. package/src/tests/samples/genericTypes12.py +14 -0
  632. package/src/tests/samples/genericTypes13.py +27 -0
  633. package/src/tests/samples/genericTypes14.py +22 -0
  634. package/src/tests/samples/genericTypes15.py +13 -0
  635. package/src/tests/samples/genericTypes16.py +15 -0
  636. package/src/tests/samples/genericTypes17.py +24 -0
  637. package/src/tests/samples/genericTypes18.py +135 -0
  638. package/src/tests/samples/genericTypes19.py +32 -0
  639. package/src/tests/samples/genericTypes2.py +40 -0
  640. package/src/tests/samples/genericTypes20.py +44 -0
  641. package/src/tests/samples/genericTypes21.py +29 -0
  642. package/src/tests/samples/genericTypes22.py +23 -0
  643. package/src/tests/samples/genericTypes23.py +27 -0
  644. package/src/tests/samples/genericTypes24.py +32 -0
  645. package/src/tests/samples/genericTypes25.py +37 -0
  646. package/src/tests/samples/genericTypes26.py +31 -0
  647. package/src/tests/samples/genericTypes27.py +14 -0
  648. package/src/tests/samples/genericTypes28.py +51 -0
  649. package/src/tests/samples/genericTypes29.py +24 -0
  650. package/src/tests/samples/genericTypes3.py +13 -0
  651. package/src/tests/samples/genericTypes30.py +32 -0
  652. package/src/tests/samples/genericTypes31.py +30 -0
  653. package/src/tests/samples/genericTypes32.py +25 -0
  654. package/src/tests/samples/genericTypes33.py +46 -0
  655. package/src/tests/samples/genericTypes34.py +54 -0
  656. package/src/tests/samples/genericTypes35.py +45 -0
  657. package/src/tests/samples/genericTypes36.py +35 -0
  658. package/src/tests/samples/genericTypes37.py +26 -0
  659. package/src/tests/samples/genericTypes38.py +15 -0
  660. package/src/tests/samples/genericTypes39.py +82 -0
  661. package/src/tests/samples/genericTypes4.py +37 -0
  662. package/src/tests/samples/genericTypes40.py +38 -0
  663. package/src/tests/samples/genericTypes41.py +16 -0
  664. package/src/tests/samples/genericTypes42.py +32 -0
  665. package/src/tests/samples/genericTypes43.py +24 -0
  666. package/src/tests/samples/genericTypes44.py +33 -0
  667. package/src/tests/samples/genericTypes45.py +43 -0
  668. package/src/tests/samples/genericTypes46.py +66 -0
  669. package/src/tests/samples/genericTypes47.py +39 -0
  670. package/src/tests/samples/genericTypes48.py +18 -0
  671. package/src/tests/samples/genericTypes49.py +41 -0
  672. package/src/tests/samples/genericTypes5.py +42 -0
  673. package/src/tests/samples/genericTypes50.py +62 -0
  674. package/src/tests/samples/genericTypes51.py +55 -0
  675. package/src/tests/samples/genericTypes52.py +34 -0
  676. package/src/tests/samples/genericTypes53.py +42 -0
  677. package/src/tests/samples/genericTypes54.py +31 -0
  678. package/src/tests/samples/genericTypes55.py +61 -0
  679. package/src/tests/samples/genericTypes56.py +19 -0
  680. package/src/tests/samples/genericTypes57.py +30 -0
  681. package/src/tests/samples/genericTypes58.py +52 -0
  682. package/src/tests/samples/genericTypes59.py +71 -0
  683. package/src/tests/samples/genericTypes6.py +49 -0
  684. package/src/tests/samples/genericTypes60.py +27 -0
  685. package/src/tests/samples/genericTypes61.py +34 -0
  686. package/src/tests/samples/genericTypes62.py +26 -0
  687. package/src/tests/samples/genericTypes63.py +32 -0
  688. package/src/tests/samples/genericTypes64.py +16 -0
  689. package/src/tests/samples/genericTypes65.py +15 -0
  690. package/src/tests/samples/genericTypes66.py +30 -0
  691. package/src/tests/samples/genericTypes67.py +57 -0
  692. package/src/tests/samples/genericTypes68.py +14 -0
  693. package/src/tests/samples/genericTypes69.py +45 -0
  694. package/src/tests/samples/genericTypes7.py +24 -0
  695. package/src/tests/samples/genericTypes70.py +31 -0
  696. package/src/tests/samples/genericTypes71.py +72 -0
  697. package/src/tests/samples/genericTypes72.py +24 -0
  698. package/src/tests/samples/genericTypes73.py +14 -0
  699. package/src/tests/samples/genericTypes74.py +23 -0
  700. package/src/tests/samples/genericTypes75.py +45 -0
  701. package/src/tests/samples/genericTypes76.py +107 -0
  702. package/src/tests/samples/genericTypes77.py +26 -0
  703. package/src/tests/samples/genericTypes78.py +23 -0
  704. package/src/tests/samples/genericTypes79.py +37 -0
  705. package/src/tests/samples/genericTypes8.py +26 -0
  706. package/src/tests/samples/genericTypes80.py +10 -0
  707. package/src/tests/samples/genericTypes81.py +32 -0
  708. package/src/tests/samples/genericTypes82.py +19 -0
  709. package/src/tests/samples/genericTypes83.py +28 -0
  710. package/src/tests/samples/genericTypes84.py +11 -0
  711. package/src/tests/samples/genericTypes85.py +20 -0
  712. package/src/tests/samples/genericTypes86.py +15 -0
  713. package/src/tests/samples/genericTypes87.py +21 -0
  714. package/src/tests/samples/genericTypes88.py +25 -0
  715. package/src/tests/samples/genericTypes89.py +17 -0
  716. package/src/tests/samples/genericTypes9.py +109 -0
  717. package/src/tests/samples/genericTypes90.py +12 -0
  718. package/src/tests/samples/genericTypes91.py +20 -0
  719. package/src/tests/samples/import1.py +7 -0
  720. package/src/tests/samples/import10.py +11 -0
  721. package/src/tests/samples/import11.py +11 -0
  722. package/src/tests/samples/import12.py +5 -0
  723. package/src/tests/samples/import13.py +6 -0
  724. package/src/tests/samples/import14.py +10 -0
  725. package/src/tests/samples/import2.py +27 -0
  726. package/src/tests/samples/import3.py +8 -0
  727. package/src/tests/samples/import4.py +15 -0
  728. package/src/tests/samples/import5.py +6 -0
  729. package/src/tests/samples/import6.py +17 -0
  730. package/src/tests/samples/import7.py +14 -0
  731. package/src/tests/samples/import8.py +7 -0
  732. package/src/tests/samples/import9.py +7 -0
  733. package/src/tests/samples/inconsistentConstructor1.py +23 -0
  734. package/src/tests/samples/inconsistentSpaceTab1.py +9 -0
  735. package/src/tests/samples/inconsistentSpaceTab2.py +10 -0
  736. package/src/tests/samples/index1.py +97 -0
  737. package/src/tests/samples/inferredTypes1.py +25 -0
  738. package/src/tests/samples/initVar1.py +23 -0
  739. package/src/tests/samples/initsubclass1.py +46 -0
  740. package/src/tests/samples/initsubclass2.py +16 -0
  741. package/src/tests/samples/isinstance1.py +57 -0
  742. package/src/tests/samples/isinstance10.py +15 -0
  743. package/src/tests/samples/isinstance2.py +28 -0
  744. package/src/tests/samples/isinstance3.py +59 -0
  745. package/src/tests/samples/isinstance4.py +57 -0
  746. package/src/tests/samples/isinstance5.py +8 -0
  747. package/src/tests/samples/isinstance6.py +19 -0
  748. package/src/tests/samples/isinstance7.py +42 -0
  749. package/src/tests/samples/isinstance9.py +26 -0
  750. package/src/tests/samples/kwargsUnpack1.py +116 -0
  751. package/src/tests/samples/lambda1.py +77 -0
  752. package/src/tests/samples/lambda2.py +26 -0
  753. package/src/tests/samples/lambda3.py +34 -0
  754. package/src/tests/samples/lambda4.py +70 -0
  755. package/src/tests/samples/lambda5.py +23 -0
  756. package/src/tests/samples/lambda6.py +15 -0
  757. package/src/tests/samples/lines1.py +14 -0
  758. package/src/tests/samples/list1.py +90 -0
  759. package/src/tests/samples/listComprehension1.py +45 -0
  760. package/src/tests/samples/listComprehension2.py +17 -0
  761. package/src/tests/samples/listComprehension3.py +12 -0
  762. package/src/tests/samples/listComprehension4.py +15 -0
  763. package/src/tests/samples/listComprehension5.py +20 -0
  764. package/src/tests/samples/listComprehension6.py +14 -0
  765. package/src/tests/samples/listComprehension7.py +15 -0
  766. package/src/tests/samples/listComprehension8.py +15 -0
  767. package/src/tests/samples/literalString1.py +43 -0
  768. package/src/tests/samples/literals1.py +48 -0
  769. package/src/tests/samples/literals2.py +30 -0
  770. package/src/tests/samples/literals3.py +40 -0
  771. package/src/tests/samples/literals4.py +10 -0
  772. package/src/tests/samples/literals5.py +28 -0
  773. package/src/tests/samples/literals6.py +90 -0
  774. package/src/tests/samples/literals7.py +38 -0
  775. package/src/tests/samples/loops1.py +45 -0
  776. package/src/tests/samples/loops10.py +11 -0
  777. package/src/tests/samples/loops11.py +22 -0
  778. package/src/tests/samples/loops12.py +18 -0
  779. package/src/tests/samples/loops13.py +13 -0
  780. package/src/tests/samples/loops14.py +22 -0
  781. package/src/tests/samples/loops15.py +22 -0
  782. package/src/tests/samples/loops16.py +322 -0
  783. package/src/tests/samples/loops17.py +9 -0
  784. package/src/tests/samples/loops18.py +23 -0
  785. package/src/tests/samples/loops19.py +14 -0
  786. package/src/tests/samples/loops2.py +25 -0
  787. package/src/tests/samples/loops20.py +41 -0
  788. package/src/tests/samples/loops21.py +18 -0
  789. package/src/tests/samples/loops22.py +21 -0
  790. package/src/tests/samples/loops23.py +16 -0
  791. package/src/tests/samples/loops24.py +12 -0
  792. package/src/tests/samples/loops25.py +45 -0
  793. package/src/tests/samples/loops26.py +12 -0
  794. package/src/tests/samples/loops3.py +11 -0
  795. package/src/tests/samples/loops4.py +17 -0
  796. package/src/tests/samples/loops5.py +14 -0
  797. package/src/tests/samples/loops6.py +25 -0
  798. package/src/tests/samples/loops7.py +14 -0
  799. package/src/tests/samples/loops8.py +17 -0
  800. package/src/tests/samples/loops9.py +25 -0
  801. package/src/tests/samples/match1.py +190 -0
  802. package/src/tests/samples/match10.py +67 -0
  803. package/src/tests/samples/match2.py +340 -0
  804. package/src/tests/samples/match3.py +364 -0
  805. package/src/tests/samples/match4.py +100 -0
  806. package/src/tests/samples/match5.py +70 -0
  807. package/src/tests/samples/match6.py +64 -0
  808. package/src/tests/samples/match7.py +65 -0
  809. package/src/tests/samples/match8.py +19 -0
  810. package/src/tests/samples/match9.py +53 -0
  811. package/src/tests/samples/maxParseDepth1.py +499 -0
  812. package/src/tests/samples/maxParseDepth2.py +16 -0
  813. package/src/tests/samples/memberAccess1.py +70 -0
  814. package/src/tests/samples/memberAccess10.py +65 -0
  815. package/src/tests/samples/memberAccess11.py +37 -0
  816. package/src/tests/samples/memberAccess12.py +36 -0
  817. package/src/tests/samples/memberAccess13.py +17 -0
  818. package/src/tests/samples/memberAccess14.py +63 -0
  819. package/src/tests/samples/memberAccess15.py +20 -0
  820. package/src/tests/samples/memberAccess16.py +12 -0
  821. package/src/tests/samples/memberAccess17.py +31 -0
  822. package/src/tests/samples/memberAccess18.py +31 -0
  823. package/src/tests/samples/memberAccess2.py +45 -0
  824. package/src/tests/samples/memberAccess3.py +64 -0
  825. package/src/tests/samples/memberAccess4.py +91 -0
  826. package/src/tests/samples/memberAccess5.py +26 -0
  827. package/src/tests/samples/memberAccess6.py +52 -0
  828. package/src/tests/samples/memberAccess7.py +36 -0
  829. package/src/tests/samples/memberAccess8.py +75 -0
  830. package/src/tests/samples/memberAccess9.py +11 -0
  831. package/src/tests/samples/metaclass1.py +7 -0
  832. package/src/tests/samples/metaclass2.py +35 -0
  833. package/src/tests/samples/metaclass3.py +43 -0
  834. package/src/tests/samples/metaclass4.py +26 -0
  835. package/src/tests/samples/metaclass5.py +33 -0
  836. package/src/tests/samples/metaclass6.py +15 -0
  837. package/src/tests/samples/metaclass7.py +38 -0
  838. package/src/tests/samples/metaclass8.py +20 -0
  839. package/src/tests/samples/metaclass9.py +77 -0
  840. package/src/tests/samples/methodOverride1.py +507 -0
  841. package/src/tests/samples/methodOverride2.py +74 -0
  842. package/src/tests/samples/methodOverride3.py +111 -0
  843. package/src/tests/samples/methodOverride4.py +36 -0
  844. package/src/tests/samples/missingSuper1.py +73 -0
  845. package/src/tests/samples/module1.py +13 -0
  846. package/src/tests/samples/module2.py +7 -0
  847. package/src/tests/samples/mro1.py +16 -0
  848. package/src/tests/samples/mro2.py +45 -0
  849. package/src/tests/samples/mro3.py +30 -0
  850. package/src/tests/samples/mro4.py +30 -0
  851. package/src/tests/samples/nameBindings1.py +48 -0
  852. package/src/tests/samples/nameBindings2.py +9 -0
  853. package/src/tests/samples/nameBindings3.py +36 -0
  854. package/src/tests/samples/nameBindings4.py +10 -0
  855. package/src/tests/samples/nameBindings5.py +53 -0
  856. package/src/tests/samples/namedTuples1.py +103 -0
  857. package/src/tests/samples/namedTuples2.py +56 -0
  858. package/src/tests/samples/namedTuples3.py +15 -0
  859. package/src/tests/samples/namedTuples4.py +24 -0
  860. package/src/tests/samples/namedTuples5.py +15 -0
  861. package/src/tests/samples/namedTuples6.py +31 -0
  862. package/src/tests/samples/namedTuples7.py +27 -0
  863. package/src/tests/samples/never1.py +12 -0
  864. package/src/tests/samples/never2.py +43 -0
  865. package/src/tests/samples/newType1.py +34 -0
  866. package/src/tests/samples/newType2.py +25 -0
  867. package/src/tests/samples/newType3.py +34 -0
  868. package/src/tests/samples/newType4.py +8 -0
  869. package/src/tests/samples/none1.py +29 -0
  870. package/src/tests/samples/none2.py +22 -0
  871. package/src/tests/samples/noreturn1.py +78 -0
  872. package/src/tests/samples/noreturn2.py +37 -0
  873. package/src/tests/samples/noreturn3.py +16 -0
  874. package/src/tests/samples/noreturn4.py +29 -0
  875. package/src/tests/samples/operators1.py +101 -0
  876. package/src/tests/samples/operators2.py +30 -0
  877. package/src/tests/samples/operators3.py +8 -0
  878. package/src/tests/samples/operators4.py +22 -0
  879. package/src/tests/samples/operators5.py +5 -0
  880. package/src/tests/samples/operators6.py +10 -0
  881. package/src/tests/samples/operators7.py +24 -0
  882. package/src/tests/samples/operators8.py +125 -0
  883. package/src/tests/samples/optional1.py +77 -0
  884. package/src/tests/samples/optional2.py +23 -0
  885. package/src/tests/samples/overload1.py +50 -0
  886. package/src/tests/samples/overload10.py +48 -0
  887. package/src/tests/samples/overload2.py +37 -0
  888. package/src/tests/samples/overload3.py +29 -0
  889. package/src/tests/samples/overload4.py +46 -0
  890. package/src/tests/samples/overload5.py +333 -0
  891. package/src/tests/samples/overload6.py +64 -0
  892. package/src/tests/samples/overload7.py +376 -0
  893. package/src/tests/samples/overload8.py +89 -0
  894. package/src/tests/samples/overload9.py +19 -0
  895. package/src/tests/samples/package1/__init__.py +3 -0
  896. package/src/tests/samples/package1/psyche/pysche.py +4 -0
  897. package/src/tests/samples/package1/psyche.py +4 -0
  898. package/src/tests/samples/package1/sub/__init__.py +5 -0
  899. package/src/tests/samples/package1/sub.py +4 -0
  900. package/src/tests/samples/package1/sub.pyi +2 -0
  901. package/src/tests/samples/paramInference1.py +27 -0
  902. package/src/tests/samples/paramNames1.py +39 -0
  903. package/src/tests/samples/paramSpec1.py +64 -0
  904. package/src/tests/samples/paramSpec10.py +57 -0
  905. package/src/tests/samples/paramSpec11.py +36 -0
  906. package/src/tests/samples/paramSpec12.py +88 -0
  907. package/src/tests/samples/paramSpec13.py +112 -0
  908. package/src/tests/samples/paramSpec14.py +30 -0
  909. package/src/tests/samples/paramSpec15.py +28 -0
  910. package/src/tests/samples/paramSpec16.py +28 -0
  911. package/src/tests/samples/paramSpec17.py +34 -0
  912. package/src/tests/samples/paramSpec18.py +43 -0
  913. package/src/tests/samples/paramSpec19.py +93 -0
  914. package/src/tests/samples/paramSpec2.py +29 -0
  915. package/src/tests/samples/paramSpec20.py +87 -0
  916. package/src/tests/samples/paramSpec21.py +58 -0
  917. package/src/tests/samples/paramSpec22.py +26 -0
  918. package/src/tests/samples/paramSpec23.py +21 -0
  919. package/src/tests/samples/paramSpec24.py +67 -0
  920. package/src/tests/samples/paramSpec25.py +36 -0
  921. package/src/tests/samples/paramSpec26.py +25 -0
  922. package/src/tests/samples/paramSpec27.py +57 -0
  923. package/src/tests/samples/paramSpec28.py +39 -0
  924. package/src/tests/samples/paramSpec29.py +37 -0
  925. package/src/tests/samples/paramSpec3.py +71 -0
  926. package/src/tests/samples/paramSpec30.py +49 -0
  927. package/src/tests/samples/paramSpec31.py +16 -0
  928. package/src/tests/samples/paramSpec32.py +57 -0
  929. package/src/tests/samples/paramSpec33.py +29 -0
  930. package/src/tests/samples/paramSpec34.py +29 -0
  931. package/src/tests/samples/paramSpec35.py +24 -0
  932. package/src/tests/samples/paramSpec36.py +43 -0
  933. package/src/tests/samples/paramSpec37.py +25 -0
  934. package/src/tests/samples/paramSpec4.py +109 -0
  935. package/src/tests/samples/paramSpec5.py +29 -0
  936. package/src/tests/samples/paramSpec6.py +17 -0
  937. package/src/tests/samples/paramSpec7.py +22 -0
  938. package/src/tests/samples/paramSpec8.py +45 -0
  939. package/src/tests/samples/paramSpec9.py +57 -0
  940. package/src/tests/samples/paramType1.py +71 -0
  941. package/src/tests/samples/parameters1.py +16 -0
  942. package/src/tests/samples/partial1.py +163 -0
  943. package/src/tests/samples/partial2.py +31 -0
  944. package/src/tests/samples/private1.py +55 -0
  945. package/src/tests/samples/private2.py +11 -0
  946. package/src/tests/samples/project1/pyrightconfig.json +5 -0
  947. package/src/tests/samples/project1/sample1.py +0 -0
  948. package/src/tests/samples/project1/subfolder1/sample2.py +0 -0
  949. package/src/tests/samples/project1/subfolder1/subfolder1-1/sample3.py +0 -0
  950. package/src/tests/samples/project2/pyrightconfig.json +3 -0
  951. package/src/tests/samples/project3/pyrightconfig.json +7 -0
  952. package/src/tests/samples/project4/presentfile.py +0 -0
  953. package/src/tests/samples/project4/pyrightconfig.json +11 -0
  954. package/src/tests/samples/project4/subfolder/presentfile2.py +0 -0
  955. package/src/tests/samples/project4/subfolder/presentfile3.py +0 -0
  956. package/src/tests/samples/project5/pyrightconfig.json +4 -0
  957. package/src/tests/samples/project6/app1.py +0 -0
  958. package/src/tests/samples/project6/app2.py +0 -0
  959. package/src/tests/samples/project6/projectA/foo/__init__.py +0 -0
  960. package/src/tests/samples/project6/projectA/foo/bar/__init__.py +0 -0
  961. package/src/tests/samples/project6/projectB/foo/__init__.py +0 -0
  962. package/src/tests/samples/project6/projectB/foo/baz/__init__.py +0 -0
  963. package/src/tests/samples/project_src/src/module1.py +0 -0
  964. package/src/tests/samples/project_src_is_pkg/src/__init__.py +0 -0
  965. package/src/tests/samples/project_src_is_pkg/src/module1.py +0 -0
  966. package/src/tests/samples/project_src_with_config_extra_paths/pyrightconfig.json +3 -0
  967. package/src/tests/samples/project_src_with_config_extra_paths/src/module1.py +0 -0
  968. package/src/tests/samples/project_src_with_config_no_extra_paths/pyrightconfig.json +2 -0
  969. package/src/tests/samples/project_src_with_config_no_extra_paths/src/module1.py +0 -0
  970. package/src/tests/samples/project_src_with_extra_paths/src/_vendored/vendored1.py +1 -0
  971. package/src/tests/samples/project_src_with_extra_paths/src/module1.py +2 -0
  972. package/src/tests/samples/project_with_pyproject_toml/pyproject.toml +7 -0
  973. package/src/tests/samples/project_with_venv_auto_detect_exclude/myvenv/Lib/site-packages/library1.py +0 -0
  974. package/src/tests/samples/project_with_venv_auto_detect_exclude/myvenv/pyvenv.cfg +0 -0
  975. package/src/tests/samples/project_with_venv_auto_detect_exclude/pyrightconfig.json +2 -0
  976. package/src/tests/samples/project_with_venv_auto_detect_exclude/sample1.py +0 -0
  977. package/src/tests/samples/project_with_venv_auto_detect_exclude/subfolder1/sample2.py +0 -0
  978. package/src/tests/samples/project_with_venv_auto_detect_exclude/subfolder1/subfolder1-1/sample3.py +0 -0
  979. package/src/tests/samples/project_with_venv_auto_detect_include/excluded/excluded1.py +0 -0
  980. package/src/tests/samples/project_with_venv_auto_detect_include/myvenv/Lib/site-packages/library1.py +0 -0
  981. package/src/tests/samples/project_with_venv_auto_detect_include/myvenv/pyvenv.cfg +0 -0
  982. package/src/tests/samples/project_with_venv_auto_detect_include/pyrightconfig.json +3 -0
  983. package/src/tests/samples/project_with_venv_auto_detect_include/sample1.py +0 -0
  984. package/src/tests/samples/project_with_venv_auto_detect_include/subfolder1/sample2.py +0 -0
  985. package/src/tests/samples/project_with_venv_auto_detect_include/subfolder1/subfolder1-1/sample3.py +0 -0
  986. package/src/tests/samples/properties1.py +64 -0
  987. package/src/tests/samples/properties10.py +19 -0
  988. package/src/tests/samples/properties11.py +45 -0
  989. package/src/tests/samples/properties12.py +23 -0
  990. package/src/tests/samples/properties13.py +15 -0
  991. package/src/tests/samples/properties2.py +34 -0
  992. package/src/tests/samples/properties3.py +93 -0
  993. package/src/tests/samples/properties4.py +17 -0
  994. package/src/tests/samples/properties5.py +29 -0
  995. package/src/tests/samples/properties6.py +35 -0
  996. package/src/tests/samples/properties7.py +30 -0
  997. package/src/tests/samples/properties8.py +26 -0
  998. package/src/tests/samples/properties9.py +24 -0
  999. package/src/tests/samples/protocol1.py +132 -0
  1000. package/src/tests/samples/protocol10.py +36 -0
  1001. package/src/tests/samples/protocol11.py +32 -0
  1002. package/src/tests/samples/protocol12.py +12 -0
  1003. package/src/tests/samples/protocol13.py +26 -0
  1004. package/src/tests/samples/protocol14.py +27 -0
  1005. package/src/tests/samples/protocol15.py +27 -0
  1006. package/src/tests/samples/protocol16.py +22 -0
  1007. package/src/tests/samples/protocol17.py +94 -0
  1008. package/src/tests/samples/protocol18.py +27 -0
  1009. package/src/tests/samples/protocol19.py +39 -0
  1010. package/src/tests/samples/protocol2.py +38 -0
  1011. package/src/tests/samples/protocol20.py +22 -0
  1012. package/src/tests/samples/protocol21.py +26 -0
  1013. package/src/tests/samples/protocol22.py +43 -0
  1014. package/src/tests/samples/protocol23.py +41 -0
  1015. package/src/tests/samples/protocol24.py +74 -0
  1016. package/src/tests/samples/protocol25.py +31 -0
  1017. package/src/tests/samples/protocol26.py +40 -0
  1018. package/src/tests/samples/protocol27.py +76 -0
  1019. package/src/tests/samples/protocol28.py +32 -0
  1020. package/src/tests/samples/protocol29.py +26 -0
  1021. package/src/tests/samples/protocol3.py +110 -0
  1022. package/src/tests/samples/protocol30.py +30 -0
  1023. package/src/tests/samples/protocol31.py +22 -0
  1024. package/src/tests/samples/protocol32.py +67 -0
  1025. package/src/tests/samples/protocol33.py +39 -0
  1026. package/src/tests/samples/protocol34.py +21 -0
  1027. package/src/tests/samples/protocol4.py +22 -0
  1028. package/src/tests/samples/protocol5.py +25 -0
  1029. package/src/tests/samples/protocol6.py +65 -0
  1030. package/src/tests/samples/protocol7.py +24 -0
  1031. package/src/tests/samples/protocol8.py +34 -0
  1032. package/src/tests/samples/protocol9.py +35 -0
  1033. package/src/tests/samples/protocolModule1.py +15 -0
  1034. package/src/tests/samples/protocolModule2.py +83 -0
  1035. package/src/tests/samples/protocolModule3.py +14 -0
  1036. package/src/tests/samples/protocolModule4.py +26 -0
  1037. package/src/tests/samples/pseudoGeneric1.py +20 -0
  1038. package/src/tests/samples/pyrightIgnore1.py +11 -0
  1039. package/src/tests/samples/pyrightIgnore2.py +24 -0
  1040. package/src/tests/samples/python2.py +31 -0
  1041. package/src/tests/samples/recursiveTypeAlias1.py +79 -0
  1042. package/src/tests/samples/recursiveTypeAlias2.py +32 -0
  1043. package/src/tests/samples/recursiveTypeAlias3.py +26 -0
  1044. package/src/tests/samples/recursiveTypeAlias4.py +55 -0
  1045. package/src/tests/samples/recursiveTypeAlias5.pyi +10 -0
  1046. package/src/tests/samples/recursiveTypeAlias6.py +25 -0
  1047. package/src/tests/samples/recursiveTypeAlias7.py +15 -0
  1048. package/src/tests/samples/recursiveTypeAlias8.py +38 -0
  1049. package/src/tests/samples/recursiveTypeAlias9.py +22 -0
  1050. package/src/tests/samples/required1.py +47 -0
  1051. package/src/tests/samples/required2.py +56 -0
  1052. package/src/tests/samples/required3.py +22 -0
  1053. package/src/tests/samples/returnTypes1.py +26 -0
  1054. package/src/tests/samples/revealedType1.py +30 -0
  1055. package/src/tests/samples/sample1.py +6 -0
  1056. package/src/tests/samples/self1.py +93 -0
  1057. package/src/tests/samples/self2.py +195 -0
  1058. package/src/tests/samples/self3.py +9 -0
  1059. package/src/tests/samples/self4.py +18 -0
  1060. package/src/tests/samples/self5.py +26 -0
  1061. package/src/tests/samples/setComprehension1.py +34 -0
  1062. package/src/tests/samples/slots1.py +63 -0
  1063. package/src/tests/samples/slots2.py +38 -0
  1064. package/src/tests/samples/slots3.py +35 -0
  1065. package/src/tests/samples/specialization1.py +78 -0
  1066. package/src/tests/samples/specialization2.py +51 -0
  1067. package/src/tests/samples/staticExpressions1.py +52 -0
  1068. package/src/tests/samples/strings1.py +22 -0
  1069. package/src/tests/samples/subscript1.py +74 -0
  1070. package/src/tests/samples/subscript2.py +55 -0
  1071. package/src/tests/samples/subscript3.py +135 -0
  1072. package/src/tests/samples/suiteExpectedColon1.py +4 -0
  1073. package/src/tests/samples/suiteExpectedColon2.py +2 -0
  1074. package/src/tests/samples/suiteExpectedColon3.py +2 -0
  1075. package/src/tests/samples/super1.py +57 -0
  1076. package/src/tests/samples/super2.py +29 -0
  1077. package/src/tests/samples/super3.py +10 -0
  1078. package/src/tests/samples/super4.py +24 -0
  1079. package/src/tests/samples/super5.py +28 -0
  1080. package/src/tests/samples/super6.py +17 -0
  1081. package/src/tests/samples/super7.py +52 -0
  1082. package/src/tests/samples/super8.py +7 -0
  1083. package/src/tests/samples/super9.py +36 -0
  1084. package/src/tests/samples/test_file1.py +0 -0
  1085. package/src/tests/samples/threePartVersion1.py +33 -0
  1086. package/src/tests/samples/totalOrdering1.py +52 -0
  1087. package/src/tests/samples/tryExcept1.py +39 -0
  1088. package/src/tests/samples/tryExcept10.py +12 -0
  1089. package/src/tests/samples/tryExcept2.py +16 -0
  1090. package/src/tests/samples/tryExcept3.py +12 -0
  1091. package/src/tests/samples/tryExcept4.py +28 -0
  1092. package/src/tests/samples/tryExcept5.py +30 -0
  1093. package/src/tests/samples/tryExcept6.py +27 -0
  1094. package/src/tests/samples/tryExcept7.py +17 -0
  1095. package/src/tests/samples/tryExcept8.py +69 -0
  1096. package/src/tests/samples/tryExcept9.py +42 -0
  1097. package/src/tests/samples/tupleUnpack1.py +63 -0
  1098. package/src/tests/samples/tupleUnpack2.py +56 -0
  1099. package/src/tests/samples/tupleUnpack3.py +28 -0
  1100. package/src/tests/samples/tuples1.py +185 -0
  1101. package/src/tests/samples/tuples10.py +30 -0
  1102. package/src/tests/samples/tuples11.py +21 -0
  1103. package/src/tests/samples/tuples12.py +31 -0
  1104. package/src/tests/samples/tuples13.py +26 -0
  1105. package/src/tests/samples/tuples15.py +16 -0
  1106. package/src/tests/samples/tuples16.py +14 -0
  1107. package/src/tests/samples/tuples2.py +23 -0
  1108. package/src/tests/samples/tuples3.py +15 -0
  1109. package/src/tests/samples/tuples4.py +21 -0
  1110. package/src/tests/samples/tuples5.py +16 -0
  1111. package/src/tests/samples/tuples6.py +56 -0
  1112. package/src/tests/samples/tuples7.py +61 -0
  1113. package/src/tests/samples/tuples8.py +98 -0
  1114. package/src/tests/samples/tuples9.py +17 -0
  1115. package/src/tests/samples/typeAlias1.py +37 -0
  1116. package/src/tests/samples/typeAlias10.py +45 -0
  1117. package/src/tests/samples/typeAlias11.py +37 -0
  1118. package/src/tests/samples/typeAlias12.py +20 -0
  1119. package/src/tests/samples/typeAlias13.py +53 -0
  1120. package/src/tests/samples/typeAlias14.py +29 -0
  1121. package/src/tests/samples/typeAlias15.py +24 -0
  1122. package/src/tests/samples/typeAlias16.py +24 -0
  1123. package/src/tests/samples/typeAlias2.py +26 -0
  1124. package/src/tests/samples/typeAlias3.py +35 -0
  1125. package/src/tests/samples/typeAlias4.py +68 -0
  1126. package/src/tests/samples/typeAlias5.py +56 -0
  1127. package/src/tests/samples/typeAlias6.py +51 -0
  1128. package/src/tests/samples/typeAlias7.py +50 -0
  1129. package/src/tests/samples/typeAlias8.py +24 -0
  1130. package/src/tests/samples/typeAlias9.py +35 -0
  1131. package/src/tests/samples/typeGuard1.py +68 -0
  1132. package/src/tests/samples/typeGuard2.py +58 -0
  1133. package/src/tests/samples/typeGuard3.py +98 -0
  1134. package/src/tests/samples/typeIgnore1.py +10 -0
  1135. package/src/tests/samples/typeIgnore2.py +20 -0
  1136. package/src/tests/samples/typeIgnore3.py +22 -0
  1137. package/src/tests/samples/typeIgnore4.py +10 -0
  1138. package/src/tests/samples/typeIgnore5.py +7 -0
  1139. package/src/tests/samples/typeNarrowing1.py +56 -0
  1140. package/src/tests/samples/typeNarrowing2.py +14 -0
  1141. package/src/tests/samples/typeNarrowing3.py +47 -0
  1142. package/src/tests/samples/typeNarrowing4.py +24 -0
  1143. package/src/tests/samples/typeNarrowing5.py +19 -0
  1144. package/src/tests/samples/typeNarrowing6.py +27 -0
  1145. package/src/tests/samples/typeNarrowing7.py +71 -0
  1146. package/src/tests/samples/typeNarrowingAssert1.py +24 -0
  1147. package/src/tests/samples/typeNarrowingCallable1.py +78 -0
  1148. package/src/tests/samples/typeNarrowingEnum1.py +58 -0
  1149. package/src/tests/samples/typeNarrowingEnum2.py +71 -0
  1150. package/src/tests/samples/typeNarrowingFalsy1.py +50 -0
  1151. package/src/tests/samples/typeNarrowingIn1.py +97 -0
  1152. package/src/tests/samples/typeNarrowingIsNone1.py +56 -0
  1153. package/src/tests/samples/typeNarrowingIsNone2.py +8 -0
  1154. package/src/tests/samples/typeNarrowingIsNoneTuple1.py +42 -0
  1155. package/src/tests/samples/typeNarrowingIsNoneTuple2.py +35 -0
  1156. package/src/tests/samples/typeNarrowingIsinstance1.py +162 -0
  1157. package/src/tests/samples/typeNarrowingIsinstance2.py +14 -0
  1158. package/src/tests/samples/typeNarrowingIsinstance3.py +78 -0
  1159. package/src/tests/samples/typeNarrowingIsinstance4.py +50 -0
  1160. package/src/tests/samples/typeNarrowingIsinstance5.py +39 -0
  1161. package/src/tests/samples/typeNarrowingIsinstance6.py +77 -0
  1162. package/src/tests/samples/typeNarrowingIsinstance7.py +19 -0
  1163. package/src/tests/samples/typeNarrowingIsinstance8.py +19 -0
  1164. package/src/tests/samples/typeNarrowingLiteral1.py +35 -0
  1165. package/src/tests/samples/typeNarrowingLiteral2.py +63 -0
  1166. package/src/tests/samples/typeNarrowingLiteralMember1.py +140 -0
  1167. package/src/tests/samples/typeNarrowingLocalConst1.py +136 -0
  1168. package/src/tests/samples/typeNarrowingNoneMember1.py +102 -0
  1169. package/src/tests/samples/typeNarrowingTuple1.py +23 -0
  1170. package/src/tests/samples/typeNarrowingTupleLength1.py +47 -0
  1171. package/src/tests/samples/typeNarrowingTypeIs1.py +95 -0
  1172. package/src/tests/samples/typeNarrowingTypedDict1.py +99 -0
  1173. package/src/tests/samples/typeNarrowingTypedDict2.py +35 -0
  1174. package/src/tests/samples/typeNarrowingTypedDict3.py +45 -0
  1175. package/src/tests/samples/typePromotions1.py +30 -0
  1176. package/src/tests/samples/typeVar1.py +23 -0
  1177. package/src/tests/samples/typeVar10.py +21 -0
  1178. package/src/tests/samples/typeVar11.py +12 -0
  1179. package/src/tests/samples/typeVar2.py +26 -0
  1180. package/src/tests/samples/typeVar3.py +73 -0
  1181. package/src/tests/samples/typeVar4.py +45 -0
  1182. package/src/tests/samples/typeVar5.py +75 -0
  1183. package/src/tests/samples/typeVar6.py +115 -0
  1184. package/src/tests/samples/typeVar7.py +171 -0
  1185. package/src/tests/samples/typeVar8.py +30 -0
  1186. package/src/tests/samples/typeVar9.py +118 -0
  1187. package/src/tests/samples/typedDict1.py +63 -0
  1188. package/src/tests/samples/typedDict10.py +34 -0
  1189. package/src/tests/samples/typedDict11.py +12 -0
  1190. package/src/tests/samples/typedDict12.py +103 -0
  1191. package/src/tests/samples/typedDict13.py +14 -0
  1192. package/src/tests/samples/typedDict14.py +25 -0
  1193. package/src/tests/samples/typedDict15.py +53 -0
  1194. package/src/tests/samples/typedDict16.py +103 -0
  1195. package/src/tests/samples/typedDict17.py +24 -0
  1196. package/src/tests/samples/typedDict18.py +43 -0
  1197. package/src/tests/samples/typedDict2.py +56 -0
  1198. package/src/tests/samples/typedDict3.py +40 -0
  1199. package/src/tests/samples/typedDict4.py +68 -0
  1200. package/src/tests/samples/typedDict5.py +50 -0
  1201. package/src/tests/samples/typedDict6.py +77 -0
  1202. package/src/tests/samples/typedDict7.py +22 -0
  1203. package/src/tests/samples/typedDict8.py +19 -0
  1204. package/src/tests/samples/typedDict9.py +22 -0
  1205. package/src/tests/samples/unbound1.py +18 -0
  1206. package/src/tests/samples/unbound2.py +12 -0
  1207. package/src/tests/samples/unbound3.py +13 -0
  1208. package/src/tests/samples/unbound4.py +25 -0
  1209. package/src/tests/samples/unicode1.py +39 -0
  1210. package/src/tests/samples/uninitializedVariable1.py +27 -0
  1211. package/src/tests/samples/unions1.py +79 -0
  1212. package/src/tests/samples/unions2.py +15 -0
  1213. package/src/tests/samples/unions3.py +48 -0
  1214. package/src/tests/samples/unions4.py +20 -0
  1215. package/src/tests/samples/unions5.py +43 -0
  1216. package/src/tests/samples/unnecessaryCast1.py +13 -0
  1217. package/src/tests/samples/unnecessaryIsInstance1.py +91 -0
  1218. package/src/tests/samples/unnecessaryIsSubclass1.py +22 -0
  1219. package/src/tests/samples/unpack1.py +56 -0
  1220. package/src/tests/samples/unpack2.py +27 -0
  1221. package/src/tests/samples/unpack3.py +16 -0
  1222. package/src/tests/samples/unpack4.py +15 -0
  1223. package/src/tests/samples/unreachable1.py +112 -0
  1224. package/src/tests/samples/unusedCallResult1.py +67 -0
  1225. package/src/tests/samples/unusedCoroutine1.py +23 -0
  1226. package/src/tests/samples/unusedExpression1.py +34 -0
  1227. package/src/tests/samples/unusedVariable1.py +21 -0
  1228. package/src/tests/samples/variadicTypeVar1.py +51 -0
  1229. package/src/tests/samples/variadicTypeVar10.py +65 -0
  1230. package/src/tests/samples/variadicTypeVar11.py +72 -0
  1231. package/src/tests/samples/variadicTypeVar12.py +26 -0
  1232. package/src/tests/samples/variadicTypeVar13.py +35 -0
  1233. package/src/tests/samples/variadicTypeVar14.py +72 -0
  1234. package/src/tests/samples/variadicTypeVar2.py +63 -0
  1235. package/src/tests/samples/variadicTypeVar3.py +86 -0
  1236. package/src/tests/samples/variadicTypeVar4.py +71 -0
  1237. package/src/tests/samples/variadicTypeVar5.py +131 -0
  1238. package/src/tests/samples/variadicTypeVar6.py +78 -0
  1239. package/src/tests/samples/variadicTypeVar7.py +59 -0
  1240. package/src/tests/samples/variadicTypeVar8.py +116 -0
  1241. package/src/tests/samples/variadicTypeVar9.py +38 -0
  1242. package/src/tests/samples/with1.py +117 -0
  1243. package/src/tests/samples/with2.py +63 -0
  1244. package/src/tests/samples/with3.py +66 -0
  1245. package/src/tests/samples/with4.py +24 -0
  1246. package/src/tests/samples/with5.py +33 -0
  1247. package/src/tests/samples/zipfs/bad.egg +1 -0
  1248. package/src/tests/samples/zipfs/bad.zip +1 -0
  1249. package/src/tests/samples/zipfs/basic.egg +0 -0
  1250. package/src/tests/samples/zipfs/basic.zip +0 -0
  1251. package/src/tests/samples/zipfs/corrupt.egg +0 -0
  1252. package/src/tests/samples/zipfs/corrupt.zip +0 -0
  1253. package/src/tests/sourceFile.test.ts +25 -0
  1254. package/src/tests/stringUtils.test.ts +63 -0
  1255. package/src/tests/symbolNameUtils.test.ts +77 -0
  1256. package/src/tests/testState.test.ts +579 -0
  1257. package/src/tests/testUtils.ts +251 -0
  1258. package/src/tests/tokenizer.test.ts +1534 -0
  1259. package/src/tests/typeEvaluator1.test.ts +1372 -0
  1260. package/src/tests/typeEvaluator2.test.ts +1253 -0
  1261. package/src/tests/typeEvaluator3.test.ts +1279 -0
  1262. package/src/tests/typeEvaluator4.test.ts +1178 -0
  1263. package/src/tests/updateSymbolReference.test.ts +1107 -0
  1264. package/src/tests/zipfs.test.ts +116 -0
  1265. package/src/workspaceMap.ts +76 -0
@@ -0,0 +1,1548 @@
1
+ /*
2
+ * codeFlowEngine.ts
3
+ * Copyright (c) Microsoft Corporation.
4
+ * Licensed under the MIT license.
5
+ * Author: Eric Traut
6
+ *
7
+ * Code that traverses the code flow graph to determine the (narrowed)
8
+ * type of a variable or expression or the reachability of a statement.
9
+ *
10
+ * This is largely based on the code flow engine in the
11
+ * TypeScript compiler.
12
+ */
13
+
14
+ import { assert, fail } from '../common/debug';
15
+ import { convertOffsetToPosition } from '../common/positionUtils';
16
+ import { ExpressionNode, ParseNode, ParseNodeType } from '../parser/parseNodes';
17
+ import { getFileInfo, getImportInfo } from './analyzerNodeInfo';
18
+ import {
19
+ CodeFlowReferenceExpressionNode,
20
+ createKeyForReference,
21
+ createKeysForReferenceSubexpressions,
22
+ FlowAssignment,
23
+ FlowBranchLabel,
24
+ FlowCall,
25
+ FlowCondition,
26
+ FlowExhaustedMatch,
27
+ FlowFlags,
28
+ FlowLabel,
29
+ FlowNarrowForPattern,
30
+ FlowNode,
31
+ FlowPostContextManagerLabel,
32
+ FlowPostFinally,
33
+ FlowPreFinallyGate,
34
+ FlowVariableAnnotation,
35
+ FlowWildcardImport,
36
+ } from './codeFlowTypes';
37
+ import { formatControlFlowGraph } from './codeFlowUtils';
38
+ import { isMatchingExpression, isPartialMatchingExpression, printExpression } from './parseTreeUtils';
39
+ import {
40
+ CachedType,
41
+ IncompleteSubtypeInfo,
42
+ IncompleteType,
43
+ isIncompleteType,
44
+ SpeculativeTypeTracker,
45
+ TypeCache,
46
+ } from './typeCache';
47
+ import { EvaluatorFlags, TypeEvaluator, TypeResult } from './typeEvaluatorTypes';
48
+ import { getTypeNarrowingCallback } from './typeGuards';
49
+ import {
50
+ ClassType,
51
+ combineTypes,
52
+ FunctionType,
53
+ isClass,
54
+ isClassInstance,
55
+ isFunction,
56
+ isInstantiableClass,
57
+ isNever,
58
+ isOverloadedFunction,
59
+ isTypeSame,
60
+ isTypeVar,
61
+ maxTypeRecursionCount,
62
+ NeverType,
63
+ removeIncompleteUnknownFromUnion,
64
+ Type,
65
+ TypeVarType,
66
+ UnboundType,
67
+ UnknownType,
68
+ } from './types';
69
+ import { ClassMemberLookupFlags, doForEachSubtype, isTypeAliasPlaceholder, lookUpClassMember } from './typeUtils';
70
+
71
+ export interface FlowNodeTypeResult {
72
+ type: Type | undefined;
73
+ isIncomplete: boolean;
74
+ isRecursionSentinel?: boolean;
75
+ generationCount?: number | undefined;
76
+ incompleteType?: Type | undefined;
77
+ incompleteSubtypes?: IncompleteSubtypeInfo[] | undefined;
78
+ }
79
+
80
+ export interface CodeFlowAnalyzer {
81
+ getTypeFromCodeFlow: (
82
+ flowNode: FlowNode,
83
+ reference: CodeFlowReferenceExpressionNode | undefined,
84
+ targetSymbolId: number | undefined,
85
+ initialType: Type | undefined,
86
+ isInitialTypeIncomplete: boolean,
87
+ ignoreNoReturn: boolean
88
+ ) => FlowNodeTypeResult;
89
+ }
90
+
91
+ export interface CodeFlowEngine {
92
+ createCodeFlowAnalyzer: () => CodeFlowAnalyzer;
93
+ isFlowNodeReachable: (flowNode: FlowNode, sourceFlowNode?: FlowNode, ignoreNoReturn?: boolean) => boolean;
94
+ narrowConstrainedTypeVar: (flowNode: FlowNode, typeVar: TypeVarType) => Type | undefined;
95
+ }
96
+
97
+ // This debugging option prints the control flow graph when getTypeFromCodeFlow is called.
98
+ const isPrintControlFlowGraphEnabled = false;
99
+
100
+ // This debugging option prints the results of calls to isCallNoReturn.
101
+ const isPrintCallNoReturnEnabled = false;
102
+
103
+ export function getCodeFlowEngine(
104
+ evaluator: TypeEvaluator,
105
+ speculativeTypeTracker: SpeculativeTypeTracker
106
+ ): CodeFlowEngine {
107
+ const isReachableRecursionMap = new Map<number, true>();
108
+ const callIsNoReturnCache = new Map<number, boolean>();
109
+ const isExceptionContextManagerCache = new Map<number, boolean>();
110
+ let flowIncompleteGeneration = 1;
111
+ let noReturnAnalysisDepth = 0;
112
+ let contextManagerAnalysisDepth = 0;
113
+
114
+ // Creates a new code flow analyzer that can be used to narrow the types
115
+ // of the expressions within an execution context. Each code flow analyzer
116
+ // instance maintains a cache of types it has already determined.
117
+ function createCodeFlowAnalyzer(): CodeFlowAnalyzer {
118
+ const flowNodeTypeCacheSet = new Map<string, TypeCache>();
119
+
120
+ function getFlowNodeTypeCacheForReference(referenceKey: string) {
121
+ let flowNodeTypeCache = flowNodeTypeCacheSet.get(referenceKey);
122
+ if (!flowNodeTypeCache) {
123
+ flowNodeTypeCache = new Map<number, CachedType | undefined>();
124
+ flowNodeTypeCacheSet.set(referenceKey, flowNodeTypeCache);
125
+ }
126
+
127
+ return flowNodeTypeCache;
128
+ }
129
+
130
+ function getTypeFromCodeFlow(
131
+ flowNode: FlowNode,
132
+ reference: CodeFlowReferenceExpressionNode | undefined,
133
+ targetSymbolId: number | undefined,
134
+ initialType: Type | undefined,
135
+ isInitialTypeIncomplete: boolean,
136
+ ignoreNoReturn: boolean
137
+ ): FlowNodeTypeResult {
138
+ if (isPrintControlFlowGraphEnabled) {
139
+ printControlFlowGraph(flowNode, reference, 'getTypeFromCodeFlow');
140
+ }
141
+
142
+ const referenceKey = reference !== undefined ? createKeyForReference(reference) : undefined;
143
+ let subexpressionReferenceKeys: string[] | undefined;
144
+ const referenceKeyWithSymbolId =
145
+ referenceKey !== undefined && targetSymbolId !== undefined
146
+ ? referenceKey + `.${targetSymbolId.toString()}`
147
+ : '.';
148
+ const flowNodeTypeCache = getFlowNodeTypeCacheForReference(referenceKeyWithSymbolId);
149
+
150
+ // Caches the type of the flow node in our local cache, keyed by the flow node ID.
151
+ function setCacheEntry(
152
+ flowNode: FlowNode,
153
+ type: Type | undefined,
154
+ isIncomplete: boolean,
155
+ isRecursionSentinel?: boolean
156
+ ): FlowNodeTypeResult {
157
+ if (!isIncomplete) {
158
+ flowIncompleteGeneration++;
159
+ } else if (type) {
160
+ const prevEntry = flowNodeTypeCache.get(flowNode.id);
161
+ if (prevEntry === undefined) {
162
+ flowIncompleteGeneration++;
163
+ } else if ((prevEntry as IncompleteType).isIncompleteType) {
164
+ const prevIncompleteType = prevEntry as IncompleteType;
165
+ if (prevIncompleteType.type && !isTypeSame(prevIncompleteType.type, type)) {
166
+ flowIncompleteGeneration++;
167
+ }
168
+ }
169
+ }
170
+
171
+ // For speculative or incomplete types, we'll create a separate
172
+ // object. For non-speculative and complete types, we'll store
173
+ // the type directly.
174
+ const entry: CachedType | undefined = isIncomplete
175
+ ? {
176
+ isIncompleteType: true,
177
+ type,
178
+ incompleteSubtypes: [],
179
+ generationCount: flowIncompleteGeneration,
180
+ isRecursionSentinel,
181
+ }
182
+ : type;
183
+
184
+ flowNodeTypeCache.set(flowNode.id, entry);
185
+ speculativeTypeTracker.trackEntry(flowNodeTypeCache, flowNode.id);
186
+
187
+ return {
188
+ type,
189
+ isIncomplete,
190
+ isRecursionSentinel,
191
+ generationCount: flowIncompleteGeneration,
192
+ incompleteSubtypes: isIncomplete ? [] : undefined,
193
+ };
194
+ }
195
+
196
+ function setIncompleteSubtype(
197
+ flowNode: FlowNode,
198
+ index: number,
199
+ type: Type | undefined,
200
+ isIncomplete: boolean,
201
+ isPending: boolean,
202
+ evaluationCount: number
203
+ ) {
204
+ const cachedEntry = flowNodeTypeCache.get(flowNode.id);
205
+ if (cachedEntry === undefined || !isIncompleteType(cachedEntry)) {
206
+ fail('setIncompleteSubtype can be called only on a valid incomplete cache entry');
207
+ }
208
+
209
+ const incompleteEntries = cachedEntry.incompleteSubtypes;
210
+ if (index < incompleteEntries.length) {
211
+ const oldEntry = incompleteEntries[index];
212
+ if (
213
+ oldEntry.isIncomplete !== isIncomplete ||
214
+ oldEntry.type === undefined ||
215
+ type === undefined ||
216
+ !isTypeSame(oldEntry.type, type)
217
+ ) {
218
+ incompleteEntries[index] = { type, isIncomplete, isPending, evaluationCount };
219
+ flowIncompleteGeneration++;
220
+ } else if (oldEntry.isPending !== isPending) {
221
+ incompleteEntries[index] = { type, isIncomplete, isPending, evaluationCount };
222
+ }
223
+ } else {
224
+ assert(incompleteEntries.length === index);
225
+ incompleteEntries.push({ type, isIncomplete, isPending, evaluationCount });
226
+ flowIncompleteGeneration++;
227
+ }
228
+
229
+ return getCacheEntry(flowNode);
230
+ }
231
+
232
+ function getCacheEntry(flowNode: FlowNode): FlowNodeTypeResult | undefined {
233
+ if (!flowNodeTypeCache.has(flowNode.id)) {
234
+ return undefined;
235
+ }
236
+
237
+ const cachedEntry = flowNodeTypeCache.get(flowNode.id);
238
+ if (cachedEntry === undefined) {
239
+ return {
240
+ type: cachedEntry,
241
+ isIncomplete: false,
242
+ };
243
+ }
244
+
245
+ if (!isIncompleteType(cachedEntry)) {
246
+ return {
247
+ type: cachedEntry,
248
+ isIncomplete: false,
249
+ };
250
+ }
251
+
252
+ let type = cachedEntry.type;
253
+
254
+ if (cachedEntry.incompleteSubtypes.length > 0) {
255
+ // Recompute the effective type based on all of the incomplete
256
+ // types we've accumulated so far.
257
+ const typesToCombine: Type[] = [];
258
+ cachedEntry.incompleteSubtypes.forEach((t) => {
259
+ if (t.type) {
260
+ typesToCombine.push(t.type);
261
+ }
262
+ });
263
+ type = typesToCombine.length > 0 ? combineTypes(typesToCombine) : undefined;
264
+ }
265
+
266
+ return {
267
+ type,
268
+ isIncomplete: true,
269
+ incompleteSubtypes: cachedEntry.incompleteSubtypes,
270
+ generationCount: cachedEntry.generationCount,
271
+ isRecursionSentinel: cachedEntry.isRecursionSentinel,
272
+ };
273
+ }
274
+
275
+ function deleteCacheEntry(flowNode: FlowNode) {
276
+ flowNodeTypeCache.delete(flowNode.id);
277
+ }
278
+
279
+ function evaluateAssignmentFlowNode(flowNode: FlowAssignment): TypeResult | undefined {
280
+ // For function and class nodes, the reference node is the name
281
+ // node, but we need to use the parent node (the FunctionNode or ClassNode)
282
+ // to access the decorated type in the type cache.
283
+ let nodeForCacheLookup: ParseNode = flowNode.node;
284
+ const parentNode = flowNode.node.parent;
285
+ if (parentNode) {
286
+ if (parentNode.nodeType === ParseNodeType.Function || parentNode.nodeType === ParseNodeType.Class) {
287
+ nodeForCacheLookup = parentNode;
288
+ }
289
+ }
290
+
291
+ return evaluator.evaluateTypeForSubnode(nodeForCacheLookup, () => {
292
+ evaluator.evaluateTypesForStatement(flowNode.node);
293
+ });
294
+ }
295
+
296
+ // If this flow has no knowledge of the target expression, it returns undefined.
297
+ // If the start flow node for this scope is reachable, the typeAtStart value is
298
+ // returned.
299
+ function getTypeFromFlowNode(flowNode: FlowNode): FlowNodeTypeResult {
300
+ let curFlowNode = flowNode;
301
+
302
+ // This is a frequently-called routine, so it's a good place to call
303
+ // the cancellation check. If the operation is canceled, an exception
304
+ // will be thrown at this point.
305
+ evaluator.checkForCancellation();
306
+
307
+ while (true) {
308
+ // Have we already been here? If so, use the cached value.
309
+ const cachedEntry = getCacheEntry(curFlowNode);
310
+ if (cachedEntry) {
311
+ if (!cachedEntry.isIncomplete) {
312
+ return cachedEntry;
313
+ }
314
+
315
+ // If the cached entry is incomplete, we can use it only if nothing
316
+ // has changed that may cause the previously-reported incomplete type to change.
317
+ if (cachedEntry.generationCount === flowIncompleteGeneration) {
318
+ return { type: cachedEntry.type, isIncomplete: true };
319
+ }
320
+ }
321
+
322
+ if (curFlowNode.flags & FlowFlags.Unreachable) {
323
+ // We can get here if there are nodes in a compound logical expression
324
+ // (e.g. "False and x") that are never executed but are evaluated.
325
+ return setCacheEntry(curFlowNode, NeverType.createNever(), /* isIncomplete */ false);
326
+ }
327
+
328
+ if (curFlowNode.flags & FlowFlags.VariableAnnotation) {
329
+ const varAnnotationNode = curFlowNode as FlowVariableAnnotation;
330
+ curFlowNode = varAnnotationNode.antecedent;
331
+ continue;
332
+ }
333
+
334
+ if (curFlowNode.flags & FlowFlags.Call) {
335
+ const callFlowNode = curFlowNode as FlowCall;
336
+
337
+ // If this function returns a "NoReturn" type, that means
338
+ // it always raises an exception or otherwise doesn't return,
339
+ // so we can assume that the code before this is unreachable.
340
+ if (!ignoreNoReturn && isCallNoReturn(evaluator, callFlowNode)) {
341
+ return setCacheEntry(curFlowNode, /* type */ undefined, /* isIncomplete */ false);
342
+ }
343
+
344
+ curFlowNode = callFlowNode.antecedent;
345
+ continue;
346
+ }
347
+
348
+ if (curFlowNode.flags & FlowFlags.Assignment) {
349
+ const assignmentFlowNode = curFlowNode as FlowAssignment;
350
+
351
+ // Are we targeting the same symbol? We need to do this extra check because the same
352
+ // symbol name might refer to different symbols in different scopes (e.g. a list
353
+ // comprehension introduces a new scope).
354
+ if (reference) {
355
+ if (
356
+ targetSymbolId === assignmentFlowNode.targetSymbolId &&
357
+ isMatchingExpression(reference, assignmentFlowNode.node)
358
+ ) {
359
+ // Is this a special "unbind" assignment? If so,
360
+ // we can handle it immediately without any further evaluation.
361
+ if (curFlowNode.flags & FlowFlags.Unbind) {
362
+ return setCacheEntry(curFlowNode, UnboundType.create(), /* isIncomplete */ false);
363
+ }
364
+
365
+ // If there was a cache entry already, that means we hit a recursive
366
+ // case (something like "int: int = 4"). Avoid infinite recursion
367
+ // by returning an undefined type.
368
+ if (cachedEntry?.isRecursionSentinel) {
369
+ return { type: undefined, isIncomplete: true };
370
+ }
371
+
372
+ // Set the cache entry to undefined before evaluating the
373
+ // expression in case it depends on itself.
374
+ setCacheEntry(
375
+ curFlowNode,
376
+ reference ? undefined : initialType,
377
+ /* isIncomplete */ true,
378
+ /* isRecursionSentinel */ true
379
+ );
380
+ let flowTypeResult = evaluateAssignmentFlowNode(assignmentFlowNode);
381
+ if (flowTypeResult) {
382
+ if (isTypeAliasPlaceholder(flowTypeResult.type)) {
383
+ flowTypeResult = undefined;
384
+ } else if (
385
+ reference.nodeType === ParseNodeType.MemberAccess &&
386
+ evaluator.isAsymmetricDescriptorAssignment(assignmentFlowNode.node)
387
+ ) {
388
+ flowTypeResult = undefined;
389
+ }
390
+ }
391
+ return setCacheEntry(curFlowNode, flowTypeResult?.type, !!flowTypeResult?.isIncomplete);
392
+ } else if (isPartialMatchingExpression(reference, assignmentFlowNode.node)) {
393
+ // If the node partially matches the reference, we need to "kill" any narrowed
394
+ // types further above this point. For example, if we see the sequence
395
+ // a.b = 3
396
+ // a = Foo()
397
+ // x = a.b
398
+ // The type of "a.b" can no longer be assumed to be Literal[3].
399
+ return {
400
+ type: initialType,
401
+ isIncomplete: isInitialTypeIncomplete,
402
+ };
403
+ }
404
+ }
405
+
406
+ curFlowNode = assignmentFlowNode.antecedent;
407
+ continue;
408
+ }
409
+
410
+ if (curFlowNode.flags & FlowFlags.BranchLabel) {
411
+ const branchFlowNode = curFlowNode as FlowBranchLabel;
412
+ if (curFlowNode.flags & FlowFlags.PostContextManager) {
413
+ // Determine whether any of the context managers support exception
414
+ // suppression. If not, none of its antecedents are reachable.
415
+ const contextMgrNode = curFlowNode as FlowPostContextManagerLabel;
416
+ const contextManagerSwallowsExceptions = contextMgrNode.expressions.some((expr) =>
417
+ isExceptionContextManager(evaluator, expr, contextMgrNode.isAsync)
418
+ );
419
+
420
+ if (contextManagerSwallowsExceptions === contextMgrNode.blockIfSwallowsExceptions) {
421
+ // Do not explore any further along this code flow path.
422
+ return setCacheEntry(curFlowNode, /* type */ undefined, /* isIncomplete */ false);
423
+ }
424
+ }
425
+
426
+ // Is the current symbol modified in any way within the scope of the branch?
427
+ // If not, we can skip all processing within the branch scope.
428
+ if (reference && branchFlowNode.preBranchAntecedent && branchFlowNode.affectedExpressions) {
429
+ if (!subexpressionReferenceKeys) {
430
+ subexpressionReferenceKeys = createKeysForReferenceSubexpressions(reference);
431
+ }
432
+
433
+ if (
434
+ !subexpressionReferenceKeys.some((key) =>
435
+ branchFlowNode.affectedExpressions!.has(key)
436
+ ) &&
437
+ isFlowNodeReachable(curFlowNode, branchFlowNode.preBranchAntecedent)
438
+ ) {
439
+ curFlowNode = branchFlowNode.preBranchAntecedent;
440
+ continue;
441
+ }
442
+ }
443
+
444
+ return getTypeFromBranchFlowNode(curFlowNode as FlowLabel);
445
+ }
446
+
447
+ if (curFlowNode.flags & FlowFlags.LoopLabel) {
448
+ const loopNode = curFlowNode as FlowLabel;
449
+
450
+ // Is the current symbol modified in any way within the loop? If not, we can skip all
451
+ // processing within the loop and assume that the type comes from the first antecedent,
452
+ // which feeds the loop.
453
+ if (reference) {
454
+ if (!subexpressionReferenceKeys) {
455
+ subexpressionReferenceKeys = createKeysForReferenceSubexpressions(reference);
456
+ }
457
+
458
+ if (!subexpressionReferenceKeys.some((key) => loopNode.affectedExpressions!.has(key))) {
459
+ curFlowNode = loopNode.antecedents[0];
460
+ continue;
461
+ }
462
+ }
463
+
464
+ return getTypeFromLoopFlowNode(loopNode);
465
+ }
466
+
467
+ if (curFlowNode.flags & (FlowFlags.TrueCondition | FlowFlags.FalseCondition)) {
468
+ const conditionalFlowNode = curFlowNode as FlowCondition;
469
+
470
+ if (reference) {
471
+ // Was an incomplete entry added to prevent recursion?
472
+ if (cachedEntry?.isRecursionSentinel) {
473
+ return cachedEntry;
474
+ }
475
+
476
+ // Before calling getTypeNarrowingCallback, set the type
477
+ // of this flow node in the cache to prevent recursion.
478
+ setCacheEntry(
479
+ curFlowNode,
480
+ /* type */ undefined,
481
+ /* isIncomplete */ true,
482
+ /* isRecursionSentinel */ true
483
+ );
484
+
485
+ try {
486
+ const typeNarrowingCallback = getTypeNarrowingCallback(
487
+ evaluator,
488
+ reference,
489
+ conditionalFlowNode.expression,
490
+ !!(
491
+ conditionalFlowNode.flags &
492
+ (FlowFlags.TrueCondition | FlowFlags.TrueNeverCondition)
493
+ )
494
+ );
495
+
496
+ if (typeNarrowingCallback) {
497
+ const flowTypeResult = getTypeFromFlowNode(conditionalFlowNode.antecedent);
498
+ let flowType = flowTypeResult.type;
499
+ if (flowType) {
500
+ flowType = typeNarrowingCallback(flowType);
501
+ }
502
+
503
+ return setCacheEntry(curFlowNode, flowType, flowTypeResult.isIncomplete);
504
+ }
505
+
506
+ deleteCacheEntry(curFlowNode);
507
+ } catch (e) {
508
+ // We don't use finally here because the debugger
509
+ // doesn't handle it well during single stepping.
510
+ deleteCacheEntry(curFlowNode);
511
+ throw e;
512
+ }
513
+ }
514
+
515
+ curFlowNode = conditionalFlowNode.antecedent;
516
+ continue;
517
+ }
518
+
519
+ if (curFlowNode.flags & (FlowFlags.TrueNeverCondition | FlowFlags.FalseNeverCondition)) {
520
+ const conditionalFlowNode = curFlowNode as FlowCondition;
521
+ if (conditionalFlowNode.reference) {
522
+ // Don't allow apply if the conditional expression references the expression
523
+ // we're already narrowing. This case will be handled by the TrueCondition
524
+ // or FalseCondition node.
525
+ if (createKeyForReference(conditionalFlowNode.reference) !== referenceKey) {
526
+ // Make sure the reference type has a declared type. If not,
527
+ // don't bother trying to infer its type because that would be
528
+ // too expensive.
529
+ const symbolWithScope = evaluator.lookUpSymbolRecursive(
530
+ conditionalFlowNode.reference,
531
+ conditionalFlowNode.reference.value,
532
+ /* honorCodeFlow */ false
533
+ );
534
+ if (symbolWithScope && symbolWithScope.symbol.getTypedDeclarations().length > 0) {
535
+ // Before calling getTypeNarrowingCallback, set the type
536
+ // of this flow node in the cache to prevent recursion.
537
+ setCacheEntry(
538
+ curFlowNode,
539
+ reference ? undefined : initialType,
540
+ /* isIncomplete */ true,
541
+ /* isRecursionSentinel */ true
542
+ );
543
+
544
+ try {
545
+ const typeNarrowingCallback = getTypeNarrowingCallback(
546
+ evaluator,
547
+ conditionalFlowNode.reference,
548
+ conditionalFlowNode.expression,
549
+ !!(
550
+ conditionalFlowNode.flags &
551
+ (FlowFlags.TrueCondition | FlowFlags.TrueNeverCondition)
552
+ )
553
+ );
554
+
555
+ if (typeNarrowingCallback) {
556
+ const refTypeInfo = evaluator.getTypeOfExpression(
557
+ conditionalFlowNode.reference!
558
+ );
559
+ const narrowedType =
560
+ typeNarrowingCallback(refTypeInfo.type) || refTypeInfo.type;
561
+
562
+ // If the narrowed type is "never", don't allow further exploration.
563
+ if (isNever(narrowedType)) {
564
+ return setCacheEntry(
565
+ curFlowNode,
566
+ undefined,
567
+ !!refTypeInfo.isIncomplete
568
+ );
569
+ }
570
+ }
571
+
572
+ deleteCacheEntry(curFlowNode);
573
+ } catch (e) {
574
+ // We don't use finally here because the debugger
575
+ // doesn't handle it well during single stepping.
576
+ deleteCacheEntry(curFlowNode);
577
+ throw e;
578
+ }
579
+ }
580
+ }
581
+ }
582
+ curFlowNode = conditionalFlowNode.antecedent;
583
+ continue;
584
+ }
585
+
586
+ if (curFlowNode.flags & FlowFlags.ExhaustedMatch) {
587
+ const exhaustedMatchFlowNode = curFlowNode as FlowExhaustedMatch;
588
+ const narrowedTypeResult = evaluator.evaluateTypeForSubnode(exhaustedMatchFlowNode.node, () => {
589
+ evaluator.evaluateTypesForMatchStatement(exhaustedMatchFlowNode.node);
590
+ });
591
+
592
+ // If the narrowed type is "never", don't allow further exploration.
593
+ if (narrowedTypeResult && isNever(narrowedTypeResult.type)) {
594
+ return setCacheEntry(curFlowNode, /* type */ undefined, !!narrowedTypeResult.isIncomplete);
595
+ }
596
+
597
+ curFlowNode = exhaustedMatchFlowNode.antecedent;
598
+ continue;
599
+ }
600
+
601
+ if (curFlowNode.flags & FlowFlags.NarrowForPattern) {
602
+ const patternFlowNode = curFlowNode as FlowNarrowForPattern;
603
+ if (!reference || isMatchingExpression(reference, patternFlowNode.subjectExpression)) {
604
+ const typeResult = evaluator.evaluateTypeForSubnode(patternFlowNode.statement, () => {
605
+ if (patternFlowNode.statement.nodeType === ParseNodeType.Case) {
606
+ evaluator.evaluateTypesForCaseStatement(patternFlowNode.statement);
607
+ } else {
608
+ evaluator.evaluateTypesForMatchStatement(patternFlowNode.statement);
609
+ }
610
+ });
611
+
612
+ if (typeResult) {
613
+ if (!reference) {
614
+ if (isNever(typeResult.type)) {
615
+ return setCacheEntry(
616
+ curFlowNode,
617
+ /* type */ undefined,
618
+ !!typeResult.isIncomplete
619
+ );
620
+ }
621
+ } else {
622
+ return setCacheEntry(curFlowNode, typeResult.type, !!typeResult.isIncomplete);
623
+ }
624
+ }
625
+ }
626
+ curFlowNode = patternFlowNode.antecedent;
627
+ continue;
628
+ }
629
+
630
+ if (curFlowNode.flags & FlowFlags.PreFinallyGate) {
631
+ return getTypeFromPreFinallyGateFlowNode(curFlowNode as FlowPreFinallyGate);
632
+ }
633
+
634
+ if (curFlowNode.flags & FlowFlags.PostFinally) {
635
+ return getTypeFromPostFinallyFlowNode(curFlowNode as FlowPostFinally);
636
+ }
637
+
638
+ if (curFlowNode.flags & FlowFlags.Start) {
639
+ return setCacheEntry(curFlowNode, initialType, isInitialTypeIncomplete);
640
+ }
641
+
642
+ if (curFlowNode.flags & FlowFlags.WildcardImport) {
643
+ const wildcardImportFlowNode = curFlowNode as FlowWildcardImport;
644
+ if (reference && reference.nodeType === ParseNodeType.Name) {
645
+ const nameValue = reference.value;
646
+ if (wildcardImportFlowNode.names.some((name) => name === nameValue)) {
647
+ // Before calling getTypeFromWildcardImport, set the cache entry to prevent infinite recursion.
648
+ setCacheEntry(
649
+ curFlowNode,
650
+ /* type */ undefined,
651
+ /* isIncomplete */ true,
652
+ /* isRecursionSentinel */ true
653
+ );
654
+
655
+ try {
656
+ const type = getTypeFromWildcardImport(wildcardImportFlowNode, nameValue);
657
+ return setCacheEntry(curFlowNode, type, /* isIncomplete */ false);
658
+ } catch (e) {
659
+ deleteCacheEntry(curFlowNode);
660
+ throw e;
661
+ }
662
+ }
663
+ }
664
+
665
+ curFlowNode = wildcardImportFlowNode.antecedent;
666
+ continue;
667
+ }
668
+
669
+ // We shouldn't get here.
670
+ fail('Unexpected flow node flags');
671
+ return setCacheEntry(curFlowNode, /* type */ undefined, /* isIncomplete */ false);
672
+ }
673
+ }
674
+
675
+ function getTypeFromBranchFlowNode(branchNode: FlowLabel) {
676
+ const typesToCombine: Type[] = [];
677
+
678
+ let sawIncomplete = false;
679
+ let isProvenReachable = false;
680
+
681
+ // Set the cache entry to undefined before evaluating the
682
+ // expression in case it depends on itself.
683
+ setCacheEntry(
684
+ branchNode,
685
+ reference ? undefined : initialType,
686
+ /* isIncomplete */ true,
687
+ /* isRecursionSentinel */ true
688
+ );
689
+
690
+ branchNode.antecedents.forEach((antecedent) => {
691
+ // If we're solving for "reachability", and we have now proven
692
+ // reachability, there's no reason to do more work.
693
+ if (reference === undefined && isProvenReachable) {
694
+ return;
695
+ }
696
+
697
+ const flowTypeResult = getTypeFromFlowNode(antecedent);
698
+
699
+ if (flowTypeResult.isIncomplete) {
700
+ sawIncomplete = true;
701
+ }
702
+
703
+ if (reference === undefined && flowTypeResult.type !== undefined) {
704
+ isProvenReachable = true;
705
+ }
706
+
707
+ if (flowTypeResult.type) {
708
+ typesToCombine.push(flowTypeResult.type);
709
+ }
710
+ });
711
+
712
+ if (isProvenReachable) {
713
+ return setCacheEntry(branchNode, initialType, /* isIncomplete */ false);
714
+ }
715
+
716
+ const effectiveType = typesToCombine.length > 0 ? combineTypes(typesToCombine) : undefined;
717
+
718
+ return setCacheEntry(branchNode, effectiveType, sawIncomplete);
719
+ }
720
+
721
+ function getTypeFromLoopFlowNode(loopNode: FlowLabel) {
722
+ // See if we've been here before. If so, there will be an incomplete cache entry.
723
+ let cacheEntry = getCacheEntry(loopNode);
724
+
725
+ // The type result from one antecedent may depend on the type
726
+ // result from another, so loop up to one time for each
727
+ // antecedent in the loop.
728
+ const maxAttemptCount = loopNode.antecedents.length;
729
+
730
+ if (cacheEntry === undefined) {
731
+ // We haven't been here before, so create a new incomplete cache entry.
732
+ cacheEntry = setCacheEntry(
733
+ loopNode,
734
+ reference ? undefined : initialType,
735
+ /* isIncomplete */ true,
736
+ /* isRecursionSentinel */ true
737
+ );
738
+ } else if (cacheEntry.incompleteSubtypes?.some((subtype) => subtype.isPending)) {
739
+ // If there are pending entries that have not been evaluated even once,
740
+ // treat it as incomplete.
741
+ const isIncomplete =
742
+ cacheEntry.incompleteSubtypes.length < loopNode.antecedents.length ||
743
+ cacheEntry.incompleteSubtypes.some(
744
+ (subtype) => subtype.isPending && subtype.evaluationCount < maxAttemptCount
745
+ );
746
+ return { type: cacheEntry.type, isIncomplete };
747
+ }
748
+
749
+ let attemptCount = 0;
750
+
751
+ while (true) {
752
+ let sawIncomplete = false;
753
+ let isProvenReachable =
754
+ reference === undefined &&
755
+ cacheEntry.incompleteSubtypes?.some((subtype) => subtype.type !== undefined);
756
+
757
+ loopNode.antecedents.forEach((antecedent, index) => {
758
+ // If we've trying to determine reachability and we've already proven
759
+ // reachability, then we're done.
760
+ if (reference === undefined && isProvenReachable) {
761
+ return;
762
+ }
763
+
764
+ cacheEntry = getCacheEntry(loopNode)!;
765
+
766
+ // Have we already been here (i.e. does the entry exist and is
767
+ // not marked "pending")? If so, we can use the type that was already
768
+ // computed if it is complete.
769
+ const subtypeEntry =
770
+ cacheEntry.incompleteSubtypes !== undefined && index < cacheEntry.incompleteSubtypes.length
771
+ ? cacheEntry.incompleteSubtypes[index]
772
+ : undefined;
773
+ if (subtypeEntry === undefined || (!subtypeEntry?.isPending && subtypeEntry?.isIncomplete)) {
774
+ const entryEvaluationCount = subtypeEntry === undefined ? 0 : subtypeEntry.evaluationCount;
775
+ // Set this entry to "pending" to prevent infinite recursion.
776
+ // We'll mark it "not pending" below.
777
+ cacheEntry = setIncompleteSubtype(
778
+ loopNode,
779
+ index,
780
+ subtypeEntry?.type ?? (reference ? undefined : initialType),
781
+ /* isIncomplete */ true,
782
+ /* isPending */ true,
783
+ entryEvaluationCount
784
+ );
785
+
786
+ try {
787
+ const flowTypeResult = getTypeFromFlowNode(antecedent);
788
+
789
+ if (flowTypeResult.isIncomplete) {
790
+ sawIncomplete = true;
791
+ }
792
+
793
+ cacheEntry = setIncompleteSubtype(
794
+ loopNode,
795
+ index,
796
+ flowTypeResult.type,
797
+ flowTypeResult.isIncomplete,
798
+ /* isPending */ false,
799
+ entryEvaluationCount + 1
800
+ );
801
+ } catch (e) {
802
+ setIncompleteSubtype(
803
+ loopNode,
804
+ index,
805
+ undefined,
806
+ /* isIncomplete */ true,
807
+ /* isPending */ false,
808
+ entryEvaluationCount + 1
809
+ );
810
+ throw e;
811
+ }
812
+ }
813
+
814
+ if (reference === undefined && cacheEntry?.type !== undefined) {
815
+ isProvenReachable = true;
816
+ }
817
+ });
818
+
819
+ if (isProvenReachable) {
820
+ return setCacheEntry(loopNode, initialType, /* isIncomplete */ false);
821
+ }
822
+
823
+ let effectiveType = cacheEntry.type;
824
+ if (sawIncomplete) {
825
+ // If there is an incomplete "Unknown" type within a union type, remove
826
+ // it. Otherwise we might end up resolving the cycle with a type
827
+ // that includes an undesirable unknown.
828
+ if (effectiveType) {
829
+ const typeWithoutUnknown = removeIncompleteUnknownFromUnion(effectiveType);
830
+ if (!isNever(typeWithoutUnknown)) {
831
+ effectiveType = typeWithoutUnknown;
832
+ }
833
+ }
834
+ }
835
+
836
+ if (!sawIncomplete || attemptCount >= maxAttemptCount) {
837
+ return setCacheEntry(loopNode, effectiveType, /* isIncomplete */ false);
838
+ }
839
+
840
+ attemptCount++;
841
+ }
842
+ }
843
+
844
+ function getTypeFromPreFinallyGateFlowNode(preFinallyFlowNode: FlowPreFinallyGate) {
845
+ if (preFinallyFlowNode.isGateClosed) {
846
+ return { type: undefined, isIncomplete: false };
847
+ }
848
+
849
+ // Before recursively calling, set the cache entry to prevent infinite recursion.
850
+ setCacheEntry(
851
+ preFinallyFlowNode,
852
+ reference ? undefined : initialType,
853
+ /* isIncomplete */ true,
854
+ /* isRecursionSentinel */ true
855
+ );
856
+
857
+ try {
858
+ const flowTypeResult = getTypeFromFlowNode(preFinallyFlowNode.antecedent);
859
+
860
+ // We want to cache the type only if we're evaluating the "gate closed" path.
861
+ deleteCacheEntry(preFinallyFlowNode);
862
+
863
+ return {
864
+ type: flowTypeResult.type,
865
+ isIncomplete: flowTypeResult.isIncomplete,
866
+ };
867
+ } catch (e) {
868
+ deleteCacheEntry(preFinallyFlowNode);
869
+ throw e;
870
+ }
871
+ }
872
+
873
+ function getTypeFromPostFinallyFlowNode(postFinallyFlowNode: FlowPostFinally) {
874
+ const wasGateClosed = postFinallyFlowNode.preFinallyGate.isGateClosed;
875
+ try {
876
+ postFinallyFlowNode.preFinallyGate.isGateClosed = true;
877
+ let flowTypeResult: FlowNodeTypeResult | undefined;
878
+
879
+ // Use speculative mode for the remainder of the finally suite
880
+ // because the final types within this parse node block should be
881
+ // evaluated when the gate is open.
882
+ evaluator.useSpeculativeMode(postFinallyFlowNode.finallyNode, () => {
883
+ flowTypeResult = getTypeFromFlowNode(postFinallyFlowNode.antecedent);
884
+ });
885
+
886
+ // If the type is incomplete, don't write back to the cache.
887
+ return flowTypeResult!.isIncomplete
888
+ ? flowTypeResult!
889
+ : setCacheEntry(postFinallyFlowNode, flowTypeResult!.type, /* isIncomplete */ false);
890
+ } finally {
891
+ postFinallyFlowNode.preFinallyGate.isGateClosed = wasGateClosed;
892
+ }
893
+ }
894
+
895
+ if (!flowNode) {
896
+ // This should happen only in cases where we're evaluating
897
+ // parse nodes that are created after the initial parse
898
+ // (namely, string literals that are used for forward
899
+ // referenced types).
900
+ return {
901
+ type: initialType,
902
+ isIncomplete: isInitialTypeIncomplete,
903
+ };
904
+ }
905
+
906
+ return getTypeFromFlowNode(flowNode);
907
+ }
908
+
909
+ return {
910
+ getTypeFromCodeFlow,
911
+ };
912
+ }
913
+
914
+ // Determines whether the specified flowNode can be reached by any
915
+ // control flow path within the execution context. If sourceFlowNode
916
+ // is specified, it returns true only if at least one control flow
917
+ // path passes through sourceFlowNode.
918
+ function isFlowNodeReachable(flowNode: FlowNode, sourceFlowNode?: FlowNode, ignoreNoReturn = false): boolean {
919
+ const visitedFlowNodeMap = new Set<number>();
920
+
921
+ if (isPrintControlFlowGraphEnabled) {
922
+ printControlFlowGraph(flowNode, /* reference */ undefined, 'isFlowNodeReachable');
923
+ }
924
+
925
+ function isFlowNodeReachableRecursive(
926
+ flowNode: FlowNode,
927
+ sourceFlowNode: FlowNode | undefined,
928
+ recursionCount = 0
929
+ ): boolean {
930
+ // Cut off the recursion at some point to prevent a stack overflow.
931
+ const maxFlowNodeReachableRecursionCount = 64;
932
+ if (recursionCount > maxFlowNodeReachableRecursionCount) {
933
+ return true;
934
+ }
935
+ recursionCount++;
936
+
937
+ let curFlowNode = flowNode;
938
+
939
+ while (true) {
940
+ // If we've already visited this node, we can assume
941
+ // it wasn't reachable.
942
+ if (visitedFlowNodeMap.has(curFlowNode.id)) {
943
+ return false;
944
+ }
945
+
946
+ // Note that we've been here before.
947
+ visitedFlowNodeMap.add(curFlowNode.id);
948
+
949
+ if (curFlowNode.flags & FlowFlags.Unreachable) {
950
+ return false;
951
+ }
952
+
953
+ if (curFlowNode === sourceFlowNode) {
954
+ return true;
955
+ }
956
+
957
+ if (
958
+ curFlowNode.flags &
959
+ (FlowFlags.VariableAnnotation |
960
+ FlowFlags.Assignment |
961
+ FlowFlags.TrueCondition |
962
+ FlowFlags.FalseCondition |
963
+ FlowFlags.WildcardImport |
964
+ FlowFlags.TrueNeverCondition |
965
+ FlowFlags.FalseNeverCondition |
966
+ FlowFlags.NarrowForPattern |
967
+ FlowFlags.ExhaustedMatch)
968
+ ) {
969
+ const typedFlowNode = curFlowNode as
970
+ | FlowVariableAnnotation
971
+ | FlowAssignment
972
+ | FlowCondition
973
+ | FlowWildcardImport
974
+ | FlowCondition
975
+ | FlowExhaustedMatch;
976
+ curFlowNode = typedFlowNode.antecedent;
977
+ continue;
978
+ }
979
+
980
+ if (curFlowNode.flags & FlowFlags.Call) {
981
+ const callFlowNode = curFlowNode as FlowCall;
982
+
983
+ // If this function returns a "NoReturn" type, that means
984
+ // it always raises an exception or otherwise doesn't return,
985
+ // so we can assume that the code before this is unreachable.
986
+ if (!ignoreNoReturn && isCallNoReturn(evaluator, callFlowNode)) {
987
+ return false;
988
+ }
989
+
990
+ curFlowNode = callFlowNode.antecedent;
991
+ continue;
992
+ }
993
+
994
+ if (curFlowNode.flags & (FlowFlags.BranchLabel | FlowFlags.LoopLabel)) {
995
+ if (curFlowNode.flags & FlowFlags.PostContextManager) {
996
+ // Determine whether any of the context managers support exception
997
+ // suppression. If not, none of its antecedents are reachable.
998
+ const contextMgrNode = curFlowNode as FlowPostContextManagerLabel;
999
+ if (
1000
+ !contextMgrNode.expressions.some((expr) =>
1001
+ isExceptionContextManager(evaluator, expr, contextMgrNode.isAsync)
1002
+ )
1003
+ ) {
1004
+ return false;
1005
+ }
1006
+ }
1007
+
1008
+ const labelNode = curFlowNode as FlowLabel;
1009
+ for (const antecedent of labelNode.antecedents) {
1010
+ if (isFlowNodeReachableRecursive(antecedent, sourceFlowNode, recursionCount)) {
1011
+ return true;
1012
+ }
1013
+ }
1014
+ return false;
1015
+ }
1016
+
1017
+ if (curFlowNode.flags & FlowFlags.Start) {
1018
+ // If we hit the start but were looking for a particular source flow
1019
+ // node, return false. Otherwise, the start is what we're looking for.
1020
+ return sourceFlowNode ? false : true;
1021
+ }
1022
+
1023
+ if (curFlowNode.flags & FlowFlags.PreFinallyGate) {
1024
+ const preFinallyFlowNode = curFlowNode as FlowPreFinallyGate;
1025
+ if (preFinallyFlowNode.isGateClosed) {
1026
+ return false;
1027
+ }
1028
+
1029
+ curFlowNode = preFinallyFlowNode.antecedent;
1030
+ continue;
1031
+ }
1032
+
1033
+ if (curFlowNode.flags & FlowFlags.PostFinally) {
1034
+ const postFinallyFlowNode = curFlowNode as FlowPostFinally;
1035
+ const wasGateClosed = postFinallyFlowNode.preFinallyGate.isGateClosed;
1036
+
1037
+ try {
1038
+ postFinallyFlowNode.preFinallyGate.isGateClosed = true;
1039
+ return isFlowNodeReachableRecursive(
1040
+ postFinallyFlowNode.antecedent,
1041
+ sourceFlowNode,
1042
+ recursionCount
1043
+ );
1044
+ } finally {
1045
+ postFinallyFlowNode.preFinallyGate.isGateClosed = wasGateClosed;
1046
+ }
1047
+ }
1048
+
1049
+ // We shouldn't get here.
1050
+ fail('Unexpected flow node flags');
1051
+ return false;
1052
+ }
1053
+ }
1054
+
1055
+ // Protect against infinite recursion.
1056
+ if (isReachableRecursionMap.has(flowNode.id)) {
1057
+ return true;
1058
+ }
1059
+ isReachableRecursionMap.set(flowNode.id, true);
1060
+
1061
+ try {
1062
+ return isFlowNodeReachableRecursive(flowNode, sourceFlowNode);
1063
+ } finally {
1064
+ isReachableRecursionMap.delete(flowNode.id);
1065
+ }
1066
+ }
1067
+
1068
+ // Determines whether the specified typeVar, which is assumed to be constrained,
1069
+ // can be narrowed to one of its constrained types based on isinstance type
1070
+ // guard checks.
1071
+ function narrowConstrainedTypeVar(flowNode: FlowNode, typeVar: TypeVarType): ClassType | undefined {
1072
+ assert(!typeVar.details.isParamSpec);
1073
+ assert(!typeVar.details.isVariadic);
1074
+ assert(!typeVar.details.boundType);
1075
+ assert(typeVar.details.constraints.length > 0);
1076
+
1077
+ const visitedFlowNodeMap = new Set<number>();
1078
+ const startingConstraints: ClassType[] = [];
1079
+
1080
+ for (const constraint of typeVar.details.constraints) {
1081
+ if (isClassInstance(constraint)) {
1082
+ startingConstraints.push(constraint);
1083
+ } else {
1084
+ // If one or more constraints are Unknown, Any, union types, etc.,
1085
+ // we can't narrow them.
1086
+ return undefined;
1087
+ }
1088
+ }
1089
+
1090
+ function narrowConstrainedTypeVarRecursive(flowNode: FlowNode, typeVar: TypeVarType): ClassType[] {
1091
+ let curFlowNode = flowNode;
1092
+
1093
+ while (true) {
1094
+ if (visitedFlowNodeMap.has(curFlowNode.id)) {
1095
+ return startingConstraints;
1096
+ }
1097
+
1098
+ if (curFlowNode.flags & (FlowFlags.Unreachable | FlowFlags.Start)) {
1099
+ return startingConstraints;
1100
+ }
1101
+
1102
+ if (
1103
+ curFlowNode.flags &
1104
+ (FlowFlags.VariableAnnotation |
1105
+ FlowFlags.Assignment |
1106
+ FlowFlags.WildcardImport |
1107
+ FlowFlags.TrueNeverCondition |
1108
+ FlowFlags.FalseNeverCondition |
1109
+ FlowFlags.NarrowForPattern |
1110
+ FlowFlags.ExhaustedMatch |
1111
+ FlowFlags.PostFinally |
1112
+ FlowFlags.PreFinallyGate |
1113
+ FlowFlags.Call)
1114
+ ) {
1115
+ const typedFlowNode = curFlowNode as
1116
+ | FlowVariableAnnotation
1117
+ | FlowAssignment
1118
+ | FlowWildcardImport
1119
+ | FlowExhaustedMatch
1120
+ | FlowNarrowForPattern
1121
+ | FlowPostFinally
1122
+ | FlowPreFinallyGate
1123
+ | FlowCall;
1124
+ curFlowNode = typedFlowNode.antecedent;
1125
+ continue;
1126
+ }
1127
+
1128
+ if (curFlowNode.flags & (FlowFlags.TrueCondition | FlowFlags.FalseCondition)) {
1129
+ const conditionFlowNode = curFlowNode as FlowCondition;
1130
+ const testExpression = conditionFlowNode.expression;
1131
+ const isPositiveTest = (curFlowNode.flags & FlowFlags.TrueCondition) !== 0;
1132
+
1133
+ if (
1134
+ testExpression.nodeType === ParseNodeType.Call &&
1135
+ testExpression.leftExpression.nodeType === ParseNodeType.Name &&
1136
+ testExpression.leftExpression.value === 'isinstance' &&
1137
+ testExpression.arguments.length === 2
1138
+ ) {
1139
+ const arg0Expr = testExpression.arguments[0].valueExpression;
1140
+
1141
+ const arg0Type = evaluator.getTypeOfExpression(arg0Expr).type;
1142
+
1143
+ if (isCompatibleWithConstrainedTypeVar(arg0Type, typeVar)) {
1144
+ // Prevent infinite recursion by noting that we've been here before.
1145
+ visitedFlowNodeMap.add(curFlowNode.id);
1146
+ const priorRemainingConstraints = narrowConstrainedTypeVarRecursive(
1147
+ conditionFlowNode.antecedent,
1148
+ typeVar
1149
+ );
1150
+ visitedFlowNodeMap.delete(curFlowNode.id);
1151
+
1152
+ const arg1Expr = testExpression.arguments[1].valueExpression;
1153
+ const arg1Type = evaluator.getTypeOfExpression(
1154
+ arg1Expr,
1155
+ EvaluatorFlags.EvaluateStringLiteralAsType |
1156
+ EvaluatorFlags.ParamSpecDisallowed |
1157
+ EvaluatorFlags.TypeVarTupleDisallowed
1158
+ ).type;
1159
+
1160
+ if (isInstantiableClass(arg1Type)) {
1161
+ return priorRemainingConstraints.filter((subtype) => {
1162
+ if (ClassType.isSameGenericClass(subtype, arg1Type)) {
1163
+ return isPositiveTest;
1164
+ } else {
1165
+ return !isPositiveTest;
1166
+ }
1167
+ });
1168
+ }
1169
+ }
1170
+ }
1171
+
1172
+ curFlowNode = conditionFlowNode.antecedent;
1173
+ continue;
1174
+ }
1175
+
1176
+ if (curFlowNode.flags & (FlowFlags.BranchLabel | FlowFlags.LoopLabel)) {
1177
+ const labelNode = curFlowNode as FlowLabel;
1178
+ const newConstraints: ClassType[] = [];
1179
+
1180
+ // Prevent infinite recursion by noting that we've been here before.
1181
+ visitedFlowNodeMap.add(curFlowNode.id);
1182
+ for (const antecedent of labelNode.antecedents) {
1183
+ const constraintsToAdd = narrowConstrainedTypeVarRecursive(antecedent, typeVar);
1184
+
1185
+ for (const constraint of constraintsToAdd) {
1186
+ if (!newConstraints.some((t) => isTypeSame(t, constraint))) {
1187
+ newConstraints.push(constraint);
1188
+ }
1189
+ }
1190
+ }
1191
+ visitedFlowNodeMap.delete(curFlowNode.id);
1192
+
1193
+ return newConstraints;
1194
+ }
1195
+
1196
+ // We shouldn't get here.
1197
+ fail('Unexpected flow node flags');
1198
+ return startingConstraints;
1199
+ }
1200
+ }
1201
+
1202
+ const narrowedConstrainedType = narrowConstrainedTypeVarRecursive(flowNode, typeVar);
1203
+
1204
+ // Have we narrowed the typeVar to a single constraint?
1205
+ return narrowedConstrainedType.length === 1 ? narrowedConstrainedType[0] : undefined;
1206
+ }
1207
+
1208
+ // Determines whether a specified type is the same as a constrained
1209
+ // TypeVar or is conditioned on that same TypeVar or is some union of
1210
+ // the above.
1211
+ function isCompatibleWithConstrainedTypeVar(type: Type, typeVar: TypeVarType) {
1212
+ let isCompatible = true;
1213
+ doForEachSubtype(type, (subtype) => {
1214
+ if (isTypeVar(subtype)) {
1215
+ if (!isTypeSame(subtype, typeVar)) {
1216
+ isCompatible = false;
1217
+ }
1218
+ } else if (subtype.condition) {
1219
+ if (
1220
+ !subtype.condition.some(
1221
+ (condition) => condition.isConstrainedTypeVar && condition.typeVarName === typeVar.nameWithScope
1222
+ )
1223
+ ) {
1224
+ isCompatible = false;
1225
+ }
1226
+ } else {
1227
+ isCompatible = false;
1228
+ }
1229
+ });
1230
+
1231
+ return isCompatible;
1232
+ }
1233
+
1234
+ // Determines whether a call associated with this flow node returns a NoReturn
1235
+ // type, thus preventing further traversal of the code flow graph.
1236
+ function isCallNoReturn(evaluator: TypeEvaluator, flowNode: FlowCall) {
1237
+ const node = flowNode.node;
1238
+
1239
+ if (isPrintCallNoReturnEnabled) {
1240
+ console.log(`isCallNoReturn@${flowNode.id} Pre depth ${noReturnAnalysisDepth}`);
1241
+ }
1242
+
1243
+ // See if this information is cached already.
1244
+ if (callIsNoReturnCache.has(node.id)) {
1245
+ const result = callIsNoReturnCache.get(node.id);
1246
+
1247
+ if (isPrintCallNoReturnEnabled) {
1248
+ console.log(`isCallNoReturn@${flowNode.id} Post: ${result ? 'true' : 'false'} (cached)`);
1249
+ }
1250
+
1251
+ return result;
1252
+ }
1253
+
1254
+ // See if we've exceeded the max recursion depth.
1255
+ if (noReturnAnalysisDepth > maxTypeRecursionCount) {
1256
+ return false;
1257
+ }
1258
+
1259
+ // Initially set to false to avoid recursion.
1260
+ callIsNoReturnCache.set(node.id, false);
1261
+
1262
+ noReturnAnalysisDepth++;
1263
+
1264
+ try {
1265
+ let noReturnTypeCount = 0;
1266
+ let subtypeCount = 0;
1267
+
1268
+ // Evaluate the call base type.
1269
+ const callType = evaluator.getTypeOfExpression(node.leftExpression, EvaluatorFlags.DoNotSpecialize).type;
1270
+
1271
+ doForEachSubtype(callType, (callSubtype) => {
1272
+ // Track the number of subtypes we've examined.
1273
+ subtypeCount++;
1274
+
1275
+ if (isInstantiableClass(callSubtype)) {
1276
+ // Does the class have a custom metaclass that implements a `__call__` method?
1277
+ // If so, it will be called instead of `__init__` or `__new__`. We'll assume
1278
+ // in this case that the __call__ method is not a NoReturn type.
1279
+ if (
1280
+ callSubtype.details.effectiveMetaclass &&
1281
+ isClass(callSubtype.details.effectiveMetaclass) &&
1282
+ !ClassType.isBuiltIn(callSubtype.details.effectiveMetaclass, 'type')
1283
+ ) {
1284
+ const metaclassCallMember = lookUpClassMember(
1285
+ callSubtype.details.effectiveMetaclass,
1286
+ '__call__',
1287
+ ClassMemberLookupFlags.SkipInstanceVariables | ClassMemberLookupFlags.SkipObjectBaseClass
1288
+ );
1289
+ if (metaclassCallMember) {
1290
+ return;
1291
+ }
1292
+ }
1293
+
1294
+ let constructorMember = lookUpClassMember(
1295
+ callSubtype,
1296
+ '__init__',
1297
+ ClassMemberLookupFlags.SkipInstanceVariables | ClassMemberLookupFlags.SkipObjectBaseClass
1298
+ );
1299
+
1300
+ if (constructorMember === undefined) {
1301
+ constructorMember = lookUpClassMember(
1302
+ callSubtype,
1303
+ '__new__',
1304
+ ClassMemberLookupFlags.SkipInstanceVariables | ClassMemberLookupFlags.SkipObjectBaseClass
1305
+ );
1306
+ }
1307
+
1308
+ if (constructorMember) {
1309
+ const constructorType = evaluator.getTypeOfMember(constructorMember);
1310
+ if (constructorType) {
1311
+ if (isFunction(constructorType) || isOverloadedFunction(constructorType)) {
1312
+ const boundConstructorType = evaluator.bindFunctionToClassOrObject(
1313
+ undefined,
1314
+ constructorType
1315
+ );
1316
+ if (boundConstructorType) {
1317
+ callSubtype = boundConstructorType;
1318
+ }
1319
+ }
1320
+ }
1321
+ }
1322
+ } else if (isClassInstance(callSubtype)) {
1323
+ const callMember = lookUpClassMember(
1324
+ callSubtype,
1325
+ '__call__',
1326
+ ClassMemberLookupFlags.SkipInstanceVariables
1327
+ );
1328
+ if (callMember) {
1329
+ const callMemberType = evaluator.getTypeOfMember(callMember);
1330
+ if (callMemberType) {
1331
+ if (isFunction(callMemberType) || isOverloadedFunction(callMemberType)) {
1332
+ const boundCallType = evaluator.bindFunctionToClassOrObject(undefined, callMemberType);
1333
+ if (boundCallType) {
1334
+ callSubtype = boundCallType;
1335
+ }
1336
+ }
1337
+ }
1338
+ }
1339
+ }
1340
+
1341
+ const isCallAwaited = node.parent?.nodeType === ParseNodeType.Await;
1342
+ if (isFunction(callSubtype)) {
1343
+ if (isFunctionNoReturn(callSubtype, isCallAwaited)) {
1344
+ noReturnTypeCount++;
1345
+ }
1346
+ } else if (isOverloadedFunction(callSubtype)) {
1347
+ let overloadCount = 0;
1348
+ let noReturnOverloadCount = 0;
1349
+
1350
+ callSubtype.overloads.forEach((overload) => {
1351
+ if (FunctionType.isOverloaded(overload)) {
1352
+ overloadCount++;
1353
+
1354
+ if (isFunctionNoReturn(overload, isCallAwaited)) {
1355
+ noReturnOverloadCount++;
1356
+ }
1357
+ }
1358
+ });
1359
+
1360
+ // Was at least one of the overloaded return types NoReturn?
1361
+ if (noReturnOverloadCount > 0) {
1362
+ if (noReturnOverloadCount === overloadCount) {
1363
+ noReturnTypeCount++;
1364
+ }
1365
+
1366
+ // For now, assume that if some (but not all) overloads return
1367
+ // NoReturn that the call is not a NoReturn.
1368
+ }
1369
+ }
1370
+ });
1371
+
1372
+ // The call is considered NoReturn if all subtypes evaluate to NoReturn.
1373
+ const callIsNoReturn = subtypeCount > 0 && noReturnTypeCount === subtypeCount;
1374
+
1375
+ // Cache the value for next time.
1376
+ callIsNoReturnCache.set(node.id, callIsNoReturn);
1377
+
1378
+ if (isPrintCallNoReturnEnabled) {
1379
+ console.log(`isCallNoReturn@${flowNode.id} Post: ${callIsNoReturn ? 'true' : 'false'}`);
1380
+ }
1381
+
1382
+ return callIsNoReturn;
1383
+ } finally {
1384
+ noReturnAnalysisDepth--;
1385
+ }
1386
+ }
1387
+
1388
+ function isFunctionNoReturn(functionType: FunctionType, isCallAwaited: boolean) {
1389
+ const returnType = functionType.details.declaredReturnType;
1390
+ if (FunctionType.isAsync(functionType)) {
1391
+ if (
1392
+ returnType &&
1393
+ isClassInstance(returnType) &&
1394
+ ClassType.isBuiltIn(returnType, 'Coroutine') &&
1395
+ returnType.typeArguments &&
1396
+ returnType.typeArguments.length >= 3
1397
+ ) {
1398
+ if (isNever(returnType.typeArguments[2]) && isCallAwaited) {
1399
+ return true;
1400
+ }
1401
+ }
1402
+ } else if (returnType) {
1403
+ return isNever(returnType);
1404
+ } else if (functionType.details.declaration) {
1405
+ // If the function has yield expressions, it's a generator, and
1406
+ // we'll assume the yield statements are reachable. Also, don't
1407
+ // infer a "no return" type for abstract methods.
1408
+ if (
1409
+ !functionType.details.declaration.yieldStatements &&
1410
+ !FunctionType.isAbstractMethod(functionType) &&
1411
+ !FunctionType.isStubDefinition(functionType) &&
1412
+ !FunctionType.isPyTypedDefinition(functionType)
1413
+ ) {
1414
+ // Check specifically for a common idiom where the only statement
1415
+ // (other than a possible docstring) is a "raise NotImplementedError".
1416
+ const functionStatements = functionType.details.declaration.node.suite.statements;
1417
+
1418
+ let foundRaiseNotImplemented = false;
1419
+ for (const statement of functionStatements) {
1420
+ if (statement.nodeType !== ParseNodeType.StatementList || statement.statements.length !== 1) {
1421
+ break;
1422
+ }
1423
+
1424
+ const simpleStatement = statement.statements[0];
1425
+ if (simpleStatement.nodeType === ParseNodeType.StringList) {
1426
+ continue;
1427
+ }
1428
+
1429
+ if (simpleStatement.nodeType === ParseNodeType.Raise && simpleStatement.typeExpression) {
1430
+ // Check for "raise NotImplementedError" or "raise NotImplementedError()"
1431
+ const isNotImplementedName = (node: ParseNode) => {
1432
+ return node?.nodeType === ParseNodeType.Name && node.value === 'NotImplementedError';
1433
+ };
1434
+
1435
+ if (isNotImplementedName(simpleStatement.typeExpression)) {
1436
+ foundRaiseNotImplemented = true;
1437
+ } else if (
1438
+ simpleStatement.typeExpression.nodeType === ParseNodeType.Call &&
1439
+ isNotImplementedName(simpleStatement.typeExpression.leftExpression)
1440
+ ) {
1441
+ foundRaiseNotImplemented = true;
1442
+ }
1443
+ }
1444
+
1445
+ break;
1446
+ }
1447
+
1448
+ if (!foundRaiseNotImplemented && !isAfterNodeReachable(evaluator, functionType)) {
1449
+ return true;
1450
+ }
1451
+ }
1452
+ }
1453
+
1454
+ return false;
1455
+ }
1456
+
1457
+ function isAfterNodeReachable(evaluator: TypeEvaluator, functionType: FunctionType) {
1458
+ if (!functionType.details.declaration) {
1459
+ return true;
1460
+ }
1461
+
1462
+ return evaluator.isAfterNodeReachable(functionType.details.declaration.node);
1463
+ }
1464
+
1465
+ // Performs a cursory analysis to determine whether the expression
1466
+ // corresponds to a context manager object that supports the swallowing
1467
+ // of exceptions. By convention, these objects have an "__exit__" method
1468
+ // that returns a bool response (as opposed to a None). This function is
1469
+ // called during code flow, so it can't rely on full type evaluation. It
1470
+ // makes some simplifying assumptions that work in most cases.
1471
+ function isExceptionContextManager(evaluator: TypeEvaluator, node: ExpressionNode, isAsync: boolean) {
1472
+ // See if this information is cached already.
1473
+ if (isExceptionContextManagerCache.has(node.id)) {
1474
+ return isExceptionContextManagerCache.get(node.id);
1475
+ }
1476
+
1477
+ // Initially set to false to avoid infinite recursion.
1478
+ isExceptionContextManagerCache.set(node.id, false);
1479
+
1480
+ // See if we've exceeded the max recursion depth.
1481
+ if (contextManagerAnalysisDepth > maxTypeRecursionCount) {
1482
+ return false;
1483
+ }
1484
+
1485
+ contextManagerAnalysisDepth++;
1486
+ let cmSwallowsExceptions = false;
1487
+
1488
+ try {
1489
+ const cmType = evaluator.getTypeOfExpression(node).type;
1490
+
1491
+ if (cmType && isClassInstance(cmType)) {
1492
+ const exitMethodName = isAsync ? '__aexit__' : '__exit__';
1493
+ const exitType = evaluator.getTypeOfObjectMember(node, cmType, exitMethodName)?.type;
1494
+
1495
+ if (exitType && isFunction(exitType) && exitType.details.declaredReturnType) {
1496
+ const returnType = exitType.details.declaredReturnType;
1497
+ cmSwallowsExceptions = isClassInstance(returnType) && ClassType.isBuiltIn(returnType, 'bool');
1498
+ }
1499
+ }
1500
+ } finally {
1501
+ contextManagerAnalysisDepth--;
1502
+ }
1503
+
1504
+ // Cache the value for next time.
1505
+ isExceptionContextManagerCache.set(node.id, cmSwallowsExceptions);
1506
+
1507
+ return cmSwallowsExceptions;
1508
+ }
1509
+
1510
+ function getTypeFromWildcardImport(flowNode: FlowWildcardImport, name: string): Type {
1511
+ const importInfo = getImportInfo(flowNode.node.module);
1512
+ assert(importInfo !== undefined && importInfo.isImportFound);
1513
+ assert(flowNode.node.isWildcardImport);
1514
+
1515
+ const symbolWithScope = evaluator.lookUpSymbolRecursive(flowNode.node, name, /* honorCodeFlow */ false);
1516
+ assert(symbolWithScope !== undefined);
1517
+ const decls = symbolWithScope!.symbol.getDeclarations();
1518
+ const wildcardDecl = decls.find((decl) => decl.node === flowNode.node);
1519
+
1520
+ if (!wildcardDecl) {
1521
+ return UnknownType.create();
1522
+ }
1523
+
1524
+ return evaluator.getInferredTypeOfDeclaration(symbolWithScope!.symbol, wildcardDecl) || UnknownType.create();
1525
+ }
1526
+
1527
+ function printControlFlowGraph(
1528
+ flowNode: FlowNode,
1529
+ reference: CodeFlowReferenceExpressionNode | undefined,
1530
+ callName: string
1531
+ ) {
1532
+ let referenceText = '';
1533
+ if (reference) {
1534
+ const fileInfo = getFileInfo(reference);
1535
+ const pos = convertOffsetToPosition(reference.start, fileInfo.lines);
1536
+ referenceText = `${printExpression(reference)}[${pos.line + 1}:${pos.character + 1}]`;
1537
+ }
1538
+
1539
+ console.log(`${callName}@${flowNode.id}: ${referenceText || '(none)'}`);
1540
+ console.log(formatControlFlowGraph(flowNode));
1541
+ }
1542
+
1543
+ return {
1544
+ createCodeFlowAnalyzer,
1545
+ isFlowNodeReachable,
1546
+ narrowConstrainedTypeVar,
1547
+ };
1548
+ }