为什么Rascal中的Java AST中的表达式为“super()”?

时间:2014-11-20 12:36:57

标签: abstract-syntax-tree rascal

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中生成的内容不一致?

1 个答案:

答案 0 :(得分:4)

它不再用于表示任何Java表达式。在我们决定改变Rascal中的Java AST中如何表示超级构造函数调用和超级方法调用之前,它是代码的一部分。

所有构造函数调用都由constructorCall(bool isSuper, _)表示。 isSuper字段中的值true表示它是超级呼叫。同样,所有方法调用都由methodCall(bool isSuper,_)表示,具有相同的逻辑。

来自wildcard(_)的{​​{1}}和super(_)用于表示AST和M3中使用的类型信息。