/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.ir; import gw.internal.gosu.compiler.DebugFlag; import gw.internal.gosu.ir.compiler.bytecode.IRClassCompiler; import gw.internal.gosu.ir.compiler.java.IRJavaCompiler; import gw.internal.gosu.ir.compiler.verifier.IRTreeVerifier; import gw.internal.gosu.ir.transform.GosuClassTransformer; import gw.internal.gosu.ir.transform.GosuFragmentTransformer; import gw.internal.gosu.parser.IGosuClassInternal; import gw.internal.gosu.parser.fragments.GosuFragment; import gw.lang.ir.IRClass; import gw.lang.reflect.gs.BytecodeOptions; import gw.lang.reflect.gs.ICompilableType; public class TransformingCompiler { public static byte[] compileClass( ICompilableType gsClass, boolean debug ) { IRClass irClass = compileType( gsClass ); return _compileClass( gsClass, debug, irClass ); } public static byte[] compileInterfaceMethodsClass( IGosuClassInternal gsClass, boolean debug ) { IRClass irClass = GosuClassTransformer.compileInterfaceMethodsClass( gsClass ); return _compileClass( gsClass, debug, irClass ); } private static byte[] _compileClass( ICompilableType gsClass, boolean debug, IRClass irClass ) { if( BytecodeOptions.isTreeVerifcationEnabled() ) { IRTreeVerifier verifier = new IRTreeVerifier(); verifier.verifyClassStatement( irClass ); if( !verifier.getErrors().isEmpty() ) { verifier.printErrors(); } } if( debug || DebugFlag.getDebugFlags().contains( DebugFlag.TRACE ) || BytecodeOptions.shouldDebug( gsClass.getName() ) ) { IRJavaCompiler javaCompiler = new IRJavaCompiler(); javaCompiler.compileClassStatement( irClass ); System.out.println( javaCompiler.getOutput() ); } return IRClassCompiler.compileClass( irClass, debug ); } private static IRClass compileType( ICompilableType gsClass ) { if( gsClass instanceof IGosuClassInternal ) { return GosuClassTransformer.compile( (IGosuClassInternal)gsClass ); } else if( gsClass instanceof GosuFragment ) { return GosuFragmentTransformer.transform( (GosuFragment)gsClass ); } else { throw new IllegalArgumentException( "Don't know how to transform " + gsClass.getClass() ); } } }