package x10.wala.analysis.typeInference; import x10.wala.classLoader.X10LanguageImpl; import x10.wala.ssa.AstX10InstructionVisitor; import x10.wala.ssa.AtStmtInstruction; import x10.wala.ssa.AtomicInstruction; import x10.wala.ssa.FinishInstruction; import x10.wala.ssa.HereInstruction; import x10.wala.ssa.NextInstruction; import x10.wala.ssa.IterHasNextInstruction; import x10.wala.ssa.IterInitInstruction; import x10.wala.ssa.IterNextInstruction; import x10.wala.ssa.TupleInstruction; import com.ibm.wala.analysis.typeInference.ConeType; import com.ibm.wala.analysis.typeInference.JavaPrimitiveType; import com.ibm.wala.cast.java.analysis.typeInference.AstJavaTypeInference; import com.ibm.wala.classLoader.IClass; import com.ibm.wala.ipa.cha.IClassHierarchy; import com.ibm.wala.ssa.IR; import com.ibm.wala.types.TypeReference; import com.ibm.wala.util.debug.Assertions; public class AstX10TypeInference extends AstJavaTypeInference { protected X10LanguageImpl x10Lang; public AstX10TypeInference(IR ir, IClassHierarchy cha, boolean doPrimitives) { super(ir, cha, doPrimitives); x10Lang = (X10LanguageImpl) language; } protected class AstX10TypeOperatorFactory extends AstJavaTypeOperatorFactory implements AstX10InstructionVisitor { public void visitAtomic(AtomicInstruction instruction) { Assertions.UNREACHABLE("Type operator requested for X10 atomic statement"); } public void visitFinish(FinishInstruction instruction) { Assertions.UNREACHABLE("Type operator requested for X10 finish statement"); } public void visitNext(NextInstruction instruction) { Assertions.UNREACHABLE("Type operator requested for X10 next statement"); } public void visitIterInit(IterInitInstruction instruction) { TypeReference type = x10Lang.getIteratorType(); IClass klass = cha.lookupClass(type); result = new DeclaredTypeOperator(new ConeType(klass)); } public void visitIterHasNext(IterHasNextInstruction instruction) { if (!doPrimitives) { result = null; } else { result = new DeclaredTypeOperator(JavaPrimitiveType.BOOLEAN); } } public void visitIterNext(IterNextInstruction instruction) { // Pretend that this instruction produces a value of type x10.lang.Any. TypeReference type = x10Lang.getAnyType(); IClass klass = cha.lookupClass(type); result = new DeclaredTypeOperator(new ConeType(klass)); } public void visitHere(HereInstruction instruction) { TypeReference type = x10Lang.getPlaceType(); IClass klass = cha.lookupClass(type); result = new DeclaredTypeOperator(new ConeType(klass)); } public void visitTuple(TupleInstruction tupleInstruction) { TypeReference type = x10Lang.getArrayType(); IClass klass= cha.lookupClass(type); result = new DeclaredTypeOperator(new ConeType(klass)); } public void visitAtStmt(final AtStmtInstruction atStmtInstruction) { Assertions.UNREACHABLE("Type operator requested for X10 at statement"); } } protected void initialize() { init(ir, new TypeVarFactory(), new AstX10TypeOperatorFactory()); } }