Java AST declaration中的一个表达式是Expression::super()
。
对于哪个Java表达式使用super()
?
拿这个例子类:
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) {
}
}
流氓中的AST是:
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>))
]
]
它不包含没有参数的super()
构造函数。只有在通配符绑定(wildcard(super(
)的情况下才有super(_)
,但它有一个参数,并在lang::java::m3::TypeSymbol
模块中进行了描述。
那么发生了什么,是否存在我缺少的Java构造,或者Ras的ADT定义是否与AST中生成的内容不一致?
答案 0 :(得分:4)
它不再用于表示任何Java表达式。在我们决定改变Rascal中的Java AST中如何表示超级构造函数调用和超级方法调用之前,它是代码的一部分。
所有构造函数调用都由constructorCall(bool isSuper, _)
表示。 isSuper
字段中的值true表示它是超级呼叫。同样,所有方法调用都由methodCall(bool isSuper,_)
表示,具有相同的逻辑。
来自wildcard(_)
的{{1}}和super(_)
用于表示AST和M3中使用的类型信息。