/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.drill.exec.expr.fn; import java.io.Writer; import java.util.List; import org.codehaus.janino.Java; import org.codehaus.janino.UnparseVisitor; import org.codehaus.janino.util.AutoIndentWriter; /** * This is a modified version of {@link UnparseVisitor} so that we can avoid * rendering few things. Based on janino version 2.7.4. */ public class ModifiedUnparseVisitor extends UnparseVisitor { private String returnLabel; /** * Testing of parsing/unparsing. * <p> * Reads compilation units from the files named on the command line * and unparses them to {@link System#out}. */ public static void main(String[] args) throws Exception { UnparseVisitor.main(args); } /** * Unparse the given {@link Java.CompilationUnit} to the given {@link Writer}. */ public static void unparse(Java.CompilationUnit cu, Writer w) { UnparseVisitor.unparse(cu, w); } public ModifiedUnparseVisitor(Writer w) { super(w); } @Override public void visitMethodDeclarator(Java.MethodDeclarator md) { if (md.optionalStatements == null) { this.pw.print(';'); } else if (md.optionalStatements.isEmpty()) { this.pw.print(" {}"); } else { this.pw.println(' '); // Add labels to handle return statements within function templates String[] fQCN = md.getDeclaringType().getClassName().split("\\."); returnLabel = fQCN[fQCN.length - 1] + "_" + md.name; this.pw.println(returnLabel + ": {"); this.pw.print(AutoIndentWriter.INDENT); this.unparseStatements(md.optionalStatements); this.pw.print(AutoIndentWriter.UNINDENT); this.pw.println("}"); this.pw.print(' '); } } @Override public void visitReturnStatement(Java.ReturnStatement rs) { this.pw.print("break " + returnLabel); if (rs.optionalReturnValue != null) { this.pw.print(' '); this.unparse(rs.optionalReturnValue); } this.pw.print(';'); } /* * The following helper methods are copied from the parent class since they * are declared private in the parent class and can not be used in the child * class (this). */ private void unparseStatements(List<? extends Java.BlockStatement> statements) { int state = -1; for (Java.BlockStatement bs : statements) { int x = ( bs instanceof Java.Block ? 1 : bs instanceof Java.LocalClassDeclarationStatement ? 2 : bs instanceof Java.LocalVariableDeclarationStatement ? 3 : bs instanceof Java.SynchronizedStatement ? 4 : 99 ); if (state != -1 && state != x) { this.pw.println(AutoIndentWriter.CLEAR_TABULATORS); } state = x; this.unparseBlockStatement(bs); this.pw.println(); } } private void unparseBlockStatement(Java.BlockStatement blockStatement) { blockStatement.accept(this); } private void unparse(Java.Atom operand) { operand.accept(this); } }