diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinHighlightExitPointsHandlerFactory.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinHighlightExitPointsHandlerFactory.kt index 6ea7ac06d29..c1f5756a724 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinHighlightExitPointsHandlerFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinHighlightExitPointsHandlerFactory.kt @@ -29,13 +29,10 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType -import org.jetbrains.kotlin.psi.psiUtil.getParentOfType -import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.parents import org.jetbrains.kotlin.resolve.inline.InlineUtil -class KotlinHighlightExitPointsHandlerFactory: HighlightUsagesHandlerFactoryBase() { +class KotlinHighlightExitPointsHandlerFactory : HighlightUsagesHandlerFactoryBase() { companion object { private val RETURN_AND_THROW = TokenSet.create(KtTokens.RETURN_KEYWORD, KtTokens.THROW_KEYWORD) } @@ -61,14 +58,14 @@ class KotlinHighlightExitPointsHandlerFactory: HighlightUsagesHandlerFactoryBase } override fun computeUsages(targets: MutableList?) { - val relevantFunction = target.getRelevantFunction() + val relevantFunction = target.getRelevantDeclaration() relevantFunction?.accept(object : KtVisitorVoid() { override fun visitKtElement(element: KtElement) { element.acceptChildren(this) } private fun visitReturnOrThrow(expression: KtExpression) { - if (expression.getRelevantFunction() == relevantFunction) { + if (expression.getRelevantDeclaration() == relevantFunction) { addOccurrence(expression) } } @@ -85,14 +82,20 @@ class KotlinHighlightExitPointsHandlerFactory: HighlightUsagesHandlerFactoryBase } } -private fun KtExpression.getRelevantFunction(): KtFunction? { +private fun KtExpression.getRelevantDeclaration(): KtDeclarationWithBody? { if (this is KtReturnExpression) { (this.getTargetLabel()?.mainReference?.resolve() as? KtFunction)?.let { return it } } + for (parent in parents) { - if (InlineUtil.canBeInlineArgument(parent) && !InlineUtil.isInlinedArgument(parent as KtFunction, parent.analyze(), false)) { - return parent + if (parent is KtDeclarationWithBody) { + when { + parent is KtPropertyAccessor -> return parent + InlineUtil.canBeInlineArgument(parent) && !InlineUtil.isInlinedArgument(parent as KtFunction, parent.analyze(), false) -> + return parent + } } } + return null } \ No newline at end of file diff --git a/idea/testData/exitPoints/getter.kt b/idea/testData/exitPoints/getter.kt new file mode 100644 index 00000000000..f2816962ca4 --- /dev/null +++ b/idea/testData/exitPoints/getter.kt @@ -0,0 +1,12 @@ +val Any?.foo: Int + get() { + this?.let { + return 1 + } + return 2 + } + +public inline fun T.let(block: (T) -> Unit) {} + +//HIGHLIGHTED: return 1 +//HIGHLIGHTED: return 2 \ No newline at end of file diff --git a/idea/testData/exitPoints/inline3.kt b/idea/testData/exitPoints/inline3.kt new file mode 100644 index 00000000000..b1d08be1db8 --- /dev/null +++ b/idea/testData/exitPoints/inline3.kt @@ -0,0 +1,11 @@ +fun Any?.foo(): Int { + this?.let { + return 1 + } + return 2 +} + +public inline fun T.let(block: (T) -> Unit) {} + +//HIGHLIGHTED: return 1 +//HIGHLIGHTED: return 2 \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/highlighter/HighlightExitPointsTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/highlighter/HighlightExitPointsTestGenerated.java index d7b54b53170..0e6b7e9f6f5 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/highlighter/HighlightExitPointsTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/highlighter/HighlightExitPointsTestGenerated.java @@ -36,6 +36,12 @@ public class HighlightExitPointsTestGenerated extends AbstractHighlightExitPoint KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/exitPoints"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("getter.kt") + public void testGetter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/exitPoints/getter.kt"); + doTest(fileName); + } + @TestMetadata("inline1.kt") public void testInline1() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/exitPoints/inline1.kt"); @@ -48,6 +54,12 @@ public class HighlightExitPointsTestGenerated extends AbstractHighlightExitPoint doTest(fileName); } + @TestMetadata("inline3.kt") + public void testInline3() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/exitPoints/inline3.kt"); + doTest(fileName); + } + @TestMetadata("inlineLocalReturn1.kt") public void testInlineLocalReturn1() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/exitPoints/inlineLocalReturn1.kt");