package slangc.model.expressions; import slangc.api.BytecodeInstructionWriter; import slangc.api.Reporter; import slangc.bytecode.TypeSignature; import slangc.model.ClauseModel; import slangc.model.ExpressionModel; import slangc.model.ExpressionOwner; import slangc.model.ExpressionResult; import slangc.model.MethodModel; import slangc.model.TypeModel; import slangc.model.UserTypeModel; import slangc.model.clauses.Arguments; import slangc.parser.Branch; import slangc.parser.Node; public class SuperMethodCallExpression extends ExpressionModel implements ExpressionOwner { private String name; private Arguments arguments; public SuperMethodCallExpression(ExpressionOwner owner, Node source) { super(owner, source); name = UserTypeModel.plainName(((Branch)((Branch)source).getSubnode(2)).getSubnode(0)); arguments = (Arguments)ClauseModel.construct(this, ((Branch)source).getSubnode(3)); //sourceFile.annotate(ErrorType.INTERNAL_ERROR, "Unrecognised expression (Internal error/TODO)"); } @Override public void dump(Reporter reporter, String indent, String incr) { reporter.note("DUMP", indent + "> Super method call expression '" + name + "' of:"); dumpResolved(reporter, indent + incr, incr); arguments.dump(reporter, indent + incr, incr); } @Override protected ExpressionResult resolveResult() { targetMethod = bestTargetMethod(((UserTypeModel) getOwner().getMethodOrField().getOwner()).getBaseClass().getMethods(name, true), arguments); return ExpressionResult.fromMethodResult(targetMethod); } public String getName() { return name; } @Override public TypeModel getExpectedResult(ExpressionModel e) { // TODO Auto-generated method stub return null; } public Arguments getArguments() { return arguments; } @Override public ExpressionModel[] getSubexpressions() { return arguments.getSubexpressions(); } private MethodModel targetMethod = null; @Override public boolean hasTargetMethod() { return true; } @Override public MethodModel getTargetMethod() { // TODO Auto-generated method stub return targetMethod; } @Override public TypeSignature innerGenerate(BytecodeInstructionWriter w) { arguments.generate(w, getTargetMethod(), true); if (!getTargetMethod().isStatic()) { // TODO: Handle outer-this calls w.genThis(); } w.genCall(getTargetMethod().getMethodSignature(), true); return getTargetMethod().getMethodSignature().returnType; } public TypeModel resolveType(Node n) { return super.resolveType(n); // TODO: Better support for interfaces } }