Skip to content

Commit

Permalink
Issue checkstyle#5969: Respect and expect tab width in column number …
Browse files Browse the repository at this point in the history
…check for lambda indentations
  • Loading branch information
liach authored and strkkk committed Mar 27, 2020
1 parent 3b3f724 commit dabbeba
Show file tree
Hide file tree
Showing 5 changed files with 218 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ protected IndentLevel getIndentImpl() {
// If the start of the lambda is the first element on the line;
// assume line wrapping with respect to its parent.
final DetailAST firstChild = getMainAst().getFirstChild();
if (getLineStart(firstChild) == firstChild.getColumnNo()) {
if (getLineStart(firstChild) == expandedTabsColumnNo(firstChild)) {
level = new IndentLevel(level, getIndentCheck().getLineWrappingIndentation());
}

Expand All @@ -77,19 +77,19 @@ protected IndentLevel getIndentImpl() {
public void checkIndentation() {
// If the argument list is the first element on the line
final DetailAST firstChild = getMainAst().getFirstChild();
if (getLineStart(firstChild) == firstChild.getColumnNo()) {
if (getLineStart(firstChild) == expandedTabsColumnNo(firstChild)) {
final IndentLevel level = getIndent();
if (!level.isAcceptable(firstChild.getColumnNo())) {
logError(firstChild, "arguments", firstChild.getColumnNo(), level);
if (!level.isAcceptable(expandedTabsColumnNo(firstChild))) {
logError(firstChild, "arguments", expandedTabsColumnNo(firstChild), level);
}
}

// If the "->" is the first element on the line, assume line wrapping.
if (getLineStart(getMainAst()) == getMainAst().getColumnNo()) {
if (getLineStart(getMainAst()) == expandedTabsColumnNo(getMainAst())) {
final IndentLevel level =
new IndentLevel(getIndent(), getIndentCheck().getLineWrappingIndentation());
if (!level.isAcceptable(getMainAst().getColumnNo())) {
logError(getMainAst(), "", getMainAst().getColumnNo(), level);
if (!level.isAcceptable(expandedTabsColumnNo(getMainAst()))) {
logError(getMainAst(), "", expandedTabsColumnNo(getMainAst()), level);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1759,6 +1759,47 @@ public void testLambda2() throws Exception {
verifyWarns(checkConfig, getPath("InputIndentationLambda2.java"), expected);
}

@Test
public void testLambda3() throws Exception {
final DefaultConfiguration checkConfig = createModuleConfig(IndentationCheck.class);
checkConfig.addAttribute("tabWidth", "4");
checkConfig.addAttribute("basicOffset", "4");
checkConfig.addAttribute("lineWrappingIndentation", "8");
final String[] expected = {
"15: " + getCheckMessage(MSG_CHILD_ERROR, "method def", 12, 8),
"23: " + getCheckMessage(MSG_ERROR_MULTI, "lambda arguments", 20, "12, 16"),
"29: " + getCheckMessage(MSG_CHILD_ERROR, "method def", 12, 8),
"30: " + getCheckMessage(MSG_CHILD_ERROR, "block", 12, 16),
"31: " + getCheckMessage(MSG_ERROR, "block rcurly", 8, 12),
"43: " + getCheckMessage(MSG_ERROR, "lambda arguments", 20, 16),
"65: " + getCheckMessage(MSG_CHILD_ERROR, "method def", 12, 8),
"67: " + getCheckMessage(MSG_ERROR, "lambda", 28, 24),
"87: " + getCheckMessage(MSG_ERROR, "method def rcurly", 12, 8),
};
verifyWarns(checkConfig, getPath("InputIndentationLambda3.java"), expected);
}

@Test
public void testLambda4() throws Exception {
final DefaultConfiguration checkConfig = createModuleConfig(IndentationCheck.class);
checkConfig.addAttribute("tabWidth", "4");
checkConfig.addAttribute("basicOffset", "4");
checkConfig.addAttribute("lineWrappingIndentation", "8");
final String[] expected = CommonUtil.EMPTY_STRING_ARRAY;
verifyWarns(checkConfig, getPath("InputIndentationLambda4.java"), expected);
}

@Test
public void testLambda5() throws Exception {
final DefaultConfiguration checkConfig = createModuleConfig(IndentationCheck.class);
checkConfig.addAttribute("tabWidth", "3");
checkConfig.addAttribute("basicOffset", "3");
checkConfig.addAttribute("caseIndent", "0");
checkConfig.addAttribute("lineWrappingIndentation", "6");
final String[] expected = CommonUtil.EMPTY_STRING_ARRAY;
verifyWarns(checkConfig, getPath("InputIndentationLambda5.java"), expected);
}

@Test
public void testSeparatedStatements() throws Exception {
final DefaultConfiguration checkConfig = createModuleConfig(IndentationCheck.class);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
//a comment //indent:0 exp:0
package com.puppycrawl.tools.checkstyle.checks.indentation.indentation; //indent:0 exp:0

import java.util.Arrays; //indent:0 exp:0
import java.util.List; //indent:0 exp:0
import java.util.Optional; //indent:0 exp:0
import java.util.function.BinaryOperator; //indent:0 exp:0
import java.util.function.Consumer; //indent:0 exp:0
import java.util.stream.Collectors; //indent:0 exp:0
import java.util.stream.Stream; //indent:0 exp:0


public class InputIndentationLambda3 { //indent:0 exp:0
public <T> Consumer<Integer> par(Consumer<Integer> f1, Consumer<Integer> f2) { //indent:4 exp:4
return f2; //indent:12 exp:8 warn
} //indent:4 exp:4

private void print(int i) { //indent:4 exp:4
} //indent:4 exp:4

public Consumer<Integer> returnFunctionOfLambda() { //indent:4 exp:4
return par( //indent:8 exp:8
(x) -> print(x * 1), //indent:20 exp:12,16 warn
(x) -> print(x * 2) //indent:16 exp:16
); //indent:8 exp:8
} //indent:4 exp:4

public static <T> BinaryOperator<T> returnLambda() { //indent:4 exp:4
return (t1, t2) -> { //indent:12 exp:8 warn
return t1; //indent:12 exp:16 warn
}; //indent:8 exp:12 warn
} //indent:4 exp:4

class TwoParams { //indent:4 exp:4
TwoParams(Consumer<Integer> c1, Consumer<Integer> c2) { //indent:8 exp:8
} //indent:8 exp:8
} //indent:4 exp:4

public void makeTwoParams() { //indent:4 exp:4
TwoParams t0 = new TwoParams( //indent:8 exp:8
intValueA //indent:16 exp:16
-> print(intValueA * 1), //indent:24 exp:24
(x) -> //indent:20 exp:16 warn
print(x * 2) //indent:24 exp:24
); //indent:8 exp:8

TwoParams t1 = new TwoParams( //indent:8 exp:8
x //indent:16 exp:16
-> print(x * 1), //indent:24 exp:24
(aggregateValue) -> //indent:16 exp:16
print(aggregateValue * 2)); //indent:24 exp:24
} //indent:4 exp:4

// see https://github.com/checkstyle/checkstyle/issues/5969 //indent:4 exp:4
List<Integer> test(List<String> input) { //indent:4 exp:4
return input.stream() //indent:8 exp:8
.flatMap(each -> Arrays.stream(each.split(""))) //indent:16 exp:16
.flatMap(in -> Arrays.stream(in.split(""))) //indent:16 exp:16
// only 2 char parameter has violation //indent:16 exp:16
.map(Integer::valueOf) //indent:16 exp:16
.collect(Collectors.toList()); //indent:16 exp:16
} //indent:4 exp:4

String test2(String input) { //indent:4 exp:4
return Optional.ofNullable(input) //indent:12 exp:8 warn
.filter(in //indent:16 exp:16
-> //indent:28 exp:24 warn
in.contains("e")) //indent:20 exp:20
.filter(inp -> inp.contains("e")) //indent:12 exp:12
// only 3 char parameter has violation //indent:16 exp:16
.orElse(null); //indent:16 exp:16
} //indent:4 exp:4

// see https://github.com/checkstyle/checkstyle/issues/7675 //indent:4 exp:4
public void test(Stream<Inner<?>> stream) { //indent:4 exp:4
stream //indent:8 exp:8
.sorted() //indent:0 exp:0
.filter(ps -> ps instanceof Inner) //indent:0 exp:0
.map(ps -> ((Inner<?>) ps).getPropertyNames()) //indent:16 exp:16
// This line above originally breaks //indent:16 exp:16
.forEach(System.out::println); //indent:16 exp:16
} //indent:4 exp:4

private static class Inner<T> { //indent:4 exp:4
String[] getPropertyNames() { //indent:8 exp:8
return new String[] {"a", "b"}; //indent:12 exp:12
} //indent:12 exp:8 warn
} //indent:4 exp:4
} //indent:0 exp:0
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
//a comment //indent:0 exp:0
package com.puppycrawl.tools.checkstyle.checks.indentation.indentation; //indent:0 exp:0

import java.util.Arrays; //indent:0 exp:0
import java.util.List; //indent:0 exp:0
import java.util.Optional; //indent:0 exp:0
import java.util.function.BinaryOperator; //indent:0 exp:0
import java.util.function.Consumer; //indent:0 exp:0
import java.util.stream.Collectors; //indent:0 exp:0


public class InputIndentationLambda4 { //indent:0 exp:0
public <T> Consumer<Integer> par(Consumer<Integer> f1, Consumer<Integer> f2) { //indent:4 exp:4
return f2; //indent:8 exp:8
} //indent:4 exp:4

private void print(int i) { //indent:4 exp:4
} //indent:4 exp:4

public Consumer<Integer> returnFunctionOfLambda() { //indent:4 exp:4
return par( //indent:8 exp:8
(x) -> print(x * 1), //indent:16 exp:16
(x) -> print(x * 2) //indent:16 exp:16
); //indent:8 exp:8
} //indent:4 exp:4

public static <T> BinaryOperator<T> returnLambda() { //indent:4 exp:4
return (t1, t2) -> { //indent:8 exp:8
return t1; //indent:12 exp:12
}; //indent:8 exp:8
} //indent:4 exp:4

class TwoParams { //indent:4 exp:4
TwoParams(Consumer<Integer> c1, Consumer<Integer> c2) { //indent:8 exp:8
} //indent:8 exp:8
} //indent:4 exp:4

public void makeTwoParams() { //indent:4 exp:4
TwoParams t0 = new TwoParams( //indent:8 exp:8
(x) -> print(x * 1), //indent:16 exp:16
(x) -> print(x * 2) //indent:16 exp:16
); //indent:8 exp:8

TwoParams t1 = new TwoParams( //indent:8 exp:8
(x) -> print(x * 1), //indent:16 exp:16
(x) -> print(x * 2)); //indent:16 exp:16
} //indent:4 exp:4

// see https://github.com/checkstyle/checkstyle/issues/5969 //indent:4 exp:4
List<Integer> test(List<String> input) { //indent:4 exp:4
return input.stream() //indent:8 exp:8
.flatMap(in -> Arrays.stream(in.split(""))) //indent:16 exp:16
// only 2 char parameter has violation //indent:16 exp:16
.map(Integer::valueOf) //indent:16 exp:16
.collect(Collectors.toList()); //indent:16 exp:16
} //indent:4 exp:4

String test2(String input) { //indent:4 exp:4
return Optional.ofNullable(input) //indent:8 exp:8
.filter(inp -> inp.contains("e")) //indent:16 exp:16
// only 3 char parameter has violation //indent:16 exp:16
.orElse(null); //indent:16 exp:16
} //indent:4 exp:4
} //indent:0 exp:0
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.puppycrawl.tools.checkstyle.checks.indentation.indentation; //indent:0 exp:0
// see https://github.com/checkstyle/checkstyle/issues/7675 //indent:0 exp:0
import java.util.stream.Stream; //indent:0 exp:0
public class InputIndentationLambda5 { //indent:0 exp:0
public void test(Stream<Inner<?>> stream) { //indent:3 exp:3
stream //indent:6 exp:6
.filter(ps -> ps instanceof Inner) //indent:12 exp:12
.map(ps -> ((Inner<?>) ps).getPropertyNames()) //indent:12 exp:12
.forEach(System.out::println); //indent:12 exp:12
} //indent:3 exp:3

private static class Inner<T> { //indent:3 exp:3
String[] getPropertyNames() { //indent:6 exp:6
return new String[] {"a", "b"}; //indent:9 exp:9
} //indent:6 exp:6
} //indent:3 exp:3
} //indent:0 exp:0

0 comments on commit dabbeba

Please sign in to comment.