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 AutomaticMethodCallExpression extends ExpressionModel /*implements ExpressionOwner*/ { private String name; private Arguments arguments; private MethodModel targetMethod; public AutomaticMethodCallExpression(ExpressionOwner owner, Node source) { super(owner, source); name = UserTypeModel.plainName(((Branch)((Branch)source).getSubnode(0)).getSubnode(0)); arguments = (Arguments)ClauseModel.construct(this, ((Branch)source).getSubnode(1)); //sourceFile.annotate(ErrorType.INTERNAL_ERROR, "Unrecognised expression (Internal error/TODO)"); } @Override public void dump(Reporter reporter, String indent, String incr) { reporter.note("DUMP", indent + "> Automatic method call expression '" + name + "' of:"); dumpResolved(reporter, indent + incr, incr); arguments.dump(reporter, indent + incr, incr); } 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(); } @Override protected ExpressionResult resolveResult() { targetMethod = bestTargetMethod(lookupSimpleMethod(name), arguments); return ExpressionResult.fromMethodResult(targetMethod); } @Override public boolean hasTargetMethod() { return true; } @Override public MethodModel getTargetMethod() { return targetMethod; } @Override public TypeSignature innerGenerate(BytecodeInstructionWriter w) { arguments.generate(w, getTargetMethod(), true); if (!getTargetMethod().isStatic()) { OuterThisExpression.generatePossibleOuterThis(w, (UserTypeModel)getMethodOrField().getOwner(), getTargetMethod().getOwner()); } w.genCall(getTargetMethod().getMethodSignature()); return getTargetMethod().getMethodSignature().returnType; } public TypeModel resolveType(Node n) { return super.resolveType(n); // TODO: Better support for interfaces } }