package eu.bibl.cfide.engine.compiler;
import java.lang.reflect.Constructor;
import java.util.List;
import eu.bibl.banalysis.asm.ClassNode;
import eu.bibl.cfide.context.CFIDEContext;
import eu.bibl.cfide.engine.compiler.builder.IBuilder;
import eu.bibl.cfide.engine.compiler.builder.cfideimpl.BytecodeClassNodeBuilder;
import eu.bibl.cfide.engine.compiler.parser.BasicTokenParser;
import eu.bibl.cfide.engine.compiler.parser.ParserToken;
import eu.bibl.cfide.engine.compiler.parser.cfideimpl.BytecodeSourceParser;
import eu.bibl.cfide.io.config.CFIDEConfig;
public class CFIDECompiler extends BasicSourceCompiler<ClassNode[]> {
public CFIDECompiler(CFIDEContext context) {
super(context);
}
@Override
protected BasicTokenParser getTokenParserImpl() {
BasicTokenParser parserImpl = null;
String className = null;
try {
className = context.config.getProperty(CFIDEConfig.COMPILER_PARSER_CLASS_KEY, BytecodeSourceParser.class.getCanonicalName());
Class<?> c = Class.forName(className);
Constructor<?> c1 = c.getConstructor(CFIDEContext.class);
parserImpl = (BasicTokenParser) c1.newInstance(context);
} catch (Exception e) {
System.out.println("Error loading custom parser: " + className);
e.printStackTrace();
context.config.putProperty(CFIDEConfig.COMPILER_PARSER_CLASS_KEY, BytecodeSourceParser.class.getCanonicalName());
parserImpl = super.getTokenParserImpl();
}
return parserImpl;
}
@SuppressWarnings("unchecked")
@Override
protected IBuilder<ClassNode[], List<ParserToken>> getBuilderImpl() {
IBuilder<ClassNode[], List<ParserToken>> builderImpl = null;
String className = null;
try {
className = context.config.getProperty(CFIDEConfig.COMPILER_BUILDER_CLASS_KEY, BytecodeClassNodeBuilder.class.getCanonicalName());
Class<?> c = Class.forName(className);
Constructor<?> c1 = c.getConstructor(CFIDEContext.class);
builderImpl = (IBuilder<ClassNode[], List<ParserToken>>) c1.newInstance(context);
} catch (Exception e) {
System.out.println("Error loading custom builder: " + className);
e.printStackTrace();
context.config.putProperty(CFIDEConfig.COMPILER_BUILDER_CLASS_KEY, BytecodeClassNodeBuilder.class.getCanonicalName());
builderImpl = new BytecodeClassNodeBuilder(context);
}
return builderImpl;
}
@Override
public ClassNode[] compile(String source) throws CompilerException {
List<ParserToken> tokens = tokenParser.parse(source);
ClassNode[] builtObjects = tokenBuilder.build(tokens);
if ((builtObjects == null))
throw new CompilerException("Object was not compiled successfully.");
return builtObjects;
}
}