From 4efeb2eae2c302273de155d6f257e8308ac83606 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Tue, 10 Jun 2014 14:56:21 +0400 Subject: [PATCH] Refactoring: extracted 'reportUnreachableCode' --- .../lang/cfg/JetFlowInformationProvider.java | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java index 26944142c2c..d0da240b44d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java @@ -124,8 +124,9 @@ public class JetFlowInformationProvider { } public void checkFunction(@Nullable JetType expectedReturnType) { - - checkDefiniteReturn(expectedReturnType != null ? expectedReturnType : NO_EXPECTED_TYPE); + Set unreachableElements = collectUnreachableCode(); + checkDefiniteReturn(expectedReturnType != null ? expectedReturnType : NO_EXPECTED_TYPE, unreachableElements); + reportUnreachableCode(unreachableElements); markTailCalls(); } @@ -208,7 +209,7 @@ public class JetFlowInformationProvider { } } - public void checkDefiniteReturn(final @NotNull JetType expectedReturnType) { + public void checkDefiniteReturn(final @NotNull JetType expectedReturnType, @NotNull final Set unreachableElements) { assert subroutine instanceof JetDeclarationWithBody; JetDeclarationWithBody function = (JetDeclarationWithBody) subroutine; @@ -219,11 +220,6 @@ public class JetFlowInformationProvider { final boolean blockBody = function.hasBlockBody(); - final Set rootUnreachableElements = collectUnreachableCode(); - for (JetElement element : rootUnreachableElements) { - trace.report(UNREACHABLE_CODE.on(element)); - } - final boolean[] noReturnError = new boolean[] { false }; for (JetElement returnedExpression : returnedExpressions) { returnedExpression.accept(new JetVisitorVoid() { @@ -240,7 +236,7 @@ public class JetFlowInformationProvider { if (blockBody && !noExpectedType(expectedReturnType) && !KotlinBuiltIns.getInstance().isUnit(expectedReturnType) - && !rootUnreachableElements.contains(element)) { + && !unreachableElements.contains(element)) { noReturnError[0] = true; } } @@ -251,8 +247,17 @@ public class JetFlowInformationProvider { } } + private void reportUnreachableCode(@NotNull Set unreachableElements) { + // This is needed in order to highlight only '1 < 2' and not '1', '<' and '2' as well + Set rootUnreachableElements = JetPsiUtil.findRootExpressions(unreachableElements); + + for (JetElement element : rootUnreachableElements) { + trace.report(UNREACHABLE_CODE.on(element)); + } + } + private Set collectUnreachableCode() { - Collection unreachableElements = Lists.newArrayList(); + Set unreachableElements = Sets.newHashSet(); for (Instruction deadInstruction : pseudocode.getDeadInstructions()) { if (!(deadInstruction instanceof JetElementInstruction) || deadInstruction instanceof LoadUnitValueInstruction @@ -271,8 +276,7 @@ public class JetFlowInformationProvider { unreachableElements.add(element); } - // This is needed in order to highlight only '1 < 2' and not '1', '<' and '2' as well - return JetPsiUtil.findRootExpressions(unreachableElements); + return unreachableElements; } ////////////////////////////////////////////////////////////////////////////////