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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/dist/analyzer/analyzerFileInfo.d.ts +0 -1
  2. package/dist/analyzer/analyzerFileInfo.js.map +1 -1
  3. package/dist/analyzer/analyzerNodeInfo.js +1 -1
  4. package/dist/analyzer/analyzerNodeInfo.js.map +1 -1
  5. package/dist/analyzer/binder.d.ts +2 -1
  6. package/dist/analyzer/binder.js +45 -38
  7. package/dist/analyzer/binder.js.map +1 -1
  8. package/dist/analyzer/checker.js +81 -44
  9. package/dist/analyzer/checker.js.map +1 -1
  10. package/dist/analyzer/codeFlowEngine.js +19 -7
  11. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  12. package/dist/analyzer/codeFlowTypes.d.ts +9 -8
  13. package/dist/analyzer/codeFlowTypes.js +9 -8
  14. package/dist/analyzer/codeFlowTypes.js.map +1 -1
  15. package/dist/analyzer/codeFlowUtils.js +4 -2
  16. package/dist/analyzer/codeFlowUtils.js.map +1 -1
  17. package/dist/analyzer/dataClasses.js +7 -2
  18. package/dist/analyzer/dataClasses.js.map +1 -1
  19. package/dist/analyzer/docStringUtils.js +3 -1
  20. package/dist/analyzer/docStringUtils.js.map +1 -1
  21. package/dist/analyzer/importResolver.d.ts +0 -1
  22. package/dist/analyzer/importResolver.js +2 -25
  23. package/dist/analyzer/importResolver.js.map +1 -1
  24. package/dist/analyzer/importResult.d.ts +0 -1
  25. package/dist/analyzer/importStatementUtils.js +5 -3
  26. package/dist/analyzer/importStatementUtils.js.map +1 -1
  27. package/dist/analyzer/namedTuples.js +10 -0
  28. package/dist/analyzer/namedTuples.js.map +1 -1
  29. package/dist/analyzer/operations.js +1 -1
  30. package/dist/analyzer/operations.js.map +1 -1
  31. package/dist/analyzer/packageTypeVerifier.js +5 -3
  32. package/dist/analyzer/packageTypeVerifier.js.map +1 -1
  33. package/dist/analyzer/parameterUtils.js +10 -3
  34. package/dist/analyzer/parameterUtils.js.map +1 -1
  35. package/dist/analyzer/parseTreeUtils.d.ts +3 -4
  36. package/dist/analyzer/parseTreeUtils.js +19 -225
  37. package/dist/analyzer/parseTreeUtils.js.map +1 -1
  38. package/dist/analyzer/patternMatching.js +4 -0
  39. package/dist/analyzer/patternMatching.js.map +1 -1
  40. package/dist/analyzer/program.d.ts +12 -2
  41. package/dist/analyzer/program.js +78 -75
  42. package/dist/analyzer/program.js.map +1 -1
  43. package/dist/analyzer/programTypes.d.ts +2 -2
  44. package/dist/analyzer/programTypes.js.map +1 -1
  45. package/dist/analyzer/properties.js +3 -5
  46. package/dist/analyzer/properties.js.map +1 -1
  47. package/dist/analyzer/protocols.js +13 -3
  48. package/dist/analyzer/protocols.js.map +1 -1
  49. package/dist/analyzer/sentinel.d.ts +4 -0
  50. package/dist/analyzer/sentinel.js +51 -0
  51. package/dist/analyzer/sentinel.js.map +1 -0
  52. package/dist/analyzer/service.d.ts +2 -2
  53. package/dist/analyzer/service.js +7 -6
  54. package/dist/analyzer/service.js.map +1 -1
  55. package/dist/analyzer/sourceFile.d.ts +5 -2
  56. package/dist/analyzer/sourceFile.js +53 -15
  57. package/dist/analyzer/sourceFile.js.map +1 -1
  58. package/dist/analyzer/sourceFileInfo.d.ts +10 -1
  59. package/dist/analyzer/sourceFileInfo.js +28 -0
  60. package/dist/analyzer/sourceFileInfo.js.map +1 -1
  61. package/dist/analyzer/sourceFileInfoUtils.js +4 -4
  62. package/dist/analyzer/sourceFileInfoUtils.js.map +1 -1
  63. package/dist/analyzer/sourceMapper.d.ts +1 -1
  64. package/dist/analyzer/sourceMapper.js +20 -20
  65. package/dist/analyzer/sourceMapper.js.map +1 -1
  66. package/dist/analyzer/symbol.d.ts +3 -0
  67. package/dist/analyzer/symbol.js +11 -0
  68. package/dist/analyzer/symbol.js.map +1 -1
  69. package/dist/analyzer/testWalker.js +2 -13
  70. package/dist/analyzer/testWalker.js.map +1 -1
  71. package/dist/analyzer/tracePrinter.js +1 -1
  72. package/dist/analyzer/tracePrinter.js.map +1 -1
  73. package/dist/analyzer/typeEvaluator.js +278 -147
  74. package/dist/analyzer/typeEvaluator.js.map +1 -1
  75. package/dist/analyzer/typeEvaluatorTypes.d.ts +8 -4
  76. package/dist/analyzer/typeEvaluatorTypes.js +15 -2
  77. package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
  78. package/dist/analyzer/typeGuards.js +47 -13
  79. package/dist/analyzer/typeGuards.js.map +1 -1
  80. package/dist/analyzer/typePrinter.js +10 -2
  81. package/dist/analyzer/typePrinter.js.map +1 -1
  82. package/dist/analyzer/typePrinterUtils.js +2 -2
  83. package/dist/analyzer/typePrinterUtils.js.map +1 -1
  84. package/dist/analyzer/typeUtils.d.ts +2 -0
  85. package/dist/analyzer/typeUtils.js +14 -3
  86. package/dist/analyzer/typeUtils.js.map +1 -1
  87. package/dist/analyzer/typedDicts.js +9 -5
  88. package/dist/analyzer/typedDicts.js.map +1 -1
  89. package/dist/analyzer/types.d.ts +9 -2
  90. package/dist/analyzer/types.js +39 -1
  91. package/dist/analyzer/types.js.map +1 -1
  92. package/dist/commands/dumpFileDebugInfoCommand.d.ts +96 -0
  93. package/dist/commands/dumpFileDebugInfoCommand.js +13 -2
  94. package/dist/commands/dumpFileDebugInfoCommand.js.map +1 -1
  95. package/dist/common/cancellationUtils.d.ts +1 -1
  96. package/dist/common/cancellationUtils.js +2 -2
  97. package/dist/common/cancellationUtils.js.map +1 -1
  98. package/dist/common/charCodes.d.ts +1 -1
  99. package/dist/common/charCodes.js +1 -1
  100. package/dist/common/charCodes.js.map +1 -1
  101. package/dist/common/configOptions.d.ts +1 -0
  102. package/dist/common/configOptions.js +5 -0
  103. package/dist/common/configOptions.js.map +1 -1
  104. package/dist/common/core.d.ts +1 -3
  105. package/dist/common/core.js +3 -4
  106. package/dist/common/core.js.map +1 -1
  107. package/dist/common/diagnostic.d.ts +1 -1
  108. package/dist/common/diagnosticRules.d.ts +1 -0
  109. package/dist/common/diagnosticRules.js +1 -0
  110. package/dist/common/diagnosticRules.js.map +1 -1
  111. package/dist/common/docRange.d.ts +6 -0
  112. package/dist/common/docRange.js +10 -0
  113. package/dist/common/docRange.js.map +1 -0
  114. package/dist/common/envVarUtils.js +1 -6
  115. package/dist/common/envVarUtils.js.map +1 -1
  116. package/dist/common/extensibility.d.ts +11 -2
  117. package/dist/common/extensibility.js.map +1 -1
  118. package/dist/common/fileBasedCancellationUtils.d.ts +1 -0
  119. package/dist/common/fileBasedCancellationUtils.js +1 -0
  120. package/dist/common/fileBasedCancellationUtils.js.map +1 -1
  121. package/dist/common/logTracker.d.ts +5 -1
  122. package/dist/common/logTracker.js +43 -26
  123. package/dist/common/logTracker.js.map +1 -1
  124. package/dist/common/pathUtils.d.ts +1 -1
  125. package/dist/common/pathUtils.js +3 -2
  126. package/dist/common/pathUtils.js.map +1 -1
  127. package/dist/common/realFileSystem.d.ts +1 -1
  128. package/dist/common/realFileSystem.js +2 -1
  129. package/dist/common/realFileSystem.js.map +1 -1
  130. package/dist/common/serviceProviderExtensions.js +2 -2
  131. package/dist/common/serviceProviderExtensions.js.map +1 -1
  132. package/dist/common/stringUtils.d.ts +0 -1
  133. package/dist/common/stringUtils.js +0 -42
  134. package/dist/common/stringUtils.js.map +1 -1
  135. package/dist/common/textEditTracker.js +5 -3
  136. package/dist/common/textEditTracker.js.map +1 -1
  137. package/dist/common/textRange.d.ts +5 -11
  138. package/dist/common/textRange.js +31 -56
  139. package/dist/common/textRange.js.map +1 -1
  140. package/dist/common/textRangeCollection.js +3 -2
  141. package/dist/common/textRangeCollection.js.map +1 -1
  142. package/dist/common/uri/baseUri.js +2 -1
  143. package/dist/common/uri/baseUri.js.map +1 -1
  144. package/dist/common/uri/uri.d.ts +5 -2
  145. package/dist/common/uri/uri.js +21 -5
  146. package/dist/common/uri/uri.js.map +1 -1
  147. package/dist/common/uri/uriUtils.d.ts +2 -2
  148. package/dist/common/uri/uriUtils.js +4 -3
  149. package/dist/common/uri/uriUtils.js.map +1 -1
  150. package/dist/common/workspaceEditUtils.js +9 -9
  151. package/dist/common/workspaceEditUtils.js.map +1 -1
  152. package/dist/languageServerBase.d.ts +5 -3
  153. package/dist/languageServerBase.js +44 -37
  154. package/dist/languageServerBase.js.map +1 -1
  155. package/dist/languageService/analyzerServiceExecutor.d.ts +3 -0
  156. package/dist/languageService/analyzerServiceExecutor.js +1 -0
  157. package/dist/languageService/analyzerServiceExecutor.js.map +1 -1
  158. package/dist/languageService/autoImporter.d.ts +2 -2
  159. package/dist/languageService/autoImporter.js +3 -3
  160. package/dist/languageService/autoImporter.js.map +1 -1
  161. package/dist/languageService/callHierarchyProvider.js +2 -3
  162. package/dist/languageService/callHierarchyProvider.js.map +1 -1
  163. package/dist/languageService/completionProvider.js +16 -13
  164. package/dist/languageService/completionProvider.js.map +1 -1
  165. package/dist/languageService/definitionProvider.d.ts +2 -1
  166. package/dist/languageService/definitionProvider.js.map +1 -1
  167. package/dist/languageService/documentSymbolCollector.d.ts +4 -1
  168. package/dist/languageService/documentSymbolCollector.js +9 -7
  169. package/dist/languageService/documentSymbolCollector.js.map +1 -1
  170. package/dist/languageService/hoverProvider.js +1 -9
  171. package/dist/languageService/hoverProvider.js.map +1 -1
  172. package/dist/languageService/importSorter.js +1 -0
  173. package/dist/languageService/importSorter.js.map +1 -1
  174. package/dist/languageService/navigationUtils.d.ts +1 -1
  175. package/dist/languageService/referencesProvider.d.ts +2 -1
  176. package/dist/languageService/referencesProvider.js +8 -7
  177. package/dist/languageService/referencesProvider.js.map +1 -1
  178. package/dist/languageService/renameProvider.js +4 -19
  179. package/dist/languageService/renameProvider.js.map +1 -1
  180. package/dist/languageService/tooltipUtils.d.ts +2 -0
  181. package/dist/languageService/tooltipUtils.js +2 -0
  182. package/dist/languageService/tooltipUtils.js.map +1 -1
  183. package/dist/languageService/workspaceSymbolProvider.js +1 -1
  184. package/dist/languageService/workspaceSymbolProvider.js.map +1 -1
  185. package/dist/localization/localize.d.ts +16 -2
  186. package/dist/localization/localize.js +16 -2
  187. package/dist/localization/localize.js.map +1 -1
  188. package/dist/localization/package.nls.cs.json +23 -9
  189. package/dist/localization/package.nls.de.json +18 -4
  190. package/dist/localization/package.nls.en-us.json +53 -3
  191. package/dist/localization/package.nls.es.json +18 -4
  192. package/dist/localization/package.nls.fr.json +22 -8
  193. package/dist/localization/package.nls.it.json +23 -9
  194. package/dist/localization/package.nls.ja.json +18 -4
  195. package/dist/localization/package.nls.ko.json +23 -9
  196. package/dist/localization/package.nls.pl.json +18 -4
  197. package/dist/localization/package.nls.pt-br.json +18 -4
  198. package/dist/localization/package.nls.qps-ploc.json +17 -3
  199. package/dist/localization/package.nls.ru.json +18 -4
  200. package/dist/localization/package.nls.tr.json +23 -9
  201. package/dist/localization/package.nls.zh-cn.json +18 -4
  202. package/dist/localization/package.nls.zh-tw.json +18 -4
  203. package/dist/parser/characters.d.ts +1 -8
  204. package/dist/parser/characters.js +6 -3
  205. package/dist/parser/characters.js.map +1 -1
  206. package/dist/parser/parseNodeUtils.d.ts +12 -0
  207. package/dist/parser/parseNodeUtils.js +136 -0
  208. package/dist/parser/parseNodeUtils.js.map +1 -0
  209. package/dist/parser/parseNodes.d.ts +12 -2
  210. package/dist/parser/parseNodes.js +17 -2
  211. package/dist/parser/parseNodes.js.map +1 -1
  212. package/dist/parser/parser.d.ts +5 -2
  213. package/dist/parser/parser.js +83 -47
  214. package/dist/parser/parser.js.map +1 -1
  215. package/dist/parser/tokenizer.d.ts +3 -3
  216. package/dist/parser/tokenizer.js +58 -38
  217. package/dist/parser/tokenizer.js.map +1 -1
  218. package/dist/parser/tokenizerTypes.d.ts +4 -3
  219. package/dist/parser/tokenizerTypes.js +4 -3
  220. package/dist/parser/tokenizerTypes.js.map +1 -1
  221. package/dist/pyright.js +1 -1
  222. package/dist/pyright.js.map +1 -1
  223. package/dist/server.js +3 -3
  224. package/dist/server.js.map +1 -1
  225. package/dist/tests/checker.test.js +2 -2
  226. package/dist/tests/common.test.js +6 -6
  227. package/dist/tests/common.test.js.map +1 -1
  228. package/dist/tests/fourslash/completions.autoimport.unicode.fourslash.js +29 -0
  229. package/dist/tests/fourslash/completions.autoimport.unicode.fourslash.js.map +1 -0
  230. package/dist/tests/fourslash/completions.declNames.method.fourslash.js +8 -8
  231. package/dist/tests/fourslash/import.pytyped.privateSymbols.fourslash.js +0 -18
  232. package/dist/tests/fourslash/import.pytyped.privateSymbols.fourslash.js.map +1 -1
  233. package/dist/tests/harness/fourslash/testState.d.ts +3 -2
  234. package/dist/tests/harness/fourslash/testState.js +9 -3
  235. package/dist/tests/harness/fourslash/testState.js.map +1 -1
  236. package/dist/tests/lsp/languageServer.js +1 -1
  237. package/dist/tests/lsp/languageServer.js.map +1 -1
  238. package/dist/tests/lsp/languageServerTestUtils.d.ts +1 -2
  239. package/dist/tests/lsp/languageServerTestUtils.js +2 -2
  240. package/dist/tests/lsp/languageServerTestUtils.js.map +1 -1
  241. package/dist/tests/parser.test.js +17 -0
  242. package/dist/tests/parser.test.js.map +1 -1
  243. package/dist/tests/positionUtils.test.js +1 -1
  244. package/dist/tests/service.test.js +4 -4
  245. package/dist/tests/service.test.js.map +1 -1
  246. package/dist/tests/sourceFile.test.js +21 -4
  247. package/dist/tests/sourceFile.test.js.map +1 -1
  248. package/dist/tests/stringUtils.test.js +0 -12
  249. package/dist/tests/stringUtils.test.js.map +1 -1
  250. package/dist/tests/testStateUtils.js +8 -3
  251. package/dist/tests/testStateUtils.js.map +1 -1
  252. package/dist/tests/testUtils.js +1 -1
  253. package/dist/tests/testUtils.js.map +1 -1
  254. package/dist/tests/tokenizer.test.js +5 -5
  255. package/dist/tests/tokenizer.test.js.map +1 -1
  256. package/dist/tests/typeEvaluator1.test.js +11 -13
  257. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  258. package/dist/tests/typeEvaluator2.test.js +15 -1
  259. package/dist/tests/typeEvaluator2.test.js.map +1 -1
  260. package/dist/tests/typeEvaluator4.test.js +16 -1
  261. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  262. package/dist/tests/typeEvaluator5.test.js +10 -4
  263. package/dist/tests/typeEvaluator5.test.js.map +1 -1
  264. package/dist/tests/typeEvaluator6.test.js +1 -1
  265. package/dist/tests/typeEvaluator7.test.js +9 -0
  266. package/dist/tests/typeEvaluator7.test.js.map +1 -1
  267. package/dist/tests/typeEvaluator8.test.js +8 -0
  268. package/dist/tests/typeEvaluator8.test.js.map +1 -1
  269. package/dist/tests/workspaceEditUtils.test.js +7 -9
  270. package/dist/tests/workspaceEditUtils.test.js.map +1 -1
  271. package/dist/types.d.ts +1 -1
  272. package/dist/workspaceFactory.d.ts +12 -1
  273. package/dist/workspaceFactory.js.map +1 -1
  274. package/package.json +2 -3
  275. package/dist/tests/fourslash/rename.args.fourslash.js +0 -72
  276. package/dist/tests/fourslash/rename.args.fourslash.js.map +0 -1
  277. /package/dist/tests/fourslash/{rename.args.fourslash.d.ts → completions.autoimport.unicode.fourslash.d.ts} +0 -0
