From bf09906f357d8c52550aa1558ff8c4656f72802c Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 28 May 2015 19:11:57 +0300 Subject: [PATCH] Fix ISE when caret is on parameter of function type EA-68570 --- idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt | 8 ++++---- .../removeExplicitType/notOnParameterOfFunctionType.kt | 2 ++ .../kotlin/idea/intentions/IntentionTestGenerated.java | 6 ++++++ 3 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 idea/testData/intentions/removeExplicitType/notOnParameterOfFunctionType.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt index 4206c6a3f3b..84383778437 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt @@ -22,7 +22,6 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze -import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.references.JetReference import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.ShortenReferences @@ -74,10 +73,11 @@ fun isAutoCreatedItUsage(expression: JetSimpleNameExpression): Boolean { } fun JetCallableDeclaration.canRemoveTypeSpecificationByVisibility(): Boolean { - val descriptor = resolveToDescriptor() val isOverride = getModifierList()?.hasModifier(JetTokens.OVERRIDE_KEYWORD) ?: false - if (!isOverride && (descriptor as? DeclarationDescriptorWithVisibility)?.getVisibility()?.isPublicAPI() ?: false) return false - return true + if (isOverride) return true + + val descriptor = analyze()[BindingContext.DECLARATION_TO_DESCRIPTOR, this] + return descriptor !is DeclarationDescriptorWithVisibility || !descriptor.getVisibility().isPublicAPI() } // returns assignment which replaces initializer diff --git a/idea/testData/intentions/removeExplicitType/notOnParameterOfFunctionType.kt b/idea/testData/intentions/removeExplicitType/notOnParameterOfFunctionType.kt new file mode 100644 index 00000000000..daff11251c6 --- /dev/null +++ b/idea/testData/intentions/removeExplicitType/notOnParameterOfFunctionType.kt @@ -0,0 +1,2 @@ +// IS_APPLICABLE: false +fun foo(x: (String) -> Unit) {} diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index bd48e49e262..e8901f44991 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -5671,6 +5671,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/removeExplicitType"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true); } + @TestMetadata("notOnParameterOfFunctionType.kt") + public void testNotOnParameterOfFunctionType() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/removeExplicitType/notOnParameterOfFunctionType.kt"); + doTest(fileName); + } + @TestMetadata("notOnPublic.kt") public void testNotOnPublic() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/removeExplicitType/notOnPublic.kt");