package synthesijer.jcfrontend;
import java.util.ArrayList;
import java.util.Hashtable;
import openjdk.com.sun.tools.javac.code.Symbol;
import openjdk.com.sun.tools.javac.comp.AttrContext;
import openjdk.com.sun.tools.javac.comp.Env;
import openjdk.com.sun.tools.javac.tree.JCTree;
import openjdk.com.sun.tools.javac.tree.JCTree.JCClassDecl;
import openjdk.com.sun.tools.javac.tree.JCTree.JCExpression;
import synthesijer.Manager;
import synthesijer.SynthesijerUtils;
import synthesijer.ast.Module;
/**
*
* The programmatic interface for the Java Programming Language,
* which generates ASTs for synthesijer compilation.
*
* @author miyo
*
*/
public class Main {
/**
*
* @param importTable the table of importing classes.
* @param name target class name.
* @return the absolute extending class name.
*/
private static String getExtendingClassName(Hashtable<String, String> importTable, JCTree name){
if(name == null) return null;
if(importTable.containsKey(name.toString())){
return importTable.get(name.toString());
}else{
return name.toString();
}
}
/**
*
* @param importTable the table of importing classes.
* @param name target interface name.
* @return the absolute extending interface name.
*/
private static String getImplementingIntarfaceName(Hashtable<String, String> importTable, String name){
if(name == null) return null;
if(importTable.containsKey(name)){
return importTable.get(name);
}else{
return name;
}
}
private static boolean isHDLModule(String extending, Hashtable<String, String> importTable){
if(extending == null) return false;
if(extending.equals("HDLModule")) return true; // ad-hoc
if(extending.equals("synthesijer.hdl.HDLModule")) return true;
return false;
}
/**
* starts to parse a new class in order to generate a instance of Module from a given instance of JCClassDecl.
* @param env
* @param decl
*/
public static void newModule(Env<AttrContext> env, JCClassDecl decl){
if(JCFrontendUtils.isAnnotationDecl(decl.mods)){
SynthesijerUtils.warn(decl.sym.toString() + " is skipped.");
return;
}
if(JCFrontendUtils.isInterfaceDecl(decl.mods)){
SynthesijerUtils.warn(decl.sym.toString() + " is skipped.");
return;
}
Hashtable<String, String> importTable = new Hashtable<>();
for(Symbol s: env.outer.info.getLocalElements()){
importTable.put(s.name.toString(), s.toString());
}
String extending = getExtendingClassName(importTable, decl.extending);
ArrayList<String> implementing = new ArrayList<>();
for(JCExpression i: decl.implementing){
implementing.add(getImplementingIntarfaceName(importTable, i.toString()));
}
boolean synthesizeFlag = true;
if(isHDLModule(extending, importTable) == true){
synthesizeFlag = false;
}
Module module = new Module(decl.sym.toString(), importTable, extending, implementing);
module.setSynthesijerHDL( JCFrontendUtils.isAnnotatedBy(decl.mods.annotations, "synthesijerhdl"));
JCTopVisitor visitor = new JCTopVisitor(module);
decl.accept(visitor);
Manager.INSTANCE.addModule(module, synthesizeFlag);
/*
if(syntheisizeFlag){
Manager.INSTANCE.addModule(module);
}else{
Manager.INSTANCE.registUserHDLModule(decl.sym.toString());
}
*/
}
}