diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/noReturnMethod/MissingReturnInspection.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/noReturnMethod/MissingReturnInspection.java
index 730a3a4fb714..22484192fd4f 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/noReturnMethod/MissingReturnInspection.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/noReturnMethod/MissingReturnInspection.java
@@ -32,7 +32,6 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementVisitor;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrCodeBlock;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock;
-import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrAssertStatement;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrReturnStatement;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
@@ -120,38 +119,19 @@ public class MissingReturnInspection extends GroovySuppressableInspectionTool {
ControlFlowUtils.visitAllExitPoints(block, new ControlFlowUtils.ExitPointVisitor() {
@Override
public boolean visitExitPoint(Instruction instruction, @Nullable GrExpression returnValue) {
- if (instruction instanceof MaybeReturnInstruction) {
- if (((MaybeReturnInstruction)instruction).mayReturnValue()) {
- sometimesHaveReturn.set(true);
- }
- else {
- alwaysHaveReturn.set(false);
- }
+ if (instruction instanceof ThrowingInstruction) return true;
+ if (instruction instanceof MaybeReturnInstruction && ((MaybeReturnInstruction)instruction).mayReturnValue()) {
+ sometimesHaveReturn.set(true);
return true;
}
- final PsiElement element = instruction.getElement();
- if (element instanceof GrReturnStatement) {
+
+ if (instruction.getElement() instanceof GrReturnStatement && returnValue != null) {
sometimesHaveReturn.set(true);
- if (returnValue != null) {
- hasExplicitReturn.set(true);
- }
- }
- else if (instruction instanceof ThrowingInstruction) {
- //skip throwing instructions
- }
- else if (element instanceof GrAssertStatement) {
- sometimesHaveReturn.set(true);
- int count = 0;
- for (Instruction _i : instruction.allSuccessors()) {
- count++;
- }
- if (count <= 1) {
- alwaysHaveReturn.set(false);
- }
- }
- else {
- alwaysHaveReturn.set(false);
+ hasExplicitReturn.set(true);
+ return true;
}
+
+ alwaysHaveReturn.set(false);
return true;
}
});
diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/MissingReturnTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/MissingReturnTest.groovy
index a563021fbc5c..f841bc95c593 100644
--- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/MissingReturnTest.groovy
+++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/MissingReturnTest.groovy
@@ -169,6 +169,47 @@ List createFilters3() {
''')
}
+ void testReturnWithoutValue0() {
+ doTextText('''\
+int foo() {
+ if (abc) {
+ return
+ }
+
+ return 2
+}
+''')
+ }
+
+ void testReturnWithoutValue1() {
+ doTextText('''\
+int foo() {
+ return
+}
+''')
+ }
+
+ void testReturnWithoutValue2() {
+ doTextText('''\
+void foo() {
+ if (abc) {
+ return
+ }
+
+ print 2
+} //no error
+''')
+ }
+
+ void testReturnWithoutValue3() {
+ doTextText('''\
+void foo() {
+ return
+} //no error
+''')
+ }
+
+
void doTextText(String text) {
myFixture.configureByText('___.groovy', text)
myFixture.enableInspections(MissingReturnInspection)