@@ -36,13 +36,13 @@ var __importStar = (this && this.__importStar) || function (mod) {
36
36
  };
37
37
  Object.defineProperty(exports, "__esModule", { value: true });
38
38
  exports.Parser = exports.ParseTextMode = exports.ParseOptions = void 0;
39
- const sourceFile_1 = require("../analyzer/sourceFile");
40
39
  const collectionUtils_1 = require("../common/collectionUtils");
41
40
  const debug_1 = require("../common/debug");
42
41
  const diagnostic_1 = require("../common/diagnostic");
43
42
  const diagnosticSink_1 = require("../common/diagnosticSink");
44
43
  const positionUtils_1 = require("../common/positionUtils");
45
44
  const pythonVersion_1 = require("../common/pythonVersion");
45
+ const stringUtils_1 = require("../common/stringUtils");
46
46
  const textRange_1 = require("../common/textRange");
47
47
  const timing_1 = require("../common/timing");
48
48
  const localize_1 = require("../localization/localize");
@@ -50,13 +50,15 @@ const parseNodes_1 = require("./parseNodes");
50
50
  const StringTokenUtils = __importStar(require("./stringTokenUtils"));
51
51
  const tokenizer_1 = require("./tokenizer");
52
52
  const tokenizerTypes_1 = require("./tokenizerTypes");
