@harmoniclabs/pebble 0.1.0-dev5 → 0.1.0-dev7

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 (321) hide show
  1. package/dist/IR/IRHash.d.ts +3 -3
  2. package/dist/IR/IRHash.js +47 -52
  3. package/dist/IR/IRNodes/IRApp.d.ts +12 -8
  4. package/dist/IR/IRNodes/IRApp.js +34 -20
  5. package/dist/IR/IRNodes/IRCase.d.ts +11 -7
  6. package/dist/IR/IRNodes/IRCase.js +33 -32
  7. package/dist/IR/IRNodes/IRConst.d.ts +7 -5
  8. package/dist/IR/IRNodes/IRConst.js +23 -13
  9. package/dist/IR/IRNodes/IRConstr.d.ts +11 -7
  10. package/dist/IR/IRNodes/IRConstr.js +34 -37
  11. package/dist/IR/IRNodes/IRDelayed.d.ts +12 -9
  12. package/dist/IR/IRNodes/IRDelayed.js +22 -18
  13. package/dist/IR/IRNodes/IRError.d.ts +9 -6
  14. package/dist/IR/IRNodes/IRError.js +12 -5
  15. package/dist/IR/IRNodes/IRForced.d.ts +9 -6
  16. package/dist/IR/IRNodes/IRForced.js +22 -18
  17. package/dist/IR/IRNodes/IRFunc.d.ts +14 -10
  18. package/dist/IR/IRNodes/IRFunc.js +35 -38
  19. package/dist/IR/IRNodes/IRHoisted.d.ts +16 -9
  20. package/dist/IR/IRNodes/IRHoisted.js +36 -18
  21. package/dist/IR/IRNodes/IRLetted.d.ts +14 -34
  22. package/dist/IR/IRNodes/IRLetted.js +65 -297
  23. package/dist/IR/IRNodes/IRNative/IRNativeTag.d.ts +3 -3
  24. package/dist/IR/IRNodes/IRNative/IRNativeTag.js +4 -4
  25. package/dist/IR/IRNodes/IRNative/index.d.ts +10 -8
  26. package/dist/IR/IRNodes/IRNative/index.js +56 -18
  27. package/dist/IR/IRNodes/IRNative/isForcedNative.d.ts +2 -0
  28. package/dist/IR/IRNodes/IRNative/isForcedNative.js +1 -1
  29. package/dist/IR/IRNodes/IRRecursive.d.ts +18 -10
  30. package/dist/IR/IRNodes/IRRecursive.js +36 -44
  31. package/dist/IR/IRNodes/IRSelfCall.d.ts +10 -24
  32. package/dist/IR/IRNodes/IRSelfCall.js +25 -87
  33. package/dist/IR/IRNodes/IRVar.d.ts +11 -19
  34. package/dist/IR/IRNodes/IRVar.js +26 -54
  35. package/dist/IR/IRNodes/utils/dependsByDbns.d.ts +1 -1
  36. package/dist/IR/IRNodes/utils/dependsByDbns.js +5 -11
  37. package/dist/IR/IRNodes/utils/hashVarSym.d.ts +1 -0
  38. package/dist/IR/IRNodes/utils/hashVarSym.js +37 -0
  39. package/dist/IR/IRNodes/utils/makeArrayLikeProxy.d.ts +2 -1
  40. package/dist/IR/IRTerm.d.ts +7 -0
  41. package/dist/IR/toUPLC/CompilerOptions.d.ts +5 -0
  42. package/dist/IR/toUPLC/CompilerOptions.js +10 -1
  43. package/dist/IR/toUPLC/_internal/_modifyChildFromTo.js +3 -0
  44. package/dist/IR/toUPLC/_internal/findAll.js +2 -73
  45. package/dist/IR/toUPLC/_internal/getDebruijnInTerm.js +7 -34
  46. package/dist/IR/toUPLC/_internal/iterTree.js +3 -17
  47. package/dist/IR/toUPLC/common_hoisted.d.ts +2 -0
  48. package/dist/IR/toUPLC/common_hoisted.js +4 -0
  49. package/dist/IR/toUPLC/compileIRToUPLC.d.ts +1 -1
  50. package/dist/IR/toUPLC/compileIRToUPLC.js +91 -14
  51. package/dist/IR/toUPLC/ctx/ToUplcCtx.d.ts +16 -0
  52. package/dist/IR/toUPLC/ctx/ToUplcCtx.js +67 -0
  53. package/dist/IR/toUPLC/subRoutines/_comptimeDropN.d.ts +8 -0
  54. package/dist/IR/toUPLC/subRoutines/_comptimeDropN.js +95 -0
  55. package/dist/IR/toUPLC/subRoutines/handleHoistedAndReturnRoot/index.js +7 -54
  56. package/dist/IR/toUPLC/subRoutines/handleLetted/groupByScope.d.ts +6 -13
  57. package/dist/IR/toUPLC/subRoutines/handleLetted/groupByScope.js +65 -71
  58. package/dist/IR/toUPLC/subRoutines/handleLetted/index.js +44 -170
  59. package/dist/IR/toUPLC/subRoutines/handleRecursiveTerms.js +7 -3
  60. package/dist/IR/toUPLC/subRoutines/hoistForcedNatives.js +3 -2
  61. package/dist/IR/toUPLC/subRoutines/inlineSingleUseAndReturnRoot/InlineSingleUseCtx.d.ts +22 -0
  62. package/dist/IR/toUPLC/subRoutines/inlineSingleUseAndReturnRoot/InlineSingleUseCtx.js +59 -0
  63. package/dist/IR/toUPLC/subRoutines/inlineSingleUseAndReturnRoot/inlineSingleUseAndReturnRoot.d.ts +0 -0
  64. package/dist/IR/toUPLC/subRoutines/inlineSingleUseAndReturnRoot/inlineSingleUseAndReturnRoot.js +217 -0
  65. package/dist/IR/toUPLC/subRoutines/markRecursiveHoistsAsForced.js +12 -49
  66. package/dist/IR/toUPLC/subRoutines/performUplcOptimizationsAndReturnRoot/expandFuncsAndReturnRoot.d.ts +1 -1
  67. package/dist/IR/toUPLC/subRoutines/performUplcOptimizationsAndReturnRoot/expandFuncsAndReturnRoot.js +11 -14
  68. package/dist/IR/toUPLC/subRoutines/performUplcOptimizationsAndReturnRoot/{index.d.ts → performUplcOptimizationsAndReturnRoot.d.ts} +0 -2
  69. package/dist/IR/toUPLC/subRoutines/performUplcOptimizationsAndReturnRoot/performUplcOptimizationsAndReturnRoot.js +151 -0
  70. package/dist/IR/toUPLC/subRoutines/removeUnusuedVarsAndReturnRoot/RemoveUnusedVarsCtx.d.ts +11 -0
  71. package/dist/IR/toUPLC/subRoutines/removeUnusuedVarsAndReturnRoot/RemoveUnusedVarsCtx.js +46 -0
  72. package/dist/IR/toUPLC/subRoutines/removeUnusuedVarsAndReturnRoot/removeUnusuedVarsAndReturnRoot.d.ts +2 -0
  73. package/dist/IR/toUPLC/subRoutines/removeUnusuedVarsAndReturnRoot/removeUnusuedVarsAndReturnRoot.js +80 -0
  74. package/dist/IR/toUPLC/subRoutines/replaceHoistedWithLetted.js +18 -11
  75. package/dist/IR/toUPLC/subRoutines/replaceNatives/nativeToIR.d.ts +45 -0
  76. package/dist/IR/toUPLC/subRoutines/replaceNatives/nativeToIR.js +277 -478
  77. package/dist/IR/toUPLC/subRoutines/rewriteNativesAppliedToConstantsAndReturnRoot.d.ts +2 -0
  78. package/dist/IR/toUPLC/subRoutines/rewriteNativesAppliedToConstantsAndReturnRoot.js +85 -0
  79. package/dist/IR/toUPLC/subRoutines/sanifyTree.js +1 -0
  80. package/dist/IR/toUPLC/utils/getApplicationTerms.d.ts +6 -0
  81. package/dist/IR/toUPLC/utils/getApplicationTerms.js +37 -0
  82. package/dist/IR/tree_utils/_ir_lazyChooseList.d.ts +2 -2
  83. package/dist/IR/tree_utils/_ir_lazyChooseList.js +4 -2
  84. package/dist/IR/tree_utils/_ir_lazyIfThenElse.d.ts +1 -1
  85. package/dist/IR/tree_utils/_ir_lazyIfThenElse.js +4 -2
  86. package/dist/IR/tree_utils/_ir_let.d.ts +2 -1
  87. package/dist/IR/tree_utils/_ir_let.js +6 -2
  88. package/dist/IR/utils/isClosedIRTerm.d.ts +1 -0
  89. package/dist/IR/utils/isClosedIRTerm.js +40 -26
  90. package/dist/IR/utils/positiveIntAsBytes.d.ts +1 -0
  91. package/dist/IR/utils/positiveIntAsBytes.js +4 -4
  92. package/dist/IR/utils/showIR.d.ts +10 -21
  93. package/dist/IR/utils/showIR.js +66 -64
  94. package/dist/ast/nodes/common/Identifier.d.ts +1 -0
  95. package/dist/ast/nodes/common/Identifier.js +3 -0
  96. package/dist/ast/nodes/expr/CaseExpr.d.ts +5 -5
  97. package/dist/ast/nodes/expr/ElemAccessExpr.d.ts +2 -2
  98. package/dist/ast/nodes/expr/ParentesizedExpr.d.ts +1 -1
  99. package/dist/ast/nodes/expr/PebbleExpr.d.ts +2 -1
  100. package/dist/ast/nodes/expr/PropAccessExpr.d.ts +3 -3
  101. package/dist/ast/nodes/expr/TernaryExpr.d.ts +3 -3
  102. package/dist/ast/nodes/expr/TypeConversionExpr.d.ts +2 -1
  103. package/dist/ast/nodes/expr/TypeConversionExpr.js +2 -0
  104. package/dist/ast/nodes/expr/binary/BinaryExpr.d.ts +42 -42
  105. package/dist/ast/nodes/expr/functions/CallExpr.d.ts +1 -1
  106. package/dist/ast/nodes/expr/functions/FuncExpr.d.ts +2 -1
  107. package/dist/ast/nodes/expr/functions/FuncExpr.js +6 -0
  108. package/dist/ast/nodes/expr/litteral/LitContextExpr.d.ts +6 -0
  109. package/dist/ast/nodes/expr/litteral/LitContextExpr.js +6 -0
  110. package/dist/ast/nodes/expr/litteral/LitFailExpr.d.ts +6 -0
  111. package/dist/ast/nodes/expr/litteral/LitFailExpr.js +6 -0
  112. package/dist/ast/nodes/expr/litteral/LitteralExpr.d.ts +3 -1
  113. package/dist/ast/nodes/expr/litteral/LitteralExpr.js +5 -1
  114. package/dist/ast/nodes/statements/AssertStmt.d.ts +2 -2
  115. package/dist/ast/nodes/statements/AssignmentStmt.d.ts +1 -1
  116. package/dist/ast/nodes/statements/BlockStmt.d.ts +1 -1
  117. package/dist/ast/nodes/statements/FailStmt.d.ts +1 -1
  118. package/dist/ast/nodes/statements/ForOfStmt.d.ts +4 -2
  119. package/dist/ast/nodes/statements/ForOfStmt.js +6 -0
  120. package/dist/ast/nodes/statements/ForStmt.d.ts +6 -4
  121. package/dist/ast/nodes/statements/ForStmt.js +6 -0
  122. package/dist/ast/nodes/statements/IfStmt.d.ts +8 -5
  123. package/dist/ast/nodes/statements/IfStmt.js +13 -0
  124. package/dist/ast/nodes/statements/MatchStmt.d.ts +13 -4
  125. package/dist/ast/nodes/statements/MatchStmt.js +22 -1
  126. package/dist/ast/nodes/statements/PebbleStmt.d.ts +2 -1
  127. package/dist/ast/nodes/statements/PebbleStmt.js +3 -1
  128. package/dist/ast/nodes/statements/ReturnStmt.d.ts +1 -1
  129. package/dist/ast/nodes/statements/WhileStmt.d.ts +4 -2
  130. package/dist/ast/nodes/statements/WhileStmt.js +6 -0
  131. package/dist/ast/nodes/statements/declarations/ContractDecl.d.ts +17 -0
  132. package/dist/ast/nodes/statements/declarations/ContractDecl.js +22 -0
  133. package/dist/ast/nodes/statements/declarations/VarDecl/ArrayLikeDeconstr.d.ts +1 -1
  134. package/dist/ast/nodes/statements/declarations/VarDecl/HasInit.d.ts +1 -1
  135. package/dist/ast/nodes/statements/declarations/VarDecl/NamedDeconstructVarDecl.d.ts +1 -1
  136. package/dist/ast/nodes/statements/declarations/VarDecl/SimpleVarDecl.d.ts +2 -1
  137. package/dist/ast/nodes/statements/declarations/VarDecl/SimpleVarDecl.js +6 -0
  138. package/dist/ast/nodes/statements/declarations/VarDecl/SingleDeconstructVarDecl.d.ts +1 -1
  139. package/dist/compiler/AstCompiler/AstCompiler.d.ts +7 -2
  140. package/dist/compiler/AstCompiler/AstCompiler.js +129 -25
  141. package/dist/compiler/AstCompiler/internal/_deriveContractBody/_deriveContractBody.d.ts +10 -0
  142. package/dist/compiler/AstCompiler/internal/_deriveContractBody/_deriveContractBody.js +777 -0
  143. package/dist/compiler/AstCompiler/internal/exprs/_compileBinaryExpr.js +1 -1
  144. package/dist/compiler/AstCompiler/internal/exprs/_compileExpr.js +5 -1
  145. package/dist/compiler/AstCompiler/internal/exprs/_compileFuncExpr.js +7 -4
  146. package/dist/compiler/AstCompiler/internal/exprs/_compileLitteralExpr.js +8 -2
  147. package/dist/compiler/AstCompiler/internal/exprs/_compilePropAccessExpr.js +1 -1
  148. package/dist/compiler/AstCompiler/internal/exprs/_compileTypeConversionExpr.js +2 -1
  149. package/dist/compiler/AstCompiler/internal/exprs/_compileUnaryPrefixExpr.js +1 -1
  150. package/dist/compiler/AstCompiler/internal/exprs/_compileVarAccessExpr.js +3 -1
  151. package/dist/compiler/AstCompiler/internal/statements/_compileAssignmentStmt.js +8 -8
  152. package/dist/compiler/AstCompiler/internal/statements/_compileMatchStmt.d.ts +2 -2
  153. package/dist/compiler/AstCompiler/internal/statements/_compileMatchStmt.js +48 -24
  154. package/dist/compiler/AstCompiler/internal/statements/_compileStatement.js +4 -1
  155. package/dist/compiler/AstCompiler/internal/statements/_compileVarStmt.d.ts +2 -1
  156. package/dist/compiler/AstCompiler/internal/statements/_compileVarStmt.js +4 -3
  157. package/dist/compiler/AstCompiler/internal/types/_compileDataEncodedConcreteType.js +1 -1
  158. package/dist/compiler/AstCompiler/internal/types/_compileSopEncodedConcreteType.js +4 -1
  159. package/dist/compiler/AstCompiler/scope/AstScope.d.ts +1 -0
  160. package/dist/compiler/AstCompiler/scope/AstScope.js +9 -3
  161. package/dist/compiler/AstCompiler/utils/getPropAccessReturnType.js +6 -4
  162. package/dist/compiler/Compiler.js +7 -1
  163. package/dist/compiler/TirCompiler/compileTirProgram.js +4 -1
  164. package/dist/compiler/TirCompiler/expressify/ExpressifyCtx.d.ts +17 -5
  165. package/dist/compiler/TirCompiler/expressify/ExpressifyCtx.js +79 -49
  166. package/dist/compiler/TirCompiler/expressify/determineReassignedVariablesAndReturn.js +13 -2
  167. package/dist/compiler/TirCompiler/expressify/expressify.d.ts +2 -1
  168. package/dist/compiler/TirCompiler/expressify/expressify.js +102 -41
  169. package/dist/compiler/TirCompiler/expressify/expressifyForStmt.d.ts +2 -1
  170. package/dist/compiler/TirCompiler/expressify/expressifyForStmt.js +77 -12
  171. package/dist/compiler/TirCompiler/expressify/expressifyIfBranch.js +1 -1
  172. package/dist/compiler/TirCompiler/expressify/expressifyVarAssignmentStmt.d.ts +1 -2
  173. package/dist/compiler/TirCompiler/expressify/expressifyVarAssignmentStmt.js +16 -9
  174. package/dist/compiler/TirCompiler/expressify/expressifyVarDecl.js +6 -8
  175. package/dist/compiler/TirCompiler/expressify/expressifyVars.js +146 -13
  176. package/dist/compiler/TirCompiler/expressify/flattenSopNamedDeconstructInplace_addTopDestructToCtx_getNestedDeconstruct.js +1 -0
  177. package/dist/compiler/internalVar.d.ts +1 -1
  178. package/dist/compiler/internalVar.js +31 -24
  179. package/dist/compiler/io/CompilerIoApi.d.ts +1 -1
  180. package/dist/compiler/io/IOutputStream.d.ts +1 -0
  181. package/dist/compiler/io/IOutputStream.js +18 -3
  182. package/dist/compiler/path/getAbsolutePath.js +4 -6
  183. package/dist/compiler/tir/expressions/ITirExpr.d.ts +2 -0
  184. package/dist/compiler/tir/expressions/TirAssertAndContinueExpr.d.ts +4 -2
  185. package/dist/compiler/tir/expressions/TirAssertAndContinueExpr.js +16 -2
  186. package/dist/compiler/tir/expressions/TirCallExpr.d.ts +3 -1
  187. package/dist/compiler/tir/expressions/TirCallExpr.js +16 -1
  188. package/dist/compiler/tir/expressions/TirCaseExpr.d.ts +6 -1
  189. package/dist/compiler/tir/expressions/TirCaseExpr.js +105 -60
  190. package/dist/compiler/tir/expressions/TirElemAccessExpr.d.ts +3 -1
  191. package/dist/compiler/tir/expressions/TirElemAccessExpr.js +9 -1
  192. package/dist/compiler/tir/expressions/TirFailExpr.d.ts +3 -1
  193. package/dist/compiler/tir/expressions/TirFailExpr.js +9 -1
  194. package/dist/compiler/tir/expressions/TirFromDataExpr.d.ts +3 -2
  195. package/dist/compiler/tir/expressions/TirFromDataExpr.js +85 -56
  196. package/dist/compiler/tir/expressions/TirFuncExpr.d.ts +4 -10
  197. package/dist/compiler/tir/expressions/TirFuncExpr.js +30 -13
  198. package/dist/compiler/tir/expressions/TirHoistedExpr.d.ts +3 -1
  199. package/dist/compiler/tir/expressions/TirHoistedExpr.js +8 -0
  200. package/dist/compiler/tir/expressions/TirInlineClosedIR.d.ts +4 -1
  201. package/dist/compiler/tir/expressions/TirInlineClosedIR.js +8 -0
  202. package/dist/compiler/tir/expressions/TirLettedExpr.d.ts +6 -3
  203. package/dist/compiler/tir/expressions/TirLettedExpr.js +20 -7
  204. package/dist/compiler/tir/expressions/TirNativeFunc.d.ts +9 -5
  205. package/dist/compiler/tir/expressions/TirNativeFunc.js +58 -22
  206. package/dist/compiler/tir/expressions/TirParentesizedExpr.d.ts +3 -1
  207. package/dist/compiler/tir/expressions/TirParentesizedExpr.js +6 -0
  208. package/dist/compiler/tir/expressions/TirPropAccessExpr.d.ts +3 -1
  209. package/dist/compiler/tir/expressions/TirPropAccessExpr.js +9 -1
  210. package/dist/compiler/tir/expressions/TirTernaryExpr.d.ts +3 -1
  211. package/dist/compiler/tir/expressions/TirTernaryExpr.js +16 -5
  212. package/dist/compiler/tir/expressions/TirToDataExpr.d.ts +3 -1
  213. package/dist/compiler/tir/expressions/TirToDataExpr.js +56 -25
  214. package/dist/compiler/tir/expressions/TirTraceIfFalseExpr.d.ts +3 -1
  215. package/dist/compiler/tir/expressions/TirTraceIfFalseExpr.js +21 -4
  216. package/dist/compiler/tir/expressions/TirTypeConversionExpr.d.ts +3 -1
  217. package/dist/compiler/tir/expressions/TirTypeConversionExpr.js +9 -1
  218. package/dist/compiler/tir/expressions/TirVariableAccessExpr.d.ts +6 -3
  219. package/dist/compiler/tir/expressions/TirVariableAccessExpr.js +22 -8
  220. package/dist/compiler/tir/expressions/ToIRTermCtx.d.ts +19 -20
  221. package/dist/compiler/tir/expressions/ToIRTermCtx.js +74 -50
  222. package/dist/compiler/tir/expressions/binary/TirBinaryExpr.d.ts +41 -0
  223. package/dist/compiler/tir/expressions/binary/TirBinaryExpr.js +180 -4
  224. package/dist/compiler/tir/expressions/litteral/TirLitArrExpr.d.ts +4 -2
  225. package/dist/compiler/tir/expressions/litteral/TirLitArrExpr.js +8 -2
  226. package/dist/compiler/tir/expressions/litteral/TirLitFailExpr.d.ts +17 -0
  227. package/dist/compiler/tir/expressions/litteral/TirLitFailExpr.js +21 -0
  228. package/dist/compiler/tir/expressions/litteral/TirLitFalseExpr.d.ts +4 -1
  229. package/dist/compiler/tir/expressions/litteral/TirLitFalseExpr.js +4 -0
  230. package/dist/compiler/tir/expressions/litteral/TirLitHexBytesExpr.d.ts +4 -1
  231. package/dist/compiler/tir/expressions/litteral/TirLitHexBytesExpr.js +5 -0
  232. package/dist/compiler/tir/expressions/litteral/TirLitIntExpr.d.ts +4 -1
  233. package/dist/compiler/tir/expressions/litteral/TirLitIntExpr.js +4 -0
  234. package/dist/compiler/tir/expressions/litteral/TirLitNamedObjExpr.d.ts +3 -1
  235. package/dist/compiler/tir/expressions/litteral/TirLitNamedObjExpr.js +5 -0
  236. package/dist/compiler/tir/expressions/litteral/TirLitObjExpr.d.ts +3 -1
  237. package/dist/compiler/tir/expressions/litteral/TirLitObjExpr.js +5 -0
  238. package/dist/compiler/tir/expressions/litteral/TirLitStrExpr.d.ts +4 -1
  239. package/dist/compiler/tir/expressions/litteral/TirLitStrExpr.js +4 -0
  240. package/dist/compiler/tir/expressions/litteral/TirLitThisExpr.d.ts +4 -1
  241. package/dist/compiler/tir/expressions/litteral/TirLitThisExpr.js +7 -3
  242. package/dist/compiler/tir/expressions/litteral/TirLitTrueExpr.d.ts +4 -1
  243. package/dist/compiler/tir/expressions/litteral/TirLitTrueExpr.js +4 -0
  244. package/dist/compiler/tir/expressions/litteral/TirLitUndefExpr.d.ts +4 -1
  245. package/dist/compiler/tir/expressions/litteral/TirLitUndefExpr.js +4 -0
  246. package/dist/compiler/tir/expressions/litteral/TirLitVoidExpr.d.ts +4 -1
  247. package/dist/compiler/tir/expressions/litteral/TirLitVoidExpr.js +4 -0
  248. package/dist/compiler/tir/expressions/litteral/TirLitteralExpr.d.ts +2 -1
  249. package/dist/compiler/tir/expressions/litteral/TirLitteralExpr.js +3 -1
  250. package/dist/compiler/tir/expressions/unary/TirUnaryExclamation.d.ts +4 -2
  251. package/dist/compiler/tir/expressions/unary/TirUnaryExclamation.js +8 -3
  252. package/dist/compiler/tir/expressions/unary/TirUnaryMinus.d.ts +4 -2
  253. package/dist/compiler/tir/expressions/unary/TirUnaryMinus.js +8 -2
  254. package/dist/compiler/tir/expressions/unary/TirUnaryPlus.d.ts +3 -1
  255. package/dist/compiler/tir/expressions/unary/TirUnaryPlus.js +6 -0
  256. package/dist/compiler/tir/expressions/unary/TirUnaryTilde.d.ts +4 -2
  257. package/dist/compiler/tir/expressions/unary/TirUnaryTilde.js +8 -2
  258. package/dist/compiler/tir/program/TypedProgram.d.ts +3 -2
  259. package/dist/compiler/tir/program/TypedProgram.js +9 -0
  260. package/dist/compiler/tir/program/stdScope/stdScope.js +135 -149
  261. package/dist/compiler/tir/statements/TirAssertStmt.d.ts +2 -0
  262. package/dist/compiler/tir/statements/TirAssertStmt.js +10 -0
  263. package/dist/compiler/tir/statements/TirAssignmentStmt.d.ts +2 -0
  264. package/dist/compiler/tir/statements/TirAssignmentStmt.js +8 -0
  265. package/dist/compiler/tir/statements/TirBlockStmt.d.ts +2 -0
  266. package/dist/compiler/tir/statements/TirBlockStmt.js +16 -0
  267. package/dist/compiler/tir/statements/TirBreakStmt.d.ts +2 -0
  268. package/dist/compiler/tir/statements/TirBreakStmt.js +8 -0
  269. package/dist/compiler/tir/statements/TirContinueStmt.d.ts +2 -0
  270. package/dist/compiler/tir/statements/TirContinueStmt.js +8 -0
  271. package/dist/compiler/tir/statements/TirFailStmt.d.ts +2 -0
  272. package/dist/compiler/tir/statements/TirFailStmt.js +8 -0
  273. package/dist/compiler/tir/statements/TirForOfStmt.d.ts +2 -0
  274. package/dist/compiler/tir/statements/TirForOfStmt.js +14 -0
  275. package/dist/compiler/tir/statements/TirForStmt.d.ts +2 -0
  276. package/dist/compiler/tir/statements/TirForStmt.js +21 -0
  277. package/dist/compiler/tir/statements/TirIfStmt.d.ts +2 -0
  278. package/dist/compiler/tir/statements/TirIfStmt.js +16 -0
  279. package/dist/compiler/tir/statements/TirMatchStmt.d.ts +2 -0
  280. package/dist/compiler/tir/statements/TirMatchStmt.js +30 -0
  281. package/dist/compiler/tir/statements/TirReturnStmt.d.ts +2 -0
  282. package/dist/compiler/tir/statements/TirReturnStmt.js +8 -0
  283. package/dist/compiler/tir/statements/TirStmt.d.ts +2 -0
  284. package/dist/compiler/tir/statements/TirVarDecl/TirArrayLikeDeconstr.d.ts +2 -0
  285. package/dist/compiler/tir/statements/TirVarDecl/TirArrayLikeDeconstr.js +30 -0
  286. package/dist/compiler/tir/statements/TirVarDecl/TirNamedDeconstructVarDecl.d.ts +3 -1
  287. package/dist/compiler/tir/statements/TirVarDecl/TirNamedDeconstructVarDecl.js +28 -0
  288. package/dist/compiler/tir/statements/TirVarDecl/TirSimpleVarDecl.d.ts +3 -0
  289. package/dist/compiler/tir/statements/TirVarDecl/TirSimpleVarDecl.js +13 -0
  290. package/dist/compiler/tir/statements/TirVarDecl/TirSingleDeconstructVarDecl.d.ts +3 -1
  291. package/dist/compiler/tir/statements/TirVarDecl/TirSingleDeconstructVarDecl.js +28 -0
  292. package/dist/compiler/tir/statements/TirWhileStmt.d.ts +2 -0
  293. package/dist/compiler/tir/statements/TirWhileStmt.js +14 -0
  294. package/dist/compiler/tir/types/utils/canAssignTo.js +1 -1
  295. package/dist/diagnostics/DiagnosticEmitter.js +1 -1
  296. package/dist/diagnostics/diagnosticMessages.generated.d.ts +10 -1
  297. package/dist/diagnostics/diagnosticMessages.generated.js +20 -2
  298. package/dist/parser/Parser.d.ts +8 -3
  299. package/dist/parser/Parser.js +180 -32
  300. package/dist/parser/Precedence.js +1 -0
  301. package/dist/tokenizer/Token.d.ts +81 -72
  302. package/dist/tokenizer/Token.js +82 -72
  303. package/dist/tokenizer/utils/tokenFromKeyword.js +32 -10
  304. package/dist/tokenizer/utils/tokenIsAlsoIdentifier.js +10 -0
  305. package/dist/utils/BitUtils/index.js +1 -1
  306. package/dist/utils/UPLCFlatUtils/index.js +1 -1
  307. package/dist/utils/array/keepSortedArrInplace.js +1 -0
  308. package/package.json +3 -1
  309. package/dist/IR/IRNodes/utils/isClosedAtDbn.d.ts +0 -2
  310. package/dist/IR/IRNodes/utils/isClosedAtDbn.js +0 -22
  311. package/dist/IR/toUPLC/_internal/_irToUplc.d.ts +0 -9
  312. package/dist/IR/toUPLC/_internal/_irToUplc.js +0 -156
  313. package/dist/IR/toUPLC/subRoutines/handleLetted/incrementUnboundDbns.d.ts +0 -9
  314. package/dist/IR/toUPLC/subRoutines/handleLetted/incrementUnboundDbns.js +0 -73
  315. package/dist/IR/toUPLC/subRoutines/inlineSingleUseApplications.d.ts +0 -1
  316. package/dist/IR/toUPLC/subRoutines/inlineSingleUseApplications.js +0 -12
  317. package/dist/IR/toUPLC/subRoutines/performUplcOptimizationsAndReturnRoot/index.js +0 -227
  318. package/dist/IR/tree_utils/_ir_apps.d.ts +0 -3
  319. package/dist/IR/tree_utils/_ir_apps.js +0 -8
  320. package/dist/compiler/TirCompiler/internal/_compileHoistedDeps.d.ts +0 -5
  321. package/dist/compiler/TirCompiler/internal/_compileHoistedDeps.js +0 -37
