@zzzen/pyright-internal 1.2.0-dev.20240714 → 1.2.0-dev.20240728

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 (225) hide show
  1. package/dist/analyzer/analyzerNodeInfo.js +2 -2
  2. package/dist/analyzer/analyzerNodeInfo.js.map +1 -1
  3. package/dist/analyzer/binder.js +8 -8
  4. package/dist/analyzer/binder.js.map +1 -1
  5. package/dist/analyzer/cacheManager.js +3 -0
  6. package/dist/analyzer/cacheManager.js.map +1 -1
  7. package/dist/analyzer/checker.d.ts +3 -2
  8. package/dist/analyzer/checker.js +137 -142
  9. package/dist/analyzer/checker.js.map +1 -1
  10. package/dist/analyzer/codeFlowEngine.d.ts +2 -2
  11. package/dist/analyzer/codeFlowEngine.js +74 -44
  12. package/dist/analyzer/codeFlowEngine.js.map +1 -1
  13. package/dist/analyzer/codeFlowTypes.js +1 -1
  14. package/dist/analyzer/codeFlowTypes.js.map +1 -1
  15. package/dist/analyzer/constraintSolver.d.ts +2 -2
  16. package/dist/analyzer/constraintSolver.js +166 -206
  17. package/dist/analyzer/constraintSolver.js.map +1 -1
  18. package/dist/analyzer/constructorTransform.d.ts +2 -3
  19. package/dist/analyzer/constructorTransform.js +18 -19
  20. package/dist/analyzer/constructorTransform.js.map +1 -1
  21. package/dist/analyzer/constructors.d.ts +3 -3
  22. package/dist/analyzer/constructors.js +72 -175
  23. package/dist/analyzer/constructors.js.map +1 -1
  24. package/dist/analyzer/dataClasses.d.ts +2 -2
  25. package/dist/analyzer/dataClasses.js +60 -40
  26. package/dist/analyzer/dataClasses.js.map +1 -1
  27. package/dist/analyzer/declaration.d.ts +9 -9
  28. package/dist/analyzer/declaration.js +9 -9
  29. package/dist/analyzer/declaration.js.map +1 -1
  30. package/dist/analyzer/declarationUtils.d.ts +1 -1
  31. package/dist/analyzer/declarationUtils.js +6 -6
  32. package/dist/analyzer/declarationUtils.js.map +1 -1
  33. package/dist/analyzer/decorators.js +5 -6
  34. package/dist/analyzer/decorators.js.map +1 -1
  35. package/dist/analyzer/docStringConversion.js +2 -2
  36. package/dist/analyzer/docStringConversion.js.map +1 -1
  37. package/dist/analyzer/enums.d.ts +2 -2
  38. package/dist/analyzer/enums.js +6 -6
  39. package/dist/analyzer/enums.js.map +1 -1
  40. package/dist/analyzer/functionTransform.d.ts +2 -2
  41. package/dist/analyzer/functionTransform.js +4 -4
  42. package/dist/analyzer/functionTransform.js.map +1 -1
  43. package/dist/analyzer/importResolver.js +5 -3
  44. package/dist/analyzer/importResolver.js.map +1 -1
  45. package/dist/analyzer/namedTuples.d.ts +3 -3
  46. package/dist/analyzer/namedTuples.js +21 -22
  47. package/dist/analyzer/namedTuples.js.map +1 -1
  48. package/dist/analyzer/operations.js +145 -96
  49. package/dist/analyzer/operations.js.map +1 -1
  50. package/dist/analyzer/packageTypeVerifier.js +8 -8
  51. package/dist/analyzer/packageTypeVerifier.js.map +1 -1
  52. package/dist/analyzer/parameterUtils.d.ts +10 -10
  53. package/dist/analyzer/parameterUtils.js +60 -59
  54. package/dist/analyzer/parameterUtils.js.map +1 -1
  55. package/dist/analyzer/parseTreeUtils.d.ts +7 -6
  56. package/dist/analyzer/parseTreeUtils.js +47 -24
  57. package/dist/analyzer/parseTreeUtils.js.map +1 -1
  58. package/dist/analyzer/patternMatching.js +109 -90
  59. package/dist/analyzer/patternMatching.js.map +1 -1
  60. package/dist/analyzer/program.js +11 -4
  61. package/dist/analyzer/program.js.map +1 -1
  62. package/dist/analyzer/properties.js +23 -19
  63. package/dist/analyzer/properties.js.map +1 -1
  64. package/dist/analyzer/protocols.js +23 -20
  65. package/dist/analyzer/protocols.js.map +1 -1
  66. package/dist/analyzer/pythonPathUtils.js +1 -1
  67. package/dist/analyzer/pythonPathUtils.js.map +1 -1
  68. package/dist/analyzer/service.d.ts +3 -7
  69. package/dist/analyzer/service.js +28 -30
  70. package/dist/analyzer/service.js.map +1 -1
  71. package/dist/analyzer/serviceUtils.d.ts +8 -0
  72. package/dist/analyzer/serviceUtils.js +31 -0
  73. package/dist/analyzer/serviceUtils.js.map +1 -0
  74. package/dist/analyzer/sourceFile.js +5 -19
  75. package/dist/analyzer/sourceFile.js.map +1 -1
  76. package/dist/analyzer/sourceMapper.d.ts +1 -1
  77. package/dist/analyzer/sourceMapper.js +4 -4
  78. package/dist/analyzer/sourceMapper.js.map +1 -1
  79. package/dist/analyzer/staticExpressions.js +1 -1
  80. package/dist/analyzer/staticExpressions.js.map +1 -1
  81. package/dist/analyzer/testWalker.js +13 -1
  82. package/dist/analyzer/testWalker.js.map +1 -1
  83. package/dist/analyzer/tracePrinter.js +4 -4
  84. package/dist/analyzer/tracePrinter.js.map +1 -1
  85. package/dist/analyzer/tuples.d.ts +9 -0
  86. package/dist/analyzer/tuples.js +252 -0
  87. package/dist/analyzer/tuples.js.map +1 -0
  88. package/dist/analyzer/typeComplexity.d.ts +2 -0
  89. package/dist/analyzer/typeComplexity.js +86 -0
  90. package/dist/analyzer/typeComplexity.js.map +1 -0
  91. package/dist/analyzer/typeEvaluator.js +1721 -1824
  92. package/dist/analyzer/typeEvaluator.js.map +1 -1
  93. package/dist/analyzer/typeEvaluatorTypes.d.ts +47 -40
  94. package/dist/analyzer/typeEvaluatorTypes.js +10 -1
  95. package/dist/analyzer/typeEvaluatorTypes.js.map +1 -1
  96. package/dist/analyzer/typeGuards.js +116 -90
  97. package/dist/analyzer/typeGuards.js.map +1 -1
  98. package/dist/analyzer/typePrinter.d.ts +1 -1
  99. package/dist/analyzer/typePrinter.js +54 -53
  100. package/dist/analyzer/typePrinter.js.map +1 -1
  101. package/dist/analyzer/typeStubWriter.d.ts +3 -3
  102. package/dist/analyzer/typeStubWriter.js +15 -15
  103. package/dist/analyzer/typeStubWriter.js.map +1 -1
  104. package/dist/analyzer/typeUtils.d.ts +35 -29
  105. package/dist/analyzer/typeUtils.js +420 -357
  106. package/dist/analyzer/typeUtils.js.map +1 -1
  107. package/dist/analyzer/typeVarContext.d.ts +24 -36
  108. package/dist/analyzer/typeVarContext.js +89 -193
  109. package/dist/analyzer/typeVarContext.js.map +1 -1
  110. package/dist/analyzer/typeWalker.js +4 -4
  111. package/dist/analyzer/typeWalker.js.map +1 -1
  112. package/dist/analyzer/typedDicts.d.ts +2 -2
  113. package/dist/analyzer/typedDicts.js +49 -53
  114. package/dist/analyzer/typedDicts.js.map +1 -1
  115. package/dist/analyzer/types.d.ts +89 -63
  116. package/dist/analyzer/types.js +163 -120
  117. package/dist/analyzer/types.js.map +1 -1
  118. package/dist/commands/dumpFileDebugInfoCommand.js +12 -12
  119. package/dist/commands/dumpFileDebugInfoCommand.js.map +1 -1
  120. package/dist/common/configOptions.d.ts +1 -0
  121. package/dist/common/configOptions.js +5 -0
  122. package/dist/common/configOptions.js.map +1 -1
  123. package/dist/common/diagnosticRules.d.ts +1 -0
  124. package/dist/common/diagnosticRules.js +1 -0
  125. package/dist/common/diagnosticRules.js.map +1 -1
  126. package/dist/common/fileSystem.d.ts +0 -1
  127. package/dist/common/fileSystem.js.map +1 -1
  128. package/dist/common/languageServerInterface.d.ts +13 -0
  129. package/dist/common/languageServerInterface.js +15 -1
  130. package/dist/common/languageServerInterface.js.map +1 -1
  131. package/dist/common/lspUtils.js +2 -2
  132. package/dist/common/memUtils.d.ts +4 -0
  133. package/dist/common/memUtils.js +33 -2
  134. package/dist/common/memUtils.js.map +1 -1
  135. package/dist/common/serviceKeys.d.ts +3 -0
  136. package/dist/common/serviceKeys.js +2 -0
  137. package/dist/common/serviceKeys.js.map +1 -1
  138. package/dist/common/serviceProviderExtensions.js +7 -0
  139. package/dist/common/serviceProviderExtensions.js.map +1 -1
  140. package/dist/languageServerBase.d.ts +4 -3
  141. package/dist/languageServerBase.js +14 -10
  142. package/dist/languageServerBase.js.map +1 -1
  143. package/dist/languageService/autoImporter.d.ts +3 -2
  144. package/dist/languageService/autoImporter.js +5 -1
  145. package/dist/languageService/autoImporter.js.map +1 -1
  146. package/dist/languageService/completionProvider.d.ts +5 -3
  147. package/dist/languageService/completionProvider.js +38 -37
  148. package/dist/languageService/completionProvider.js.map +1 -1
  149. package/dist/languageService/completionProviderUtils.d.ts +1 -1
  150. package/dist/languageService/completionProviderUtils.js +3 -3
  151. package/dist/languageService/completionProviderUtils.js.map +1 -1
  152. package/dist/languageService/fileWatcherDynamicFeature.js +2 -2
  153. package/dist/languageService/fileWatcherDynamicFeature.js.map +1 -1
  154. package/dist/languageService/hoverProvider.js +14 -6
  155. package/dist/languageService/hoverProvider.js.map +1 -1
  156. package/dist/languageService/referencesProvider.d.ts +10 -4
  157. package/dist/languageService/referencesProvider.js +24 -12
  158. package/dist/languageService/referencesProvider.js.map +1 -1
  159. package/dist/languageService/renameProvider.js +21 -4
  160. package/dist/languageService/renameProvider.js.map +1 -1
  161. package/dist/languageService/signatureHelpProvider.js +1 -1
  162. package/dist/languageService/signatureHelpProvider.js.map +1 -1
  163. package/dist/languageService/tooltipUtils.js +3 -3
  164. package/dist/languageService/tooltipUtils.js.map +1 -1
  165. package/dist/localization/localize.d.ts +9 -3
  166. package/dist/localization/localize.js +8 -1
  167. package/dist/localization/localize.js.map +1 -1
  168. package/dist/localization/package.nls.cs.json +5 -2
  169. package/dist/localization/package.nls.de.json +5 -2
  170. package/dist/localization/package.nls.en-us.json +7 -1
  171. package/dist/localization/package.nls.es.json +5 -2
  172. package/dist/localization/package.nls.fr.json +5 -2
  173. package/dist/localization/package.nls.it.json +5 -2
  174. package/dist/localization/package.nls.ja.json +5 -2
  175. package/dist/localization/package.nls.ko.json +5 -2
  176. package/dist/localization/package.nls.pl.json +5 -2
  177. package/dist/localization/package.nls.pt-br.json +5 -2
  178. package/dist/localization/package.nls.qps-ploc.json +5 -2
  179. package/dist/localization/package.nls.ru.json +5 -2
  180. package/dist/localization/package.nls.tr.json +5 -2
  181. package/dist/localization/package.nls.zh-cn.json +5 -2
  182. package/dist/localization/package.nls.zh-tw.json +5 -2
  183. package/dist/parser/parseNodes.d.ts +12 -10
  184. package/dist/parser/parseNodes.js +23 -21
  185. package/dist/parser/parseNodes.js.map +1 -1
  186. package/dist/parser/parser.js +66 -43
  187. package/dist/parser/parser.js.map +1 -1
  188. package/dist/tests/checker.test.js +2 -2
  189. package/dist/tests/fourslash/rename.args.fourslash.d.ts +1 -0
  190. package/dist/tests/fourslash/rename.args.fourslash.js +71 -0
  191. package/dist/tests/fourslash/rename.args.fourslash.js.map +1 -0
  192. package/dist/tests/fourslash/signature.builtinDocstrings.fourslash.js +4 -21
  193. package/dist/tests/fourslash/signature.builtinDocstrings.fourslash.js.map +1 -1
  194. package/dist/tests/fourslash/signature.complicated.fourslash.js +1 -1
  195. package/dist/tests/fourslash/signature.complicated.fourslash.js.map +1 -1
  196. package/dist/tests/harness/fourslash/fourSlashParser.js +1 -1
  197. package/dist/tests/harness/fourslash/fourSlashParser.js.map +1 -1
  198. package/dist/tests/harness/fourslash/testStateUtils.js +2 -2
  199. package/dist/tests/harness/fourslash/testStateUtils.js.map +1 -1
  200. package/dist/tests/harness/vfs/filesystem.d.ts +0 -1
  201. package/dist/tests/harness/vfs/filesystem.js +0 -4
  202. package/dist/tests/harness/vfs/filesystem.js.map +1 -1
  203. package/dist/tests/importResolver.test.js +62 -15
  204. package/dist/tests/importResolver.test.js.map +1 -1
  205. package/dist/tests/lsp/languageServerTestUtils.js +1 -1
  206. package/dist/tests/lsp/languageServerTestUtils.js.map +1 -1
  207. package/dist/tests/typeEvaluator1.test.js +17 -0
  208. package/dist/tests/typeEvaluator1.test.js.map +1 -1
  209. package/dist/tests/typeEvaluator2.test.js +4 -0
  210. package/dist/tests/typeEvaluator2.test.js.map +1 -1
  211. package/dist/tests/typeEvaluator3.test.js +1 -1
  212. package/dist/tests/typeEvaluator4.test.js +19 -7
  213. package/dist/tests/typeEvaluator4.test.js.map +1 -1
  214. package/dist/tests/typeEvaluator5.test.js +8 -2
  215. package/dist/tests/typeEvaluator5.test.js.map +1 -1
  216. package/dist/tests/typeEvaluator6.test.js +76 -60
  217. package/dist/tests/typeEvaluator6.test.js.map +1 -1
  218. package/dist/tests/typeEvaluator7.test.js +5 -1
  219. package/dist/tests/typeEvaluator7.test.js.map +1 -1
  220. package/dist/tests/typePrinter.test.js +13 -18
  221. package/dist/tests/typePrinter.test.js.map +1 -1
  222. package/dist/workspaceFactory.d.ts +3 -2
  223. package/dist/workspaceFactory.js +15 -2
  224. package/dist/workspaceFactory.js.map +1 -1
  225. package/package.json +1 -1
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ /*
3
+ * tuples.ts
4
+ * Copyright (c) Microsoft Corporation.
5
+ * Licensed under the MIT license.
6
+ * Author: Eric Traut
7
+ *
8
+ * Provides special-case logic for type analysis of tuples.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.getSlicedTupleType = exports.adjustTupleTypeArgs = exports.assignTupleTypeArgs = void 0;
12
+ const localize_1 = require("../localization/localize");
13
+ const types_1 = require("./types");
14
+ const typeUtils_1 = require("./typeUtils");
15
+ // Assigns the source type arguments to the dest type arguments. It assumed
16
+ // the the caller has already verified that both the dest and source are
17
+ // tuple classes.
18
+ function assignTupleTypeArgs(evaluator, destType, srcType, diag, destTypeVarContext, srcTypeVarContext, flags, recursionCount) {
19
+ var _a, _b;
20
+ const destTypeArgs = [...((_a = destType.priv.tupleTypeArgs) !== null && _a !== void 0 ? _a : [])];
21
+ const srcTypeArgs = [...((_b = srcType.priv.tupleTypeArgs) !== null && _b !== void 0 ? _b : [])];
22
+ if (adjustTupleTypeArgs(evaluator, destTypeArgs, srcTypeArgs, flags)) {
23
+ for (let argIndex = 0; argIndex < srcTypeArgs.length; argIndex++) {
24
+ const entryDiag = diag === null || diag === void 0 ? void 0 : diag.createAddendum();
25
+ const destArgType = destTypeArgs[argIndex].type;
26
+ const srcArgType = srcTypeArgs[argIndex].type;
27
+ // Handle the special case where the dest is a TypeVarTuple
28
+ // and the source is a `*tuple[Any, ...]`. This is allowed.
29
+ if ((0, types_1.isTypeVarTuple)(destArgType) &&
30
+ destArgType.priv.isVariadicUnpacked &&
31
+ !destArgType.priv.isVariadicInUnion &&
32
+ (0, typeUtils_1.isTupleGradualForm)(srcArgType)) {
33
+ return true;
34
+ }
35
+ if (!evaluator.assignType(destArgType, srcArgType, entryDiag === null || entryDiag === void 0 ? void 0 : entryDiag.createAddendum(), destTypeVarContext, srcTypeVarContext, flags, recursionCount)) {
36
+ if (entryDiag) {
37
+ entryDiag.addMessage(localize_1.LocAddendum.tupleEntryTypeMismatch().format({
38
+ entry: argIndex + 1,
39
+ }));
40
+ }
41
+ return false;
42
+ }
43
+ }
44
+ }
45
+ else {
46
+ const isDestIndeterminate = destTypeArgs.some((t) => t.isUnbounded || (0, types_1.isTypeVarTuple)(t.type));
47
+ if (srcTypeArgs.some((t) => t.isUnbounded || (0, types_1.isTypeVarTuple)(t.type))) {
48
+ if (isDestIndeterminate) {
49
+ diag === null || diag === void 0 ? void 0 : diag.addMessage(localize_1.LocAddendum.tupleSizeIndeterminateSrcDest().format({
50
+ expected: destTypeArgs.length - 1,
51
+ }));
52
+ }
53
+ else {
54
+ diag === null || diag === void 0 ? void 0 : diag.addMessage(localize_1.LocAddendum.tupleSizeIndeterminateSrc().format({
55
+ expected: destTypeArgs.length,
56
+ }));
57
+ }
58
+ }
59
+ else {
60
+ if (isDestIndeterminate) {
61
+ diag === null || diag === void 0 ? void 0 : diag.addMessage(localize_1.LocAddendum.tupleSizeMismatchIndeterminateDest().format({
62
+ expected: destTypeArgs.length - 1,
63
+ received: srcTypeArgs.length,
64
+ }));
65
+ }
66
+ else {
67
+ diag === null || diag === void 0 ? void 0 : diag.addMessage(localize_1.LocAddendum.tupleSizeMismatch().format({
68
+ expected: destTypeArgs.length,
69
+ received: srcTypeArgs.length,
70
+ }));
71
+ }
72
+ }
73
+ return false;
74
+ }
75
+ return true;
76
+ }
77
+ exports.assignTupleTypeArgs = assignTupleTypeArgs;
78
+ // Adjusts the source and/or dest type arguments list to attempt to match
79
+ // the length of the src type arguments list if the dest or source contain
80
+ // entries with indeterminate length or variadic entries. It returns true
81
+ // if the source is potentially compatible with the dest type, false otherwise.
82
+ function adjustTupleTypeArgs(evaluator, destTypeArgs, srcTypeArgs, flags) {
83
+ const destUnboundedOrVariadicIndex = destTypeArgs.findIndex((t) => t.isUnbounded || (0, types_1.isTypeVarTuple)(t.type));
84
+ const srcUnboundedIndex = srcTypeArgs.findIndex((t) => t.isUnbounded);
85
+ const srcVariadicIndex = srcTypeArgs.findIndex((t) => (0, types_1.isTypeVarTuple)(t.type));
86
+ if (srcUnboundedIndex >= 0) {
87
+ if ((0, types_1.isAnyOrUnknown)(srcTypeArgs[srcUnboundedIndex].type)) {
88
+ // If the source contains an unbounded Any, expand it to match the dest length.
89
+ const typeToReplicate = srcTypeArgs.length > 0 ? srcTypeArgs[srcUnboundedIndex].type : types_1.AnyType.create();
90
+ while (srcTypeArgs.length < destTypeArgs.length) {
91
+ srcTypeArgs.splice(srcUnboundedIndex, 0, { type: typeToReplicate, isUnbounded: true });
92
+ }
93
+ if (srcTypeArgs.length > destTypeArgs.length) {
94
+ srcTypeArgs.splice(srcUnboundedIndex, 1);
95
+ }
96
+ }
97
+ else if (destUnboundedOrVariadicIndex < 0) {
98
+ // If the source contains an unbounded type but the dest does not, it's incompatible.
99
+ return false;
100
+ }
101
+ }
102
+ // If the dest contains an unbounded Any, expand it to match the source length.
103
+ if (destUnboundedOrVariadicIndex >= 0 &&
104
+ destTypeArgs[destUnboundedOrVariadicIndex].isUnbounded &&
105
+ (0, types_1.isAnyOrUnknown)(destTypeArgs[destUnboundedOrVariadicIndex].type)) {
106
+ while (destTypeArgs.length < srcTypeArgs.length) {
107
+ destTypeArgs.splice(destUnboundedOrVariadicIndex, 0, destTypeArgs[destUnboundedOrVariadicIndex]);
108
+ }
109
+ }
110
+ // Remove any optional parameters from the end of the two lists until the lengths match.
111
+ while (srcTypeArgs.length > destTypeArgs.length && srcTypeArgs[srcTypeArgs.length - 1].isOptional) {
112
+ srcTypeArgs.splice(srcTypeArgs.length - 1, 1);
113
+ }
114
+ while (destTypeArgs.length > srcTypeArgs.length && destTypeArgs[destTypeArgs.length - 1].isOptional) {
115
+ destTypeArgs.splice(destTypeArgs.length - 1, 1);
116
+ }
117
+ const srcArgsToCapture = srcTypeArgs.length - destTypeArgs.length + 1;
118
+ let skipAdjustSrc = false;
119
+ // If we're doing reverse type mappings and the source contains a variadic
120
+ // TypeVar, we need to adjust the dest so the reverse type mapping assignment
121
+ // can be performed.
122
+ if ((flags & 2 /* AssignTypeFlags.ReverseTypeVarMatching */) !== 0) {
123
+ const destArgsToCapture = destTypeArgs.length - srcTypeArgs.length + 1;
124
+ if (srcVariadicIndex >= 0 && destArgsToCapture >= 0) {
125
+ // If the only removed arg from the dest type args is itself a variadic,
126
+ // don't bother adjusting it.
127
+ const skipAdjustment = destArgsToCapture === 1 && (0, types_1.isTypeVarTuple)(destTypeArgs[srcVariadicIndex].type);
128
+ const tupleClass = evaluator.getTupleClassType();
129
+ if (!skipAdjustment && tupleClass && (0, types_1.isInstantiableClass)(tupleClass)) {
130
+ const removedArgs = destTypeArgs.splice(srcVariadicIndex, destArgsToCapture);
131
+ // Package up the remaining type arguments into a tuple object.
132
+ const variadicTuple = types_1.ClassType.cloneAsInstance((0, typeUtils_1.specializeTupleClass)(tupleClass, removedArgs.map((typeArg) => {
133
+ return {
134
+ type: typeArg.type,
135
+ isUnbounded: typeArg.isUnbounded,
136
+ isOptional: typeArg.isOptional,
137
+ };
138
+ }),
139
+ /* isTypeArgExplicit */ true,
140
+ /* isUnpackedTuple */ true));
141
+ destTypeArgs.splice(srcVariadicIndex, 0, {
142
+ type: variadicTuple,
143
+ isUnbounded: false,
144
+ });
145
+ }
146
+ skipAdjustSrc = true;
147
+ }
148
+ }
149
+ else {
150
+ if (destUnboundedOrVariadicIndex >= 0 && srcArgsToCapture >= 0) {
151
+ // If the dest contains a variadic element, determine which source
152
+ // args map to this element and package them up into an unpacked tuple.
153
+ if ((0, types_1.isTypeVarTuple)(destTypeArgs[destUnboundedOrVariadicIndex].type)) {
154
+ const tupleClass = evaluator.getTupleClassType();
155
+ if (tupleClass && (0, types_1.isInstantiableClass)(tupleClass)) {
156
+ const removedArgs = srcTypeArgs.splice(destUnboundedOrVariadicIndex, srcArgsToCapture);
157
+ let variadicTuple;
158
+ // If we're left with a single unpacked variadic type var, there's no
159
+ // need to wrap it in a nested tuple.
160
+ if (removedArgs.length === 1 && (0, types_1.isUnpackedTypeVarTuple)(removedArgs[0].type)) {
161
+ variadicTuple = removedArgs[0].type;
162
+ }
163
+ else {
164
+ // Package up the remaining type arguments into a tuple object.
165
+ variadicTuple = types_1.ClassType.cloneAsInstance((0, typeUtils_1.specializeTupleClass)(tupleClass, removedArgs.map((typeArg) => {
166
+ return {
167
+ type: typeArg.type,
168
+ isUnbounded: typeArg.isUnbounded,
169
+ isOptional: typeArg.isOptional,
170
+ };
171
+ }),
172
+ /* isTypeArgExplicit */ true,
173
+ /* isUnpackedTuple */ true));
174
+ }
175
+ srcTypeArgs.splice(destUnboundedOrVariadicIndex, 0, {
176
+ type: variadicTuple,
177
+ isUnbounded: false,
178
+ });
179
+ }
180
+ skipAdjustSrc = true;
181
+ }
182
+ }
183
+ }
184
+ if (!skipAdjustSrc && destUnboundedOrVariadicIndex >= 0 && srcArgsToCapture >= 0) {
185
+ // If possible, package up the source entries that correspond to
186
+ // the dest unbounded tuple. This isn't possible if the source contains
187
+ // an unbounded tuple outside of this range.
188
+ if (srcUnboundedIndex < 0 ||
189
+ (srcUnboundedIndex >= destUnboundedOrVariadicIndex &&
190
+ srcUnboundedIndex < destUnboundedOrVariadicIndex + srcArgsToCapture)) {
191
+ const removedArgTypes = srcTypeArgs.splice(destUnboundedOrVariadicIndex, srcArgsToCapture).map((t) => {
192
+ if ((0, types_1.isTypeVar)(t.type) && (0, types_1.isUnpackedTypeVarTuple)(t.type) && !t.type.priv.isVariadicInUnion) {
193
+ return types_1.TypeVarType.cloneForUnpacked(t.type, /* isInUnion */ true);
194
+ }
195
+ return t.type;
196
+ });
197
+ srcTypeArgs.splice(destUnboundedOrVariadicIndex, 0, {
198
+ type: removedArgTypes.length > 0 ? (0, types_1.combineTypes)(removedArgTypes) : types_1.AnyType.create(),
199
+ isUnbounded: false,
200
+ });
201
+ }
202
+ }
203
+ return destTypeArgs.length === srcTypeArgs.length;
204
+ }
205
+ exports.adjustTupleTypeArgs = adjustTupleTypeArgs;
206
+ // Given a tuple type and a slice expression, determines the resulting
207
+ // type if it can be determined. If not, it returns undefined.
208
+ function getSlicedTupleType(evaluator, tupleType, sliceNode) {
209
+ // We don't handle step values.
210
+ if (sliceNode.d.stepValue || !tupleType.priv.tupleTypeArgs) {
211
+ return undefined;
212
+ }
213
+ const tupleTypeArgs = tupleType.priv.tupleTypeArgs;
214
+ const startValue = getTupleSliceParam(evaluator, sliceNode.d.startValue, 0, tupleTypeArgs);
215
+ const endValue = getTupleSliceParam(evaluator, sliceNode.d.endValue, tupleTypeArgs.length, tupleTypeArgs);
216
+ if (startValue === undefined || endValue === undefined || endValue < startValue) {
217
+ return undefined;
218
+ }
219
+ const slicedTypeArgs = tupleTypeArgs.slice(startValue, endValue);
220
+ return types_1.ClassType.cloneAsInstance((0, typeUtils_1.specializeTupleClass)(tupleType, slicedTypeArgs));
221
+ }
222
+ exports.getSlicedTupleType = getSlicedTupleType;
223
+ function getTupleSliceParam(evaluator, expression, defaultValue, tupleTypeArgs) {
224
+ let value = defaultValue;
225
+ if (expression) {
226
+ const valType = evaluator.getTypeOfExpression(expression).type;
227
+ if (!(0, types_1.isClassInstance)(valType) || !types_1.ClassType.isBuiltIn(valType, 'int') || !(0, typeUtils_1.isLiteralType)(valType)) {
228
+ return undefined;
229
+ }
230
+ value = valType.priv.literalValue;
231
+ const unboundedIndex = tupleTypeArgs.findIndex((typeArg) => typeArg.isUnbounded || (0, types_1.isTypeVarTuple)(typeArg.type));
232
+ if (value < 0) {
233
+ value = tupleTypeArgs.length + value;
234
+ if (unboundedIndex >= 0 && value <= unboundedIndex) {
235
+ return undefined;
236
+ }
237
+ else if (value < 0) {
238
+ return 0;
239
+ }
240
+ }
241
+ else {
242
+ if (unboundedIndex >= 0 && value > unboundedIndex) {
243
+ return undefined;
244
+ }
245
+ else if (value > tupleTypeArgs.length) {
246
+ return tupleTypeArgs.length;
247
+ }
248
+ }
249
+ }
250
+ return value;
251
+ }
252
+ //# sourceMappingURL=tuples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuples.js","sourceRoot":"","sources":["../../../../../src/analyzer/tuples.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Type } from './types';
2
+ export declare function getComplexityScoreForType(type: Type, recursionCount?: number): number;
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ /*
3
+ * typeComplexity.ts
4
+ * Copyright (c) Microsoft Corporation.
5
+ * Licensed under the MIT license.
6
+ * Author: Eric Traut
7
+ *
8
+ * Routines that compute a "complexity score" for a type. This is used
9
+ * during constraint solving to pick a "best" type when multiple types
10
+ * meet the constraints.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.getComplexityScoreForType = void 0;
14
+ const types_1 = require("./types");
15
+ // Returns a "score" for a type that captures the relative complexity
16
+ // of the type. Scores should all be between 0 and 1 where 0 means
17
+ // very simple and 1 means complex. This is a heuristic, so there's
18
+ // often no objectively correct answer.
19
+ function getComplexityScoreForType(type, recursionCount = 0) {
20
+ if (recursionCount > types_1.maxTypeRecursionCount) {
21
+ return 1;
22
+ }
23
+ recursionCount++;
24
+ switch (type.category) {
25
+ case 1 /* TypeCategory.Unknown */:
26
+ case 2 /* TypeCategory.Any */:
27
+ case 9 /* TypeCategory.TypeVar */: {
28
+ return 0.5;
29
+ }
30
+ case 4 /* TypeCategory.Function */:
31
+ case 5 /* TypeCategory.OverloadedFunction */: {
32
+ // Classes and unions should be preferred over functions,
33
+ // so make this relatively high (more than 0.75).
34
+ return 0.8;
35
+ }
36
+ case 0 /* TypeCategory.Unbound */:
37
+ case 3 /* TypeCategory.Never */:
38
+ return 1.0;
39
+ case 8 /* TypeCategory.Union */: {
40
+ let maxScore = 0;
41
+ // If this union has a very large number of subtypes, don't bother
42
+ // accurately computing the score. Assume a fixed value.
43
+ if (type.priv.subtypes.length < 16) {
44
+ type.priv.subtypes.forEach((subtype) => {
45
+ const subtypeScore = getComplexityScoreForType(subtype, recursionCount);
46
+ maxScore = Math.max(maxScore, subtypeScore);
47
+ });
48
+ }
49
+ else {
50
+ maxScore = 0.5;
51
+ }
52
+ return maxScore;
53
+ }
54
+ case 6 /* TypeCategory.Class */: {
55
+ return getComplexityScoreForClass(type, recursionCount);
56
+ }
57
+ }
58
+ // For all other types, return a score of 0.
59
+ return 0;
60
+ }
61
+ exports.getComplexityScoreForType = getComplexityScoreForType;
62
+ function getComplexityScoreForClass(classType, recursionCount) {
63
+ let typeArgScoreSum = 0;
64
+ let typeArgCount = 0;
65
+ if (classType.priv.tupleTypeArgs) {
66
+ classType.priv.tupleTypeArgs.forEach((typeArg) => {
67
+ typeArgScoreSum += getComplexityScoreForType(typeArg.type, recursionCount);
68
+ typeArgCount++;
69
+ });
70
+ }
71
+ else if (classType.priv.typeArgs) {
72
+ classType.priv.typeArgs.forEach((type) => {
73
+ typeArgScoreSum += getComplexityScoreForType(type, recursionCount);
74
+ typeArgCount++;
75
+ });
76
+ }
77
+ else if (classType.shared.typeParams) {
78
+ classType.shared.typeParams.forEach((type) => {
79
+ typeArgScoreSum += getComplexityScoreForType(types_1.AnyType.create(), recursionCount);
80
+ typeArgCount++;
81
+ });
82
+ }
83
+ const averageTypeArgComplexity = typeArgCount > 0 ? typeArgScoreSum / typeArgCount : 0;
84
+ return 0.5 + averageTypeArgComplexity * 0.25;
85
+ }
86
+ //# sourceMappingURL=typeComplexity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeComplexity.js","sourceRoot":"","sources":["../../../../../src/analyzer/typeComplexity.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAEH,mCAAwF;AAExF,qEAAqE;AACrE,kEAAkE;AAClE,mEAAmE;AACnE,uCAAuC;AACvC,SAAgB,yBAAyB,CAAC,IAAU,EAAE,cAAc,GAAG,CAAC;IACpE,IAAI,cAAc,GAAG,6BAAqB,EAAE;QACxC,OAAO,CAAC,CAAC;KACZ;IACD,cAAc,EAAE,CAAC;IAEjB,QAAQ,IAAI,CAAC,QAAQ,EAAE;QACnB,kCAA0B;QAC1B,8BAAsB;QACtB,iCAAyB,CAAC,CAAC;YACvB,OAAO,GAAG,CAAC;SACd;QAED,mCAA2B;QAC3B,4CAAoC,CAAC,CAAC;YAClC,yDAAyD;YACzD,iDAAiD;YACjD,OAAO,GAAG,CAAC;SACd;QAED,kCAA0B;QAC1B;YACI,OAAO,GAAG,CAAC;QAEf,+BAAuB,CAAC,CAAC;YACrB,IAAI,QAAQ,GAAG,CAAC,CAAC;YAEjB,kEAAkE;YAClE,wDAAwD;YACxD,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE;gBAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBACnC,MAAM,YAAY,GAAG,yBAAyB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;oBACxE,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;gBAChD,CAAC,CAAC,CAAC;aACN;iBAAM;gBACH,QAAQ,GAAG,GAAG,CAAC;aAClB;YAED,OAAO,QAAQ,CAAC;SACnB;QAED,+BAAuB,CAAC,CAAC;YACrB,OAAO,0BAA0B,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;SAC3D;KACJ;IAED,4CAA4C;IAC5C,OAAO,CAAC,CAAC;AACb,CAAC;AAhDD,8DAgDC;AAED,SAAS,0BAA0B,CAAC,SAAoB,EAAE,cAAsB;IAC5E,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,IAAI,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE;QAC9B,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7C,eAAe,IAAI,yBAAyB,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAC3E,YAAY,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;KACN;SAAM,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE;QAChC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrC,eAAe,IAAI,yBAAyB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YACnE,YAAY,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;KACN;SAAM,IAAI,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE;QACpC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACzC,eAAe,IAAI,yBAAyB,CAAC,eAAO,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC;YAC/E,YAAY,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;KACN;IAED,MAAM,wBAAwB,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,OAAO,GAAG,GAAG,wBAAwB,GAAG,IAAI,CAAC;AACjD,CAAC"}