📄 memberresolver.java
字号:
throw new NoFieldException(jvmClassName + "$" + field, expr); } } /** * @param jvmClassName a JVM class name. e.g. java/lang/String */ public CtField lookupFieldByJvmName(String jvmClassName, Symbol fieldName) throws CompileError { return lookupField(jvmToJavaName(jvmClassName), fieldName); } /** * @param name a qualified class name. e.g. java.lang.String */ public CtField lookupField(String className, Symbol fieldName) throws CompileError { CtClass cc = lookupClass(className, false); try { return cc.getField(fieldName.get()); } catch (NotFoundException e) {} throw new CompileError("no such field: " + fieldName.get()); } public CtClass lookupClassByName(ASTList name) throws CompileError { return lookupClass(Declarator.astToClassName(name, '.'), false); } public CtClass lookupClassByJvmName(String jvmName) throws CompileError { return lookupClass(jvmToJavaName(jvmName), false); } public CtClass lookupClass(Declarator decl) throws CompileError { return lookupClass(decl.getType(), decl.getArrayDim(), decl.getClassName()); } /** * @parma classname jvm class name. */ public CtClass lookupClass(int type, int dim, String classname) throws CompileError { String cname = ""; CtClass clazz; if (type == CLASS) { clazz = lookupClassByJvmName(classname); if (dim > 0) cname = clazz.getName(); else return clazz; } else cname = getTypeName(type); while (dim-- > 0) cname += "[]"; return lookupClass(cname, false); } /* * type cannot be CLASS */ static String getTypeName(int type) throws CompileError { String cname = ""; switch (type) { case BOOLEAN : cname = "boolean"; break; case CHAR : cname = "char"; break; case BYTE : cname = "byte"; break; case SHORT : cname = "short"; break; case INT : cname = "int"; break; case LONG : cname = "long"; break; case FLOAT : cname = "float"; break; case DOUBLE : cname = "double"; break; case VOID : cname = "void"; break; default : fatal(); } return cname; } /** * @param name a qualified class name. e.g. java.lang.String */ public CtClass lookupClass(String name, boolean notCheckInner) throws CompileError { try { return lookupClass0(name, notCheckInner); } catch (NotFoundException e) { return searchImports(name); } } private CtClass searchImports(String orgName) throws CompileError { if (orgName.indexOf('.') < 0) { Iterator it = classPool.getImportedPackages(); while (it.hasNext()) { String pac = (String)it.next(); String fqName = pac + '.' + orgName; try { CtClass cc = classPool.get(fqName); // if the class is found, classPool.recordInvalidClassName(orgName); return cc; } catch (NotFoundException e) { classPool.recordInvalidClassName(fqName); } } } throw new CompileError("no such class: " + orgName); } private CtClass lookupClass0(String classname, boolean notCheckInner) throws NotFoundException { CtClass cc = null; do { try { cc = classPool.get(classname); } catch (NotFoundException e) { int i = classname.lastIndexOf('.'); if (notCheckInner || i < 0) throw e; else { StringBuffer sbuf = new StringBuffer(classname); sbuf.setCharAt(i, '$'); classname = sbuf.toString(); } } } while (cc == null); return cc; } /* Converts a class name into a JVM-internal representation. * * It may also expand a simple class name to java.lang.*. * For example, this converts Object into java/lang/Object. */ public String resolveClassName(ASTList name) throws CompileError { if (name == null) return null; else return javaToJvmName(lookupClassByName(name).getName()); } /* Expands a simple class name to java.lang.*. * For example, this converts Object into java/lang/Object. */ public String resolveJvmClassName(String jvmName) throws CompileError { if (jvmName == null) return null; else return javaToJvmName(lookupClassByJvmName(jvmName).getName()); } public static CtClass getSuperclass(CtClass c) throws CompileError { try { CtClass sc = c.getSuperclass(); if (sc != null) return sc; } catch (NotFoundException e) {} throw new CompileError("cannot find the super class of " + c.getName()); } public static String javaToJvmName(String classname) { return classname.replace('.', '/'); } public static String jvmToJavaName(String classname) { return classname.replace('/', '.'); } public static int descToType(char c) throws CompileError { switch (c) { case 'Z' : return BOOLEAN; case 'C' : return CHAR; case 'B' : return BYTE; case 'S' : return SHORT; case 'I' : return INT; case 'J' : return LONG; case 'F' : return FLOAT; case 'D' : return DOUBLE; case 'V' : return VOID; case 'L' : case '[' : return CLASS; default : fatal(); return VOID; // never reach here } } public static int getModifiers(ASTList mods) { int m = 0; while (mods != null) { Keyword k = (Keyword)mods.head(); mods = mods.tail(); switch (k.get()) { case STATIC : m |= Modifier.STATIC; break; case FINAL : m |= Modifier.FINAL; break; case SYNCHRONIZED : m |= Modifier.SYNCHRONIZED; break; case ABSTRACT : m |= Modifier.ABSTRACT; break; case PUBLIC : m |= Modifier.PUBLIC; break; case PROTECTED : m |= Modifier.PROTECTED; break; case PRIVATE : m |= Modifier.PRIVATE; break; case VOLATILE : m |= Modifier.VOLATILE; break; case TRANSIENT : m |= Modifier.TRANSIENT; break; case STRICT : m |= Modifier.STRICT; break; } } return m; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -