private Resolution resolveField(Env env, JavaSymbol.TypeJavaSymbol site, JavaSymbol.TypeJavaSymbol owner, JavaSymbol field) { if (isAccessible(env, site, field)) { Resolution resolution = Resolution.resolution(field); if (field.type != null) { // type may not have been resolved yet, but will be in 2nd pass resolution.type = typeSubstitutionSolver.applySiteSubstitution(field.type, owner.type); } return resolution; } return Resolution.resolution(new AccessErrorJavaSymbol(field, Symbols.unknownType)); }
/** * 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 static boolean subtypeOfTypeVar(JavaType arg, TypeVariableJavaType formal) { for (JavaType bound : formal.bounds()) { if ((bound.isTagged(JavaType.TYPEVAR) && !subtypeOfTypeVar(arg, (TypeVariableJavaType) bound)) || !arg.isSubtypeOf(bound)) { return false; } } return true; }
@Override public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) { JavaType annotationType = bytecodeVisitor.convertAsmType(org.objectweb.asm.Type.getType(desc), Flags.ANNOTATION); if (annotationType.is("java.lang.Synthetic")) { syntheticArgs++; } else { AnnotationInstanceResolve annotationInstance = new AnnotationInstanceResolve(annotationType.getSymbol()); methodSymbol.getParameters().scopeSymbols().get(parameter - syntheticArgs).metadata().addAnnotation(annotationInstance); return new BytecodeAnnotationVisitor(annotationInstance, bytecodeVisitor); } return null; }
@Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { JavaType annotationType = convertAsmType(org.objectweb.asm.Type.getType(desc), Flags.ANNOTATION); AnnotationInstanceResolve annotationInstance = new AnnotationInstanceResolve(annotationType.getSymbol()); classSymbol.metadata().addAnnotation(annotationInstance); return new BytecodeAnnotationVisitor(annotationInstance, this); }
@Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { JavaType annotationType = bytecodeVisitor.convertAsmType(org.objectweb.asm.Type.getType(desc), Flags.ANNOTATION); AnnotationInstanceResolve annotationInstance = new AnnotationInstanceResolve(annotationType.getSymbol()); methodSymbol.metadata().addAnnotation(annotationInstance); return new BytecodeAnnotationVisitor(annotationInstance, bytecodeVisitor); }
@Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { JavaType annotationType = bytecodeVisitor.convertAsmType(org.objectweb.asm.Type.getType(desc), Flags.ANNOTATION); AnnotationInstanceResolve annotationInstance = new AnnotationInstanceResolve(annotationType.getSymbol()); fieldSymbol.metadata().addAnnotation(annotationInstance); return new BytecodeAnnotationVisitor(annotationInstance, bytecodeVisitor); }
/** * Invoked when current class classified as outer class of some inner class. * Adds inner class as member. */ private void defineInnerClass(String bytecodeName, int flags) { JavaSymbol.TypeJavaSymbol innerClass = getClassSymbol(classSymbol, bytecodeName, flags); innerClass.flags |= Flags.filterAccessBytecodeFlags(flags); Preconditions.checkState(innerClass.owner == classSymbol, "Innerclass: " + innerClass.owner.getName() + " and classSymbol: " + classSymbol.getName() + " are not the same."); classSymbol.members.enter(innerClass); }
private String formFullName(JavaSymbol symbol) { if(symbol.isTypeSymbol()) { return ((JavaSymbol.TypeJavaSymbol) symbol).getFullyQualifiedName(); } return formFullName(symbol.name, symbol.owner); }
private void createNewEnvironment(Tree tree) { Scope scope = new Scope(env.scope); Resolve.Env newEnv = env.dup(); newEnv.scope = scope; env = newEnv; semanticModel.associateEnv(tree, env); }
@Override public String signature() { if (signature == null) { signature = ""; if (owner != null) { signature += owner.getType().fullyQualifiedName(); } signature += "#" + name + desc(); } return signature; }
public boolean isSubtypeOfBound(JavaType type) { switch (boundType) { case SUPER: return bound.isSubtypeOf(type); case EXTENDS: return !boundIsTypeVarAndNotType(type) && type.isSubtypeOf(bound); case UNBOUNDED: default: return true; } }
@Override public void visitBaseType(char descriptor) { typeRead = symbols.getPrimitiveFromDescriptor(descriptor); visitEnd(); }
public WildCardType(JavaType bound, BoundType boundType) { super(WILDCARD, new JavaSymbol.WildcardSymbol(boundType == BoundType.UNBOUNDED ? boundType.toString() : (boundType + bound.symbol.name()))); this.bound = bound; this.boundType = boundType; this.symbol.type = this; }
public TypeSubstitutionSolver(ParametrizedTypeCache parametrizedTypeCache, Symbols symbols) { this.parametrizedTypeCache = parametrizedTypeCache; this.symbols = symbols; this.leastUpperBound = new LeastUpperBound(this, parametrizedTypeCache, symbols); this.typeInferenceSolver = new TypeInferenceSolver(leastUpperBound, symbols, this); parametrizedTypeCache.setTypeSubstitutionSolver(this); }
private Resolution resolveField(Env env, JavaSymbol.TypeJavaSymbol site, JavaSymbol.TypeJavaSymbol owner, JavaSymbol field) { if (isAccessible(env, site, field)) { Resolution resolution = Resolution.resolution(field); if (field.type != null) { // type may not have been resolved yet, but will be in 2nd pass resolution.type = typeSubstitutionSolver.applySiteSubstitution(field.type, owner.type); } return resolution; } return Resolution.resolution(new AccessErrorJavaSymbol(field, Symbols.unknownType)); }