private void inferArgumentTypes(List<JavaType> argTypes, Resolve.Resolution resolution) { Type formal = Symbols.unknownType; for (int i = 0; i < argTypes.size(); i++) { JavaType arg = argTypes.get(i); if (resolution.symbol().isMethodSymbol()) { List<JavaType> resolvedFormals = ((MethodJavaType) resolution.type()).argTypes; int size = resolvedFormals.size(); formal = resolvedFormals.get((i < size) ? i : (size - 1)); } if (arg.isTagged(JavaType.DEFERRED)) { setInferedType(formal, (DeferredType) arg); } } }
private void inferArgumentTypes(List<JavaType> argTypes, Resolve.Resolution resolution) { Type formal = Symbols.unknownType; for (int i = 0; i < argTypes.size(); i++) { JavaType arg = argTypes.get(i); if (resolution.symbol().isMethodSymbol()) { List<JavaType> resolvedFormals = ((MethodJavaType) resolution.type()).argTypes; int size = resolvedFormals.size(); formal = resolvedFormals.get((i < size) ? i : (size - 1)); } if (arg.isTagged(JavaType.DEFERRED)) { setInferedType(formal, (DeferredType) arg); } } }
@CheckForNull private Resolve.Resolution resolveMethodSymbol(Tree methodSelect, Resolve.Env methodEnv, List<JavaType> argTypes, List<JavaType> typeParamTypes) { Resolve.Resolution resolution; IdentifierTree identifier; if (methodSelect.is(Tree.Kind.MEMBER_SELECT)) { MemberSelectExpressionTree mset = (MemberSelectExpressionTree) methodSelect; resolveAs(mset.expression(), JavaSymbol.TYP | JavaSymbol.VAR); JavaType type = getType(mset.expression()); if(type.isTagged(JavaType.DEFERRED)) { return null; } identifier = mset.identifier(); resolution = resolve.findMethod(methodEnv, type, identifier.name(), argTypes, typeParamTypes); } else if (methodSelect.is(Tree.Kind.IDENTIFIER)) { identifier = (IdentifierTree) methodSelect; resolution = resolve.findMethod(methodEnv, identifier.name(), argTypes, typeParamTypes); } else { throw new IllegalStateException("Method select in method invocation is not of the expected type " + methodSelect); } registerType(identifier, resolution.type()); associateReference(identifier, resolution.symbol()); return resolution; }
resolution = resolve.findMethod(methodEnv, identifier.name(), parameterTypes, typeParamTypes); if(resolution != null && returnType != resolution.type() && resolution.symbol().isMethodSymbol()) { MethodJavaType methodType = (MethodJavaType) resolution.type(); if(!methodType.resultType.isTagged(JavaType.DEFERRED)) { registerType(tree, resolve.applySubstitution(methodType.resultType, typeSubstitution));
/** * Finds field with given name. */ private Resolution findField(Env env, JavaSymbol.TypeJavaSymbol site, String name, JavaSymbol.TypeJavaSymbol c) { Resolution bestSoFar = unresolved(); for (JavaSymbol symbol : c.members().lookup(name)) { if (symbol.kind == JavaSymbol.VAR) { return resolveField(env, site, c, symbol); } } Resolution resolution; if (c.getSuperclass() != null) { resolution = findField(env, site, name, c.getSuperclass().symbol); if (resolution.symbol.kind < bestSoFar.symbol.kind) { resolution.type = typeSubstitutionSolver.applySiteSubstitution(resolution.type(), c.getSuperclass()); bestSoFar = resolution; } } for (JavaType interfaceType : c.getInterfaces()) { resolution = findField(env, site, name, interfaceType.symbol); if (resolution.symbol.kind < bestSoFar.symbol.kind) { bestSoFar = resolution; } } return bestSoFar; }
private void resolveMethodReference(JavaSymbol.MethodJavaSymbol samMethod, MethodReferenceTreeImpl methodRefTree) { JavaType methodRefType = (JavaType) methodRefTree.symbolType(); JavaType samReturnType = (JavaType) samMethod.returnType().type(); List<JavaType> samMethodArgs = resolve.findSamMethodArgs(methodRefType); if (JavaKeyword.NEW.getValue().equals(methodRefTree.method().name())) { Type constructorType = ((AbstractTypedTree) methodRefTree.expression()).symbolType(); samMethodArgs = addImplicitOuterClassParameter(samMethodArgs, (JavaSymbol.TypeJavaSymbol) constructorType.symbol()); } Resolution resolution = resolve.findMethodReference(semanticModel.getEnv(methodRefTree), samMethodArgs, methodRefTree); JavaSymbol methodSymbol = resolution.symbol(); if (methodSymbol.isMethodSymbol()) { IdentifierTree methodIdentifier = methodRefTree.method(); addMethodRefReference(methodIdentifier, methodSymbol); setMethodRefType(methodRefTree, methodRefType, resolution.type()); JavaType capturedReturnType = resolve.resolveTypeSubstitution(samReturnType, methodRefType); JavaType refinedReturnType = ((MethodJavaType) methodIdentifier.symbolType()).resultType(); if ("<init>".equals(methodSymbol.name)) { refinedReturnType = refinedTypeForConstructor(capturedReturnType, refinedReturnType); } if (refinedReturnType instanceof DeferredType) { ((DeferredType) refinedReturnType).setTree((AbstractTypedTree) methodRefTree.method()); } refineType(methodRefTree, methodRefType, capturedReturnType, refinedReturnType); } else { handleNewArray(methodRefTree, methodRefType, samReturnType); } }
resolution = resolve.findMethod(methodEnv, identifier.name(), parameterTypes, typeParamTypes); if(resolution != null && returnType != resolution.type() && resolution.symbol().isMethodSymbol()) { MethodJavaType methodType = (MethodJavaType) resolution.type(); if(!methodType.resultType.isTagged(JavaType.DEFERRED)) { registerType(tree, resolve.applySubstitution(methodType.resultType, typeSubstitution));
private void resolveMethodReference(JavaSymbol.MethodJavaSymbol samMethod, MethodReferenceTreeImpl methodRefTree) { JavaType methodRefType = (JavaType) methodRefTree.symbolType(); JavaType samReturnType = (JavaType) samMethod.returnType().type(); List<JavaType> samMethodArgs = resolve.findSamMethodArgs(methodRefType); if (JavaKeyword.NEW.getValue().equals(methodRefTree.method().name())) { Type constructorType = ((AbstractTypedTree) methodRefTree.expression()).symbolType(); samMethodArgs = addImplicitOuterClassParameter(samMethodArgs, (JavaSymbol.TypeJavaSymbol) constructorType.symbol()); } Resolution resolution = resolve.findMethodReference(semanticModel.getEnv(methodRefTree), samMethodArgs, methodRefTree); JavaSymbol methodSymbol = resolution.symbol(); if (methodSymbol.isMethodSymbol()) { IdentifierTree methodIdentifier = methodRefTree.method(); addMethodRefReference(methodIdentifier, methodSymbol); setMethodRefType(methodRefTree, methodRefType, resolution.type()); JavaType capturedReturnType = resolve.resolveTypeSubstitution(samReturnType, methodRefType); JavaType refinedReturnType = ((MethodJavaType) methodIdentifier.symbolType()).resultType(); if ("<init>".equals(methodSymbol.name)) { refinedReturnType = refinedTypeForConstructor(capturedReturnType, refinedReturnType); } if (refinedReturnType instanceof DeferredType) { ((DeferredType) refinedReturnType).setTree((AbstractTypedTree) methodRefTree.method()); } refineType(methodRefTree, methodRefType, capturedReturnType, refinedReturnType); } else { handleNewArray(methodRefTree, methodRefType, samReturnType); } }
@CheckForNull private Resolve.Resolution resolveMethodSymbol(Tree methodSelect, Resolve.Env methodEnv, List<JavaType> argTypes, List<JavaType> typeParamTypes) { Resolve.Resolution resolution; IdentifierTree identifier; if (methodSelect.is(Tree.Kind.MEMBER_SELECT)) { MemberSelectExpressionTree mset = (MemberSelectExpressionTree) methodSelect; resolveAs(mset.expression(), JavaSymbol.TYP | JavaSymbol.VAR); JavaType type = getType(mset.expression()); if(type.isTagged(JavaType.DEFERRED)) { return null; } identifier = mset.identifier(); resolution = resolve.findMethod(methodEnv, type, identifier.name(), argTypes, typeParamTypes); } else if (methodSelect.is(Tree.Kind.IDENTIFIER)) { identifier = (IdentifierTree) methodSelect; resolution = resolve.findMethod(methodEnv, identifier.name(), argTypes, typeParamTypes); } else { throw new IllegalStateException("Method select in method invocation is not of the expected type " + methodSelect); } registerType(identifier, resolution.type()); associateReference(identifier, resolution.symbol()); return resolution; }
/** * Finds field with given name. */ private Resolution findField(Env env, JavaSymbol.TypeJavaSymbol site, String name, JavaSymbol.TypeJavaSymbol c) { Resolution bestSoFar = unresolved(); for (JavaSymbol symbol : c.members().lookup(name)) { if (symbol.kind == JavaSymbol.VAR) { return resolveField(env, site, c, symbol); } } Resolution resolution; if (c.getSuperclass() != null) { resolution = findField(env, site, name, c.getSuperclass().symbol); if (resolution.symbol.kind < bestSoFar.symbol.kind) { resolution.type = typeSubstitutionSolver.applySiteSubstitution(resolution.type(), c.getSuperclass()); bestSoFar = resolution; } } for (JavaType interfaceType : c.getInterfaces()) { resolution = findField(env, site, name, interfaceType.symbol); if (resolution.symbol.kind < bestSoFar.symbol.kind) { bestSoFar = resolution; } } return bestSoFar; }
@Override public void visitMethodInvocation(MethodInvocationTree tree) { Tree methodSelect = tree.methodSelect(); Resolve.Env methodEnv = semanticModel.getEnv(tree); scan(tree.arguments()); scan(tree.typeArguments()); List<JavaType> argTypes = getParameterTypes(tree.arguments()); List<JavaType> typeParamTypes = Lists.newArrayList(); if(tree.typeArguments() != null ) { typeParamTypes = getParameterTypes(tree.typeArguments()); } Resolve.Resolution resolution = resolveMethodSymbol(methodSelect, methodEnv, argTypes, typeParamTypes); JavaSymbol symbol = resolution.symbol(); ((MethodInvocationTreeImpl) tree).setSymbol(symbol); registerType(tree, resolution.type()); }
@Override public void visitMethodInvocation(MethodInvocationTree tree) { Tree methodSelect = tree.methodSelect(); Resolve.Env methodEnv = semanticModel.getEnv(tree); scan(tree.arguments()); scan(tree.typeArguments()); List<JavaType> argTypes = getParameterTypes(tree.arguments()); List<JavaType> typeParamTypes = Lists.newArrayList(); if(tree.typeArguments() != null ) { typeParamTypes = getParameterTypes(tree.typeArguments()); } Resolve.Resolution resolution = resolveMethodSymbol(methodSelect, methodEnv, argTypes, typeParamTypes); JavaSymbol symbol = resolution.symbol(); ((MethodInvocationTreeImpl) tree).setSymbol(symbol); registerType(tree, resolution.type()); }
private JavaType resolveIdentifierType(Resolve.Env newClassEnv, @Nullable ExpressionTree enclosingExpression, TypeTree typeTree, String typeName) { if (enclosingExpression != null) { resolveAs(enclosingExpression, JavaSymbol.VAR); Resolution idType = resolve.findIdentInType(newClassEnv, (JavaSymbol.TypeJavaSymbol) enclosingExpression.symbolType().symbol(), typeName, JavaSymbol.TYP); JavaType type = idType.type(); if (typeTree.is(Tree.Kind.PARAMETERIZED_TYPE)) { TypeArguments typeArguments = ((ParameterizedTypeTree) typeTree).typeArguments(); scan(typeArguments); type = parametrizedTypeWithTypeArguments(type.symbol, typeArguments); } registerType(typeTree, type); } else { resolveAs(typeTree, JavaSymbol.TYP, newClassEnv, false); } return (JavaType) typeTree.symbolType(); }
private JavaType resolveIdentifierType(Resolve.Env newClassEnv, @Nullable ExpressionTree enclosingExpression, TypeTree typeTree, String typeName) { if (enclosingExpression != null) { resolveAs(enclosingExpression, JavaSymbol.VAR); Resolution idType = resolve.findIdentInType(newClassEnv, (JavaSymbol.TypeJavaSymbol) enclosingExpression.symbolType().symbol(), typeName, JavaSymbol.TYP); JavaType type = idType.type(); if (typeTree.is(Tree.Kind.PARAMETERIZED_TYPE)) { TypeArguments typeArguments = ((ParameterizedTypeTree) typeTree).typeArguments(); scan(typeArguments); type = parametrizedTypeWithTypeArguments(type.symbol, typeArguments); } registerType(typeTree, type); } else { resolveAs(typeTree, JavaSymbol.TYP, newClassEnv, false); } return (JavaType) typeTree.symbolType(); }
private void resolveEnumConstant(ExpressionTree enumExpression, IdentifierTree enumConstant) { Resolve.Env enumEnv = semanticModel.getEnv(enumExpression); JavaSymbol.TypeJavaSymbol enumSymbol = (JavaSymbol.TypeJavaSymbol) enumExpression.symbolType().symbol(); Resolve.Resolution res = resolve.findIdentInType(enumEnv, enumSymbol, enumConstant.name(), JavaSymbol.VAR); if (!res.symbol().isUnknown()) { registerType(enumConstant, res.type()); associateReference(enumConstant, res.symbol()); } }
@Override public void visitPrimitiveType(PrimitiveTypeTree tree) { Resolve.Env primitiveEnv = env; if (env == null) { primitiveEnv = semanticModel.getEnv(tree); } registerType(tree, resolve.findIdent(primitiveEnv, tree.keyword().text(), JavaSymbol.TYP).type()); }
@Override public void visitPrimitiveType(PrimitiveTypeTree tree) { Resolve.Env primitiveEnv = env; if (env == null) { primitiveEnv = semanticModel.getEnv(tree); } registerType(tree, resolve.findIdent(primitiveEnv, tree.keyword().text(), JavaSymbol.TYP).type()); }
private void resolveEnumConstant(ExpressionTree enumExpression, IdentifierTree enumConstant) { Resolve.Env enumEnv = semanticModel.getEnv(enumExpression); JavaSymbol.TypeJavaSymbol enumSymbol = (JavaSymbol.TypeJavaSymbol) enumExpression.symbolType().symbol(); Resolve.Resolution res = resolve.findIdentInType(enumEnv, enumSymbol, enumConstant.name(), JavaSymbol.VAR); if (!res.symbol().isUnknown()) { registerType(enumConstant, res.type()); associateReference(enumConstant, res.symbol()); } }
@Override public void visitPrimitiveType(PrimitiveTypeTree tree) { Resolve.Env primitiveEnv = env; if (env == null) { primitiveEnv = semanticModel.getEnv(tree); } registerType(tree, resolve.findIdent(primitiveEnv, tree.keyword().text(), JavaSymbol.TYP).type()); }
@Override public void visitPrimitiveType(PrimitiveTypeTree tree) { Resolve.Env primitiveEnv = env; if (env == null) { primitiveEnv = semanticModel.getEnv(tree); } registerType(tree, resolve.findIdent(primitiveEnv, tree.keyword().text(), JavaSymbol.TYP).type()); }