【发布时间】:2015-01-18 07:50:54
【问题描述】:
Java AST declaration 中的一个表达式是Expression::super()。
super() 用于哪个 Java 表达式?
以这个类为例:
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 构造,或者 Rascal ADT 的定义是否与 AST 中生成的内容不正确?
【问题讨论】:
-
这和流氓有什么关系?您需要能够隔离您的问题,否则您也会发现所涉及的气候。
-
这个问题是关于 Rascal 语言中的 Java AST 声明的。对于 Rascal 中的 Java AST 节点,请参见:tutor.rascal-mpl.org/Rascal/Libraries/lang/java/m3/AST/…>。出于这个原因,这主要是一个流氓问题。它是关于 Rascal 如何进行 Java 源代码分析的。
-
@caytekin 我认为,如果您列出您已经看过的 java 的构造,人们的攻击性会降低。更多上下文见此评论:stackoverflow.com/questions/21112464/…
标签: abstract-syntax-tree rascal