Java AST 宣言の式の 1 つに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) {
}
}
rascal の 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(_)
引数は 1 つあり、lang::java::m3::TypeSymbol
モジュールに記述されています。
では、何が起こっているのでしょうか、欠落している Java コンストラクトがありますか、または AST で生成されたものに関して、Rascal ADT 定義が正しくありませんか?