Skip to content

Commit dcc387c

Browse files
committed
tests for array init and params
1 parent a315927 commit dcc387c

File tree

6 files changed

+237
-10
lines changed

6 files changed

+237
-10
lines changed

src/jast/_jast.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,7 +1098,7 @@ def __init__(
10981098
raise ValueError("args is required for Lambda")
10991099
if body is None:
11001100
raise ValueError("body is required for Lambda")
1101-
if isinstance(args, params) and args.receiver_parameter:
1101+
if isinstance(args, params) and args.receiver_param:
11021102
raise ValueError("receiver_param is not allowed for Lambda")
11031103
self.args = args
11041104
self.body = body
@@ -1798,14 +1798,14 @@ def __init__(
17981798
**kwargs,
17991799
):
18001800
super().__init__(*vargs, **kwargs)
1801-
self.receiver_parameter = receiver_param
1801+
self.receiver_param = receiver_param
18021802
self.parameters = parameters or []
18031803

18041804
def __iter__(self) -> Iterator[Tuple[str, JAST | List[JAST]]]:
1805-
if self.receiver_parameter:
1806-
yield "receiver_param", self.receiver_parameter
1805+
if self.receiver_param:
1806+
yield "receiver_param", self.receiver_param
18071807
if self.parameters:
1808-
yield "args", self.parameters
1808+
yield "parameters", self.parameters
18091809

18101810

18111811
# Statements

src/jast/_parser/_convert.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,7 @@ def visitReceiverParameter(
695695
]
696696
return jast.receiver(
697697
type=type_,
698-
id=identifiers,
698+
identifiers=identifiers,
699699
)
700700

701701
def visitFormalParameterList(
@@ -729,10 +729,14 @@ def visitLastFormalParameter(
729729
self.visitVariableModifier(modifier) for modifier in ctx.variableModifier()
730730
]
731731
type_ = self.visitTypeType(ctx.typeType())
732+
annotations = [
733+
self.visitAnnotation(annotation) for annotation in ctx.annotation()
734+
]
732735
identifier = self.visitVariableDeclaratorId(ctx.variableDeclaratorId())
733736
return jast.arity(
734737
modifiers=modifiers,
735738
type=type_,
739+
annotations=annotations,
736740
id=identifier,
737741
)
738742

src/jast/_unparse.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ def visit_arrayinit(self, node: jast.arrayinit):
672672
def visit_receiver(self, node: jast.receiver):
673673
self.visit(node.type)
674674
self.write(" ")
675-
self.interleave(node.identifiers, ".", ".")
675+
self.interleave(node.identifiers, ".", end=".")
676676
self.write("this")
677677

678678
def visit_param(self, node: jast.param):
@@ -690,7 +690,7 @@ def visit_arity(self, node: jast.arity):
690690
self.visit_variabledeclaratorid(node.id)
691691

692692
def visit_params(self, node: jast.params):
693-
self.items_view(filter(None, [node.receiver_parameter] + node.parameters))
693+
self.items_view(filter(None, [node.receiver_param] + node.parameters))
694694

695695
def visit_LocalClass(self, node: jast.LocalClass):
696696
pass

tests/test_jast.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,3 +1291,94 @@ def test_Reference_error(self):
12911291
jast.Reference,
12921292
new=True,
12931293
)
1294+
1295+
def test_arrayinit(self):
1296+
arrayinit = jast.arrayinit(values=[jast.Constant(jast.IntLiteral(42))])
1297+
self.assertIsInstance(arrayinit, jast.arrayinit)
1298+
self.assertIsInstance(arrayinit, jast.JAST)
1299+
self.assertEqual(1, len(arrayinit.values))
1300+
self._test_int_constant(arrayinit.values[0], 42)
1301+
self._test_iteration(arrayinit)
1302+
1303+
def test_receiver(self):
1304+
receiver = jast.receiver(type=jast.Int(), identifiers=[jast.identifier("foo")])
1305+
self.assertIsInstance(receiver, jast.receiver)
1306+
self.assertIsInstance(receiver, jast.JAST)
1307+
self.assertIsInstance(receiver.type, jast.Int)
1308+
self.assertEqual(1, len(receiver.identifiers))
1309+
self._test_identifier(receiver.identifiers[0], "foo")
1310+
self._test_iteration(receiver)
1311+
1312+
def test_receiver_error(self):
1313+
self.assertRaises(
1314+
ValueError, jast.receiver, identifiers=[jast.identifier("foo")]
1315+
)
1316+
1317+
def test_param(self):
1318+
param = jast.param(
1319+
modifiers=[jast.Final()],
1320+
type=jast.Int(),
1321+
id=jast.variabledeclaratorid(jast.identifier("bar")),
1322+
)
1323+
self.assertIsInstance(param, jast.param)
1324+
self.assertIsInstance(param, jast.JAST)
1325+
self.assertEqual(1, len(param.modifiers))
1326+
self.assertIsInstance(param.modifiers[0], jast.Final)
1327+
self.assertIsInstance(param.type, jast.Int)
1328+
self.assertIsInstance(param.id, jast.variabledeclaratorid)
1329+
self._test_identifier(param.id.id, "bar")
1330+
self.assertEqual(0, len(param.id.dims))
1331+
self._test_iteration(param)
1332+
1333+
def test_param_error(self):
1334+
self.assertRaises(
1335+
ValueError, jast.param, id=jast.variabledeclaratorid(jast.identifier("bar"))
1336+
)
1337+
self.assertRaises(ValueError, jast.param, type=jast.Int())
1338+
1339+
def test_arity(self):
1340+
arity = jast.arity(
1341+
modifiers=[jast.Final()],
1342+
type=jast.Int(),
1343+
annotations=[jast.Annotation(jast.qname([jast.identifier("foo")]))],
1344+
id=jast.variabledeclaratorid(jast.identifier("bar")),
1345+
)
1346+
self.assertIsInstance(arity, jast.arity)
1347+
self.assertIsInstance(arity, jast.JAST)
1348+
self.assertEqual(1, len(arity.modifiers))
1349+
self.assertIsInstance(arity.modifiers[0], jast.Final)
1350+
self.assertIsInstance(arity.type, jast.Int)
1351+
self.assertEqual(1, len(arity.annotations))
1352+
self.assertIsInstance(arity.annotations[0], jast.Annotation)
1353+
self.assertIsInstance(arity.id, jast.variabledeclaratorid)
1354+
self._test_identifier(arity.id.id, "bar")
1355+
self.assertEqual(0, len(arity.id.dims))
1356+
self._test_iteration(arity)
1357+
1358+
def test_arity_error(self):
1359+
self.assertRaises(ValueError, jast.arity, id=jast.identifier("bar"))
1360+
self.assertRaises(ValueError, jast.arity, type=jast.Int())
1361+
1362+
def test_params(self):
1363+
params = jast.params(
1364+
receiver_param=jast.receiver(jast.Int()),
1365+
parameters=[
1366+
jast.param(
1367+
modifiers=[jast.Final()],
1368+
type=jast.Int(),
1369+
id=jast.variabledeclaratorid(jast.identifier("foo")),
1370+
),
1371+
jast.param(
1372+
modifiers=[jast.Final()],
1373+
type=jast.Int(),
1374+
id=jast.variabledeclaratorid(jast.identifier("bar")),
1375+
),
1376+
],
1377+
)
1378+
self.assertIsInstance(params, jast.params)
1379+
self.assertIsInstance(params, jast.JAST)
1380+
self.assertIsInstance(params.receiver_param, jast.receiver)
1381+
self.assertEqual(2, len(params.parameters))
1382+
self.assertIsInstance(params.parameters[0], jast.param)
1383+
self.assertIsInstance(params.parameters[1], jast.param)
1384+
self._test_iteration(params)

tests/test_parse.py

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,7 @@ def test_Lambda_parameters(self):
591591
tree = jast.parse("(int x, boolean y) -> x", jast.ParseMode.EXPR)
592592
self.assertIsInstance(tree, jast.Lambda)
593593
self.assertIsInstance(tree.args, jast.params)
594-
self.assertIsNone(tree.args.receiver_parameter)
594+
self.assertIsNone(tree.args.receiver_param)
595595
self.assertEqual(2, len(tree.args.parameters))
596596
param = tree.args.parameters[0]
597597
self.assertIsInstance(param, jast.param)
@@ -608,7 +608,7 @@ def test_Lambda_var_parameters(self):
608608
tree = jast.parse("(var x, var y) -> x", jast.ParseMode.EXPR)
609609
self.assertIsInstance(tree, jast.Lambda)
610610
self.assertIsInstance(tree.args, jast.params)
611-
self.assertIsNone(tree.args.receiver_parameter)
611+
self.assertIsNone(tree.args.receiver_param)
612612
self.assertEqual(2, len(tree.args.parameters))
613613
param = tree.args.parameters[0]
614614
self.assertIsInstance(param, jast.param)
@@ -1490,3 +1490,86 @@ def test_Reference_class_type(self):
14901490
self.assertIsInstance(tree.type_args.types[0], jast.Int)
14911491
self.assertIsNone(tree.id)
14921492
self.assertTrue(tree.new)
1493+
1494+
def test_arrayinit(self):
1495+
tree = jast.parse("int[] x = {42, 24};", jast.ParseMode.DECL)
1496+
self.assertIsInstance(tree, jast.Field)
1497+
self.assertIsInstance(tree.type, jast.ArrayType)
1498+
self.assertIsInstance(tree.type.type, jast.Int)
1499+
self.assertEqual(1, len(tree.type.dims))
1500+
self.assertIsInstance(tree.type.dims[0], jast.dim)
1501+
self.assertEqual(1, len(tree.declarators))
1502+
declarator = tree.declarators[0]
1503+
self.assertIsInstance(declarator, jast.declarator)
1504+
self.assertIsInstance(declarator.id, jast.variabledeclaratorid)
1505+
self._test_identifier(declarator.id.id, "x")
1506+
self.assertEqual(0, len(declarator.id.dims))
1507+
self.assertIsNotNone(declarator.initializer)
1508+
self.assertIsInstance(declarator.initializer, jast.arrayinit)
1509+
self.assertEqual(2, len(declarator.initializer.values))
1510+
self._test_int_constant(declarator.initializer.values[0], 42)
1511+
self._test_int_constant(declarator.initializer.values[1], 24)
1512+
1513+
def test_params(self):
1514+
tree = jast.parse(
1515+
"int foo(int x.y.this, final int a, final int @bar ... b[][]) {}",
1516+
jast.ParseMode.DECL,
1517+
)
1518+
self.assertIsInstance(tree, jast.Method)
1519+
self.assertIsInstance(tree.return_type, jast.Int)
1520+
self.assertIsInstance(tree.parameters, jast.params)
1521+
self.assertIsNotNone(tree.parameters.receiver_param)
1522+
self.assertIsInstance(tree.parameters.receiver_param, jast.receiver)
1523+
self.assertIsInstance(tree.parameters.receiver_param.type, jast.Int)
1524+
self.assertEqual(2, len(tree.parameters.receiver_param.identifiers))
1525+
self._test_identifier(tree.parameters.receiver_param.identifiers[0], "x")
1526+
self._test_identifier(tree.parameters.receiver_param.identifiers[1], "y")
1527+
self.assertEqual(2, len(tree.parameters.parameters))
1528+
param = tree.parameters.parameters[0]
1529+
self.assertIsInstance(param, jast.param)
1530+
self.assertEqual(1, len(param.modifiers))
1531+
self.assertIsInstance(param.modifiers[0], jast.Final)
1532+
self.assertIsInstance(param.type, jast.Int)
1533+
self.assertIsInstance(param.id, jast.variabledeclaratorid)
1534+
self._test_identifier(param.id.id, "a")
1535+
self.assertEqual(0, len(param.id.dims))
1536+
param = tree.parameters.parameters[1]
1537+
self.assertIsInstance(param, jast.arity)
1538+
self.assertEqual(1, len(param.modifiers))
1539+
self.assertIsInstance(param.modifiers[0], jast.Final)
1540+
self.assertIsInstance(param.type, jast.Int)
1541+
self.assertEqual(1, len(param.annotations))
1542+
self.assertIsInstance(param.annotations[0], jast.Annotation)
1543+
self.assertIsInstance(param.id, jast.variabledeclaratorid)
1544+
self._test_identifier(param.id.id, "b")
1545+
self.assertEqual(2, len(param.id.dims))
1546+
self.assertIsInstance(tree.body, jast.Block)
1547+
self.assertEqual(0, len(tree.body.body))
1548+
1549+
def test_params_no_receiver(self):
1550+
tree = jast.parse(
1551+
"int foo(int a, int ... b[][]) {}",
1552+
jast.ParseMode.DECL,
1553+
)
1554+
self.assertIsInstance(tree, jast.Method)
1555+
self.assertIsInstance(tree.return_type, jast.Int)
1556+
self.assertIsInstance(tree.parameters, jast.params)
1557+
self.assertIsNone(tree.parameters.receiver_param)
1558+
self.assertEqual(2, len(tree.parameters.parameters))
1559+
param = tree.parameters.parameters[0]
1560+
self.assertIsInstance(param, jast.param)
1561+
self.assertEqual(0, len(param.modifiers))
1562+
self.assertIsInstance(param.type, jast.Int)
1563+
self.assertIsInstance(param.id, jast.variabledeclaratorid)
1564+
self._test_identifier(param.id.id, "a")
1565+
self.assertEqual(0, len(param.id.dims))
1566+
param = tree.parameters.parameters[1]
1567+
self.assertIsInstance(param, jast.arity)
1568+
self.assertEqual(0, len(param.modifiers))
1569+
self.assertIsInstance(param.type, jast.Int)
1570+
self.assertEqual(0, len(param.annotations))
1571+
self.assertIsInstance(param.id, jast.variabledeclaratorid)
1572+
self._test_identifier(param.id.id, "b")
1573+
self.assertEqual(2, len(param.id.dims))
1574+
self.assertIsInstance(tree.body, jast.Block)
1575+
self.assertEqual(0, len(tree.body.body))

tests/test_unparse.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,3 +1383,52 @@ def test_Reference_class_type(self):
13831383
new=True,
13841384
)
13851385
self.assertEqual("X<int, boolean>::<int, float>new", jast.unparse(tree))
1386+
1387+
def test_arrayinit(self):
1388+
tree = jast.arrayinit(
1389+
values=[
1390+
jast.Constant(jast.IntLiteral(42)),
1391+
jast.Constant(jast.IntLiteral(24)),
1392+
]
1393+
)
1394+
self.assertEqual("{42, 24}", jast.unparse(tree))
1395+
1396+
def test_receiver(self):
1397+
tree = jast.receiver(
1398+
type=jast.Int(),
1399+
identifiers=[jast.identifier("foo"), jast.identifier("bar")],
1400+
)
1401+
self.assertEqual("int foo.bar.this", jast.unparse(tree))
1402+
1403+
def test_param(self):
1404+
param = jast.param(
1405+
modifiers=[jast.Final()],
1406+
type=jast.Int(),
1407+
id=jast.variabledeclaratorid(jast.identifier("bar")),
1408+
)
1409+
self.assertEqual("final int bar", jast.unparse(param))
1410+
1411+
def test_arity(self):
1412+
arity = jast.arity(
1413+
modifiers=[jast.Final()],
1414+
type=jast.Int(),
1415+
annotations=[jast.Annotation(jast.qname([jast.identifier("foo")]))],
1416+
id=jast.variabledeclaratorid(jast.identifier("bar")),
1417+
)
1418+
self.assertEqual("final int @foo ... bar", jast.unparse(arity))
1419+
1420+
def test_params(self):
1421+
params = jast.params(
1422+
receiver_param=jast.receiver(jast.Int()),
1423+
parameters=[
1424+
jast.param(
1425+
type=jast.Int(),
1426+
id=jast.variabledeclaratorid(jast.identifier("foo")),
1427+
),
1428+
jast.arity(
1429+
type=jast.Int(),
1430+
id=jast.variabledeclaratorid(jast.identifier("bar")),
1431+
),
1432+
],
1433+
)
1434+
self.assertEqual("int this, int foo, int ... bar", jast.unparse(params))

0 commit comments

Comments
 (0)