cashc 0.6.5 → 0.7.0-next.0

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 (78) hide show
  1. package/README.md +7 -9
  2. package/dist/main/Errors.d.ts +4 -4
  3. package/dist/main/Errors.js +11 -7
  4. package/dist/main/artifact/Artifact.js +0 -1
  5. package/dist/main/ast/AST.d.ts +27 -4
  6. package/dist/main/ast/AST.js +24 -3
  7. package/dist/main/ast/AstBuilder.d.ts +5 -4
  8. package/dist/main/ast/AstBuilder.js +23 -11
  9. package/dist/main/ast/AstTraversal.d.ts +3 -1
  10. package/dist/main/ast/AstTraversal.js +7 -0
  11. package/dist/main/ast/AstVisitor.d.ts +3 -1
  12. package/dist/main/ast/Globals.d.ts +3 -15
  13. package/dist/main/ast/Globals.js +7 -31
  14. package/dist/main/ast/Operator.d.ts +18 -1
  15. package/dist/main/ast/Operator.js +19 -1
  16. package/dist/main/cashc-cli.js +1 -0
  17. package/dist/main/compiler.js +0 -2
  18. package/dist/main/generation/GenerateTargetTraversal.d.ts +3 -8
  19. package/dist/main/generation/GenerateTargetTraversal.js +25 -155
  20. package/dist/main/generation/utils.d.ts +2 -1
  21. package/dist/main/generation/utils.js +22 -4
  22. package/dist/main/grammar/CashScriptLexer.d.ts +24 -15
  23. package/dist/main/grammar/CashScriptLexer.js +342 -280
  24. package/dist/main/grammar/CashScriptListener.d.ts +29 -5
  25. package/dist/main/grammar/CashScriptParser.d.ts +60 -27
  26. package/dist/main/grammar/CashScriptParser.js +618 -405
  27. package/dist/main/grammar/CashScriptVisitor.d.ts +18 -3
  28. package/dist/main/index.d.ts +1 -1
  29. package/dist/main/index.js +1 -1
  30. package/dist/main/print/OutputSourceCodeTraversal.d.ts +3 -1
  31. package/dist/main/print/OutputSourceCodeTraversal.js +19 -0
  32. package/dist/main/semantic/SymbolTableTraversal.d.ts +2 -1
  33. package/dist/main/semantic/SymbolTableTraversal.js +11 -0
  34. package/dist/main/semantic/TypeCheckTraversal.d.ts +3 -1
  35. package/dist/main/semantic/TypeCheckTraversal.js +52 -0
  36. package/dist/module/Errors.d.ts +4 -4
  37. package/dist/module/Errors.js +9 -5
  38. package/dist/module/artifact/Artifact.js +0 -1
  39. package/dist/module/ast/AST.d.ts +27 -4
  40. package/dist/module/ast/AST.js +21 -2
  41. package/dist/module/ast/AstBuilder.d.ts +5 -4
  42. package/dist/module/ast/AstBuilder.js +24 -12
  43. package/dist/module/ast/AstTraversal.d.ts +3 -1
  44. package/dist/module/ast/AstTraversal.js +7 -0
  45. package/dist/module/ast/AstVisitor.d.ts +3 -1
  46. package/dist/module/ast/Globals.d.ts +3 -15
  47. package/dist/module/ast/Globals.js +6 -30
  48. package/dist/module/ast/Operator.d.ts +18 -1
  49. package/dist/module/ast/Operator.js +18 -0
  50. package/dist/module/cashc-cli.js +1 -0
  51. package/dist/module/compiler.js +0 -2
  52. package/dist/module/generation/GenerateTargetTraversal.d.ts +3 -8
  53. package/dist/module/generation/GenerateTargetTraversal.js +28 -158
  54. package/dist/module/generation/utils.d.ts +2 -1
  55. package/dist/module/generation/utils.js +22 -5
  56. package/dist/module/grammar/CashScriptLexer.d.ts +24 -15
  57. package/dist/module/grammar/CashScriptLexer.js +342 -280
  58. package/dist/module/grammar/CashScriptListener.d.ts +29 -5
  59. package/dist/module/grammar/CashScriptParser.d.ts +60 -27
  60. package/dist/module/grammar/CashScriptParser.js +614 -403
  61. package/dist/module/grammar/CashScriptVisitor.d.ts +18 -3
  62. package/dist/module/index.d.ts +1 -1
  63. package/dist/module/index.js +1 -1
  64. package/dist/module/print/OutputSourceCodeTraversal.d.ts +3 -1
  65. package/dist/module/print/OutputSourceCodeTraversal.js +19 -0
  66. package/dist/module/semantic/SymbolTableTraversal.d.ts +2 -1
  67. package/dist/module/semantic/SymbolTableTraversal.js +11 -0
  68. package/dist/module/semantic/TypeCheckTraversal.d.ts +3 -1
  69. package/dist/module/semantic/TypeCheckTraversal.js +54 -2
  70. package/package.json +2 -2
  71. package/dist/main/generation/preimage.d.ts +0 -10
  72. package/dist/main/generation/preimage.js +0 -57
  73. package/dist/main/semantic/VerifyCovenantTraversal.d.ts +0 -12
  74. package/dist/main/semantic/VerifyCovenantTraversal.js +0 -63
  75. package/dist/module/generation/preimage.d.ts +0 -10
  76. package/dist/module/generation/preimage.js +0 -54
  77. package/dist/module/semantic/VerifyCovenantTraversal.d.ts +0 -12
  78. package/dist/module/semantic/VerifyCovenantTraversal.js +0 -57
package/README.md CHANGED
@@ -26,13 +26,11 @@ npm install -g cashc
26
26
  Usage: cashc [options] [source_file]
27
27
 
28
28
  Options:
