private JavaType substituteInTypeVar(TypeVariableJavaType typevar, TypeSubstitution substitution) { // completing owner of type var to ensure type var's bounds have been computed typevar.symbol.owner().complete(); if(typevarExplored.contains(typevar.symbol) || typevar.bounds == null) { return typevar; } typevarExplored.push((JavaSymbol.TypeVariableJavaSymbol) typevar.symbol); List<JavaType> substitutedBounds = typevar.bounds.stream().map(t -> applySubstitution(t, substitution)).collect(Collectors.toList()); typevarExplored.pop(); if(substitutedBounds.equals(typevar.bounds)) { return typevar; } TypeVariableJavaType typeVariableJavaType = new TypeVariableJavaType((JavaSymbol.TypeVariableJavaSymbol) typevar.symbol); typeVariableJavaType.bounds = substitutedBounds; return typeVariableJavaType; }
private JavaType substituteInTypeVar(TypeVariableJavaType typevar, TypeSubstitution substitution) { // completing owner of type var to ensure type var's bounds have been computed typevar.symbol.owner().complete(); if(typevarExplored.contains(typevar.symbol) || typevar.bounds == null) { return typevar; } typevarExplored.push((JavaSymbol.TypeVariableJavaSymbol) typevar.symbol); List<JavaType> substitutedBounds = typevar.bounds.stream().map(t -> applySubstitution(t, substitution)).collect(Collectors.toList()); typevarExplored.pop(); if(substitutedBounds.equals(typevar.bounds)) { return typevar; } TypeVariableJavaType typeVariableJavaType = new TypeVariableJavaType((JavaSymbol.TypeVariableJavaSymbol) typevar.symbol); typeVariableJavaType.bounds = substitutedBounds; return typeVariableJavaType; }
private static List<JavaType> addImplicitOuterClassParameter(List<JavaType> parameterTypes, JavaSymbol.TypeJavaSymbol constructorIdentifierSymbol) { List<JavaType> result = parameterTypes; JavaSymbol owner = constructorIdentifierSymbol.owner(); if (!owner.isPackageSymbol() && !constructorIdentifierSymbol.isStatic()) { result = ImmutableList.<JavaType>builder().add(owner.enclosingClass().type).addAll(parameterTypes).build(); } return result; }
JavaSymbol owner = symbol.enclosingClass().owner(); if (!owner.isPackageSymbol()) {
JavaSymbol owner = symbol.enclosingClass().owner(); if (!owner.isPackageSymbol()) {
/** * 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 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; }
/** * Is given class a subclass of given base class, or an inner class of a subclass? */ private static boolean isInnerSubClass(JavaSymbol.TypeJavaSymbol c, JavaSymbol base) { while (c != null && isSubClass(c, base)) { c = c.owner().enclosingClass(); } return c != null; }
/** * Is given class a subclass of given base class, or an inner class of a subclass? */ private static boolean isInnerSubClass(JavaSymbol.TypeJavaSymbol c, JavaSymbol base) { while (c != null && isSubClass(c, base)) { c = c.owner().enclosingClass(); } return c != null; }
/** * Is given class a subclass of given base class, or an inner class of a subclass? */ private boolean isInnerSubClass(JavaSymbol.TypeJavaSymbol c, JavaSymbol base) { while (c != null && isSubClass(c, base)) { c = c.owner().enclosingClass(); } return c != null; }
private Resolution findConstructor(Env env, JavaType site, List<JavaType> argTypes, List<JavaType> typeParams) { List<JavaType> newArgTypes = argTypes; JavaSymbol owner = site.symbol.owner(); if (!owner.isPackageSymbol() && !site.symbol.isStatic()) { // JLS8 - 8.8.1 & 8.8.9 : constructors of inner class have an implicit first arg of its directly enclosing class type newArgTypes = ImmutableList.<JavaType>builder().add(owner.enclosingClass().type).addAll(argTypes).build(); } return findMethodByStrictThenLooseInvocation(env, site, site, CONSTRUCTOR_NAME, newArgTypes, typeParams); }
private static List<JavaType> addImplicitOuterClassParameter(List<JavaType> parameterTypes, JavaSymbol.TypeJavaSymbol constructorIdentifierSymbol) { List<JavaType> result = parameterTypes; JavaSymbol owner = constructorIdentifierSymbol.owner(); if (!owner.isPackageSymbol() && !constructorIdentifierSymbol.isStatic()) { result = ImmutableList.<JavaType>builder().add(owner.enclosingClass().type).addAll(parameterTypes).build(); } return result; }
/** * Is given class a subclass of given base class, or an inner class of a subclass? */ private static boolean isInnerSubClass(JavaSymbol.TypeJavaSymbol c, JavaSymbol base) { while (c != null && isSubClass(c, base)) { c = c.owner().enclosingClass(); } return c != null; }
private Resolution findConstructor(Env env, JavaType site, List<JavaType> argTypes, List<JavaType> typeParams) { List<JavaType> newArgTypes = argTypes; JavaSymbol owner = site.symbol.owner(); if (!owner.isPackageSymbol() && !site.symbol.isStatic()) { // JLS8 - 8.8.1 & 8.8.9 : constructors of inner class have an implicit first arg of its directly enclosing class type newArgTypes = ImmutableList.<JavaType>builder().add(owner.enclosingClass().type).addAll(argTypes).build(); } return findMethodByStrictThenLooseInvocation(env, site, site, CONSTRUCTOR_NAME, newArgTypes, typeParams); }