Skip to content

Commit

Permalink
Issue checkstyle#12809: Improve performance of lambda processing
Browse files Browse the repository at this point in the history
  • Loading branch information
nrmancuso committed Mar 12, 2023
1 parent a684181 commit 26f5021
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 36 deletions.
64 changes: 40 additions & 24 deletions src/main/java/com/puppycrawl/tools/checkstyle/JavaAstVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -1297,21 +1297,7 @@ public DetailAstImpl visitExpressionList(JavaLanguageParser.ExpressionListContex

@Override
public DetailAstImpl visitExpression(JavaLanguageParser.ExpressionContext ctx) {
final DetailAstImpl expression = visit(ctx.expr());
DetailAstImpl exprRoot = createImaginary(TokenTypes.EXPR);
exprRoot.addChild(expression);

final int[] expressionsWithNoExprRoot = {
TokenTypes.CTOR_CALL,
TokenTypes.SUPER_CTOR_CALL,
TokenTypes.LAMBDA,
};

if (TokenUtil.isOfType(expression, expressionsWithNoExprRoot)) {
exprRoot = exprRoot.getFirstChild();
}

return exprRoot;
return buildExpressionNode(ctx.expr());
}

@Override
Expand Down Expand Up @@ -1495,7 +1481,21 @@ public DetailAstImpl visitSimpleMethodCall(JavaLanguageParser.SimpleMethodCallCo

@Override
public DetailAstImpl visitLambdaExp(JavaLanguageParser.LambdaExpContext ctx) {
return flattenedTree(ctx);
final DetailAstImpl lambda = create(ctx.LAMBDA());
lambda.addChild(visit(ctx.lambdaParameters()));

final DetailAstImpl rightHandLambdaChild;
if (ctx.block() != null) {
rightHandLambdaChild = visit(ctx.block());
}
else {
// Lambda expression child is built the same way that we build
// the initial expression node in visitExpression, i.e. with
// an imaginary EXPR node.
rightHandLambdaChild = buildExpressionNode(ctx.expr());
}
lambda.addChild(rightHandLambdaChild);
return lambda;
}

@Override
Expand Down Expand Up @@ -1627,14 +1627,6 @@ public DetailAstImpl visitTypeCastParameters(
return typeType;
}

@Override
public DetailAstImpl visitLambdaExpression(JavaLanguageParser.LambdaExpressionContext ctx) {
final DetailAstImpl lambda = create(ctx.LAMBDA());
lambda.addChild(visit(ctx.lambdaParameters()));
lambda.addChild(visit(ctx.lambdaBody()));
return lambda;
}

@Override
public DetailAstImpl visitSingleLambdaParam(JavaLanguageParser.SingleLambdaParamContext ctx) {
return flattenedTree(ctx);
Expand Down Expand Up @@ -2160,6 +2152,30 @@ public DetailAstImpl visit(ParseTree tree) {
return ast;
}

/**
* Builds an expression node. This is used to build the root of an expression with
* an imaginary {@code EXPR} node.
*
* @param exprNode expression to build node for
* @return expression DetailAstImpl node
*/
private DetailAstImpl buildExpressionNode(ParseTree exprNode) {
final DetailAstImpl expression = visit(exprNode);
DetailAstImpl exprRoot = createImaginary(TokenTypes.EXPR);
exprRoot.addChild(expression);

final int[] expressionsWithNoExprRoot = {
TokenTypes.CTOR_CALL,
TokenTypes.SUPER_CTOR_CALL,
TokenTypes.LAMBDA,
};

if (TokenUtil.isOfType(expression, expressionsWithNoExprRoot)) {
exprRoot = exprRoot.getFirstChild();
}
return exprRoot;
}

/**
* Used to swap and organize DetailAstImpl subtrees.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -720,18 +720,13 @@ expr
| BAND_ASSIGN | BOR_ASSIGN | BXOR_ASSIGN | SR_ASSIGN | BSR_ASSIGN
| SL_ASSIGN | MOD_ASSIGN)
expr #binOp
| lambdaExpression #lambdaExp
| lambdaParameters LAMBDA (expr | block) #lambdaExp
;

typeCastParameters
: typeType[true] (BAND typeType[true])*
;

// Java8
lambdaExpression
: lambdaParameters LAMBDA lambdaBody
;

// Java8
lambdaParameters
: id #singleLambdaParam
Expand All @@ -743,12 +738,6 @@ multiLambdaParams
: id (COMMA id)*
;

// Java8
lambdaBody
: expression
| block
;

primary
: switchExpressionOrStatement #switchPrimary
| LPAREN expr RPAREN #parenPrimary
Expand Down

0 comments on commit 26f5021

Please sign in to comment.