@@ -0,0 +1,217 @@
1
+ /*
2
+ import { IRFunc, IRHoisted, IRLetted } from "../../../IRNodes/index.js";
3
+ import { IRSelfCall } from "../../../IRNodes/IRSelfCall.js";
4
+ import { IRVar } from "../../../IRNodes/IRVar.js";
5
+ import { IRTerm } from "../../../IRTerm.js";
6
+ import { _modifyChildFromTo } from "../../_internal/_modifyChildFromTo.js";
7
+ import { getApplicationTerms } from "../../utils/getApplicationTerms.js";
8
+ import { InlineSingleUseCtx } from "./InlineSingleUseCtx.js";
9
+
10
+ export interface InlineSingleResult {
11
+ term: IRTerm;
12
+ somethingWasInlined: boolean;
13
+ }
14
+
15
+ // DOES NOT WORK AS IS
16
+ // TODO: FIND BUG (use onlySpend contract)
17
+ export function inlineSingleUseAndReturnRoot( term: IRTerm ): InlineSingleResult
18
+ {
19
+ // we need to go bottom up
20
+ // ONLY REMOVE UNUSED VARS IF NOT UNIT
21
+ // (in which case we need to keep it for eventual side effects (asserts and traces))
22
+
23
+ return _inlineSingleUse( term, InlineSingleUseCtx.root( 0 ) );
24
+ }
25
+
26
+ // DOES NOT WORK AS IS
27
+ // TODO: FIND BUG (use onlySpend contract)
28
+ function _inlineSingleUse( term: IRTerm, ctx: InlineSingleUseCtx ): InlineSingleResult
29
+ {
30
+ let somethingWasInlined = false;
31
+
32
+ if( term instanceof IRVar ) {
33
+ // increment used
34
+ ctx.incrementVarUse( term.dbn );
35
+ return { term: term, somethingWasInlined: false };
36
+ }
37
+
38
+ const applicationTerms = getApplicationTerms( term );
39
+
40
+ if( !applicationTerms )
41
+ {
42
+ const childrens = term.children();
43
+ const nextCtx = term instanceof IRFunc
44
+ ? ctx.newChild( term.arity )
45
+ : ctx;
46
+ for( const c of childrens ) {
47
+ const inlineResult = _inlineSingleUse( c, nextCtx );
48
+ somethingWasInlined ||= inlineResult.somethingWasInlined;
49
+ }
50
+ return { term, somethingWasInlined };
51
+ }
52
+
53
+ const { func, args } = applicationTerms;
54
+
55
+ if(!( func instanceof IRFunc )) {
56
+ for( const child of term.children() ) {
57
+ // same as parent ctx
58
+ const inlineResult = _inlineSingleUse( child, ctx );
59
+ somethingWasInlined ||= inlineResult.somethingWasInlined;
60
+ }
61
+ return { term, somethingWasInlined };
62
+ }
63
+
64
+ const funcCtx = ctx.newChild( func.arity );
65
+ const inlineResult = _inlineSingleUse( func.body, funcCtx );
66
+ func.body = inlineResult.term;
67
+ somethingWasInlined ||= inlineResult.somethingWasInlined;
68
+
69
+ // if all variables are either not used at all, or used more than once, keep as is
70
+ if( !funcCtx.localVarsUseCount.some( nUses => nUses === 1 ) )
71
+ {
72
+ for( const funcArg of args ) {
73
+ // arguments passed have the same context of the function called
74
+ const inlineResult = _inlineSingleUse( funcArg, ctx );
75
+ somethingWasInlined ||= inlineResult.somethingWasInlined;
76
+ }
77
+ return { term, somethingWasInlined };
78
+ }
79
+
80
+ // if we get here, at least one variable is used exactly once
81
+ somethingWasInlined = true;
82
+
83
+ // removed dbns are relative indices (0-based) of the function parameters
84
+ const removedDbns: bigint[] = funcCtx.localVarsUseCount
85
+ .map( (varCount, idx) => varCount === 1 ? BigInt(idx) : undefined )
86
+ .filter( (v): v is bigint => typeof v === "bigint" );
87
+
88
+ // remove vars here
89
+ const inlinedTerms: { [dbn: number]: IRTerm } = {};
90
+ const remainingArgs: IRTerm[] = [];
91
+ args.forEach( ( arg, idx ) => {
92
+ const nUses = funcCtx.localVarsUseCount[ idx ];
93
+ if( nUses === 1 ) {
94
+ // map using relative parameter index
95
+ inlinedTerms[ idx ] = arg;
96
+ } else remainingArgs.push( arg );
97
+ } );
98
+
99
+ func.arity -= removedDbns.length;
100
+ const decrementedFuncBody = _decrementAndInline(
101
+ func.body,
102
+ removedDbns,
103
+ inlinedTerms,
104
+ 0
105
+ );
106
+ func.body = decrementedFuncBody;
107
+
108
+ for( const funcArg of remainingArgs ) {
109
+ // arguments passed have the same context of the function called
110
+ _inlineSingleUse( funcArg, ctx );
111
+ }
112
+
113
+ const someArgsWereUsed = remainingArgs.length > 0;
114
+ const newTerm = someArgsWereUsed
115
+ ? _ir_apps( func, ...(remainingArgs as [IRTerm, ...IRTerm[]]) )
116
+ : decrementedFuncBody;
117
+
118
+ const parent = term.parent;
119
+ if( parent ) _modifyChildFromTo( parent, term, newTerm );
120
+
121
+ return { term: newTerm, somethingWasInlined };
122
+ }
123
+
124
+ function _getDbnDecrement( termDbn: number, removedDbns: bigint[], paramOffset: number ): number
125
+ {
126
+ // termDbn is absolute inside current function. removedDbns are relative indices (0..arity-1)
127
+ // A variable corresponds to a parameter if termDbn - paramOffset is within removed list
128
+ const rel = termDbn - paramOffset;
129
+ if( rel < 0 ) return 0;
130
+ // number of removed parameters with index < rel
131
+ return removedDbns.filter( dbn => Number(dbn) < rel ).length;
132
+ }
133
+
134
+ function _decrementAndInline(
135
+ term: IRTerm,
136
+ removedDbns: bigint[],
137
+ inlineDbns: { [dbn: number]: IRTerm },
138
+ paramOffset: number // absolute dbn of parameter 0 for current function scope
139
+ ): IRTerm
140
+ {
141
+ if( removedDbns.length <= 0 ) return term;
142
+
143
+ if( term instanceof IRVar ) {
144
+ const relIdx = term.dbn - paramOffset;
145
+ if( relIdx >= 0 ) {
146
+ let inlineTerm = inlineDbns[ relIdx ];
147
+ if( inlineTerm ) {
148
+ // clone to avoid sharing and adjust dbns relative to current paramOffset
149
+ inlineTerm = inlineTerm.clone();
150
+ inlineTerm = _incrementTermDbns( inlineTerm, paramOffset );
151
+ if( term.parent ) _modifyChildFromTo( term.parent, term, inlineTerm );
152
+ return inlineTerm;
153
+ }
154
+ const decrement = _getDbnDecrement( term.dbn, removedDbns, paramOffset );
155
+ if( decrement > 0 ) term.dbn -= decrement;
156
+ }
157
+ return term;
158
+ }
159
+ if( term instanceof IRSelfCall ) {
160
+ const decrement = _getDbnDecrement( term.dbn, removedDbns, paramOffset );
161
+ if( decrement > 0 ) term.dbn -= decrement;
162
+ return term;
163
+ }
164
+ if( term instanceof IRLetted ) {
165
+ const decrement = _getDbnDecrement( term.dbn, removedDbns, paramOffset );
166
+ if( decrement > 0 ) term.dbn -= decrement;
167
+ for( const child of term.children() ) {
168
+ _decrementAndInline( child, removedDbns, inlineDbns, paramOffset );
169
+ }
170
+ return term;
171
+ }
172
+ if( term instanceof IRHoisted ) return term; // closed
173
+
174
+ if( term instanceof IRFunc ) {
175
+ // entering new function: its parameters start at current paramOffset
176
+ // increment paramOffset by its arity for body children
177
+ for( const child of term.children() ) {
178
+ _decrementAndInline( child, removedDbns, inlineDbns, paramOffset + term.arity );
179
+ }
180
+ return term;
181
+ }
182
+
183
+ for( const child of term.children() ) {
184
+ _decrementAndInline( child, removedDbns, inlineDbns, paramOffset );
185
+ }
186
+ return term;
187
+ }
188
+
189
+ function _incrementTermDbns( term: IRTerm, dbnDiff: number ): IRTerm
190
+ {
191
+ if( dbnDiff === 0 ) return term;
192
+
193
+ if( term instanceof IRVar ) {
194
+ term.dbn += dbnDiff;
195
+ // _modifyChildFromTo( term.parent, term, term );
196
+ return term;
197
+ }
198
+ if( term instanceof IRSelfCall ) {
199
+ term.dbn += dbnDiff;
200
+ // _modifyChildFromTo( term.parent, term, term );
201
+ return term;
202
+ }
203
+ if( term instanceof IRLetted ) {
204
+ term.dbn += dbnDiff;
205
+ for( const c of term.children() ) {
206
+ _incrementTermDbns( c, dbnDiff );
207
+ }
208
+ return term;
209
+ }
210
+ if( term instanceof IRHoisted ) return term; // hoisted terms are closed
211
+
212
+ for( const child of term.children() ) {
213
+ _incrementTermDbns( child, dbnDiff );
214
+ }
215
+ return term;
216
+ }
217
+ //*/
@@ -1,36 +1,33 @@
1
1
  import { IRApp } from "../../IRNodes/IRApp.js";
