Issue #3546: add lambda in a rightcurlycheck
This commit is contained in:
parent
4cff2eb714
commit
b0d5b01b3c
|
|
@ -121,4 +121,19 @@ public class RightCurlyTest extends BaseCheckTestSupport {
|
|||
final Integer[] warnList = getLinesWithWarn(filePath);
|
||||
verify(checkConfig, filePath, expected, warnList);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRightCurlyAloneInLambda() throws Exception {
|
||||
final String[] expected = {
|
||||
"12:70: " + getCheckMessage(RightCurlyCheck.class, MSG_KEY_LINE_ALONE, "}", 70),
|
||||
"15:46: " + getCheckMessage(RightCurlyCheck.class, MSG_KEY_LINE_ALONE, "}", 46),
|
||||
"22:33: " + getCheckMessage(RightCurlyCheck.class, MSG_KEY_LINE_ALONE, "}", 33),
|
||||
};
|
||||
|
||||
final Configuration checkConfig = getCheckConfig("RightCurly", "RightCurlyAlone");
|
||||
final String filePath = getPath("InputRightCurlyAloneLambda.java");
|
||||
|
||||
final Integer[] warnList = {12, 15, 22};
|
||||
verify(checkConfig, filePath, expected, warnList);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
package com.puppycrawl.tools.checkstyle.checks.blocks;
|
||||
|
||||
/*Test lambda*/
|
||||
public class InputRightCurlyAloneLambda {
|
||||
|
||||
static Runnable k1 = () -> {
|
||||
String.valueOf("Test rightCurly 1!");
|
||||
};
|
||||
|
||||
static Runnable k2 = () -> String.valueOf("Test rightCurly 2!");
|
||||
|
||||
static Runnable k3 = () -> {String.valueOf("Test rightCurly 3!");}; // violation
|
||||
|
||||
static Runnable k4 = () -> {
|
||||
String.valueOf("Test rightCurly 4!");}; // violation
|
||||
|
||||
static Runnable k5 = () ->
|
||||
{
|
||||
String.valueOf("Test rightCurly 5!");
|
||||
};
|
||||
|
||||
static Runnable k6 = () -> {}; // violation
|
||||
|
||||
static Runnable k7 = () -> {
|
||||
};
|
||||
|
||||
static Runnable k8 = () ->
|
||||
{
|
||||
};
|
||||
}
|
||||
|
|
@ -42,7 +42,8 @@ import com.puppycrawl.tools.checkstyle.utils.ScopeUtils;
|
|||
* {@link TokenTypes#LITERAL_CATCH LITERAL_CATCH},
|
||||
* {@link TokenTypes#LITERAL_FINALLY LITERAL_FINALLY},
|
||||
* {@link TokenTypes#LITERAL_IF LITERAL_IF},
|
||||
* {@link TokenTypes#LITERAL_ELSE LITERAL_ELSE}.
|
||||
* {@link TokenTypes#LITERAL_ELSE LITERAL_ELSE},
|
||||
* {@link TokenTypes#LAMBDA LAMBDA}.
|
||||
* Other acceptable tokens are:
|
||||
* {@link TokenTypes#CLASS_DEF CLASS_DEF},
|
||||
* {@link TokenTypes#METHOD_DEF METHOD_DEF},
|
||||
|
|
@ -52,6 +53,7 @@ import com.puppycrawl.tools.checkstyle.utils.ScopeUtils;
|
|||
* {@link TokenTypes#LITERAL_DO LITERAL_DO}.
|
||||
* {@link TokenTypes#STATIC_INIT STATIC_INIT}.
|
||||
* {@link TokenTypes#INSTANCE_INIT INSTANCE_INIT}.
|
||||
* {@link TokenTypes#LAMBDA LAMBDA}.
|
||||
* </p>
|
||||
* <p>
|
||||
* <b>shouldStartLine</b> - does the check need to check
|
||||
|
|
@ -143,6 +145,7 @@ public class RightCurlyCheck extends AbstractCheck {
|
|||
TokenTypes.LITERAL_FINALLY,
|
||||
TokenTypes.LITERAL_IF,
|
||||
TokenTypes.LITERAL_ELSE,
|
||||
TokenTypes.LAMBDA,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -162,6 +165,7 @@ public class RightCurlyCheck extends AbstractCheck {
|
|||
TokenTypes.LITERAL_DO,
|
||||
TokenTypes.STATIC_INIT,
|
||||
TokenTypes.INSTANCE_INIT,
|
||||
TokenTypes.LAMBDA,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -203,14 +207,11 @@ public class RightCurlyCheck extends AbstractCheck {
|
|||
private static String validate(Details details, RightCurlyOption bracePolicy,
|
||||
boolean shouldStartLine, String targetSourceLine) {
|
||||
final DetailAST rcurly = details.rcurly;
|
||||
final DetailAST lcurly = details.lcurly;
|
||||
final DetailAST nextToken = details.nextToken;
|
||||
final boolean shouldCheckLastRcurly = details.shouldCheckLastRcurly;
|
||||
String violation = "";
|
||||
|
||||
if (bracePolicy == RightCurlyOption.SAME
|
||||
&& !hasLineBreakBefore(rcurly)
|
||||
&& lcurly.getLineNo() != rcurly.getLineNo()) {
|
||||
if (shouldHaveBeLineBreakBefore(bracePolicy, details)) {
|
||||
violation = MSG_KEY_LINE_BREAK_BEFORE;
|
||||
}
|
||||
else if (shouldCheckLastRcurly) {
|
||||
|
|
@ -248,14 +249,19 @@ public class RightCurlyCheck extends AbstractCheck {
|
|||
* @return true if a right curly should be alone on a line.
|
||||
*/
|
||||
private static boolean shouldBeAloneOnLine(RightCurlyOption bracePolicy, Details details) {
|
||||
final int tokenLambda = details.lcurly.getParent().getType();
|
||||
return bracePolicy == RightCurlyOption.ALONE
|
||||
&& tokenLambda != TokenTypes.LAMBDA
|
||||
&& !isAloneOnLine(details)
|
||||
&& !isEmptyBody(details.lcurly)
|
||||
|| bracePolicy == RightCurlyOption.ALONE_OR_SINGLELINE
|
||||
&& !isAloneOnLine(details)
|
||||
&& !isSingleLineBlock(details)
|
||||
&& !isAnonInnerClassInit(details.lcurly)
|
||||
&& !isEmptyBody(details.lcurly);
|
||||
&& !isEmptyBody(details.lcurly)
|
||||
|| bracePolicy == RightCurlyOption.ALONE
|
||||
&& tokenLambda == TokenTypes.LAMBDA
|
||||
&& !isAloneLambda(details);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -295,6 +301,24 @@ public class RightCurlyCheck extends AbstractCheck {
|
|||
&& rcurly.getLineNo() != nextToken.getLineNo();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if right curly is alone on line in token the lambda.
|
||||
* @param details for validation.
|
||||
* @return true, if right curly is alone on line.
|
||||
*/
|
||||
private static boolean isAloneLambda(Details details) {
|
||||
final DetailAST lcurly = details.lcurly;
|
||||
final DetailAST rcurly = details.rcurly;
|
||||
final int lcurlyNo = lcurly.getLineNo();
|
||||
final int rcurlyNo = rcurly.getLineNo();
|
||||
boolean result = false;
|
||||
if (lcurlyNo != rcurlyNo) {
|
||||
result = rcurly.getPreviousSibling() == null
|
||||
|| rcurlyNo != rcurly.getPreviousSibling().getLineNo();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether lcurly is in anonymous inner class initialization.
|
||||
* @param lcurly left curly token.
|
||||
|
|
@ -377,9 +401,16 @@ public class RightCurlyCheck extends AbstractCheck {
|
|||
rcurly = lcurly.getLastChild();
|
||||
}
|
||||
break;
|
||||
case TokenTypes.LAMBDA:
|
||||
lcurly = ast.findFirstToken(TokenTypes.SLIST);
|
||||
nextToken = getNextToken(ast);
|
||||
if (lcurly != null) {
|
||||
rcurly = lcurly.getLastChild();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// ATTENTION! We have default here, but we expect case TokenTypes.METHOD_DEF,
|
||||
// TokenTypes.LITERAL_FOR, TokenTypes.LITERAL_WHILE, only.
|
||||
// TokenTypes.LITERAL_FOR, TokenTypes.LITERAL_WHILE only.
|
||||
// It has been done to improve coverage to 100%. I couldn't replace it with
|
||||
// if-else-if block because code was ugly and didn't pass pmd check.
|
||||
|
||||
|
|
@ -435,6 +466,21 @@ public class RightCurlyCheck extends AbstractCheck {
|
|||
return CheckUtils.getFirstNode(next);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that before a right curly should be a linebreak.
|
||||
* @param bracePolicy options for placing the right curly brace.
|
||||
* @param details Details for validation
|
||||
* @return true if before a right curly should be a linebreak.
|
||||
*/
|
||||
private static boolean shouldHaveBeLineBreakBefore(RightCurlyOption bracePolicy,
|
||||
Details details) {
|
||||
final DetailAST rcurly = details.rcurly;
|
||||
final DetailAST lcurly = details.lcurly;
|
||||
return bracePolicy == RightCurlyOption.SAME
|
||||
&& !hasLineBreakBefore(rcurly)
|
||||
&& lcurly.getLineNo() != rcurly.getLineNo();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if right curly has line break before.
|
||||
* @param rightCurly right curly token.
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@
|
|||
<module name="RightCurly">
|
||||
<property name="id" value="RightCurlyAlone"/>
|
||||
<property name="option" value="alone"/>
|
||||
<property name="tokens" value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT, INSTANCE_INIT"/>
|
||||
<property name="tokens" value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT, INSTANCE_INIT, LAMBDA"/>
|
||||
</module>
|
||||
<module name="WhitespaceAround">
|
||||
<property name="allowEmptyConstructors" value="true"/>
|
||||
|
|
|
|||
|
|
@ -259,6 +259,18 @@ public class RightCurlyCheckTest extends BaseCheckTestSupport {
|
|||
verify(checkConfig, getPath("InputRightCurlyAloneOrSingleline.java"), expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRightCurlyIsAloneInLambda() throws Exception {
|
||||
checkConfig.addAttribute("option", RightCurlyOption.ALONE.toString());
|
||||
checkConfig.addAttribute("tokens", "LAMBDA");
|
||||
final String[] expected = {
|
||||
"14:74: " + getCheckMessage(MSG_KEY_LINE_ALONE, "}", 74),
|
||||
"17:49: " + getCheckMessage(MSG_KEY_LINE_ALONE, "}", 49),
|
||||
"24:33: " + getCheckMessage(MSG_KEY_LINE_ALONE, "}", 33),
|
||||
};
|
||||
verify(checkConfig, getPath("InputRightCurlyAloneInLambda.java"), expected);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCatchWithoutFinally() throws Exception {
|
||||
final String[] expected = {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,32 @@
|
|||
package com.puppycrawl.tools.checkstyle.checks.blocks;
|
||||
|
||||
/*
|
||||
This is test class for token LAMBDA.
|
||||
*/
|
||||
public class InputRightCurlyAloneInLambda {
|
||||
|
||||
static Runnable r1 = () -> {
|
||||
String.valueOf("Test rightCurly one!");
|
||||
};
|
||||
|
||||
static Runnable r2 = () -> String.valueOf("Test rightCurly two!");
|
||||
|
||||
static Runnable r3 = () -> {String.valueOf("Test rightCurly three!");}; //violation
|
||||
|
||||
static Runnable r4 = () -> {
|
||||
String.valueOf("Test rightCurly four!");}; //violation
|
||||
|
||||
static Runnable r5 = () ->
|
||||
{
|
||||
String.valueOf("Test rightCurly five!");
|
||||
};
|
||||
|
||||
static Runnable r6 = () -> {}; //violation
|
||||
|
||||
static Runnable r7 = () -> {
|
||||
};
|
||||
|
||||
static Runnable r8 = () ->
|
||||
{
|
||||
};
|
||||
}
|
||||
|
|
@ -799,7 +799,9 @@ for(int i = 0; i < 10; value.incrementValue()); // OK
|
|||
<a
|
||||
href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#STATIC_INIT">STATIC_INIT</a>,
|
||||
<a
|
||||
href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#INSTANCE_INIT">INSTANCE_INIT</a>.</td>
|
||||
href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#INSTANCE_INIT">INSTANCE_INIT</a>,
|
||||
<a
|
||||
href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LAMBDA">LAMBDA</a>.</td>
|
||||
|
||||
<td><a
|
||||
href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LITERAL_TRY">LITERAL_TRY</a>,
|
||||
|
|
@ -810,7 +812,9 @@ for(int i = 0; i < 10; value.incrementValue()); // OK
|
|||
<a
|
||||
href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LITERAL_IF">LITERAL_IF</a>,
|
||||
<a
|
||||
href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LITERAL_ELSE">LITERAL_ELSE</a>.</td>
|
||||
href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LITERAL_ELSE">LITERAL_ELSE</a>,
|
||||
<a
|
||||
href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#LAMBDA">LAMBDA</a>.</td>
|
||||
</tr>
|
||||
</table>
|
||||
</subsection>
|
||||
|
|
|
|||
Loading…
Reference in New Issue