29
- --output, -o Specify a file to output the generated artifact. [string]
30
- --hex, -h Compile the contract to hex format rather than a full artifact
31
- [boolean]
32
- --asm, -A Compile the contract to ASM format rather than a full artifact
33
- [boolean]
34
- --opcount, -c Display the number of opcodes in the compiled bytecode[boolean]
35
- --size, -s Display the size in bytes of the compiled bytecode [boolean]
36
- --help Show help [boolean]
37
- --version Show version number [boolean]
29
+ -V, --version Output the version number.
30
+ -o, --output <path> Specify a file to output the generated artifact.
31
+ -h, --hex Compile the contract to hex format rather than a full artifact.
32
+ -A, --asm Compile the contract to ASM format rather than a full artifact.
33
+ -c, --opcount Display the number of opcodes in the compiled bytecode.
34
+ -s, --size Display the size in bytes of the compiled bytecode.
35
+ -?, --help Display help
38
36
  ```
@@ -1,5 +1,5 @@
1
1
  import { Type, PrimitiveType } from '@cashscript/utils';
2
- import { IdentifierNode, FunctionDefinitionNode, VariableDefinitionNode, ParameterNode, Node, FunctionCallNode, BinaryOpNode, UnaryOpNode, TimeOpNode, CastNode, AssignNode, BranchNode, ArrayNode, TupleIndexOpNode, RequireNode, InstantiationNode, StatementNode, ContractNode } from './ast/AST';
2
+ import { IdentifierNode, FunctionDefinitionNode, VariableDefinitionNode, ParameterNode, Node, FunctionCallNode, BinaryOpNode, UnaryOpNode, TimeOpNode, CastNode, AssignNode, BranchNode, ArrayNode, TupleIndexOpNode, RequireNode, InstantiationNode, StatementNode, ContractNode, ExpressionNode } from './ast/AST';
3
3
  import { Symbol, SymbolType } from './ast/SymbolTable';
4
4
  import { Location, Point } from './ast/Location';
5
5
  export declare class CashScriptError extends Error {
@@ -67,6 +67,9 @@ export declare class CastSizeError extends CashScriptError {
67
67
  export declare class AssignTypeError extends TypeError {
68
68
  constructor(node: AssignNode | VariableDefinitionNode);
69
69
  }
70
+ export declare class TupleAssignmentError extends CashScriptError {
71
+ constructor(node: ExpressionNode);
72
+ }
70
73
  export declare class ConstantConditionError extends CashScriptError {
71
74
  constructor(node: BranchNode | RequireNode, res: boolean);
72
75
  }
@@ -79,6 +82,3 @@ export declare class IndexOutOfBoundsError extends CashScriptError {
79
82
  export declare class VersionError extends Error {
80
83
  constructor(actual: string, constraint: string);
81
84
  }
82
- export declare class UnverifiedCovenantError extends CashScriptError {
83
- constructor(node: IdentifierNode);
84
- }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UnverifiedCovenantError = exports.VersionError = exports.IndexOutOfBoundsError = exports.ArrayElementError = exports.ConstantConditionError = exports.AssignTypeError = exports.CastSizeError = exports.CastTypeError = exports.UnsupportedTypeError = exports.UnequalTypeError = exports.InvalidParameterTypeError = exports.TypeError = exports.FinalRequireStatementError = exports.EmptyFunctionError = exports.EmptyContractError = exports.UnusedVariableError = exports.VariableRedefinitionError = exports.FunctionRedefinitionError = exports.RedefinitionError = exports.InvalidSymbolTypeError = exports.UndefinedReferenceError = exports.ParseError = exports.CashScriptError = void 0;
3
+ exports.VersionError = exports.IndexOutOfBoundsError = exports.ArrayElementError = exports.ConstantConditionError = exports.TupleAssignmentError = exports.AssignTypeError = exports.CastSizeError = exports.CastTypeError = exports.UnsupportedTypeError = exports.UnequalTypeError = exports.InvalidParameterTypeError = exports.TypeError = exports.FinalRequireStatementError = exports.EmptyFunctionError = exports.EmptyContractError = exports.UnusedVariableError = exports.VariableRedefinitionError = exports.FunctionRedefinitionError = exports.RedefinitionError = exports.InvalidSymbolTypeError = exports.UndefinedReferenceError = exports.ParseError = exports.CashScriptError = void 0;
4
4
  const utils_1 = require("@cashscript/utils");
5
5
  const AST_1 = require("./ast/AST");
6
6
  const Location_1 = require("./ast/Location");
@@ -126,6 +126,10 @@ class UnsupportedTypeError extends TypeError {
126
126
  else if (node instanceof AST_1.UnaryOpNode && node.operator.startsWith('.')) {
127
127
  super(node, actual, expected, `Tried to access member '${node.operator}' on unsupported type '${actual}'`);
128
128
  }
129
+ else if (node instanceof AST_1.UnaryOpNode && node.operator.includes('[i]')) {
130
+ const [scope] = node.operator.split('[i]');
131
+ super(node, actual, expected, `Tried to index '${scope}''with unsupported type '${actual}'`);
132
+ }
129
133
  else if (node instanceof AST_1.UnaryOpNode) {
130
134
  super(node, actual, expected, `Tried to apply operator '${node.operator}' to unsupported type '${actual}'`);
131
135
  }
@@ -160,6 +164,12 @@ class AssignTypeError extends TypeError {
160
164
  }
161
165
  }
162
166
  exports.AssignTypeError = AssignTypeError;
