![]() |
|
Navigation |
Examples
rascal>import lang::java::m3::Core; ok rascal>import lang::java::jdt::m3::Core; ok rascal>import lang::java::jdt::m3::AST; okFirst extract our overview model rascal>myModel = createM3FromEclipseProject(|project://example-project|);
M3: m3(|project://example-project|)[
@annotations={
<|java+method:///Apple/edible()|,|java+interface:///java/lang/Override|>,
<|java+method:///Fruit/edible()|,|java+interface:///java/lang/Override|>
},
@typeDependency={
<|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,|java+class:///java/io/PrintStream|>,
<|java+method:///Apple/edible()|,|java+primitiveType:///boolean|>,
<|java+method:///Apple/edible()|,|java+interface:///java/lang/Override|>,
<|java+method:///Fruit/edible()|,|java+primitiveType:///boolean|>,
<|java+method:///Fruit/edible()|,|java+interface:///java/lang/Override|>,
<|java+parameter:///HelloWorld/main(java.lang.String%5B%5D)/args|,|java+array:///java/lang/String%5B%5D|>,
<|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,|java+class:///java/lang/System|>,
<|java+class:///Apple|,|java+class:///Fruit|>,
<|java+method:///IFruit/edible()|,|java+primitiveType:///boolean|>,
<|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,|java+primitiveType:///void|>,
<|java+parameter:///HelloWorld/main(java.lang.String%5B%5D)/args|,|java+class:///java/lang/String|>,
<|java+class:///Fruit|,|java+interface:///IFruit|>
},
@methodOverrides={
<|java+method:///Apple/edible()|,|java+method:///IFruit/edible()|>,
<|java+method:///Fruit/edible()|,|java+method:///IFruit/edible()|>,
<|java+method:///Apple/edible()|,|java+method:///Fruit/edible()|>
},
@names={
<"IFruit",|java+interface:///IFruit|>,
<"HelloWorld",|java+class:///HelloWorld|>,
<"args",|java+parameter:///HelloWorld/main(java.lang.String%5B%5D)/args|>,
<"edible",|java+method:///Fruit/edible()|>,
<"out",|java+field:///java/lang/System/out|>,
<"edible",|java+method:///Apple/edible()|>,
<"main",|java+method:///HelloWorld/main(java.lang.String%5B%5D)|>,
<"String",|java+class:///java/lang/String|>,
<"edible",|java+method:///IFruit/edible()|>,
<"println",|java+method:///java/io/PrintStream/println(java.lang.String)|>,
<"Override",|java+interface:///java/lang/Override|>,
<"System",|java+class:///java/lang/System|>,
<"Apple",|java+class:///Apple|>,
<"Fruit",|java+class:///Fruit|>
},
@implements={<|java+class:///Fruit|,|java+interface:///IFruit|>},
@methodInvocation={<|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,|java+method:///java/io/PrintStream/println(java.lang.String)|>},
@containment={
<|java+compilationUnit:///src/IFruit.java|,|java+interface:///IFruit|>,
<|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,|java+parameter:///HelloWorld/main(java.lang.String%5B%5D)/args|>,
<|java+class:///Fruit|,|java+method:///Fruit/edible()|>,
<|java+class:///HelloWorld|,|java+method:///HelloWorld/main(java.lang.String%5B%5D)|>,
<|java+compilationUnit:///src/Fruit.java|,|java+class:///Fruit|>,
<|java+compilationUnit:///src/HelloWorld.java|,|java+class:///HelloWorld|>,
<|java+class:///Apple|,|java+method:///Apple/edible()|>,
<|java+interface:///IFruit|,|java+method:///IFruit/edible()|>,
<|java+compilationUnit:///src/Apple.java|,|java+class:///Apple|>
},
@documentation={},
@modifiers={
<|java+interface:///IFruit|,public()>,
<|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,static()>,
<|java+class:///Fruit|,abstract()>,
<|java+method:///Apple/edible()|,public()>,
<|java+method:///Fruit/edible()|,public()>,
<|java+class:///Apple|,public()>,
<|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,public()>,
<|java+class:///HelloWorld|,public()>,
<|java+method:///Fruit/edible()|,abstract()>,
<|java+class:///Fruit|,public()>
},
@fieldAccess={<|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,|java+field:///java/lang/System/out|>},
@messages=[],
@uses={
<|project://example-project/src/Apple.java|(28,5,<2,27>,<2,32>),|java+class:///Fruit|>,
<|project://example-project/src/HelloWorld.java|(71,6,<4,2>,<4,8>),|java+class:///java/lang/System|>,
<|project://example-project/src/HelloWorld.java|(82,7,<4,13>,<4,20>),|java+method:///java/io/PrintStream/println(java.lang.String)|>,
<|project://example-project/src/Fruit.java|(51,8,<3,2>,<3,10>),|java+interface:///java/lang/Override|>,
<|project://example-project/src/Apple.java|(39,8,<4,2>,<4,10>),|java+interface:///java/lang/Override|>,
<|project://example-project/src/HelloWorld.java|(78,3,<4,9>,<4,12>),|java+field:///java/lang/System/out|>,
<|project://example-project/src/Fruit.java|(40,6,<2,39>,<2,45>),|java+interface:///IFruit|>,
<|project://example-project/src/HelloWorld.java|(52,6,<3,25>,<3,31>),|java+class:///java/lang/String|>
},
@types={
<|java+class:///HelloWorld|,class(
|java+class:///HelloWorld|,
[])>,
<|java+class:///Fruit|,class(
|java+class:///Fruit|,
[])>,
<|java+class:///Apple|,class(
|java+class:///Apple|,
[])>,
<|java+method:///IFruit/edible()|,method(
|java+method:///IFruit/edible()|,
[],
boolean(),
[])>,
<|java+parameter:///HelloWorld/main(java.lang.String%5B%5D)/args|,array(
class(
|java+class:///java/lang/String|,
[]),
1)>,
<|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,method(
|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,
[],
void(),
[array(
class(
|java+class:///java/lang/String|,
[]),
1)])>,
<|java+method:///Apple/edible()|,method(
|java+method:///Apple/edible()|,
[],
boolean(),
[])>,
<|java+method:///Fruit/edible()|,method(
|java+method:///Fruit/edible()|,
[],
boolean(),
[])>,
<|java+interface:///IFruit|,interface(
|java+interface:///IFruit|,
[])>
},
@extends={<|java+class:///Apple|,|java+class:///Fruit|>},
@declarations={
<|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,|project://example-project/src/HelloWorld.java|(28,82,<3,1>,<6,2>)>,
<|java+compilationUnit:///src/IFruit.java|,|project://example-project/src/IFruit.java|(0,48,<1,0>,<4,2>)>,
<|java+method:///Apple/edible()|,|project://example-project/src/Apple.java|(38,54,<4,1>,<7,2>)>,
<|java+parameter:///HelloWorld/main(java.lang.String%5B%5D)/args|,|project://example-project/src/HelloWorld.java|(52,13,<3,25>,<3,38>)>,
<|java+compilationUnit:///src/HelloWorld.java|,|project://example-project/src/HelloWorld.java|(0,113,<1,0>,<7,2>)>,
<|java+class:///HelloWorld|,|project://example-project/src/HelloWorld.java|(1,111,<2,0>,<7,1>)>,
<|java+compilationUnit:///src/Apple.java|,|project://example-project/src/Apple.java|(0,96,<1,0>,<9,2>)>,
<|java+class:///Apple|,|project://example-project/src/Apple.java|(1,94,<2,0>,<9,1>)>,
<|java+class:///Fruit|,|project://example-project/src/Fruit.java|(1,95,<2,0>,<5,1>)>,
<|java+interface:///IFruit|,|project://example-project/src/IFruit.java|(1,46,<2,0>,<4,1>)>,
<|java+compilationUnit:///src/Fruit.java|,|project://example-project/src/Fruit.java|(0,97,<1,0>,<5,2>)>,
<|java+method:///IFruit/edible()|,|project://example-project/src/IFruit.java|(28,17,<3,1>,<3,18>)>,
<|java+method:///Fruit/edible()|,|project://example-project/src/Fruit.java|(50,44,<3,1>,<4,34>)>
}
]
Now let's focus on the methods
rascal>myMethods = methods(myModel);
set[loc]: {
|java+method:///Apple/edible()|,
|java+method:///Fruit/edible()|,
|java+method:///IFruit/edible()|,
|java+method:///HelloWorld/main(java.lang.String%5B%5D)|
}
What is the source code for a method?
rascal>import IO; ok rascal>methodSrc = readFile(|java+method:///HelloWorld/main(java.lang.String%5B%5D)|); str: "public static void main(String[] args) {\n\t\tSystem.out.println(\"Hello World!\");\n\n\t}"let's print it: rascal>println(methodSrc)
public static void main(String[] args) {
System.out.println("Hello World!");
}
ok
how many words in this method?
rascal>(0 | it + 1 | /\W+/ := methodSrc)
int: 11
let's get its AST
rascal>methodAST = getMethodASTEclipse(|java+method:///HelloWorld/main(java.lang.String%5B%5D)|, model=myModel);
Declaration: method(
void(),
"main",
[parameter(
arrayType(simpleType(simpleName("String")[
@src=|project://example-project/src/HelloWorld.java|(52,6,<3,25>,<3,31>),
@decl=|java+class:///java/lang/String|,
@typ=class(
|java+class:///java/lang/String|,
[])
])),
"args",
0)[
@src=|project://example-project/src/HelloWorld.java|(52,13,<3,25>,<3,38>),
@decl=|java+parameter:///HelloWorld/main(java.lang.String%5B%5D)/args|,
@typ=array(
class(
|java+class:///java/lang/String|,
[]),
1)
]],
[],
block([expressionStatement(methodCall(
false,
qualifiedName(
simpleName("System")[
@src=|project://example-project/src/HelloWorld.java|(71,6,<4,2>,<4,8>),
@decl=|java+class:///java/lang/System|,
@typ=class(
|java+class:///java/lang/System|,
[])
],
simpleName("out")[
@src=|project://example-project/src/HelloWorld.java|(78,3,<4,9>,<4,12>),
@decl=|java+field:///java/lang/System/out|,
@typ=class(
|java+class:///java/io/PrintStream|,
[])
])[
@src=|project://example-project/src/HelloWorld.java|(71,10,<4,2>,<4,12>),
@decl=|java+field:///java/lang/System/out|,
@typ=class(
|java+class:///java/io/PrintStream|,
[])
],
"println",
[stringLiteral("\"Hello World!\"")[
@src=|project://example-project/src/HelloWorld.java|(90,14,<4,21>,<4,35>),
@typ=class(
|java+class:///java/lang/String|,
[])
]])[
@src=|project://example-project/src/HelloWorld.java|(71,34,<4,2>,<4,36>),
@decl=|java+method:///java/io/PrintStream/println(java.lang.String)|,
@typ=void()
])[
@src=|project://example-project/src/HelloWorld.java|(71,35,<4,2>,<4,37>)
]])[
@src=|project://example-project/src/HelloWorld.java|(67,43,<3,40>,<6,2>)
])[
@modifiers=[
public(),
static()
],
@src=|project://example-project/src/HelloWorld.java|(28,82,<3,1>,<6,2>),
@decl=|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,
@typ=method(
|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,
[],
void(),
[array(
class(
|java+class:///java/lang/String|,
[]),
1)])
]
Now we count the number of expressions:
rascal>(0 | it + 1 | /Expression _ := methodAST)
int: 6
or give us the locations of all expressions:
rascal>[m@src | /Expression m := methodAST]
list[loc]: [
|project://example-project/src/HelloWorld.java|(52,6,<3,25>,<3,31>),
|project://example-project/src/HelloWorld.java|(71,6,<4,2>,<4,8>),
|project://example-project/src/HelloWorld.java|(78,3,<4,9>,<4,12>),
|project://example-project/src/HelloWorld.java|(71,10,<4,2>,<4,12>),
|project://example-project/src/HelloWorld.java|(90,14,<4,21>,<4,35>),
|project://example-project/src/HelloWorld.java|(71,34,<4,2>,<4,36>)
]
the size should be the same, right?
rascal>import List; ok rascal>size([m@src | /Expression m := methodAST]) == (0 | it + 1 | /Expression _ := methodAST) bool: true ![]() |