package synthesijer.jcfrontend;
import java.util.List;
import openjdk.com.sun.tools.javac.code.Flags;
import openjdk.com.sun.tools.javac.code.Symbol;
import openjdk.com.sun.tools.javac.tree.JCTree.JCAnnotation;
import openjdk.com.sun.tools.javac.tree.JCTree.JCExpression;
import openjdk.com.sun.tools.javac.tree.JCTree.JCFieldAccess;
import openjdk.com.sun.tools.javac.tree.JCTree.JCIdent;
import openjdk.com.sun.tools.javac.tree.JCTree.JCMethodDecl;
import openjdk.com.sun.tools.javac.tree.JCTree.JCModifiers;
public class JCFrontendUtils {
public static boolean isAnnotatedBy(List<JCAnnotation> annotations, String key){
for(JCAnnotation a: annotations){
if(a.getAnnotationType() instanceof JCIdent){
Symbol s = ((JCIdent)(a.getAnnotationType())).sym;
if(s.toString().endsWith(key)) return true;
}else if(a.getAnnotationType() instanceof JCFieldAccess){
Symbol s = ((JCFieldAccess)(a.getAnnotationType())).sym;
if(s.toString().endsWith(key)) return true;
}
}
return false;
}
public static JCAnnotation getAnnotation(List<JCAnnotation> annotations, String key){
for(JCAnnotation a: annotations){
if(a.getAnnotationType() instanceof JCIdent){
Symbol s = ((JCIdent)(a.getAnnotationType())).sym;
if(s.toString().endsWith(key)) return a;
}
}
return null;
}
public static boolean isSynchronized(JCModifiers mods){
if(mods == null) return false;
return (mods.flags & Flags.SYNCHRONIZED) == Flags.SYNCHRONIZED;
}
public static boolean isPrivate(JCModifiers mods){
if(mods == null) return false;
return (mods.flags & Flags.PRIVATE) == Flags.PRIVATE;
}
public static boolean isFinal(JCModifiers mods){
if(mods == null) return false;
return (mods.flags & Flags.FINAL) == Flags.FINAL;
}
public static boolean isVolatile(JCModifiers mods){
if(mods == null) return false;
return (mods.flags & Flags.VOLATILE) == Flags.VOLATILE;
}
public static boolean isGlobalConstant(JCModifiers mods){
if(mods == null) return false;
boolean f = true;
f &= (mods.flags & Flags.PUBLIC) == Flags.PUBLIC;
f &= (mods.flags & Flags.FINAL) == Flags.FINAL;
f &= (mods.flags & Flags.STATIC) == Flags.STATIC;
return f;
}
public static boolean isAnnotationDecl(JCModifiers mods){
return (mods.flags & Flags.ANNOTATION) == Flags.ANNOTATION;
}
public static boolean isInterfaceDecl(JCModifiers mods){
return (mods.flags & Flags.INTERFACE) == Flags.INTERFACE;
}
public static boolean isImplemented(List<JCExpression> implementing, String key){
System.out.println(implementing);
for(JCExpression expr: implementing){
if(expr instanceof JCIdent){
JCIdent ident = (JCIdent) expr;
if(ident.sym.toString().equals(key)) return true;
}else if(expr instanceof JCFieldAccess){
JCFieldAccess fa = (JCFieldAccess)expr;
if(fa.sym.toString().equals(key)) return true;
}else{
System.out.printf("unknown: %s (%s)\n", expr, expr.getClass());
}
}
return false;
}
public static boolean isConstructor(JCMethodDecl decl){
return "<init>".equals(decl.getName().toString());
}
}