@alloy-js/python 0.4.0-dev.3 → 0.4.0-dev.6

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 (355) hide show
  1. package/dist/dev/src/builtins/python.js +30 -0
  2. package/dist/dev/src/builtins/python.js.map +1 -0
  3. package/dist/dev/src/components/Atom.js +122 -0
  4. package/dist/dev/src/components/Atom.js.map +1 -0
  5. package/dist/dev/src/components/CallSignature.js +195 -0
  6. package/dist/dev/src/components/CallSignature.js.map +1 -0
  7. package/dist/dev/src/components/ClassDeclaration.js +112 -0
  8. package/dist/dev/src/components/ClassDeclaration.js.map +1 -0
  9. package/dist/dev/src/components/ClassInstantiation.js +40 -0
  10. package/dist/dev/src/components/ClassInstantiation.js.map +1 -0
  11. package/dist/dev/src/components/ClassMethodDeclaration.js +40 -0
  12. package/dist/dev/src/components/ClassMethodDeclaration.js.map +1 -0
  13. package/dist/dev/src/components/ConstructorDeclaration.js +39 -0
  14. package/dist/dev/src/components/ConstructorDeclaration.js.map +1 -0
  15. package/dist/dev/src/components/DataclassDeclaration.js +177 -0
  16. package/dist/dev/src/components/DataclassDeclaration.js.map +1 -0
  17. package/dist/dev/src/components/Declaration.js +31 -0
  18. package/dist/dev/src/components/Declaration.js.map +1 -0
  19. package/dist/dev/src/components/DunderMethodDeclaration.js +33 -0
  20. package/dist/dev/src/components/DunderMethodDeclaration.js.map +1 -0
  21. package/dist/dev/src/components/EnumDeclaration.js +259 -0
  22. package/dist/dev/src/components/EnumDeclaration.js.map +1 -0
  23. package/dist/dev/src/components/EnumMember.js +95 -0
  24. package/dist/dev/src/components/EnumMember.js.map +1 -0
  25. package/dist/dev/src/components/FunctionBase.js +130 -0
  26. package/dist/dev/src/components/FunctionBase.js.map +1 -0
  27. package/dist/dev/src/components/FunctionCallExpression.js +53 -0
  28. package/dist/dev/src/components/FunctionCallExpression.js.map +1 -0
  29. package/dist/dev/src/components/FunctionDeclaration.js +45 -0
  30. package/dist/dev/src/components/FunctionDeclaration.js.map +1 -0
  31. package/dist/dev/src/components/FutureStatement.js +31 -0
  32. package/dist/dev/src/components/FutureStatement.js.map +1 -0
  33. package/dist/dev/src/components/ImportStatement.js +167 -0
  34. package/dist/dev/src/components/ImportStatement.js.map +1 -0
  35. package/dist/dev/src/components/LexicalScope.js +26 -0
  36. package/dist/dev/src/components/LexicalScope.js.map +1 -0
  37. package/dist/dev/src/components/MemberExpression.js +290 -0
  38. package/dist/dev/src/components/MemberExpression.js.map +1 -0
  39. package/dist/dev/src/components/MemberScope.js +23 -0
  40. package/dist/dev/src/components/MemberScope.js.map +1 -0
  41. package/dist/dev/src/components/MethodBase.js +40 -0
  42. package/dist/dev/src/components/MethodBase.js.map +1 -0
  43. package/dist/dev/src/components/MethodDeclaration.js +38 -0
  44. package/dist/dev/src/components/MethodDeclaration.js.map +1 -0
  45. package/dist/dev/src/components/PropertyDeclaration.js +287 -0
  46. package/dist/dev/src/components/PropertyDeclaration.js.map +1 -0
  47. package/dist/dev/src/components/PyDoc.js +1478 -0
  48. package/dist/dev/src/components/PyDoc.js.map +1 -0
  49. package/dist/dev/src/components/PythonBlock.js +35 -0
  50. package/dist/dev/src/components/PythonBlock.js.map +1 -0
  51. package/dist/dev/src/components/Reference.js +23 -0
  52. package/dist/dev/src/components/Reference.js.map +1 -0
  53. package/dist/dev/src/components/SourceFile.js +385 -0
  54. package/dist/dev/src/components/SourceFile.js.map +1 -0
  55. package/dist/dev/src/components/StatementList.js +34 -0
  56. package/dist/dev/src/components/StatementList.js.map +1 -0
  57. package/dist/dev/src/components/StaticMethodDeclaration.js +40 -0
  58. package/dist/dev/src/components/StaticMethodDeclaration.js.map +1 -0
  59. package/dist/dev/src/components/TypeArguments.js +22 -0
  60. package/dist/dev/src/components/TypeArguments.js.map +1 -0
  61. package/dist/dev/src/components/TypeRefContext.js +33 -0
  62. package/dist/dev/src/components/TypeRefContext.js.map +1 -0
  63. package/dist/dev/src/components/TypeReference.js +67 -0
  64. package/dist/dev/src/components/TypeReference.js.map +1 -0
  65. package/dist/dev/src/components/UnionTypeExpression.js +57 -0
  66. package/dist/dev/src/components/UnionTypeExpression.js.map +1 -0
  67. package/dist/dev/src/components/VariableDeclaration.js +150 -0
  68. package/dist/dev/src/components/VariableDeclaration.js.map +1 -0
  69. package/dist/dev/src/components/index.js +32 -0
  70. package/dist/dev/src/components/index.js.map +1 -0
  71. package/dist/dev/src/context/index.js +2 -0
  72. package/dist/dev/src/context/index.js.map +1 -0
  73. package/dist/dev/src/context/type-ref-context.js +17 -0
  74. package/dist/dev/src/context/type-ref-context.js.map +1 -0
  75. package/dist/dev/src/create-module.js +64 -0
  76. package/dist/dev/src/create-module.js.map +1 -0
  77. package/dist/dev/src/index.js +8 -0
  78. package/dist/dev/src/index.js.map +1 -0
  79. package/dist/dev/src/name-conflict-resolver.js +8 -0
  80. package/dist/dev/src/name-conflict-resolver.js.map +1 -0
  81. package/dist/dev/src/name-policy.js +48 -0
  82. package/dist/dev/src/name-policy.js.map +1 -0
  83. package/dist/dev/src/parameter-descriptor.js +8 -0
  84. package/dist/dev/src/parameter-descriptor.js.map +1 -0
  85. package/dist/dev/src/symbol-creation.js +58 -0
  86. package/dist/dev/src/symbol-creation.js.map +1 -0
  87. package/dist/dev/src/symbols/factories.js +28 -0
  88. package/dist/dev/src/symbols/factories.js.map +1 -0
  89. package/dist/dev/src/symbols/index.js +8 -0
  90. package/dist/dev/src/symbols/index.js.map +1 -0
  91. package/dist/dev/src/symbols/python-lexical-scope.js +15 -0
  92. package/dist/dev/src/symbols/python-lexical-scope.js.map +1 -0
  93. package/dist/dev/src/symbols/python-member-scope.js +7 -0
  94. package/dist/dev/src/symbols/python-member-scope.js.map +1 -0
  95. package/dist/dev/src/symbols/python-module-scope.js +86 -0
  96. package/dist/dev/src/symbols/python-module-scope.js.map +1 -0
  97. package/dist/dev/src/symbols/python-output-symbol.js +73 -0
  98. package/dist/dev/src/symbols/python-output-symbol.js.map +1 -0
  99. package/dist/dev/src/symbols/reference.js +87 -0
  100. package/dist/dev/src/symbols/reference.js.map +1 -0
  101. package/dist/dev/src/symbols/scopes.js +13 -0
  102. package/dist/dev/src/symbols/scopes.js.map +1 -0
  103. package/dist/dev/src/utils.js +13 -0
  104. package/dist/dev/src/utils.js.map +1 -0
  105. package/dist/dev/test/callsignatures.test.js +482 -0
  106. package/dist/dev/test/callsignatures.test.js.map +1 -0
  107. package/dist/dev/test/class-method-declaration.test.js +85 -0
  108. package/dist/dev/test/class-method-declaration.test.js.map +1 -0
  109. package/dist/dev/test/classdeclarations.test.js +654 -0
  110. package/dist/dev/test/classdeclarations.test.js.map +1 -0
  111. package/dist/dev/test/classinstantiations.test.js +281 -0
  112. package/dist/dev/test/classinstantiations.test.js.map +1 -0
  113. package/dist/dev/test/constructordeclaration.test.js +86 -0
  114. package/dist/dev/test/constructordeclaration.test.js.map +1 -0
  115. package/dist/dev/test/dataclassdeclarations.test.js +1068 -0
  116. package/dist/dev/test/dataclassdeclarations.test.js.map +1 -0
  117. package/dist/dev/test/dundermethoddeclaration.test.js +93 -0
  118. package/dist/dev/test/dundermethoddeclaration.test.js.map +1 -0
  119. package/dist/dev/test/enums.test.js +263 -0
  120. package/dist/dev/test/enums.test.js.map +1 -0
  121. package/dist/dev/test/externals.test.js +307 -0
  122. package/dist/dev/test/externals.test.js.map +1 -0
  123. package/dist/dev/test/factories.test.js +122 -0
  124. package/dist/dev/test/factories.test.js.map +1 -0
  125. package/dist/dev/test/functioncallexpressions.test.js +257 -0
  126. package/dist/dev/test/functioncallexpressions.test.js.map +1 -0
  127. package/dist/dev/test/functiondeclaration.test.js +817 -0
  128. package/dist/dev/test/functiondeclaration.test.js.map +1 -0
  129. package/dist/dev/test/imports.test.js +372 -0
  130. package/dist/dev/test/imports.test.js.map +1 -0
  131. package/dist/dev/test/memberexpressions.test.js +1668 -0
  132. package/dist/dev/test/memberexpressions.test.js.map +1 -0
  133. package/dist/dev/test/methoddeclaration.test.js +344 -0
  134. package/dist/dev/test/methoddeclaration.test.js.map +1 -0
  135. package/dist/dev/test/namepolicies.test.js +154 -0
  136. package/dist/dev/test/namepolicies.test.js.map +1 -0
  137. package/dist/dev/test/propertydeclaration.test.js +354 -0
  138. package/dist/dev/test/propertydeclaration.test.js.map +1 -0
  139. package/dist/dev/test/pydocs.test.js +1675 -0
  140. package/dist/dev/test/pydocs.test.js.map +1 -0
  141. package/dist/dev/test/references.test.js +66 -0
  142. package/dist/dev/test/references.test.js.map +1 -0
  143. package/dist/dev/test/sourcefiles.test.js +1802 -0
  144. package/dist/dev/test/sourcefiles.test.js.map +1 -0
  145. package/dist/dev/test/staticmethoddeclaration.test.js +85 -0
  146. package/dist/dev/test/staticmethoddeclaration.test.js.map +1 -0
  147. package/dist/dev/test/type-checking-imports.test.js +617 -0
  148. package/dist/dev/test/type-checking-imports.test.js.map +1 -0
  149. package/dist/dev/test/typereference.test.js +79 -0
  150. package/dist/dev/test/typereference.test.js.map +1 -0
  151. package/dist/dev/test/uniontypeexpression.test.js +307 -0
  152. package/dist/dev/test/uniontypeexpression.test.js.map +1 -0
  153. package/dist/dev/test/utils.js +100 -0
  154. package/dist/dev/test/utils.js.map +1 -0
  155. package/dist/dev/test/values.test.js +182 -0
  156. package/dist/dev/test/values.test.js.map +1 -0
  157. package/dist/dev/test/variables.test.js +363 -0
  158. package/dist/dev/test/variables.test.js.map +1 -0
  159. package/dist/src/components/CallSignature.d.ts.map +1 -1
  160. package/dist/src/components/CallSignature.js +12 -3
  161. package/dist/src/components/CallSignature.js.map +1 -1
  162. package/dist/src/components/ImportStatement.d.ts +12 -0
  163. package/dist/src/components/ImportStatement.d.ts.map +1 -1
  164. package/dist/src/components/ImportStatement.js +45 -3
  165. package/dist/src/components/ImportStatement.js.map +1 -1
  166. package/dist/src/components/Reference.d.ts.map +1 -1
  167. package/dist/src/components/Reference.js +5 -1
  168. package/dist/src/components/Reference.js.map +1 -1
  169. package/dist/src/components/SourceFile.d.ts +1 -1
  170. package/dist/src/components/SourceFile.d.ts.map +1 -1
  171. package/dist/src/components/SourceFile.js +46 -7
  172. package/dist/src/components/SourceFile.js.map +1 -1
  173. package/dist/src/components/TypeRefContext.d.ts +26 -0
  174. package/dist/src/components/TypeRefContext.d.ts.map +1 -0
  175. package/dist/src/components/TypeRefContext.js +29 -0
  176. package/dist/src/components/TypeRefContext.js.map +1 -0
  177. package/dist/src/components/TypeReference.d.ts +5 -0
  178. package/dist/src/components/TypeReference.d.ts.map +1 -1
  179. package/dist/src/components/TypeReference.js +19 -9
  180. package/dist/src/components/TypeReference.js.map +1 -1
  181. package/dist/src/components/VariableDeclaration.d.ts.map +1 -1
  182. package/dist/src/components/VariableDeclaration.js +7 -2
  183. package/dist/src/components/VariableDeclaration.js.map +1 -1
  184. package/dist/src/components/index.d.ts +1 -1
  185. package/dist/src/components/index.d.ts.map +1 -1
  186. package/dist/src/components/index.js +1 -1
  187. package/dist/src/components/index.js.map +1 -1
  188. package/dist/src/context/index.d.ts +2 -0
  189. package/dist/src/context/index.d.ts.map +1 -0
  190. package/dist/src/context/index.js +2 -0
  191. package/dist/src/context/index.js.map +1 -0
  192. package/dist/src/context/type-ref-context.d.ts +13 -0
  193. package/dist/src/context/type-ref-context.d.ts.map +1 -0
  194. package/dist/src/context/type-ref-context.js +17 -0
  195. package/dist/src/context/type-ref-context.js.map +1 -0
  196. package/dist/src/name-conflict-resolver.d.ts +2 -2
  197. package/dist/src/name-conflict-resolver.d.ts.map +1 -1
  198. package/dist/src/name-conflict-resolver.js +2 -2
  199. package/dist/src/name-conflict-resolver.js.map +1 -1
  200. package/dist/src/symbols/python-module-scope.d.ts +13 -1
  201. package/dist/src/symbols/python-module-scope.d.ts.map +1 -1
  202. package/dist/src/symbols/python-module-scope.js +36 -2
  203. package/dist/src/symbols/python-module-scope.js.map +1 -1
  204. package/dist/src/symbols/python-output-symbol.d.ts +11 -0
  205. package/dist/src/symbols/python-output-symbol.d.ts.map +1 -1
  206. package/dist/src/symbols/python-output-symbol.js +26 -2
  207. package/dist/src/symbols/python-output-symbol.js.map +1 -1
  208. package/dist/src/symbols/reference.d.ts +8 -1
  209. package/dist/src/symbols/reference.d.ts.map +1 -1
  210. package/dist/src/symbols/reference.js +4 -2
  211. package/dist/src/symbols/reference.js.map +1 -1
  212. package/dist/test/dataclassdeclarations.test.js +5 -2
  213. package/dist/test/dataclassdeclarations.test.js.map +1 -1
  214. package/dist/test/externals.test.js +8 -2
  215. package/dist/test/externals.test.js.map +1 -1
  216. package/dist/test/functiondeclaration.test.js +6 -3
  217. package/dist/test/functiondeclaration.test.js.map +1 -1
  218. package/dist/test/imports.test.js +3 -3
  219. package/dist/test/imports.test.js.map +1 -1
  220. package/dist/test/references.test.js +1 -1
  221. package/dist/test/references.test.js.map +1 -1
  222. package/dist/test/sourcefiles.test.js +26 -26
  223. package/dist/test/sourcefiles.test.js.map +1 -1
  224. package/dist/test/type-checking-imports.test.d.ts +2 -0
  225. package/dist/test/type-checking-imports.test.d.ts.map +1 -0
  226. package/dist/test/type-checking-imports.test.js +437 -0
  227. package/dist/test/type-checking-imports.test.js.map +1 -0
  228. package/dist/test/uniontypeexpression.test.js +4 -1
  229. package/dist/test/uniontypeexpression.test.js.map +1 -1
  230. package/dist/test/variables.test.js +4 -1
  231. package/dist/test/variables.test.js.map +1 -1
  232. package/dist/tsconfig.tsbuildinfo +1 -1
  233. package/docs/api/components/AttributeDoc.md +36 -0
  234. package/docs/api/components/CallSignature.md +62 -0
  235. package/docs/api/components/CallSignatureParameters.md +49 -0
  236. package/docs/api/components/ClassDeclaration.md +67 -0
  237. package/docs/api/components/ClassDoc.md +55 -0
  238. package/docs/api/components/ClassEnumDeclaration.md +111 -0
  239. package/docs/api/components/ClassInstantiation.md +44 -0
  240. package/docs/api/components/ClassMethodDeclaration.md +31 -0
  241. package/docs/api/components/ConstructorDeclaration.md +27 -0
  242. package/docs/api/components/DataclassDeclaration.md +55 -0
  243. package/docs/api/components/Declaration.md +41 -0
  244. package/docs/api/components/DunderMethodDeclaration.md +31 -0
  245. package/docs/api/components/EnumMember.md +61 -0
  246. package/docs/api/components/ExceptionDoc.md +55 -0
  247. package/docs/api/components/FunctionCallExpression.md +43 -0
  248. package/docs/api/components/FunctionDeclaration.md +50 -0
  249. package/docs/api/components/FunctionDoc.md +61 -0
  250. package/docs/api/components/FunctionalEnumDeclaration.md +79 -0
  251. package/docs/api/components/FutureStatement.md +51 -0
  252. package/docs/api/components/GeneratorDoc.md +58 -0
  253. package/docs/api/components/InlineDoc.md +29 -0
  254. package/docs/api/components/LexicalScope.md +65 -0
  255. package/docs/api/components/MemberExpression.md +53 -0
  256. package/docs/api/components/MemberScope.md +28 -0
  257. package/docs/api/components/MethodDeclaration.md +49 -0
  258. package/docs/api/components/MethodDoc.md +61 -0
  259. package/docs/api/components/ModuleDoc.md +52 -0
  260. package/docs/api/components/PropertyDeclaration.md +46 -0
  261. package/docs/api/components/PropertyDoc.md +52 -0
  262. package/docs/api/components/PyDoc.md +29 -0
  263. package/docs/api/components/PyDocExample.md +29 -0
  264. package/docs/api/components/PythonBlock.md +47 -0
  265. package/docs/api/components/Reference.md +31 -0
  266. package/docs/api/components/SimpleCommentBlock.md +27 -0
  267. package/docs/api/components/SimpleInlineComment.md +27 -0
  268. package/docs/api/components/SourceFile.md +83 -0
  269. package/docs/api/components/StatementList.md +47 -0
  270. package/docs/api/components/StaticMethodDeclaration.md +31 -0
  271. package/docs/api/components/TypeArguments.md +27 -0
  272. package/docs/api/components/TypeRefContext.md +41 -0
  273. package/docs/api/components/TypeReference.md +37 -0
  274. package/docs/api/components/UnionTypeExpression.md +27 -0
  275. package/docs/api/components/VariableDeclaration.md +87 -0
  276. package/docs/api/components/index.md +46 -0
  277. package/docs/api/components/useSourceFile.md +19 -0
  278. package/docs/api/contexts/PythonSourceFile-context.md +18 -0
  279. package/docs/api/contexts/index.md +3 -0
  280. package/docs/api/functions/createFunctionSymbol.md +23 -0
  281. package/docs/api/functions/createMethodSymbol.md +23 -0
  282. package/docs/api/functions/createModule.md +18 -0
  283. package/docs/api/functions/createPythonNamePolicy.md +17 -0
  284. package/docs/api/functions/getCallSignatureProps.md +21 -0
  285. package/docs/api/functions/index.md +13 -0
  286. package/docs/api/functions/isParameterDescriptor.md +18 -0
  287. package/docs/api/functions/isTypeRefContext.md +17 -0
  288. package/docs/api/functions/ref.md +25 -0
  289. package/docs/api/functions/usePythonLexicalScope.md +17 -0
  290. package/docs/api/functions/usePythonNamePolicy.md +17 -0
  291. package/docs/api/functions/usePythonScope.md +17 -0
  292. package/docs/api/index.md +7 -0
  293. package/docs/api/types/AddImportOptions.md +7 -0
  294. package/docs/api/types/BaseDeclarationProps.md +10 -0
  295. package/docs/api/types/CommonFunctionProps.md +15 -0
  296. package/docs/api/types/CreateModuleProps.md +8 -0
  297. package/docs/api/types/CreatePythonSymbolFunctionOptions.md +9 -0
  298. package/docs/api/types/DataclassDecoratorKey.md +5 -0
  299. package/docs/api/types/DataclassDecoratorKwargs.md +5 -0
  300. package/docs/api/types/EnumPropsBase.md +11 -0
  301. package/docs/api/types/GoogleStyleDocAttributeProps.md +9 -0
  302. package/docs/api/types/ImportRecordProps.md +7 -0
  303. package/docs/api/types/ImportRecords.md +8 -0
  304. package/docs/api/types/ImportedSymbol.md +10 -0
  305. package/docs/api/types/LexicalScopeProps.md +5 -0
  306. package/docs/api/types/MemberExpressionPartProps.md +13 -0
  307. package/docs/api/types/ModuleDescriptor.md +7 -0
  308. package/docs/api/types/ModuleRefkeys.md +7 -0
  309. package/docs/api/types/NamedMap.md +7 -0
  310. package/docs/api/types/ParameterDescriptor.md +13 -0
  311. package/docs/api/types/ParameterMarker.md +5 -0
  312. package/docs/api/types/PropertyMethodDeclarationProps.md +9 -0
  313. package/docs/api/types/PythonElements.md +5 -0
  314. package/docs/api/types/PythonLexicalScope.md +11 -0
  315. package/docs/api/types/PythonMemberScope.md +9 -0
  316. package/docs/api/types/PythonModuleScope.md +13 -0
  317. package/docs/api/types/PythonOutputScope.md +5 -0
  318. package/docs/api/types/PythonOutputSymbol.md +21 -0
  319. package/docs/api/types/PythonOutputSymbolOptions.md +10 -0
  320. package/docs/api/types/RefOptions.md +7 -0
  321. package/docs/api/types/SubscriptionProps.md +9 -0
  322. package/docs/api/types/index.md +31 -0
  323. package/docs/api/variables/abcModule.md +7 -0
  324. package/docs/api/variables/dataclassDecoratorKeySet.md +5 -0
  325. package/docs/api/variables/dataclassDecoratorKeys.md +7 -0
  326. package/docs/api/variables/dataclassesModule.md +7 -0
  327. package/docs/api/variables/enumModule.md +7 -0
  328. package/docs/api/variables/index.md +8 -0
  329. package/docs/api/variables/requestsModule.md +8 -0
  330. package/package.json +7 -5
  331. package/src/components/CallSignature.tsx +6 -2
  332. package/src/components/ImportStatement.tsx +51 -4
  333. package/src/components/Reference.tsx +3 -1
  334. package/src/components/SourceFile.tsx +44 -8
  335. package/src/components/TypeRefContext.tsx +36 -0
  336. package/src/components/TypeReference.tsx +15 -7
  337. package/src/components/VariableDeclaration.tsx +5 -1
  338. package/src/components/index.ts +1 -1
  339. package/src/context/index.ts +1 -0
  340. package/src/context/type-ref-context.tsx +16 -0
  341. package/src/name-conflict-resolver.ts +4 -10
  342. package/src/symbols/python-module-scope.ts +55 -2
  343. package/src/symbols/python-output-symbol.ts +32 -1
  344. package/src/symbols/reference.tsx +10 -0
  345. package/temp/api.json +441 -336
  346. package/test/dataclassdeclarations.test.tsx +8 -2
  347. package/test/externals.test.tsx +8 -2
  348. package/test/functiondeclaration.test.tsx +6 -3
  349. package/test/imports.test.tsx +6 -6
  350. package/test/references.test.tsx +1 -1
  351. package/test/sourcefiles.test.tsx +13 -13
  352. package/test/type-checking-imports.test.tsx +363 -0
  353. package/test/uniontypeexpression.test.tsx +4 -1
  354. package/test/variables.test.tsx +4 -1
  355. package/vitest.config.ts +8 -0
