private void refineLambdaType(LambdaExpressionTreeImpl lambdaExpressionTree, JavaType lambdaType) { Optional<JavaSymbol.MethodJavaSymbol> samMethod = resolve.getSamMethod(lambdaType); if (!samMethod.isPresent()) { return; } JavaType samReturnType = (JavaType) samMethod.get().returnType().type(); JavaType capturedReturnType = resolve.resolveTypeSubstitution(samReturnType, lambdaType); if (capturedReturnType.is("void") || !lambdaType.isParameterized()) { return; } JavaType refinedReturnType = capturedReturnType; if (lambdaExpressionTree.body().is(Tree.Kind.BLOCK)) { LambdaBlockReturnVisitor lambdaBlockReturnVisitor = new LambdaBlockReturnVisitor(); lambdaExpressionTree.body().accept(lambdaBlockReturnVisitor); if(!lambdaBlockReturnVisitor.types.isEmpty()) { refinedReturnType = (JavaType) resolve.leastUpperBound(lambdaBlockReturnVisitor.types); } } else { refinedReturnType = (JavaType) ((AbstractTypedTree) lambdaExpressionTree.body()).symbolType(); } refineType(lambdaExpressionTree, lambdaType, capturedReturnType, refinedReturnType); }
private void refineLambdaType(LambdaExpressionTreeImpl lambdaExpressionTree, JavaType lambdaType) { Optional<JavaSymbol.MethodJavaSymbol> samMethod = resolve.getSamMethod(lambdaType); if (!samMethod.isPresent()) { return; } JavaType samReturnType = (JavaType) samMethod.get().returnType().type(); JavaType capturedReturnType = resolve.resolveTypeSubstitution(samReturnType, lambdaType); if (capturedReturnType.is("void") || !lambdaType.isParameterized()) { return; } JavaType refinedReturnType = capturedReturnType; if (lambdaExpressionTree.body().is(Tree.Kind.BLOCK)) { LambdaBlockReturnVisitor lambdaBlockReturnVisitor = new LambdaBlockReturnVisitor(); lambdaExpressionTree.body().accept(lambdaBlockReturnVisitor); if(!lambdaBlockReturnVisitor.types.isEmpty()) { refinedReturnType = (JavaType) resolve.leastUpperBound(lambdaBlockReturnVisitor.types); } } else { refinedReturnType = (JavaType) ((AbstractTypedTree) lambdaExpressionTree.body()).symbolType(); } refineType(lambdaExpressionTree, lambdaType, capturedReturnType, refinedReturnType); }