167
+ class TupleAssignmentError extends CashScriptError {
168
+ constructor(node) {
169
+ super(node, 'Expression must return a tuple to use destructuring');
170
+ }
171
+ }
172
+ exports.TupleAssignmentError = TupleAssignmentError;
163
173
  class ConstantConditionError extends CashScriptError {
164
174
  constructor(node, res) {
165
175
  super(node, `Condition always evaluates to ${res}`);
@@ -186,10 +196,4 @@ class VersionError extends Error {
186
196
  }
187
197
  }
188
198
  exports.VersionError = VersionError;
189
- class UnverifiedCovenantError extends CashScriptError {
190
- constructor(node) {
191
- super(node, `Covenant variable ${node.name} was used without un-nested signature check`);
192
- }
193
- }
194
- exports.UnverifiedCovenantError = UnverifiedCovenantError;
195
199
  //# sourceMappingURL=Errors.js.map
@@ -9,7 +9,6 @@ function generateArtifact(ast, script, source) {
9
9
  .map((parameter) => ({ name: parameter.name, type: parameter.type.toString() }));
10
10
  const abi = contract.functions.map((func) => ({
11
11
  name: func.name,
12
- covenant: func.preimageFields.length > 0,
13
12
  inputs: func.parameters.map((parameter) => ({
14
13
  name: parameter.name,
15
14
  type: parameter.type.toString(),
@@ -1,7 +1,7 @@
1
1
  import { Type } from '@cashscript/utils';
2
- import { TimeOp, PreimageField } from './Globals';
2
+ import { TimeOp } from './Globals';
3
3
  import AstVisitor from './AstVisitor';
4
- import { BinaryOperator, UnaryOperator } from './Operator';
4
+ import { BinaryOperator, NullaryOperator, UnaryOperator } from './Operator';
5
5
  import { Location } from './Location';
6
6
  import { SymbolTable, Symbol } from './SymbolTable';
7
7
  export declare type Ast = SourceFileNode;
@@ -32,10 +32,9 @@ export declare class FunctionDefinitionNode extends Node implements Named {
32
32
  name: string;
33
33
  parameters: ParameterNode[];
34
34
  body: BlockNode;
35
- preimageFields: PreimageField[];
36
35
  symbolTable?: SymbolTable;
37
36
  opRolls: Map<string, IdentifierNode>;
38
- constructor(name: string, parameters: ParameterNode[], body: BlockNode, preimageFields: PreimageField[]);
37
+ constructor(name: string, parameters: ParameterNode[], body: BlockNode);
39
38
  accept<T>(visitor: AstVisitor<T>): T;
40
39
  }
41
40
  export declare class ParameterNode extends Node implements Named, Typed {
@@ -53,6 +52,25 @@ export declare class VariableDefinitionNode extends StatementNode implements Nam
53
52
  constructor(type: Type, name: string, expression: ExpressionNode);
54
53
  accept<T>(visitor: AstVisitor<T>): T;
55
54
  }
55
+ export declare class TupleAssignmentNode extends StatementNode {
56
+ var1: {
57
+ name: string;
58
+ type: Type;
59
+ };
60
+ var2: {
61
+ name: string;
62
+ type: Type;
63
+ };
64
+ tuple: ExpressionNode;
65
+ constructor(var1: {
66
+ name: string;
67
+ type: Type;
68
+ }, var2: {
69
+ name: string;
70
+ type: Type;
71
+ }, tuple: ExpressionNode);
72
+ accept<T>(visitor: AstVisitor<T>): T;
73
+ }
56
74
  export declare class AssignNode extends StatementNode {
57
75
  identifier: IdentifierNode;
58
76
  expression: ExpressionNode;
@@ -124,6 +142,11 @@ export declare class UnaryOpNode extends ExpressionNode {
124
142
  constructor(operator: UnaryOperator, expression: ExpressionNode);
125
143
  accept<T>(visitor: AstVisitor<T>): T;
126
144
  }
145
+ export declare class NullaryOpNode extends ExpressionNode {
146
+ operator: NullaryOperator;
147
+ constructor(operator: NullaryOperator);
148
+ accept<T>(visitor: AstVisitor<T>): T;
149
+ }
127
150
  export declare class ArrayNode extends ExpressionNode {
128
151
  elements: ExpressionNode[];
129
152
  constructor(elements: ExpressionNode[]);
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HexLiteralNode = exports.StringLiteralNode = exports.IntLiteralNode = exports.BoolLiteralNode = exports.LiteralNode = exports.IdentifierNode = exports.ArrayNode = exports.UnaryOpNode = exports.BinaryOpNode = exports.TupleIndexOpNode = exports.InstantiationNode = exports.FunctionCallNode = exports.CastNode = exports.ExpressionNode = exports.BlockNode = exports.BranchNode = exports.RequireNode = exports.TimeOpNode = exports.AssignNode = exports.VariableDefinitionNode = exports.StatementNode = exports.ParameterNode = exports.FunctionDefinitionNode = exports.ContractNode = exports.SourceFileNode = exports.Node = void 0;
3
+ exports.HexLiteralNode = exports.StringLiteralNode = exports.IntLiteralNode = exports.BoolLiteralNode = exports.LiteralNode = exports.IdentifierNode = exports.ArrayNode = exports.NullaryOpNode = exports.UnaryOpNode = exports.BinaryOpNode = exports.TupleIndexOpNode = exports.InstantiationNode = exports.FunctionCallNode = exports.CastNode = exports.ExpressionNode = exports.BlockNode = exports.BranchNode = exports.RequireNode = exports.TimeOpNode = exports.AssignNode = exports.TupleAssignmentNode = exports.VariableDefinitionNode = exports.StatementNode = exports.ParameterNode = exports.FunctionDefinitionNode = exports.ContractNode = exports.SourceFileNode = exports.Node = void 0;
4
4
  const utils_1 = require("@cashscript/utils");
5
5
  class Node {
6
6
  }
@@ -28,12 +28,11 @@ class ContractNode extends Node {
28
28
  }
29
29
  exports.ContractNode = ContractNode;
30
30
  class FunctionDefinitionNode extends Node {
31
- constructor(name, parameters, body, preimageFields) {
31
+ constructor(name, parameters, body) {
32
32
  super();
33
33
  this.name = name;
34
34
  this.parameters = parameters;
35
35
  this.body = body;
36
- this.preimageFields = preimageFields;
37
36
  this.opRolls = new Map();
38
37
  }
39
38
  accept(visitor) {
@@ -67,6 +66,18 @@ class VariableDefinitionNode extends StatementNode {
67
66
  }
68
67
  }
69
68
  exports.VariableDefinitionNode = VariableDefinitionNode;
69
+ class TupleAssignmentNode extends StatementNode {
70
+ constructor(var1, var2, tuple) {
71
+ super();
72
+ this.var1 = var1;
73
+ this.var2 = var2;
74
+ this.tuple = tuple;
75
+ }
76
+ accept(visitor) {
77
+ return visitor.visitTupleAssignment(this);
78
+ }
79
+ }
80
+ exports.TupleAssignmentNode = TupleAssignmentNode;
70
81
  class AssignNode extends StatementNode {
71
82
  constructor(identifier, expression) {
72
83
  super();
@@ -192,6 +203,16 @@ class UnaryOpNode extends ExpressionNode {
192
203
  }
193
204
  }
194
205
  exports.UnaryOpNode = UnaryOpNode;
206
+ class NullaryOpNode extends ExpressionNode {
207
+ constructor(operator) {
208
+ super();
209
+ this.operator = operator;
210
+ }
211
+ accept(visitor) {
212
+ return visitor.visitNullaryOp(this);
213
+ }
214
+ }
215
+ exports.NullaryOpNode = NullaryOpNode;
195
216
  class ArrayNode extends ExpressionNode {
196
217
  constructor(elements) {
197
218
  super();
@@ -1,12 +1,11 @@
1
1
  import { AbstractParseTreeVisitor } from 'antlr4ts/tree/AbstractParseTreeVisitor';
2
2
  import { ParseTree } from 'antlr4ts/tree/ParseTree';
3
- import { Node, SourceFileNode, ContractNode, ParameterNode, VariableDefinitionNode, FunctionDefinitionNode, AssignNode, IdentifierNode, BranchNode, CastNode, FunctionCallNode, UnaryOpNode, BinaryOpNode, BoolLiteralNode, IntLiteralNode, HexLiteralNode, StringLiteralNode, ExpressionNode, LiteralNode, BlockNode, TimeOpNode, ArrayNode, TupleIndexOpNode, RequireNode, InstantiationNode } from './AST';
4
- import { ContractDefinitionContext, FunctionDefinitionContext, VariableDefinitionContext, ParameterContext, AssignStatementContext, IfStatementContext, FunctionCallContext, CastContext, LiteralContext, SourceFileContext, BlockContext, TimeOpStatementContext, ArrayContext, ParenthesisedContext, FunctionCallExpressionContext, UnaryOpContext, BinaryOpContext, IdentifierContext, LiteralExpressionContext, TupleIndexOpContext, RequireStatementContext, PragmaDirectiveContext, PreimageFieldContext, InstantiationContext } from '../grammar/CashScriptParser';
3
+ import { Node, SourceFileNode, ContractNode, ParameterNode, VariableDefinitionNode, FunctionDefinitionNode, AssignNode, IdentifierNode, BranchNode, CastNode, FunctionCallNode, UnaryOpNode, BinaryOpNode, BoolLiteralNode, IntLiteralNode, HexLiteralNode, StringLiteralNode, ExpressionNode, LiteralNode, BlockNode, TimeOpNode, ArrayNode, TupleIndexOpNode, RequireNode, InstantiationNode, TupleAssignmentNode, NullaryOpNode } from './AST';
4
+ import { ContractDefinitionContext, FunctionDefinitionContext, VariableDefinitionContext, TupleAssignmentContext, ParameterContext, AssignStatementContext, IfStatementContext, FunctionCallContext, CastContext, LiteralContext, SourceFileContext, BlockContext, TimeOpStatementContext, ArrayContext, ParenthesisedContext, FunctionCallExpressionContext, UnaryOpContext, BinaryOpContext, IdentifierContext, LiteralExpressionContext, TupleIndexOpContext, RequireStatementContext, PragmaDirectiveContext, InstantiationContext, NullaryOpContext, UnaryIntrospectionOpContext } from '../grammar/CashScriptParser';
5
5
  import { CashScriptVisitor } from '../grammar/CashScriptVisitor';
6
6
  export default class AstBuilder extends AbstractParseTreeVisitor<Node> implements CashScriptVisitor<Node> {
7
7
  private tree;
8
8
  constructor(tree: ParseTree);
9
- private preimageFields;
10
9
  defaultResult(): Node;
11
10
  build(): Node;
12
11
  visitSourceFile(ctx: SourceFileContext): SourceFileNode;
@@ -15,6 +14,7 @@ export default class AstBuilder extends AbstractParseTreeVisitor<Node> implement
15
14
  visitFunctionDefinition(ctx: FunctionDefinitionContext): FunctionDefinitionNode;
16
15
  visitParameter(ctx: ParameterContext): ParameterNode;
17
16
  visitVariableDefinition(ctx: VariableDefinitionContext): VariableDefinitionNode;
17
+ visitTupleAssignment(ctx: TupleAssignmentContext): TupleAssignmentNode;
18
18
  visitAssignStatement(ctx: AssignStatementContext): AssignNode;
19
19
  visitTimeOpStatement(ctx: TimeOpStatementContext): TimeOpNode;
20
20
  visitRequireStatement(ctx: RequireStatementContext): RequireNode;
@@ -26,10 +26,11 @@ export default class AstBuilder extends AbstractParseTreeVisitor<Node> implement
26
26
  visitFunctionCall(ctx: FunctionCallContext): FunctionCallNode;
27
27
  visitInstantiation(ctx: InstantiationContext): InstantiationNode;
28
28
  visitTupleIndexOp(ctx: TupleIndexOpContext): TupleIndexOpNode;
29
+ visitNullaryOp(ctx: NullaryOpContext): NullaryOpNode;
30
+ visitUnaryIntrospectionOp(ctx: UnaryIntrospectionOpContext): UnaryOpNode;
29
31
  visitUnaryOp(ctx: UnaryOpContext): UnaryOpNode;
30
32
  visitBinaryOp(ctx: BinaryOpContext): BinaryOpNode;
31
33
  visitArray(ctx: ArrayContext): ArrayNode;
32
- visitPreimageField(ctx: PreimageFieldContext): IdentifierNode;
33
34
  visitIdentifier(ctx: IdentifierContext): IdentifierNode;
34
35
  visitLiteralExpression(ctx: LiteralExpressionContext): LiteralNode;
35
36
  createLiteral(ctx: LiteralContext): LiteralNode;
@@ -56,15 +56,12 @@ class AstBuilder extends AbstractParseTreeVisitor_1.AbstractParseTreeVisitor {
56
56
  return contract;
57
57
  }
58
58
  visitFunctionDefinition(ctx) {
59
- this.preimageFields = [];
60
59
  const name = ctx.Identifier().text;
61
60
  const parameters = ctx.parameterList().parameter().map((p) => this.visit(p));
62
61
  const statements = ctx.statement().map((s) => this.visit(s));
63
62
  const block = new AST_1.BlockNode(statements);
64
63
  block.location = Location_1.Location.fromCtx(ctx);
65
- // Filter duplicate preimage fields
66
- const preimageFields = [...this.preimageFields].filter((v, i, a) => a.indexOf(v) === i);
67
- const functionDefinition = new AST_1.FunctionDefinitionNode(name, parameters, block, preimageFields);
64
+ const functionDefinition = new AST_1.FunctionDefinitionNode(name, parameters, block);
68
65
  functionDefinition.location = Location_1.Location.fromCtx(ctx);
69
66
  return functionDefinition;
70
67
  }
@@ -83,6 +80,15 @@ class AstBuilder extends AbstractParseTreeVisitor_1.AbstractParseTreeVisitor {
83
80
  variableDefinition.location = Location_1.Location.fromCtx(ctx);
84
81
  return variableDefinition;
85
82
  }
83
+ visitTupleAssignment(ctx) {
84
+ const expression = this.visit(ctx.expression());
85
+ const names = ctx.Identifier();
86
+ const types = ctx.typeName();
87
+ const [var1, var2] = names.map((name, i) => ({ name: name.text, type: utils_1.parseType(types[i].text) }));
88
+ const tupleAssignment = new AST_1.TupleAssignmentNode(var1, var2, expression);
89
+ tupleAssignment.location = Location_1.Location.fromCtx(ctx);
90
+ return tupleAssignment;
91
+ }
86
92
  visitAssignStatement(ctx) {
87
93
  const identifier = new AST_1.IdentifierNode(ctx.Identifier().text);
88
94
  identifier.location = Location_1.Location.fromToken(ctx.Identifier().symbol);
@@ -154,6 +160,19 @@ class AstBuilder extends AbstractParseTreeVisitor_1.AbstractParseTreeVisitor {
154
160
  tupleIndexOp.location = Location_1.Location.fromCtx(ctx);
155
161
  return tupleIndexOp;
156
162
  }
163
+ visitNullaryOp(ctx) {
164
+ const operator = ctx.text;
165
+ const nullaryOp = new AST_1.NullaryOpNode(operator);
166
+ nullaryOp.location = Location_1.Location.fromCtx(ctx);
167
+ return nullaryOp;
168
+ }
169
+ visitUnaryIntrospectionOp(ctx) {
170
+ const operator = `${ctx._scope.text}[i]${ctx._op.text}`;
171
+ const expression = this.visit(ctx.expression());
172
+ const unaryOp = new AST_1.UnaryOpNode(operator, expression);
173
+ unaryOp.location = Location_1.Location.fromCtx(ctx);
174
+ return unaryOp;
175
+ }
157
176
  visitUnaryOp(ctx) {
158
177
  const operator = ctx._op.text;
159
178
  const expression = this.visit(ctx.expression());
@@ -175,13 +194,6 @@ class AstBuilder extends AbstractParseTreeVisitor_1.AbstractParseTreeVisitor {
175
194
  array.location = Location_1.Location.fromCtx(ctx);
176
195
  return array;
177
196
  }
178
- visitPreimageField(ctx) {
179
- const field = ctx.PreimageField().text;
180
- this.preimageFields.push(field);
181
- const identifier = new AST_1.IdentifierNode(field);
182
- identifier.location = Location_1.Location.fromCtx(ctx);
183
- return identifier;
184
- }
185
197
  visitIdentifier(ctx) {
186
198
  const identifier = new AST_1.IdentifierNode(ctx.Identifier().text);
187
199
  identifier.location = Location_1.Location.fromCtx(ctx);
@@ -1,4 +1,4 @@
1
- import { Node, SourceFileNode, ContractNode, ParameterNode, VariableDefinitionNode, FunctionDefinitionNode, AssignNode, IdentifierNode, BranchNode, CastNode, FunctionCallNode, UnaryOpNode, BinaryOpNode, BoolLiteralNode, IntLiteralNode, HexLiteralNode, StringLiteralNode, BlockNode, TimeOpNode, ArrayNode, TupleIndexOpNode, RequireNode, InstantiationNode } from './AST';
1
+ import { Node, SourceFileNode, ContractNode, ParameterNode, VariableDefinitionNode, FunctionDefinitionNode, AssignNode, IdentifierNode, BranchNode, CastNode, FunctionCallNode, UnaryOpNode, BinaryOpNode, BoolLiteralNode, IntLiteralNode, HexLiteralNode, StringLiteralNode, BlockNode, TimeOpNode, ArrayNode, TupleIndexOpNode, RequireNode, InstantiationNode, TupleAssignmentNode, NullaryOpNode } from './AST';
2
2
  import AstVisitor from './AstVisitor';
3
3
  export default class AstTraversal extends AstVisitor<Node> {
4
4
  visitSourceFile(node: SourceFileNode): Node;
@@ -6,6 +6,7 @@ export default class AstTraversal extends AstVisitor<Node> {
6
6
  visitFunctionDefinition(node: FunctionDefinitionNode): Node;
7
7
  visitParameter(node: ParameterNode): Node;
8
8
  visitVariableDefinition(node: VariableDefinitionNode): Node;
9
+ visitTupleAssignment(node: TupleAssignmentNode): Node;
9
10
  visitAssign(node: AssignNode): Node;
10
11
  visitTimeOp(node: TimeOpNode): Node;
11
12
  visitRequire(node: RequireNode): Node;
@@ -17,6 +18,7 @@ export default class AstTraversal extends AstVisitor<Node> {
17
18
  visitTupleIndexOp(node: TupleIndexOpNode): Node;
18
19
  visitBinaryOp(node: BinaryOpNode): Node;
19
20
  visitUnaryOp(node: UnaryOpNode): Node;
21
+ visitNullaryOp(node: NullaryOpNode): Node;
20
22
  visitArray(node: ArrayNode): Node;
21
23
  visitIdentifier(node: IdentifierNode): Node;
22
24
  visitBoolLiteral(node: BoolLiteralNode): Node;
@@ -26,6 +26,10 @@ class AstTraversal extends AstVisitor_1.default {
26
26
  node.expression = this.visit(node.expression);
27
27
  return node;
28
28
  }
29
+ visitTupleAssignment(node) {
30
+ node.tuple = this.visit(node.tuple);
31
+ return node;
32
+ }
29
33
  visitAssign(node) {
30
34
  node.identifier = this.visit(node.identifier);
31
35
  node.expression = this.visit(node.expression);
@@ -77,6 +81,9 @@ class AstTraversal extends AstVisitor_1.default {
77
81
  node.expression = this.visit(node.expression);
78
82
  return node;
79
83
  }
84
+ visitNullaryOp(node) {
85
+ return node;
86
+ }
80
87
  visitArray(node) {
81
88
  node.elements = this.visitList(node.elements);
82
89
  return node;
@@ -1,10 +1,11 @@
1
- import { Node, SourceFileNode, ContractNode, ParameterNode, VariableDefinitionNode, FunctionDefinitionNode, AssignNode, IdentifierNode, BranchNode, CastNode, FunctionCallNode, UnaryOpNode, BinaryOpNode, BoolLiteralNode, IntLiteralNode, HexLiteralNode, StringLiteralNode, BlockNode, TimeOpNode, ArrayNode, TupleIndexOpNode, RequireNode, InstantiationNode } from './AST';
1
+ import { Node, SourceFileNode, ContractNode, ParameterNode, VariableDefinitionNode, FunctionDefinitionNode, AssignNode, IdentifierNode, BranchNode, CastNode, FunctionCallNode, UnaryOpNode, BinaryOpNode, BoolLiteralNode, IntLiteralNode, HexLiteralNode, StringLiteralNode, BlockNode, TimeOpNode, ArrayNode, TupleIndexOpNode, RequireNode, InstantiationNode, TupleAssignmentNode, NullaryOpNode } from './AST';
2
2
  export default abstract class AstVisitor<T> {
3
3
  abstract visitSourceFile(node: SourceFileNode): T;
4
4
  abstract visitContract(node: ContractNode): T;
5
5
  abstract visitFunctionDefinition(node: FunctionDefinitionNode): T;
6
6
  abstract visitParameter(node: ParameterNode): T;
7
7
  abstract visitVariableDefinition(node: VariableDefinitionNode): T;
8
+ abstract visitTupleAssignment(node: TupleAssignmentNode): T;
8
9
  abstract visitAssign(node: AssignNode): T;
9
10
  abstract visitTimeOp(node: TimeOpNode): T;
10
11
  abstract visitRequire(node: RequireNode): T;
@@ -16,6 +17,7 @@ export default abstract class AstVisitor<T> {
16
17
  abstract visitTupleIndexOp(node: TupleIndexOpNode): T;
17
18
  abstract visitBinaryOp(node: BinaryOpNode): T;
18
19
  abstract visitUnaryOp(node: UnaryOpNode): T;
20
+ abstract visitNullaryOp(node: NullaryOpNode): T;
19
21
  abstract visitArray(node: ArrayNode): T;
20
22
  abstract visitIdentifier(node: IdentifierNode): T;
21
23
  abstract visitBoolLiteral(node: BoolLiteralNode): T;
@@ -21,20 +21,8 @@ export declare enum TimeOp {
21
21
  CHECK_LOCKTIME = "tx.time"
22
22
  }
23
23
  export declare enum Class {
24
- OUTPUT_P2SH = "OutputP2SH",
25
- OUTPUT_P2PKH = "OutputP2PKH",
26
- OUTPUT_NULLDATA = "OutputNullData"
27
- }
28
- export declare enum PreimageField {
29
- VERSION = "tx.version",
30
- HASHPREVOUTS = "tx.hashPrevouts",
31
- HASHSEQUENCE = "tx.hashSequence",
32
- OUTPOINT = "tx.outpoint",
33
- BYTECODE = "tx.bytecode",
34
- VALUE = "tx.value",
35
- SEQUENCE = "tx.sequence",
36
- HASHOUTPUTS = "tx.hashOutputs",
37
- LOCKTIME = "tx.locktime",
38
- HASHTYPE = "tx.hashtype"
24
+ LOCKING_BYTECODE_P2SH = "LockingBytecodeP2SH",
25
+ LOCKING_BYTECODE_P2PKH = "LockingBytecodeP2PKH",
26
+ LOCKING_BYTECODE_NULLDATA = "LockingBytecodeNullData"
39
27
  }
40
28
  export declare const GLOBAL_SYMBOL_TABLE: SymbolTable;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GLOBAL_SYMBOL_TABLE = exports.PreimageField = exports.Class = exports.TimeOp = exports.GlobalFunction = exports.NumberUnit = void 0;
3
+ exports.GLOBAL_SYMBOL_TABLE = exports.Class = exports.TimeOp = exports.GlobalFunction = exports.NumberUnit = void 0;
4
4
  const utils_1 = require("@cashscript/utils");
5
5
  const SymbolTable_1 = require("./SymbolTable");
6
6
  exports.NumberUnit = {
@@ -37,39 +37,15 @@ var TimeOp;
37
37
  })(TimeOp = exports.TimeOp || (exports.TimeOp = {}));
38
38
  var Class;
39
39
  (function (Class) {
40
- Class["OUTPUT_P2SH"] = "OutputP2SH";
41
- Class["OUTPUT_P2PKH"] = "OutputP2PKH";
42
- Class["OUTPUT_NULLDATA"] = "OutputNullData";
40
+ Class["LOCKING_BYTECODE_P2SH"] = "LockingBytecodeP2SH";
41
+ Class["LOCKING_BYTECODE_P2PKH"] = "LockingBytecodeP2PKH";
42
+ Class["LOCKING_BYTECODE_NULLDATA"] = "LockingBytecodeNullData";
43
43
  })(Class = exports.Class || (exports.Class = {}));
44
- var PreimageField;
45
- (function (PreimageField) {
46
- PreimageField["VERSION"] = "tx.version";
47
- PreimageField["HASHPREVOUTS"] = "tx.hashPrevouts";
48
- PreimageField["HASHSEQUENCE"] = "tx.hashSequence";
49
- PreimageField["OUTPOINT"] = "tx.outpoint";
50
- PreimageField["BYTECODE"] = "tx.bytecode";
51
- PreimageField["VALUE"] = "tx.value";
52
- PreimageField["SEQUENCE"] = "tx.sequence";
53
- PreimageField["HASHOUTPUTS"] = "tx.hashOutputs";
54
- PreimageField["LOCKTIME"] = "tx.locktime";
55
- PreimageField["HASHTYPE"] = "tx.hashtype";
56
- })(PreimageField = exports.PreimageField || (exports.PreimageField = {}));
57
44
  exports.GLOBAL_SYMBOL_TABLE = new SymbolTable_1.SymbolTable();
58
- // Preimage fields
59
- exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.global(PreimageField.VERSION, new utils_1.BytesType(4)));
60
- exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.global(PreimageField.HASHPREVOUTS, new utils_1.BytesType(32)));
61
- exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.global(PreimageField.HASHSEQUENCE, new utils_1.BytesType(32)));
62
- exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.global(PreimageField.OUTPOINT, new utils_1.BytesType(36)));
63
- exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.global(PreimageField.BYTECODE, new utils_1.BytesType()));
64
- exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.global(PreimageField.VALUE, new utils_1.BytesType(8)));
65
- exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.global(PreimageField.SEQUENCE, new utils_1.BytesType(4)));
66
- exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.global(PreimageField.HASHOUTPUTS, new utils_1.BytesType(32)));
67
- exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.global(PreimageField.LOCKTIME, new utils_1.BytesType(4)));
68
- exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.global(PreimageField.HASHTYPE, new utils_1.BytesType(4)));
69
45
  // Classes
70
- exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.class(Class.OUTPUT_P2SH, new utils_1.BytesType(32), [new utils_1.BytesType(8), new utils_1.BytesType(20)]));
71
- exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.class(Class.OUTPUT_P2PKH, new utils_1.BytesType(34), [new utils_1.BytesType(8), new utils_1.BytesType(20)]));
72
- exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.class(Class.OUTPUT_NULLDATA, new utils_1.BytesType(), [new utils_1.ArrayType(new utils_1.BytesType())]));
46
+ exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.class(Class.LOCKING_BYTECODE_P2SH, new utils_1.BytesType(23), [new utils_1.BytesType(20)]));
47
+ exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.class(Class.LOCKING_BYTECODE_P2PKH, new utils_1.BytesType(25), [new utils_1.BytesType(20)]));
48
+ exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.class(Class.LOCKING_BYTECODE_NULLDATA, new utils_1.BytesType(), [new utils_1.ArrayType(new utils_1.BytesType())]));
73
49
  // Global functions
74
50
  exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.function(GlobalFunction.ABS, utils_1.PrimitiveType.INT, [utils_1.PrimitiveType.INT]));
75
51
  exports.GLOBAL_SYMBOL_TABLE.set(SymbolTable_1.Symbol.function(GlobalFunction.MIN, utils_1.PrimitiveType.INT, [utils_1.PrimitiveType.INT, utils_1.PrimitiveType.INT]));
@@ -1,10 +1,27 @@
1
+ export declare enum NullaryOperator {
2
+ INPUT_INDEX = "this.activeInputIndex",
3
+ BYTECODE = "this.activeBytecode",
4
+ INPUT_COUNT = "tx.inputs.length",
5
+ OUTPUT_COUNT = "tx.outputs.length",
6
+ VERSION = "tx.version",
7
+ LOCKTIME = "tx.locktime"
8
+ }
1
9
  export declare enum UnaryOperator {
2
10
  NOT = "!",
3
11
  NEGATE = "-",
4
12
  SIZE = ".length",
5
- REVERSE = ".reverse()"
13
+ REVERSE = ".reverse()",
14
+ INPUT_VALUE = "tx.inputs[i].value",
15
+ INPUT_LOCKING_BYTECODE = "tx.inputs[i].lockingBytecode",
16
+ INPUT_OUTPOINT_HASH = "tx.inputs[i].outpointTransactionHash",
17
+ INPUT_OUTPOINT_INDEX = "tx.inputs[i].outpointIndex",
18
+ INPUT_UNLOCKING_BYTECODE = "tx.inputs[i].unlockingBytecode",
19
+ INPUT_SEQUENCE_NUMBER = "tx.inputs[i].sequenceNumber",
20
+ OUTPUT_VALUE = "tx.outputs[i].value",
21
+ OUTPUT_LOCKING_BYTECODE = "tx.outputs[i].lockingBytecode"
6
22
  }
7
23
  export declare enum BinaryOperator {
24
+ MUL = "*",
8
25
  DIV = "/",
9
26
  MOD = "%",
10
27
  PLUS = "+",
@@ -1,15 +1,33 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BinaryOperator = exports.UnaryOperator = void 0;
3
+ exports.BinaryOperator = exports.UnaryOperator = exports.NullaryOperator = void 0;
4
+ var NullaryOperator;
5
+ (function (NullaryOperator) {
6
+ NullaryOperator["INPUT_INDEX"] = "this.activeInputIndex";
7
+ NullaryOperator["BYTECODE"] = "this.activeBytecode";
8
+ NullaryOperator["INPUT_COUNT"] = "tx.inputs.length";
9
+ NullaryOperator["OUTPUT_COUNT"] = "tx.outputs.length";
10
+ NullaryOperator["VERSION"] = "tx.version";
11
+ NullaryOperator["LOCKTIME"] = "tx.locktime";
12
+ })(NullaryOperator = exports.NullaryOperator || (exports.NullaryOperator = {}));
4
13
  var UnaryOperator;
5
14
  (function (UnaryOperator) {
6
15
  UnaryOperator["NOT"] = "!";
7
16
  UnaryOperator["NEGATE"] = "-";
8
17
  UnaryOperator["SIZE"] = ".length";
9
18
  UnaryOperator["REVERSE"] = ".reverse()";
19
+ UnaryOperator["INPUT_VALUE"] = "tx.inputs[i].value";
20
+ UnaryOperator["INPUT_LOCKING_BYTECODE"] = "tx.inputs[i].lockingBytecode";
21
+ UnaryOperator["INPUT_OUTPOINT_HASH"] = "tx.inputs[i].outpointTransactionHash";
22
+ UnaryOperator["INPUT_OUTPOINT_INDEX"] = "tx.inputs[i].outpointIndex";
23
+ UnaryOperator["INPUT_UNLOCKING_BYTECODE"] = "tx.inputs[i].unlockingBytecode";
24
+ UnaryOperator["INPUT_SEQUENCE_NUMBER"] = "tx.inputs[i].sequenceNumber";
25
+ UnaryOperator["OUTPUT_VALUE"] = "tx.outputs[i].value";
26
+ UnaryOperator["OUTPUT_LOCKING_BYTECODE"] = "tx.outputs[i].lockingBytecode";
10
27
  })(UnaryOperator = exports.UnaryOperator || (exports.UnaryOperator = {}));
11
28
  var BinaryOperator;
12
29
  (function (BinaryOperator) {
30
+ BinaryOperator["MUL"] = "*";
13
31
  BinaryOperator["DIV"] = "/";
14
32
  BinaryOperator["MOD"] = "%";
15
33
  BinaryOperator["PLUS"] = "+";
@@ -20,6 +20,7 @@ commander_1.program
20
20
  .option('-A, --asm', 'Compile the contract to ASM format rather than a full artifact.')
21
21
  .option('-c, --opcount', 'Display the number of opcodes in the compiled bytecode.')
22
22
  .option('-s, --size', 'Display the size in bytes of the compiled bytecode.')
23
+ .helpOption('-?, --help', 'Display help')
23
24
  .parse();
24
25
  const opts = commander_1.program.opts();
25
26
  run();
@@ -16,7 +16,6 @@ const CashScriptParser_1 = require("./grammar/CashScriptParser");
16
16
  const SymbolTableTraversal_1 = __importDefault(require("./semantic/SymbolTableTraversal"));
17
17
  const TypeCheckTraversal_1 = __importDefault(require("./semantic/TypeCheckTraversal"));
18
18
  const EnsureFinalRequireTraversal_1 = __importDefault(require("./semantic/EnsureFinalRequireTraversal"));
19
- const VerifyCovenantTraversal_1 = __importDefault(require("./semantic/VerifyCovenantTraversal"));
20
19
  function compileString(code) {
21
20
  // Lexing + parsing
22
21
  let ast = parseCode(code);
@@ -24,7 +23,6 @@ function compileString(code) {
24
23
  ast = ast.accept(new SymbolTableTraversal_1.default());
25
24
  ast = ast.accept(new TypeCheckTraversal_1.default());
26
25
  ast = ast.accept(new EnsureFinalRequireTraversal_1.default());
27
- ast = ast.accept(new VerifyCovenantTraversal_1.default());
28
26
  // Code generation
29
27
  const traversal = new GenerateTargetTraversal_1.default();
30
28
  ast = ast.accept(traversal);
@@ -1,14 +1,11 @@
1
1
  import { Script } from '@cashscript/utils';
2
- import { ContractNode, ParameterNode, VariableDefinitionNode, FunctionDefinitionNode, AssignNode, IdentifierNode, BranchNode, CastNode, FunctionCallNode, UnaryOpNode, BinaryOpNode, BoolLiteralNode, IntLiteralNode, HexLiteralNode, StringLiteralNode, TimeOpNode, ArrayNode, TupleIndexOpNode, RequireNode, SourceFileNode, Node, InstantiationNode } from '../ast/AST';
2
+ import { ContractNode, ParameterNode, VariableDefinitionNode, FunctionDefinitionNode, AssignNode, IdentifierNode, BranchNode, CastNode, FunctionCallNode, UnaryOpNode, BinaryOpNode, BoolLiteralNode, IntLiteralNode, HexLiteralNode, StringLiteralNode, TimeOpNode, ArrayNode, TupleIndexOpNode, RequireNode, SourceFileNode, Node, InstantiationNode, TupleAssignmentNode, NullaryOpNode } from '../ast/AST';
3
3
  import AstTraversal from '../ast/AstTraversal';
4
- import { PreimageField } from '../ast/Globals';
5
4
  export default class GenerateTargetTraversal extends AstTraversal {
6
5
  output: Script;
7
6
  stack: string[];
8
7
  private scopeDepth;
9
8
  private currentFunction;
10
- private isCheckSigVerify;
11
- private covenantNeedsToBeVerified;
12
9
  private emit;
13
10
  private pushToStack;
14
11
  private popFromStack;
@@ -18,27 +15,25 @@ export default class GenerateTargetTraversal extends AstTraversal {
18
15
  visitSourceFile(node: SourceFileNode): Node;
19
16
  visitContract(node: ContractNode): Node;
20
17
  visitFunctionDefinition(node: FunctionDefinitionNode): Node;
21
- decodePreimage(fields: PreimageField[]): void;
22
18
  removeFinalVerify(): void;
23
19
  cleanStack(): void;
24
20
  visitParameter(node: ParameterNode): Node;
25
21
  visitVariableDefinition(node: VariableDefinitionNode): Node;
22
+ visitTupleAssignment(node: TupleAssignmentNode): Node;
26
23
  visitAssign(node: AssignNode): Node;
27
24
  emitReplace(index: number): void;
28
25
  visitTimeOp(node: TimeOpNode): Node;
29
26
  visitRequire(node: RequireNode): Node;
30
- containsCheckSig(node: RequireNode): boolean;
31
27
  visitBranch(node: BranchNode): Node;
32
28
  removeScopedVariables(depthBeforeScope: number): void;
33
29
  visitCast(node: CastNode): Node;
34
30
  visitFunctionCall(node: FunctionCallNode): Node;
35
31
  visitMultiSig(node: FunctionCallNode): Node;
36
- needsToVerifyCovenant(node: FunctionCallNode): boolean;
37
- verifyCovenant(): void;
38
32
  visitInstantiation(node: InstantiationNode): Node;
39
33
  visitTupleIndexOp(node: TupleIndexOpNode): Node;
40
34
  visitBinaryOp(node: BinaryOpNode): Node;
41
35
  visitUnaryOp(node: UnaryOpNode): Node;
36
+ visitNullaryOp(node: NullaryOpNode): Node;
42
37
  visitArray(node: ArrayNode): Node;
43
38
  visitIdentifier(node: IdentifierNode): Node;
44
39
  isOpRoll(node: IdentifierNode): boolean;