diff options
author | rnveach <rveach02@gmail.com> | 2017-12-17 21:15:23 -0500 |
---|---|---|
committer | Roman Ivanov <romani@users.noreply.github.com> | 2017-12-25 15:16:54 -0800 |
commit | 36fdb1ba18843c9e5a6e3a7e3bbacfad7fde7369 (patch) | |
tree | a514f3e735271918d61f663e1583b50cbf7c9883 | |
parent | 0ab421d20720bde28e24d135b644ae43f98af940 (diff) | |
download | checkstyle-36fdb1ba18843c9e5a6e3a7e3bbacfad7fde7369.tar.gz |
Pull #5364: changed RequireThis kept track of the frame being examined
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; + } +} |