Why is the "super ()" expression in Java AST in Rascal?

One of the expressions in the Java AST declaration is Expression::super()

. What expression (s) is Java used for super()

?

Let's 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) {

    }
}

      

AST at the villain:

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 a super()

no-argument constructor . Only in the case of template binding ( wildcard(super(

) is super(_)

, but it has one argument and is described in the module lang::java::m3::TypeSymbol

.

So what is going on, is there a Java constructor that I am missing, or is the Rascal ADT misdefined as to what is generated in the AST?

+3


source to share


1 answer


It is no longer used to represent any Java expression. This is part of the code before we decided to change how superconstructor invocation and supermethod invocation are represented in Java AST in Rascal.

All constructor calls are presented constructorCall(bool isSuper, _)

. A value of true in the field isSuper

indicates that this is a supercall. Likewise, all method calls are represented methodCall(bool isSuper,_)

with the same logic.



wildcard(_)

and super(_)

from lang::java::m3::TypeSymbol

are used to represent the type information that is used in AST as well as for M3.

+4


source







All Articles