JavaPatternMatching/src/de/dhbwstuttgart/syntaxtree/SyntaxTreeNode.java

139 lines
4.8 KiB
Java
Raw Normal View History

2014-09-04 14:35:44 +00:00
package de.dhbwstuttgart.syntaxtree;
2014-02-11 01:47:39 +00:00
2016-07-21 14:36:33 +00:00
import org.apache.bcel.generic.ClassGen;
2014-02-19 04:20:54 +00:00
import de.dhbwstuttgart.typeinference.Menge;
import de.dhbwstuttgart.bytecode.ClassGenerator;
2014-09-08 13:12:47 +00:00
import de.dhbwstuttgart.core.IItemWithOffset;
2014-09-02 08:33:54 +00:00
import de.dhbwstuttgart.syntaxtree.type.GenericTypeVar;
import de.dhbwstuttgart.syntaxtree.type.Type;
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
2014-09-08 13:12:47 +00:00
import de.dhbwstuttgart.typeinference.Pair;
2014-09-02 08:33:54 +00:00
import de.dhbwstuttgart.typeinference.ResultSet;
import de.dhbwstuttgart.typeinference.TypeInsertable;
import de.dhbwstuttgart.typeinference.TypeinferenceResultSet;
2014-09-02 08:33:54 +00:00
import de.dhbwstuttgart.typeinference.exceptions.DebugException;
import de.dhbwstuttgart.typeinference.exceptions.TypeinferenceException;
import de.dhbwstuttgart.typeinference.typedeployment.GenericTypeInsertPoint;
import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertPoint;
import de.dhbwstuttgart.typeinference.typedeployment.TypeInsertSet;
2014-09-08 13:12:47 +00:00
public abstract class SyntaxTreeNode implements IItemWithOffset{
2014-02-12 01:12:12 +00:00
2014-02-19 04:20:54 +00:00
protected SyntaxTreeNode parent;
2014-02-11 01:47:39 +00:00
/**
* Wird nach dem Parsen aufgerufen.
* Erfüllt folgenden Aufgaben:
* 1. ¼llt fehlende Typangaben mit TPHs auf.
* 2. Verknüpft die Knoten des Syntaxbaums. (setzt Parent)
2014-04-09 12:12:55 +00:00
* 3. Wechselt RefTypes gegebenenfalls mit GenericTypeVars aus.
* 4. ¼hrt einen Teil des Syntaxckecks durch.
*
*/
2014-02-12 01:12:12 +00:00
public void parserPostProcessing(SyntaxTreeNode parent) {
if(parent == null)throw new NullPointerException();
2014-02-12 01:12:12 +00:00
this.parent = parent;
2014-09-09 09:15:10 +00:00
for(SyntaxTreeNode node : this.getChildren())
if(node!=null)node.parserPostProcessing(this);
2014-02-12 01:12:12 +00:00
}
public SyntaxTreeNode getParent() {
//if(this.parent == null)throw new NullPointerException();
2014-02-12 01:12:12 +00:00
return this.parent;
}
public abstract Menge<? extends SyntaxTreeNode> getChildren();
public Class getParentClass(){
SyntaxTreeNode parent = this.getParent();
if(parent instanceof Class)return (Class)parent;
if(parent == null)
throw new DebugException("Das Wurzelelement eines Syntaxbaumes muss Class sein");
return parent.getParentClass();
}
/**
* Eine Beschreibung/Name des SyntaxTree-Nodes
* Hat nichts mit der Description im Bytecode zu tun,
* wird für die Anzeige des AST im Plugin verwendet
* @return
*/
public String getDescription(){
return this.toString();
}
2014-03-14 15:34:25 +00:00
2014-04-09 12:12:55 +00:00
2014-03-14 15:34:25 +00:00
@Override
public boolean equals(Object object){
if(!(object instanceof SyntaxTreeNode))return false;
SyntaxTreeNode equal = (SyntaxTreeNode)object;
if(!equal.getDescription().equals(this.getDescription()))return false;
2014-03-17 16:55:55 +00:00
if(this.getParent()!=null)
if(!this.getParent().equals(equal.getParent()))return false; //auch das Elternelement überprüfen.
2014-03-14 15:34:25 +00:00
return true;
}
2014-05-07 07:36:31 +00:00
/**
* Methode zur Generierung der TypeInsertPoints
* @param insertSet - Generierte InsertPoints werden dem insertSet angefügt
2014-05-07 07:36:31 +00:00
* @param result - Das ResultSet auf dessen Basis die InsertPoints generiert werden
*/
public void addTypeInsertPoints(TypeInsertSet insertSet,ResultSet result) {
for(SyntaxTreeNode node : this.getChildren()){
node.addTypeInsertPoints(insertSet, result);
}
TypeInsertPoint tip = null; //Der TypInsertPoint für diesen Knoten
//Fall der Knoten ein TypeInsertable ist, kann direkt der TypeInsertPoint generiert werden.
if(this instanceof TypeInsertable){
TypeInsertable that = (TypeInsertable)this;
Type t = that.getType();
if(t instanceof TypePlaceholder){
tip = that.createTypeInsertPoint((TypePlaceholder) t, result);
insertSet.add(tip);//ret.addAll(((TypePlaceholder)t).getTypeInsertPoints(result));
}
/*
//Für den Fall, dass dieser Knoten Generische Variablen halten kann.
if(that instanceof Generic && that.getOffset()>=0){
//Alle unresolvedTPHs ermitteln und GenericTypeVarInsertPoints bilden:
Menge<TypePlaceholder> uTPHs = insertSet.getUnresolvedTPHs();
if(uTPHs.size()>0){//Nur wenn es auch unresolvedTPHs gibt:
Menge<Pair> gPairs = result.getConstraintsFor(uTPHs);
if(gPairs.size()>0){
GenericTypeInsertPoint genericTIP = new GenericTypeInsertPoint(that,gPairs,result);
insertSet.add(genericTIP);
}
}
}
*/
2014-05-07 07:36:31 +00:00
}
2014-09-10 21:32:36 +00:00
}
public boolean seesType(Type tA2) {
//TODO: Implementieren. Hier sollte ein Lookup in die Assumptions dieses Knotens erfolgen
return false;
}
public SyntaxTreeNode getMatchingParentNode(SyntaxTreeNode inNode) {
SyntaxTreeNode node = inNode;
while(node!=null){
if(node.equals(this))return this;
node = inNode.getParent();
}
if(this.getParent()!=null)return this.getParent().getMatchingParentNode(inNode);
return null;
}
public GTVDeclarationContext getGTVDeclarationContext(){
if(this.getParent()==null)
throw new NullPointerException();//throw new DebugException("getGTVDeclarationContext auf unzulässiger Klasse aufgerufen");
return this.getParent().getGTVDeclarationContext();
}
2014-02-11 01:47:39 +00:00
}