aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrnveach <rveach02@gmail.com>2017-12-17 21:15:23 -0500
committerRoman Ivanov <romani@users.noreply.github.com>2017-12-25 15:16:54 -0800
commit36fdb1ba18843c9e5a6e3a7e3bbacfad7fde7369 (patch)
treea514f3e735271918d61f663e1583b50cbf7c9883
parent0ab421d20720bde28e24d135b644ae43f98af940 (diff)
downloadcheckstyle-36fdb1ba18843c9e5a6e3a7e3bbacfad7fde7369.tar.gz
Pull #5364: changed RequireThis kept track of the frame being examined
-rw-r--r--src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheck.java33
-rw-r--r--src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheckTest.java4
-rw-r--r--src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisEnumInnerClassesAndBugs.java17
3 files changed, 46 insertions, 8 deletions
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheck.java
index bc39110db..1e34daf37 100644
--- a/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheck.java
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheck.java
@@ -146,12 +146,12 @@ public class RequireThisCheck extends AbstractCheck {
TokenTypes.BXOR_ASSIGN,
}).collect(Collectors.toSet()));
+ /** Frame for the currently processed AST. */
+ private final Deque<AbstractFrame> current = new ArrayDeque<>();
+
/** Tree of all the parsed frames. */
private Map<DetailAST, AbstractFrame> frames;
- /** Frame for the currently processed AST. */
- private AbstractFrame current;
-
/** Whether we should check fields usage. */
private boolean checkFields = true;
/** Whether we should check methods usage. */
@@ -210,7 +210,7 @@ public class RequireThisCheck extends AbstractCheck {
@Override
public void beginTree(DetailAST rootAST) {
frames = new HashMap<>();
- current = null;
+ current.clear();
final Deque<AbstractFrame> frameStack = new LinkedList<>();
DetailAST curNode = rootAST;
@@ -241,7 +241,24 @@ public class RequireThisCheck extends AbstractCheck {
case TokenTypes.SLIST :
case TokenTypes.METHOD_DEF :
case TokenTypes.CTOR_DEF :
- current = frames.get(ast);
+ current.push(frames.get(ast));
+ break;
+ default :
+ // do nothing
+ }
+ }
+
+ @Override
+ public void leaveToken(DetailAST ast) {
+ switch (ast.getType()) {
+ case TokenTypes.CLASS_DEF :
+ case TokenTypes.INTERFACE_DEF :
+ case TokenTypes.ENUM_DEF :
+ case TokenTypes.ANNOTATION_DEF :
+ case TokenTypes.SLIST :
+ case TokenTypes.METHOD_DEF :
+ case TokenTypes.CTOR_DEF :
+ current.pop();
break;
default :
// do nothing
@@ -843,7 +860,7 @@ public class RequireThisCheck extends AbstractCheck {
* @return AbstractFrame containing declaration or null.
*/
private AbstractFrame findClassFrame(DetailAST name, boolean lookForMethod) {
- AbstractFrame frame = current;
+ AbstractFrame frame = current.peek();
while (true) {
frame = findFrame(frame, name, lookForMethod);
@@ -865,7 +882,7 @@ public class RequireThisCheck extends AbstractCheck {
* @return AbstractFrame containing declaration or null.
*/
private AbstractFrame findFrame(DetailAST name, boolean lookForMethod) {
- return findFrame(current, name, lookForMethod);
+ return findFrame(current.peek(), name, lookForMethod);
}
/**
@@ -912,7 +929,7 @@ public class RequireThisCheck extends AbstractCheck {
* @return the name of the nearest parent ClassFrame.
*/
private String getNearestClassFrameName() {
- AbstractFrame frame = current;
+ AbstractFrame frame = current.peek();
while (frame.getType() != FrameType.CLASS_FRAME) {
frame = frame.getParent();
}
diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheckTest.java
index 4d70dc87f..512aaa884 100644
--- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheckTest.java
+++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/RequireThisCheckTest.java
@@ -61,6 +61,8 @@ public class RequireThisCheckTest extends AbstractModuleTestSupport {
"122:13: " + getCheckMessage(MSG_VARIABLE, "i", "Issue2240."),
"134:9: " + getCheckMessage(MSG_METHOD, "foo", ""),
"142:9: " + getCheckMessage(MSG_VARIABLE, "s", ""),
+ "167:16: " + getCheckMessage(MSG_VARIABLE, "a", ""),
+ "167:20: " + getCheckMessage(MSG_VARIABLE, "a", ""),
};
verify(checkConfig,
getPath("InputRequireThisEnumInnerClassesAndBugs.java"),
@@ -99,6 +101,8 @@ public class RequireThisCheckTest extends AbstractModuleTestSupport {
"114:9: " + getCheckMessage(MSG_VARIABLE, "i", ""),
"122:13: " + getCheckMessage(MSG_VARIABLE, "i", "Issue2240."),
"142:9: " + getCheckMessage(MSG_VARIABLE, "s", ""),
+ "167:16: " + getCheckMessage(MSG_VARIABLE, "a", ""),
+ "167:20: " + getCheckMessage(MSG_VARIABLE, "a", ""),
};
verify(checkConfig,
getPath("InputRequireThisEnumInnerClassesAndBugs.java"),
diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisEnumInnerClassesAndBugs.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisEnumInnerClassesAndBugs.java
index bf87c8a9b..872996d6f 100644
--- a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisEnumInnerClassesAndBugs.java
+++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/requirethis/InputRequireThisEnumInnerClassesAndBugs.java
@@ -150,3 +150,20 @@ class NestedRechange {
}
}
}
+class NestedFrames {
+ int a = 0;
+
+ public int oneReturnInMethod2() {
+ for (int i = 0; i < 10; i++) {
+ int a = 1;
+ if (a != 2 && true) {
+ if (true | false) {
+ if (a - a != 0) {
+ a += 1;
+ }
+ }
+ }
+ }
+ return a + a * a;
+ }
+}