2
2
  import { IRCase } from "../../IRNodes/IRCase.js";
3
3
  import { IRConstr } from "../../IRNodes/IRConstr.js";
4
- import { IRDelayed } from "../../IRNodes/IRDelayed.js";
5
- import { IRForced } from "../../IRNodes/IRForced.js";
6
- import { IRFunc } from "../../IRNodes/IRFunc.js";
7
4
  import { IRHoisted } from "../../IRNodes/IRHoisted.js";
8
5
  import { IRLetted } from "../../IRNodes/IRLetted.js";
9
- import { IRRecursive } from "../../IRNodes/IRRecursive.js";
10
6
  export function markRecursiveHoistsAsForced(_term) {
11
7
  const stack = [{ term: _term, isInRecursiveTerm: false }];
12
8
  while (stack.length > 0) {
13
9
  const { term: t, isInRecursiveTerm, isIRAppArg } = stack.pop();
10
+ if (isInRecursiveTerm && (t instanceof IRHoisted
11
+ || t instanceof IRLetted)) {
12
+ t.meta.forceHoist = true;
13
+ // don't push anything to the stack
14
+ // hoisted values are handled normally
15
+ continue;
16
+ }
14
17
  if (t instanceof IRApp) {
15
- // must push the arg first and then the fucntion
16
- // so that we can check if the function is the Z combinator before the arg is processed
17
- stack.push({ term: t.arg, isIRAppArg: true, isInRecursiveTerm }, { term: t.fn, isInRecursiveTerm });
18
+ stack.push({ term: t.fn, isInRecursiveTerm }, { term: t.arg, isIRAppArg: true, isInRecursiveTerm });
18
19
  continue;
19
20
  }
20
21
  if (t instanceof IRConstr) {
21
- // must push the arg first and then the fucntion
22
- // so that we can check if the function is the Z combinator before the arg is processed
23
22
  stack.push(...Array.from(t.fields)
24
- .map((f, i) => ({
23
+ .map(f => ({
25
24
  term: f,
26
- isIRAppArg: i > 0,
25
+ isIRAppArg: true,
27
26
  isInRecursiveTerm
28
27
  })));
29
28
  continue;
30
29
  }
31
30
  if (t instanceof IRCase) {
32
- // must push the arg first and then the fucntion
33
- // so that we can check if the function is the Z combinator before the arg is processed
34
31
  stack.push({
35
32
  term: t.constrTerm,
36
33
  isIRAppArg: false,
@@ -38,45 +35,11 @@ export function markRecursiveHoistsAsForced(_term) {
38
35
  }, ...Array.from(t.continuations)
39
36
  .map(cont => ({
40
37
  term: cont,
41
- isIRAppArg: true,
38
+ isIRAppArg: false,
42
39
  isInRecursiveTerm
43
40
  })));
44
41
  continue;
45
42
  }
46
- if (t instanceof IRHoisted ||
47
- t instanceof IRLetted) {
48
- if (isInRecursiveTerm) {
49
- t.meta.forceHoist = true;
50
- // don't push anything to the stack
51
- // hoisted values are handled normally
52
- continue;
53
- }
54
- // otherwhise check in values too
55
- else if (t instanceof IRLetted) {
56
- stack.push({ term: t.value, isInRecursiveTerm });
57
- continue;
58
- }
59
- else if (t instanceof IRHoisted) {
60
- stack.push({ term: t.hoisted, isInRecursiveTerm });
61
- continue;
62
- }
63
- }
64
- if (t instanceof IRDelayed) {
65
- stack.push({ term: t.delayed, isInRecursiveTerm });
66
- continue;
67
- }
68
- if (t instanceof IRForced) {
69
- stack.push({ term: t.forced, isInRecursiveTerm });
70
- continue;
71
- }
72
- if (t instanceof IRFunc) {
73
- stack.push({ term: t.body, isInRecursiveTerm });
74
- continue;
75
- }
76
- if (t instanceof IRRecursive) {
77
- stack.push({ term: t.body, isInRecursiveTerm: true });
78
- continue;
79
- }
80
- const tsEnsureExsaustiveCheck = t;
43
+ stack.push(...(t.children?.().map(c => ({ term: c, isInRecursiveTerm })) ?? []));
81
44
  }
82
45
  }
@@ -1,4 +1,4 @@
1
1
  import { IRFunc } from "../../../IRNodes/IRFunc.js";
2
2
  import { IRTerm } from "../../../IRTerm.js";
3
- export declare function getExpandedIRFunc(body: IRTerm, arity: number): IRFunc;
3
+ export declare function getExpandedIRFunc(body: IRTerm, params: symbol[]): IRFunc;
4
4
  export declare function expandFuncsAndReturnRoot(root: IRTerm): IRTerm;
@@ -9,10 +9,10 @@ import { IRLetted } from "../../../IRNodes/IRLetted.js";
9
9
  import { IRRecursive } from "../../../IRNodes/IRRecursive.js";
10
10
  import { IRSelfCall } from "../../../IRNodes/IRSelfCall.js";
11
11
  import { _modifyChildFromTo } from "../../_internal/_modifyChildFromTo.js";
12
- export function getExpandedIRFunc(body, arity) {
13
- body = new IRFunc(1, body);
14
- while (--arity > 0) {
15
- body = new IRFunc(1, body);
12
+ export function getExpandedIRFunc(body, params) {
13
+ let introducedParam;
14
+ while (introducedParam = params.pop()) {
15
+ body = new IRFunc([introducedParam], body);
16
16
  }
17
17
  return body;
18
18
  // if( arity === 1 ) return new IRFunc( 1, body );
@@ -28,13 +28,11 @@ export function expandFuncsAndReturnRoot(root) {
28
28
  // all good
29
29
  if (t.arity <= 1)
30
30
  continue;
31
- const expanded = getExpandedIRFunc(t.body, t.arity);
32
- if (t.parent) {
31
+ const expanded = getExpandedIRFunc(t.body, t.params);
32
+ if (t.parent)
33
33
  _modifyChildFromTo(t.parent, t, expanded);
34
- }
35
- else {
34
+ else
36
35
  root = expanded;
37
- }
38
36
  continue;
39
37
  }
40
38
  if (t instanceof IRApp) {
@@ -57,12 +55,11 @@ export function expandFuncsAndReturnRoot(root) {
57
55
  stack.push(t.forced);
58
56
  continue;
59
57
  }
60
- if (t instanceof IRRecursive ||
61
- t instanceof IRHoisted ||
62
- t instanceof IRLetted ||
63
- t instanceof IRSelfCall) {
58
+ if (t instanceof IRRecursive
59
+ || t instanceof IRHoisted
60
+ || t instanceof IRLetted
61
+ || t instanceof IRSelfCall)
64
62
  throw new Error("Unexpected term while performing uplc optimizations");
65
- }
66
63
  }
67
64
  return root;
68
65
  }
@@ -1,5 +1,3 @@
1
1
  import { IRTerm } from "../../../IRTerm.js";
2
2
  import { CompilerOptions } from "../../CompilerOptions.js";
3
3
  export declare function performUplcOptimizationsAndReturnRoot(root: IRTerm, options: CompilerOptions): IRTerm;
4
- /** @experimental still can't figure how to make it work */
5
- export declare function groupIndipendentLets(term: IRTerm, dbn: number): [args: IRTerm[], body: IRTerm];
@@ -0,0 +1,151 @@
1
+ import { IRConstr } from "../../../IRNodes/index.js";
2
+ import { IRApp } from "../../../IRNodes/IRApp.js";
3
+ import { IRCase } from "../../../IRNodes/IRCase.js";
4
+ import { IRFunc } from "../../../IRNodes/IRFunc.js";
5
+ import { IRHoisted } from "../../../IRNodes/IRHoisted.js";
6
+ import { IRLetted } from "../../../IRNodes/IRLetted.js";
7
+ import { IRRecursive } from "../../../IRNodes/IRRecursive.js";
8
+ import { IRSelfCall } from "../../../IRNodes/IRSelfCall.js";
9
+ import { IRVar } from "../../../IRNodes/IRVar.js";
10
+ import { _modifyChildFromTo } from "../../_internal/_modifyChildFromTo.js";
11
+ import { isDebugUplcOptimizations } from "../../CompilerOptions.js";
12
+ import { expandFuncsAndReturnRoot } from "./expandFuncsAndReturnRoot.js";
13
+ import { getApplicationTerms } from "../../utils/getApplicationTerms.js";
14
+ import { getUnboundedVars } from "../handleLetted/groupByScope.js";
15
+ export function performUplcOptimizationsAndReturnRoot(root, options) {
16
+ const opts = options.uplcOptimizations;
17
+ if (isDebugUplcOptimizations(opts))
18
+ return root;
19
+ const { groupApplications, inlineSingleUse: shouldInlineSingleUse, simplifyWrappedPartialFuncApps, removeForceDelay } = opts;
20
+ root = expandFuncsAndReturnRoot(root);
21
+ const stack = [root];
22
+ let t = root;
23
+ while (t = stack.pop()) {
24
+ if (t instanceof IRApp
25
+ && isIdLike(t.fn)) {
26
+ const arg = t.arg;
27
+ if (t.parent)
28
+ _modifyChildFromTo(t.parent, t, arg);
29
+ else
30
+ root = arg;
31
+ stack.push(arg);
32
+ continue;
33
+ }
34
+ const indepApps = groupIndependentApplications(t);
35
+ if (indepApps) {
36
+ const { newRoot, args, nextBody } = indepApps;
37
+ if (newRoot)
38
+ root = newRoot;
39
+ stack.push(...args);
40
+ stack.push(nextBody);
41
+ continue;
42
+ }
43
+ if (t instanceof IRRecursive ||
44
+ t instanceof IRHoisted ||
45
+ t instanceof IRLetted ||
46
+ t instanceof IRSelfCall)
47
+ throw new Error("Unexpected term while performing uplc optimizations");
48
+ stack.push(...t.children());
49
+ }
50
+ return root;
51
+ }
52
+ function isIdLike(term) {
53
+ return (term instanceof IRFunc &&
54
+ term.params.length === 1 &&
55
+ term.body instanceof IRVar &&
56
+ term.body.name === term.params[0]);
57
+ }
58
+ /**
59
+ *
60
+ * @returns either an object containing the new root, sorted args and next body
61
+ * or undefined if grouping wasnt possible (root is the same)
62
+ */
63
+ function groupIndependentApplications(root) {
64
+ const parent = root.parent;
65
+ let applicaitonTerms = getApplicationTerms(root);
66
+ if (!applicaitonTerms)
67
+ return undefined;
68
+ let { func, args } = applicaitonTerms;
69
+ if (!(func instanceof IRFunc))
70
+ return undefined;
71
+ const params = func.params.slice();
72
+ while (true) {
73
+ applicaitonTerms = getApplicationTerms(func.body);
74
+ if (!applicaitonTerms)
75
+ break;
76
+ if (!(applicaitonTerms.func instanceof IRFunc))
77
+ break;
78
+ func = applicaitonTerms.func;
79
+ params.push(...func.params);
80
+ args.push(...applicaitonTerms.args);
81
+ if (params.length !== args.length)
82
+ break;
83
+ }
84
+ const len = Math.min(params.length, args.length);
85
+ const finalParams = params.slice(len);
86
+ const finalArgs = args.slice(len);
87
+ params.length = len;
88
+ args.length = len;
89
+ const paramToArg = {};
90
+ for (let i = 0; i < len; i++) {
91
+ const p = params[i];
92
+ paramToArg[p] = args[i];
93
+ }
94
+ const globalUnbound = getUnboundedVars(root);
95
+ const groups = [[]];
96
+ for (let i = 0; i < len; i++) {
97
+ const p = params[i];
98
+ const arg = args[i];
99
+ const unbound = getUnboundedVars(arg, globalUnbound);
100
+ let highestIdx = -1;
101
+ for (let j = groups.length - 1; j >= 0; j--) {
102
+ const group = groups[j];
103
+ if (group.some(sym => unbound.has(sym))) {
104
+ highestIdx = j;
105
+ break;
106
+ }
107
+ }
108
+ if (highestIdx === groups.length - 1) {
109
+ groups.push([p]);
110
+ continue;
111
+ }
112
+ groups[highestIdx + 1].push(p);
113
+ }
114
+ groups[groups.length - 1].push(...finalParams);
115
+ const sortedArgs = new Array(len);
116
+ const soretedParams = groups.flat();
117
+ for (let i = 0; i < len; i++) {
118
+ const p = soretedParams[i];
119
+ sortedArgs[i] = paramToArg[p];
120
+ }
121
+ let nextBody = func.body;
122
+ if (finalArgs.length > 0) {
123
+ if (finalArgs.length === 1) {
124
+ nextBody = new IRApp(nextBody, finalArgs[0]);
125
+ }
126
+ else {
127
+ nextBody = new IRCase(new IRConstr(0, finalArgs), [nextBody]);
128
+ }
129
+ }
130
+ let newTerm = nextBody;
131
+ for (let i = groups.length - 1; i >= 0; i--) {
132
+ const group = groups[i];
133
+ if (group.length === 1) {
134
+ newTerm = new IRApp(new IRFunc(group, newTerm), paramToArg[group[0]]);
135
+ }
136
+ else if (group.length <= 0)
137
+ continue;
138
+ else {
139
+ newTerm = new IRCase(new IRConstr(0, group.map(p => paramToArg[p])), [new IRFunc(group, newTerm)]);
140
+ }
141
+ }
142
+ if (parent)
143
+ _modifyChildFromTo(parent, root, newTerm);
144
+ else
145
+ root = newTerm;
146
+ return {
147
+ newRoot: !parent ? root : undefined,
148
+ args: sortedArgs,
149
+ nextBody
150
+ };
151
+ }
@@ -0,0 +1,11 @@
1
+ export declare class RemoveUnusedVarsCtx {
2
+ readonly params: symbol[];
3
+ readonly parent: RemoveUnusedVarsCtx | undefined;
4
+ readonly localVars: Record<symbol, number>;
5
+ constructor(params: symbol[], parent: RemoveUnusedVarsCtx | undefined);
6
+ static root(params?: symbol[]): RemoveUnusedVarsCtx;
7
+ newChild(params: symbol[]): RemoveUnusedVarsCtx;
8
+ private keys;
9
+ incrementVarUse(sym: symbol): void;
10
+ getUnusedVars(): symbol[];
11
+ }
@@ -0,0 +1,46 @@
1
+ export class RemoveUnusedVarsCtx {
2
+ params;
3
+ parent;
4
+ localVars;
5
+ // MUST BE A GETTER TO REFLECT CHANGES IN PARENT
6
+ // DO NOT MODIFY
7
+ // private get _parentDbn(): number {
8
+ // return this.parent?.dbn ?? 0;
9
+ // }
10
+ // get dbn(): number {
11
+ // return this._parentDbn + Object.getOwnPropertySymbols( this.localVars ).length;
12
+ // }
13
+ constructor(params, parent) {
14
+ this.params = params;
15
+ this.parent = parent;
16
+ params = params.slice();
17
+ this.localVars = {};
18
+ for (const p of params)
19
+ this.localVars[p] = 0;
20
+ }
21
+ static root(params = []) {
22
+ return new RemoveUnusedVarsCtx(params, undefined);
23
+ }
24
+ newChild(params) {
25
+ return new RemoveUnusedVarsCtx(params, this);
26
+ }
27
+ keys() {
28
+ return Object.getOwnPropertySymbols(this.localVars);
29
+ }
30
+ incrementVarUse(sym) {
31
+ if (typeof this.localVars[sym] !== "number") {
32
+ if (this.parent)
33
+ this.parent.incrementVarUse(sym);
34
+ else {
35
+ console.error(sym);
36
+ throw new Error("trying to increment use of variable not in context");
37
+ }
38
+ }
39
+ else
40
+ this.localVars[sym]++;
41
+ }
42
+ getUnusedVars() {
43
+ const keys = this.keys();
44
+ return keys.filter(k => this.localVars[k] === 0);
45
+ }
46
+ }
@@ -0,0 +1,2 @@
1
+ import { IRTerm } from "../../../IRTerm.js";
2
+ export declare function removeUnusedVarsAndReturnRoot(term: IRTerm): IRTerm;
@@ -0,0 +1,80 @@
1
+ import { _ir_apps, IRFunc } from "../../../IRNodes/index.js";
2
+ import { IRVar } from "../../../IRNodes/IRVar.js";
3
+ import { _modifyChildFromTo } from "../../_internal/_modifyChildFromTo.js";
4
+ import { getApplicationTerms } from "../../utils/getApplicationTerms.js";
5
+ import { RemoveUnusedVarsCtx } from "./RemoveUnusedVarsCtx.js";
6
+ export function removeUnusedVarsAndReturnRoot(term) {
7
+ // we need to go bottom up
8
+ // ONLY REMOVE UNUSED VARS IF NOT UNIT
9
+ // (in which case we need to keep it for eventual side effects (asserts and traces))
10
+ return _removeUnusedVars(term, RemoveUnusedVarsCtx.root());
11
+ }
12
+ function _removeUnusedVars(term, ctx) {
13
+ if (term instanceof IRVar) {
14
+ // increment used
15
+ ctx.incrementVarUse(term.name);
16
+ return term;
17
+ }
18
+ const applicationTerms = getApplicationTerms(term);
19
+ if (!applicationTerms) {
20
+ const childrens = term.children();
21
+ const nextCtx = term instanceof IRFunc
22
+ ? ctx.newChild(term.params)
23
+ : ctx;
24
+ for (const c of childrens) {
25
+ _removeUnusedVars(c, nextCtx);
26
+ }
27
+ return term;
28
+ }
29
+ const { func, args } = applicationTerms;
30
+ if (!(func instanceof IRFunc)) {
31
+ for (const child of term.children()) {
32
+ // same as parent ctx
33
+ _removeUnusedVars(child, ctx);
34
+ }
35
+ return term;
36
+ }
37
+ const funcCtx = ctx.newChild(func.params);
38
+ func.body = _removeUnusedVars(func.body, funcCtx);
39
+ const unusedVars = funcCtx.getUnusedVars();
40
+ // if all variables are used, keep as is
41
+ if (unusedVars.length <= 0) {
42
+ for (const funcArg of args) {
43
+ // arguments passed have the same context of the function called
44
+ _removeUnusedVars(funcArg, ctx);
45
+ }
46
+ return term;
47
+ }
48
+ const originalParams = func.params.slice();
49
+ const filteredArgs = [];
50
+ for (let i = 0; i < originalParams.length; i++) {
51
+ const p = originalParams[i];
52
+ if (!unusedVars.includes(p))
53
+ filteredArgs.push(args[i]);
54
+ }
55
+ // remove vars here
56
+ filterParamsInplace(func.params, unusedVars);
57
+ for (const funcArg of filteredArgs) {
58
+ // arguments passed have the same context of the function called
59
+ _removeUnusedVars(funcArg, ctx);
60
+ }
61
+ const someArgsWereUsed = filteredArgs.length > 0;
62
+ const newTerm = someArgsWereUsed
63
+ ? _ir_apps(func, ...filteredArgs)
64
+ : func.body; // all unused, remove function, just keep the body
65
+ const parent = term.parent;
66
+ if (parent)
67
+ _modifyChildFromTo(parent, term, newTerm);
68
+ return newTerm;
69
+ }
70
+ function filterParamsInplace(params, unusedVars) {
71
+ let writeIdx = 0;
72
+ for (let readIdx = 0; readIdx < params.length; readIdx++) {
73
+ const p = params[readIdx];
74
+ if (!unusedVars.includes(p)) {
75
+ params[writeIdx] = p;
76
+ writeIdx++;
77
+ }
78
+ }
79
+ params.length = writeIdx;
80
+ }