Merge branch 'master' of ssh://gohorb.ba-horb.de/bahome/projekt/git/JavaCompilerCore

This commit is contained in:
Dr. Martin Pluemicke 2015-03-05 13:58:50 +01:00
commit 549640dfc4
8 changed files with 57 additions and 40 deletions

View File

@ -29,6 +29,17 @@
* Stellt die Typeinsetzung für eine der generierten Lösungen dar
* Setzt alle Typen und generischen Variablen ein, welche zu dieser Lösung gehören
### Einsetzen von Generischen Variablen
Die einzusetzenden Generischen Variablen werden erst beim Einsetzen eines Typs generiert.
* Ablauf:
* 1. Alle TypePlaceholder im einzusetzenden Typ ermitteln.
* 2. Alle Constraints die mit diesen TPHs zusammenhängen ermitteln (Das kann möglicherweise wegfallen)
* 3. Alle TPHs, aus Schritt 1 und 2 zusammenfügen.
* 4. Kontrollieren, welche TPHs in dem InsertKontext noch nicht bekannt sind.
* 5. Alle Unbekannten TPHs herausfiltern (von den Pairs nur TA2)
* 6. Alle unbekannten TPHs + Pairs als GenericTypeInsertPoint deklarieren.
## Ablauf Typinferenz:
1. Parsen
@ -53,19 +64,4 @@
5. Einsetzen eines TypeInsertSet (optional)
1. Auf allen TypeInsertPoints die getUnresolvedTPHs-Methoden aufrufen
2. Alle Abhängigkeiten dieser
# Typinferenz für Java 8
## Programmablauf
1. SourceFile parst die Java-Dateien
2. SourceFile erstellt die Basic/Global Assumptions
3. Das Globale AssumptionSet wird anschließend jeder Klasse im Syntaxbaum mit dem TRProg aufruf übergeben
4. Jede Klasse verwaltet lokale Variablen in ihrem eigenen AssumptionSet. Das Globale ist Klassenübergreifend und jede AssumptionType darf darin nur einmalig gesetzt werden.
5. Haben alle Klassen ihrer Constraints erstellt können diese Unifiziert werden.
## Overloading
* Die Overloading Klasse generiert Constraints aus einem Methodenaufruf.

View File

@ -88,14 +88,16 @@ public class BoundedGenericTypeVar extends GenericTypeVar
ConstraintsSet ret = super.TYPE(ass);
//ass.addGenericVarAssumption(this);
//Die Type methode der BoundedGenericTypeVar schreibt zusätzlich noch die Constraints für die bounds
Vector<Type> tempBounds = new Vector<>();
if(this.bounds != null){
for(Type ev : this.bounds){
ConstraintType extendsType = ass.getTypeFor(ev, this);
if(extendsType == null)throw new TypeinferenceException("Der Typ "+ev.getName()+" ist nicht korrekt", this);
tempBounds.add(extendsType.getType());
//ret.add(new SingleConstraint(ass.getTypeFor(this, this), extendsType ));
}
}
this.bounds = tempBounds;
return ret;
}

View File

@ -5,6 +5,7 @@ import java.util.Vector;
import de.dhbwstuttgart.syntaxtree.type.Type;
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
import de.dhbwstuttgart.typeinference.exceptions.DebugException;
/**
* Im Grunde Sammlung von Pair s mit Equal-Operatoren.
@ -104,7 +105,6 @@ public class ResultSet implements Iterable<Pair> {
}
}
}
return ret;
}

View File

@ -327,15 +327,27 @@ public class TypeAssumptions {
//if(ass.inheritsType(t))return t;
if(ass.getIdentifier().equals(t.getName())){
//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();
if(gtvDeclNode == null || gtvDeclNode.isClass()
|| !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)
//Der GTV-Kontext von inNOde
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);
//Ist die Generische Variable nicht aus dieser Klasse, so muss sie zu einem TPH umgewandelt werden:
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

@ -170,15 +170,17 @@ class GenericVarPatch {
public void removeUnusedTPHs(Vector<TypePlaceholder> usedTPHs) {
this.usedTPHs = usedTPHs;
return;
/*
for(TypePlaceholder tph : usedTPHs){
//Zuerst alle extends Typen kontrollieren und entfernen:
for(GenericVarExtendsDeclarationPatch p : this.genericVarExtendDeclarations){
if(p.definesGenericVar(tph))return;
}
}
*/
}
/*
for(TypePlaceholder tph : usedTPHs){
//Zuerst alle extends Typen kontrollieren und entfernen:
for(GenericVarExtendsDeclarationPatch p : this.genericVarExtendDeclarations){
if(p.definesGenericVar(tph))return;
}
}
*/
}

View File

@ -92,7 +92,15 @@ public class TypeInsertSet {
allTPHs.add(tph);
}
}
for(Pair pair : pairs)
for(TypePlaceholder tph : pair.getTypePlaceholder()){
if(!allTPHs.contains(tph)){
allTPHs.add(tph);
}
}
//TODO: Schritt 4 (Es wird nicht kontrolliert, ob der TPH in dem Kontext schon bekannt ist)
/*
// und Schritt 5: (Es werden nur die TPHs übernommen, welche noch nicht in den involvedTPHs vorkommen)
for(Pair pair : pairs)for(Type t : pair.getTypes())for(TypePlaceholder tph : t.getInvolvedTypePlaceholder()){

View File

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