/** * The package which indirectly owns this symbol. */ public PackageJavaSymbol packge() { JavaSymbol result = this; while (result.kind != PCK) { result = result.owner(); } return (PackageJavaSymbol) result; }
/** * The outermost class which indirectly owns this symbol. */ public TypeJavaSymbol outermostClass() { JavaSymbol symbol = this; JavaSymbol result = null; while (symbol.kind != PCK) { result = symbol; symbol = symbol.owner(); } return (TypeJavaSymbol) result; }
/** * The outermost class which indirectly owns this symbol. */ public TypeJavaSymbol outermostClass() { JavaSymbol symbol = this; JavaSymbol result = null; while (symbol.kind != PCK) { result = symbol; symbol = symbol.owner(); } return (TypeJavaSymbol) result; }
/** * The package which indirectly owns this symbol. */ public PackageJavaSymbol packge() { JavaSymbol result = this; while (result.kind != PCK) { result = result.owner(); } return (PackageJavaSymbol) result; }
/** * The package which indirectly owns this symbol. */ public PackageJavaSymbol packge() { JavaSymbol result = this; while (result.kind != PCK) { result = result.owner(); } return (PackageJavaSymbol) result; }
/** * The outermost class which indirectly owns this symbol. */ public TypeJavaSymbol outermostClass() { JavaSymbol symbol = this; JavaSymbol result = null; while (symbol.kind != PCK) { result = symbol; symbol = symbol.owner(); } return (TypeJavaSymbol) result; }
String formFullName(String name, JavaSymbol site) { String result = name; JavaSymbol owner = site; while (owner != symbols.defaultPackage) { //Handle inner classes, if owner is a type, separate by $ String separator = "."; if (owner.kind == JavaSymbol.TYP) { separator = "$"; } result = owner.name + separator + result; owner = owner.owner(); } return result; }
/** * The outermost class which indirectly owns this symbol. */ public TypeJavaSymbol outermostClass() { JavaSymbol symbol = this; JavaSymbol result = null; while (symbol.kind != PCK) { result = symbol; symbol = symbol.owner(); } return (TypeJavaSymbol) result; }
/** * The package which indirectly owns this symbol. */ public PackageJavaSymbol packge() { JavaSymbol result = this; while (result.kind != PCK) { result = result.owner(); } return (PackageJavaSymbol) result; }
public String formFullName(String name, JavaSymbol site) { String result = name; JavaSymbol owner = site; while (owner != symbols.defaultPackage) { //Handle inner classes, if owner is a type, separate by $ String separator = "."; if (owner.kind == JavaSymbol.TYP) { separator = "$"; } result = owner.name + separator + result; owner = owner.owner(); } return result; }
public String formFullName(String name, JavaSymbol site) { String result = name; JavaSymbol owner = site; while (owner != symbols.defaultPackage) { //Handle inner classes, if owner is a type, separate by $ String separator = "."; if (owner.kind == JavaSymbol.TYP) { separator = "$"; } result = owner.name + separator + result; owner = owner.owner(); } return result; }
String formFullName(String name, JavaSymbol site) { String result = name; JavaSymbol owner = site; while (owner != symbols.defaultPackage) { //Handle inner classes, if owner is a type, separate by $ String separator = "."; if (owner.kind == JavaSymbol.TYP) { separator = "$"; } result = owner.name + separator + result; owner = owner.owner(); } return result; }
/** * Is symbol inherited in given class? */ @VisibleForTesting boolean isInheritedIn(JavaSymbol symbol, JavaSymbol.TypeJavaSymbol clazz) { switch (symbol.flags() & Flags.ACCESS_FLAGS) { case Flags.PUBLIC: return true; case Flags.PRIVATE: return symbol.owner() == clazz; case Flags.PROTECTED: // TODO see Javac return true; case 0: // TODO see Javac JavaSymbol.PackageJavaSymbol thisPackage = symbol.packge(); for (JavaSymbol.TypeJavaSymbol sup = clazz; sup != null && sup != symbol.owner(); sup = superclassSymbol(sup)) { if (sup.packge() != thisPackage) { return false; } } return true; default: throw new IllegalStateException(); } }
/** * Is symbol inherited in given class? */ @VisibleForTesting static boolean isInheritedIn(JavaSymbol symbol, JavaSymbol.TypeJavaSymbol clazz) { switch (symbol.flags() & Flags.ACCESS_FLAGS) { case Flags.PUBLIC: return true; case Flags.PRIVATE: return symbol.owner() == clazz; case Flags.PROTECTED: // TODO see Javac return true; case 0: // TODO see Javac JavaSymbol.PackageJavaSymbol thisPackage = symbol.packge(); for (JavaSymbol.TypeJavaSymbol sup = clazz; sup != null && sup != symbol.owner(); sup = superclassSymbol(sup)) { if (sup.packge() != thisPackage) { return false; } } return true; default: throw new IllegalStateException(); } }
@Override public void visitTypeVariable(String name) { List<JavaSymbol> lookup = Lists.newArrayList(); JavaSymbol currentSymbol = classSymbol; if(methodSymbol != null) { currentSymbol = methodSymbol; } while ((currentSymbol.isKind(JavaSymbol.TYP) || currentSymbol.isKind(JavaSymbol.MTH)) && lookup.isEmpty()) { if(currentSymbol.isKind(JavaSymbol.MTH)) { lookup = ((JavaSymbol.MethodJavaSymbol)currentSymbol).typeParameters().lookup(name); } else if (currentSymbol.isKind(JavaSymbol.TYP)) { lookup = ((JavaSymbol.TypeJavaSymbol)currentSymbol).typeParameters().lookup(name); } currentSymbol = currentSymbol.owner(); } Preconditions.checkState(!lookup.isEmpty(), "Could not resolve type parameter: %s in class %s", name, classSymbol.getName()); Preconditions.checkState(lookup.size() == 1, "More than one type parameter with the same name"); typeRead = lookup.get(0).type; visitEnd(); }
@Override public void visitTypeVariable(String name) { List<JavaSymbol> lookup = Lists.newArrayList(); JavaSymbol currentSymbol = classSymbol; if(methodSymbol != null) { currentSymbol = methodSymbol; } while ((currentSymbol.isKind(JavaSymbol.TYP) || currentSymbol.isKind(JavaSymbol.MTH)) && lookup.isEmpty()) { if(currentSymbol.isKind(JavaSymbol.MTH)) { lookup = ((JavaSymbol.MethodJavaSymbol)currentSymbol).typeParameters().lookup(name); } else if (currentSymbol.isKind(JavaSymbol.TYP)) { lookup = ((JavaSymbol.TypeJavaSymbol)currentSymbol).typeParameters().lookup(name); } currentSymbol = currentSymbol.owner(); } Preconditions.checkState(!lookup.isEmpty(), "Could not resolve type parameter: %s in class %s", name, classSymbol.getName()); Preconditions.checkState(lookup.size() == 1, "More than one type parameter with the same name"); typeRead = lookup.get(0).type; visitEnd(); }
@Override public void visitTypeVariable(String name) { List<JavaSymbol> lookup = Lists.newArrayList(); JavaSymbol currentSymbol = classSymbol; if(methodSymbol != null) { currentSymbol = methodSymbol; } while ((currentSymbol.isKind(JavaSymbol.TYP) || currentSymbol.isKind(JavaSymbol.MTH)) && lookup.isEmpty()) { if(currentSymbol.isKind(JavaSymbol.MTH)) { lookup = ((JavaSymbol.MethodJavaSymbol)currentSymbol).typeParameters().lookup(name); } else if (currentSymbol.isKind(JavaSymbol.TYP)) { lookup = ((JavaSymbol.TypeJavaSymbol)currentSymbol).typeParameters().lookup(name); } currentSymbol = currentSymbol.owner(); } Preconditions.checkState(!lookup.isEmpty(), "Could not resolve type parameter: "+name+" in class "+classSymbol.getName()); Preconditions.checkState(lookup.size() == 1, "More than one type parameter with the same name"); typeRead = lookup.get(0).type; visitEnd(); }
@Override public void visitTypeVariable(String name) { List<JavaSymbol> lookup = Lists.newArrayList(); JavaSymbol currentSymbol = classSymbol; if(methodSymbol != null) { currentSymbol = methodSymbol; } while ((currentSymbol.isKind(JavaSymbol.TYP) || currentSymbol.isKind(JavaSymbol.MTH)) && lookup.isEmpty()) { if(currentSymbol.isKind(JavaSymbol.MTH)) { lookup = ((JavaSymbol.MethodJavaSymbol)currentSymbol).typeParameters().lookup(name); } else if (currentSymbol.isKind(JavaSymbol.TYP)) { lookup = ((JavaSymbol.TypeJavaSymbol)currentSymbol).typeParameters().lookup(name); } currentSymbol = currentSymbol.owner(); } Preconditions.checkState(!lookup.isEmpty(), "Could not resolve type parameter: "+name+" in class "+classSymbol.getName()); Preconditions.checkState(lookup.size() == 1, "More than one type parameter with the same name"); typeRead = lookup.get(0).type; visitEnd(); }
/** * Is symbol accessible as a member of given class in given environment? * <p/> * Symbol is accessible only if not overridden by another symbol. If overridden, then strictly speaking it is not a member. */ private static boolean isAccessible(Env env, JavaSymbol.TypeJavaSymbol site, JavaSymbol symbol) { switch (symbol.flags() & Flags.ACCESS_FLAGS) { case Flags.PRIVATE: //if enclosing class is null, we are checking accessibility for imports so we return false. // no check of overriding, because private members cannot be overridden return env.enclosingClass != null && sameOutermostClass(env.enclosingClass, symbol.owner()) && isInheritedIn(symbol, site); case 0: return (env.packge == symbol.packge()) && isAccessible(env, site) && isInheritedIn(symbol, site) && notOverriddenIn(site, symbol); case Flags.PUBLIC: return isAccessible(env, site) && notOverriddenIn(site, symbol); case Flags.PROTECTED: return ((env.packge == symbol.packge()) || isProtectedAccessible(symbol, env.enclosingClass, site)) && isAccessible(env, site) && notOverriddenIn(site, symbol); default: throw new IllegalStateException(); } }
/** * Is symbol accessible as a member of given class in given environment? * <p/> * Symbol is accessible only if not overridden by another symbol. If overridden, then strictly speaking it is not a member. */ private static boolean isAccessible(Env env, JavaSymbol.TypeJavaSymbol site, JavaSymbol symbol) { switch (symbol.flags() & Flags.ACCESS_FLAGS) { case Flags.PRIVATE: //if enclosing class is null, we are checking accessibility for imports so we return false. // no check of overriding, because private members cannot be overridden return env.enclosingClass != null && sameOutermostClass(env.enclosingClass, symbol.owner()) && isInheritedIn(symbol, site); case 0: return (env.packge == symbol.packge()) && isAccessible(env, site) && isInheritedIn(symbol, site) && notOverriddenIn(site, symbol); case Flags.PUBLIC: return isAccessible(env, site) && notOverriddenIn(site, symbol); case Flags.PROTECTED: return ((env.packge == symbol.packge()) || isProtectedAccessible(symbol, env.enclosingClass, site)) && isAccessible(env, site) && notOverriddenIn(site, symbol); default: throw new IllegalStateException(); } }