private static boolean isStatic(int methodFlags) { return Flags.isFlagged(methodFlags, Flags.STATIC); }
private static boolean isStatic(int methodFlags) { return Flags.isFlagged(methodFlags, Flags.STATIC); }
public Optional<Object> constantValue() { if (Flags.isFlagged(flags, Flags.STATIC) && Flags.isFlagged(flags, Flags.FINAL)) { if (value != null && type.is("boolean")) { return Optional.of(Integer.valueOf(1).equals(value) ? Boolean.TRUE : Boolean.FALSE); } return Optional.ofNullable(value); } return Optional.empty(); }
public Optional<Object> constantValue() { if (Flags.isFlagged(flags, Flags.STATIC) && Flags.isFlagged(flags, Flags.FINAL)) { if (value != null && type.is("boolean")) { return Optional.of(Integer.valueOf(1).equals(value) ? Boolean.TRUE : Boolean.FALSE); } return Optional.ofNullable(value); } return Optional.empty(); }
private static boolean isSynchronized(Symbol methodSymbol) { return Flags.isFlagged( ((JavaSymbol) methodSymbol).flags(), Flags.SYNCHRONIZED); }
protected boolean isFlag(int flag) { complete(); return Flags.isFlagged(flags, flag); }
private static boolean isSynchronized(Symbol methodSymbol) { return Flags.isFlagged( ((JavaSymbol) methodSymbol).flags(), Flags.SYNCHRONIZED); }
protected boolean isFlag(int flag) { complete(); return Flags.isFlagged(flags, flag); }
@Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { if (name.equals(methodSignature.substring(methodSignature.indexOf('#') + 1, methodSignature.indexOf('('))) && desc.equals(methodSignature.substring(methodSignature.indexOf('(')))) { methodFound = true; declaredExceptions = convertExceptions(exceptions); isStatic = Flags.isFlagged(access, Flags.STATIC); isVarArgs = Flags.isFlagged(access, Flags.VARARGS); if (!methodVisitor.shouldVisitMethod(access, methodSignature)) { // avoid computing CFG when the method behavior won't be used return null; } return new JSRInlinerAdapter(methodVisitor, access, name, desc, signature, exceptions); } return null; }
@Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { if (name.equals(methodSignature.substring(methodSignature.indexOf('#') + 1, methodSignature.indexOf('('))) && desc.equals(methodSignature.substring(methodSignature.indexOf('(')))) { methodFound = true; declaredExceptions = convertExceptions(exceptions); isStatic = Flags.isFlagged(access, Flags.STATIC); isVarArgs = Flags.isFlagged(access, Flags.VARARGS); if (!methodVisitor.shouldVisitMethod(access, methodSignature)) { // avoid computing CFG when the method behavior won't be used return null; } return new JSRInlinerAdapter(methodVisitor, access, name, desc, signature, exceptions); } return null; }
@Override public List<JavaSymbol> lookup(String name) { List<JavaSymbol> symbolsList = Lists.newArrayList(); for (JavaSymbol site : symbols.values()) { // site is a package, try to load referenced type. if ((site.kind & JavaSymbol.PCK) != 0) { JavaSymbol symbol = bytecodeCompleter.loadClass(bytecodeCompleter.formFullName(name, site)); if (symbol.kind < JavaSymbol.ERRONEOUS) { symbolsList.add(symbol); } } // site is a type, try to find a matching type or field if ((site.kind & JavaSymbol.TYP) != 0 && site.kind < JavaSymbol.ERRONEOUS) { List<JavaSymbol> resolved = ((JavaSymbol.TypeJavaSymbol) site).members().lookup(name); resolved.stream() // TODO check accessibility // TODO factorize with static named import ? .filter(symbol -> symbol.kind < JavaSymbol.ERRONEOUS && Flags.isFlagged(symbol.flags, Flags.STATIC)) .forEach(symbolsList::add); } } return symbolsList; } }
@Override public List<JavaSymbol> lookup(String name) { List<JavaSymbol> symbolsList = Lists.newArrayList(); for (JavaSymbol site : symbols.values()) { // site is a package, try to load referenced type. if ((site.kind & JavaSymbol.PCK) != 0) { JavaSymbol symbol = bytecodeCompleter.loadClass(bytecodeCompleter.formFullName(name, site)); if (symbol.kind < JavaSymbol.ERRONEOUS) { symbolsList.add(symbol); } } // site is a type, try to find a matching type or field if ((site.kind & JavaSymbol.TYP) != 0 && site.kind < JavaSymbol.ERRONEOUS) { List<JavaSymbol> resolved = ((JavaSymbol.TypeJavaSymbol) site).members().lookup(name); resolved.stream() // TODO check accessibility // TODO factorize with static named import ? .filter(symbol -> symbol.kind < JavaSymbol.ERRONEOUS && Flags.isFlagged(symbol.flags, Flags.STATIC)) .forEach(symbolsList::add); } } return symbolsList; } }
@Override public void visitImport(ImportTree tree) { //reset currentSymbol to default package currentSymbol = symbols.defaultPackage; isStatic = tree.isStatic(); tree.qualifiedIdentifier().accept(this); //Associate symbol only if found. if (currentSymbol.kind < JavaSymbol.ERRONEOUS) { enterSymbol(currentSymbol, tree); } else if (isStatic) { resolved.stream() //add only static fields //TODO accessibility should be checked : package/public .filter(symbol -> Flags.isFlagged(symbol.flags, Flags.STATIC)) //TODO only the first symbol found will be associated with the tree. .forEach(symbol -> enterSymbol(symbol, tree)); } }
@Override public void visitImport(ImportTree tree) { //reset currentSymbol to default package currentSymbol = symbols.defaultPackage; isStatic = tree.isStatic(); tree.qualifiedIdentifier().accept(this); //Associate symbol only if found. if (currentSymbol.kind < JavaSymbol.ERRONEOUS) { enterSymbol(currentSymbol, tree); } else if (isStatic) { resolved.stream() //add only static fields //TODO accessibility should be checked : package/public .filter(symbol -> Flags.isFlagged(symbol.flags, Flags.STATIC)) //TODO only the first symbol found will be associated with the tree. .forEach(symbol -> enterSymbol(symbol, tree)); } }
private int computeFlags(ModifiersTree modifiers, Tree tree) { int result = 0; if (Flags.isFlagged(env.scope.owner.flags, Flags.INTERFACE)) { result = computeFlagsForInterfaceMember(tree); } for (ModifierKeywordTree modifier : modifiers.modifiers()) { result |= Flags.flagForModifier(modifier.modifier()); } if(hasDeprecatedAnnotation(modifiers.annotations())) { result |= Flags.DEPRECATED; } return result; }
/** * Is given class a subclass of given base class? */ @VisibleForTesting static boolean isSubClass(@Nullable JavaSymbol.TypeJavaSymbol c, JavaSymbol base) { // TODO get rid of null check if (c == null) { return false; } // TODO see Javac if (c == base) { // same class return true; } else if (Flags.isFlagged(base.flags(), Flags.INTERFACE)) { // check if class implements base for (JavaType interfaceType : c.getInterfaces()) { if (isSubClass(interfaceType.symbol, base)) { return true; } } // check if superclass implements base return isSubClass(superclassSymbol(c), base); } else { // check if class extends base or its superclass extends base return isSubClass(superclassSymbol(c), base); } }
/** * Is given class a subclass of given base class? */ @VisibleForTesting static boolean isSubClass(@Nullable JavaSymbol.TypeJavaSymbol c, JavaSymbol base) { // TODO get rid of null check if (c == null) { return false; } // TODO see Javac if (c == base) { // same class return true; } else if (Flags.isFlagged(base.flags(), Flags.INTERFACE)) { // check if class implements base for (JavaType interfaceType : c.getInterfaces()) { if (isSubClass(interfaceType.symbol, base)) { return true; } } // check if superclass implements base return isSubClass(superclassSymbol(c), base); } else { // check if class extends base or its superclass extends base return isSubClass(superclassSymbol(c), base); } }
private int computeFlags(ModifiersTree modifiers, Tree tree) { int result = 0; if (Flags.isFlagged(env.scope.owner.flags, Flags.INTERFACE)) { result = computeFlagsForInterfaceMember(tree); } for (ModifierKeywordTree modifier : modifiers.modifiers()) { result |= Flags.flagForModifier(modifier.modifier()); } if(hasDeprecatedAnnotation(modifiers.annotations())) { result |= Flags.DEPRECATED; } return result; }
public static boolean methodCanNotBeOverriden(Symbol.MethodSymbol methodSymbol) { if (Flags.isFlagged(((JavaSymbol.MethodJavaSymbol) methodSymbol).flags(), Flags.NATIVE)) { return false; } return !methodSymbol.isAbstract() && (methodSymbol.isPrivate() || methodSymbol.isFinal() || methodSymbol.isStatic() || methodSymbol.owner().isFinal()); } }
public static boolean methodCanNotBeOverriden(Symbol.MethodSymbol methodSymbol) { if (Flags.isFlagged(((JavaSymbol.MethodJavaSymbol) methodSymbol).flags(), Flags.NATIVE)) { return false; } return !methodSymbol.isAbstract() && (methodSymbol.isPrivate() || methodSymbol.isFinal() || methodSymbol.isStatic() || methodSymbol.owner().isFinal()); } }