Adapted IDE to no explicit return type required for public declarations

This commit is contained in:
Valentin Kipyatkov
2015-09-16 13:07:58 +03:00
parent 1708ac8da3
commit 367b32c309
19 changed files with 9 additions and 80 deletions
@@ -87,8 +87,6 @@ public class ConvertToExpressionBodyIntention : JetSelfTargetingOffsetIndependen
}
private fun canOmitType(declaration: JetCallableDeclaration, expression: JetExpression): Boolean {
if (!declaration.canRemoveTypeSpecificationByVisibility()) return false
// Workaround for anonymous objects and similar expressions without resolution scope
// TODO: This should probably be fixed in front-end so that resolution scope is recorded for anonymous objects as well
val scopeExpression = ((declaration as? JetDeclarationWithBody)?.getBodyExpression() as? JetBlockExpression)
@@ -16,26 +16,8 @@
package org.jetbrains.kotlin.idea.intentions
import com.intellij.codeInsight.template.*
import com.intellij.openapi.editor.Editor
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.JetBundle
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.idea.util.ShortenReferences
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.types.ErrorUtils
import org.jetbrains.kotlin.types.JetType
import org.jetbrains.kotlin.types.TypeUtils
import java.util.*
public class RemoveExplicitTypeIntention : JetSelfTargetingIntention<JetCallableDeclaration>(javaClass(), "Remove explicit type specification") {
override fun isApplicableTo(element: JetCallableDeclaration, caretOffset: Int): Boolean {
@@ -45,8 +27,6 @@ public class RemoveExplicitTypeIntention : JetSelfTargetingIntention<JetCallable
val initializer = (element as? JetWithExpressionInitializer)?.getInitializer()
if (initializer != null && initializer.getTextRange().containsOffset(caretOffset)) return false
if (!element.canRemoveTypeSpecificationByVisibility()) return false
return when (element) {
is JetProperty -> initializer != null
is JetNamedFunction -> !element.hasBlockBody() && initializer != null
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.idea.intentions
import com.intellij.psi.tree.IElementType
import org.jetbrains.kotlin.JetNodeTypes
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.references.mainReference
@@ -71,14 +70,6 @@ fun isAutoCreatedItUsage(expression: JetSimpleNameExpression): Boolean {
return context[BindingContext.AUTO_CREATED_IT, target]!!
}
fun JetCallableDeclaration.canRemoveTypeSpecificationByVisibility(): Boolean {
val isOverride = getModifierList()?.hasModifier(JetTokens.OVERRIDE_KEYWORD) ?: false
if (isOverride) return true
val descriptor = analyze()[BindingContext.DECLARATION_TO_DESCRIPTOR, this]
return descriptor !is DeclarationDescriptorWithVisibility || !descriptor.getVisibility().isPublicAPI
}
// returns assignment which replaces initializer
fun splitPropertyDeclaration(property: JetProperty): JetBinaryExpression {
val parent = property.getParent()!!
@@ -2,7 +2,7 @@ interface I {
fun foo(): String
}
fun bar(): I = object<caret>: I {
fun bar()<selection>: I</selection> = object: I {
override fun foo(): String {
return "a"
}
@@ -1,3 +1,3 @@
// WITH_RUNTIME
fun foo(): Unit = throw <caret>UnsupportedOperationException()
fun foo()<selection>: Unit</selection> = throw UnsupportedOperationException()
@@ -1,3 +1,3 @@
// WITH_RUNTIME
fun foo(): Nothing = throw <caret>UnsupportedOperationException()
fun foo()<selection>: Nothing</selection> = throw UnsupportedOperationException()
@@ -1 +1 @@
fun <caret>foo(): String = "abc"
fun foo()<selection>: String</selection> = "abc"
@@ -1,3 +1,3 @@
// WITH_RUNTIME
fun foo(): Unit = throw <caret>UnsupportedOperationException()
fun foo()<selection>: Unit</selection> = throw UnsupportedOperationException()
@@ -1 +1 @@
fun getText(): String = "xxx"<caret> //TODO
fun getText(): String = "xxx" //TODO
@@ -1,2 +1,2 @@
fun getText(): String = // let's return xxx
"xxx"<caret> //TODO
"xxx" //TODO
@@ -1,2 +1,2 @@
fun getText(): String = // let's return xxx
"xxx"<caret>
"xxx"
@@ -1,5 +0,0 @@
open class A {
protected fun <caret>foo(): String {
return "abc"
}
}
@@ -1,3 +0,0 @@
open class A {
protected fun <caret>foo(): String = "abc"
}
@@ -1,3 +0,0 @@
public fun <caret>foo(): String {
return "abc"
}
@@ -1 +0,0 @@
public fun <caret>foo(): String = "abc"
@@ -1,2 +0,0 @@
// IS_APPLICABLE: false
var x: String? = null
@@ -1,2 +0,0 @@
// IS_APPLICABLE: false
public var x: String? = null
@@ -3,5 +3,5 @@ interface T{
return i()
}
fun i(): Int = 1
fun i() = 1
}
@@ -4117,18 +4117,6 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
doTest(fileName);
}
@TestMetadata("protectedFunNoSelection.kt")
public void testProtectedFunNoSelection() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertToExpressionBody/protectedFunNoSelection.kt");
doTest(fileName);
}
@TestMetadata("publicFunNoSelection.kt")
public void testPublicFunNoSelection() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertToExpressionBody/publicFunNoSelection.kt");
doTest(fileName);
}
@TestMetadata("returnWithNoValue.kt")
public void testReturnWithNoValue() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertToExpressionBody/returnWithNoValue.kt");
@@ -6115,24 +6103,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/removeExplicitType"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true);
}
@TestMetadata("notOnDefaultVisibility.kt")
public void testNotOnDefaultVisibility() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/removeExplicitType/notOnDefaultVisibility.kt");
doTest(fileName);
}
@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");
doTest(fileName);
}
@TestMetadata("onOverride.kt")
public void testOnOverride() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/removeExplicitType/onOverride.kt");