53
+ const commentRegEx = /^(\s*#\s*type:\s*)([^\r\n]*)/;
54
+ const ignoreCommentRegEx = /^ignore(\s|\[|$)/;
53
55
  class ParseOptions {
54
56
  constructor() {
55
57
  this.isStubFile = false;
56
58
  this.pythonVersion = pythonVersion_1.latestStablePythonVersion;
57
59
  this.reportInvalidStringEscapeSequence = false;
58
60
  this.skipFunctionAndClassBody = false;
59
- this.ipythonMode = sourceFile_1.IPythonMode.None;
61
+ this.useNotebookMode = false;
60
62
  this.reportErrorsForParsedStringContents = false;
61
63
  }
62
64
  }
@@ -81,6 +83,8 @@ class Parser {
81
83
  this._isParsingTypeAnnotation = false;
82
84
  this._isParsingIndexTrailer = false;
83
85
  this._isParsingQuotedText = false;
86
+ this._isInFinallyBlock = false;
87
+ this._isInFinallyLoop = false;
84
88
  this._futureImports = new Set();
85
89
  this._importedModules = [];
86
90
  this._containsWildcardImport = false;
@@ -126,6 +130,7 @@ class Parser {
126
130
  (0, debug_1.assert)(this._tokenizerOutput !== undefined);
127
131
  return {
128
132
  text: fileContents,
133
+ contentHash: (0, stringUtils_1.hashString)(fileContents),
129
134
  parserOutput: {
130
135
  parseTree: moduleNode,
131
136
  importedModules: this._importedModules,
@@ -135,6 +140,7 @@ class Parser {
135
140
  hasTypeAnnotations: this._hasTypeAnnotations,
136
141
  },
137
142
  tokenizerOutput: this._tokenizerOutput,
143
+ lines: this._tokenizerOutput.lines,
138
144
  };
139
145
  }
140
146
  parseTextExpression(fileContents, textOffset, textLength, parseOptions, parseTextMode = 0 /* ParseTextMode.Expression */, initialParenDepth = 0, typingSymbolAliases) {
@@ -184,7 +190,7 @@ class Parser {
184
190
  this._diagSink = diagSink;
185
191
  // Tokenize the file contents.
186
192
  const tokenizer = new tokenizer_1.Tokenizer();
187
- this._tokenizerOutput = tokenizer.tokenize(fileContents, textOffset, textLength, initialParenDepth, this._parseOptions.ipythonMode);
193
+ this._tokenizerOutput = tokenizer.tokenize(fileContents, textOffset, textLength, initialParenDepth, this._parseOptions.useNotebookMode);
188
194
  this._tokenIndex = 0;
189
195
  }
190
196
  // stmt: simple_stmt | compound_stmt
@@ -1060,6 +1066,11 @@ class Parser {
1060
1066
  _parseLoopSuite() {
1061
1067
  const wasInLoop = this._isInLoop;
1062
1068
  this._isInLoop = true;
1069
+ // Record the fact that we are no longer in a finally block
1070
+ // that is contained within a loop. A loop within the finally
1071
+ // block resets this. See PEP 765 for details.
1072
+ const wasInFinallyLoop = this._isInFinallyLoop;
1073
+ this._isInFinallyLoop = false;
1063
1074
  let typeComment;
1064
1075
  const suite = this._parseSuite(this._isInFunction, /* skipBody */ false, () => {
1065
1076
  const comment = this._getTypeAnnotationCommentText();
@@ -1068,6 +1079,7 @@ class Parser {
1068
1079
  }
1069
1080
  });
1070
1081
  this._isInLoop = wasInLoop;
1082
+ this._isInFinallyLoop = wasInFinallyLoop;
1071
1083
  if (typeComment) {
1072
1084
  suite.d.typeComment = typeComment;
1073
1085
  }
@@ -1391,23 +1403,32 @@ class Parser {
1391
1403
  }
1392
1404
  let typeExpr;
1393
1405
  let symbolName;
1406
+ let isAsKeywordAllowed = true;
1394
1407
  if (this._peekTokenType() !== 10 /* TokenType.Colon */) {
1395
- typeExpr = this._parseTestExpression(/* allowAssignmentExpression */ true);
1408
+ const listResult = this._parseExpressionListGeneric(() => this._parseTestExpression(/* allowAssignmentExpression */ true));
1409
+ if (listResult.parseError) {
1410
+ typeExpr = listResult.parseError;
1411
+ }
1412
+ else {
1413
+ typeExpr = this._makeExpressionOrTuple(listResult, /* enclosedInParens */ false);
1414
+ // Python 3.14 allows more than one exception type to be provided in
1415
+ // an except clause.
1416
+ if (listResult.list.length > 1) {
1417
+ if (pythonVersion_1.PythonVersion.isLessThan(this._getLanguageVersion(), pythonVersion_1.pythonVersion3_14)) {
1418
+ this._addSyntaxError(localize_1.LocMessage.exceptRequiresParens(), typeExpr);
1419
+ }
1420
+ isAsKeywordAllowed = false;
1421
+ }
1422
+ }
1396
1423
  if (this._consumeTokenIfKeyword(1 /* KeywordType.As */)) {
1424
+ if (!isAsKeywordAllowed) {
1425
+ this._addSyntaxError(localize_1.LocMessage.exceptWithAsRequiresParens(), typeExpr);
1426
+ }
1397
1427
  symbolName = this._getTokenIfIdentifier();
1398
1428
  if (!symbolName) {
1399
1429
  this._addSyntaxError(localize_1.LocMessage.expectedNameAfterAs(), this._peekToken());
1400
1430
  }
1401
1431
  }
1402
- else {
1403
- // Handle the python 2.x syntax in a graceful manner.
1404
- const peekToken = this._peekToken();
1405
- if (this._consumeTokenIfType(12 /* TokenType.Comma */)) {
1406
- this._addSyntaxError(localize_1.LocMessage.expectedAsAfterException(), peekToken);
1407
- // Parse the expression expected in python 2.x, but discard it.
1408
- this._parseTestExpression(/* allowAssignmentExpression */ false);
1409
- }
1410
- }
1411
1432
  }
1412
1433
  else if (isExceptGroup) {
1413
1434
  this._addSyntaxError(localize_1.LocMessage.exceptGroupRequiresType(), this._peekToken());
@@ -1445,7 +1466,13 @@ class Parser {
1445
1466
  }
1446
1467
  }
1447
1468
  if (this._consumeTokenIfKeyword(16 /* KeywordType.Finally */)) {
1469
+ const wasInFinallyBlock = this._isInFinallyBlock;
1470
+ const wasInFinallyLoop = this._isInFinallyLoop;
1471
+ this._isInFinallyBlock = true;
1472
+ this._isInFinallyLoop = this._isInLoop;
1448
1473
  tryNode.d.finallySuite = this._parseSuite(this._isInFunction);
1474
+ this._isInFinallyBlock = wasInFinallyBlock;
1475
+ this._isInFinallyLoop = wasInFinallyLoop;
1449
1476
  tryNode.d.finallySuite.parent = tryNode;
1450
1477
  (0, parseNodes_1.extendRange)(tryNode, tryNode.d.finallySuite);
1451
1478
  }
@@ -1489,12 +1516,18 @@ class Parser {
1489
1516
  let functionTypeAnnotationToken;
1490
1517
  const wasInExceptionGroup = this._isInExceptionGroup;
1491
1518
  this._isInExceptionGroup = false;
1519
+ const wasInFinallyBlock = this._isInFinallyBlock;
1520
+ const wasInFinallyLoop = this._isInFinallyLoop;
1521
+ this._isInFinallyBlock = false;
1522
+ this._isInFinallyLoop = false;
1492
1523
  const suite = this._parseSuite(/* isFunction */ true, this._parseOptions.skipFunctionAndClassBody, () => {
1493
1524
  if (!functionTypeAnnotationToken) {
1494
1525
  functionTypeAnnotationToken = this._getTypeAnnotationCommentText();
1495
1526
  }
1496
1527
  });
1497
1528
  this._isInExceptionGroup = wasInExceptionGroup;
1529
+ this._isInFinallyBlock = wasInFinallyBlock;
1530
+ this._isInFinallyLoop = wasInFinallyLoop;
1498
1531
  const functionNode = parseNodes_1.FunctionNode.create(defToken, parseNodes_1.NameNode.create(nameToken), suite, typeParameters);
1499
1532
  if (asyncToken) {
1500
1533
  functionNode.d.isAsync = true;
@@ -1929,6 +1962,9 @@ class Parser {
1929
1962
  else if (this._isInExceptionGroup) {
1930
1963
  this._addSyntaxError(localize_1.LocMessage.breakInExceptionGroup(), breakToken);
1931
1964
  }
1965
+ if (this._isInFinallyLoop && pythonVersion_1.PythonVersion.isGreaterOrEqualTo(this._getLanguageVersion(), pythonVersion_1.pythonVersion3_14)) {
1966
+ this._addSyntaxError(localize_1.LocMessage.finallyBreak(), breakToken);
1967
+ }
1932
1968
  return parseNodes_1.BreakNode.create(breakToken);
1933
1969
  }
1934
1970
  _parseContinueStatement() {
@@ -1939,6 +1975,9 @@ class Parser {
1939
1975
  else if (this._isInExceptionGroup) {
1940
1976
  this._addSyntaxError(localize_1.LocMessage.continueInExceptionGroup(), continueToken);
1941
1977
  }
1978
+ if (this._isInFinallyLoop && pythonVersion_1.PythonVersion.isGreaterOrEqualTo(this._getLanguageVersion(), pythonVersion_1.pythonVersion3_14)) {
1979
+ this._addSyntaxError(localize_1.LocMessage.finallyContinue(), continueToken);
1980
+ }
1942
1981
  return parseNodes_1.ContinueNode.create(continueToken);
1943
1982
  }
1944
1983
  // return_stmt: 'return' [testlist]
@@ -1951,6 +1990,9 @@ class Parser {
1951
1990
  else if (this._isInExceptionGroup) {
1952
1991
  this._addSyntaxError(localize_1.LocMessage.returnInExceptionGroup(), returnToken);
1953
1992
  }
1993
+ if (this._isInFinallyBlock && pythonVersion_1.PythonVersion.isGreaterOrEqualTo(this._getLanguageVersion(), pythonVersion_1.pythonVersion3_14)) {
1994
+ this._addSyntaxError(localize_1.LocMessage.finallyReturn(), returnToken);
1995
+ }
1954
1996
  if (!this._isNextTokenNeverExpression()) {
1955
1997
  const returnExpr = this._parseTestOrStarListAsExpression(
1956
1998
  /* allowAssignmentExpression */ true,
@@ -3052,8 +3094,7 @@ class Parser {
3052
3094
  return { args: argList, trailingComma };
3053
3095
  }
3054
3096
  // argument: ( test [comp_for] |
3055
- // name '=' test |
3056
- // name '=' |
3097
+ // test '=' test |
3057
3098
  // '**' test |
3058
3099
  // '*' test )
3059
3100
  _parseArgument() {
@@ -3066,34 +3107,16 @@ class Parser {
3066
3107
  argType = 2 /* ArgCategory.UnpackedDictionary */;
3067
3108
  }
3068
3109
  let valueExpr = this._parseTestExpression(/* allowAssignmentExpression */ true);
3069
- let nameNode;
3070
- let isNameSameAsValue = false;
3071
- let assignmentToken;
3110
+ let nameIdentifier;
3072
3111
  if (argType === 0 /* ArgCategory.Simple */) {
3073
- const nextToken = this._peekToken();
3074
3112
  if (this._consumeTokenIfOperator(2 /* OperatorType.Assign */)) {
3075
- assignmentToken = nextToken;
3076
3113
  const nameExpr = valueExpr;
3077
- if (nameExpr.nodeType === 38 /* ParseNodeType.Name */ &&
3078
- (this._peekTokenType() === 12 /* TokenType.Comma */ || this._peekTokenType() === 14 /* TokenType.CloseParenthesis */)) {
3079
- nameNode = parseNodes_1.NameNode.create(nameExpr.d.token);
3080
- if (pythonVersion_1.PythonVersion.isLessThan(this._getLanguageVersion(), pythonVersion_1.pythonVersion3_14)) {
3081
- this._addSyntaxError(localize_1.LocMessage.keywordArgShortcutIllegal(), assignmentToken);
3082
- valueExpr = parseNodes_1.ErrorNode.create(assignmentToken, 14 /* ErrorExpressionCategory.MissingKeywordArgValue */);
3083
- }
3084
- else {
3085
- valueExpr = parseNodes_1.NameNode.create(nameExpr.d.token);
3086
- isNameSameAsValue = true;
3087
- }
3114
+ valueExpr = this._parseTestExpression(/* allowAssignmentExpression */ false);
3115
+ if (nameExpr.nodeType === 38 /* ParseNodeType.Name */) {
3116
+ nameIdentifier = nameExpr.d.token;
3088
3117
  }
3089
3118
  else {
3090
- valueExpr = this._parseTestExpression(/* allowAssignmentExpression */ false);
3091
- if (nameExpr.nodeType === 38 /* ParseNodeType.Name */) {
3092
- nameNode = parseNodes_1.NameNode.create(nameExpr.d.token);
3093
- }
3094
- else {
3095
- this._addSyntaxError(localize_1.LocMessage.expectedParamName(), nameExpr);
3096
- }
3119
+ this._addSyntaxError(localize_1.LocMessage.expectedParamName(), nameExpr);
3097
3120
  }
3098
3121
  }
3099
3122
  else {
@@ -3104,13 +3127,9 @@ class Parser {
3104
3127
  }
3105
3128
  }
3106
3129
  const argNode = parseNodes_1.ArgumentNode.create(firstToken, valueExpr, argType);
3107
- if (nameNode) {
3108
- argNode.d.name = nameNode;
3109
- argNode.d.isNameSameAsValue = isNameSameAsValue;
3130
+ if (nameIdentifier) {
3131
+ argNode.d.name = parseNodes_1.NameNode.create(nameIdentifier);
3110
3132
  argNode.d.name.parent = argNode;
3111
- if (assignmentToken) {
3112
- (0, parseNodes_1.extendRange)(argNode, assignmentToken);
3113
- }
3114
3133
  }
3115
3134
  return argNode;
3116
3135
  }
@@ -3657,6 +3676,20 @@ class Parser {
3657
3676
  if (stringToken.flags & 16 /* StringTokenFlags.Unicode */) {
3658
3677
  this._addSyntaxError(localize_1.LocMessage.formatStringUnicode(), stringToken);
3659
3678
  }
3679
+ if (stringToken.flags & 128 /* StringTokenFlags.Template */) {
3680
+ this._addSyntaxError(localize_1.LocMessage.formatStringTemplate(), stringToken);
3681
+ }
3682
+ }
3683
+ if (stringToken.flags & 128 /* StringTokenFlags.Template */) {
3684
+ if (pythonVersion_1.PythonVersion.isLessThan(this._getLanguageVersion(), pythonVersion_1.pythonVersion3_14)) {
3685
+ this._addSyntaxError(localize_1.LocMessage.templateStringIllegal(), stringToken);
3686
+ }
3687
+ if (stringToken.flags & 32 /* StringTokenFlags.Bytes */) {
3688
+ this._addSyntaxError(localize_1.LocMessage.templateStringBytes(), stringToken);
3689
+ }
3690
+ if (stringToken.flags & 16 /* StringTokenFlags.Unicode */) {
3691
+ this._addSyntaxError(localize_1.LocMessage.templateStringUnicode(), stringToken);
3692
+ }
3660
3693
  }
3661
3694
  }
3662
3695
  _makeStringNode(stringToken) {
@@ -3674,7 +3707,6 @@ class Parser {
3674
3707
  return undefined;
3675
3708
  }
3676
3709
  const interTokenContents = this._fileContents.slice(curToken.start + curToken.length, nextToken.start);
3677
- const commentRegEx = /^(\s*#\s*type:\s*)([^\r\n]*)/;
3678
3710
  const match = interTokenContents.match(commentRegEx);
3679
3711
  if (!match) {
3680
3712
  return undefined;
@@ -3685,7 +3717,7 @@ class Parser {
3685
3717
  // expression because mypy supports ignore comments of the
3686
3718
  // form ignore[errorCode, ...]. We'll treat these as regular
3687
3719
  // ignore statements (as though no errorCodes were included).
3688
- if (typeString.trim().match(/^ignore(\s|\[|$)/)) {
3720
+ if (typeString.trim().match(ignoreCommentRegEx)) {
3689
3721
  return undefined;
3690
3722
  }
3691
3723
  const tokenOffset = curToken.start + curToken.length + match[1].length;
@@ -3918,7 +3950,11 @@ class Parser {
3918
3950
  this._addSyntaxError(localize_1.LocMessage.annotationStringEscape(), stringNode);
3919
3951
  }
3920
3952
  }
3921
- else if ((stringToken.flags & (8 /* StringTokenFlags.Raw */ | 32 /* StringTokenFlags.Bytes */ | 64 /* StringTokenFlags.Format */)) ===
3953
+ else if ((stringToken.flags &
3954
+ (8 /* StringTokenFlags.Raw */ |
3955
+ 32 /* StringTokenFlags.Bytes */ |
3956
+ 64 /* StringTokenFlags.Format */ |
3957
+ 128 /* StringTokenFlags.Template */)) ===
3922
3958
  0) {
3923
3959
  const parser = new Parser();
3924
3960
  const parseResults = parser.parseTextExpression(this._fileContents, tokenOffset + prefixLength, unescapedString.length, this._parseOptions, 1 /* ParseTextMode.VariableAnnotation */, (stringNode.d.strings[0].d.token.flags & 4 /* StringTokenFlags.Triplicate */) !== 0 ? 1 : 0, this._typingSymbolAliases);