diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java index f2be2a783d20..3bd71167d4e7 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/codeInspection/assignment/GroovyAssignabilityCheckInspection.java @@ -18,6 +18,7 @@ package org.jetbrains.plugins.groovy.codeInspection.assignment; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.TypeConversionUtil; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -31,6 +32,7 @@ import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrNamedArgument; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrClosableBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrOpenBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrReturnStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrAssignmentExpression; @@ -109,11 +111,8 @@ public class GroovyAssignabilityCheckInspection extends BaseInspection { public void visitReturnStatement(GrReturnStatement returnStatement) { super.visitReturnStatement(returnStatement); - final PsiElement parent = returnStatement.getParent(); - if (!(parent instanceof GrOpenBlock)) return; - final PsiElement element = parent.getParent(); - if (!(element instanceof GrMethod)) return; - GrMethod method = (GrMethod)element; + final GrMethod method = PsiTreeUtil.getParentOfType(returnStatement, GrMethod.class, true, GrClosableBlock.class); + if (method == null) return; final GrExpression value = returnStatement.getReturnValue(); final PsiType expectedType = method.getReturnType(); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java index 5334185f8ba6..ef725d71b557 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.java @@ -274,13 +274,10 @@ public class GroovyHighlightingTest extends LightCodeInsightFixtureTestCase { doTest(); } - public void testCollectionAssignments() throws Exception { - doTest(new GroovyAssignabilityCheckInspection()); - } + public void testCollectionAssignments() {doTest(new GroovyAssignabilityCheckInspection()); } + public void testReturnAssignability() {doTest(new GroovyAssignabilityCheckInspection()); } public void testNumberDuplicatesInMaps() throws Exception {doTest();} - public void testMapNotAcceptedAsStringParameter() { - doTest(); - } + public void testMapNotAcceptedAsStringParameter() {doTest();} } \ No newline at end of file diff --git a/plugins/groovy/testdata/highlighting/ReturnAssignability.groovy b/plugins/groovy/testdata/highlighting/ReturnAssignability.groovy new file mode 100644 index 000000000000..78d70d3417d6 --- /dev/null +++ b/plugins/groovy/testdata/highlighting/ReturnAssignability.groovy @@ -0,0 +1,10 @@ +File foo() { + List ints = [] + if (ints.empty) { + print {return 42} + for (x in ints) { + return 43 + } + } + 67 +} \ No newline at end of file