JavaPatternMatching/src/mycompiler/mystatement/ExprStmt.java
2013-10-18 13:33:46 +02:00

162 lines
5.4 KiB
Java
Executable File
Raw Blame History

// ino.module.ExprStmt.8631.package
package mycompiler.mystatement;
// ino.end
// ino.module.ExprStmt.8631.import
import java.util.Iterator;
import java.util.Vector;
import mycompiler.MyCompiler;
import mycompiler.mytype.Pair;
import mycompiler.mytype.Type;
import mycompiler.mytype.TypePlaceholder;
import mycompiler.mytypereconstruction.CSupportData;
import mycompiler.mytypereconstruction.CTriple;
import mycompiler.mytypereconstruction.replacementlistener.CReplaceTypeEvent;
import mycompiler.mytypereconstruction.replacementlistener.ITypeReplacementListener;
import mycompiler.mytypereconstruction.set.CSubstitutionSet;
import mycompiler.mytypereconstruction.set.CTripleSet;
import mycompiler.mytypereconstruction.unify.Unify;
import org.apache.log4j.Logger;
// ino.end
// ino.class.ExprStmt.25265.declaration
public abstract class ExprStmt extends Statement implements ITypeReplacementListener
// ino.end
// ino.class.ExprStmt.25265.body
{
// ino.method.ExprStmt.25270.definition
public ExprStmt(int offset, int variableLength)
// ino.end
// ino.method.ExprStmt.25270.body
{
super(offset,variableLength);
}
// ino.end
// ino.attribute.type.25273.declaration
//protected Type type; // Type type;
// ino.end
// ino.attribute.inferencelog.25276.declaration
protected static Logger inferencelog = Logger.getLogger("inference");
// ino.end
// ino.method.getTypeName.25279.definition
public String getTypeName()
// ino.end
// ino.method.getTypeName.25279.body
{
if (getTypeVariable()!=null)
return getTypeVariable().getName();
else
return null;
}
// ino.end
// ino.method.getType.25282.definition
public Type getType()
// ino.end
// ino.method.getType.25282.body
{
return getTypeVariable();
}
// ino.end
// ino.method.getTypeLineNumber.25291.defdescription type=javadoc
/**
* <br>Author: J<>rg B<>uerle
* @return
*/
// ino.end
// ino.method.getTypeLineNumber.25291.definition
public int getTypeLineNumber()
// ino.end
// ino.method.getTypeLineNumber.25291.body
{
return MyCompiler.NO_LINENUMBER;
}
// ino.end
// ino.method.unifyAndRegisterType.25294.definition
CTripleSet unifyAndRegisterType(CTripleSet ret, CSupportData supportData)
// ino.end
// ino.method.unifyAndRegisterType.25294.body
{
CTripleSet returnSet = new CTripleSet();
Iterator retIt = ret.getIterator();
while(retIt.hasNext()){
CTriple retTriple = (CTriple)retIt.next();
// --------------------------
// ReturnType mit type von this unifizieren:
// --------------------------
Vector<Vector<Pair>> unifierPossibilities = Unify.unify(retTriple.getResultType(), this.getType(), supportData.getFiniteClosure());
// --------------------------
// Wenn Unifier vorhanden, dann
// anwenden und Triple hinzuf<75>gen:
// --------------------------
if(unifierPossibilities.size()!=0){
// --------------------------
// Subset bauen:
// --------------------------
CTripleSet subSet = new CTripleSet();
// --------------------------
// Alle m<>glichen Unifier anwenden:
// --------------------------
for(int j=0; j<unifierPossibilities.size(); j++){
CSubstitutionSet unifier2 = new CSubstitutionSet(unifierPossibilities.elementAt(j));
CTriple intTriple2 = retTriple.cloneAndApplyUnify(unifier2);
//intTriple2.setResultType(new RefType("Boolean"));
intTriple2.setResultType(unifier2.applyThisSubstitutionSet(this.getType()));
// --------------------------
// Triple zu R<>ckgabemenge hinzuf<75>gen
// --------------------------
subSet.addElement(intTriple2);
}
returnSet.unite(subSet);
}
}
return returnSet;
}
// ino.end
// ino.method.registerType.25297.definition
CTripleSet registerType(CTripleSet ret, CSupportData supportData)
// ino.end
// ino.method.registerType.25297.body
{
CTripleSet returnSet = new CTripleSet();
Iterator retIt = ret.getIterator();
while(retIt.hasNext()){
CTriple retTriple = (CTriple)retIt.next();
if (this.getType() instanceof TypePlaceholder) {
// --------------------------
// ReturnType mit type von this unifizieren:
// --------------------------
Vector<Pair> tlvRestype = new Vector<Pair>();
tlvRestype.addElement(new Pair(this.getType(), retTriple.getResultType()));
CSubstitutionSet unifier2 = new CSubstitutionSet(tlvRestype);
// --------------------------
// Unifier zu retTriple hinzufuegen
// --------------------------
CTriple intTriple2 = retTriple.cloneAndApplyUnify(unifier2);
//intTriple2.setResultType(unifier2.applyThisSubstitutionSet(this.getType()));
// --------------------------
// Triple zu R<>ckgabemenge hinzuf<75>gen
// --------------------------
returnSet.addElement(intTriple2);
}
else {//Typ war vorher schon explizit definiert
if (this.getType().equals(retTriple.getResultType())) {
returnSet.addElement(retTriple);
}
}
}
return returnSet;
}
// ino.end
}
// ino.end