forked from JavaTX/JavaCompilerCore
LocalVar bekommt den Typ beim Parsen
This commit is contained in:
parent
4a52bc0e6e
commit
810164ac17
@ -17,15 +17,12 @@ import org.antlr.v4.runtime.Token;
|
|||||||
import org.antlr.v4.runtime.tree.TerminalNode;
|
import org.antlr.v4.runtime.tree.TerminalNode;
|
||||||
|
|
||||||
import java.lang.reflect.Modifier;
|
import java.lang.reflect.Modifier;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class StatementGenerator {
|
public class StatementGenerator {
|
||||||
|
|
||||||
private JavaClassRegistry reg;
|
private JavaClassRegistry reg;
|
||||||
private Set<String> localVars = new HashSet<>();
|
private Map<String, RefTypeOrTPHOrWildcardOrGeneric> localVars = new HashMap<>();
|
||||||
private GenericsRegistry generics;
|
private GenericsRegistry generics;
|
||||||
|
|
||||||
public StatementGenerator(JavaClassRegistry reg, GenericsRegistry generics){
|
public StatementGenerator(JavaClassRegistry reg, GenericsRegistry generics){
|
||||||
@ -56,7 +53,7 @@ public class StatementGenerator {
|
|||||||
type = TypePlaceholder.fresh(fp.getStart());
|
type = TypePlaceholder.fresh(fp.getStart());
|
||||||
}
|
}
|
||||||
ret.add(new FormalParameter(paramName, type, fp.getStart()));
|
ret.add(new FormalParameter(paramName, type, fp.getStart()));
|
||||||
localVars.add(paramName);
|
localVars.put(paramName, type);
|
||||||
}
|
}
|
||||||
return new ParameterList(ret, ret.get(0).getOffset());
|
return new ParameterList(ret, ret.get(0).getOffset());
|
||||||
}
|
}
|
||||||
@ -232,8 +229,8 @@ public class StatementGenerator {
|
|||||||
String[] parts = expression.split("\\.");
|
String[] parts = expression.split("\\.");
|
||||||
if(parts.length < 2){
|
if(parts.length < 2){
|
||||||
//Check for localVar:
|
//Check for localVar:
|
||||||
if(localVars.contains(expression)){
|
if(localVars.get(expression) != null){
|
||||||
return new LocalVar(expression, offset);
|
return new LocalVar(expression, localVars.get(expression), offset);
|
||||||
}else{
|
}else{
|
||||||
//throw new NotImplementedException();
|
//throw new NotImplementedException();
|
||||||
//Dann Muss es ein Feld sein!
|
//Dann Muss es ein Feld sein!
|
||||||
@ -295,12 +292,12 @@ public class StatementGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Statement convert(Java8Parser.AssignmentContext stmt) {
|
private Statement convert(Java8Parser.AssignmentContext stmt) {
|
||||||
LocalVar leftHandSide = convert(stmt.leftHandSide());
|
Expression leftHandSide = convert(stmt.leftHandSide());
|
||||||
return new Assign(leftHandSide, convert(stmt.expression()), stmt.getStart());
|
return new Assign(leftHandSide, convert(stmt.expression()), stmt.getStart());
|
||||||
}
|
}
|
||||||
|
|
||||||
private LocalVar convert(Java8Parser.LeftHandSideContext leftHandSide) {
|
private Expression convert(Java8Parser.LeftHandSideContext leftHandSide) {
|
||||||
return new LocalVar(leftHandSide.toString(), leftHandSide.getStart());
|
return generateLocalOrFieldVarOrClassName(leftHandSide.getText(), leftHandSide.getStart());
|
||||||
}
|
}
|
||||||
|
|
||||||
private Statement convert(Java8Parser.IfThenStatementContext stmt){
|
private Statement convert(Java8Parser.IfThenStatementContext stmt){
|
||||||
@ -401,7 +398,7 @@ public class StatementGenerator {
|
|||||||
for(Java8Parser.VariableDeclaratorContext varDecl : declaration.variableDeclaratorList().variableDeclarator()){
|
for(Java8Parser.VariableDeclaratorContext varDecl : declaration.variableDeclaratorList().variableDeclarator()){
|
||||||
TerminalNode name = varDecl.variableDeclaratorId().Identifier();
|
TerminalNode name = varDecl.variableDeclaratorId().Identifier();
|
||||||
declarations.add(new LocalVarDecl(name.getText(), type, name.getSymbol()));
|
declarations.add(new LocalVarDecl(name.getText(), type, name.getSymbol()));
|
||||||
this.localVars.add(name.getText());
|
this.localVars.put(name.getText(), type);
|
||||||
}
|
}
|
||||||
if(declarations.size()==1)return declarations.get(0);
|
if(declarations.size()==1)return declarations.get(0);
|
||||||
return new LocalVarBunchDeclaration(declarations, declaration.getStart());
|
return new LocalVarBunchDeclaration(declarations, declaration.getStart());
|
||||||
|
@ -12,9 +12,9 @@ import org.antlr.v4.runtime.Token;
|
|||||||
public class Assign extends Statement
|
public class Assign extends Statement
|
||||||
{
|
{
|
||||||
public final Expression rightSide;
|
public final Expression rightSide;
|
||||||
public final LocalVar lefSide;
|
public final Expression lefSide;
|
||||||
|
|
||||||
public Assign(LocalVar leftHandSide, Expression value, Token offset) {
|
public Assign(Expression leftHandSide, Expression value, Token offset) {
|
||||||
super(leftHandSide.getType(), offset);
|
super(leftHandSide.getType(), offset);
|
||||||
this.rightSide = value;
|
this.rightSide = value;
|
||||||
this.lefSide = leftHandSide;
|
this.lefSide = leftHandSide;
|
||||||
|
@ -2,6 +2,7 @@ package de.dhbwstuttgart.syntaxtree.statement;
|
|||||||
|
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import de.dhbwstuttgart.syntaxtree.StatementVisitor;
|
import de.dhbwstuttgart.syntaxtree.StatementVisitor;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.RefTypeOrTPHOrWildcardOrGeneric;
|
||||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceBlockInformation;
|
import de.dhbwstuttgart.typeinference.assumptions.TypeInferenceBlockInformation;
|
||||||
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
import de.dhbwstuttgart.typeinference.constraints.ConstraintSet;
|
||||||
@ -12,15 +13,15 @@ public class LocalVar extends Statement{
|
|||||||
|
|
||||||
protected final String expression;
|
protected final String expression;
|
||||||
|
|
||||||
public LocalVar(String n, Token offset)
|
public LocalVar(String n, RefTypeOrTPHOrWildcardOrGeneric type, Token offset)
|
||||||
{
|
{
|
||||||
super(TypePlaceholder.fresh(offset),offset);
|
super(type,offset);
|
||||||
this.expression = n;
|
this.expression = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
public LocalVar(Expression e1, String access)
|
public LocalVar(Expression e1, RefTypeOrTPHOrWildcardOrGeneric type, String access)
|
||||||
{
|
{
|
||||||
super(TypePlaceholder.fresh(e1.getOffset()),e1.getOffset());
|
super(type,e1.getOffset());
|
||||||
this.expression = access;
|
this.expression = access;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
package de.dhbwstuttgart.typedeployment;
|
package de.dhbwstuttgart.typedeployment;
|
||||||
|
|
||||||
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
import de.dhbwstuttgart.exceptions.NotImplementedException;
|
||||||
import de.dhbwstuttgart.syntaxtree.ClassOrInterface;
|
import de.dhbwstuttgart.syntaxtree.*;
|
||||||
import de.dhbwstuttgart.syntaxtree.Field;
|
|
||||||
import de.dhbwstuttgart.syntaxtree.SourceFile;
|
|
||||||
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;
|
||||||
@ -24,6 +22,19 @@ public class TypeInsertFactory {
|
|||||||
ret.add(new TypeInsertPoint(field.getType().getOffset(), toInsert));
|
ret.add(new TypeInsertPoint(field.getType().getOffset(), toInsert));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(Method m : cl.getMethods()){
|
||||||
|
RefTypeOrTPHOrWildcardOrGeneric resolved = withResults.resolveType(m.getReturnType());
|
||||||
|
String toInsert = getString(resolved) + " ";
|
||||||
|
ret.add(new TypeInsertPoint(m.getReturnType().getOffset(), toInsert));
|
||||||
|
|
||||||
|
for(FormalParameter param : m.getParameterList().getFormalparalist()){
|
||||||
|
resolved = withResults.resolveType(param.getType());
|
||||||
|
toInsert = getString(resolved) + " ";
|
||||||
|
ret.add(new TypeInsertPoint(param.getType().getOffset(), toInsert));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
43
test/javFiles/Matrix.jav
Normal file
43
test/javFiles/Matrix.jav
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
class Matrix extends Menge<Menge<Integer>> {
|
||||||
|
|
||||||
|
Matrix mul_rec(Matrix m) {
|
||||||
|
v1;
|
||||||
|
v1 = new Menge<Integer>();
|
||||||
|
v2;
|
||||||
|
v2 = new Menge<Integer>();
|
||||||
|
i;
|
||||||
|
i = 0;
|
||||||
|
while(i < m.size()) {
|
||||||
|
v;
|
||||||
|
v = m.elementAt(i);
|
||||||
|
v2.addElement(v.remove(v.size()-1));
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
Matrix ret;
|
||||||
|
if (m.elementAt(0).size() > 0) {
|
||||||
|
ret = this.mul_rec(m);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret = new Matrix();
|
||||||
|
i = 0;
|
||||||
|
while (i < this.size()) {
|
||||||
|
ret.addElement(new Menge<Integer>());
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i = 0;
|
||||||
|
while (i < this.size()) {
|
||||||
|
int erg = 0;
|
||||||
|
j;
|
||||||
|
j = 0;
|
||||||
|
while (j < v2.size()) {
|
||||||
|
erg = erg + this.elementAt(i).elementAt(j).intValue()
|
||||||
|
* v2.elementAt(j).intValue();
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
ret.elementAt(i).addElement(erg);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
@ -10,7 +10,7 @@ class Methods {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class Test {
|
class Test {
|
||||||
f;
|
java.lang.Object f;
|
||||||
add(){}
|
add(){}
|
||||||
add(b){return b;}
|
add(b){return b;}
|
||||||
sub(b){}
|
sub(b){}
|
||||||
|
11
test/javFiles/Vector.jav
Normal file
11
test/javFiles/Vector.jav
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
|
||||||
|
class Vector{
|
||||||
|
|
||||||
|
id(x){
|
||||||
|
return id2(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
id2(x){
|
||||||
|
return id(x);
|
||||||
|
}
|
||||||
|
}
|
@ -25,13 +25,14 @@ public class JavaTXCompilerTest {
|
|||||||
@Test
|
@Test
|
||||||
public void test() throws IOException, ClassNotFoundException {
|
public void test() throws IOException, ClassNotFoundException {
|
||||||
JavaTXCompiler compiler = new JavaTXCompiler();
|
JavaTXCompiler compiler = new JavaTXCompiler();
|
||||||
compiler.parse(new File(rootDirectory+"Methods.jav"));
|
compiler.parse(new File(rootDirectory+"Vector.jav"));
|
||||||
//compiler.parse(new File(rootDirectory+"Generics.jav"));
|
//compiler.parse(new File(rootDirectory+"Generics.jav"));
|
||||||
compiler.parse(new File(rootDirectory+"MethodsEasy.jav"));
|
//compiler.parse(new File(rootDirectory+"MethodsEasy.jav"));
|
||||||
//compiler.parse(new File(rootDirectory+"Lambda.jav"));
|
//compiler.parse(new File(rootDirectory+"Lambda.jav"));
|
||||||
|
//compiler.parse(new File(rootDirectory+"Matrix.jav"));
|
||||||
|
|
||||||
List<TypeInsertPoint> result = compiler.getTypeInserts(new File(rootDirectory+"Methods.jav"));
|
List<TypeInsertPoint> result = compiler.getTypeInserts(new File(rootDirectory+"Vector.jav"));
|
||||||
String content = readFile(rootDirectory+"Methods.jav", StandardCharsets.UTF_8);
|
String content = readFile(rootDirectory+"Vector.jav", StandardCharsets.UTF_8);
|
||||||
for(TypeInsertPoint tip : result){
|
for(TypeInsertPoint tip : result){
|
||||||
System.out.println(tip.insert(content));
|
System.out.println(tip.insert(content));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user