Fehler in Umwandlung von GTV zu TPH beheben

This commit is contained in:
JanUlrich 2015-03-04 13:50:09 +01:00
parent 1ec9c3f67f
commit e8538be1c2
4 changed files with 24 additions and 14 deletions

View File

@ -5,6 +5,7 @@ import java.util.Vector;
import de.dhbwstuttgart.syntaxtree.type.Type; import de.dhbwstuttgart.syntaxtree.type.Type;
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder; import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
import de.dhbwstuttgart.typeinference.exceptions.DebugException;
/** /**
* Im Grunde Sammlung von Pair s mit Equal-Operatoren. * Im Grunde Sammlung von Pair s mit Equal-Operatoren.

View File

@ -327,15 +327,27 @@ public class TypeAssumptions {
//if(ass.inheritsType(t))return t; //if(ass.inheritsType(t))return t;
if(ass.getIdentifier().equals(t.getName())){ if(ass.getIdentifier().equals(t.getName())){
//Generische Variable gefunden! //Generische Variable gefunden!
//Erkennen, ob sich inNode im gleichen Kontext wie die GTV aus den Assumptions befindet.
boolean sameContext = true;
//Der GTV-Kontext der einzusetzenden GTV
GTVDeclarationContext gtvDeclNode = ass.getAssumedType().getDeclarationContext(); GTVDeclarationContext gtvDeclNode = ass.getAssumedType().getDeclarationContext();
if(gtvDeclNode == null || gtvDeclNode.isClass() //Der GTV-Kontext von inNOde
|| !gtvDeclNode.equals(inNode.getGTVDeclarationContext())){ //hier muss nach der ParentClass von inNode gefragt werden, da die ParentClass von t nicht immer korrekt ist! (TODO: Überprüfen) GTVDeclarationContext gtvNode = inNode.getGTVDeclarationContext();
//Überprüfungen (siehe Dokumentation):
if(gtvDeclNode.isClass()){ //GTV wurde in Klasse definiert
if(! gtvNode.getParentClass().equals(gtvDeclNode))sameContext = false;
}else{ //GTV wurde in Methode oder Feld definiert:
if(! gtvNode.equals(gtvDeclNode))sameContext = false;
}
if(sameContext){
TypeAssumptions.log.debug(t+" ist in Klasse: "+ass.getAssumedType().getParentClass(), Section.ASSUMPTIONS);
return new ConstraintType(ass.getAssumedType());
}else{
TypeAssumptions.log.debug(t+" ist NICHT in Klasse: "+ass.getAssumedType().getParentClass(), Section.ASSUMPTIONS); TypeAssumptions.log.debug(t+" ist NICHT in Klasse: "+ass.getAssumedType().getParentClass(), Section.ASSUMPTIONS);
//Ist die Generische Variable nicht aus dieser Klasse, so muss sie zu einem TPH umgewandelt werden: //Ist die Generische Variable nicht aus dieser Klasse, so muss sie zu einem TPH umgewandelt werden:
return new ConstraintType(ass.getAssumedType().getTypePlaceHolder(inNode)); return new ConstraintType(ass.getAssumedType().getTypePlaceHolder(inNode));
} }
TypeAssumptions.log.debug(t+" ist in Klasse: "+ass.getAssumedType().getParentClass(), Section.ASSUMPTIONS);
return new ConstraintType(ass.getAssumedType());
} }
} }

View File

@ -4,23 +4,20 @@ import java.util.Vector;
import org.junit.Test; import org.junit.Test;
import de.dhbwstuttgart.logger.Logger;
import de.dhbwstuttgart.logger.LoggerConfiguration;
import de.dhbwstuttgart.logger.Section;
public class GenericTypeVarTest { public class GenericTypeVarTest {
private static final String TEST_FILE = "GenericTypeVarTest.jav"; private static final String TEST_FILE = "GenericTypeVarTest.jav";
private static final String TEST_FILE2 = "GenericTypeVarTest2.jav";
/*
@Test @Test
public void run(){ public void run(){
Logger.setStandardConfiguration(new LoggerConfiguration().setOutput(Section.ASSUMPTIONS, System.out));
Vector<String> mustContain = new Vector<String>(); Vector<String> mustContain = new Vector<String>();
mustContain.add("String methode"); mustContain.add("String methode");
MultipleTypesInsertTester.test(this.TEST_FILE, mustContain); MultipleTypesInsertTester.test(this.TEST_FILE, mustContain);
} }
*/
@Test
public void run2(){
Vector<String> mustContain = new Vector<String>();
mustContain.add("String var2");
MultipleTypesInsertTester.test(TEST_FILE2, mustContain);
}
} }

View File

@ -11,7 +11,7 @@ public class IntTest {
@Test @Test
public void run(){ public void run(){
Vector<String> mustContain = new Vector<String>(); Vector<String> mustContain = new Vector<String>();
mustContain.add("int var"); mustContain.add("Integer var");
MultipleTypesInsertTester.test(this.TEST_FILE, mustContain); MultipleTypesInsertTester.test(this.TEST_FILE, mustContain);
} }