Skip to content

Commit e656f00

Browse files
committed
added tests for expressions up to switch and reconfigured coverage to exclude java parser
1 parent 17fd57d commit e656f00

File tree

8 files changed

+872
-23
lines changed

8 files changed

+872
-23
lines changed

.coveragerc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[run]
2+
omit = src/jast/_parser/Java*

src/jast/_jast.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1331,7 +1331,7 @@ def __init__(
13311331
def __iter__(self) -> Iterator[Tuple[str, JAST | List[JAST]]]:
13321332
if self.type_args:
13331333
yield "type_args", self.type_args
1334-
yield "jtype", self.type
1334+
yield "type", self.type
13351335
if self.template_args:
13361336
yield "template_args", self.template_args
13371337
if self.args:
@@ -1366,12 +1366,12 @@ def __init__(
13661366
"expr_dims and initializer are mutually exclusive for ArrayCreation"
13671367
)
13681368
self.type = type
1369-
self.expr_dims = expr_dims
1370-
self.dims = dims
1369+
self.expr_dims = expr_dims or []
1370+
self.dims = dims or []
13711371
self.initializer = initializer
13721372

13731373
def __iter__(self) -> Iterator[Tuple[str, JAST | List[JAST]]]:
1374-
yield "jtype", self.type
1374+
yield "type", self.type
13751375
if self.expr_dims:
13761376
yield "expr_dims", self.expr_dims
13771377
if self.dims:

src/jast/_parser/_convert.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ def visitArrayInitializer(
607607
self, ctx: JavaParser.ArrayInitializerContext
608608
) -> jast.arrayinit:
609609
return jast.arrayinit(
610-
initializers=[
610+
values=[
611611
self.visitVariableInitializer(variable_initializer)
612612
for variable_initializer in ctx.variableInitializer()
613613
],
@@ -1468,7 +1468,7 @@ def visitTypeExpression(self, ctx: JavaParser.TypeExpressionContext) -> jast.exp
14681468
type=jast.typebound(
14691469
types=[self.visitTypeType(typeType) for typeType in ctx.typeType()],
14701470
),
1471-
expression=self.visitTypeExpression(ctx.typeExpression()),
1471+
value=self.visitTypeExpression(ctx.typeExpression()),
14721472
**self._get_location_rule(ctx),
14731473
)
14741474

@@ -2129,7 +2129,11 @@ def visitExplicitGenericInvocationSuffix(
21292129
)
21302130

21312131
def visitArguments(self, ctx: JavaParser.ArgumentsContext) -> List[jast.expr]:
2132-
return self.visitExpressionList(ctx.expressionList())
2132+
return (
2133+
self.visitExpressionList(ctx.expressionList())
2134+
if ctx.expressionList()
2135+
else []
2136+
)
21332137

21342138
def visitDeclarationStart(
21352139
self, ctx: JavaParser.DeclarationStartContext

src/jast/_unparse.py

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,16 @@ def fill(self, text=""):
9191
self.write(" " * self._indent_spaces * self._indent)
9292
self.write(text)
9393

94-
def interleave(self, items, sep, end=""):
94+
def interleave(self, items, sep, start="", end=""):
9595
"""
9696
Interleave a list of items with a separator.
9797
:param items: The items to interleave.
9898
:param sep: The separator.
99+
:param start: A text to add at the start.
99100
:param end: A text to add at the end.
100101
"""
101102
if items:
103+
self.write(start)
102104
seq = iter(items)
103105
try:
104106
self.visit(next(seq))
@@ -344,21 +346,22 @@ def visit_variabledeclaratorid(self, node):
344346
self.traverse(node.dims)
345347

346348
def visit_typebound(self, node: jast.typebound):
347-
self.write(" extends ")
348349
self.traverse(node.annotations, end=" ")
349350
self.interleave(node.types, " & ")
350351

351352
def visit_typeparam(self, node: jast.typeparam):
352353
self.traverse(node.annotations, end=" ")
353354
self.visit_identifier(node.id)
354-
self.visit(node.bound)
355+
if node.bound:
356+
self.write(" extends ")
357+
self.visit(node.bound)
355358

356359
def visit_typeparams(self, node: jast.typeparams):
357360
with self.diamond():
358361
self.items_view(node.parameters)
359362

360363
def visit_pattern(self, node: jast.pattern):
361-
self.interleave(node.modifiers, " ", " ")
364+
self.interleave(node.modifiers, " ", end=" ")
362365
self.visit(node.type)
363366
self.write(" ")
364367
self.traverse(node.annotations, end=" ")
@@ -537,22 +540,26 @@ def visit_NewObject(self, node: jast.NewObject):
537540
self.write(")")
538541
if node.body:
539542
with self.delimit(" {", "}"):
540-
self.traverse(node.body)
543+
with self.block():
544+
self.traverse(node.body)
545+
self.fill()
541546

542547
def visit_NewArray(self, node: jast.NewArray):
543548
with self.require_parens(_Precedence.TYPE, node):
544549
self.write("new ")
545550
self.visit(node.type)
546-
self.traverse(node.expr_dims)
551+
self.interleave(node.expr_dims, "][", "[", "]")
547552
self.traverse(node.dims)
548553
if node.initializer:
549-
self.visit(node.initializer)
554+
self.write(" ")
555+
self.visit_arrayinit(node.initializer)
550556

551557
def visit_Cast(self, node: jast.Cast):
552558
with self.require_parens(_Precedence.TYPE, node):
553559
with self.parens():
554560
self.traverse(node.annotations, end=" ")
555561
self.visit(node.type)
562+
self.write(" ")
556563
self.set_precedence(_Precedence.TYPE, node.value)
557564
self.visit(node.value)
558565

@@ -646,13 +653,13 @@ def visit_receiver(self, node: jast.receiver):
646653
self.write("this")
647654

648655
def visit_param(self, node: jast.param):
649-
self.interleave(node.modifiers, " ", " ")
656+
self.interleave(node.modifiers, " ", end=" ")
650657
self.visit(node.type)
651658
self.write(" ")
652659
self.visit_variabledeclaratorid(node.id)
653660

654661
def visit_arity(self, node: jast.arity):
655-
self.interleave(node.modifiers, " ", " ")
662+
self.interleave(node.modifiers, " ", end=" ")
656663
self.visit(node.type)
657664
self.write(" ")
658665
self.traverse(node.annotations, end=" ")
@@ -673,7 +680,7 @@ def visit_LocalRecord(self, node: jast.LocalRecord):
673680

674681
def visit_LocalVariable(self, node: jast.LocalVariable):
675682
self.fill()
676-
self.interleave(node.modifiers, " ", " ")
683+
self.interleave(node.modifiers, " ", end=" ")
677684
self.visit(node.type)
678685
self.write(" ")
679686
self.items_view(node.declarators)
@@ -834,7 +841,7 @@ def visit_Module(self, node: jast.Module):
834841

835842
def visit_Field(self, node: jast.Field):
836843
self.fill()
837-
self.interleave(node.modifiers, " ", " ")
844+
self.interleave(node.modifiers, " ", end=" ")
838845
self.visit(node.type)
839846
self.write(" ")
840847
self.items_view(node.declarators)
@@ -843,7 +850,7 @@ def visit_Field(self, node: jast.Field):
843850
def visit_Method(self, node: jast.Method):
844851
self.fill()
845852
self.fill()
846-
self.interleave(node.modifiers, " ", " ")
853+
self.interleave(node.modifiers, " ", end=" ")
847854
self.visit(node.return_type)
848855
self.write(" ")
849856
self.visit_identifier(node.id)
@@ -862,7 +869,7 @@ def visit_Method(self, node: jast.Method):
862869
def visit_Class(self, node: jast.Class):
863870
self.fill()
864871
self.fill()
865-
self.interleave(node.modifiers, " ", " ")
872+
self.interleave(node.modifiers, " ", end=" ")
866873
self.write("class ")
867874
self.visit_identifier(node.id)
868875
self.visit(node.type_params)

tests/test_jast.py

Lines changed: 185 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def _test_iteration(self, tree):
99
for field, value in tree:
1010
self.assertIsInstance(field, str)
1111
self.assertIsInstance(value, jast.JAST | List)
12-
self.assertTrue(hasattr(tree, field))
12+
self.assertTrue(hasattr(tree, field), f"{field} not in {tree.__class__}")
1313
self.assertEqual(getattr(tree, field), value)
1414

1515
def test_identifier(self):
@@ -863,3 +863,187 @@ def test_BinOp_error(self):
863863
left=jast.Constant(jast.IntLiteral(42)),
864864
right=jast.Constant(jast.IntLiteral(0)),
865865
)
866+
867+
def test_InstanceOf(self):
868+
instance_of = jast.InstanceOf(
869+
value=jast.identifier("foo"),
870+
type=jast.Int(),
871+
)
872+
self.assertIsInstance(instance_of, jast.InstanceOf)
873+
self.assertIsInstance(instance_of, jast.JAST)
874+
self.assertIsInstance(instance_of.value, jast.identifier)
875+
self.assertEqual("foo", instance_of.value)
876+
self.assertIsInstance(instance_of.type, jast.Int)
877+
self._test_iteration(instance_of)
878+
879+
def test_InstanceOf_error(self):
880+
self.assertRaises(
881+
ValueError,
882+
jast.InstanceOf,
883+
type=jast.Int(),
884+
)
885+
self.assertRaises(
886+
ValueError,
887+
jast.InstanceOf,
888+
value=jast.identifier("foo"),
889+
)
890+
891+
def test_UnaryOp(self):
892+
unary_op = jast.UnaryOp(
893+
op=jast.USub(),
894+
operand=jast.Constant(jast.IntLiteral(42)),
895+
)
896+
self.assertIsInstance(unary_op, jast.UnaryOp)
897+
self.assertIsInstance(unary_op, jast.JAST)
898+
self.assertIsInstance(unary_op.op, jast.USub)
899+
self.assertIsInstance(unary_op.operand, jast.Constant)
900+
self.assertIsInstance(unary_op.operand.value, jast.IntLiteral)
901+
self.assertEqual(42, unary_op.operand.value)
902+
self._test_iteration(unary_op)
903+
904+
def test_UnaryOp_error(self):
905+
self.assertRaises(
906+
ValueError,
907+
jast.UnaryOp,
908+
operand=jast.Constant(jast.IntLiteral(42)),
909+
)
910+
self.assertRaises(
911+
ValueError,
912+
jast.UnaryOp,
913+
op=jast.USub(),
914+
)
915+
916+
def test_PostOp(self):
917+
post_op = jast.PostOp(
918+
operand=jast.identifier("foo"),
919+
op=jast.PostInc(),
920+
)
921+
self.assertIsInstance(post_op, jast.PostOp)
922+
self.assertIsInstance(post_op, jast.JAST)
923+
self.assertIsInstance(post_op.operand, jast.identifier)
924+
self.assertEqual("foo", post_op.operand)
925+
self.assertIsInstance(post_op.op, jast.PostInc)
926+
self._test_iteration(post_op)
927+
928+
def test_PostOp_error(self):
929+
self.assertRaises(
930+
ValueError,
931+
jast.PostOp,
932+
op=jast.PostInc(),
933+
)
934+
self.assertRaises(
935+
ValueError,
936+
jast.PostOp,
937+
operand=jast.identifier("foo"),
938+
)
939+
940+
def test_Cast(self):
941+
cast = jast.Cast(
942+
annotations=[jast.Annotation(jast.qname([jast.identifier("foo")]))],
943+
type=jast.Int(),
944+
value=jast.Constant(jast.IntLiteral(42)),
945+
)
946+
self.assertIsInstance(cast, jast.Cast)
947+
self.assertIsInstance(cast, jast.JAST)
948+
self.assertEqual(1, len(cast.annotations))
949+
self.assertIsInstance(cast.annotations[0], jast.Annotation)
950+
self.assertIsInstance(cast.type, jast.Int)
951+
self.assertIsInstance(cast.value, jast.Constant)
952+
self.assertIsInstance(cast.value.value, jast.IntLiteral)
953+
self.assertEqual(42, cast.value.value)
954+
self._test_iteration(cast)
955+
956+
def test_Cast_error(self):
957+
self.assertRaises(
958+
ValueError,
959+
jast.Cast,
960+
value=jast.Constant(jast.IntLiteral(42)),
961+
)
962+
self.assertRaises(
963+
ValueError,
964+
jast.Cast,
965+
type=jast.Int(),
966+
)
967+
968+
def test_NewObject(self):
969+
new_object = jast.NewObject(
970+
type_args=jast.typeargs([jast.Int(), jast.Boolean()]),
971+
type=jast.Coit(id=jast.identifier("A")),
972+
args=[jast.Constant(jast.IntLiteral(42))],
973+
body=[jast.EmptyDecl()],
974+
)
975+
self.assertIsInstance(new_object, jast.NewObject)
976+
self.assertIsInstance(new_object, jast.JAST)
977+
self.assertIsInstance(new_object.type_args, jast.typeargs)
978+
self.assertEqual(2, len(new_object.type_args.types))
979+
self.assertIsInstance(new_object.type_args.types[0], jast.Int)
980+
self.assertIsInstance(new_object.type_args.types[1], jast.Boolean)
981+
self.assertIsInstance(new_object.type, jast.Coit)
982+
self.assertEqual("A", new_object.type.id)
983+
self.assertEqual(1, len(new_object.args))
984+
self.assertIsInstance(new_object.args[0], jast.Constant)
985+
self.assertIsInstance(new_object.args[0].value, jast.IntLiteral)
986+
self.assertEqual(42, new_object.args[0].value)
987+
self.assertEqual(1, len(new_object.body))
988+
self.assertIsInstance(new_object.body[0], jast.EmptyDecl)
989+
self._test_iteration(new_object)
990+
991+
def test_NewObject_error(self):
992+
self.assertRaises(
993+
ValueError,
994+
jast.NewObject,
995+
type_args=jast.typeargs([jast.Int(), jast.Boolean()]),
996+
args=[jast.Constant(jast.IntLiteral(42))],
997+
body=[jast.EmptyDecl()],
998+
)
999+
1000+
def test_NewArray(self):
1001+
new_array = jast.NewArray(
1002+
type=jast.Int(),
1003+
expr_dims=[jast.Constant(jast.IntLiteral(1))],
1004+
dims=[jast.dim(), jast.dim()],
1005+
)
1006+
self.assertIsInstance(new_array, jast.NewArray)
1007+
self.assertIsInstance(new_array, jast.JAST)
1008+
self.assertIsInstance(new_array.type, jast.Int)
1009+
self.assertEqual(1, len(new_array.expr_dims))
1010+
expr_dim = new_array.expr_dims[0]
1011+
self.assertIsInstance(expr_dim, jast.Constant)
1012+
self.assertIsInstance(expr_dim.value, jast.IntLiteral)
1013+
self.assertEqual(1, expr_dim.value)
1014+
self.assertEqual(2, len(new_array.dims))
1015+
self.assertIsInstance(new_array.dims[0], jast.dim)
1016+
self.assertIsInstance(new_array.dims[1], jast.dim)
1017+
self._test_iteration(new_array)
1018+
1019+
def test_NewArray_initializer(self):
1020+
new_array = jast.NewArray(
1021+
type=jast.Int(),
1022+
dims=[jast.dim()],
1023+
initializer=jast.arrayinit(values=[jast.Constant(jast.IntLiteral(1))]),
1024+
)
1025+
self.assertIsInstance(new_array, jast.NewArray)
1026+
self.assertIsInstance(new_array, jast.JAST)
1027+
self.assertIsInstance(new_array.type, jast.Int)
1028+
self.assertEqual(1, len(new_array.dims))
1029+
self.assertIsInstance(new_array.dims[0], jast.dim)
1030+
self.assertIsInstance(new_array.initializer, jast.arrayinit)
1031+
self.assertEqual(1, len(new_array.initializer.values))
1032+
self.assertIsInstance(new_array.initializer.values[0], jast.Constant)
1033+
self.assertIsInstance(new_array.initializer.values[0].value, jast.IntLiteral)
1034+
self.assertEqual(1, new_array.initializer.values[0].value)
1035+
self._test_iteration(new_array)
1036+
1037+
def test_NewArray_error(self):
1038+
self.assertRaises(
1039+
ValueError,
1040+
jast.NewArray,
1041+
dims=[jast.dim()],
1042+
)
1043+
self.assertRaises(
1044+
ValueError,
1045+
jast.NewArray,
1046+
type=jast.Int(),
1047+
expr_dims=[jast.Constant(jast.IntLiteral(1))],
1048+
initializer=jast.arrayinit(values=[jast.Constant(jast.IntLiteral(1))]),
1049+
)

0 commit comments

Comments
 (0)