@Override public boolean is(String fullyQualifiedName) { return isTagged(BOT) || fullyQualifiedName.equals(symbol.getFullyQualifiedName()); }
private static boolean definesOrInheritsSymbol(Symbol symbol, JavaSymbol.TypeJavaSymbol typeSymbol) { return definesSymbol(symbol, typeSymbol) || typeSymbol.superTypes().stream().anyMatch(superType -> definesSymbol(symbol, superType.symbol())); }
@Override public List<Type> interfaces() { return Lists.<Type>newArrayList(getInterfaces()); }
flag = computeClassFlags(tree); JavaSymbol.TypeJavaSymbol symbol = new JavaSymbol.TypeJavaSymbol(flag, name, env.scope.owner); symbol.declaration = tree; ((ClassTreeImpl) tree).setSymbol(symbol); for (TypeParameterTree typeParameterTree : typeParameterTrees) { JavaSymbol.TypeVariableJavaSymbol typeVariableSymbol = new JavaSymbol.TypeVariableJavaSymbol(typeParameterTree.identifier().name(), symbol); symbol.addTypeParameter((TypeVariableJavaType) typeVariableSymbol.type); enterSymbol(typeParameterTree, typeVariableSymbol);
ClassJavaType type = (ClassJavaType) symbol.type; if (!symbol.isFlag(Flags.ANNOTATION)) { if ((symbol.flags() & Flags.INTERFACE) == 0) { symbol.members.enter(new JavaSymbol.VariableJavaSymbol(Flags.FINAL, "super", type.supertype, symbol)); } else { if (tree.is(Tree.Kind.CLASS, Tree.Kind.ENUM) && symbol.lookupSymbols(CONSTRUCTOR_NAME).isEmpty()) { List<JavaType> argTypes = ImmutableList.of(); if (!symbol.isStatic()) { JavaSymbol owner = symbol.owner(); if (!owner.isPackageSymbol()) { argTypes = ImmutableList.of(owner.enclosingClass().type);
flag = computeClassFlags(tree); JavaSymbol.TypeJavaSymbol symbol = new JavaSymbol.TypeJavaSymbol(flag, name, env.scope.owner); symbol.declaration = tree; ((ClassTreeImpl) tree).setSymbol(symbol); for (TypeParameterTree typeParameterTree : typeParameterTrees) { JavaSymbol.TypeVariableJavaSymbol typeVariableSymbol = new JavaSymbol.TypeVariableJavaSymbol(typeParameterTree.identifier().name(), symbol); symbol.addTypeParameter((TypeVariableJavaType) typeVariableSymbol.type); enterSymbol(typeParameterTree, typeVariableSymbol);
flag = computeClassFlags(tree); JavaSymbol.TypeJavaSymbol symbol = new JavaSymbol.TypeJavaSymbol(flag, name, env.scope.owner); symbol.declaration = tree; ((ClassTreeImpl) tree).setSymbol(symbol); for (TypeParameterTree typeParameterTree : tree.typeParameters()) { JavaSymbol.TypeVariableJavaSymbol typeVariableSymbol = new JavaSymbol.TypeVariableJavaSymbol(typeParameterTree.identifier().name(), symbol); symbol.addTypeParameter((JavaType.TypeVariableJavaType) typeVariableSymbol.type); enterSymbol(typeParameterTree, typeVariableSymbol);
ClassJavaType type = (ClassJavaType) symbol.type; if (!symbol.isFlag(Flags.ANNOTATION)) { if ((symbol.flags() & Flags.INTERFACE) == 0) { symbol.members.enter(new JavaSymbol.VariableJavaSymbol(Flags.FINAL, "super", type.supertype, symbol)); } else { if (tree.is(Tree.Kind.CLASS, Tree.Kind.ENUM) && symbol.lookupSymbols(CONSTRUCTOR_NAME).isEmpty()) { List<JavaType> argTypes = ImmutableList.of(); if (!symbol.isStatic()) { JavaSymbol owner = symbol.owner(); if (!owner.isPackageSymbol()) { argTypes = ImmutableList.of(owner.enclosingClass().type);
public Symbols(BytecodeCompleter bytecodeCompleter) { defaultPackage = new JavaSymbol.PackageJavaSymbol("", rootPackage); predefClass = new JavaSymbol.TypeJavaSymbol(Flags.PUBLIC, "", rootPackage); predefClass.members = new Scope(predefClass); ((ClassJavaType) predefClass.type).interfaces = ImmutableList.of(); noSymbol = new JavaSymbol.TypeJavaSymbol(0, "", rootPackage); methodClass = new JavaSymbol.TypeJavaSymbol(Flags.PUBLIC, "", noSymbol); arrayClass = new JavaSymbol.TypeJavaSymbol(Flags.PUBLIC, "Array", noSymbol); ClassJavaType arrayClassType = (ClassJavaType) arrayClass.type; arrayClassType.supertype = objectType; arrayClass.members().enter(new JavaSymbol.VariableJavaSymbol(Flags.PUBLIC | Flags.FINAL, "length", intType, arrayClass)); JavaSymbol.TypeJavaSymbol syntheticAnnotation = new JavaSymbol.TypeJavaSymbol(Flags.PUBLIC | Flags.ANNOTATION, "Synthetic", javalang); javalang.members.enter(syntheticAnnotation); bytecodeCompleter.registerClass(syntheticAnnotation);
flag = computeClassFlags(tree); JavaSymbol.TypeJavaSymbol symbol = new JavaSymbol.TypeJavaSymbol(flag, name, env.scope.owner); symbol.declaration = tree; ((ClassTreeImpl) tree).setSymbol(symbol); for (TypeParameterTree typeParameterTree : tree.typeParameters()) { JavaSymbol.TypeVariableJavaSymbol typeVariableSymbol = new JavaSymbol.TypeVariableJavaSymbol(typeParameterTree.identifier().name(), symbol); symbol.addTypeParameter((JavaType.TypeVariableJavaType) typeVariableSymbol.type); enterSymbol(typeParameterTree, typeVariableSymbol);
symbol = new JavaSymbol.TypeJavaSymbol(filterBytecodeFlags(flags), Convert.innerClassName(Convert.shortName(owner.getFullyQualifiedName()), shortName), owner); } else { symbol = new JavaSymbol.TypeJavaSymbol(filterBytecodeFlags(flags), shortName, enterPackage(packageName));
if (owner != null) { String name = Convert.innerClassName(Convert.shortName(owner.getFullyQualifiedName()), shortName); symbol = new JavaSymbol.TypeJavaSymbol(classFlags, name, owner, bytecodeName); } else { symbol = new JavaSymbol.TypeJavaSymbol(classFlags, shortName, enterPackage(packageName));
if (owner != null) { String name = Convert.innerClassName(Convert.shortName(owner.getFullyQualifiedName()), shortName); symbol = new JavaSymbol.TypeJavaSymbol(classFlags, name, owner, bytecodeName); } else { symbol = new JavaSymbol.TypeJavaSymbol(classFlags, shortName, enterPackage(packageName));
JavaSymbol.TypeJavaSymbol getClassSymbol(String bytecodeName, int flags) { String flatName = Convert.flatName(bytecodeName); JavaSymbol.TypeJavaSymbol symbol = classes.get(flatName); if (symbol == null) { String shortName = Convert.shortName(flatName); String packageName = Convert.packagePart(flatName); String enclosingClassName = Convert.enclosingClassName(shortName); if (StringUtils.isNotEmpty(enclosingClassName)) { //handle innerClasses symbol = new JavaSymbol.TypeJavaSymbol(filterBytecodeFlags(flags), Convert.innerClassName(shortName), getClassSymbol(Convert.fullName(packageName, enclosingClassName))); } else { symbol = new JavaSymbol.TypeJavaSymbol(filterBytecodeFlags(flags), shortName, enterPackage(packageName)); } symbol.members = new Scope(symbol); symbol.typeParameters = new Scope(symbol); // (Godin): IOException will happen without this condition in case of missing class: if (getClassLoader().getResource(Convert.bytecodeName(flatName) + ".class") != null) { symbol.completer = this; } else { LOG.error("Class not found: " + bytecodeName); ((JavaType.ClassJavaType) symbol.type).interfaces = ImmutableList.of(); ((JavaType.ClassJavaType) symbol.type).supertype = Symbols.unknownType; } classes.put(flatName, symbol); } return symbol; }
/** * JLS8 4.9 Intersection types */ private JavaType intersectionType(JavaType type, Set<JavaType> interfaces, Tree tree) { if (interfaces.isEmpty()) { return type; } List<String> names = new ArrayList<>(); names.add(type.name()); names.addAll(interfaces.stream().map(JavaType::name).collect(Collectors.toSet())); JavaSymbol.TypeJavaSymbol typeJavaSymbol = new JavaSymbol.TypeJavaSymbol(0, "<intersectionType of "+names.stream().collect(Collectors.joining(" & ")) + ">", semanticModel.getEnv(tree).packge); typeJavaSymbol.members = new Scope(typeJavaSymbol); IntersectionType intersectionType = new IntersectionType(typeJavaSymbol); typeJavaSymbol.type = intersectionType; Set<JavaType> superInterfaces = new HashSet<>(interfaces); if(type.symbol.isInterface()) { superInterfaces.add(type); intersectionType.supertype = symbols.objectType; } else { intersectionType.supertype = type; } intersectionType.interfaces = ImmutableList.<JavaType>builder().addAll(superInterfaces).build(); return intersectionType; }
/** * Is class accessible in given environment? */ @VisibleForTesting static boolean isAccessible(Env env, JavaSymbol.TypeJavaSymbol c) { final boolean result; switch (c.flags() & Flags.ACCESS_FLAGS) { case Flags.PRIVATE: result = sameOutermostClass(env.enclosingClass, c.owner()); break; case 0: result = env.packge == c.packge(); break; case Flags.PUBLIC: result = true; break; case Flags.PROTECTED: result = env.packge == c.packge() || isInnerSubClass(env.enclosingClass, c.owner()); break; default: throw new IllegalStateException(); } // TODO check accessibility of enclosing type: isAccessible(env, c.type.getEnclosingType()) return result; }
/** * Is class accessible in given environment? */ @VisibleForTesting static boolean isAccessible(Env env, JavaSymbol.TypeJavaSymbol c) { final boolean result; switch (c.flags() & Flags.ACCESS_FLAGS) { case Flags.PRIVATE: result = sameOutermostClass(env.enclosingClass, c.owner()); break; case 0: result = env.packge == c.packge(); break; case Flags.PUBLIC: result = true; break; case Flags.PROTECTED: result = env.packge == c.packge() || isInnerSubClass(env.enclosingClass, c.owner()); break; default: throw new IllegalStateException(); } // TODO check accessibility of enclosing type: isAccessible(env, c.type.getEnclosingType()) return result; }
/** * Is class accessible in given environment? */ @VisibleForTesting boolean isAccessible(Env env, JavaSymbol.TypeJavaSymbol c) { final boolean result; switch (c.flags() & Flags.ACCESS_FLAGS) { case Flags.PRIVATE: result = (env.enclosingClass().outermostClass() == c.owner().outermostClass()); break; case 0: result = (env.packge() == c.packge()); break; case Flags.PUBLIC: result = true; break; case Flags.PROTECTED: result = (env.packge() == c.packge()) || isInnerSubClass(env.enclosingClass(), c.owner()); break; default: throw new IllegalStateException(); } // TODO check accessibility of enclosing type: isAccessible(env, c.type.getEnclosingType()) return result; }