One of the expressions in the Java AST declaration is Expression::super()
.
For which Java expression(s) is super()
used?
Take this example class:
import java.util.ArrayList;
import java.util.List;
public class SuperTests<T> extends ArrayList<T> {
public SuperTests() {
super();
}
public SuperTests(int capacity) {
super(capacity);
}
@Override
public void clear() {
super.clear();
}
public <T extends Integer> void addSupers(List<? super T> list) {
}
}
The AST in rascal is:
compilationUnit(
[
import("java.util.ArrayList")[
@src=|project://TestThing/src/SuperTests.java|(0,27,<1,0>,<1,27>)
],
import("java.util.List")[
@src=|project://TestThing/src/SuperTests.java|(28,22,<2,0>,<2,22>)
]
],
[class(
"SuperTests",
[parameterizedType(simpleType(simpleName("ArrayList")[
@src=|project://TestThing/src/SuperTests.java|(87,9,<4,35>,<4,44>),
@decl=|java+class:///java/util/ArrayList|,
@typ=class(
|java+class:///java/util/ArrayList|,
[typeArgument(|java+typeVariable:///SuperTests/T|)])
]))],
[],
[
constructor(
"SuperTests",
[],
[],
block([constructorCall(
true,
[])[
@src=|project://TestThing/src/SuperTests.java|(128,8,<7,2>,<7,10>),
@decl=|java+constructor:///java/util/ArrayList/ArrayList()|
]])[
@src=|project://TestThing/src/SuperTests.java|(124,15,<6,21>,<8,2>)
])[
@modifiers=[public()],
@src=|project://TestThing/src/SuperTests.java|(104,35,<6,1>,<8,2>),
@decl=|java+constructor:///SuperTests/SuperTests()|,
@typ=constructor(
|java+constructor:///SuperTests/SuperTests()|,
[])
],
constructor(
"SuperTests",
[parameter(
int(),
"capacity",
0)[
@src=|project://TestThing/src/SuperTests.java|(159,12,<9,19>,<9,31>),
@decl=|java+parameter:///SuperTests/SuperTests(int)/capacity|,
@typ=int()
]],
[],
block([constructorCall(
true,
[simpleName("capacity")[
@src=|project://TestThing/src/SuperTests.java|(183,8,<10,8>,<10,16>),
@decl=|java+parameter:///SuperTests/SuperTests(int)/capacity|,
@typ=int()
]])[
@src=|project://TestThing/src/SuperTests.java|(177,16,<10,2>,<10,18>),
@decl=|java+constructor:///java/util/ArrayList/ArrayList(int)|
]])[
@src=|project://TestThing/src/SuperTests.java|(173,23,<9,33>,<11,2>)
])[
@modifiers=[public()],
@src=|project://TestThing/src/SuperTests.java|(141,55,<9,1>,<11,2>),
@decl=|java+constructor:///SuperTests/SuperTests(int)|,
@typ=constructor(
|java+constructor:///SuperTests/SuperTests(int)|,
[int()])
],
method(
void(),
"clear",
[],
[],
block([expressionStatement(methodCall(
true,
"clear",
[])[
@src=|project://TestThing/src/SuperTests.java|(234,13,<15,2>,<15,15>),
@decl=|java+method:///java/util/ArrayList/clear()|,
@typ=void()
])[
@src=|project://TestThing/src/SuperTests.java|(234,14,<15,2>,<15,16>)
]])[
@src=|project://TestThing/src/SuperTests.java|(230,21,<14,21>,<16,2>)
])[
@modifiers=[
annotation(markerAnnotation("Override")[
@src=|project://TestThing/src/SuperTests.java|(199,9,<13,1>,<13,10>),
@typ=interface(
|java+interface:///java/lang/Override|,
[])
]),
public()
],
@src=|project://TestThing/src/SuperTests.java|(199,52,<13,1>,<16,2>),
@decl=|java+method:///SuperTests/clear()|,
@typ=method(
|java+method:///SuperTests/clear()|,
[],
void(),
[])
],
method(
void(),
"addSupers",
[parameter(
parameterizedType(simpleType(simpleName("List")[
@src=|project://TestThing/src/SuperTests.java|(297,4,<18,43>,<18,47>),
@decl=|java+interface:///java/util/List|,
@typ=interface(
|java+interface:///java/util/List|,
[wildcard(super([typeArgument(|java+typeVariable:///SuperTests/addSupers(java/util/List)/T|)]))])
])),
"list",
0)[
@src=|project://TestThing/src/SuperTests.java|(297,20,<18,43>,<18,63>),
@decl=|java+parameter:///SuperTests/addSupers(java.util.List)/list|,
@typ=interface(
|java+interface:///java/util/List|,
[wildcard(super([typeArgument(|java+typeVariable:///SuperTests/addSupers(java/util/List)/T|)]))])
]],
[],
block([])[
@src=|project://TestThing/src/SuperTests.java|(319,7,<18,65>,<20,2>)
])[
@modifiers=[public()],
@src=|project://TestThing/src/SuperTests.java|(255,71,<18,1>,<20,2>),
@decl=|java+method:///SuperTests/addSupers(java.util.List)|,
@typ=method(
|java+method:///SuperTests/addSupers(java.util.List)|,
[typeParameter(
|java+typeVariable:///SuperTests/addSupers(java/util/List)/T|,
extends([class(
|java+class:///java/lang/Integer|,
[])]))],
void(),
[interface(
|java+interface:///java/util/List|,
[wildcard(super([typeArgument(|java+typeVariable:///SuperTests/addSupers(java/util/List)/T|)]))])])
]
])[
@modifiers=[public()],
@src=|project://TestThing/src/SuperTests.java|(52,278,<4,0>,<23,1>),
@decl=|java+class:///SuperTests|,
@typ=class(
|java+class:///SuperTests|,
[typeParameter(
|java+typeVariable:///SuperTests/T|,
unbounded())])
]])[
@src=|project://TestThing/src/SuperTests.java|(0,331,<1,0>,<23,2>),
@decl=|java+compilationUnit:///src/SuperTests.java|,
@messages=[
warning(
"The serializable class SuperTests does not declare a static final serialVersionUID field of type long",
|project://TestThing/src/SuperTests.java|(65,10,<4,0>,<4,0>)),
warning(
"The type parameter T is hiding the type T",
|project://TestThing/src/SuperTests.java|(263,1,<18,0>,<18,0>)),
warning(
"The type parameter T should not be bounded by the final type Integer. Final types cannot be further extended",
|project://TestThing/src/SuperTests.java|(273,7,<18,0>,<18,0>))
]
]
It does not contain the super()
constructor with no arguments. Only in case of the wildcard bound (wildcard(super(
) is there a super(_)
but it has one argument and is described in the lang::java::m3::TypeSymbol
module.
So what is happening, is there a Java construct I'm missing, or is the Rascal ADT definition incorrect with respect to what is generated in the AST?
It isn't used to represent any Java expression anymore. It is a part of the code before we decided to change how super constructor invocation and super method invocation are represented in the Java AST in Rascal.
All constructor calls are represented by
constructorCall(bool isSuper, _)
. A value of true in theisSuper
field indicates that it is a super call. Similarly, all method calls are represented bymethodCall(bool isSuper,_)
with the same logic.The
wildcard(_)
andsuper(_)
fromlang::java::m3::TypeSymbol
are used to represent type information that is used in ASTs as well as M3.