Compare commits
8 Commits
unify-Part
...
ohneMaven
Author | SHA1 | Date | |
---|---|---|---|
|
ed5cdd58d9 | ||
|
93a97984b5 | ||
|
4b2a6f99bc | ||
|
72b5b01990 | ||
|
a5800382c2 | ||
|
a019eab6b2 | ||
|
611dc4b36b | ||
|
0830458ee2 |
4
.gitignore
vendored
@@ -7,7 +7,6 @@ bin
|
|||||||
.mtj.tmp/
|
.mtj.tmp/
|
||||||
|
|
||||||
# Package Files #
|
# Package Files #
|
||||||
*.jar
|
|
||||||
*.war
|
*.war
|
||||||
*.ear
|
*.ear
|
||||||
|
|
||||||
@@ -19,7 +18,4 @@ bin
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
.project
|
.project
|
||||||
.settings/
|
.settings/
|
||||||
/target/
|
|
||||||
|
|
||||||
#
|
|
||||||
manually/
|
|
||||||
|
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "reflections"]
|
||||||
|
path = reflections
|
||||||
|
url = ./reflections
|
@@ -1,88 +0,0 @@
|
|||||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
|
||||||
<html> <head>
|
|
||||||
<title>Java-TX Plugin</title></head>
|
|
||||||
<center>
|
|
||||||
<h1>Java-TX Plugin</h1>
|
|
||||||
</center>
|
|
||||||
<h2>Content</h2>
|
|
||||||
<ul>
|
|
||||||
<li><h4><a href="#introduction">Introduction</a></h4></li>
|
|
||||||
<li><h4><a href="newJavaTXProject/newJavaTXProject.html" >New Java-TX project</a></h4></li>
|
|
||||||
<li><h4><a href=" JavaTXExamples.zip" >Example project</a></h4></li>
|
|
||||||
<li><a href="usePlugin/usePlugin.html" >Using the plugin</a></li>
|
|
||||||
<li><h4><a href="install/install.html" >Installation</a></h4>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<br/>
|
|
||||||
<h2 id="introduction">Introduction</h2>
|
|
||||||
Java-TX (Java Type eXtended) is an extension of Java in which a global type inference algorithm and real function types are added. Since the end of the nineties features from functional program- ming languages have been transferred to Java. Parametric polymorphism extended by wildcards, called generics, were transfered to Java 5.0. Higher-order functions and lambda expression were introduced in Java 8. Java 8 uses functional interfaces as target types of lambda expressions in contrast to real function types as in functional programming languages.
|
|
||||||
The powerful feature type inference from functional programming languages is incorporated into Java, as into other object-oriented
|
|
||||||
languages, i.e. only in a restricted way called local type inference. Local type inference allows certain type annotations to be omitted. For instance, it is often not necessary to specify the type of a variable. Type parameters of classes in the new-statement can be left out. Return types of methods can often also be omitted. Local type inference is at its most pronounced in Scala. In Java 10 an extention of local type inference is introduced, where types of local variables can be replaced by the keyword var and inferred automatically during the compilation. In contrast to global type inference, local type inference allows types of recursive methods and lambda expressions not to be omitted.<br>
|
|
||||||
The Java-TX project contributes to the design of object-oriented languages by developing global type inference algorithms for Java-like languages.
|
|
||||||
|
|
||||||
<h3>First Example</h3>
|
|
||||||
The class <tt>Id</tt> has the method <tt>id</tt>. The type annotations are omitted.
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<pre> <code class="language-java">
|
|
||||||
class Id {
|
|
||||||
id(x) {
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</code> </pre>
|
|
||||||
The type inference algorithm inferrs the types, such that <tt>Id</tt> can be applied:
|
|
||||||
<pre>
|
|
||||||
new Id().id(1);
|
|
||||||
|
|
||||||
new Id().id("hallo");
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<h3>More complex example</h3>
|
|
||||||
<pre>
|
|
||||||
import java.lang.Integer;
|
|
||||||
import java.lang.Double;
|
|
||||||
import java.lang.String;
|
|
||||||
|
|
||||||
|
|
||||||
class OL {
|
|
||||||
m(x) { return x + x; }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class OLMain {
|
|
||||||
main(x) {
|
|
||||||
var ol;
|
|
||||||
ol = new OL();
|
|
||||||
return ol.m(x);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
The type inference mechanism considers only imported types. Therefore <tt>Integer</tt> <tt>Double</tt>, and <tt>String</tt> are imported.
|
|
||||||
<br/>
|
|
||||||
As the operator <tt>+</tt> is overloaded by all numeric types and String the methods <tt>m</tt> in the class <tt>OL</tt> and <tt>main</tt> in the class <tt>OLMain</tt>, respectively, gets all these types. The generated classfile demonstrates this:
|
|
||||||
<pre>
|
|
||||||
> javap OL.class
|
|
||||||
Compiled from "OL.jav"
|
|
||||||
class OL {
|
|
||||||
public OL();
|
|
||||||
public java.lang.Integer m(java.lang.Integer);
|
|
||||||
public java.lang.Double m(java.lang.Double);
|
|
||||||
}
|
|
||||||
|
|
||||||
> javap OLMain.class
|
|
||||||
Compiled from "OLMain.jav"
|
|
||||||
class OLMain {
|
|
||||||
public OLMain();
|
|
||||||
public java.lang.Integer main(java.lang.Integer);
|
|
||||||
public java.lang.Double main(java.lang.Double);
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<address></address>
|
|
||||||
<!-- hhmts start -->Last modified: Fri Jun 1 16:43:55 CEST 2018 <!-- hhmts end -->
|
|
||||||
</body> </html>
|
|
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 109 KiB |
@@ -1,40 +0,0 @@
|
|||||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
|
||||||
<html> <head>
|
|
||||||
<title>Install Java-TX Plugin</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<h1>Install Java-TX Plugin</h1>
|
|
||||||
<ol>
|
|
||||||
<li>Select "Install New Software ..."<br>
|
|
||||||
<img width= 400 src="newsoftware.png" >
|
|
||||||
|
|
||||||
</li>
|
|
||||||
<li>Add ...<br>
|
|
||||||
<img width=550 src="availableSoftware1.png" >
|
|
||||||
</li>
|
|
||||||
<li>Insert address<br>
|
|
||||||
<img width=550 src="availableSoftware2.png" >
|
|
||||||
</li>
|
|
||||||
<li>Select installation<br>
|
|
||||||
<img width=550 src="selectInstallation.png" >
|
|
||||||
</li>
|
|
||||||
<li>Installation details<br>
|
|
||||||
<img width=550 src="installationDetails.png" >
|
|
||||||
</li>
|
|
||||||
<li>Accept license agreement<br>
|
|
||||||
<img width=550 src="licenseAgreement.png" >
|
|
||||||
</li>
|
|
||||||
<li>Install anyway<br>
|
|
||||||
<img width=450 src="installAnyway.png">
|
|
||||||
</li>
|
|
||||||
<li>Restart<br>
|
|
||||||
<img width=450 src="Restart.png">
|
|
||||||
</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<address></address>
|
|
||||||
<!-- hhmts start -->Last modified: Fri Jun 1 11:57:15 CEST 2018 <!-- hhmts end -->
|
|
||||||
</body> </html>
|
|
@@ -1,40 +0,0 @@
|
|||||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
|
||||||
<html> <head>
|
|
||||||
<title>Install Java-TX Plugin</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<h2>Install Java-TX Plugin</h2>
|
|
||||||
<ol>
|
|
||||||
<li>Select "Install New Software ..."<br>
|
|
||||||
<img width= 400 src="newsoftware.png" >
|
|
||||||
|
|
||||||
</li>
|
|
||||||
<li>Add ...<br>
|
|
||||||
<img width=550 src="availableSoftware1.png" >
|
|
||||||
</li>
|
|
||||||
<li>Insert address<br>
|
|
||||||
<img width=550 src="availableSoftware2.png" >
|
|
||||||
</li>
|
|
||||||
<li>Select installation<br>
|
|
||||||
<img width=550 src="selectInstallation.png" >
|
|
||||||
</li>
|
|
||||||
<li>Installation details<br>
|
|
||||||
<img width=550 src="installationDetails.png" >
|
|
||||||
</li>
|
|
||||||
<li>Accept license agreement<br>
|
|
||||||
<img width=550 src="licenseAgreement.png" >
|
|
||||||
</li>
|
|
||||||
<li>Install anyway<br>
|
|
||||||
<img width=450 src="installAnyway.png">
|
|
||||||
</li>
|
|
||||||
<li>Restart<br>
|
|
||||||
<img width=450 src="Restart.png">
|
|
||||||
</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<address></address>
|
|
||||||
<!-- hhmts start -->Last modified: Fri Jun 1 12:05:43 CEST 2018 <!-- hhmts end -->
|
|
||||||
</body> </html>
|
|
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 52 KiB |
Before Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 96 KiB |
Before Width: | Height: | Size: 93 KiB |
Before Width: | Height: | Size: 163 KiB |
Before Width: | Height: | Size: 163 KiB |
Before Width: | Height: | Size: 88 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 96 KiB |
Before Width: | Height: | Size: 102 KiB |
Before Width: | Height: | Size: 100 KiB |
Before Width: | Height: | Size: 76 KiB |
@@ -1,34 +0,0 @@
|
|||||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
|
||||||
<html> <head>
|
|
||||||
<title></title>
|
|
||||||
</head>
|
|
||||||
<h2>New Java-TX project in eclipse</h2>
|
|
||||||
<ol>
|
|
||||||
<li>New -> Java Project<br/>
|
|
||||||
<img width= 400 src="newJavaTXProject.png" >
|
|
||||||
</li>
|
|
||||||
<br/>
|
|
||||||
<li>Generate a jav-File folder<br/>
|
|
||||||
<img width= 550 src="newJavFolder1.png" ><br/><br/>
|
|
||||||
<img width= 550 src="newJavFolder2.png" >
|
|
||||||
</li>
|
|
||||||
<br/>
|
|
||||||
<li>Add jav-File folder as library<br/>
|
|
||||||
At the moment no package system is implemented, Therefore the compiled class files are in the jav-File folder. This has to be added as library:<br/>
|
|
||||||
<img width= 550 src="buildPath1.png" ><br/><br/>
|
|
||||||
<img width= 550 src="buildPath2.png" ><br/><br/>
|
|
||||||
<img width= 400 src="buildPath3.png" ><br/><br/>
|
|
||||||
<img width= 550 src="buildPath4.png" ><br/>
|
|
||||||
|
|
||||||
|
|
||||||
</li>
|
|
||||||
</ol>
|
|
||||||
<body>
|
|
||||||
<h1></h1>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<address></address>
|
|
||||||
<!-- hhmts start -->Last modified: Fri Jun 1 16:50:02 CEST 2018 <!-- hhmts end -->
|
|
||||||
</body> </html>
|
|
Before Width: | Height: | Size: 150 KiB |
@@ -1,24 +0,0 @@
|
|||||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
|
||||||
<html> <head>
|
|
||||||
<title>Using the plugin</title>
|
|
||||||
</head>
|
|
||||||
<h2>Using the plugin</h2>
|
|
||||||
<ol>
|
|
||||||
<li>Overview<br/>
|
|
||||||
<img width=800 src="usePlugin1.png" >
|
|
||||||
</li>
|
|
||||||
<br/>
|
|
||||||
<li>Select types<br/>
|
|
||||||
If the method is overloaded the user can select types in the outline the right mouse button:<br/><br/>
|
|
||||||
<img src="usePlugin2.png" ><br/>
|
|
||||||
</li>
|
|
||||||
</ol>
|
|
||||||
<body>
|
|
||||||
<h1></h1>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<address></address>
|
|
||||||
<!-- hhmts start -->Last modified: Fri Jun 1 16:51:28 CEST 2018 <!-- hhmts end -->
|
|
||||||
</body> </html>
|
|
Before Width: | Height: | Size: 112 KiB |
Before Width: | Height: | Size: 33 KiB |
@@ -112,7 +112,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Literal</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.literal.Literal</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.literal.BoolLiteral</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.literal.BoolLiteral</li>
|
||||||
@@ -253,7 +253,7 @@ extends <a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html"
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<ul class="blockList">
|
<ul class="blockList">
|
||||||
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.Literal">
|
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.literal.Literal">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
</a>
|
</a>
|
||||||
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
||||||
|
@@ -112,7 +112,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Literal</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.literal.Literal</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.literal.CharLiteral</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.literal.CharLiteral</li>
|
||||||
@@ -253,7 +253,7 @@ extends <a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html"
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<ul class="blockList">
|
<ul class="blockList">
|
||||||
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.Literal">
|
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.literal.Literal">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
</a>
|
</a>
|
||||||
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
||||||
|
@@ -112,7 +112,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Literal</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.literal.Literal</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.literal.DoubleLiteral</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.literal.DoubleLiteral</li>
|
||||||
@@ -263,7 +263,7 @@ extends <a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html"
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<ul class="blockList">
|
<ul class="blockList">
|
||||||
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.Literal">
|
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.literal.Literal">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
</a>
|
</a>
|
||||||
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
||||||
|
@@ -112,7 +112,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Literal</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.literal.Literal</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.literal.FloatLiteral</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.literal.FloatLiteral</li>
|
||||||
@@ -263,7 +263,7 @@ extends <a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html"
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<ul class="blockList">
|
<ul class="blockList">
|
||||||
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.Literal">
|
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.literal.Literal">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
</a>
|
</a>
|
||||||
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
||||||
|
@@ -112,7 +112,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Literal</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.literal.Literal</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.literal.NumberLiteral</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.literal.NumberLiteral</li>
|
||||||
@@ -263,7 +263,7 @@ extends <a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html"
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<ul class="blockList">
|
<ul class="blockList">
|
||||||
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.Literal">
|
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.literal.Literal">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
</a>
|
</a>
|
||||||
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
||||||
|
@@ -112,7 +112,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.Literal</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.literal.Literal</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@@ -112,7 +112,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Literal</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.literal.Literal</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.LongLiteral</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.LongLiteral</li>
|
||||||
@@ -263,7 +263,7 @@ extends <a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html"
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<ul class="blockList">
|
<ul class="blockList">
|
||||||
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.Literal">
|
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.literal.Literal">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
</a>
|
</a>
|
||||||
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
||||||
|
@@ -115,7 +115,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/UnaryExpr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.UnaryExpr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/UnaryExpr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.UnaryExpr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.javaInternal.NegativeExpr</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.NegativeExpr</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@@ -115,7 +115,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/UnaryExpr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.UnaryExpr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/UnaryExpr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.UnaryExpr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.javaInternal.NotExpr</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.NotExpr</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@@ -112,7 +112,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Literal</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.literal.Literal</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.literal.Null</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.literal.Null</li>
|
||||||
@@ -245,7 +245,7 @@ extends <a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html"
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<ul class="blockList">
|
<ul class="blockList">
|
||||||
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.Literal">
|
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.literal.Literal">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
</a>
|
</a>
|
||||||
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
||||||
|
@@ -115,7 +115,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/UnaryExpr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.UnaryExpr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/UnaryExpr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.UnaryExpr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.javaInternal.PositivExpr</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.PositivExpr</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@@ -115,7 +115,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/UnaryExpr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.UnaryExpr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/UnaryExpr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.UnaryExpr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.javaInternal.PostDecExpr</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.PostDecExpr</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@@ -115,7 +115,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/UnaryExpr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.UnaryExpr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/UnaryExpr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.UnaryExpr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.javaInternal.PostIncExpr</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.PostIncExpr</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@@ -115,7 +115,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/UnaryExpr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.UnaryExpr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/UnaryExpr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.UnaryExpr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.javaInternal.PreDecExpr</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.PreDecExpr</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@@ -115,7 +115,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/UnaryExpr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.UnaryExpr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/UnaryExpr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.UnaryExpr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.javaInternal.PreIncExpr</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.PreIncExpr</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@@ -112,7 +112,7 @@ var activeTableTab = "activeTableTab";
|
|||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Expr.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Expr</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.Literal</a></li>
|
<li><a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">de.dhbwstuttgart.syntaxtree.statement.literal.Literal</a></li>
|
||||||
<li>
|
<li>
|
||||||
<ul class="inheritance">
|
<ul class="inheritance">
|
||||||
<li>de.dhbwstuttgart.syntaxtree.statement.literal.StringLiteral</li>
|
<li>de.dhbwstuttgart.syntaxtree.statement.literal.StringLiteral</li>
|
||||||
@@ -253,7 +253,7 @@ extends <a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html"
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<ul class="blockList">
|
<ul class="blockList">
|
||||||
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.Literal">
|
<li class="blockList"><a name="methods.inherited.from.class.de.dhbwstuttgart.syntaxtree.statement.literal.Literal">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
</a>
|
</a>
|
||||||
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
<h3>Methods inherited from class de.dhbwstuttgart.syntaxtree.statement.<a href="../../../../de/dhbwstuttgart/syntaxtree/statement/Literal.html" title="class in de.dhbwstuttgart.syntaxtree.statement">Literal</a></h3>
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
||||||
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.Literal</title>
|
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.literal.Literal</title>
|
||||||
<meta name="date" content="2015-05-12">
|
<meta name="date" content="2015-05-12">
|
||||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||||
<script type="text/javascript" src="../../../../../script.js"></script>
|
<script type="text/javascript" src="../../../../../script.js"></script>
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
</a></div>
|
</a></div>
|
||||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.Literal" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.Literal</h2>
|
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.literal.Literal" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.Literal</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="classUseContainer">
|
<div class="classUseContainer">
|
||||||
<ul class="blockList">
|
<ul class="blockList">
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
||||||
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.javaInternal.NegativeExpr</title>
|
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.NegativeExpr</title>
|
||||||
<meta name="date" content="2015-05-12">
|
<meta name="date" content="2015-05-12">
|
||||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||||
<script type="text/javascript" src="../../../../../script.js"></script>
|
<script type="text/javascript" src="../../../../../script.js"></script>
|
||||||
@@ -70,9 +70,9 @@
|
|||||||
</a></div>
|
</a></div>
|
||||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.javaInternal.NegativeExpr" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.NegativeExpr</h2>
|
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.NegativeExpr" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.NegativeExpr</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="classUseContainer">No usage of de.dhbwstuttgart.syntaxtree.statement.javaInternal.NegativeExpr</div>
|
<div class="classUseContainer">No usage of de.dhbwstuttgart.syntaxtree.statement.NegativeExpr</div>
|
||||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||||
<div class="bottomNav"><a name="navbar.bottom">
|
<div class="bottomNav"><a name="navbar.bottom">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
||||||
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.javaInternal.NotExpr</title>
|
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.NotExpr</title>
|
||||||
<meta name="date" content="2015-05-12">
|
<meta name="date" content="2015-05-12">
|
||||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||||
<script type="text/javascript" src="../../../../../script.js"></script>
|
<script type="text/javascript" src="../../../../../script.js"></script>
|
||||||
@@ -70,9 +70,9 @@
|
|||||||
</a></div>
|
</a></div>
|
||||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.javaInternal.NotExpr" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.NotExpr</h2>
|
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.NotExpr" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.NotExpr</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="classUseContainer">No usage of de.dhbwstuttgart.syntaxtree.statement.javaInternal.NotExpr</div>
|
<div class="classUseContainer">No usage of de.dhbwstuttgart.syntaxtree.statement.NotExpr</div>
|
||||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||||
<div class="bottomNav"><a name="navbar.bottom">
|
<div class="bottomNav"><a name="navbar.bottom">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
||||||
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.javaInternal.PositivExpr</title>
|
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.PositivExpr</title>
|
||||||
<meta name="date" content="2015-05-12">
|
<meta name="date" content="2015-05-12">
|
||||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||||
<script type="text/javascript" src="../../../../../script.js"></script>
|
<script type="text/javascript" src="../../../../../script.js"></script>
|
||||||
@@ -70,9 +70,9 @@
|
|||||||
</a></div>
|
</a></div>
|
||||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.javaInternal.PositivExpr" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.PositivExpr</h2>
|
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.PositivExpr" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.PositivExpr</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="classUseContainer">No usage of de.dhbwstuttgart.syntaxtree.statement.javaInternal.PositivExpr</div>
|
<div class="classUseContainer">No usage of de.dhbwstuttgart.syntaxtree.statement.PositivExpr</div>
|
||||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||||
<div class="bottomNav"><a name="navbar.bottom">
|
<div class="bottomNav"><a name="navbar.bottom">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
||||||
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.javaInternal.PostDecExpr</title>
|
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.PostDecExpr</title>
|
||||||
<meta name="date" content="2015-05-12">
|
<meta name="date" content="2015-05-12">
|
||||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||||
<script type="text/javascript" src="../../../../../script.js"></script>
|
<script type="text/javascript" src="../../../../../script.js"></script>
|
||||||
@@ -70,9 +70,9 @@
|
|||||||
</a></div>
|
</a></div>
|
||||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.javaInternal.PostDecExpr" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.PostDecExpr</h2>
|
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.PostDecExpr" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.PostDecExpr</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="classUseContainer">No usage of de.dhbwstuttgart.syntaxtree.statement.javaInternal.PostDecExpr</div>
|
<div class="classUseContainer">No usage of de.dhbwstuttgart.syntaxtree.statement.PostDecExpr</div>
|
||||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||||
<div class="bottomNav"><a name="navbar.bottom">
|
<div class="bottomNav"><a name="navbar.bottom">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
||||||
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.javaInternal.PostIncExpr</title>
|
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.PostIncExpr</title>
|
||||||
<meta name="date" content="2015-05-12">
|
<meta name="date" content="2015-05-12">
|
||||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||||
<script type="text/javascript" src="../../../../../script.js"></script>
|
<script type="text/javascript" src="../../../../../script.js"></script>
|
||||||
@@ -70,9 +70,9 @@
|
|||||||
</a></div>
|
</a></div>
|
||||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.javaInternal.PostIncExpr" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.PostIncExpr</h2>
|
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.PostIncExpr" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.PostIncExpr</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="classUseContainer">No usage of de.dhbwstuttgart.syntaxtree.statement.javaInternal.PostIncExpr</div>
|
<div class="classUseContainer">No usage of de.dhbwstuttgart.syntaxtree.statement.PostIncExpr</div>
|
||||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||||
<div class="bottomNav"><a name="navbar.bottom">
|
<div class="bottomNav"><a name="navbar.bottom">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
||||||
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.javaInternal.PreDecExpr</title>
|
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.PreDecExpr</title>
|
||||||
<meta name="date" content="2015-05-12">
|
<meta name="date" content="2015-05-12">
|
||||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||||
<script type="text/javascript" src="../../../../../script.js"></script>
|
<script type="text/javascript" src="../../../../../script.js"></script>
|
||||||
@@ -70,9 +70,9 @@
|
|||||||
</a></div>
|
</a></div>
|
||||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.javaInternal.PreDecExpr" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.PreDecExpr</h2>
|
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.PreDecExpr" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.PreDecExpr</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="classUseContainer">No usage of de.dhbwstuttgart.syntaxtree.statement.javaInternal.PreDecExpr</div>
|
<div class="classUseContainer">No usage of de.dhbwstuttgart.syntaxtree.statement.PreDecExpr</div>
|
||||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||||
<div class="bottomNav"><a name="navbar.bottom">
|
<div class="bottomNav"><a name="navbar.bottom">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
<!-- Generated by javadoc (1.8.0_05) on Tue May 12 19:56:24 CEST 2015 -->
|
||||||
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.javaInternal.PreIncExpr</title>
|
<title>Uses of Class de.dhbwstuttgart.syntaxtree.statement.PreIncExpr</title>
|
||||||
<meta name="date" content="2015-05-12">
|
<meta name="date" content="2015-05-12">
|
||||||
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
|
||||||
<script type="text/javascript" src="../../../../../script.js"></script>
|
<script type="text/javascript" src="../../../../../script.js"></script>
|
||||||
@@ -70,9 +70,9 @@
|
|||||||
</a></div>
|
</a></div>
|
||||||
<!-- ========= END OF TOP NAVBAR ========= -->
|
<!-- ========= END OF TOP NAVBAR ========= -->
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.javaInternal.PreIncExpr" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.PreIncExpr</h2>
|
<h2 title="Uses of Class de.dhbwstuttgart.syntaxtree.statement.PreIncExpr" class="title">Uses of Class<br>de.dhbwstuttgart.syntaxtree.statement.PreIncExpr</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="classUseContainer">No usage of de.dhbwstuttgart.syntaxtree.statement.javaInternal.PreIncExpr</div>
|
<div class="classUseContainer">No usage of de.dhbwstuttgart.syntaxtree.statement.PreIncExpr</div>
|
||||||
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
<!-- ======= START OF BOTTOM NAVBAR ====== -->
|
||||||
<div class="bottomNav"><a name="navbar.bottom">
|
<div class="bottomNav"><a name="navbar.bottom">
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
@@ -1,24 +0,0 @@
|
|||||||
# Dateien
|
|
||||||
* sämtliche Datein im Ordner de.dhbwstuttgart.parser gehören zum Parser
|
|
||||||
* Auch zu beachten: pom.xml
|
|
||||||
* Ein Teil der pom.xml instruiert maven zur Kompilierung der Java8.g4 Datei
|
|
||||||
* VORSICHT! Wird nicht zwangsläufig von der IDE ausgeführt
|
|
||||||
* siehe Kapitel "Grammatik -> Parser"
|
|
||||||
|
|
||||||
|
|
||||||
## Unterordner antlr
|
|
||||||
* Java8.g4
|
|
||||||
* die eigentliche Java Grammatik
|
|
||||||
* hier wurden Anpassungen vorgenommen, damit sie auch typloses Java annimmt
|
|
||||||
* alle anderen Dateien in diesem Ordner sind vom ANTLR-Parsergenerator autogeneriert
|
|
||||||
|
|
||||||
## Unterordner SyntaxTreeGenerator
|
|
||||||
* SyntaxTreeGenerator
|
|
||||||
* TODO
|
|
||||||
|
|
||||||
# Grammatik -> Parser
|
|
||||||
* Die Antlr-Grammatik (Java8.g4) wandelt
|
|
||||||
* Folgende Stellen sind relevant
|
|
||||||
* TODO
|
|
||||||
|
|
||||||
|
|
BIN
lib/antlr-4.7-complete.jar
Normal file
BIN
lib/asm-6.0.jar
Normal file
BIN
lib/asm-6.0_BETA.jar
Normal file
BIN
lib/asm-analysis-6.0.jar
Normal file
BIN
lib/asm-commons-6.0.jar
Normal file
BIN
lib/asm-tree-6.0.jar
Normal file
BIN
lib/asm-util-6.0.jar
Normal file
BIN
lib/asm-xml-6.0.jar
Normal file
BIN
lib/guava-19.0.jar
Normal file
BIN
lib/guava-22.0.jar
Normal file
BIN
lib/hamcrest-core-1.3.jar
Normal file
BIN
lib/junit-4.12.jar
Normal file
BIN
lib/reflections-0.9.12-SNAPSHOT.jar
Normal file
BIN
lib/src.zip
Normal file
173
pom.xml
@@ -1,173 +0,0 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
|
|
||||||
http://maven.apache.org/maven-v4_0_0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<groupId>de.dhbwstuttgart</groupId>
|
|
||||||
<artifactId>JavaTXcompiler</artifactId>
|
|
||||||
<packaging>jar</packaging>
|
|
||||||
|
|
||||||
<version>0.1</version>
|
|
||||||
<name>JavaTXcompiler</name>
|
|
||||||
<url>http://maven.apache.org</url>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>junit</groupId>
|
|
||||||
<artifactId>junit</artifactId>
|
|
||||||
<version>4.0</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.antlr</groupId>
|
|
||||||
<artifactId>antlr4</artifactId>
|
|
||||||
<version>4.7</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>commons-io</groupId>
|
|
||||||
<artifactId>commons-io</artifactId>
|
|
||||||
<version>2.6</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.google.guava</groupId>
|
|
||||||
<artifactId>guava</artifactId>
|
|
||||||
<version>22.0</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.reflections</groupId>
|
|
||||||
<artifactId>reflections</artifactId>
|
|
||||||
<version>0.9.11</version>
|
|
||||||
</dependency>
|
|
||||||
<!-- https://mvnrepository.com/artifact/org.ow2.asm/asm -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.ow2.asm</groupId>
|
|
||||||
<artifactId>asm</artifactId>
|
|
||||||
<version>7.0</version>
|
|
||||||
</dependency>
|
|
||||||
<!-- <dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm-all</artifactId>
|
|
||||||
<version>[4.0.0,)</version> </dependency> -->
|
|
||||||
<!-- <dependency> <groupId>org.bitbucket.mstrobel</groupId> <artifactId>procyon-reflection</artifactId>
|
|
||||||
<version>[0.5.32,)</version> </dependency> -->
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<build>
|
|
||||||
<directory>target</directory>
|
|
||||||
<outputDirectory>target/classes</outputDirectory>
|
|
||||||
<finalName>${project.artifactId}-${project.version}</finalName>
|
|
||||||
<testOutputDirectory>target/test-classes</testOutputDirectory>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.antlr</groupId>
|
|
||||||
<artifactId>antlr4-maven-plugin</artifactId>
|
|
||||||
<version>4.7</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>antlr</id>
|
|
||||||
<goals>
|
|
||||||
<goal>antlr4</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<sourceDirectory>src/main/antlr4/java8</sourceDirectory>
|
|
||||||
<outputDirectory>${project.basedir}/target/generated-sources/antlr4/de/dhbwstuttgart/parser/antlr</outputDirectory>
|
|
||||||
<arguments>
|
|
||||||
<argument>-package</argument>
|
|
||||||
<argument>de.dhbwstuttgart.parser.antlr</argument>
|
|
||||||
</arguments>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
<execution>
|
|
||||||
<id>aspParser</id>
|
|
||||||
<goals>
|
|
||||||
<goal>antlr4</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<sourceDirectory>src/main/antlr4/sat</sourceDirectory>
|
|
||||||
<outputDirectory>${project.basedir}/target/generated-sources/antlr4/de/dhbwstuttgart/sat/asp/parser/antlr</outputDirectory>
|
|
||||||
<arguments>
|
|
||||||
<argument>-package</argument>
|
|
||||||
<argument>de.dhbwstuttgart.sat.asp.parser.antlr</argument>
|
|
||||||
</arguments>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-assembly-plugin</artifactId>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>single</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
<configuration>
|
|
||||||
<descriptorRefs>
|
|
||||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
|
||||||
</descriptorRefs>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.reficio</groupId>
|
|
||||||
<artifactId>p2-maven-plugin</artifactId>
|
|
||||||
<version>1.1.2-SNAPSHOT</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>default-cli</id>
|
|
||||||
<configuration>
|
|
||||||
<artifacts>
|
|
||||||
<!-- specify your depencies here -->
|
|
||||||
<!-- groupId:artifactId:version -->
|
|
||||||
<artifact>
|
|
||||||
<id>de.dhbwstuttgart:JavaTXcompiler:0.1</id>
|
|
||||||
</artifact>
|
|
||||||
<artifact>
|
|
||||||
<id>org.reflections:reflections:0.9.11</id>
|
|
||||||
</artifact>
|
|
||||||
<artifact>
|
|
||||||
<id>com.google.guava:guava:22.0</id>
|
|
||||||
</artifact>
|
|
||||||
<artifact>
|
|
||||||
<id>javax.annotation:javax.annotation-api:1.3.1</id>
|
|
||||||
</artifact>
|
|
||||||
<artifact>
|
|
||||||
<id>org.glassfish:javax.annotation:3.1.1</id>
|
|
||||||
</artifact>
|
|
||||||
</artifacts>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
<!-- plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>tycho-p2-repository-plugin</artifactId>
|
|
||||||
<version>${tycho.version}</version> <executions> <execution> <phase>package</phase>
|
|
||||||
<goals> <goal>archive-repository</goal> </goals> </execution> </executions>
|
|
||||||
</plugin -->
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
<pluginRepositories>
|
|
||||||
<pluginRepository>
|
|
||||||
<id>reficio</id>
|
|
||||||
<url>http://repo.reficio.org/maven/</url>
|
|
||||||
</pluginRepository>
|
|
||||||
</pluginRepositories>
|
|
||||||
<repositories>
|
|
||||||
<repository>
|
|
||||||
<id>maven-repository</id>
|
|
||||||
<url>file:///${project.basedir}/target</url>
|
|
||||||
</repository>
|
|
||||||
</repositories>
|
|
||||||
<properties>
|
|
||||||
<maven.compiler.source>1.8</maven.compiler.source>
|
|
||||||
<maven.compiler.target>1.8</maven.compiler.target>
|
|
||||||
<tycho.version>0.23.0</tycho.version>
|
|
||||||
</properties>
|
|
||||||
<distributionManagement>
|
|
||||||
<repository>
|
|
||||||
<id>maven-repository</id>
|
|
||||||
<name>MyCo Internal Repository</name>
|
|
||||||
<url>file:///${project.basedir}/maven-repository/</url>
|
|
||||||
</repository>
|
|
||||||
</distributionManagement>
|
|
||||||
</project>
|
|
||||||
|
|
||||||
|
|
24
src/build_compiler.sh
Executable file
@@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# A basic script to compile the necessary packages and their subpackages to work with the parser.
|
||||||
|
# Messages are logged to stderr.
|
||||||
|
>&2 echo "Building de.dhbwstuttgart.typecheck..."
|
||||||
|
javac -d ../bin ./de/dhbwstuttgart/typecheck/*.java
|
||||||
|
>&2 echo "Building de.dhbwstuttgart.syntaxtree..."
|
||||||
|
javac -d ../bin ./de/dhbwstuttgart/syntaxtree/*.java
|
||||||
|
>&2 echo "Building de.dhbwstuttgart.syntaxtree.factory..."
|
||||||
|
javac -d ../bin ./de/dhbwstuttgart/syntaxtree/factory/*.java
|
||||||
|
>&2 echo "Building de.dhbwstuttgart.syntaxtree.operator..."
|
||||||
|
javac -d ../bin ./de/dhbwstuttgart/syntaxtree/operator/*.java
|
||||||
|
>&2 echo "Building de.dhbwstuttgart.syntaxtree.statement..."
|
||||||
|
javac -d ../bin ./de/dhbwstuttgart/syntaxtree/statement/*.java
|
||||||
|
>&2 echo "Building de.dhbwstuttgart.syntaxtree.statement.literal..."
|
||||||
|
javac -d ../bin ./de/dhbwstuttgart/syntaxtree/statement/literal/*.java
|
||||||
|
>&2 echo "Building de.dhbwstuttgart.syntaxtree.type..."
|
||||||
|
javac -d ../bin ./de/dhbwstuttgart/syntaxtree/type/*.java
|
||||||
|
>&2 echo "Building de.dhbwstuttgart.parser..."
|
||||||
|
javac -d ../bin ./de/dhbwstuttgart/parser/*.java
|
||||||
|
>&2 echo "Building de.dhbwstuttgart.parser.SyntaxTreeGenerator..."
|
||||||
|
javac -d ../bin ./de/dhbwstuttgart/parser/SyntaxTreeGenerator/*.java
|
||||||
|
>&2 echo "Building de.dhbwstuttgart.parser.antlr..."
|
||||||
|
javac -d ../bin ./de/dhbwstuttgart/parser/antlr/*.java
|
||||||
|
echo "Done. Now its your turn to debug:)."
|
BIN
src/de/dhbwstuttgart/.DS_Store
vendored
Normal file
386
src/de/dhbwstuttgart/bytecode/BytecodeGen.java
Normal file
@@ -0,0 +1,386 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
import java.awt.List;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.objectweb.asm.ClassWriter;
|
||||||
|
import org.objectweb.asm.FieldVisitor;
|
||||||
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.*;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ArgumentList;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Assign;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.AssignToField;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Binary;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Block;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.CastExpr;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.DoStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.EmptyStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.FieldVar;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ForStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.IfStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.InstanceOf;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.LocalVar;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.LocalVarDecl;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.MethodCall;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.NewArray;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.NewClass;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Receiver;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Return;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ReturnVoid;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.StaticClassName;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Super;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.SuperCall;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.This;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.UnaryPlus;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.WhileStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.literal.Literal;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.literal.Null;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.ExtendsWildcardType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.GenericRefType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.SuperWildcardType;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
|
|
||||||
|
public class BytecodeGen implements ASTVisitor {
|
||||||
|
|
||||||
|
ClassWriter cw =new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
|
||||||
|
// String methDesc;
|
||||||
|
|
||||||
|
String type;
|
||||||
|
|
||||||
|
String className;
|
||||||
|
|
||||||
|
// stores parameter, local vars and the next index on the local variable table, which use for aload_i, astore_i,...
|
||||||
|
HashMap<String, Integer> paramsAndLocals;// = new HashMap<>();
|
||||||
|
byte[] bytecode;
|
||||||
|
HashMap<String,byte[]> classFiles;
|
||||||
|
|
||||||
|
public BytecodeGen(HashMap<String,byte[]> classFiles) {
|
||||||
|
this.classFiles = classFiles;
|
||||||
|
paramsAndLocals = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(SourceFile sourceFile) {
|
||||||
|
for(ClassOrInterface cl : sourceFile.getClasses()) {
|
||||||
|
BytecodeGen classGen = new BytecodeGen(classFiles);
|
||||||
|
cl.accept(classGen);
|
||||||
|
classGen.writeClass(cl.getClassName().toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeClass(String name) {
|
||||||
|
bytecode = cw.toByteArray();
|
||||||
|
classFiles.put(name, bytecode);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public HashMap<String,byte[]> getClassFiles() {
|
||||||
|
return classFiles;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void visit(ClassOrInterface classOrInterface) {
|
||||||
|
className = classOrInterface.getClassName().toString();
|
||||||
|
// access flages??
|
||||||
|
cw.visit(Opcodes.V1_8, classOrInterface.getModifiers()+Opcodes.ACC_SUPER, classOrInterface.getClassName().toString()
|
||||||
|
, null, classOrInterface.getSuperClass().toString(), null);
|
||||||
|
|
||||||
|
// for each field in the class
|
||||||
|
for(Field f : classOrInterface.getFieldDecl()) {
|
||||||
|
System.out.println("get Fields");
|
||||||
|
System.out.println(f.getName());
|
||||||
|
f.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Constructor c : classOrInterface.getConstructors()) {
|
||||||
|
c.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Method m : classOrInterface.getMethods()) {
|
||||||
|
m.accept(this);
|
||||||
|
}
|
||||||
|
cw.visitSource(classOrInterface.getClassName().toString()+".jav", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Constructor field) {
|
||||||
|
Descriptor desc = new Descriptor(field);
|
||||||
|
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", desc.getDesc(), null, null);
|
||||||
|
mv.visitCode();
|
||||||
|
System.out.println("-----Constructor-----");
|
||||||
|
BytecodeGenMethod gen = new BytecodeGenMethod(className,field, mv,paramsAndLocals,desc.getDesc(),cw);
|
||||||
|
|
||||||
|
mv.visitInsn(Opcodes.RETURN);
|
||||||
|
mv.visitMaxs(0, 0);
|
||||||
|
mv.visitEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Method method) {
|
||||||
|
method.getParameterList().accept(this);
|
||||||
|
Descriptor methDesc = new Descriptor(method);
|
||||||
|
System.out.println("-----Method-----");
|
||||||
|
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, method.getName(), methDesc.getDesc(), null, null);
|
||||||
|
mv.visitCode();
|
||||||
|
|
||||||
|
BytecodeGenMethod gen = new BytecodeGenMethod(className,method, mv,paramsAndLocals,methDesc.getDesc(),cw);
|
||||||
|
mv.visitMaxs(0, 0);
|
||||||
|
mv.visitEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ParameterList formalParameters) {
|
||||||
|
Iterator<FormalParameter> itr = formalParameters.iterator();
|
||||||
|
int i = 1;
|
||||||
|
while(itr.hasNext()) {
|
||||||
|
FormalParameter fp = itr.next();
|
||||||
|
paramsAndLocals.put(fp.getName(), i);
|
||||||
|
fp.accept(this);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(FormalParameter formalParameter) {
|
||||||
|
formalParameter.getType().accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(RefType refType) {
|
||||||
|
type = "L"+refType.toString()+";";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(SuperWildcardType superWildcardType) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(TypePlaceholder typePlaceholder) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ExtendsWildcardType extendsWildcardType) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(GenericRefType genericRefType) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ??
|
||||||
|
@Override
|
||||||
|
public void visit(FieldVar fieldVar) {
|
||||||
|
System.out.println("in fieldvar");
|
||||||
|
// cw.newField(fieldVar.receiver.toString(), fieldVar.fieldVarName.toString(), fieldVar.getType().toString());
|
||||||
|
FieldVisitor fv = cw.visitField(Opcodes.ACC_PRIVATE, fieldVar.fieldVarName, "L"+fieldVar.getType()+";", null, null);
|
||||||
|
fv.visitEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
// access flages?? modifiers
|
||||||
|
@Override
|
||||||
|
public void visit(Field field) {
|
||||||
|
System.out.println("in field");
|
||||||
|
FieldVisitor fv = cw.visitField(Opcodes.ACC_PRIVATE, field.getName(), "L"+field.getType().toString().replace(".", "/")+";", null, null);
|
||||||
|
fv.visitEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(LambdaExpression lambdaExpression) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Assign assign) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Binary binary) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Block block) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(CastExpr castExpr) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(EmptyStmt emptyStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ForStmt forStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(IfStmt ifStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(InstanceOf instanceOf) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(LocalVar localVar) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(LocalVarDecl localVarDecl) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(MethodCall methodCall) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(NewClass methodCall) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(NewArray newArray) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Receiver receiver) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Return aReturn) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ReturnVoid aReturn) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(StaticClassName staticClassName) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Super aSuper) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(This aThis) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(UnaryPlus unaryPlus) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(WhileStmt whileStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(DoStmt whileStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Null aNull) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
// ???
|
||||||
|
@Override
|
||||||
|
public void visit(Literal literal) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ArgumentList argumentList) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(GenericTypeVar genericTypeVar) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(GenericDeclarationList genericTypeVars) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(AssignToField assignLeftSide) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(AssignToLocal assignLeftSide) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(SuperCall superCall) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -1,45 +1,48 @@
|
|||||||
package de.dhbwstuttgart.bytecode;
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
import java.util.List;
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
|
||||||
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal;
|
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal;
|
||||||
import de.dhbwstuttgart.syntaxtree.StatementVisitor;
|
import de.dhbwstuttgart.syntaxtree.StatementVisitor;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.ArgumentList;
|
import de.dhbwstuttgart.syntaxtree.statement.ArgumentList;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.Assign;
|
import de.dhbwstuttgart.syntaxtree.statement.Assign;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.AssignToField;
|
import de.dhbwstuttgart.syntaxtree.statement.AssignToField;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.BinaryExpr;
|
import de.dhbwstuttgart.syntaxtree.statement.Binary;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.Block;
|
import de.dhbwstuttgart.syntaxtree.statement.Block;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.CastExpr;
|
import de.dhbwstuttgart.syntaxtree.statement.CastExpr;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.DoStmt;
|
import de.dhbwstuttgart.syntaxtree.statement.DoStmt;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.EmptyStmt;
|
import de.dhbwstuttgart.syntaxtree.statement.EmptyStmt;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.ExpressionReceiver;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.FieldVar;
|
import de.dhbwstuttgart.syntaxtree.statement.FieldVar;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.ForStmt;
|
import de.dhbwstuttgart.syntaxtree.statement.ForStmt;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.IfStmt;
|
import de.dhbwstuttgart.syntaxtree.statement.IfStmt;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.InstanceOf;
|
import de.dhbwstuttgart.syntaxtree.statement.InstanceOf;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression;
|
import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.Literal;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.LocalVar;
|
import de.dhbwstuttgart.syntaxtree.statement.LocalVar;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.LocalVarDecl;
|
import de.dhbwstuttgart.syntaxtree.statement.LocalVarDecl;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.MethodCall;
|
import de.dhbwstuttgart.syntaxtree.statement.MethodCall;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.NewArray;
|
import de.dhbwstuttgart.syntaxtree.statement.NewArray;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.NewClass;
|
import de.dhbwstuttgart.syntaxtree.statement.NewClass;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Receiver;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.Return;
|
import de.dhbwstuttgart.syntaxtree.statement.Return;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.ReturnVoid;
|
import de.dhbwstuttgart.syntaxtree.statement.ReturnVoid;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.StaticClassName;
|
import de.dhbwstuttgart.syntaxtree.statement.StaticClassName;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.Super;
|
import de.dhbwstuttgart.syntaxtree.statement.Super;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.SuperCall;
|
import de.dhbwstuttgart.syntaxtree.statement.SuperCall;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.This;
|
import de.dhbwstuttgart.syntaxtree.statement.This;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.UnaryExpr;
|
import de.dhbwstuttgart.syntaxtree.statement.UnaryPlus;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.WhileStmt;
|
import de.dhbwstuttgart.syntaxtree.statement.WhileStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.literal.Literal;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.literal.Null;
|
||||||
|
|
||||||
public class ArgumentVisitor implements StatementVisitor {
|
public class BytecodeGenLambda implements StatementVisitor{
|
||||||
private List<Boolean> argListMethCall;
|
private LambdaExpression lambdaExpression;
|
||||||
private BytecodeGenMethod bytecodeGenMethod;
|
private MethodVisitor mv;
|
||||||
|
|
||||||
public ArgumentVisitor(List<Boolean> argListMethCall, BytecodeGenMethod bytecodeGenMethod) {
|
public BytecodeGenLambda(LambdaExpression lambdaExpression, MethodVisitor mv) {
|
||||||
this.argListMethCall = argListMethCall;
|
this.lambdaExpression = lambdaExpression;
|
||||||
this.bytecodeGenMethod = bytecodeGenMethod;
|
this.mv = mv;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -50,31 +53,20 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(LambdaExpression lambdaExpression) {
|
public void visit(LambdaExpression lambdaExpression) {
|
||||||
lambdaExpression.accept(bytecodeGenMethod);
|
// TODO Auto-generated method stub
|
||||||
// Zieltype des Lambas ist Funktionale Interface
|
|
||||||
// kann nie primitiv sein => un-/boxing wird hier nicht gebraucht
|
|
||||||
argListMethCall.remove(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(Assign assign) {
|
public void visit(Assign assign) {
|
||||||
assign.accept(bytecodeGenMethod);
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(assign.getType()));
|
|
||||||
argListMethCall.remove(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(BinaryExpr binary) {
|
public void visit(Binary binary) {
|
||||||
binary.accept(bytecodeGenMethod);
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
if(argListMethCall.get(0)) {
|
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(binary.getType()));
|
|
||||||
} else {
|
|
||||||
bytecodeGenMethod.doBoxing(bytecodeGenMethod.getResolvedType(binary.getType()));
|
|
||||||
}
|
|
||||||
argListMethCall.remove(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -85,11 +77,8 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(CastExpr castExpr) {
|
public void visit(CastExpr castExpr) {
|
||||||
castExpr.accept(bytecodeGenMethod);
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(castExpr.getType()));
|
|
||||||
argListMethCall.remove(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -100,11 +89,8 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(FieldVar fieldVar) {
|
public void visit(FieldVar fieldVar) {
|
||||||
fieldVar.accept(bytecodeGenMethod);
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(fieldVar.getType()));
|
|
||||||
argListMethCall.remove(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -121,21 +107,14 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(InstanceOf instanceOf) {
|
public void visit(InstanceOf instanceOf) {
|
||||||
instanceOf.accept(bytecodeGenMethod);
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(instanceOf.getType()));
|
|
||||||
argListMethCall.remove(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(LocalVar localVar) {
|
public void visit(LocalVar localVar) {
|
||||||
localVar.accept(bytecodeGenMethod);
|
// TODO Auto-generated method stub
|
||||||
if(!bytecodeGenMethod.isBinaryExp) {
|
|
||||||
if(argListMethCall.get(0))
|
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(localVar.getType()));
|
|
||||||
}
|
|
||||||
argListMethCall.remove(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -146,20 +125,14 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(MethodCall methodCall) {
|
public void visit(MethodCall methodCall) {
|
||||||
methodCall.accept(bytecodeGenMethod);
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(methodCall.getType()));
|
|
||||||
argListMethCall.remove(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(NewClass methodCall) {
|
public void visit(NewClass methodCall) {
|
||||||
methodCall.accept(bytecodeGenMethod);
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(methodCall.getType()));
|
|
||||||
argListMethCall.remove(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -168,6 +141,12 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Receiver receiver) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(Return aReturn) {
|
public void visit(Return aReturn) {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
@@ -194,11 +173,14 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(This aThis) {
|
public void visit(This aThis) {
|
||||||
aThis.accept(bytecodeGenMethod);
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(UnaryPlus unaryPlus) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(aThis.getType()));
|
|
||||||
argListMethCall.remove(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -213,6 +195,18 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Null aNull) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Literal literal) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(AssignToField assignLeftSide) {
|
public void visit(AssignToField assignLeftSide) {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
@@ -230,29 +224,4 @@ public class ArgumentVisitor implements StatementVisitor {
|
|||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visit(ExpressionReceiver expressionReceiver) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visit(UnaryExpr unaryExpr) {
|
|
||||||
unaryExpr.accept(bytecodeGenMethod);
|
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(unaryExpr.getType()));
|
|
||||||
argListMethCall.remove(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visit(Literal literal) {
|
|
||||||
literal.accept(bytecodeGenMethod);
|
|
||||||
|
|
||||||
if(argListMethCall.get(0))
|
|
||||||
bytecodeGenMethod.doUnboxing(bytecodeGenMethod.getResolvedType(literal.getType()));
|
|
||||||
argListMethCall.remove(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
360
src/de/dhbwstuttgart/bytecode/BytecodeGenMethod.java
Normal file
@@ -0,0 +1,360 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
import java.io.PrintStream;
|
||||||
|
import java.lang.invoke.CallSite;
|
||||||
|
import java.lang.invoke.MethodHandle;
|
||||||
|
import java.lang.invoke.MethodHandles;
|
||||||
|
import java.lang.invoke.MethodType;
|
||||||
|
import java.security.GeneralSecurityException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import org.objectweb.asm.ClassWriter;
|
||||||
|
import org.objectweb.asm.Handle;
|
||||||
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.AssignToLocal;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.Method;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.StatementVisitor;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ArgumentList;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Assign;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.AssignToField;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Binary;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Block;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.CastExpr;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.DoStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.EmptyStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Expression;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.FieldVar;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ForStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.IfStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.InstanceOf;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.LocalVar;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.LocalVarDecl;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.MethodCall;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.NewArray;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.NewClass;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Receiver;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Return;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ReturnVoid;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Statement;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.StaticClassName;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Super;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.SuperCall;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.This;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.UnaryPlus;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.WhileStmt;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.literal.Literal;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.literal.Null;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
|
|
||||||
|
public class BytecodeGenMethod implements StatementVisitor{
|
||||||
|
|
||||||
|
private Method m;
|
||||||
|
private MethodVisitor mv;
|
||||||
|
private HashMap<String, Integer> paramsAndLocals = new HashMap<>();
|
||||||
|
private String desc;
|
||||||
|
private String className;
|
||||||
|
private int lamCounter;
|
||||||
|
private ClassWriter cw;
|
||||||
|
|
||||||
|
//for tests **
|
||||||
|
private String fieldName;
|
||||||
|
private String fieldDesc;
|
||||||
|
private Expression rightSideTemp;
|
||||||
|
private String where;
|
||||||
|
|
||||||
|
public BytecodeGenMethod(String className, Method m, MethodVisitor mv, HashMap<String, Integer> paramsAndLocals,
|
||||||
|
String desc, ClassWriter cw) {
|
||||||
|
|
||||||
|
this.where = "NORMAL METHOD";
|
||||||
|
|
||||||
|
this.className = className;
|
||||||
|
this.m = m;
|
||||||
|
this.mv = mv;
|
||||||
|
this.paramsAndLocals = paramsAndLocals;
|
||||||
|
this.desc = desc;
|
||||||
|
this.cw = cw;
|
||||||
|
this.lamCounter = -1;
|
||||||
|
|
||||||
|
this.m.block.accept(this);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public BytecodeGenMethod(LambdaExpression lambdaExpression, MethodVisitor mv,
|
||||||
|
HashMap<String, Integer> paramsAndLocals, String desc) {
|
||||||
|
System.out.println("++++++IN LAMBDA -------");
|
||||||
|
|
||||||
|
this.where = "&&&&&&&& LAMBDA METHOD";
|
||||||
|
|
||||||
|
this.mv = mv;
|
||||||
|
this.paramsAndLocals = paramsAndLocals;
|
||||||
|
this.desc = desc;
|
||||||
|
|
||||||
|
this.lamCounter = -1;
|
||||||
|
|
||||||
|
lambdaExpression.methodBody.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Block block) {
|
||||||
|
for(Statement stmt : block.getStatements()) {
|
||||||
|
System.out.println(where);
|
||||||
|
System.out.println("Stmt : " + stmt.toString());
|
||||||
|
stmt.accept(this);
|
||||||
|
System.out.println("--------------------------\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(SuperCall superCall) {
|
||||||
|
superCall.receiver.accept(this);
|
||||||
|
superCall.arglist.accept(this);
|
||||||
|
// mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", superCall.name, desc,false);
|
||||||
|
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(Object.class), superCall.name, desc,false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ??
|
||||||
|
@Override
|
||||||
|
public void visit(LocalVar localVar) {
|
||||||
|
System.out.println("in Local Var");
|
||||||
|
}
|
||||||
|
// ??
|
||||||
|
@Override
|
||||||
|
public void visit(LocalVarDecl localVarDecl) {
|
||||||
|
// Integer i;
|
||||||
|
paramsAndLocals.put(localVarDecl.getName(), paramsAndLocals.size()+1);
|
||||||
|
System.out.println("In localVarDecl");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Assign assign) {
|
||||||
|
System.out.println("Assign : \nright = "+assign.rightSide + "\nLeft = " + assign.lefSide);
|
||||||
|
|
||||||
|
if(assign.lefSide.getClass().equals(AssignToField.class)) {
|
||||||
|
// load_0, ldc or .. then putfield
|
||||||
|
this.rightSideTemp = assign.rightSide;
|
||||||
|
assign.lefSide.accept(this);
|
||||||
|
}else {
|
||||||
|
assign.rightSide.accept(this);
|
||||||
|
assign.lefSide.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Binary binary) {
|
||||||
|
System.out.println("++ In Binary: ");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(LambdaExpression lambdaExpression) {
|
||||||
|
System.out.println("\n++ In Lambda: ");
|
||||||
|
this.lamCounter++;
|
||||||
|
//Call site, which, when invoked, returns an instance of the functional interface to which
|
||||||
|
//the lambda is being converted
|
||||||
|
MethodType mt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class,
|
||||||
|
MethodType.class, MethodType.class, MethodHandle.class, MethodType.class);
|
||||||
|
|
||||||
|
Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory",
|
||||||
|
"metafactory", mt.toMethodDescriptorString(), false);
|
||||||
|
String methodName = "lambda$new$" + this.lamCounter;
|
||||||
|
// Type erasure
|
||||||
|
Type arg1 = Type.getMethodType("()V");
|
||||||
|
// real Type
|
||||||
|
Type arg3 = Type.getMethodType("()V");
|
||||||
|
Handle arg2 = new Handle(Opcodes.H_INVOKESTATIC, this.className, methodName,
|
||||||
|
arg3.toString(),false);
|
||||||
|
mv.visitInvokeDynamicInsn("run", "()Ljava/lang/Runnable;", bootstrap,
|
||||||
|
arg1, arg2,arg3);
|
||||||
|
|
||||||
|
MethodVisitor mvLambdaBody = cw.visitMethod(Opcodes.ACC_PRIVATE+ Opcodes.ACC_STATIC + Opcodes.ACC_SYNTHETIC,
|
||||||
|
methodName, arg3.toString(), null, null);
|
||||||
|
// new BytecodeGenLambda(lambdaExpression, mvLambdaBody);
|
||||||
|
|
||||||
|
new BytecodeGenMethod(lambdaExpression, mvLambdaBody, new HashMap<>(), arg3.toString());
|
||||||
|
mvLambdaBody.visitMaxs(0, 0);
|
||||||
|
mvLambdaBody.visitEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(CastExpr castExpr) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(EmptyStmt emptyStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(FieldVar fieldVar) {
|
||||||
|
System.out.println("in fieldVar " + fieldVar.fieldVarName + " ** receiver: "+fieldVar.receiver);
|
||||||
|
|
||||||
|
fieldName = fieldVar.fieldVarName;
|
||||||
|
fieldDesc = fieldVar.getType().toString();
|
||||||
|
|
||||||
|
fieldVar.receiver.accept(this);
|
||||||
|
// test (if)
|
||||||
|
if(!fieldVar.receiver.getClass().equals(StaticClassName.class)) {
|
||||||
|
mv.visitFieldInsn(Opcodes.GETFIELD,fieldVar.getType().toString(),fieldName ,fieldDesc);
|
||||||
|
}
|
||||||
|
|
||||||
|
// mv.visitFieldInsn(Opcodes.GETSTATIC, fieldVar.receiver.getType().toString().replace(".", "/"),
|
||||||
|
// fieldVar.fieldVarName, fieldVar.getType().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ForStmt forStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(IfStmt ifStmt) {
|
||||||
|
System.out.println("++ IF-Statment: ");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(InstanceOf instanceOf) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(MethodCall methodCall) {
|
||||||
|
System.out.println(" In Methodcall: (" +methodCall.name+")" );
|
||||||
|
System.out.println(" Method-Receiver: "+methodCall.receiver.expr);
|
||||||
|
|
||||||
|
methodCall.receiver.accept(this);
|
||||||
|
methodCall.arglist.accept(this);
|
||||||
|
|
||||||
|
Descriptor mDesc = new Descriptor(methodCall.arglist, methodCall.getType());
|
||||||
|
|
||||||
|
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, methodCall.receiver.expr.getType().toString(),
|
||||||
|
methodCall.name, mDesc.getDesc(), false);
|
||||||
|
// test
|
||||||
|
if(!methodCall.getType().toString().equals("V")) {
|
||||||
|
mv.visitInsn(Opcodes.POP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(NewClass methodCall) {
|
||||||
|
System.out.println("In NewClass: ");
|
||||||
|
System.out.println("name: " + methodCall.name + " *** " + "Receiver: " + methodCall.receiver);
|
||||||
|
|
||||||
|
mv.visitTypeInsn(Opcodes.NEW, methodCall.name.replace(".", "/"));
|
||||||
|
mv.visitInsn(Opcodes.DUP);
|
||||||
|
// creates Descriptor
|
||||||
|
methodCall.arglist.accept(this);
|
||||||
|
String d = "(";
|
||||||
|
for(Expression e : methodCall.arglist.getArguments()) {
|
||||||
|
d = d + "L"+e.getType().toString().replace(".", "/") + ";";
|
||||||
|
}
|
||||||
|
d += ")V";
|
||||||
|
|
||||||
|
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, methodCall.name.replace(".", "/"), "<init>", d, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(NewArray newArray) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Receiver receiver) {
|
||||||
|
System.out.println(" in Receiver");
|
||||||
|
System.out.println(" expr : " + receiver.expr);
|
||||||
|
receiver.expr.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Return aReturn) {
|
||||||
|
mv.visitInsn(Opcodes.ARETURN);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ReturnVoid aReturn) {
|
||||||
|
mv.visitInsn(Opcodes.RETURN);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(StaticClassName staticClassName) {
|
||||||
|
System.out.println("In StaticClassName: ");
|
||||||
|
// mv.visitMethodInsn(Opcodes.INVOKESTATIC, staticClassName.getType().toString().replace(".", "/"),
|
||||||
|
// staticClassName.toString(), staticClassName.getType().toString(), false);
|
||||||
|
mv.visitFieldInsn(Opcodes.GETSTATIC, staticClassName.getType().toString().replace(".", "/"),
|
||||||
|
fieldName, fieldDesc);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Super aSuper) {
|
||||||
|
System.out.println(">> In Super: ");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(This aThis) {
|
||||||
|
System.out.println("-> IN This");
|
||||||
|
mv.visitVarInsn(Opcodes.ALOAD, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(UnaryPlus unaryPlus) {
|
||||||
|
System.out.println("++ In UnaryPlus: ");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(WhileStmt whileStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(DoStmt whileStmt) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Null aNull) {
|
||||||
|
mv.visitInsn(Opcodes.ACONST_NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Literal literal) {
|
||||||
|
// value?
|
||||||
|
mv.visitLdcInsn(literal.getType().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ArgumentList argumentList) {
|
||||||
|
for(Expression al : argumentList.getArguments()) {
|
||||||
|
al.accept(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(AssignToField assignLeftSide) {
|
||||||
|
// Loads the an object reference from the local variable
|
||||||
|
// array slot onto the top of the operand stack.
|
||||||
|
assignLeftSide.field.receiver.accept(this);
|
||||||
|
this.rightSideTemp.accept(this);
|
||||||
|
mv.visitFieldInsn(Opcodes.PUTFIELD, assignLeftSide.field.receiver.getType().toString(),
|
||||||
|
assignLeftSide.field.fieldVarName, assignLeftSide.field.getType().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(AssignToLocal assignLeftSide) {
|
||||||
|
paramsAndLocals.put(assignLeftSide.localVar.name, paramsAndLocals.size()+1);
|
||||||
|
mv.visitVarInsn(Opcodes.ASTORE, paramsAndLocals.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
14
src/de/dhbwstuttgart/bytecode/ClassFile.java
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
public class ClassFile {
|
||||||
|
|
||||||
|
String name;
|
||||||
|
byte[] bytecode;
|
||||||
|
|
||||||
|
public ClassFile(String name, byte[] bytecode) {
|
||||||
|
this.name = name;
|
||||||
|
this.bytecode = bytecode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
54
src/de/dhbwstuttgart/bytecode/Descriptor.java
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
import java.awt.List;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.syntaxtree.Constructor;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.FormalParameter;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.Method;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.ArgumentList;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.Expression;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
|
|
||||||
|
public class Descriptor {
|
||||||
|
String desc;
|
||||||
|
|
||||||
|
public Descriptor(Method method) {
|
||||||
|
desc = "(";
|
||||||
|
Iterator<FormalParameter> itr = method.getParameterList().iterator();
|
||||||
|
while(itr.hasNext()) {
|
||||||
|
FormalParameter fp = itr.next();
|
||||||
|
desc = desc + "L"+fp.getType().toString().replace(".", "/") + ";";
|
||||||
|
}
|
||||||
|
if(method.getReturnType().toString().equals("void")){
|
||||||
|
desc = desc + ")V";
|
||||||
|
}else {
|
||||||
|
desc = desc + ")" + "L"+method.getReturnType().toString().replace(".", "/")+";";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Descriptor(Constructor constructor) {
|
||||||
|
desc = "(";
|
||||||
|
Iterator<FormalParameter> itr = constructor.getParameterList().iterator();
|
||||||
|
while(itr.hasNext()) {
|
||||||
|
FormalParameter fp = itr.next();
|
||||||
|
desc = desc + "L"+fp.getType().toString().replace(".", "/") + ";";
|
||||||
|
}
|
||||||
|
desc = desc + ")V";
|
||||||
|
}
|
||||||
|
|
||||||
|
public Descriptor(ArgumentList argList, RefTypeOrTPHOrWildcardOrGeneric returnType) {
|
||||||
|
desc = "(";
|
||||||
|
for(Expression e : argList.getArguments()) {
|
||||||
|
desc = desc + "L"+e.getType().toString().replace(".", "/") + ";";
|
||||||
|
}
|
||||||
|
desc = desc + ")"+returnType.toString();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDesc() {
|
||||||
|
return this.desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
150
src/de/dhbwstuttgart/bytecode/Test.java
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.invoke.CallSite;
|
||||||
|
import java.lang.invoke.MethodHandle;
|
||||||
|
import java.lang.invoke.MethodHandles;
|
||||||
|
import java.lang.invoke.MethodType;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
|
||||||
|
import org.objectweb.asm.ClassReader;
|
||||||
|
import org.objectweb.asm.ClassWriter;
|
||||||
|
import org.objectweb.asm.Handle;
|
||||||
|
import org.objectweb.asm.Label;
|
||||||
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
|
|
||||||
|
public class Test {
|
||||||
|
private static final String rootDirectory = System.getProperty("user.dir") + "/bin/de/dhbwstuttgart/bytecode/";
|
||||||
|
|
||||||
|
protected static ClassLoader getClassLoader() throws Exception {
|
||||||
|
File file = new File(rootDirectory);
|
||||||
|
URL url = file.toURI().toURL();
|
||||||
|
URL[] urls = new URL[] { url };
|
||||||
|
System.out.println(urls[0]);
|
||||||
|
return new URLClassLoader(urls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// Test Lambda
|
||||||
|
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
|
||||||
|
cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, "TestClass", null, "java/lang/Object", null);
|
||||||
|
|
||||||
|
cw.visitSource("TestClass.java", null);
|
||||||
|
|
||||||
|
// Create Constructor
|
||||||
|
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
|
||||||
|
mv.visitVarInsn(Opcodes.ALOAD, 0);
|
||||||
|
|
||||||
|
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
|
||||||
|
|
||||||
|
// mv.visitMethodInsn(INVOKEDYNAMIC, "#0", "run", "()Ljava/lang/Runnable");
|
||||||
|
//Call site, which, when invoked, returns an instance of the functional interface to which
|
||||||
|
//the lambda is being converted
|
||||||
|
MethodType mt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class,
|
||||||
|
MethodType.class, MethodType.class, MethodHandle.class, MethodType.class);
|
||||||
|
|
||||||
|
Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory",
|
||||||
|
mt.toMethodDescriptorString());
|
||||||
|
Handle arg2 = new Handle(Opcodes.H_INVOKESTATIC, "TestClass", "lambda$0", "()V");
|
||||||
|
|
||||||
|
mv.visitInvokeDynamicInsn("run", "()Ljava/lang/Runnable;", bootstrap,
|
||||||
|
Type.getMethodType("()V"), arg2,
|
||||||
|
Type.getMethodType("()V"));
|
||||||
|
|
||||||
|
mv.visitVarInsn(Opcodes.ASTORE, 1);
|
||||||
|
mv.visitVarInsn(Opcodes.ALOAD, 1);
|
||||||
|
mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "java/lang/Runnable", "run", "()V");
|
||||||
|
mv.visitInsn(Opcodes.RETURN);
|
||||||
|
|
||||||
|
// creates bridge method, contains lambdas body
|
||||||
|
MethodVisitor mvl = cw.visitMethod(Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC + Opcodes.ACC_SYNTHETIC, "lambda$0",
|
||||||
|
"()V", null, null);
|
||||||
|
mvl.visitCode();
|
||||||
|
mvl.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
|
||||||
|
mvl.visitLdcInsn("lambda");
|
||||||
|
mvl.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
|
||||||
|
mvl.visitInsn(Opcodes.RETURN);
|
||||||
|
mvl.visitMaxs(2, 0);
|
||||||
|
mvl.visitEnd();
|
||||||
|
|
||||||
|
mv.visitMaxs(1, 2);
|
||||||
|
mv.visitEnd();
|
||||||
|
|
||||||
|
|
||||||
|
cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup",
|
||||||
|
Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC + Opcodes.ACC_FINAL);
|
||||||
|
cw.visitEnd();
|
||||||
|
|
||||||
|
byte[] b = cw.toByteArray();
|
||||||
|
|
||||||
|
// Test if statement
|
||||||
|
/*
|
||||||
|
* ClassWriter cw = new
|
||||||
|
* ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
|
||||||
|
*
|
||||||
|
* cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC+Opcodes.ACC_SUPER, "TestIf", null,
|
||||||
|
* "java/lang/Object", null); MethodVisitor mv =
|
||||||
|
* cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "(Ljava/lang/Boolean;)V", null,
|
||||||
|
* null); mv.visitCode();
|
||||||
|
*
|
||||||
|
* // Label l0 = new Label(); // mv.visitLabel(l0);
|
||||||
|
*
|
||||||
|
* mv.visitVarInsn(Opcodes.ALOAD, 0);
|
||||||
|
*
|
||||||
|
* mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>",
|
||||||
|
* "()V");
|
||||||
|
*
|
||||||
|
* // Label l1 = new Label(); // mv.visitLabel(l1);
|
||||||
|
* mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
|
||||||
|
* "java/lang/Boolean", "booleanValue", "()Z");
|
||||||
|
*
|
||||||
|
* Label label = new Label(); mv.visitJumpInsn(Opcodes.IFEQ, label);
|
||||||
|
*
|
||||||
|
* mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out",
|
||||||
|
* "Ljava/io/PrintStream;"); mv.visitLdcInsn("1");
|
||||||
|
* mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",
|
||||||
|
* "(Ljava/lang/String;)V");
|
||||||
|
*
|
||||||
|
* Label endLabel = new Label(); mv.visitJumpInsn(Opcodes.GOTO, endLabel);
|
||||||
|
*
|
||||||
|
* mv.visitLabel(label); mv.visitFieldInsn(Opcodes.GETSTATIC,
|
||||||
|
* "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("0");
|
||||||
|
* mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",
|
||||||
|
* "(Ljava/lang/String;)V");
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* mv.visitLabel(endLabel); mv.visitInsn(Opcodes.RETURN);
|
||||||
|
*
|
||||||
|
* // Label l2 = new Label(); // mv.visitLabel(l2);
|
||||||
|
*
|
||||||
|
* // mv.visitLocalVariable("this", "LTestIf;", null, l0, l2, 0); //
|
||||||
|
* mv.visitLocalVariable("b", "Ljava/lang/Boolean;", null, l0, l2, 1);
|
||||||
|
* mv.visitMaxs(2, 2); mv.visitEnd();
|
||||||
|
*
|
||||||
|
* cw.visitEnd(); byte[] b = cw.toByteArray();
|
||||||
|
*/
|
||||||
|
FileOutputStream output;
|
||||||
|
|
||||||
|
try {
|
||||||
|
output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/TestClass.class"));
|
||||||
|
output.write(b);
|
||||||
|
output.close();
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
8
src/de/dhbwstuttgart/bytecode/TestClass.java
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
public class TestClass {
|
||||||
|
public TestClass() {
|
||||||
|
Runnable lam = () -> System.out.println("lambda");
|
||||||
|
lam.run();
|
||||||
|
}
|
||||||
|
}
|
59
src/de/dhbwstuttgart/bytecode/TestFields.java
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.objectweb.asm.ClassWriter;
|
||||||
|
import org.objectweb.asm.FieldVisitor;
|
||||||
|
import org.objectweb.asm.MethodVisitor;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
import org.objectweb.asm.Type;
|
||||||
|
|
||||||
|
public class TestFields {
|
||||||
|
private static final String rootDirectory = System.getProperty("user.dir") + "/bin/de/dhbwstuttgart/bytecode/";
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
|
||||||
|
cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, "TetsF", null, "java/lang/Object", null);
|
||||||
|
|
||||||
|
cw.visitSource("TetsF.java", null);
|
||||||
|
|
||||||
|
FieldVisitor fv = cw.visitField(Opcodes.ACC_PRIVATE, "z", Type.INT_TYPE.getDescriptor(), null, null);
|
||||||
|
fv.visitEnd();
|
||||||
|
|
||||||
|
FieldVisitor fvS = cw.visitField(Opcodes.ACC_PUBLIC, "s", "Ljava/lang/String;", null, null);
|
||||||
|
fvS.visitEnd();
|
||||||
|
// Create Constructor
|
||||||
|
MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
|
||||||
|
mv.visitCode();
|
||||||
|
|
||||||
|
mv.visitVarInsn(Opcodes.ALOAD, 0);
|
||||||
|
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
|
||||||
|
mv.visitVarInsn(Opcodes.ALOAD, 0);
|
||||||
|
mv.visitLdcInsn("");
|
||||||
|
mv.visitFieldInsn(Opcodes.PUTFIELD, "TetsF", "s", "Ljava/lang/String;");
|
||||||
|
mv.visitInsn(Opcodes.RETURN);
|
||||||
|
mv.visitMaxs(2, 1);
|
||||||
|
mv.visitEnd();
|
||||||
|
|
||||||
|
byte[] b = cw.toByteArray();
|
||||||
|
|
||||||
|
FileOutputStream output;
|
||||||
|
|
||||||
|
try {
|
||||||
|
output = new FileOutputStream(new File(System.getProperty("user.dir") + "/testBytecode/TetsF.class"));
|
||||||
|
output.write(b);
|
||||||
|
output.close();
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
11
src/de/dhbwstuttgart/bytecode/TestIf.java
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
public class TestIf {
|
||||||
|
public TestIf(Boolean b) {
|
||||||
|
if(b) {
|
||||||
|
System.out.println("1");
|
||||||
|
}else {
|
||||||
|
System.out.println("0");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
src/de/dhbwstuttgart/bytecode/TestMeth.java
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
public class TestMeth {
|
||||||
|
private int z;
|
||||||
|
public String s;
|
||||||
|
public TestMeth(int temp) {
|
||||||
|
this.z = temp;
|
||||||
|
}
|
||||||
|
public void m1(int a, int b) {
|
||||||
|
int y = m2(1,2,3,4);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int m2(int a, int b, int x, int y) {
|
||||||
|
Integer c = 55;
|
||||||
|
Integer g;
|
||||||
|
return a+b+y+c;
|
||||||
|
}
|
||||||
|
}
|
6
src/de/dhbwstuttgart/bytecode/TetsF.java
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package de.dhbwstuttgart.bytecode;
|
||||||
|
|
||||||
|
public class TetsF {
|
||||||
|
private int z;
|
||||||
|
public String s = "";
|
||||||
|
}
|
103
src/de/dhbwstuttgart/core/JavaTXCompiler.java
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
package de.dhbwstuttgart.core;
|
||||||
|
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.environment.CompilationEnvironment;
|
||||||
|
import de.dhbwstuttgart.parser.JavaTXParser;
|
||||||
|
import de.dhbwstuttgart.parser.scope.GenericsRegistry;
|
||||||
|
import de.dhbwstuttgart.parser.SyntaxTreeGenerator.SyntaxTreeGenerator;
|
||||||
|
import de.dhbwstuttgart.parser.antlr.Java8Parser.CompilationUnitContext;
|
||||||
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
|
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.factory.ASTFactory;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.factory.UnifyTypeFactory;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
|
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
||||||
|
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
||||||
|
import de.dhbwstuttgart.typeinference.constraints.Pair;
|
||||||
|
import de.dhbwstuttgart.typeinference.result.ResultSet;
|
||||||
|
import de.dhbwstuttgart.typeinference.typeAlgo.TYPE;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.TypeUnify;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.FiniteClosure;
|
||||||
|
import de.dhbwstuttgart.typeinference.unify.model.UnifyPair;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class JavaTXCompiler {
|
||||||
|
|
||||||
|
final CompilationEnvironment environment;
|
||||||
|
public final Map<File, SourceFile> sourceFiles = new HashMap<>();
|
||||||
|
|
||||||
|
public JavaTXCompiler(File sourceFile) throws IOException, ClassNotFoundException {
|
||||||
|
this(Arrays.asList(sourceFile));
|
||||||
|
}
|
||||||
|
|
||||||
|
public JavaTXCompiler(List<File> sources) throws IOException, ClassNotFoundException {
|
||||||
|
environment = new CompilationEnvironment(sources);
|
||||||
|
for(File s : sources){
|
||||||
|
sourceFiles.put(s,parse(s));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ResultSet> typeInference() throws ClassNotFoundException {
|
||||||
|
List<ClassOrInterface> allClasses = new ArrayList<>();//environment.getAllAvailableClasses();
|
||||||
|
for(SourceFile sf : sourceFiles.values()){
|
||||||
|
allClasses.addAll(sf.getClasses());
|
||||||
|
}
|
||||||
|
List<ClassOrInterface> importedClasses = new ArrayList<>();
|
||||||
|
//Alle Importierten Klassen in allen geparsten Sourcefiles kommen ins FC
|
||||||
|
for(File forSourceFile : sourceFiles.keySet())
|
||||||
|
for(JavaClassName name : sourceFiles.get(forSourceFile).getImports()){
|
||||||
|
ClassOrInterface importedClass = ASTFactory.createClass(
|
||||||
|
ClassLoader.getSystemClassLoader().loadClass(name.toString()));
|
||||||
|
importedClasses.add(importedClass);
|
||||||
|
}
|
||||||
|
allClasses.addAll(importedClasses);
|
||||||
|
FiniteClosure finiteClosure = UnifyTypeFactory.generateFC(allClasses);
|
||||||
|
|
||||||
|
final ConstraintSet<Pair> cons = new TYPE(sourceFiles.values(), allClasses).getConstraints();
|
||||||
|
ConstraintSet<UnifyPair> unifyCons = UnifyTypeFactory.convert(cons);
|
||||||
|
|
||||||
|
TypeUnify unify = new TypeUnify();
|
||||||
|
Set<Set<UnifyPair>> results = new HashSet<>();
|
||||||
|
for(List<Constraint<UnifyPair>> xCons : unifyCons.cartesianProduct()){
|
||||||
|
Set<UnifyPair> xConsSet = new HashSet<>();
|
||||||
|
for(Constraint<UnifyPair> constraint : xCons){
|
||||||
|
xConsSet.addAll(constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
//System.out.println(xConsSet);
|
||||||
|
Set<Set<UnifyPair>> result = unify.unify(xConsSet, finiteClosure);
|
||||||
|
//System.out.println("RESULT: " + result);
|
||||||
|
results.addAll(result);
|
||||||
|
}
|
||||||
|
return results.stream().map((unifyPairs ->
|
||||||
|
new ResultSet(UnifyTypeFactory.convert(unifyPairs, generateTPHMap(cons))))).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, TypePlaceholder> generateTPHMap(ConstraintSet<Pair> constraints){
|
||||||
|
HashMap<String, TypePlaceholder> ret = new HashMap<>();
|
||||||
|
constraints.map((Pair p)->{
|
||||||
|
if(p.TA1 instanceof TypePlaceholder){
|
||||||
|
ret.put(((TypePlaceholder)p.TA1).getName(), (TypePlaceholder) p.TA1);
|
||||||
|
}
|
||||||
|
if(p.TA2 instanceof TypePlaceholder){
|
||||||
|
ret.put(((TypePlaceholder)p.TA2).getName(), (TypePlaceholder) p.TA2);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
private SourceFile parse(File sourceFile) throws IOException, java.lang.ClassNotFoundException {
|
||||||
|
CompilationUnitContext tree = JavaTXParser.parse(sourceFile);
|
||||||
|
SyntaxTreeGenerator generator = new SyntaxTreeGenerator(environment.getRegistry(sourceFile), new GenericsRegistry(null));
|
||||||
|
SourceFile ret = generator.convert(tree);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -5,7 +5,10 @@ import java.io.IOException;
|
|||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLClassLoader;
|
import java.net.URLClassLoader;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
||||||
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
||||||
@@ -32,7 +35,6 @@ import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
|||||||
public class CompilationEnvironment {
|
public class CompilationEnvironment {
|
||||||
private final List<URL> librarys;
|
private final List<URL> librarys;
|
||||||
private final List<File> sourceFiles;
|
private final List<File> sourceFiles;
|
||||||
public final PackageCrawler packageCrawler;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Imitiert die Environment beim Aufruf des JavaCompilers auf einer Menge von java-Dateien
|
* Imitiert die Environment beim Aufruf des JavaCompilers auf einer Menge von java-Dateien
|
||||||
@@ -40,46 +42,22 @@ public class CompilationEnvironment {
|
|||||||
* @param sourceFiles die zu kompilierenden Dateien
|
* @param sourceFiles die zu kompilierenden Dateien
|
||||||
*/
|
*/
|
||||||
public CompilationEnvironment(List<File> sourceFiles) {
|
public CompilationEnvironment(List<File> sourceFiles) {
|
||||||
/**
|
String bootClassPath = System.getProperty("sun.boot.class.path");
|
||||||
* Java 9 bringt einige Änderungen am Classloader
|
librarys = new ArrayList<>();
|
||||||
* So funktioniert der BootClassLoader nicht mehr.
|
for(String path : bootClassPath.split(File.pathSeparator)) {
|
||||||
* hier gibts ein paar Quellen zum nachlesen:
|
try {
|
||||||
* http://java9.wtf/class-loading/
|
librarys.add(new URL("file:"+path));
|
||||||
* https://stackoverflow.com/questions/46494112/classloaders-hierarchy-in-java-9
|
} catch (MalformedURLException e) {
|
||||||
*
|
new DebugException("Fehler im Classpath auf diesem System");
|
||||||
*/
|
|
||||||
//String bootClassPath = System.getProperty("sun.boot.class.path");
|
|
||||||
// ClassLoader cl = ClassLoader.getPlatformClassLoader();
|
|
||||||
ClassLoader cl = ClassLoader.getSystemClassLoader();
|
|
||||||
String bootClassPath = System.getProperty("java.class.path");
|
|
||||||
librarys = new ArrayList<>();
|
|
||||||
for(String path : bootClassPath.split(File.pathSeparator)) {
|
|
||||||
try {
|
|
||||||
librarys.add(new URL("file:"+path));
|
|
||||||
} catch (MalformedURLException e) {
|
|
||||||
new DebugException("Fehler im Classpath auf diesem System");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//URLClassLoader loader = new URLClassLoader(new URL[0], cl);
|
}
|
||||||
//librarys = Arrays.asList(loader.getURLs());
|
|
||||||
|
|
||||||
this.sourceFiles = sourceFiles;
|
this.sourceFiles = sourceFiles;
|
||||||
this.packageCrawler = new PackageCrawler(librarys);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public JavaClassRegistry getRegistry(File forSourceFile) throws ClassNotFoundException, IOException {
|
public JavaClassRegistry getRegistry(File forSourceFile) throws ClassNotFoundException, IOException {
|
||||||
Map<String, Integer> allNames;
|
List<String> allNames;
|
||||||
CompilationUnitContext tree = JavaTXParser.parse(forSourceFile);
|
CompilationUnitContext tree = JavaTXParser.parse(forSourceFile);
|
||||||
allNames = GatherNames.getNames(tree, packageCrawler);
|
allNames = GatherNames.getNames(tree, new PackageCrawler(librarys));
|
||||||
return new JavaClassRegistry(allNames);
|
return new JavaClassRegistry(allNames);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<ClassOrInterface> getAllAvailableClasses() {
|
|
||||||
List<ClassOrInterface> ret = new ArrayList<>();
|
|
||||||
for(Class c : new PackageCrawler(librarys).getAllAvailableClasses()){
|
|
||||||
ret.add(ASTFactory.createClass(c));
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
@@ -1,7 +1,9 @@
|
|||||||
package de.dhbwstuttgart.environment;
|
package de.dhbwstuttgart.environment;
|
||||||
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.reflections.Reflections;
|
import org.reflections.Reflections;
|
||||||
import org.reflections.scanners.ResourcesScanner;
|
import org.reflections.scanners.ResourcesScanner;
|
||||||
@@ -10,7 +12,6 @@ import org.reflections.util.ConfigurationBuilder;
|
|||||||
import org.reflections.util.FilterBuilder;
|
import org.reflections.util.FilterBuilder;
|
||||||
|
|
||||||
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
import org.reflections.vfs.SystemDir;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hilft beim Durchsuchen von Packages
|
* Hilft beim Durchsuchen von Packages
|
||||||
@@ -53,24 +54,11 @@ public class PackageCrawler {
|
|||||||
return classes;
|
return classes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<Class<?>> getAllAvailableClasses(){
|
public List<String> getClassNames(String packageName){
|
||||||
Reflections reflections = new Reflections(new ConfigurationBuilder()
|
List<String> nameList = new ArrayList();
|
||||||
.setScanners(new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner())
|
|
||||||
.setUrls(urls));
|
|
||||||
|
|
||||||
Set<Class<?>> classes = reflections.getSubTypesOf(Object.class);
|
|
||||||
|
|
||||||
return classes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Map<String, Integer> getClassNames(String packageName){
|
|
||||||
Map<String, Integer> nameList = new HashMap<>();
|
|
||||||
Set<Class<?>> classes = getClassesInPackage(packageName);
|
Set<Class<?>> classes = getClassesInPackage(packageName);
|
||||||
if(packageName.equals("java.lang") && ! classes.contains(Object.class)) {
|
|
||||||
classes.add(Object.class);
|
|
||||||
}
|
|
||||||
for(Class c : classes){
|
for(Class c : classes){
|
||||||
nameList.put(c.getName(), c.getTypeParameters().length);
|
nameList.add(c.getName());
|
||||||
}
|
}
|
||||||
return nameList;
|
return nameList;
|
||||||
}
|
}
|
@@ -29,7 +29,7 @@ public class JavaTXParser {
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Für das Typsystem ist es notwendig, dass sich der Source in einer Datei befindet:
|
/* Für das Typsystem ist es notwendig, dass sich der Source in einer Datei befindet:
|
||||||
public SourceFile parse(String fileContent) throws IOException, java.lang.ClassNotFoundException {
|
public SourceFile parse(String fileContent) throws IOException, java.lang.ClassNotFoundException {
|
||||||
return this.parse(new ByteArrayInputStream(fileContent.getBytes(StandardCharsets.UTF_8)));
|
return this.parse(new ByteArrayInputStream(fileContent.getBytes(StandardCharsets.UTF_8)));
|
||||||
}
|
}
|
@@ -3,8 +3,8 @@ package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
|||||||
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
|
|
||||||
public class GenericContext {
|
public class GenericContext {
|
||||||
private final String parentMethod;
|
public final String parentMethod;
|
||||||
private final JavaClassName parentClass;
|
public final JavaClassName parentClass;
|
||||||
|
|
||||||
public GenericContext(JavaClassName parentClass, String parentMethod) {
|
public GenericContext(JavaClassName parentClass, String parentMethod) {
|
||||||
if(parentMethod == null)parentMethod = "";
|
if(parentMethod == null)parentMethod = "";
|
@@ -7,7 +7,7 @@ import de.dhbwstuttgart.parser.scope.GenericsRegistry;
|
|||||||
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
||||||
import de.dhbwstuttgart.syntaxtree.*;
|
import de.dhbwstuttgart.syntaxtree.*;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.*;
|
import de.dhbwstuttgart.syntaxtree.statement.*;
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.UnaryExpr.Operation;
|
import de.dhbwstuttgart.syntaxtree.statement.literal.*;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
@@ -21,14 +21,12 @@ import java.util.*;
|
|||||||
public class StatementGenerator {
|
public class StatementGenerator {
|
||||||
|
|
||||||
private JavaClassRegistry reg;
|
private JavaClassRegistry reg;
|
||||||
private Map<String, RefTypeOrTPHOrWildcardOrGeneric> fields; //PL 2018-11-01 fields eingefuegt, damit die fields immer die gleiche TPH bekommen
|
|
||||||
private Map<String, RefTypeOrTPHOrWildcardOrGeneric> localVars;
|
private Map<String, RefTypeOrTPHOrWildcardOrGeneric> localVars;
|
||||||
private GenericsRegistry generics;
|
private GenericsRegistry generics;
|
||||||
|
|
||||||
public StatementGenerator(JavaClassRegistry reg, GenericsRegistry generics, Map<String, RefTypeOrTPHOrWildcardOrGeneric> fields, Map<String, RefTypeOrTPHOrWildcardOrGeneric> localVars){
|
public StatementGenerator(JavaClassRegistry reg, GenericsRegistry generics, Map<String, RefTypeOrTPHOrWildcardOrGeneric> localVars){
|
||||||
this.reg = reg;
|
this.reg = reg;
|
||||||
this.generics = generics;
|
this.generics = generics;
|
||||||
this.fields = fields;
|
|
||||||
this.localVars = localVars;
|
this.localVars = localVars;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,7 +94,7 @@ public class StatementGenerator {
|
|||||||
|
|
||||||
private Statement convert(Java8Parser.StatementWithoutTrailingSubstatementContext stmt) {
|
private Statement convert(Java8Parser.StatementWithoutTrailingSubstatementContext stmt) {
|
||||||
if(stmt.block() != null){
|
if(stmt.block() != null){
|
||||||
return convert(stmt.block(), false);
|
return convert(stmt.block());
|
||||||
}else if(stmt.emptyStatement() != null){
|
}else if(stmt.emptyStatement() != null){
|
||||||
return new EmptyStmt(stmt.getStart());
|
return new EmptyStmt(stmt.getStart());
|
||||||
}else if(stmt.expressionStatement() != null){
|
}else if(stmt.expressionStatement() != null){
|
||||||
@@ -122,14 +120,14 @@ public class StatementGenerator {
|
|||||||
}else throw new NotImplementedException();
|
}else throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Block convert(Java8Parser.BlockContext block, boolean addTrailingReturn) {
|
public Block convert(Java8Parser.BlockContext block) {
|
||||||
List<Statement> statements = new ArrayList<>();
|
List<Statement> statements = new ArrayList<>();
|
||||||
if(block.blockStatements() != null)
|
if(block.blockStatements() != null)
|
||||||
for(Java8Parser.BlockStatementContext statementContext : block.blockStatements().blockStatement()){
|
for(Java8Parser.BlockStatementContext statementContext : block.blockStatements().blockStatement()){
|
||||||
List<Statement> stmt = convert(statementContext);
|
List<Statement> stmt = convert(statementContext);
|
||||||
statements.addAll(stmt);
|
statements.addAll(stmt);
|
||||||
}
|
}
|
||||||
if(addTrailingReturn)statements = SyntacticSugar.addTrailingReturn(statements);
|
statements = SyntacticSugar.addTrailingReturn(statements);
|
||||||
return new Block(statements, block.getStart());
|
return new Block(statements, block.getStart());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,14 +178,6 @@ public class StatementGenerator {
|
|||||||
}else throw new NotImplementedException();
|
}else throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Receiver getReceiver(Expression expr){
|
|
||||||
if(expr instanceof StaticClassName){
|
|
||||||
return (Receiver) expr;
|
|
||||||
}else {
|
|
||||||
return new ExpressionReceiver(expr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Statement convert(Java8Parser.MethodInvocationContext methodInvocationContext) {
|
private Statement convert(Java8Parser.MethodInvocationContext methodInvocationContext) {
|
||||||
String name;
|
String name;
|
||||||
if(methodInvocationContext.methodName()!=null){
|
if(methodInvocationContext.methodName()!=null){
|
||||||
@@ -209,7 +199,7 @@ public class StatementGenerator {
|
|||||||
}else throw new NotImplementedException();
|
}else throw new NotImplementedException();
|
||||||
|
|
||||||
ArgumentList argumentList = convert(methodInvocationContext.argumentList());
|
ArgumentList argumentList = convert(methodInvocationContext.argumentList());
|
||||||
MethodCall ret = new MethodCall(TypePlaceholder.fresh(methodInvocationContext.getStart()), getReceiver(receiver), name, argumentList, methodInvocationContext.getStart());
|
MethodCall ret = new MethodCall(TypePlaceholder.fresh(methodInvocationContext.getStart()),new Receiver(receiver), name, argumentList, methodInvocationContext.getStart());
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,14 +230,9 @@ public class StatementGenerator {
|
|||||||
if(localVars.get(expression) != null){
|
if(localVars.get(expression) != null){
|
||||||
return new LocalVar(expression, localVars.get(expression), offset);
|
return new LocalVar(expression, localVars.get(expression), offset);
|
||||||
}else{
|
}else{
|
||||||
if(fields.get(expression) != null){//PL 2018-11-01 fields eingefuegt, damit die fields immer die gleiche TPH bekommen
|
|
||||||
return new FieldVar(new This(offset), expression, fields.get(expression), offset);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
//kann eigentlich nicht vorkommen
|
|
||||||
//Dann Muss es ein Feld sein!
|
//Dann Muss es ein Feld sein!
|
||||||
return new FieldVar(new This(offset), expression, TypePlaceholder.fresh(offset), offset);
|
return new FieldVar(new This(offset), expression, TypePlaceholder.fresh(offset), offset);
|
||||||
}}
|
}
|
||||||
}
|
}
|
||||||
return generateFieldVarOrClassname(expression, offset);
|
return generateFieldVarOrClassname(expression, offset);
|
||||||
}
|
}
|
||||||
@@ -285,24 +270,23 @@ public class StatementGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Statement convert(Java8Parser.PreIncrementExpressionContext stmt) {
|
private Statement convert(Java8Parser.PreIncrementExpressionContext stmt) {
|
||||||
Expression argument = convert(stmt.unaryExpression());
|
//TODO
|
||||||
Token offset = stmt.getStart();
|
throw new NotImplementedException();
|
||||||
return new UnaryExpr(UnaryExpr.Operation.PREINCREMENT, argument, TypePlaceholder.fresh(offset), offset);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Statement convert(Java8Parser.PreDecrementExpressionContext stmt) {
|
private Statement convert(Java8Parser.PreDecrementExpressionContext stmt) {
|
||||||
return new UnaryExpr(UnaryExpr.Operation.PREDECREMENT, convert(stmt.unaryExpression()),
|
//TODO
|
||||||
TypePlaceholder.fresh(stmt.getStart()), stmt.getStart());
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Statement convert(Java8Parser.PostIncrementExpressionContext stmt) {
|
private Statement convert(Java8Parser.PostIncrementExpressionContext stmt) {
|
||||||
return new UnaryExpr(UnaryExpr.Operation.POSTINCREMENT, convert(stmt.postfixExpression()),
|
//TODO
|
||||||
TypePlaceholder.fresh(stmt.getStart()), stmt.getStart());
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Statement convert(Java8Parser.PostDecrementExpressionContext stmt) {
|
private Statement convert(Java8Parser.PostDecrementExpressionContext stmt) {
|
||||||
return new UnaryExpr(UnaryExpr.Operation.POSTDECREMENT, convert(stmt.postfixExpression()),
|
//TODO
|
||||||
TypePlaceholder.fresh(stmt.getStart()), stmt.getStart());
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Statement convert(Java8Parser.AssignmentContext stmt) {
|
private Statement convert(Java8Parser.AssignmentContext stmt) {
|
||||||
@@ -323,10 +307,8 @@ public class StatementGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Statement convert(Java8Parser.IfThenElseStatementContext stmt){
|
private Statement convert(Java8Parser.IfThenElseStatementContext stmt){
|
||||||
Expression expr = convert(stmt.expression());
|
//TODO
|
||||||
Statement thenBlock = convert(stmt.statementNoShortIf());
|
throw new NotImplementedException();
|
||||||
Statement elseBlock = convert(stmt.statement());
|
|
||||||
return new IfStmt(TypePlaceholder.fresh(stmt.getStart()), expr, thenBlock, elseBlock, stmt.getStart());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Statement convert(Java8Parser.IfThenElseStatementNoShortIfContext stmt){
|
private Statement convert(Java8Parser.IfThenElseStatementNoShortIfContext stmt){
|
||||||
@@ -412,7 +394,7 @@ public class StatementGenerator {
|
|||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
RefTypeOrTPHOrWildcardOrGeneric type;
|
RefTypeOrTPHOrWildcardOrGeneric type;
|
||||||
if(declaration.unannTypeOrAuto().unannType() == null){
|
if(declaration.unannTypeOrAuto().unannType()==null){
|
||||||
type = TypePlaceholder.fresh(declaration.getStart());
|
type = TypePlaceholder.fresh(declaration.getStart());
|
||||||
}else{
|
}else{
|
||||||
type = TypeGenerator.convert(declaration.unannTypeOrAuto().unannType(), reg, generics);
|
type = TypeGenerator.convert(declaration.unannTypeOrAuto().unannType(), reg, generics);
|
||||||
@@ -452,7 +434,7 @@ public class StatementGenerator {
|
|||||||
}
|
}
|
||||||
return (new Assign(new AssignToField(
|
return (new Assign(new AssignToField(
|
||||||
new FieldVar(new This(varDecl.getStart()), name.getText(),
|
new FieldVar(new This(varDecl.getStart()), name.getText(),
|
||||||
type, varDecl.getStart())),
|
new Void(varDecl.getStart()), varDecl.getStart())),
|
||||||
initValue, name.getSymbol()));
|
initValue, name.getSymbol()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -550,7 +532,8 @@ public class StatementGenerator {
|
|||||||
if(expression.conditionalOrExpression() == null){
|
if(expression.conditionalOrExpression() == null){
|
||||||
return convert(expression.conditionalAndExpression());
|
return convert(expression.conditionalAndExpression());
|
||||||
}else{
|
}else{
|
||||||
throw new NotImplementedException();
|
return new Binary(convert(expression.conditionalOrExpression()),
|
||||||
|
convert(expression.conditionalAndExpression()), Binary.Operator.OR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -558,7 +541,8 @@ public class StatementGenerator {
|
|||||||
if(expression.conditionalAndExpression() == null){
|
if(expression.conditionalAndExpression() == null){
|
||||||
return convert(expression.inclusiveOrExpression());
|
return convert(expression.inclusiveOrExpression());
|
||||||
}else{
|
}else{
|
||||||
throw new NotImplementedException();
|
return new Binary(convert(expression.conditionalAndExpression()),
|
||||||
|
convert(expression.inclusiveOrExpression()), Binary.Operator.AND);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -590,55 +574,16 @@ public class StatementGenerator {
|
|||||||
if(expression.equalityExpression() == null){
|
if(expression.equalityExpression() == null){
|
||||||
return convert(expression.relationalExpression());
|
return convert(expression.relationalExpression());
|
||||||
}else{
|
}else{
|
||||||
String operator = expression.getChild(1).getText();
|
throw new NotImplementedException();
|
||||||
Expression leftSide = convert(expression.equalityExpression());
|
|
||||||
Expression rightSide = convert(expression.relationalExpression());
|
|
||||||
return new BinaryExpr(convertBinaryOperator(operator), TypePlaceholder.fresh(expression.getStart()), leftSide, rightSide, expression.getStart());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Expression convert(Java8Parser.RelationalExpressionContext expression) {
|
private Expression convert(Java8Parser.RelationalExpressionContext expression) {
|
||||||
if(expression.relationalExpression() == null) {
|
if(expression.relationalExpression() == null){
|
||||||
return convert(expression.shiftExpression());
|
return convert(expression.shiftExpression());
|
||||||
}else {
|
}else{
|
||||||
String operator = expression.getChild(1).getText();
|
throw new NotImplementedException();
|
||||||
return new BinaryExpr(convertBinaryOperator(operator), TypePlaceholder.fresh(expression.getStart()),
|
|
||||||
convert(expression.relationalExpression()),
|
|
||||||
convert(expression.shiftExpression()), expression.getStart());
|
|
||||||
}
|
}
|
||||||
//}else throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
private BinaryExpr.Operator convertBinaryOperator(String operator) {
|
|
||||||
//return BinaryExpr.Operator.ADD;
|
|
||||||
if(operator.equals("+")) {
|
|
||||||
return BinaryExpr.Operator.ADD;
|
|
||||||
}else if(operator.equals("-")) {
|
|
||||||
return BinaryExpr.Operator.SUB;
|
|
||||||
}else if(operator.equals("*")) {
|
|
||||||
return BinaryExpr.Operator.MUL;
|
|
||||||
}else if(operator.equals("&")) {
|
|
||||||
return BinaryExpr.Operator.AND;
|
|
||||||
}else if(operator.equals("|")) {
|
|
||||||
return BinaryExpr.Operator.OR;
|
|
||||||
}else if(operator.equals("/")) {
|
|
||||||
return BinaryExpr.Operator.DIV;
|
|
||||||
}else if(operator.equals("<")) {
|
|
||||||
return BinaryExpr.Operator.LESSTHAN;
|
|
||||||
}else if(operator.equals(">")) {
|
|
||||||
return BinaryExpr.Operator.BIGGERTHAN;
|
|
||||||
}else if(operator.equals(">=")) {
|
|
||||||
return BinaryExpr.Operator.BIGGEREQUAL;
|
|
||||||
} else if(operator.equals("<=")) {
|
|
||||||
return BinaryExpr.Operator.LESSEQUAL;
|
|
||||||
} else if(operator.equals("==")) {
|
|
||||||
return BinaryExpr.Operator.EQUAL;
|
|
||||||
} else if(operator.equals("!=")) {
|
|
||||||
return BinaryExpr.Operator.NOTEQUAL;
|
|
||||||
} else {
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
// throw new NotImplementedException();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Expression convert(Java8Parser.ShiftExpressionContext expression) {
|
private Expression convert(Java8Parser.ShiftExpressionContext expression) {
|
||||||
@@ -650,15 +595,10 @@ public class StatementGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Expression convert(Java8Parser.AdditiveExpressionContext expression) {
|
private Expression convert(Java8Parser.AdditiveExpressionContext expression) {
|
||||||
|
|
||||||
if(expression.additiveExpression() == null){
|
if(expression.additiveExpression() == null){
|
||||||
return convert(expression.multiplicativeExpression());
|
return convert(expression.multiplicativeExpression());
|
||||||
}else {
|
}else{
|
||||||
Expression leftSide = convert(expression.additiveExpression());
|
throw new NotImplementedException();
|
||||||
Expression rightSide = convert(expression.multiplicativeExpression());
|
|
||||||
BinaryExpr.Operator op = convertBinaryOperator(expression.getChild(1).getText());
|
|
||||||
Token offset = expression.getStart();
|
|
||||||
return new BinaryExpr(op, TypePlaceholder.fresh(expression.getStart()), leftSide, rightSide, offset);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -666,11 +606,7 @@ public class StatementGenerator {
|
|||||||
if(expression.multiplicativeExpression() == null){
|
if(expression.multiplicativeExpression() == null){
|
||||||
return convert(expression.unaryExpression());
|
return convert(expression.unaryExpression());
|
||||||
}else{
|
}else{
|
||||||
Expression leftSide = convert(expression.multiplicativeExpression());
|
throw new NotImplementedException();
|
||||||
Expression rightSide = convert(expression.unaryExpression());
|
|
||||||
BinaryExpr.Operator op = convertBinaryOperator(expression.getChild(1).getText());
|
|
||||||
Token offset = expression.getStart();
|
|
||||||
return new BinaryExpr(op, TypePlaceholder.fresh(offset), leftSide, rightSide, offset);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -682,11 +618,9 @@ public class StatementGenerator {
|
|||||||
}else if(expression.unaryExpressionNotPlusMinus() != null){
|
}else if(expression.unaryExpressionNotPlusMinus() != null){
|
||||||
return convert(expression.unaryExpressionNotPlusMinus());
|
return convert(expression.unaryExpressionNotPlusMinus());
|
||||||
}else if(expression.getText().startsWith("+")){
|
}else if(expression.getText().startsWith("+")){
|
||||||
return new UnaryExpr(UnaryExpr.Operation.PLUS, convert(expression.unaryExpression()),
|
return new UnaryPlus(convert(expression.unaryExpression()));
|
||||||
TypePlaceholder.fresh(expression.getStart()), expression.getStart());
|
|
||||||
}else if(expression.getText().startsWith("-")){
|
}else if(expression.getText().startsWith("-")){
|
||||||
return new UnaryExpr(UnaryExpr.Operation.MINUS, convert(expression.unaryExpression()),
|
return new UnaryMinus(convert(expression.unaryExpression()));
|
||||||
TypePlaceholder.fresh(expression.getStart()), expression.getStart());
|
|
||||||
}else{
|
}else{
|
||||||
//Diese Exceptions sollte nie geworfen werden.
|
//Diese Exceptions sollte nie geworfen werden.
|
||||||
//Der Code wurde nur noch nicht getestet. Sollte zur Sicherheit drin bleiben.
|
//Der Code wurde nur noch nicht getestet. Sollte zur Sicherheit drin bleiben.
|
||||||
@@ -729,10 +663,10 @@ public class StatementGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(Java8Parser.PostIncrementExpression_lf_postfixExpressionContext inc : expression.postIncrementExpression_lf_postfixExpression()){
|
for(Java8Parser.PostIncrementExpression_lf_postfixExpressionContext inc : expression.postIncrementExpression_lf_postfixExpression()){
|
||||||
expr = new UnaryExpr(UnaryExpr.Operation.POSTINCREMENT, expr, TypePlaceholder.fresh(inc.getStart()), inc.getStart());
|
expr = new PostIncExpr(expr);
|
||||||
}
|
}
|
||||||
for(Java8Parser.PostDecrementExpression_lf_postfixExpressionContext dec : expression.postDecrementExpression_lf_postfixExpression()){
|
for(Java8Parser.PostDecrementExpression_lf_postfixExpressionContext dec : expression.postDecrementExpression_lf_postfixExpression()){
|
||||||
expr = new UnaryExpr(UnaryExpr.Operation.POSTDECREMENT, expr, TypePlaceholder.fresh(dec.getStart()), dec.getStart());
|
expr = new PostDecExpr(expr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return expr;
|
return expr;
|
||||||
@@ -758,7 +692,6 @@ public class StatementGenerator {
|
|||||||
if(e.classInstanceCreationExpression_lf_primary() != null){
|
if(e.classInstanceCreationExpression_lf_primary() != null){
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}else if(e.fieldAccess_lf_primary() != null){
|
}else if(e.fieldAccess_lf_primary() != null){
|
||||||
|
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}else if(e.arrayAccess_lf_primary() != null){
|
}else if(e.arrayAccess_lf_primary() != null){
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
@@ -767,7 +700,7 @@ public class StatementGenerator {
|
|||||||
}else {
|
}else {
|
||||||
Java8Parser.MethodInvocation_lf_primaryContext ctxt = e.methodInvocation_lf_primary();
|
Java8Parser.MethodInvocation_lf_primaryContext ctxt = e.methodInvocation_lf_primary();
|
||||||
String methodName = ctxt.Identifier().toString();
|
String methodName = ctxt.Identifier().toString();
|
||||||
return new MethodCall(TypePlaceholder.fresh(e.getStart()), getReceiver(expr), methodName, convert(ctxt.argumentList()), e.getStart());
|
return new MethodCall(TypePlaceholder.fresh(e.getStart()), new Receiver(expr), methodName, convert(ctxt.argumentList()), e.getStart());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -813,6 +746,8 @@ public class StatementGenerator {
|
|||||||
if(newExpression.typeArgumentsOrDiamond()!= null){
|
if(newExpression.typeArgumentsOrDiamond()!= null){
|
||||||
if(newExpression.typeArgumentsOrDiamond().typeArguments()!=null){
|
if(newExpression.typeArgumentsOrDiamond().typeArguments()!=null){
|
||||||
genericArgs = newExpression.typeArgumentsOrDiamond().typeArguments();
|
genericArgs = newExpression.typeArgumentsOrDiamond().typeArguments();
|
||||||
|
}else {
|
||||||
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(newExpression.typeArguments()!= null)throw new NotImplementedException();
|
if(newExpression.typeArguments()!= null)throw new NotImplementedException();
|
||||||
@@ -825,33 +760,27 @@ public class StatementGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Expression convert(Java8Parser.LiteralContext literal) {
|
private Expression convert(Java8Parser.LiteralContext literal) {
|
||||||
if(literal.IntegerLiteral() != null){
|
if(literal.IntegerLiteral() != null || literal.FloatingPointLiteral()!= null){
|
||||||
Number value = Integer.parseInt(literal.IntegerLiteral().getText());
|
Number value = Double.parseDouble(literal.IntegerLiteral().getText());
|
||||||
return new Literal(TypePlaceholder.fresh(literal.getStart()),
|
return new NumberLiteral(TypePlaceholder.fresh(literal.getStart()),
|
||||||
value, literal.getStart());
|
|
||||||
} else if(literal.FloatingPointLiteral()!= null){
|
|
||||||
Number value = Double.parseDouble(literal.FloatingPointLiteral().getText());
|
|
||||||
return new Literal(TypePlaceholder.fresh(literal.getStart()),
|
|
||||||
value, literal.getStart());
|
value, literal.getStart());
|
||||||
}else if(literal.BooleanLiteral() != null){
|
}else if(literal.BooleanLiteral() != null){
|
||||||
RefType type = new RefType(reg.getName("java.lang.Boolean"),literal.getStart());
|
RefType type = new RefType(reg.getName("java.lang.Boolean"),literal.getStart());
|
||||||
return new Literal(type,
|
return new BoolLiteral(type,
|
||||||
Boolean.parseBoolean(literal.BooleanLiteral().getText()),
|
Boolean.parseBoolean(literal.BooleanLiteral().getText()),
|
||||||
literal.getStart());
|
literal.getStart());
|
||||||
}else if(literal.CharacterLiteral() != null){
|
}else if(literal.CharacterLiteral() != null){
|
||||||
RefType type = new RefType(reg.getName("java.lang.Character"),literal.getStart());
|
RefType type = new RefType(reg.getName("java.lang.Character"),literal.getStart());
|
||||||
return new Literal(type,
|
return new CharLiteral(type,
|
||||||
// das gibt immer ' zurück, der Char befindet sich in Position 1
|
literal.CharacterLiteral().getText().charAt(0),
|
||||||
//literal.CharacterLiteral().getText().charAt(0),
|
|
||||||
literal.CharacterLiteral().getText().charAt(1),
|
|
||||||
literal.getStart());
|
literal.getStart());
|
||||||
}else if(literal.StringLiteral()!=null){
|
}else if(literal.StringLiteral()!=null){
|
||||||
RefType type = new RefType(reg.getName("java.lang.String"),literal.getStart());
|
RefType type = new RefType(reg.getName("java.lang.String"),literal.getStart());
|
||||||
return new Literal(type,
|
return new StringLiteral(type,
|
||||||
literal.StringLiteral().getText().substring(1, literal.StringLiteral().getText().length()-1),
|
literal.StringLiteral().getText(),
|
||||||
literal.getStart());
|
literal.getStart());
|
||||||
}else if(literal.NullLiteral() != null){
|
}else if(literal.NullLiteral() != null){
|
||||||
return new Literal(TypePlaceholder.fresh(literal.getStart()), null,
|
return new Null(TypePlaceholder.fresh(literal.getStart()),
|
||||||
literal.getStart());
|
literal.getStart());
|
||||||
}else {
|
}else {
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
@@ -879,7 +808,7 @@ public class StatementGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ArgumentList argumentList = convert(methodInvocationContext.argumentList());
|
ArgumentList argumentList = convert(methodInvocationContext.argumentList());
|
||||||
MethodCall ret = new MethodCall(TypePlaceholder.fresh(methodInvocationContext.getStart()), getReceiver(receiver), name, argumentList, methodInvocationContext.getStart());
|
MethodCall ret = new MethodCall(TypePlaceholder.fresh(methodInvocationContext.getStart()), new Receiver(receiver), name, argumentList, methodInvocationContext.getStart());
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -903,7 +832,7 @@ public class StatementGenerator {
|
|||||||
for(FormalParameter param : params.getFormalparalist()){
|
for(FormalParameter param : params.getFormalparalist()){
|
||||||
lambdaLocals.put(param.getName(), param.getType());
|
lambdaLocals.put(param.getName(), param.getType());
|
||||||
}
|
}
|
||||||
StatementGenerator lambdaGenerator = new StatementGenerator(reg, generics, fields, lambdaLocals);
|
StatementGenerator lambdaGenerator = new StatementGenerator(reg, generics, lambdaLocals);
|
||||||
|
|
||||||
Block block;
|
Block block;
|
||||||
if(expression.lambdaBody().expression() != null){
|
if(expression.lambdaBody().expression() != null){
|
||||||
@@ -912,7 +841,7 @@ public class StatementGenerator {
|
|||||||
expression.lambdaBody().expression().getStart()));
|
expression.lambdaBody().expression().getStart()));
|
||||||
block = new Block(statements, expression.lambdaBody().getStart());
|
block = new Block(statements, expression.lambdaBody().getStart());
|
||||||
}else{
|
}else{
|
||||||
block = lambdaGenerator.convert(expression.lambdaBody().block(), true);
|
block = lambdaGenerator.convert(expression.lambdaBody().block());
|
||||||
}
|
}
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> funNParams = new ArrayList<>();
|
List<RefTypeOrTPHOrWildcardOrGeneric> funNParams = new ArrayList<>();
|
||||||
funNParams.add(TypePlaceholder.fresh(expression.getStart()));//ret-Type
|
funNParams.add(TypePlaceholder.fresh(expression.getStart()));//ret-Type
|
||||||
@@ -920,7 +849,7 @@ public class StatementGenerator {
|
|||||||
funNParams.add(TypePlaceholder.fresh(expression.getStart())));
|
funNParams.add(TypePlaceholder.fresh(expression.getStart())));
|
||||||
RefTypeOrTPHOrWildcardOrGeneric lambdaType = TypePlaceholder.fresh(expression.getStart());
|
RefTypeOrTPHOrWildcardOrGeneric lambdaType = TypePlaceholder.fresh(expression.getStart());
|
||||||
//RefType lambdaType = new RefType(reg.getName("Fun"+params.getFormalparalist().size()),
|
//RefType lambdaType = new RefType(reg.getName("Fun"+params.getFormalparalist().size()),
|
||||||
//funNParams, name.getStart());
|
//funNParams, name.getStart());
|
||||||
return new LambdaExpression(lambdaType, params, block, expression.getStart());
|
return new LambdaExpression(lambdaType, params, block, expression.getStart());
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,9 +1,6 @@
|
|||||||
package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
||||||
|
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
|
||||||
import de.dhbwstuttgart.parser.NullToken;
|
import de.dhbwstuttgart.parser.NullToken;
|
||||||
import de.dhbwstuttgart.syntaxtree.AbstractASTWalker;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.Constructor;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.statement.*;
|
import de.dhbwstuttgart.syntaxtree.statement.*;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -13,27 +10,22 @@ public class SyntacticSugar {
|
|||||||
public static List<Statement> addTrailingReturn(List<Statement> statements){
|
public static List<Statement> addTrailingReturn(List<Statement> statements){
|
||||||
if(statements.size()!=0) {
|
if(statements.size()!=0) {
|
||||||
Statement lastStmt = statements.get(statements.size() - 1);
|
Statement lastStmt = statements.get(statements.size() - 1);
|
||||||
ReturnFinder hasReturn = new ReturnFinder();
|
if (lastStmt instanceof Return) return statements;
|
||||||
lastStmt.accept(hasReturn);
|
if (lastStmt instanceof WhileStmt) {
|
||||||
if(hasReturn.hasReturn)return statements;
|
//TODO
|
||||||
|
//if (hasReturn(((WhileStmt) lastStmt).loopBlock)) return statements;
|
||||||
|
} else if (lastStmt instanceof IfStmt) {
|
||||||
|
if (hasReturn(((IfStmt) lastStmt).then_block)
|
||||||
|
&& hasReturn(((IfStmt) lastStmt).else_block)) return statements;
|
||||||
|
} else if (lastStmt instanceof ForStmt) {
|
||||||
|
if (hasReturn(((ForStmt) lastStmt).body_Loop_block)) return statements;
|
||||||
|
} else {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
statements.add(new ReturnVoid(new NullToken()));
|
statements.add(new ReturnVoid(new NullToken()));
|
||||||
return statements;
|
return statements;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class ReturnFinder extends AbstractASTWalker{
|
|
||||||
public boolean hasReturn = false;
|
|
||||||
@Override
|
|
||||||
public void visit(Return aReturn) {
|
|
||||||
hasReturn = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visit(ReturnVoid aReturn) {
|
|
||||||
hasReturn = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean hasReturn(Block block){
|
private static boolean hasReturn(Block block){
|
||||||
for(Statement s : block.getStatements())
|
for(Statement s : block.getStatements())
|
||||||
if(s instanceof Return)return true;
|
if(s instanceof Return)return true;
|
@@ -1,13 +1,9 @@
|
|||||||
package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
||||||
|
|
||||||
import de.dhbwstuttgart.environment.PackageCrawler;
|
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import java.lang.ClassNotFoundException;
|
import java.lang.ClassNotFoundException;
|
||||||
|
|
||||||
import de.dhbwstuttgart.exceptions.TypeinferenceException;
|
|
||||||
import de.dhbwstuttgart.parser.NullToken;
|
|
||||||
import de.dhbwstuttgart.parser.antlr.Java8Parser;
|
import de.dhbwstuttgart.parser.antlr.Java8Parser;
|
||||||
import de.dhbwstuttgart.parser.scope.GatherNames;
|
|
||||||
import de.dhbwstuttgart.parser.scope.GenericsRegistry;
|
import de.dhbwstuttgart.parser.scope.GenericsRegistry;
|
||||||
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
||||||
@@ -19,9 +15,9 @@ import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
|||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
|
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.sql.Ref;
|
import java.util.ArrayList;
|
||||||
import java.util.*;
|
import java.util.HashMap;
|
||||||
import java.util.stream.Collectors;
|
import java.util.List;
|
||||||
|
|
||||||
//import jdk.internal.dynalink.support.TypeConverterFactory;
|
//import jdk.internal.dynalink.support.TypeConverterFactory;
|
||||||
import org.antlr.v4.runtime.CommonToken;
|
import org.antlr.v4.runtime.CommonToken;
|
||||||
@@ -32,8 +28,7 @@ public class SyntaxTreeGenerator{
|
|||||||
private JavaClassRegistry reg;
|
private JavaClassRegistry reg;
|
||||||
private final GenericsRegistry globalGenerics;
|
private final GenericsRegistry globalGenerics;
|
||||||
private String pkgName = "";
|
private String pkgName = "";
|
||||||
Set<JavaClassName> imports = new HashSet();
|
List<JavaClassName> imports = new ArrayList();
|
||||||
private Map<String, RefTypeOrTPHOrWildcardOrGeneric> fields = new HashMap<>(); //PL 2018-11-01 fields eingefuegt, damit die fields immer die gleiche TPH bekommen
|
|
||||||
|
|
||||||
List<Statement> fieldInitializations = new ArrayList<>();
|
List<Statement> fieldInitializations = new ArrayList<>();
|
||||||
|
|
||||||
@@ -74,11 +69,56 @@ public class SyntaxTreeGenerator{
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SourceFile convert(Java8Parser.CompilationUnitContext ctx, PackageCrawler packageCrawler) throws ClassNotFoundException{
|
public void setImports(Java8Parser.CompilationUnitContext ctx) throws ClassNotFoundException {
|
||||||
if(ctx.packageDeclaration()!=null)this.pkgName = convert(ctx.packageDeclaration());
|
List<JavaClassName> newImports = new ArrayList();
|
||||||
|
for(Java8Parser.ImportDeclarationContext importDeclCtx : ctx.importDeclaration()){
|
||||||
|
if(importDeclCtx.singleTypeImportDeclaration() != null){
|
||||||
|
newImports.add(convertSingleTypeImportDeclaration(importDeclCtx.singleTypeImportDeclaration()));
|
||||||
|
}
|
||||||
|
else if(importDeclCtx.typeImportOnDemandDeclaration() != null){
|
||||||
|
newImports.addAll(convertTypeImportOnDemandDeclaration(importDeclCtx.typeImportOnDemandDeclaration()));
|
||||||
|
}
|
||||||
|
else if(importDeclCtx.singleStaticImportDeclaration() != null){
|
||||||
|
newImports.add(convertSingleStaticImportDeclaration(importDeclCtx.singleStaticImportDeclaration()));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
newImports.addAll(convertStaticImportOnDemandDeclaration(importDeclCtx.staticImportOnDemandDeclaration()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.imports.addAll(newImports);
|
||||||
|
}
|
||||||
|
|
||||||
|
private JavaClassName convertSingleTypeImportDeclaration(Java8Parser.SingleTypeImportDeclarationContext ctx) throws ClassNotFoundException{
|
||||||
|
String typeName = convertTypeName(ctx.typeName());
|
||||||
|
JavaClassName ret = reg.getName(typeName);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<JavaClassName> convertTypeImportOnDemandDeclaration(Java8Parser.TypeImportOnDemandDeclarationContext ctx){
|
||||||
|
return reg.getAllFromPackage(ctx.packageOrTypeName().getText());
|
||||||
|
}
|
||||||
|
|
||||||
|
private JavaClassName convertSingleStaticImportDeclaration(Java8Parser.SingleStaticImportDeclarationContext ctx){
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<JavaClassName> convertStaticImportOnDemandDeclaration(Java8Parser.StaticImportOnDemandDeclarationContext ctx){
|
||||||
|
return reg.getAllFromPackage(ctx.typeName().getText());
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getPackageFromClass(String cls){
|
||||||
|
String ret = "";
|
||||||
|
String[] parts = cls.split("\\.");
|
||||||
|
for(int i = 0; i < parts.length - 1; i++){
|
||||||
|
ret = ret + "." + parts[i];
|
||||||
|
}
|
||||||
|
ret = ret.substring(1);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SourceFile convert(Java8Parser.CompilationUnitContext ctx) throws ClassNotFoundException{
|
||||||
List<ClassOrInterface> classes = new ArrayList<>();
|
List<ClassOrInterface> classes = new ArrayList<>();
|
||||||
Map<String, Integer> imports = GatherNames.getImports(ctx, packageCrawler);
|
this.setImports(ctx);
|
||||||
this.imports = imports.keySet().stream().map(name -> reg.getName(name)).collect(Collectors.toSet());
|
|
||||||
for(Java8Parser.TypeDeclarationContext typeDecl : ctx.typeDeclaration()){
|
for(Java8Parser.TypeDeclarationContext typeDecl : ctx.typeDeclaration()){
|
||||||
ClassOrInterface newClass;
|
ClassOrInterface newClass;
|
||||||
if(typeDecl.classDeclaration() != null){
|
if(typeDecl.classDeclaration() != null){
|
||||||
@@ -92,15 +132,6 @@ public class SyntaxTreeGenerator{
|
|||||||
return new SourceFile(this.pkgName, classes, this.imports);
|
return new SourceFile(this.pkgName, classes, this.imports);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String convert(Java8Parser.PackageDeclarationContext packageDeclarationContext) {
|
|
||||||
String ret = "";
|
|
||||||
for(TerminalNode identifier : packageDeclarationContext.Identifier()){
|
|
||||||
ret += identifier.getText()+".";
|
|
||||||
}
|
|
||||||
ret = ret.substring(0, ret.length()-1);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Method convert(Java8Parser.MethodDeclarationContext methodDeclarationContext, JavaClassName parentClass, RefType superClass, GenericsRegistry generics) {
|
public Method convert(Java8Parser.MethodDeclarationContext methodDeclarationContext, JavaClassName parentClass, RefType superClass, GenericsRegistry generics) {
|
||||||
Java8Parser.MethodHeaderContext header = methodDeclarationContext.methodHeader();
|
Java8Parser.MethodHeaderContext header = methodDeclarationContext.methodHeader();
|
||||||
int modifiers = SyntaxTreeGenerator.convert(methodDeclarationContext.methodModifier());
|
int modifiers = SyntaxTreeGenerator.convert(methodDeclarationContext.methodModifier());
|
||||||
@@ -123,7 +154,7 @@ public class SyntaxTreeGenerator{
|
|||||||
private Method convert(int modifiers, Java8Parser.MethodHeaderContext header, Java8Parser.MethodBodyContext body,
|
private Method convert(int modifiers, Java8Parser.MethodHeaderContext header, Java8Parser.MethodBodyContext body,
|
||||||
JavaClassName parentClass, RefType superClass, GenericsRegistry localGenerics) {
|
JavaClassName parentClass, RefType superClass, GenericsRegistry localGenerics) {
|
||||||
|
|
||||||
StatementGenerator stmtGen = new StatementGenerator(reg, localGenerics, fields, new HashMap<>());
|
StatementGenerator stmtGen = new StatementGenerator(reg, localGenerics, new HashMap<>());
|
||||||
|
|
||||||
String name = header.methodDeclarator().Identifier().getText();
|
String name = header.methodDeclarator().Identifier().getText();
|
||||||
GenericDeclarationList gtvDeclarations = new GenericDeclarationList(new ArrayList<>(), header.getStart());
|
GenericDeclarationList gtvDeclarations = new GenericDeclarationList(new ArrayList<>(), header.getStart());
|
||||||
@@ -148,16 +179,16 @@ public class SyntaxTreeGenerator{
|
|||||||
//TODO: Error! Abstrakte Methode ohne abstrakt Keyword
|
//TODO: Error! Abstrakte Methode ohne abstrakt Keyword
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
block = stmtGen.convert(body.block(),true);
|
block = stmtGen.convert(body.block());
|
||||||
}
|
}
|
||||||
if(parentClass.equals(new JavaClassName(name))){
|
if(parentClass.equals(new JavaClassName(name))){
|
||||||
return new Constructor(modifiers, name, retType, parameterList, block, gtvDeclarations, header.getStart() /*, fieldInitializations geloescht PL 2018-11-24 */);
|
return new Constructor(modifiers, name, retType, modifiers, parameterList, block, gtvDeclarations, header.getStart(), fieldInitializations, superClass);
|
||||||
}else{
|
}else{
|
||||||
return new Method(modifiers, name, retType, parameterList,block, gtvDeclarations, header.getStart());
|
return new Method(modifiers, name, retType, modifiers, parameterList,block, gtvDeclarations, header.getStart());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ClassOrInterface convertClass(Java8Parser.ClassDeclarationContext ctx) {
|
private ClassOrInterface convertClass(Java8Parser.ClassDeclarationContext ctx) {
|
||||||
ClassOrInterface newClass;
|
ClassOrInterface newClass;
|
||||||
if(ctx.normalClassDeclaration() != null){
|
if(ctx.normalClassDeclaration() != null){
|
||||||
newClass = convertNormal(ctx.normalClassDeclaration());
|
newClass = convertNormal(ctx.normalClassDeclaration());
|
||||||
@@ -168,7 +199,7 @@ public class SyntaxTreeGenerator{
|
|||||||
return newClass;
|
return newClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ClassOrInterface convertNormal(Java8Parser.NormalClassDeclarationContext ctx) {
|
private ClassOrInterface convertNormal(Java8Parser.NormalClassDeclarationContext ctx){
|
||||||
int modifiers = 0;
|
int modifiers = 0;
|
||||||
if(ctx.classModifier() != null){
|
if(ctx.classModifier() != null){
|
||||||
for(Java8Parser.ClassModifierContext mod : ctx.classModifier()){
|
for(Java8Parser.ClassModifierContext mod : ctx.classModifier()){
|
||||||
@@ -176,12 +207,7 @@ public class SyntaxTreeGenerator{
|
|||||||
modifiers += newModifier;
|
modifiers += newModifier;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
String className = this.pkgName + (this.pkgName.length()>0?".":"") + ctx.Identifier().getText();
|
JavaClassName name = reg.getName(ctx.Identifier().getText());
|
||||||
JavaClassName name = reg.getName(className); //Holt den Package Namen mit dazu
|
|
||||||
if(! name.toString().equals(className)){ //Kommt die Klasse schon in einem anderen Package vor?
|
|
||||||
throw new TypeinferenceException("Name " + className + " bereits vorhanden in " + reg.getName(className).toString()
|
|
||||||
,ctx.getStart());
|
|
||||||
}
|
|
||||||
GenericsRegistry generics = createGenerics(ctx.typeParameters(), name, "", reg, new GenericsRegistry(globalGenerics));
|
GenericsRegistry generics = createGenerics(ctx.typeParameters(), name, "", reg, new GenericsRegistry(globalGenerics));
|
||||||
Token offset = ctx.getStart();
|
Token offset = ctx.getStart();
|
||||||
GenericDeclarationList genericClassParameters;
|
GenericDeclarationList genericClassParameters;
|
||||||
@@ -194,22 +220,17 @@ public class SyntaxTreeGenerator{
|
|||||||
if(ctx.superclass() != null){
|
if(ctx.superclass() != null){
|
||||||
superClass = convert(ctx.superclass());
|
superClass = convert(ctx.superclass());
|
||||||
}else{
|
}else{
|
||||||
superClass = new RefType(ASTFactory.createObjectClass().getClassName(), ctx.getStart());
|
superClass = ASTFactory.createObjectClass().getType();
|
||||||
}
|
}
|
||||||
List<Field> fielddecl = convertFields(ctx.classBody(), generics);
|
List<Field> fielddecl = convertFields(ctx.classBody(), generics);
|
||||||
//fieldInitializations = generateFieldInitializations(ctx.classBody(), generics);
|
List<Method> methods = convertMethods(ctx.classBody(), name, superClass, generics);
|
||||||
List<Method> methodsAndConstructors = convertMethods(ctx.classBody(), name, superClass, generics);
|
|
||||||
List<Method> methods = new ArrayList<>();
|
|
||||||
List<Constructor> konstruktoren = new ArrayList<>();
|
List<Constructor> konstruktoren = new ArrayList<>();
|
||||||
//int noOfMethods = methods.size();
|
for(int i = 0; i<methods.size();i++){
|
||||||
for(int i = 0; i < methodsAndConstructors.size(); i++){
|
Method m = methods.get(i);
|
||||||
Method m = methodsAndConstructors.get(i);
|
|
||||||
if(m instanceof Constructor){
|
if(m instanceof Constructor){
|
||||||
|
methods.remove(i);
|
||||||
konstruktoren.add((Constructor) m);
|
konstruktoren.add((Constructor) m);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
methods.add(m);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(konstruktoren.size()<1){//Standardkonstruktor anfügen:
|
if(konstruktoren.size()<1){//Standardkonstruktor anfügen:
|
||||||
konstruktoren.add(
|
konstruktoren.add(
|
||||||
@@ -220,49 +241,20 @@ public class SyntaxTreeGenerator{
|
|||||||
}
|
}
|
||||||
|
|
||||||
Boolean isInterface = false;
|
Boolean isInterface = false;
|
||||||
List<RefType> implementedInterfaces = convert(ctx.superinterfaces(), generics);
|
List<RefTypeOrTPHOrWildcardOrGeneric> implementedInterfaces = convert(ctx.superinterfaces(), generics);
|
||||||
|
return new ClassOrInterface(modifiers, name, fielddecl, methods, konstruktoren, genericClassParameters, superClass,
|
||||||
return new ClassOrInterface(modifiers, name, fielddecl,
|
|
||||||
Optional.of(this.generatePseudoConstructor(ctx.Identifier().getText(), name, superClass, genericClassParameters, offset)),
|
|
||||||
methods, konstruktoren, genericClassParameters, superClass,
|
|
||||||
isInterface, implementedInterfaces, offset);
|
isInterface, implementedInterfaces, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
private List<RefTypeOrTPHOrWildcardOrGeneric> convert(Java8Parser.SuperinterfacesContext ctx, GenericsRegistry generics) {
|
||||||
private List<Statement> generateFieldInitializations(Java8Parser.ClassBodyContext classBodyContext, GenericsRegistry generics) {
|
|
||||||
List<Statement> ret = new ArrayList<>();
|
|
||||||
for(Java8Parser.ClassBodyDeclarationContext classMember : classBodyContext.classBodyDeclaration()){
|
|
||||||
if(classMember.classMemberDeclaration() != null){
|
|
||||||
Java8Parser.ClassMemberDeclarationContext classMemberDeclarationContext = classMember.classMemberDeclaration();
|
|
||||||
if(classMemberDeclarationContext.fieldDeclaration() != null
|
|
||||||
&& classMemberDeclarationContext.fieldDeclaration().variableDeclaratorList() != null){
|
|
||||||
for(Java8Parser.VariableDeclaratorContext ctx : classMemberDeclarationContext.fieldDeclaration().variableDeclaratorList().variableDeclarator()) {
|
|
||||||
String fieldName = ctx.variableDeclaratorId().Identifier().getText();
|
|
||||||
if(ctx.variableDeclaratorId().dims() != null)throw new NotImplementedException();
|
|
||||||
Token offset = ctx.getStart();
|
|
||||||
RefTypeOrTPHOrWildcardOrGeneric fieldType;
|
|
||||||
for(Field f : fields)
|
|
||||||
AssignToField leftSide = new AssignToField(new FieldVar(new This(offset), fieldName, ));
|
|
||||||
ret.addAll();
|
|
||||||
}
|
|
||||||
}else if(classMemberDeclarationContext.methodDeclaration()!= null){
|
|
||||||
//Do nothing!
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
private List<RefType> convert(Java8Parser.SuperinterfacesContext ctx, GenericsRegistry generics) {
|
|
||||||
if(ctx == null)return new ArrayList<>();
|
if(ctx == null)return new ArrayList<>();
|
||||||
return convert(ctx.interfaceTypeList(), generics);
|
return convert(ctx.interfaceTypeList(), generics);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<RefType> convert(Java8Parser.InterfaceTypeListContext ctx, GenericsRegistry generics) {
|
private List<RefTypeOrTPHOrWildcardOrGeneric> convert(Java8Parser.InterfaceTypeListContext ctx, GenericsRegistry generics) {
|
||||||
List<RefType> ret = new ArrayList<>();
|
List<RefTypeOrTPHOrWildcardOrGeneric> ret = new ArrayList<>();
|
||||||
for(Java8Parser.InterfaceTypeContext interfaceType : ctx.interfaceType()){
|
for(Java8Parser.InterfaceTypeContext interfaceType : ctx.interfaceType()){
|
||||||
ret.add((RefType) TypeGenerator.convert(interfaceType.classType(), reg, generics));
|
ret.add(TypeGenerator.convert(interfaceType.classType(), reg, generics));
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -272,31 +264,14 @@ public class SyntaxTreeGenerator{
|
|||||||
*/
|
*/
|
||||||
private Constructor generateStandardConstructor(String className, JavaClassName parentClass, RefType superClass, GenericDeclarationList classGenerics, Token offset){
|
private Constructor generateStandardConstructor(String className, JavaClassName parentClass, RefType superClass, GenericDeclarationList classGenerics, Token offset){
|
||||||
RefType classType = ClassOrInterface.generateTypeOfClass(reg.getName(className), classGenerics, offset);
|
RefType classType = ClassOrInterface.generateTypeOfClass(reg.getName(className), classGenerics, offset);
|
||||||
|
int modifiers = 0;
|
||||||
ParameterList params = new ParameterList(new ArrayList<>(), offset);
|
ParameterList params = new ParameterList(new ArrayList<>(), offset);
|
||||||
Block block = new Block(new ArrayList<>(), offset);
|
Block block = new Block(new ArrayList<>(), offset);
|
||||||
return new Constructor(Modifier.PUBLIC, className, classType, params, block, classGenerics, offset /*, fieldInitializations geloescht PL 2018-11-24 */);
|
return new Constructor(Modifier.PUBLIC, className, classType, modifiers, params, block, classGenerics, offset, fieldInitializations, superClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fieldInitializations werden in einem Psedokonstruktor in der abstrakten Syntax gespeichert */
|
|
||||||
private Constructor generatePseudoConstructor(String className, JavaClassName parentClass, RefType superClass, GenericDeclarationList classGenerics, Token offset){
|
|
||||||
RefType classType = ClassOrInterface.generateTypeOfClass(reg.getName(className), classGenerics, offset);
|
|
||||||
ParameterList params = new ParameterList(new ArrayList<>(), offset);
|
|
||||||
Block block = new Block(new ArrayList<>(fieldInitializations), offset);
|
|
||||||
return new Constructor(Modifier.PUBLIC, className, classType, params, block, classGenerics, offset /*, fieldInitializations geloescht PL 2018-11-24 */);
|
|
||||||
}
|
|
||||||
|
|
||||||
private RefType convert(Java8Parser.SuperclassContext superclass) {
|
private RefType convert(Java8Parser.SuperclassContext superclass) {
|
||||||
if(superclass.classType().classOrInterfaceType() != null){
|
throw new NotImplementedException();
|
||||||
throw new NotImplementedException();
|
|
||||||
}else{
|
|
||||||
RefTypeOrTPHOrWildcardOrGeneric ret = TypeGenerator.convertTypeName(superclass.classType().Identifier().getText(), superclass.classType().typeArguments(),
|
|
||||||
superclass.getStart(), reg, globalGenerics);
|
|
||||||
if(ret instanceof RefType){
|
|
||||||
return (RefType) ret;
|
|
||||||
}else{
|
|
||||||
throw new TypeinferenceException(superclass.getText() + " ist kein gültiger Supertyp", superclass.getStart());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Method> convertMethods(Java8Parser.ClassBodyContext classBodyContext,
|
private List<Method> convertMethods(Java8Parser.ClassBodyContext classBodyContext,
|
||||||
@@ -354,19 +329,19 @@ public class SyntaxTreeGenerator{
|
|||||||
modifiers+=(convert(fieldModifierContext));
|
modifiers+=(convert(fieldModifierContext));
|
||||||
}
|
}
|
||||||
RefTypeOrTPHOrWildcardOrGeneric fieldType;
|
RefTypeOrTPHOrWildcardOrGeneric fieldType;
|
||||||
if(fieldDeclarationContext.unannTypeOrAuto() != null
|
if(fieldDeclarationContext.unannType() != null){
|
||||||
&& fieldDeclarationContext.unannTypeOrAuto().unannType() != null){
|
fieldType = TypeGenerator.convert(fieldDeclarationContext.unannType(), reg, generics);
|
||||||
fieldType = TypeGenerator.convert(fieldDeclarationContext.unannTypeOrAuto().unannType(), reg, generics);
|
|
||||||
}else{
|
}else{
|
||||||
fieldType = TypePlaceholder.fresh(fieldDeclarationContext.getStart());
|
fieldType = TypePlaceholder.fresh(fieldDeclarationContext.getStart());
|
||||||
}
|
}
|
||||||
for(Java8Parser.VariableDeclaratorContext varCtx : fieldDeclarationContext.variableDeclaratorList().variableDeclarator()){
|
for(Java8Parser.VariableDeclaratorContext varCtx : fieldDeclarationContext.variableDeclaratorList().variableDeclarator()){
|
||||||
String fieldName = convert(varCtx.variableDeclaratorId());
|
String fieldName = convert(varCtx.variableDeclaratorId());
|
||||||
fields.put(fieldName, fieldType);
|
|
||||||
if(varCtx.variableInitializer() != null){
|
if(varCtx.variableInitializer() != null){
|
||||||
initializeField(varCtx, fieldType, generics);
|
initializeField(varCtx, fieldType, generics);
|
||||||
}
|
}
|
||||||
ret.add(new Field(fieldName,fieldType,modifiers,varCtx.getStart()));
|
else{
|
||||||
|
ret.add(new Field(fieldName,fieldType,modifiers,varCtx.getStart()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -377,7 +352,7 @@ public class SyntaxTreeGenerator{
|
|||||||
|
|
||||||
// Initialize a field by creating implicit constructor.
|
// Initialize a field by creating implicit constructor.
|
||||||
private void initializeField(Java8Parser.VariableDeclaratorContext ctx, RefTypeOrTPHOrWildcardOrGeneric typeOfField, GenericsRegistry generics){
|
private void initializeField(Java8Parser.VariableDeclaratorContext ctx, RefTypeOrTPHOrWildcardOrGeneric typeOfField, GenericsRegistry generics){
|
||||||
StatementGenerator statementGenerator = new StatementGenerator(reg, generics, fields, new HashMap<>());
|
StatementGenerator statementGenerator = new StatementGenerator(reg, generics, new HashMap<>());
|
||||||
fieldInitializations.add(statementGenerator.generateFieldAssignment(ctx, typeOfField));
|
fieldInitializations.add(statementGenerator.generateFieldAssignment(ctx, typeOfField));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -437,8 +412,6 @@ public class SyntaxTreeGenerator{
|
|||||||
modifiers += newModifier;
|
modifiers += newModifier;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!Modifier.isInterface(modifiers))modifiers += Modifier.INTERFACE;
|
|
||||||
|
|
||||||
JavaClassName name = reg.getName(ctx.Identifier().getText());
|
JavaClassName name = reg.getName(ctx.Identifier().getText());
|
||||||
|
|
||||||
GenericsRegistry generics = createGenerics(ctx.typeParameters(), name, "", reg, new GenericsRegistry(globalGenerics));
|
GenericsRegistry generics = createGenerics(ctx.typeParameters(), name, "", reg, new GenericsRegistry(globalGenerics));
|
||||||
@@ -449,14 +422,14 @@ public class SyntaxTreeGenerator{
|
|||||||
}else{
|
}else{
|
||||||
genericParams = createEmptyGenericDeclarationList(ctx.Identifier());
|
genericParams = createEmptyGenericDeclarationList(ctx.Identifier());
|
||||||
}
|
}
|
||||||
RefType superClass = ASTFactory.createObjectType();
|
RefType superClass = ASTFactory.createObjectClass().getType();
|
||||||
|
|
||||||
List<Field> fields = convertFields(ctx.interfaceBody());
|
List<Field> fields = convertFields(ctx.interfaceBody());
|
||||||
List<Method> methods = convertMethods(ctx.interfaceBody(), name, superClass, generics);
|
List<Method> methods = convertMethods(ctx.interfaceBody(), name, superClass, generics);
|
||||||
|
|
||||||
List<RefType> extendedInterfaces = convert(ctx.extendsInterfaces(), generics);
|
List<RefTypeOrTPHOrWildcardOrGeneric> extendedInterfaces = convert(ctx.extendsInterfaces(), generics);
|
||||||
|
|
||||||
return new ClassOrInterface(modifiers, name, fields, Optional.empty(), methods, new ArrayList<>(),
|
return new ClassOrInterface(modifiers, name, fields, methods, new ArrayList<>(),
|
||||||
genericParams, superClass, true, extendedInterfaces, ctx.getStart());
|
genericParams, superClass, true, extendedInterfaces, ctx.getStart());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -471,16 +444,13 @@ public class SyntaxTreeGenerator{
|
|||||||
GenericsRegistry ret = new GenericsRegistry(this.globalGenerics);
|
GenericsRegistry ret = new GenericsRegistry(this.globalGenerics);
|
||||||
ret.putAll(generics);
|
ret.putAll(generics);
|
||||||
if(ctx == null || ctx.typeParameterList() == null)return ret;
|
if(ctx == null || ctx.typeParameterList() == null)return ret;
|
||||||
for(Java8Parser.TypeParameterContext tp : ctx.typeParameterList().typeParameter()){
|
|
||||||
ret.put(tp.Identifier().getText(), new GenericContext(parentClass, parentMethod));
|
|
||||||
}
|
|
||||||
for(Java8Parser.TypeParameterContext tp : ctx.typeParameterList().typeParameter()){
|
for(Java8Parser.TypeParameterContext tp : ctx.typeParameterList().typeParameter()){
|
||||||
TypeGenerator.convert(tp, parentClass, parentMethod, reg, ret);
|
TypeGenerator.convert(tp, parentClass, parentMethod, reg, ret);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<RefType> convert(Java8Parser.ExtendsInterfacesContext extendsInterfacesContext, GenericsRegistry generics) {
|
private List<RefTypeOrTPHOrWildcardOrGeneric> convert(Java8Parser.ExtendsInterfacesContext extendsInterfacesContext, GenericsRegistry generics) {
|
||||||
if(extendsInterfacesContext == null)return new ArrayList<>();
|
if(extendsInterfacesContext == null)return new ArrayList<>();
|
||||||
return convert(extendsInterfacesContext.interfaceTypeList(), generics);
|
return convert(extendsInterfacesContext.interfaceTypeList(), generics);
|
||||||
}
|
}
|
@@ -3,6 +3,7 @@ package de.dhbwstuttgart.parser.SyntaxTreeGenerator;
|
|||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import de.dhbwstuttgart.exceptions.TypeinferenceException;
|
import de.dhbwstuttgart.exceptions.TypeinferenceException;
|
||||||
import de.dhbwstuttgart.parser.antlr.Java8Parser;
|
import de.dhbwstuttgart.parser.antlr.Java8Parser;
|
||||||
|
import de.dhbwstuttgart.parser.scope.GenericTypeName;
|
||||||
import de.dhbwstuttgart.parser.scope.GenericsRegistry;
|
import de.dhbwstuttgart.parser.scope.GenericsRegistry;
|
||||||
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
import de.dhbwstuttgart.parser.scope.JavaClassName;
|
||||||
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
import de.dhbwstuttgart.parser.scope.JavaClassRegistry;
|
||||||
@@ -13,7 +14,6 @@ import de.dhbwstuttgart.syntaxtree.type.GenericRefType;
|
|||||||
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
import de.dhbwstuttgart.syntaxtree.type.RefType;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
|
|
||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
|
||||||
import org.antlr.v4.runtime.Token;
|
import org.antlr.v4.runtime.Token;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -22,34 +22,27 @@ import java.util.List;
|
|||||||
public class TypeGenerator {
|
public class TypeGenerator {
|
||||||
|
|
||||||
public static RefTypeOrTPHOrWildcardOrGeneric convert(Java8Parser.UnannClassOrInterfaceTypeContext unannClassOrInterfaceTypeContext, JavaClassRegistry reg, GenericsRegistry generics) {
|
public static RefTypeOrTPHOrWildcardOrGeneric convert(Java8Parser.UnannClassOrInterfaceTypeContext unannClassOrInterfaceTypeContext, JavaClassRegistry reg, GenericsRegistry generics) {
|
||||||
|
String name;
|
||||||
|
if(unannClassOrInterfaceTypeContext.unannInterfaceType_lfno_unannClassOrInterfaceType() != null){
|
||||||
|
name = unannClassOrInterfaceTypeContext.unannInterfaceType_lfno_unannClassOrInterfaceType().unannClassType_lfno_unannClassOrInterfaceType().Identifier().getText();
|
||||||
|
}
|
||||||
Java8Parser.TypeArgumentsContext arguments;
|
Java8Parser.TypeArgumentsContext arguments;
|
||||||
if(unannClassOrInterfaceTypeContext.unannClassType_lfno_unannClassOrInterfaceType() != null){
|
if(unannClassOrInterfaceTypeContext.unannClassType_lfno_unannClassOrInterfaceType() != null){
|
||||||
|
name = unannClassOrInterfaceTypeContext.unannClassType_lfno_unannClassOrInterfaceType().Identifier().getText();
|
||||||
arguments = unannClassOrInterfaceTypeContext.unannClassType_lfno_unannClassOrInterfaceType().typeArguments();
|
arguments = unannClassOrInterfaceTypeContext.unannClassType_lfno_unannClassOrInterfaceType().typeArguments();
|
||||||
}else{// if(unannClassOrInterfaceTypeContext.unannInterfaceType_lfno_unannClassOrInterfaceType() != null){
|
}else{// if(unannClassOrInterfaceTypeContext.unannInterfaceType_lfno_unannClassOrInterfaceType() != null){
|
||||||
|
name = unannClassOrInterfaceTypeContext.unannInterfaceType_lfno_unannClassOrInterfaceType().unannClassType_lfno_unannClassOrInterfaceType().getText();
|
||||||
arguments = unannClassOrInterfaceTypeContext.unannInterfaceType_lfno_unannClassOrInterfaceType().unannClassType_lfno_unannClassOrInterfaceType().typeArguments();
|
arguments = unannClassOrInterfaceTypeContext.unannInterfaceType_lfno_unannClassOrInterfaceType().unannClassType_lfno_unannClassOrInterfaceType().typeArguments();
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* Problem sind hier die verschachtelten Typen mit verschachtelten Typargumenten
|
|
||||||
* Beispiel: Typ<String>.InnererTyp<Integer>
|
|
||||||
*/
|
|
||||||
String name = unannClassOrInterfaceTypeContext.getText();
|
|
||||||
if(name.contains("<")){
|
|
||||||
name = name.split("<")[0]; //Der Typ ist alles vor den ersten Argumenten
|
|
||||||
}
|
|
||||||
return convertTypeName(name, arguments, unannClassOrInterfaceTypeContext.getStart(), reg, generics);
|
return convertTypeName(name, arguments, unannClassOrInterfaceTypeContext.getStart(), reg, generics);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RefTypeOrTPHOrWildcardOrGeneric convert(Java8Parser.UnannTypeContext unannTypeContext, JavaClassRegistry reg, GenericsRegistry genericsRegistry) {
|
public static RefTypeOrTPHOrWildcardOrGeneric convert(Java8Parser.UnannTypeContext unannTypeContext, JavaClassRegistry reg, GenericsRegistry genericsRegistry) {
|
||||||
if(unannTypeContext.unannPrimitiveType()!=null){
|
if(unannTypeContext.unannPrimitiveType()!=null){
|
||||||
if(unannTypeContext.unannPrimitiveType().getText().equals("boolean")){
|
throw new NotImplementedException();
|
||||||
return new RefType(ASTFactory.createClass(Boolean.class).getClassName(), unannTypeContext.getStart());
|
|
||||||
}else{
|
|
||||||
Java8Parser.NumericTypeContext numericType = unannTypeContext.unannPrimitiveType().numericType();
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}else
|
}else
|
||||||
if(unannTypeContext.unannReferenceType().unannArrayType()!=null){
|
if(unannTypeContext.unannReferenceType().unannArrayType()!=null){
|
||||||
//System.out.println(unannTypeContext.getText());
|
System.out.println(unannTypeContext.getText());
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}else
|
}else
|
||||||
if(unannTypeContext.unannReferenceType().unannTypeVariable()!=null){
|
if(unannTypeContext.unannReferenceType().unannTypeVariable()!=null){
|
||||||
@@ -76,14 +69,15 @@ public class TypeGenerator {
|
|||||||
//Problem <A extends B, B> ist erlaubt, würde aber bei den Bounds von A den Generic B nicht als solchen erkennen
|
//Problem <A extends B, B> ist erlaubt, würde aber bei den Bounds von A den Generic B nicht als solchen erkennen
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> bounds = TypeGenerator.convert(typeParameter.typeBound(),reg, generics);
|
List<RefTypeOrTPHOrWildcardOrGeneric> bounds = TypeGenerator.convert(typeParameter.typeBound(),reg, generics);
|
||||||
|
|
||||||
GenericTypeVar ret = new GenericTypeVar(name, bounds, typeParameter.getStart(), typeParameter.getStop());
|
GenericTypeVar ret = new GenericTypeVar(new GenericTypeName(new GenericContext(parentClass, parentMethod), name), bounds, typeParameter.getStart(), typeParameter.getStop());
|
||||||
|
generics.put(name, new GenericContext(parentClass, parentMethod));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<RefTypeOrTPHOrWildcardOrGeneric> convert(Java8Parser.TypeBoundContext typeBoundContext, JavaClassRegistry reg, GenericsRegistry generics) {
|
public static List<RefTypeOrTPHOrWildcardOrGeneric> convert(Java8Parser.TypeBoundContext typeBoundContext, JavaClassRegistry reg, GenericsRegistry generics) {
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> ret = new ArrayList<>();
|
List<RefTypeOrTPHOrWildcardOrGeneric> ret = new ArrayList<>();
|
||||||
if(typeBoundContext == null){
|
if(typeBoundContext == null){
|
||||||
ret.add(ASTFactory.createObjectType());
|
ret.add(ASTFactory.createObjectClass().getType());
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if(typeBoundContext.typeVariable() != null){
|
if(typeBoundContext.typeVariable() != null){
|
||||||
@@ -91,7 +85,7 @@ public class TypeGenerator {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if(typeBoundContext.classOrInterfaceType() != null){
|
if(typeBoundContext.classOrInterfaceType() != null){
|
||||||
ret.add(convert(typeBoundContext.classOrInterfaceType(), reg, generics));
|
ret.add(convert(typeBoundContext.classOrInterfaceType()));
|
||||||
if(typeBoundContext.additionalBound() != null)
|
if(typeBoundContext.additionalBound() != null)
|
||||||
for(Java8Parser.AdditionalBoundContext addCtx : typeBoundContext.additionalBound()){
|
for(Java8Parser.AdditionalBoundContext addCtx : typeBoundContext.additionalBound()){
|
||||||
ret.add(convert(addCtx.interfaceType()));
|
ret.add(convert(addCtx.interfaceType()));
|
||||||
@@ -102,19 +96,8 @@ public class TypeGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static RefTypeOrTPHOrWildcardOrGeneric convert(Java8Parser.ClassOrInterfaceTypeContext classOrInterfaceTypeContext, JavaClassRegistry reg, GenericsRegistry generics) {
|
private static RefTypeOrTPHOrWildcardOrGeneric convert(Java8Parser.ClassOrInterfaceTypeContext classOrInterfaceTypeContext) {
|
||||||
Java8Parser.ClassType_lfno_classOrInterfaceTypeContext ctx = classOrInterfaceTypeContext.classType_lfno_classOrInterfaceType();
|
throw new NotImplementedException();
|
||||||
if(ctx.typeArguments() != null &&
|
|
||||||
classOrInterfaceTypeContext.classType_lf_classOrInterfaceType().size() > 0)
|
|
||||||
throw new NotImplementedException();
|
|
||||||
String typeName = ctx.Identifier().toString();
|
|
||||||
Java8Parser.ClassType_lf_classOrInterfaceTypeContext nextCtx = null;
|
|
||||||
for(Java8Parser.ClassType_lf_classOrInterfaceTypeContext forEachCtx : classOrInterfaceTypeContext.classType_lf_classOrInterfaceType()){
|
|
||||||
nextCtx = forEachCtx;
|
|
||||||
typeName += "." + forEachCtx.Identifier().toString();
|
|
||||||
}
|
|
||||||
Java8Parser.TypeArgumentsContext arguments = nextCtx!=null?nextCtx.typeArguments():ctx.typeArguments();
|
|
||||||
return convertTypeName(typeName, arguments, classOrInterfaceTypeContext.getStart(), reg, generics);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static RefTypeOrTPHOrWildcardOrGeneric convert(Java8Parser.InterfaceTypeContext interfaceTypeContext) {
|
private static RefTypeOrTPHOrWildcardOrGeneric convert(Java8Parser.InterfaceTypeContext interfaceTypeContext) {
|
||||||
@@ -122,15 +105,7 @@ public class TypeGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static RefTypeOrTPHOrWildcardOrGeneric convert(Java8Parser.ReferenceTypeContext referenceTypeContext, JavaClassRegistry reg, GenericsRegistry generics) {
|
public static RefTypeOrTPHOrWildcardOrGeneric convert(Java8Parser.ReferenceTypeContext referenceTypeContext, JavaClassRegistry reg, GenericsRegistry generics) {
|
||||||
if(referenceTypeContext.classOrInterfaceType() != null){
|
return convertTypeName(referenceTypeContext.getText(), referenceTypeContext.getStart(), reg, generics);
|
||||||
if(referenceTypeContext.classOrInterfaceType().classType_lfno_classOrInterfaceType()!= null){
|
|
||||||
return convert(referenceTypeContext.classOrInterfaceType(), reg, generics);//return convertTypeName(referenceTypeContext.getText(), ctx.typeArguments(),referenceTypeContext.getStart(), reg, generics);
|
|
||||||
}else{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RefTypeOrTPHOrWildcardOrGeneric convertTypeName(String name, Token offset, JavaClassRegistry reg, GenericsRegistry generics){
|
public static RefTypeOrTPHOrWildcardOrGeneric convertTypeName(String name, Token offset, JavaClassRegistry reg, GenericsRegistry generics){
|
||||||
@@ -141,17 +116,13 @@ public class TypeGenerator {
|
|||||||
String name, Java8Parser.TypeArgumentsContext typeArguments, Token offset, JavaClassRegistry reg, GenericsRegistry generics){
|
String name, Java8Parser.TypeArgumentsContext typeArguments, Token offset, JavaClassRegistry reg, GenericsRegistry generics){
|
||||||
if(!reg.contains(name)){ //Dann könnte es ein Generische Type sein
|
if(!reg.contains(name)){ //Dann könnte es ein Generische Type sein
|
||||||
if(generics.contains(name)){
|
if(generics.contains(name)){
|
||||||
return new GenericRefType(name, offset);
|
return new GenericRefType(new GenericTypeName(generics.get(name),name), offset);
|
||||||
}else{
|
}else{
|
||||||
throw new TypeinferenceException("Der Typ "+ name + " ist nicht vorhanden",offset);
|
throw new TypeinferenceException("Der Typ "+ name + " ist nicht vorhanden",offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(typeArguments == null){
|
if(typeArguments == null){
|
||||||
List<RefTypeOrTPHOrWildcardOrGeneric> params = new ArrayList<>();
|
return new RefType(reg.getName(name), offset);
|
||||||
for(int i = 0; i<reg.getNumberOfGenerics(name);i++){
|
|
||||||
params.add(TypePlaceholder.fresh(offset));
|
|
||||||
}
|
|
||||||
return new RefType(reg.getName(name), params, offset);
|
|
||||||
}else{
|
}else{
|
||||||
return new RefType(reg.getName(name), convert(typeArguments, reg, generics), offset);
|
return new RefType(reg.getName(name), convert(typeArguments, reg, generics), offset);
|
||||||
}
|
}
|
@@ -109,6 +109,7 @@ classOrInterfaceType
|
|||||||
| interfaceType_lfno_classOrInterfaceType
|
| interfaceType_lfno_classOrInterfaceType
|
||||||
)
|
)
|
||||||
( classType_lf_classOrInterfaceType
|
( classType_lf_classOrInterfaceType
|
||||||
|
| interfaceType_lf_classOrInterfaceType
|
||||||
)*
|
)*
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -332,7 +333,7 @@ classMemberDeclaration
|
|||||||
;
|
;
|
||||||
|
|
||||||
fieldDeclaration
|
fieldDeclaration
|
||||||
: fieldModifier* unannTypeOrAuto? variableDeclaratorList ';'
|
: fieldModifier* unannType? variableDeclaratorList ';'
|
||||||
;
|
;
|
||||||
|
|
||||||
fieldModifier
|
fieldModifier
|
||||||
@@ -1738,7 +1739,6 @@ Identifier
|
|||||||
: JavaLetter JavaLetterOrDigit*
|
: JavaLetter JavaLetterOrDigit*
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
fragment
|
fragment
|
||||||
JavaLetter
|
JavaLetter
|
||||||
: [a-zA-Z$_] // these are the "java letters" below 0x7F
|
: [a-zA-Z$_] // these are the "java letters" below 0x7F
|