@@ -0,0 +1,1668 @@
1
+ import { createComponent as _$createComponent, memo as _$memo, createIntrinsic as _$createIntrinsic } from "@alloy-js/core/jsx-runtime";
2
+ import { code, memberRefkey, refkey } from "@alloy-js/core";
3
+ import { d } from "@alloy-js/core/testing";
4
+ import { describe, expect, it } from "vitest";
5
+ import * as py from "../src/index.js";
6
+ import { ClassDeclaration, FunctionDeclaration, SourceFile, VariableDeclaration } from "../src/index.js";
7
+ import { assertFileContents, toSourceText, toSourceTextMultiple } from "./utils.js";
8
+ it("renders basic member expression with dot notation", () => {
9
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
10
+ get children() {
11
+ return [_$createComponent(py.MemberExpression.Part, {
12
+ id: "obj"
13
+ }, {
14
+ fileName: import.meta.url,
15
+ lineNumber: 22,
16
+ columnNumber: 9
17
+ }), _$createComponent(py.MemberExpression.Part, {
18
+ id: "property"
19
+ }, {
20
+ fileName: import.meta.url,
21
+ lineNumber: 23,
22
+ columnNumber: 9
23
+ })];
24
+ }
25
+ }, {
26
+ fileName: import.meta.url,
27
+ lineNumber: 21,
28
+ columnNumber: 7
29
+ })])).toBe(d`
30
+ obj.property
31
+ `);
32
+ });
33
+ it("renders basic member expression with key", () => {
34
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
35
+ get children() {
36
+ return [_$createComponent(py.MemberExpression.Part, {
37
+ id: "arr"
38
+ }, {
39
+ fileName: import.meta.url,
40
+ lineNumber: 35,
41
+ columnNumber: 9
42
+ }), _$createComponent(py.MemberExpression.Part, {
43
+ key: 12345
44
+ }, {
45
+ fileName: import.meta.url,
46
+ lineNumber: 36,
47
+ columnNumber: 9
48
+ }), _$createComponent(py.MemberExpression.Part, {
49
+ id: "foo-bar"
50
+ }, {
51
+ fileName: import.meta.url,
52
+ lineNumber: 37,
53
+ columnNumber: 9
54
+ })];
55
+ }
56
+ }, {
57
+ fileName: import.meta.url,
58
+ lineNumber: 34,
59
+ columnNumber: 7
60
+ })])).toBe(d`
61
+ arr[12345].foo-bar
62
+ `);
63
+ });
64
+ it("renders basic member expression with key with reference", () => {
65
+ const rk1 = refkey();
66
+ expect(toSourceText([_$createComponent(py.StatementList, {
67
+ get children() {
68
+ return [_$createComponent(py.VariableDeclaration, {
69
+ name: "test1",
70
+ refkey: rk1,
71
+ initializer: 1
72
+ }, {
73
+ fileName: import.meta.url,
74
+ lineNumber: 50,
75
+ columnNumber: 9
76
+ }), _$createComponent(py.MemberExpression, {
77
+ get children() {
78
+ return [_$createComponent(py.MemberExpression.Part, {
79
+ id: "arr"
80
+ }, {
81
+ fileName: import.meta.url,
82
+ lineNumber: 52,
83
+ columnNumber: 11
84
+ }), _$createComponent(py.MemberExpression.Part, {
85
+ key: rk1
86
+ }, {
87
+ fileName: import.meta.url,
88
+ lineNumber: 53,
89
+ columnNumber: 11
90
+ }), _$createComponent(py.MemberExpression.Part, {
91
+ id: "foo-bar"
92
+ }, {
93
+ fileName: import.meta.url,
94
+ lineNumber: 54,
95
+ columnNumber: 11
96
+ })];
97
+ }
98
+ }, {
99
+ fileName: import.meta.url,
100
+ lineNumber: 51,
101
+ columnNumber: 9
102
+ })];
103
+ }
104
+ }, {
105
+ fileName: import.meta.url,
106
+ lineNumber: 49,
107
+ columnNumber: 7
108
+ })])).toBe(d`
109
+ test1 = 1
110
+ arr[test1].foo-bar
111
+ `);
112
+ });
113
+ it("renders basic member expression with keys", () => {
114
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
115
+ get children() {
116
+ return [_$createComponent(py.MemberExpression.Part, {
117
+ id: "arr"
118
+ }, {
119
+ fileName: import.meta.url,
120
+ lineNumber: 68,
121
+ columnNumber: 9
122
+ }), _$createComponent(py.MemberExpression.Part, {
123
+ keys: [1, 2]
124
+ }, {
125
+ fileName: import.meta.url,
126
+ lineNumber: 69,
127
+ columnNumber: 9
128
+ }), _$createComponent(py.MemberExpression.Part, {
129
+ id: "foo-bar"
130
+ }, {
131
+ fileName: import.meta.url,
132
+ lineNumber: 70,
133
+ columnNumber: 9
134
+ })];
135
+ }
136
+ }, {
137
+ fileName: import.meta.url,
138
+ lineNumber: 67,
139
+ columnNumber: 7
140
+ })])).toBe(d`
141
+ arr[1, 2].foo-bar
142
+ `);
143
+ });
144
+ it("renders basic member expression with keys with references", () => {
145
+ const rk1 = refkey();
146
+ const rk2 = refkey();
147
+ expect(toSourceText([_$createComponent(py.StatementList, {
148
+ get children() {
149
+ return [_$createComponent(py.VariableDeclaration, {
150
+ name: "test1",
151
+ refkey: rk1,
152
+ initializer: 1
153
+ }, {
154
+ fileName: import.meta.url,
155
+ lineNumber: 84,
156
+ columnNumber: 9
157
+ }), _$createComponent(py.VariableDeclaration, {
158
+ name: "test2",
159
+ refkey: rk2,
160
+ initializer: 2
161
+ }, {
162
+ fileName: import.meta.url,
163
+ lineNumber: 85,
164
+ columnNumber: 9
165
+ }), _$createComponent(py.MemberExpression, {
166
+ get children() {
167
+ return [_$createComponent(py.MemberExpression.Part, {
168
+ id: "arr"
169
+ }, {
170
+ fileName: import.meta.url,
171
+ lineNumber: 87,
172
+ columnNumber: 11
173
+ }), _$createComponent(py.MemberExpression.Part, {
174
+ keys: [rk1, rk2]
175
+ }, {
176
+ fileName: import.meta.url,
177
+ lineNumber: 88,
178
+ columnNumber: 11
179
+ }), _$createComponent(py.MemberExpression.Part, {
180
+ id: "foo-bar"
181
+ }, {
182
+ fileName: import.meta.url,
183
+ lineNumber: 89,
184
+ columnNumber: 11
185
+ })];
186
+ }
187
+ }, {
188
+ fileName: import.meta.url,
189
+ lineNumber: 86,
190
+ columnNumber: 9
191
+ })];
192
+ }
193
+ }, {
194
+ fileName: import.meta.url,
195
+ lineNumber: 83,
196
+ columnNumber: 7
197
+ })])).toBe(d`
198
+ test1 = 1
199
+ test2 = 2
200
+ arr[test1, test2].foo-bar
201
+ `);
202
+ });
203
+ it("renders basic member expression with slice - 1", () => {
204
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
205
+ get children() {
206
+ return [_$createComponent(py.MemberExpression.Part, {
207
+ id: "arr"
208
+ }, {
209
+ fileName: import.meta.url,
210
+ lineNumber: 104,
211
+ columnNumber: 9
212
+ }), _$createComponent(py.MemberExpression.Part, {
213
+ slice: {
214
+ start: 1,
215
+ stop: 3,
216
+ step: 2
217
+ }
218
+ }, {
219
+ fileName: import.meta.url,
220
+ lineNumber: 105,
221
+ columnNumber: 9
222
+ }), _$createComponent(py.MemberExpression.Part, {
223
+ id: "foo-bar"
224
+ }, {
225
+ fileName: import.meta.url,
226
+ lineNumber: 106,
227
+ columnNumber: 9
228
+ })];
229
+ }
230
+ }, {
231
+ fileName: import.meta.url,
232
+ lineNumber: 103,
233
+ columnNumber: 7
234
+ })])).toBe(d`
235
+ arr[1:3:2].foo-bar
236
+ `);
237
+ });
238
+ it("renders basic member expression with slice - 1 with references", () => {
239
+ const rk1 = refkey();
240
+ const rk2 = refkey();
241
+ const rk3 = refkey();
242
+ expect(toSourceText([_$createComponent(py.StatementList, {
243
+ get children() {
244
+ return [_$createComponent(py.VariableDeclaration, {
245
+ name: "test1",
246
+ refkey: rk1,
247
+ initializer: 1
248
+ }, {
249
+ fileName: import.meta.url,
250
+ lineNumber: 121,
251
+ columnNumber: 9
252
+ }), _$createComponent(py.VariableDeclaration, {
253
+ name: "test2",
254
+ refkey: rk2,
255
+ initializer: 3
256
+ }, {
257
+ fileName: import.meta.url,
258
+ lineNumber: 122,
259
+ columnNumber: 9
260
+ }), _$createComponent(py.VariableDeclaration, {
261
+ name: "test3",
262
+ refkey: rk3,
263
+ initializer: 2
264
+ }, {
265
+ fileName: import.meta.url,
266
+ lineNumber: 123,
267
+ columnNumber: 9
268
+ }), _$createComponent(py.MemberExpression, {
269
+ get children() {
270
+ return [_$createComponent(py.MemberExpression.Part, {
271
+ id: "arr"
272
+ }, {
273
+ fileName: import.meta.url,
274
+ lineNumber: 125,
275
+ columnNumber: 11
276
+ }), _$createComponent(py.MemberExpression.Part, {
277
+ slice: {
278
+ start: rk1,
279
+ stop: rk2,
280
+ step: rk3
281
+ }
282
+ }, {
283
+ fileName: import.meta.url,
284
+ lineNumber: 126,
285
+ columnNumber: 11
286
+ }), _$createComponent(py.MemberExpression.Part, {
287
+ id: "foo-bar"
288
+ }, {
289
+ fileName: import.meta.url,
290
+ lineNumber: 129,
291
+ columnNumber: 11
292
+ })];
293
+ }
294
+ }, {
295
+ fileName: import.meta.url,
296
+ lineNumber: 124,
297
+ columnNumber: 9
298
+ })];
299
+ }
300
+ }, {
301
+ fileName: import.meta.url,
302
+ lineNumber: 120,
303
+ columnNumber: 7
304
+ })])).toBe(d`
305
+ test1 = 1
306
+ test2 = 3
307
+ test3 = 2
308
+ arr[test1:test2:test3].foo-bar
309
+ `);
310
+ });
311
+ it("renders basic member expression with slice - 2", () => {
312
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
313
+ get children() {
314
+ return [_$createComponent(py.MemberExpression.Part, {
315
+ id: "arr"
316
+ }, {
317
+ fileName: import.meta.url,
318
+ lineNumber: 145,
319
+ columnNumber: 9
320
+ }), _$createComponent(py.MemberExpression.Part, {
321
+ slice: {
322
+ stop: 3
323
+ }
324
+ }, {
325
+ fileName: import.meta.url,
326
+ lineNumber: 146,
327
+ columnNumber: 9
328
+ }), _$createComponent(py.MemberExpression.Part, {
329
+ id: "foo-bar"
330
+ }, {
331
+ fileName: import.meta.url,
332
+ lineNumber: 147,
333
+ columnNumber: 9
334
+ })];
335
+ }
336
+ }, {
337
+ fileName: import.meta.url,
338
+ lineNumber: 144,
339
+ columnNumber: 7
340
+ })])).toBe(d`
341
+ arr[:3].foo-bar
342
+ `);
343
+ });
344
+ it("renders basic member expression with slice - 3", () => {
345
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
346
+ get children() {
347
+ return [_$createComponent(py.MemberExpression.Part, {
348
+ id: "arr"
349
+ }, {
350
+ fileName: import.meta.url,
351
+ lineNumber: 159,
352
+ columnNumber: 9
353
+ }), _$createComponent(py.MemberExpression.Part, {
354
+ slice: {
355
+ step: 2
356
+ }
357
+ }, {
358
+ fileName: import.meta.url,
359
+ lineNumber: 160,
360
+ columnNumber: 9
361
+ }), _$createComponent(py.MemberExpression.Part, {
362
+ id: "foo-bar"
363
+ }, {
364
+ fileName: import.meta.url,
365
+ lineNumber: 161,
366
+ columnNumber: 9
367
+ })];
368
+ }
369
+ }, {
370
+ fileName: import.meta.url,
371
+ lineNumber: 158,
372
+ columnNumber: 7
373
+ })])).toBe(d`
374
+ arr[::2].foo-bar
375
+ `);
376
+ });
377
+ it("renders basic member expression with slice - 4", () => {
378
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
379
+ get children() {
380
+ return [_$createComponent(py.MemberExpression.Part, {
381
+ id: "arr"
382
+ }, {
383
+ fileName: import.meta.url,
384
+ lineNumber: 173,
385
+ columnNumber: 9
386
+ }), _$createComponent(py.MemberExpression.Part, {
387
+ slice: {
388
+ start: 1
389
+ }
390
+ }, {
391
+ fileName: import.meta.url,
392
+ lineNumber: 174,
393
+ columnNumber: 9
394
+ }), _$createComponent(py.MemberExpression.Part, {
395
+ id: "foo-bar"
396
+ }, {
397
+ fileName: import.meta.url,
398
+ lineNumber: 175,
399
+ columnNumber: 9
400
+ })];
401
+ }
402
+ }, {
403
+ fileName: import.meta.url,
404
+ lineNumber: 172,
405
+ columnNumber: 7
406
+ })])).toBe(d`
407
+ arr[1:].foo-bar
408
+ `);
409
+ });
410
+ it("renders basic member expression with slice - 5", () => {
411
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
412
+ get children() {
413
+ return [_$createComponent(py.MemberExpression.Part, {
414
+ id: "arr"
415
+ }, {
416
+ fileName: import.meta.url,
417
+ lineNumber: 187,
418
+ columnNumber: 9
419
+ }), _$createComponent(py.MemberExpression.Part, {
420
+ slice: {
421
+ start: 1,
422
+ step: 2
423
+ }
424
+ }, {
425
+ fileName: import.meta.url,
426
+ lineNumber: 188,
427
+ columnNumber: 9
428
+ }), _$createComponent(py.MemberExpression.Part, {
429
+ id: "foo-bar"
430
+ }, {
431
+ fileName: import.meta.url,
432
+ lineNumber: 189,
433
+ columnNumber: 9
434
+ })];
435
+ }
436
+ }, {
437
+ fileName: import.meta.url,
438
+ lineNumber: 186,
439
+ columnNumber: 7
440
+ })])).toBe(d`
441
+ arr[1::2].foo-bar
442
+ `);
443
+ });
444
+ it("renders basic member expression with an expression index - 1", () => {
445
+ const xRefkey = refkey();
446
+ expect(toSourceText([_$createComponent(py.StatementList, {
447
+ get children() {
448
+ return [_$createComponent(py.VariableDeclaration, {
449
+ name: "x",
450
+ initializer: 1,
451
+ refkey: xRefkey
452
+ }, {
453
+ fileName: import.meta.url,
454
+ lineNumber: 202,
455
+ columnNumber: 9
456
+ }), _$createComponent(py.MemberExpression, {
457
+ get children() {
458
+ return [_$createComponent(py.MemberExpression.Part, {
459
+ id: "arr"
460
+ }, {
461
+ fileName: import.meta.url,
462
+ lineNumber: 204,
463
+ columnNumber: 11
464
+ }), _$createComponent(py.MemberExpression.Part, {
465
+ key: code`${xRefkey} + 1`
466
+ }, {
467
+ fileName: import.meta.url,
468
+ lineNumber: 205,
469
+ columnNumber: 11
470
+ }), _$createComponent(py.MemberExpression.Part, {
471
+ id: "foo-bar"
472
+ }, {
473
+ fileName: import.meta.url,
474
+ lineNumber: 206,
475
+ columnNumber: 11
476
+ })];
477
+ }
478
+ }, {
479
+ fileName: import.meta.url,
480
+ lineNumber: 203,
481
+ columnNumber: 9
482
+ })];
483
+ }
484
+ }, {
485
+ fileName: import.meta.url,
486
+ lineNumber: 201,
487
+ columnNumber: 7
488
+ })])).toBe(d`
489
+ x = 1
490
+ arr[x + 1].foo-bar
491
+ `);
492
+ });
493
+ it("renders basic member expression with an expression index - 2", () => {
494
+ expect(toSourceText([_$createComponent(py.StatementList, {
495
+ get children() {
496
+ return _$createComponent(py.MemberExpression, {
497
+ get children() {
498
+ return [_$createComponent(py.MemberExpression.Part, {
499
+ id: "arr"
500
+ }, {
501
+ fileName: import.meta.url,
502
+ lineNumber: 221,
503
+ columnNumber: 11
504
+ }), _$createComponent(py.MemberExpression.Part, {
505
+ key: code`"foo" + 1`
506
+ }, {
507
+ fileName: import.meta.url,
508
+ lineNumber: 222,
509
+ columnNumber: 11
510
+ }), _$createComponent(py.MemberExpression.Part, {
511
+ id: "foo-bar"
512
+ }, {
513
+ fileName: import.meta.url,
514
+ lineNumber: 223,
515
+ columnNumber: 11
516
+ })];
517
+ }
518
+ }, {
519
+ fileName: import.meta.url,
520
+ lineNumber: 220,
521
+ columnNumber: 9
522
+ });
523
+ }
524
+ }, {
525
+ fileName: import.meta.url,
526
+ lineNumber: 219,
527
+ columnNumber: 7
528
+ })])).toBe(d`
529
+ arr["foo" + 1].foo-bar
530
+ `);
531
+ });
532
+ it("throws an error for invalid identifiers with quotes", () => {
533
+ expect(() => toSourceText([_$createComponent(py.MemberExpression, {
534
+ get children() {
535
+ return [_$createComponent(py.MemberExpression.Part, {
536
+ id: "obj"
537
+ }, {
538
+ fileName: import.meta.url,
539
+ lineNumber: 236,
540
+ columnNumber: 9
541
+ }), _$createComponent(py.MemberExpression.Part, {
542
+ id: `property-"name"`
543
+ }, {
544
+ fileName: import.meta.url,
545
+ lineNumber: 237,
546
+ columnNumber: 9
547
+ })];
548
+ }
549
+ }, {
550
+ fileName: import.meta.url,
551
+ lineNumber: 235,
552
+ columnNumber: 7
553
+ })])).toThrowError(/Invalid identifier: property-"name"/);
554
+ });
555
+ it("supports multiple levels of nesting", () => {
556
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
557
+ get children() {
558
+ return [_$createComponent(py.MemberExpression.Part, {
559
+ id: "a"
560
+ }, {
561
+ fileName: import.meta.url,
562
+ lineNumber: 247,
563
+ columnNumber: 9
564
+ }), _$createComponent(py.MemberExpression.Part, {
565
+ id: "b"
566
+ }, {
567
+ fileName: import.meta.url,
568
+ lineNumber: 248,
569
+ columnNumber: 9
570
+ }), _$createComponent(py.MemberExpression.Part, {
571
+ id: "c"
572
+ }, {
573
+ fileName: import.meta.url,
574
+ lineNumber: 249,
575
+ columnNumber: 9
576
+ }), _$createComponent(py.MemberExpression.Part, {
577
+ id: "d"
578
+ }, {
579
+ fileName: import.meta.url,
580
+ lineNumber: 250,
581
+ columnNumber: 9
582
+ })];
583
+ }
584
+ }, {
585
+ fileName: import.meta.url,
586
+ lineNumber: 246,
587
+ columnNumber: 7
588
+ })])).toBe(d`
589
+ a.b.c.d
590
+ `);
591
+ });
592
+ it("handles a mix of dot and bracket notation", () => {
593
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
594
+ get children() {
595
+ return [_$createComponent(py.MemberExpression.Part, {
596
+ id: "obj"
597
+ }, {
598
+ fileName: import.meta.url,
599
+ lineNumber: 262,
600
+ columnNumber: 9
601
+ }), _$createComponent(py.MemberExpression.Part, {
602
+ id: "normalProp"
603
+ }, {
604
+ fileName: import.meta.url,
605
+ lineNumber: 263,
606
+ columnNumber: 9
607
+ }), _$createComponent(py.MemberExpression.Part, {
608
+ key: "special-prop"
609
+ }, {
610
+ fileName: import.meta.url,
611
+ lineNumber: 264,
612
+ columnNumber: 9
613
+ }), _$createComponent(py.MemberExpression.Part, {
614
+ key: "123"
615
+ }, {
616
+ fileName: import.meta.url,
617
+ lineNumber: 265,
618
+ columnNumber: 9
619
+ })];
620
+ }
621
+ }, {
622
+ fileName: import.meta.url,
623
+ lineNumber: 261,
624
+ columnNumber: 7
625
+ })])).toBe(d`
626
+ obj.normalProp["special-prop"]["123"]
627
+ `);
628
+ });
629
+ it("throws an error when providing conflicting part props", () => {
630
+ expect(() => toSourceText([_$createComponent(py.MemberExpression, {
631
+ get children() {
632
+ return [_$createComponent(py.MemberExpression.Part, {
633
+ id: "obj"
634
+ }, {
635
+ fileName: import.meta.url,
636
+ lineNumber: 277,
637
+ columnNumber: 9
638
+ }), _$createComponent(py.MemberExpression.Part, {
639
+ id: "property",
640
+ args: [1, 2]
641
+ }, {
642
+ fileName: import.meta.url,
643
+ lineNumber: 278,
644
+ columnNumber: 9
645
+ })];
646
+ }
647
+ }, {
648
+ fileName: import.meta.url,
649
+ lineNumber: 276,
650
+ columnNumber: 7
651
+ })])).toThrowError(`Only one of args, id can be used for a MemberExpression part at a time`);
652
+ });
653
+ it("throws an error when providing an empty slice", () => {
654
+ expect(() => toSourceText([_$createComponent(py.MemberExpression, {
655
+ get children() {
656
+ return [_$createComponent(py.MemberExpression.Part, {
657
+ id: "obj"
658
+ }, {
659
+ fileName: import.meta.url,
660
+ lineNumber: 290,
661
+ columnNumber: 9
662
+ }), _$createComponent(py.MemberExpression.Part, {
663
+ slice: {}
664
+ }, {
665
+ fileName: import.meta.url,
666
+ lineNumber: 291,
667
+ columnNumber: 9
668
+ })];
669
+ }
670
+ }, {
671
+ fileName: import.meta.url,
672
+ lineNumber: 289,
673
+ columnNumber: 7
674
+ })])).toThrowError(`MemberExpression.Part: slice object cannot be empty`);
675
+ });
676
+ it("throws an error when providing an empty array", () => {
677
+ expect(() => toSourceText([_$createComponent(py.MemberExpression, {
678
+ get children() {
679
+ return [_$createComponent(py.MemberExpression.Part, {
680
+ id: "obj"
681
+ }, {
682
+ fileName: import.meta.url,
683
+ lineNumber: 301,
684
+ columnNumber: 9
685
+ }), _$createComponent(py.MemberExpression.Part, {
686
+ keys: []
687
+ }, {
688
+ fileName: import.meta.url,
689
+ lineNumber: 302,
690
+ columnNumber: 9
691
+ })];
692
+ }
693
+ }, {
694
+ fileName: import.meta.url,
695
+ lineNumber: 300,
696
+ columnNumber: 7
697
+ })])).toThrowError(`MemberExpression.Part: keys array cannot be empty`);
698
+ });
699
+ it("takes children for the id part", () => {
700
+ expect(toSourceText([_$createComponent(py.StatementList, {
701
+ get children() {
702
+ return [_$createComponent(py.MemberExpression, {
703
+ get children() {
704
+ return [_$createComponent(py.MemberExpression.Part, {
705
+ id: "child1"
706
+ }, {
707
+ fileName: import.meta.url,
708
+ lineNumber: 313,
709
+ columnNumber: 11
710
+ }), _$createComponent(py.MemberExpression.Part, {
711
+ key: "child1"
712
+ }, {
713
+ fileName: import.meta.url,
714
+ lineNumber: 314,
715
+ columnNumber: 11
716
+ })];
717
+ }
718
+ }, {
719
+ fileName: import.meta.url,
720
+ lineNumber: 312,
721
+ columnNumber: 9
722
+ }), _$createComponent(py.MemberExpression, {
723
+ get children() {
724
+ return [_$createComponent(py.MemberExpression.Part, {
725
+ id: "child1"
726
+ }, {
727
+ fileName: import.meta.url,
728
+ lineNumber: 317,
729
+ columnNumber: 11
730
+ }), _$createComponent(py.MemberExpression.Part, {
731
+ key: "child2"
732
+ }, {
733
+ fileName: import.meta.url,
734
+ lineNumber: 318,
735
+ columnNumber: 11
736
+ }), _$createComponent(py.MemberExpression.Part, {
737
+ args: true
738
+ }, {
739
+ fileName: import.meta.url,
740
+ lineNumber: 319,
741
+ columnNumber: 11
742
+ }), _$createComponent(py.MemberExpression.Part, {
743
+ key: "child3"
744
+ }, {
745
+ fileName: import.meta.url,
746
+ lineNumber: 320,
747
+ columnNumber: 11
748
+ }), _$createComponent(py.MemberExpression.Part, {
749
+ args: true
750
+ }, {
751
+ fileName: import.meta.url,
752
+ lineNumber: 321,
753
+ columnNumber: 11
754
+ }), _$createComponent(py.MemberExpression.Part, {
755
+ key: code`"foo" + 1`
756
+ }, {
757
+ fileName: import.meta.url,
758
+ lineNumber: 322,
759
+ columnNumber: 11
760
+ }), _$createComponent(py.MemberExpression.Part, {
761
+ args: true
762
+ }, {
763
+ fileName: import.meta.url,
764
+ lineNumber: 323,
765
+ columnNumber: 11
766
+ })];
767
+ }
768
+ }, {
769
+ fileName: import.meta.url,
770
+ lineNumber: 316,
771
+ columnNumber: 9
772
+ })];
773
+ }
774
+ }, {
775
+ fileName: import.meta.url,
776
+ lineNumber: 311,
777
+ columnNumber: 7
778
+ })])).toBe(d`
779
+ child1["child1"]
780
+ child1["child2"]()["child3"]()["foo" + 1]()
781
+ `);
782
+ });
783
+ describe("with refkeys", () => {
784
+ it("handles symbols correctly", () => {
785
+ const rk1 = refkey();
786
+ const rk2 = refkey();
787
+ expect(toSourceText([_$createComponent(py.StatementList, {
788
+ get children() {
789
+ return [_$createComponent(py.VariableDeclaration, {
790
+ name: "test1",
791
+ refkey: rk1,
792
+ initializer: 1
793
+ }, {
794
+ fileName: import.meta.url,
795
+ lineNumber: 340,
796
+ columnNumber: 11
797
+ }), _$createComponent(py.VariableDeclaration, {
798
+ name: "test1",
799
+ refkey: rk2,
800
+ initializer: 2
801
+ }, {
802
+ fileName: import.meta.url,
803
+ lineNumber: 341,
804
+ columnNumber: 11
805
+ }), _$createComponent(py.MemberExpression, {
806
+ get children() {
807
+ return [_$createComponent(py.MemberExpression.Part, {
808
+ refkey: rk1
809
+ }, {
810
+ fileName: import.meta.url,
811
+ lineNumber: 343,
812
+ columnNumber: 13
813
+ }), _$createComponent(py.MemberExpression.Part, {
814
+ refkey: rk2
815
+ }, {
816
+ fileName: import.meta.url,
817
+ lineNumber: 344,
818
+ columnNumber: 13
819
+ })];
820
+ }
821
+ }, {
822
+ fileName: import.meta.url,
823
+ lineNumber: 342,
824
+ columnNumber: 11
825
+ })];
826
+ }
827
+ }, {
828
+ fileName: import.meta.url,
829
+ lineNumber: 339,
830
+ columnNumber: 9
831
+ })])).toBe(d`
832
+ test1 = 1
833
+ test1_2_test = 2
834
+ test1.test1_2_test
835
+ `);
836
+ });
837
+ it("Correctly resolves member expressions from 2 different classes", () => {
838
+ const model1Ref = refkey();
839
+ const model2Ref = refkey();
840
+ const classMethod1Ref = refkey();
841
+ const classMethod2Ref = refkey();
842
+ const v1Rk = refkey();
843
+ const v2Rk = refkey();
844
+ const template = _$createComponent(py.StatementList, {
845
+ get children() {
846
+ return [_$createComponent(ClassDeclaration, {
847
+ name: "Model1",
848
+ refkey: model1Ref,
849
+ get children() {
850
+ return _$createComponent(VariableDeclaration, {
851
+ name: "foo",
852
+ refkey: classMethod1Ref,
853
+ type: "str",
854
+ omitNone: true,
855
+ instanceVariable: true
856
+ }, {
857
+ fileName: import.meta.url,
858
+ lineNumber: 365,
859
+ columnNumber: 11
860
+ });
861
+ }
862
+ }, {
863
+ fileName: import.meta.url,
864
+ lineNumber: 364,
865
+ columnNumber: 9
866
+ }), _$createComponent(ClassDeclaration, {
867
+ name: "Model2",
868
+ refkey: model2Ref,
869
+ get children() {
870
+ return _$createComponent(VariableDeclaration, {
871
+ name: "bar",
872
+ refkey: classMethod2Ref,
873
+ type: "str",
874
+ omitNone: true,
875
+ instanceVariable: true
876
+ }, {
877
+ fileName: import.meta.url,
878
+ lineNumber: 374,
879
+ columnNumber: 11
880
+ });
881
+ }
882
+ }, {
883
+ fileName: import.meta.url,
884
+ lineNumber: 373,
885
+ columnNumber: 9
886
+ }), _$createComponent(py.VariableDeclaration, {
887
+ name: "model1_instance",
888
+ refkey: v1Rk,
889
+ type: model1Ref,
890
+ get initializer() {
891
+ return _$createComponent(py.MemberExpression, {
892
+ get children() {
893
+ return [_$createComponent(py.MemberExpression.Part, {
894
+ refkey: model1Ref
895
+ }, {
896
+ fileName: import.meta.url,
897
+ lineNumber: 388,
898
+ columnNumber: 15
899
+ }), _$createComponent(py.MemberExpression.Part, {
900
+ args: true
901
+ }, {
902
+ fileName: import.meta.url,
903
+ lineNumber: 389,
904
+ columnNumber: 15
905
+ })];
906
+ }
907
+ }, {
908
+ fileName: import.meta.url,
909
+ lineNumber: 387,
910
+ columnNumber: 13
911
+ });
912
+ }
913
+ }, {
914
+ fileName: import.meta.url,
915
+ lineNumber: 382,
916
+ columnNumber: 9
917
+ }), _$createComponent(py.VariableDeclaration, {
918
+ name: "model2_instance",
919
+ refkey: v2Rk,
920
+ type: model2Ref,
921
+ get initializer() {
922
+ return _$createComponent(py.MemberExpression, {
923
+ get children() {
924
+ return [_$createComponent(py.MemberExpression.Part, {
925
+ refkey: model2Ref
926
+ }, {
927
+ fileName: import.meta.url,
928
+ lineNumber: 399,
929
+ columnNumber: 15
930
+ }), _$createComponent(py.MemberExpression.Part, {
931
+ args: true
932
+ }, {
933
+ fileName: import.meta.url,
934
+ lineNumber: 400,
935
+ columnNumber: 15
936
+ })];
937
+ }
938
+ }, {
939
+ fileName: import.meta.url,
940
+ lineNumber: 398,
941
+ columnNumber: 13
942
+ });
943
+ }
944
+ }, {
945
+ fileName: import.meta.url,
946
+ lineNumber: 393,
947
+ columnNumber: 9
948
+ }), [_$memo(() => memberRefkey(v1Rk, classMethod1Ref), false, "memberRefkey(\u2026)")], [_$memo(() => memberRefkey(v2Rk, classMethod2Ref), false, "memberRefkey(\u2026)")]];
949
+ }
950
+ }, {
951
+ fileName: import.meta.url,
952
+ lineNumber: 363,
953
+ columnNumber: 7
954
+ });
955
+ expect(toSourceText([template])).toBe(d`
956
+ class Model1:
957
+ foo: str
958
+
959
+ class Model2:
960
+ bar: str
961
+
962
+ model1_instance: Model1 = Model1()
963
+ model2_instance: Model2 = Model2()
964
+ model1_instance.foo
965
+ model2_instance.bar
966
+ `);
967
+ });
968
+ it("handles optional parameters correctly", () => {
969
+ const fooRef = refkey();
970
+ const modelRef = refkey();
971
+ const parameters = [{
972
+ name: "foo",
973
+ default: null,
974
+ refkey: fooRef,
975
+ type: modelRef
976
+ }];
977
+ const messageRef = refkey();
978
+ const template = _$createComponent(py.StatementList, {
979
+ get children() {
980
+ return [_$createComponent(ClassDeclaration, {
981
+ name: "Model",
982
+ refkey: modelRef,
983
+ get children() {
984
+ return _$createComponent(VariableDeclaration, {
985
+ name: "bar",
986
+ get refkey() {
987
+ return refkey();
988
+ },
989
+ type: "str",
990
+ omitNone: true
991
+ }, {
992
+ fileName: import.meta.url,
993
+ lineNumber: 438,
994
+ columnNumber: 11
995
+ });
996
+ }
997
+ }, {
998
+ fileName: import.meta.url,
999
+ lineNumber: 437,
1000
+ columnNumber: 9
1001
+ }), _$createComponent(FunctionDeclaration, {
1002
+ name: "fooFunction",
1003
+ parameters: parameters,
1004
+ get children() {
1005
+ return _$createComponent(py.StatementList, {
1006
+ get children() {
1007
+ return [_$createComponent(py.VariableDeclaration, {
1008
+ name: "message",
1009
+ refkey: messageRef,
1010
+ get initializer() {
1011
+ return _$createComponent(py.MemberExpression, {
1012
+ get children() {
1013
+ return [_$createComponent(py.MemberExpression.Part, {
1014
+ refkey: fooRef
1015
+ }, {
1016
+ fileName: import.meta.url,
1017
+ lineNumber: 452,
1018
+ columnNumber: 19
1019
+ }), _$createComponent(py.MemberExpression.Part, {
1020
+ id: "bar"
1021
+ }, {
1022
+ fileName: import.meta.url,
1023
+ lineNumber: 453,
1024
+ columnNumber: 19
1025
+ })];
1026
+ }
1027
+ }, {
1028
+ fileName: import.meta.url,
1029
+ lineNumber: 451,
1030
+ columnNumber: 17
1031
+ });
1032
+ }
1033
+ }, {
1034
+ fileName: import.meta.url,
1035
+ lineNumber: 447,
1036
+ columnNumber: 13
1037
+ }), ["print(", messageRef, ")"]];
1038
+ }
1039
+ }, {
1040
+ fileName: import.meta.url,
1041
+ lineNumber: 446,
1042
+ columnNumber: 11
1043
+ });
1044
+ }
1045
+ }, {
1046
+ fileName: import.meta.url,
1047
+ lineNumber: 445,
1048
+ columnNumber: 9
1049
+ })];
1050
+ }
1051
+ }, {
1052
+ fileName: import.meta.url,
1053
+ lineNumber: 436,
1054
+ columnNumber: 7
1055
+ });
1056
+ expect(toSourceText([template])).toBe(d`
1057
+ class Model:
1058
+ bar: str
1059
+
1060
+ def foo_function(foo: Model = None):
1061
+ message = foo.bar
1062
+ print(message)
1063
+
1064
+ `);
1065
+ });
1066
+ it("handles class member correctly", () => {
1067
+ const classRefkey = refkey();
1068
+ const interfaceRefkey = refkey();
1069
+ const interfaceMemberRefkey = refkey();
1070
+ const classMethodRefkey = refkey();
1071
+ const classMemberRefkey = refkey();
1072
+ const instanceRefkey = refkey();
1073
+ expect(toSourceText([_$createComponent(py.StatementList, {
1074
+ get children() {
1075
+ return [_$createComponent(ClassDeclaration, {
1076
+ name: "Bar",
1077
+ refkey: interfaceRefkey,
1078
+ get children() {
1079
+ return _$createComponent(VariableDeclaration, {
1080
+ name: "prop1",
1081
+ refkey: interfaceMemberRefkey,
1082
+ type: "str",
1083
+ omitNone: true
1084
+ }, {
1085
+ fileName: import.meta.url,
1086
+ lineNumber: 485,
1087
+ columnNumber: 13
1088
+ });
1089
+ }
1090
+ }, {
1091
+ fileName: import.meta.url,
1092
+ lineNumber: 484,
1093
+ columnNumber: 11
1094
+ }), _$createComponent(ClassDeclaration, {
1095
+ name: "Foo",
1096
+ refkey: classRefkey,
1097
+ get children() {
1098
+ return [_$createComponent(VariableDeclaration, {
1099
+ name: "test1",
1100
+ refkey: classMemberRefkey,
1101
+ type: interfaceRefkey
1102
+ }, {
1103
+ fileName: import.meta.url,
1104
+ lineNumber: 493,
1105
+ columnNumber: 13
1106
+ }), _$createIntrinsic("br", {}, {
1107
+ fileName: import.meta.url,
1108
+ lineNumber: 498,
1109
+ columnNumber: 13
1110
+ }), _$createComponent(FunctionDeclaration, {
1111
+ name: "testMethod",
1112
+ parameters: [],
1113
+ refkey: classMethodRefkey,
1114
+ returnType: interfaceRefkey
1115
+ }, {
1116
+ fileName: import.meta.url,
1117
+ lineNumber: 499,
1118
+ columnNumber: 13
1119
+ })];
1120
+ }
1121
+ }, {
1122
+ fileName: import.meta.url,
1123
+ lineNumber: 492,
1124
+ columnNumber: 11
1125
+ }), _$createComponent(py.VariableDeclaration, {
1126
+ name: "inst",
1127
+ refkey: instanceRefkey,
1128
+ initializer: code`${classRefkey}()`
1129
+ }, {
1130
+ fileName: import.meta.url,
1131
+ lineNumber: 506,
1132
+ columnNumber: 11
1133
+ }), _$createComponent(py.MemberExpression, {
1134
+ get children() {
1135
+ return [_$createComponent(py.MemberExpression.Part, {
1136
+ refkey: instanceRefkey
1137
+ }, {
1138
+ fileName: import.meta.url,
1139
+ lineNumber: 512,
1140
+ columnNumber: 13
1141
+ }), _$createComponent(py.MemberExpression.Part, {
1142
+ refkey: classMemberRefkey
1143
+ }, {
1144
+ fileName: import.meta.url,
1145
+ lineNumber: 513,
1146
+ columnNumber: 13
1147
+ }), _$createComponent(py.MemberExpression.Part, {
1148
+ refkey: interfaceMemberRefkey
1149
+ }, {
1150
+ fileName: import.meta.url,
1151
+ lineNumber: 514,
1152
+ columnNumber: 13
1153
+ })];
1154
+ }
1155
+ }, {
1156
+ fileName: import.meta.url,
1157
+ lineNumber: 511,
1158
+ columnNumber: 11
1159
+ }), _$createComponent(py.MemberExpression, {
1160
+ get children() {
1161
+ return [_$createComponent(py.MemberExpression.Part, {
1162
+ refkey: instanceRefkey
1163
+ }, {
1164
+ fileName: import.meta.url,
1165
+ lineNumber: 517,
1166
+ columnNumber: 13
1167
+ }), _$createComponent(py.MemberExpression.Part, {
1168
+ refkey: classMethodRefkey
1169
+ }, {
1170
+ fileName: import.meta.url,
1171
+ lineNumber: 518,
1172
+ columnNumber: 13
1173
+ }), _$createComponent(py.MemberExpression.Part, {
1174
+ args: []
1175
+ }, {
1176
+ fileName: import.meta.url,
1177
+ lineNumber: 519,
1178
+ columnNumber: 13
1179
+ })];
1180
+ }
1181
+ }, {
1182
+ fileName: import.meta.url,
1183
+ lineNumber: 516,
1184
+ columnNumber: 11
1185
+ })];
1186
+ }
1187
+ }, {
1188
+ fileName: import.meta.url,
1189
+ lineNumber: 483,
1190
+ columnNumber: 9
1191
+ })])).toBe(d`
1192
+ class Bar:
1193
+ prop1: str
1194
+
1195
+ class Foo:
1196
+ test1: Bar = None
1197
+ def test_method() -> Bar:
1198
+ pass
1199
+
1200
+
1201
+ inst = Foo()
1202
+ inst.test1.prop1
1203
+ inst.test_method()
1204
+ `);
1205
+ });
1206
+ it("handles late resolved refkeys correctly", () => {
1207
+ const rk1 = refkey();
1208
+ const rk2 = refkey();
1209
+ expect(toSourceText([_$createComponent(py.StatementList, {
1210
+ get children() {
1211
+ return [_$createComponent(py.MemberExpression, {
1212
+ get children() {
1213
+ return [_$createComponent(py.MemberExpression.Part, {
1214
+ refkey: rk1
1215
+ }, {
1216
+ fileName: import.meta.url,
1217
+ lineNumber: 546,
1218
+ columnNumber: 13
1219
+ }), _$createComponent(py.MemberExpression.Part, {
1220
+ refkey: rk2
1221
+ }, {
1222
+ fileName: import.meta.url,
1223
+ lineNumber: 547,
1224
+ columnNumber: 13
1225
+ })];
1226
+ }
1227
+ }, {
1228
+ fileName: import.meta.url,
1229
+ lineNumber: 545,
1230
+ columnNumber: 11
1231
+ }), _$createComponent(py.VariableDeclaration, {
1232
+ name: "test1",
1233
+ refkey: rk1,
1234
+ initializer: 1
1235
+ }, {
1236
+ fileName: import.meta.url,
1237
+ lineNumber: 549,
1238
+ columnNumber: 11
1239
+ }), _$createComponent(py.VariableDeclaration, {
1240
+ name: "test1",
1241
+ refkey: rk2,
1242
+ initializer: 2
1243
+ }, {
1244
+ fileName: import.meta.url,
1245
+ lineNumber: 550,
1246
+ columnNumber: 11
1247
+ })];
1248
+ }
1249
+ }, {
1250
+ fileName: import.meta.url,
1251
+ lineNumber: 544,
1252
+ columnNumber: 9
1253
+ })])).toBe(d`
1254
+ test1.test1_2_test
1255
+ test1 = 1
1256
+ test1_2_test = 2
1257
+ `);
1258
+ });
1259
+ it("creates a full reference to the first refkey", () => {
1260
+ const rk1 = refkey();
1261
+ const res = toSourceTextMultiple([_$createComponent(SourceFile, {
1262
+ path: "source.py",
1263
+ get children() {
1264
+ return _$createComponent(py.VariableDeclaration, {
1265
+ name: "importMe",
1266
+ refkey: rk1
1267
+ }, {
1268
+ fileName: import.meta.url,
1269
+ lineNumber: 564,
1270
+ columnNumber: 9
1271
+ });
1272
+ }
1273
+ }, {
1274
+ fileName: import.meta.url,
1275
+ lineNumber: 563,
1276
+ columnNumber: 7
1277
+ }), _$createComponent(SourceFile, {
1278
+ path: "index.py",
1279
+ get children() {
1280
+ return _$createComponent(py.StatementList, {
1281
+ get children() {
1282
+ return _$createComponent(py.MemberExpression, {
1283
+ get children() {
1284
+ return [_$createComponent(py.MemberExpression.Part, {
1285
+ refkey: rk1
1286
+ }, {
1287
+ fileName: import.meta.url,
1288
+ lineNumber: 569,
1289
+ columnNumber: 13
1290
+ }), _$createComponent(py.MemberExpression.Part, {
1291
+ id: "foo"
1292
+ }, {
1293
+ fileName: import.meta.url,
1294
+ lineNumber: 570,
1295
+ columnNumber: 13
1296
+ })];
1297
+ }
1298
+ }, {
1299
+ fileName: import.meta.url,
1300
+ lineNumber: 568,
1301
+ columnNumber: 11
1302
+ });
1303
+ }
1304
+ }, {
1305
+ fileName: import.meta.url,
1306
+ lineNumber: 567,
1307
+ columnNumber: 9
1308
+ });
1309
+ }
1310
+ }, {
1311
+ fileName: import.meta.url,
1312
+ lineNumber: 566,
1313
+ columnNumber: 7
1314
+ })]);
1315
+ assertFileContents(res, {
1316
+ "index.py": d`
1317
+ from source import import_me
1318
+
1319
+ import_me.foo
1320
+ `
1321
+ });
1322
+ });
1323
+ });
1324
+ describe("with function calls", () => {
1325
+ it("handles simple function calls correctly", () => {
1326
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
1327
+ get children() {
1328
+ return [_$createComponent(py.MemberExpression.Part, {
1329
+ id: "myFunction"
1330
+ }, {
1331
+ fileName: import.meta.url,
1332
+ lineNumber: 591,
1333
+ columnNumber: 11
1334
+ }), _$createComponent(py.MemberExpression.Part, {
1335
+ args: [1, 2]
1336
+ }, {
1337
+ fileName: import.meta.url,
1338
+ lineNumber: 592,
1339
+ columnNumber: 11
1340
+ })];
1341
+ }
1342
+ }, {
1343
+ fileName: import.meta.url,
1344
+ lineNumber: 590,
1345
+ columnNumber: 9
1346
+ })])).toBe(d`
1347
+ myFunction(1, 2)
1348
+ `);
1349
+ });
1350
+ it("handles function calls with references correctly", () => {
1351
+ const xRefkey = refkey();
1352
+ const yRefkey = refkey();
1353
+ expect(toSourceText([_$createComponent(py.StatementList, {
1354
+ get children() {
1355
+ return [_$createComponent(py.VariableDeclaration, {
1356
+ name: "x",
1357
+ initializer: 1,
1358
+ refkey: xRefkey
1359
+ }, {
1360
+ fileName: import.meta.url,
1361
+ lineNumber: 606,
1362
+ columnNumber: 11
1363
+ }), _$createComponent(py.VariableDeclaration, {
1364
+ name: "y",
1365
+ initializer: 2,
1366
+ refkey: yRefkey
1367
+ }, {
1368
+ fileName: import.meta.url,
1369
+ lineNumber: 607,
1370
+ columnNumber: 11
1371
+ }), _$createComponent(py.MemberExpression, {
1372
+ get children() {
1373
+ return [_$createComponent(py.MemberExpression.Part, {
1374
+ id: "myFunction"
1375
+ }, {
1376
+ fileName: import.meta.url,
1377
+ lineNumber: 609,
1378
+ columnNumber: 13
1379
+ }), _$createComponent(py.MemberExpression.Part, {
1380
+ args: [xRefkey, yRefkey]
1381
+ }, {
1382
+ fileName: import.meta.url,
1383
+ lineNumber: 610,
1384
+ columnNumber: 13
1385
+ })];
1386
+ }
1387
+ }, {
1388
+ fileName: import.meta.url,
1389
+ lineNumber: 608,
1390
+ columnNumber: 11
1391
+ })];
1392
+ }
1393
+ }, {
1394
+ fileName: import.meta.url,
1395
+ lineNumber: 605,
1396
+ columnNumber: 9
1397
+ })])).toBe(d`
1398
+ x = 1
1399
+ y = 2
1400
+ myFunction(x, y)
1401
+ `);
1402
+ });
1403
+ it("handles method calls correctly", () => {
1404
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
1405
+ get children() {
1406
+ return [_$createComponent(py.MemberExpression.Part, {
1407
+ id: "method1"
1408
+ }, {
1409
+ fileName: import.meta.url,
1410
+ lineNumber: 625,
1411
+ columnNumber: 11
1412
+ }), _$createComponent(py.MemberExpression.Part, {
1413
+ args: [1, 2]
1414
+ }, {
1415
+ fileName: import.meta.url,
1416
+ lineNumber: 626,
1417
+ columnNumber: 11
1418
+ }), _$createComponent(py.MemberExpression.Part, {
1419
+ args: []
1420
+ }, {
1421
+ fileName: import.meta.url,
1422
+ lineNumber: 627,
1423
+ columnNumber: 11
1424
+ }), _$createComponent(py.MemberExpression.Part, {
1425
+ id: "method2"
1426
+ }, {
1427
+ fileName: import.meta.url,
1428
+ lineNumber: 628,
1429
+ columnNumber: 11
1430
+ }), _$createComponent(py.MemberExpression.Part, {
1431
+ args: []
1432
+ }, {
1433
+ fileName: import.meta.url,
1434
+ lineNumber: 629,
1435
+ columnNumber: 11
1436
+ }), _$createComponent(py.MemberExpression.Part, {
1437
+ id: "prop"
1438
+ }, {
1439
+ fileName: import.meta.url,
1440
+ lineNumber: 630,
1441
+ columnNumber: 11
1442
+ })];
1443
+ }
1444
+ }, {
1445
+ fileName: import.meta.url,
1446
+ lineNumber: 624,
1447
+ columnNumber: 9
1448
+ })])).toBe(d`
1449
+ method1(1, 2)().method2().prop
1450
+ `);
1451
+ });
1452
+ it("handles function calls correctly", () => {
1453
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
1454
+ get children() {
1455
+ return [_$createComponent(py.MemberExpression.Part, {
1456
+ id: "myFunction"
1457
+ }, {
1458
+ fileName: import.meta.url,
1459
+ lineNumber: 642,
1460
+ columnNumber: 11
1461
+ }), _$createComponent(py.MemberExpression.Part, {
1462
+ args: [1, 2]
1463
+ }, {
1464
+ fileName: import.meta.url,
1465
+ lineNumber: 643,
1466
+ columnNumber: 11
1467
+ }), _$createComponent(py.MemberExpression.Part, {
1468
+ id: "prop"
1469
+ }, {
1470
+ fileName: import.meta.url,
1471
+ lineNumber: 644,
1472
+ columnNumber: 11
1473
+ })];
1474
+ }
1475
+ }, {
1476
+ fileName: import.meta.url,
1477
+ lineNumber: 641,
1478
+ columnNumber: 9
1479
+ })])).toBe(d`
1480
+ myFunction(1, 2).prop
1481
+ `);
1482
+ });
1483
+ it("handles function calls correctly", () => {
1484
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
1485
+ get children() {
1486
+ return [_$createComponent(py.MemberExpression.Part, {
1487
+ id: "myFunction"
1488
+ }, {
1489
+ fileName: import.meta.url,
1490
+ lineNumber: 656,
1491
+ columnNumber: 11
1492
+ }), _$createComponent(py.MemberExpression.Part, {
1493
+ args: [1, 2]
1494
+ }, {
1495
+ fileName: import.meta.url,
1496
+ lineNumber: 657,
1497
+ columnNumber: 11
1498
+ }), _$createComponent(py.MemberExpression.Part, {
1499
+ id: "prop"
1500
+ }, {
1501
+ fileName: import.meta.url,
1502
+ lineNumber: 658,
1503
+ columnNumber: 11
1504
+ })];
1505
+ }
1506
+ }, {
1507
+ fileName: import.meta.url,
1508
+ lineNumber: 655,
1509
+ columnNumber: 9
1510
+ })])).toBe(d`
1511
+ myFunction(1, 2).prop
1512
+ `);
1513
+ });
1514
+ });
1515
+ describe("formatting", () => {
1516
+ describe("simple chains", () => {
1517
+ it("just dots", () => {
1518
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
1519
+ get children() {
1520
+ return [_$createComponent(py.MemberExpression.Part, {
1521
+ id: "four"
1522
+ }, {
1523
+ fileName: import.meta.url,
1524
+ lineNumber: 674,
1525
+ columnNumber: 15
1526
+ }), _$createComponent(py.MemberExpression.Part, {
1527
+ id: "four"
1528
+ }, {
1529
+ fileName: import.meta.url,
1530
+ lineNumber: 675,
1531
+ columnNumber: 15
1532
+ }), _$createComponent(py.MemberExpression.Part, {
1533
+ id: "two"
1534
+ }, {
1535
+ fileName: import.meta.url,
1536
+ lineNumber: 676,
1537
+ columnNumber: 15
1538
+ }), _$createComponent(py.MemberExpression.Part, {
1539
+ id: "two"
1540
+ }, {
1541
+ fileName: import.meta.url,
1542
+ lineNumber: 677,
1543
+ columnNumber: 15
1544
+ }), _$createComponent(py.MemberExpression.Part, {
1545
+ id: "two"
1546
+ }, {
1547
+ fileName: import.meta.url,
1548
+ lineNumber: 678,
1549
+ columnNumber: 15
1550
+ }), _$createComponent(py.MemberExpression.Part, {
1551
+ id: "two"
1552
+ }, {
1553
+ fileName: import.meta.url,
1554
+ lineNumber: 679,
1555
+ columnNumber: 15
1556
+ })];
1557
+ }
1558
+ }, {
1559
+ fileName: import.meta.url,
1560
+ lineNumber: 673,
1561
+ columnNumber: 13
1562
+ })], {
1563
+ printOptions: {
1564
+ printWidth: 14
1565
+ }
1566
+ })).toBe(d`
1567
+ four.four \\
1568
+ .two.two \\
1569
+ .two.two
1570
+ `);
1571
+ });
1572
+ it("bracket breaks", () => {
1573
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
1574
+ get children() {
1575
+ return [_$createComponent(py.MemberExpression.Part, {
1576
+ id: "obj"
1577
+ }, {
1578
+ fileName: import.meta.url,
1579
+ lineNumber: 696,
1580
+ columnNumber: 15
1581
+ }), _$createComponent(py.MemberExpression.Part, {
1582
+ key: "property-name"
1583
+ }, {
1584
+ fileName: import.meta.url,
1585
+ lineNumber: 697,
1586
+ columnNumber: 15
1587
+ }), _$createComponent(py.MemberExpression.Part, {
1588
+ id: "prop"
1589
+ }, {
1590
+ fileName: import.meta.url,
1591
+ lineNumber: 698,
1592
+ columnNumber: 15
1593
+ })];
1594
+ }
1595
+ }, {
1596
+ fileName: import.meta.url,
1597
+ lineNumber: 695,
1598
+ columnNumber: 13
1599
+ })], {
1600
+ printOptions: {
1601
+ printWidth: 12
1602
+ }
1603
+ })).toBe(d`
1604
+ obj[
1605
+ "property-name"
1606
+ ].prop
1607
+ `);
1608
+ });
1609
+ });
1610
+ describe("call chains", () => {
1611
+ it("renders multiple calls on the same line when there are no breaks and they fit", () => {
1612
+ expect(toSourceText([_$createComponent(py.MemberExpression, {
1613
+ get children() {
1614
+ return [_$createComponent(py.MemberExpression.Part, {
1615
+ id: "z"
1616
+ }, {
1617
+ fileName: import.meta.url,
1618
+ lineNumber: 716,
1619
+ columnNumber: 13
1620
+ }), _$createComponent(py.MemberExpression.Part, {
1621
+ id: "object"
1622
+ }, {
1623
+ fileName: import.meta.url,
1624
+ lineNumber: 717,
1625
+ columnNumber: 13
1626
+ }), _$createComponent(py.MemberExpression.Part, {
1627
+ args: true
1628
+ }, {
1629
+ fileName: import.meta.url,
1630
+ lineNumber: 718,
1631
+ columnNumber: 13
1632
+ }), _$createComponent(py.MemberExpression.Part, {
1633
+ id: "partial"
1634
+ }, {
1635
+ fileName: import.meta.url,
1636
+ lineNumber: 719,
1637
+ columnNumber: 13
1638
+ }), _$createComponent(py.MemberExpression.Part, {
1639
+ args: true
1640
+ }, {
1641
+ fileName: import.meta.url,
1642
+ lineNumber: 720,
1643
+ columnNumber: 13
1644
+ }), _$createComponent(py.MemberExpression.Part, {
1645
+ id: "optional"
1646
+ }, {
1647
+ fileName: import.meta.url,
1648
+ lineNumber: 721,
1649
+ columnNumber: 13
1650
+ }), _$createComponent(py.MemberExpression.Part, {
1651
+ args: true
1652
+ }, {
1653
+ fileName: import.meta.url,
1654
+ lineNumber: 722,
1655
+ columnNumber: 13
1656
+ })];
1657
+ }
1658
+ }, {
1659
+ fileName: import.meta.url,
1660
+ lineNumber: 715,
1661
+ columnNumber: 11
1662
+ })])).toBe(d`
1663
+ z.object().partial().optional()
1664
+ `);
1665
+ });
1666
+ });
1667
+ });
1668
+ //# sourceMappingURL=memberexpressions.test.js.map