Skip to content

Commit c31435a

Browse files
committed
refactor: refactor method call #22
1 parent 88f42e4 commit c31435a

2 files changed

Lines changed: 66 additions & 20 deletions

File tree

chapi-domain/src/main/kotlin/chapi/domain/expr/Expression.kt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,15 @@ sealed class Expression {
4848
override fun toString() = name
4949
}
5050

51-
// lhs: identifier, rhs: expression
52-
class MethodCall(val functionName: String, val args: Array<ExpressionNode>, val className: String = "") :
51+
/// lhs.call(rhs)
52+
class MethodCall(val lhs: ExpressionNode, val rhs: Array<ExpressionNode>, val caller: ExpressionNode? = null) :
5353
ExpressionNode {
5454
override fun toString(): String {
55-
return if (className == "") {
56-
"$functionName(${args.joinToString(", ")})"
55+
val argsStr = rhs.joinToString(", ") { it.toString() }
56+
return if (caller == null) {
57+
"$lhs($argsStr)"
5758
} else {
58-
"$className.$functionName(${args.joinToString(", ")})"
59+
"$lhs.$caller($argsStr)"
5960
}
6061
}
6162
}
@@ -79,6 +80,10 @@ sealed class Expression {
7980
return "switch ($lhs) {\n$casesStr\n$defaultStr\n}"
8081
}
8182
}
83+
84+
class RangeOp(val lhs: ExpressionNode, val rhs: ExpressionNode) : ExpressionNode {
85+
override fun toString() = "$lhs..$rhs"
86+
}
8287

8388
class CaseOp(val condition: ExpressionNode, val thenBlock: ExpressionNode) : ExpressionNode {
8489
override fun toString() = "$condition -> $thenBlock"

chapi-domain/src/test/kotlin/chapi/domain/expr/ExpressionTest.kt

Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,21 @@ class ExpressionTest {
5151

5252
@Test
5353
fun functionCall() {
54-
assertEquals(Expression.MethodCall(
55-
functionName = "add",
56-
className = "math",
57-
args = arrayOf(
54+
assertEquals(
55+
Expression.MethodCall(
56+
lhs = Expression.Identifier("math"),
57+
caller = Expression.Identifier("add"),
58+
rhs = arrayOf(
5859
Expression.IntValue(1),
5960
Expression.IntValue(2)
6061
)
6162
).toString(), "math.add(1, 2)"
6263
)
6364

64-
assertEquals(Expression.MethodCall(
65-
functionName = "add",
66-
args = arrayOf(
65+
assertEquals(
66+
Expression.MethodCall(
67+
lhs = Expression.Identifier("add"),
68+
rhs = arrayOf(
6769
Expression.IntValue(1),
6870
Expression.IntValue(2)
6971
)
@@ -73,7 +75,8 @@ class ExpressionTest {
7375

7476
@Test
7577
fun arrayLiteral() {
76-
assertEquals(Expression.ArrayLiteral(
78+
assertEquals(
79+
Expression.ArrayLiteral(
7780
args = arrayOf(
7881
Expression.IntValue(1),
7982
Expression.IntValue(2)
@@ -84,7 +87,8 @@ class ExpressionTest {
8487

8588
@Test
8689
fun tryCatch() {
87-
assertEquals(Expression.TryCatch(
90+
assertEquals(
91+
Expression.TryCatch(
8892
tryBlock = Expression.Value(1),
8993
catchBlock = Expression.IntValue(2)
9094
).toString(), "try { 1 } catch { 2 }"
@@ -93,7 +97,8 @@ class ExpressionTest {
9397

9498
@Test
9599
fun ifElse() {
96-
assertEquals(Expression.IfElse(
100+
assertEquals(
101+
Expression.IfElse(
97102
condition = Expression.IntValue(1),
98103
thenBlock = Expression.IntValue(2),
99104
elseBlock = Expression.IntValue(3)
@@ -103,7 +108,8 @@ class ExpressionTest {
103108

104109
@Test
105110
fun compareItem() {
106-
assertEquals(Expression.ComparisonOp(
111+
assertEquals(
112+
Expression.ComparisonOp(
107113
lhs = Expression.IntValue(1),
108114
op = ComparisonOpKind.GreaterThan,
109115
rhs = Expression.IntValue(2)
@@ -123,12 +129,13 @@ class ExpressionTest {
123129
)
124130
)
125131

126-
assertEquals("a + (b - c)", binOp.toString())
132+
assertEquals("a + b - c", binOp.toString())
127133
}
128134

129135
@Test
130136
fun assignment() {
131-
assertEquals(Expression.AssignOp(
137+
assertEquals(
138+
Expression.AssignOp(
132139
lhs = Expression.Variable("a"),
133140
op = AssignOpKind.Assign,
134141
rhs = Expression.IntValue(1)
@@ -138,7 +145,8 @@ class ExpressionTest {
138145

139146
@Test
140147
fun switchCase() {
141-
assertEquals(Expression.SwitchCases(
148+
assertEquals(
149+
Expression.SwitchCases(
142150
lhs = Expression.Variable("a"),
143151
cases = arrayOf(
144152
Expression.CaseOp(
@@ -151,7 +159,40 @@ class ExpressionTest {
151159
)
152160
),
153161
defaultBlock = Expression.IntValue(4)
154-
).toString(), "switch (a) { case 1: 2; case 2: 3; default: 4; }"
162+
).toString(), "switch (a) {\n" +
163+
"case 1: 2\n" +
164+
"case 2: 3\n" +
165+
"default: 4\n" +
166+
"}"
167+
)
168+
}
169+
170+
@Test
171+
fun range() {
172+
assertEquals(
173+
Expression.RangeOp(
174+
lhs = Expression.IntValue(1),
175+
rhs = Expression.IntValue(2)
176+
).toString(), "1..2"
177+
)
178+
}
179+
180+
@Test
181+
fun chainedMethodCall() {
182+
assertEquals(
183+
Expression.MethodCall(
184+
lhs = Expression.MethodCall(
185+
lhs = Expression.StringValue("add"),
186+
rhs = arrayOf(
187+
Expression.IntValue(1),
188+
Expression.IntValue(2)
189+
),
190+
),
191+
caller = Expression.Identifier("sub"),
192+
rhs = arrayOf(
193+
Expression.IntValue(3)
194+
)
195+
).toString(), "add(1, 2).sub(3)"
155196
)
156197
}
157198
}

0 commit comments

Comments
 (0)