Fehler in TypeInsert beheben
This commit is contained in:
parent
52f562b570
commit
3274f12922
@ -18,6 +18,7 @@ import de.dhbwstuttgart.typecheck.JavaClassRegistry;
|
|||||||
import org.antlr.v4.runtime.Token;
|
import org.antlr.v4.runtime.Token;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class TypeGenerator {
|
public class TypeGenerator {
|
||||||
@ -92,7 +93,7 @@ public class TypeGenerator {
|
|||||||
|
|
||||||
public static RefTypeOrTPHOrWildcardOrGeneric convertTypeName(
|
public static RefTypeOrTPHOrWildcardOrGeneric convertTypeName(
|
||||||
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.keySet().contains(name)){
|
if(generics.keySet().contains(name)){
|
||||||
return new GenericRefType(new GenericTypeName(generics.get(name),name), offset);
|
return new GenericRefType(new GenericTypeName(generics.get(name),name), offset);
|
||||||
}else{
|
}else{
|
||||||
|
@ -24,6 +24,11 @@ public abstract class AbstractASTWalker implements ASTVisitor{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(GenericTypeVar genericTypeVar) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(FormalParameter formalParameter) {
|
public void visit(FormalParameter formalParameter) {
|
||||||
formalParameter.getType().accept(this);
|
formalParameter.getType().accept(this);
|
||||||
@ -87,11 +92,21 @@ public abstract class AbstractASTWalker implements ASTVisitor{
|
|||||||
superWildcardType.getInnerType().accept(this);
|
superWildcardType.getInnerType().accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(TypePlaceholder typePlaceholder) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(ExtendsWildcardType extendsWildcardType) {
|
public void visit(ExtendsWildcardType extendsWildcardType) {
|
||||||
extendsWildcardType.getInnerType().accept(this);
|
extendsWildcardType.getInnerType().accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(GenericRefType genericRefType) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(LambdaExpression lambdaExpression) {
|
public void visit(LambdaExpression lambdaExpression) {
|
||||||
lambdaExpression.params.accept(this);
|
lambdaExpression.params.accept(this);
|
||||||
@ -104,6 +119,11 @@ public abstract class AbstractASTWalker implements ASTVisitor{
|
|||||||
assign.rightSide.accept(this);
|
assign.rightSide.accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Binary binary) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(Block block) {
|
public void visit(Block block) {
|
||||||
for(Statement stmt : block.getStatements()){
|
for(Statement stmt : block.getStatements()){
|
||||||
@ -111,11 +131,41 @@ public abstract class AbstractASTWalker implements ASTVisitor{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(CastExpr castExpr) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(EmptyStmt emptyStmt) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(FieldVar fieldVar) {
|
public void visit(FieldVar fieldVar) {
|
||||||
fieldVar.receiver.accept(this);
|
fieldVar.receiver.accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ForStmt forStmt) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(IfStmt ifStmt) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(InstanceOf instanceOf) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(LocalVar localVar) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(LocalVarDecl localVarDecl) {
|
public void visit(LocalVarDecl localVarDecl) {
|
||||||
@ -133,6 +183,11 @@ public abstract class AbstractASTWalker implements ASTVisitor{
|
|||||||
visit((MethodCall) methodCall);
|
visit((MethodCall) methodCall);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(NewArray newArray) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(Receiver receiver) {
|
public void visit(Receiver receiver) {
|
||||||
receiver.expr.accept(this);
|
receiver.expr.accept(this);
|
||||||
@ -142,4 +197,49 @@ public abstract class AbstractASTWalker implements ASTVisitor{
|
|||||||
public void visit(Return aReturn) {
|
public void visit(Return aReturn) {
|
||||||
aReturn.retexpr.accept(this);
|
aReturn.retexpr.accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ReturnVoid aReturn) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(StaticClassName staticClassName) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Super aSuper) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(This aThis) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(UnaryPlus unaryPlus) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(WhileStmt whileStmt) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(DoStmt whileStmt) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Null aNull) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Literal literal) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,35 @@ public class JavaClassRegistry {
|
|||||||
if(name.equals(new JavaClassName(className)))return name;
|
if(name.equals(new JavaClassName(className)))return name;
|
||||||
}
|
}
|
||||||
//Jetzt noch alle importierten Packages durchsuchen:
|
//Jetzt noch alle importierten Packages durchsuchen:
|
||||||
|
JavaClassName ret = getClassFromImportedPackages(className);
|
||||||
|
if(ret == null){
|
||||||
|
throw new TypeNotPresentException(className, new Throwable());
|
||||||
|
}else{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString(){
|
||||||
|
return existingClasses.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean contains(String whole) {
|
||||||
|
boolean ret = existingClasses.contains(new JavaClassName(whole));
|
||||||
|
if(ret == false){
|
||||||
|
JavaClassName imported = getClassFromImportedPackages(whole);
|
||||||
|
if(imported != null){
|
||||||
|
existingClasses.add(imported);
|
||||||
|
return true;
|
||||||
|
}else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private JavaClassName getClassFromImportedPackages(String className){
|
||||||
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
||||||
String shortName = JavaClassName.stripClassName(className);
|
String shortName = JavaClassName.stripClassName(className);
|
||||||
for(String packageName : importedPackages) {
|
for(String packageName : importedPackages) {
|
||||||
@ -45,17 +74,7 @@ public class JavaClassRegistry {
|
|||||||
//Die Klasse wurde nicht gefunden!
|
//Die Klasse wurde nicht gefunden!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw new TypeNotPresentException(className, new Throwable());
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString(){
|
|
||||||
return existingClasses.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean contains(String whole) {
|
|
||||||
boolean ret = existingClasses.contains(new JavaClassName(whole));
|
|
||||||
if(ret == false)existingClasses.add(getName(whole));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -20,8 +20,9 @@ public class TypeInsert {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String insert(String intoSource){
|
public String insert(String intoSource){
|
||||||
String ret = intoSource;
|
|
||||||
List<TypeInsertPoint> offsets = new ArrayList<>();
|
List<TypeInsertPoint> offsets = new ArrayList<>();
|
||||||
|
String ret = point.insert(intoSource, offsets);
|
||||||
|
offsets.add(point);
|
||||||
for(TypeInsertPoint insertPoint : inserts){
|
for(TypeInsertPoint insertPoint : inserts){
|
||||||
ret = insertPoint.insert(ret, offsets);
|
ret = insertPoint.insert(ret, offsets);
|
||||||
offsets.add(insertPoint);
|
offsets.add(insertPoint);
|
||||||
|
@ -25,35 +25,13 @@ import java.util.*;
|
|||||||
* inferieren, wenn A bereits eingesetzt wurde. Es werden dann eben zusätzliche Generics entstehen
|
* inferieren, wenn A bereits eingesetzt wurde. Es werden dann eben zusätzliche Generics entstehen
|
||||||
*/
|
*/
|
||||||
public class TypeInsertFactory {
|
public class TypeInsertFactory {
|
||||||
public static List<TypeInsert> createTypeInsertPoints(SourceFile forSourcefile, ResultSet withResults){
|
|
||||||
List<TypeInsert> ret = new ArrayList<>();
|
|
||||||
for(ClassOrInterface cl : forSourcefile.getClasses()){
|
public static Set<TypeInsert> createTypeInsertPoints(SourceFile forSourcefile, ResultSet withResults){
|
||||||
//Felder:
|
return new TypeInsertPlacer().getTypeInserts(forSourcefile, withResults);
|
||||||
for(Field field : cl.getFieldDecl()){
|
|
||||||
if(field.getType() instanceof TypePlaceholder){
|
|
||||||
for(Set<Pair> pairs : withResults.results)
|
|
||||||
ret.add(createInsertPoints(
|
|
||||||
field.getType(), field.getType().getOffset(), cl, null, pairs));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(Method m : cl.getMethods()){
|
public static TypeInsert createInsertPoints(RefTypeOrTPHOrWildcardOrGeneric type, Token offset, ClassOrInterface cl, Method m,
|
||||||
if(m.getReturnType() instanceof TypePlaceholder)for(Set<Pair> pairs : withResults.results) {
|
|
||||||
ret.add(createInsertPoints(
|
|
||||||
m.getReturnType(), m.getReturnType().getOffset(), cl, m, pairs));
|
|
||||||
}
|
|
||||||
|
|
||||||
for(FormalParameter param : m.getParameterList().getFormalparalist()){
|
|
||||||
if(param.getType() instanceof TypePlaceholder)for(Set<Pair> pairs : withResults.results)
|
|
||||||
ret.add(createInsertPoints(
|
|
||||||
param.getType(), param.getType().getOffset(), cl, m, pairs));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static TypeInsert createInsertPoints(RefTypeOrTPHOrWildcardOrGeneric type, Token offset, ClassOrInterface cl, Method m,
|
|
||||||
Set<Pair> pairs) {
|
Set<Pair> pairs) {
|
||||||
Set<TypeInsertPoint> ret = new HashSet<>();
|
Set<TypeInsertPoint> ret = new HashSet<>();
|
||||||
TypeInsertPoint insertPoint = null;
|
TypeInsertPoint insertPoint = null;
|
||||||
|
99
src/de/dhbwstuttgart/typedeployment/TypeInsertPlacer.java
Normal file
99
src/de/dhbwstuttgart/typedeployment/TypeInsertPlacer.java
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
package de.dhbwstuttgart.typedeployment;
|
||||||
|
|
||||||
|
import de.dhbwstuttgart.syntaxtree.*;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.statement.LambdaExpression;
|
||||||
|
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||||
|
import de.dhbwstuttgart.typeinference.ResultSet;
|
||||||
|
import de.dhbwstuttgart.typeinference.constraints.Pair;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class TypeInsertPlacer extends AbstractASTWalker{
|
||||||
|
Set<TypeInsert> inserts = new HashSet<>();
|
||||||
|
private ResultSet withResults;
|
||||||
|
|
||||||
|
public Set<TypeInsert> getTypeInserts(SourceFile forSourceFile, ResultSet withResults){
|
||||||
|
this.withResults = withResults;
|
||||||
|
forSourceFile.accept(this);
|
||||||
|
return inserts;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ClassOrInterface classOrInterface) {
|
||||||
|
TypeInsertPlacerClass cl = new TypeInsertPlacerClass(classOrInterface, withResults);
|
||||||
|
this.inserts.addAll(cl.inserts);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
List<TypeInsert> ret = new ArrayList<>();
|
||||||
|
|
||||||
|
for(ClassOrInterface cl : forSourcefile.getClasses()){
|
||||||
|
//Felder:
|
||||||
|
for(Field field : cl.getFieldDecl()){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Method m : cl.getMethods()){
|
||||||
|
if(m.getReturnType() instanceof TypePlaceholder)for(Set<Pair> pairs : withResults.results) {
|
||||||
|
ret.add(createInsertPoints(
|
||||||
|
m.getReturnType(), m.getReturnType().getOffset(), cl, m, pairs));
|
||||||
|
}
|
||||||
|
|
||||||
|
for(FormalParameter param : m.getParameterList().getFormalparalist()){
|
||||||
|
if(param.getType() instanceof TypePlaceholder)for(Set<Pair> pairs : withResults.results)
|
||||||
|
ret.add(createInsertPoints(
|
||||||
|
param.getType(), param.getType().getOffset(), cl, m, pairs));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
class TypeInsertPlacerClass extends AbstractASTWalker{
|
||||||
|
private final ResultSet results;
|
||||||
|
private final ClassOrInterface cl;
|
||||||
|
public final Set<TypeInsert> inserts = new HashSet<>();
|
||||||
|
|
||||||
|
TypeInsertPlacerClass(ClassOrInterface forClass, ResultSet withResults){
|
||||||
|
this.cl = forClass;
|
||||||
|
this.results = withResults;
|
||||||
|
forClass.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Method method) {
|
||||||
|
TypeInsertPlacerMethod mWalker = new TypeInsertPlacerMethod(method);
|
||||||
|
super.visit(method);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(Field field) {
|
||||||
|
if(field.getType() instanceof TypePlaceholder){
|
||||||
|
for(Set<Pair> pairs : results.results)
|
||||||
|
inserts.add(TypeInsertFactory.createInsertPoints(
|
||||||
|
field.getType(), field.getType().getOffset(), cl, null, pairs));
|
||||||
|
}
|
||||||
|
super.visit(field);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TypeInsertPlacerMethod extends AbstractASTWalker{
|
||||||
|
TypeInsertPlacerMethod(Method forMethod){
|
||||||
|
forMethod.accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(ParameterList params) {
|
||||||
|
super.visit(params);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visit(LambdaExpression lambdaExpression) {
|
||||||
|
//Lambda-Ausdrücke brauchen keine Typeinsetzungen
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -11,7 +11,7 @@ public class TypeInsertPoint {
|
|||||||
|
|
||||||
public TypeInsertPoint(Token point, String toInsert){
|
public TypeInsertPoint(Token point, String toInsert){
|
||||||
this.point = point;
|
this.point = point;
|
||||||
this.insertString = (toInsert.length()>1) ? toInsert + " " : toInsert;
|
this.insertString = (toInsert.endsWith(" ")) ? toInsert : toInsert + " " ;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String insert(String intoSource, List<TypeInsertPoint> additionalOffset){
|
public String insert(String intoSource, List<TypeInsertPoint> additionalOffset){
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
class mathStruc<A> {
|
class mathStruc<A> {
|
||||||
|
|
||||||
|
a;
|
||||||
|
|
||||||
mathStruc(A a) { }
|
mathStruc(A a) { }
|
||||||
|
|
||||||
A model(){ A a; return a; }
|
A model(){ A a; return a; }
|
||||||
|
@ -22,6 +22,7 @@ import java.nio.file.Files;
|
|||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
@ -44,7 +45,7 @@ public class JavaTXCompilerTest extends JavaTXCompiler {
|
|||||||
for(File f : filesToTest){
|
for(File f : filesToTest){
|
||||||
SourceFile sf = this.parse(f);
|
SourceFile sf = this.parse(f);
|
||||||
System.out.println(ASTTypePrinter.print(this.sourceFiles.get(sourceFiles.size()-1)));
|
System.out.println(ASTTypePrinter.print(this.sourceFiles.get(sourceFiles.size()-1)));
|
||||||
List<TypeInsert> result = TypeInsertFactory.createTypeInsertPoints(sf, this.typeInference());
|
Set<TypeInsert> result = TypeInsertFactory.createTypeInsertPoints(sf, this.typeInference());
|
||||||
String content = readFile(f.getPath(), StandardCharsets.UTF_8);
|
String content = readFile(f.getPath(), StandardCharsets.UTF_8);
|
||||||
for(TypeInsert tip : result){
|
for(TypeInsert tip : result){
|
||||||
System.out.println(tip.insert(content));
|
System.out.println(tip.insert(content));
|
||||||
|
Loading…
Reference in New Issue
Block a user