public ExpressionTree lambdaExpression(LambdaParameterListTreeImpl parameters, InternalSyntaxToken arrowToken, Tree body) { return new LambdaExpressionTreeImpl( parameters.openParenToken(), ImmutableList.<VariableTree>builder().addAll(parameters).build(), parameters.closeParenToken(), arrowToken, body); }
public LambdaExpressionTreeImpl(@Nullable InternalSyntaxToken openParenToken, List<VariableTree> parameters, @Nullable InternalSyntaxToken closeParenToken, Tree body, AstNode... children) { super(JavaLexer.LAMBDA_EXPRESSION); this.openParenToken = openParenToken; this.parameters = parameters; this.closeParenToken = closeParenToken; this.body = body; for (AstNode child : children) { addChild(child); } }
@Override public void visitLambdaExpression(LambdaExpressionTree tree) { LambdaExpressionTreeImpl lambdaExpressionTree = (LambdaExpressionTreeImpl) tree; if (lambdaExpressionTree.isTypeSet()) { // type should be tied to a SAM interface JavaType lambdaType = (JavaType) lambdaExpressionTree.symbolType(); List<JavaType> samMethodArgs = resolve.findSamMethodArgs(lambdaType); for (int i = 0; i < samMethodArgs.size(); i++) { VariableTree param = lambdaExpressionTree.parameters().get(i); if (param.type().is(Tree.Kind.INFERED_TYPE)) { JavaType inferedType = samMethodArgs.get(i); if(inferedType.isTagged(JavaType.WILDCARD)) { // JLS8 18.5.3 inferedType = ((WildCardType) inferedType).bound; } ((AbstractTypedTree) param.type()).setInferedType(inferedType); ((JavaSymbol.VariableJavaSymbol) param.symbol()).type = inferedType; } } super.visitLambdaExpression(tree); if(lambdaType.isUnknown() || lambdaType.isTagged(JavaType.DEFERRED)) { return; } refineLambdaType(lambdaExpressionTree, lambdaType); } else { registerType(tree, symbols.deferedType(lambdaExpressionTree)); } }
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); }
@Override public void visitLambdaExpression(LambdaExpressionTree tree) { LambdaExpressionTreeImpl lambdaExpressionTree = (LambdaExpressionTreeImpl) tree; if (lambdaExpressionTree.isTypeSet()) { // type should be tied to a SAM interface JavaType lambdaType = (JavaType) lambdaExpressionTree.symbolType(); List<JavaType> samMethodArgs = resolve.findSamMethodArgs(lambdaType); for (int i = 0; i < samMethodArgs.size(); i++) { VariableTree param = lambdaExpressionTree.parameters().get(i); if (param.type().is(Tree.Kind.INFERED_TYPE)) { JavaType inferedType = samMethodArgs.get(i); if(inferedType.isTagged(JavaType.WILDCARD)) { // JLS8 18.5.3 inferedType = ((WildCardType) inferedType).bound; } ((AbstractTypedTree) param.type()).setInferedType(inferedType); ((JavaSymbol.VariableJavaSymbol) param.symbol()).type = inferedType; } } super.visitLambdaExpression(tree); if(lambdaType.isUnknown() || lambdaType.isTagged(JavaType.DEFERRED)) { return; } refineLambdaType(lambdaExpressionTree, lambdaType); } else { registerType(tree, symbols.deferedType(lambdaExpressionTree)); } }
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); }
public ExpressionTree lambdaExpression(LambdaParameterListTreeImpl parameters, AstNode arrowToken, Tree body) { return new LambdaExpressionTreeImpl(parameters.openParenToken(), ImmutableList.<VariableTree>builder().addAll(parameters).build(), parameters.closeParenToken(), body, parameters, arrowToken, (AstNode) body); }
public ExpressionTree lambdaExpression(LambdaParameterListTreeImpl parameters, InternalSyntaxToken arrowToken, Tree body) { return new LambdaExpressionTreeImpl( parameters.openParenToken(), ImmutableList.<VariableTree>builder().addAll(parameters).build(), parameters.closeParenToken(), arrowToken, body); }
public ExpressionTree lambdaExpression(LambdaParameterListTreeImpl parameters, InternalSyntaxToken arrowToken, Tree body) { return new LambdaExpressionTreeImpl( parameters.openParenToken(), ImmutableList.<VariableTree>builder().addAll(parameters).build(), parameters.closeParenToken(), arrowToken, body); }