private Java.MethodDeclarator generateBackendMethod(Parser parser) throws Exception { Location loc = parser.location(); List<Java.BlockStatement> statements = Lists.newArrayList(); Java.Rvalue[] exprs = parser.parseExpressionList(); for (int i=0; i<exprs.length; i++) { if (i == exprs.length - 1) { statements.add(maybeGenerateReturn(loc, exprs[i])); } else { statements.add(new Java.ExpressionStatement(exprs[i])); } } return new Java.MethodDeclarator(loc, null, new Java.Modifiers(Mod.PRIVATE), classToType(loc, returnType), "doEval", generateArgs(loc, schema.tupleClass()), new Java.Type[0], statements ); }
private void generateEvaluatorClass() throws Exception { Scanner scanner = new Scanner(null, new StringReader(expression)); Parser parser = new Parser(scanner); Location loc = parser.location(); String className = "TupleExpression" + counter.incrementAndGet(); setClassName(packageName + "." + className); Java.CompilationUnit cu = makeCompilationUnit(parser); cu.setPackageDeclaration(new Java.PackageDeclaration(loc, packageName)); Java.PackageMemberClassDeclaration cd = new Java.PackageMemberClassDeclaration(loc, null, new Java.Modifiers(Mod.PUBLIC), className, null, null, new Java.Type[] { classToType(loc, iface) } ); cu.addPackageMemberTypeDeclaration(cd); cd.addConstructor(nullConstructor(loc)); cd.addDeclaredMethod(generateFrontendMethod(loc)); cd.addDeclaredMethod(generateBackendMethod(parser)); this.evaluatorClass = compileToClass(cu); this.evaluator = evaluatorClass.getConstructor().newInstance(); }