diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinBundle.properties b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinBundle.properties index 4a38c9167c2..721656aff16 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinBundle.properties +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinBundle.properties @@ -90,7 +90,6 @@ livetemplate.description.anonymous=Anonymous class livetemplate.description.exfun=Extension function livetemplate.description.exval=Extension read-only property livetemplate.description.exvar=Extension read-write property -change.visibility.modifier=Change visibility modifier options.kotlin.attribute.descriptor.builtin.annotation=Built-in annotation options.kotlin.attribute.descriptor.string.escape=Escape in string and template braces diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityModifierFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityModifierFix.kt index 5e50c918d50..c64a3024bc6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityModifierFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeVisibilityModifierFix.kt @@ -14,108 +14,28 @@ * limitations under the License. */ -package org.jetbrains.kotlin.idea.quickfix; +package org.jetbrains.kotlin.idea.quickfix -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.util.IncorrectOperationException; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor; -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; -import org.jetbrains.kotlin.descriptors.Visibilities; -import org.jetbrains.kotlin.descriptors.Visibility; -import org.jetbrains.kotlin.diagnostics.Diagnostic; -import org.jetbrains.kotlin.idea.KotlinBundle; -import org.jetbrains.kotlin.idea.caches.resolve.ResolutionUtils; -import org.jetbrains.kotlin.idea.core.DescriptorUtilsKt; -import org.jetbrains.kotlin.idea.core.PsiModificationUtilsKt; -import org.jetbrains.kotlin.lexer.KtModifierKeywordToken; -import org.jetbrains.kotlin.psi.KtDeclaration; -import org.jetbrains.kotlin.psi.KtFile; -import org.jetbrains.kotlin.psi.KtParameter; -import org.jetbrains.kotlin.resolve.BindingContext; +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.psiUtil.visibilityModifierType -public class ChangeVisibilityModifierFix extends KotlinQuickFixAction { - public ChangeVisibilityModifierFix(@NotNull KtDeclaration element) { - super(element); +class ChangeVisibilityModifierFix(element: KtDeclaration) : KotlinQuickFixAction(element) { + override fun getFamilyName() = "Use inherited visibility" + + override fun getText() = familyName + + public override fun invoke(project: Project, editor: Editor?, file: KtFile) { + element.removeModifier(element.visibilityModifierType()!!) } - @NotNull - @Override - public String getText() { - return KotlinBundle.message("change.visibility.modifier"); - } - - @NotNull - @Override - public String getFamilyName() { - return KotlinBundle.message("change.visibility.modifier"); - } - - @Override - public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiFile file) { - if (!(file instanceof KtFile)) return false; - return super.isAvailable(project, editor, file) && (findVisibilityChangeTo() != null); - } - - @Override - public void invoke(@NotNull Project project, Editor editor, @NotNull KtFile file) throws IncorrectOperationException { - KtModifierKeywordToken modifier = findVisibilityChangeTo(); - assert modifier != null; - PsiModificationUtilsKt.setVisibility(getElement(), modifier); - } - - @Nullable - private KtModifierKeywordToken findVisibilityChangeTo() { - BindingContext bindingContext = ResolutionUtils.analyze(getElement()); - DeclarationDescriptor descriptor; - if (getElement() instanceof KtParameter) { - descriptor = bindingContext.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, getElement()); + companion object : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction? { + val element = diagnostic.psiElement as? KtDeclaration ?: return null + return ChangeVisibilityModifierFix(element) } - else { - descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, getElement()); - } - if (!(descriptor instanceof CallableMemberDescriptor)) return null; - - CallableMemberDescriptor memberDescriptor = (CallableMemberDescriptor)descriptor; - Visibility maxVisibility = null; - for (CallableMemberDescriptor overriddenDescriptor : memberDescriptor.getOverriddenDescriptors()) { - Visibility overriddenDescriptorVisibility = overriddenDescriptor.getVisibility(); - if (maxVisibility == null) { - maxVisibility = overriddenDescriptorVisibility; - continue; - } - Integer compare = Visibilities.compare(maxVisibility, overriddenDescriptorVisibility); - if (compare == null) { - maxVisibility = Visibilities.PUBLIC; - } - else if (compare < 0) { - maxVisibility = overriddenDescriptorVisibility; - } - } - if (maxVisibility == memberDescriptor.getVisibility()) { - return null; - } - - if (maxVisibility == null) { - return null; - } - - return DescriptorUtilsKt.toKeywordToken(maxVisibility); } - - public static KotlinSingleIntentionActionFactory createFactory() { - return new KotlinSingleIntentionActionFactory() { - @Override - public KotlinQuickFixAction createAction(@NotNull Diagnostic diagnostic) { - PsiElement element = diagnostic.getPsiElement(); - if (!(element instanceof KtDeclaration)) return null; - return new ChangeVisibilityModifierFix((KtDeclaration)element); - } - }; - } - } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 5b9ec6a53df..d1a4a6bf347 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -143,8 +143,8 @@ class QuickFixRegistrar : QuickFixContributor { SUPERTYPE_NOT_INITIALIZED.registerFactory(SuperClassNotInitialized) FUNCTION_CALL_EXPECTED.registerFactory(ChangeToFunctionInvocationFix) - CANNOT_CHANGE_ACCESS_PRIVILEGE.registerFactory(ChangeVisibilityModifierFix.createFactory()) - CANNOT_WEAKEN_ACCESS_PRIVILEGE.registerFactory(ChangeVisibilityModifierFix.createFactory()) + CANNOT_CHANGE_ACCESS_PRIVILEGE.registerFactory(ChangeVisibilityModifierFix) + CANNOT_WEAKEN_ACCESS_PRIVILEGE.registerFactory(ChangeVisibilityModifierFix) INVISIBLE_REFERENCE.registerFactory(ChangePrivateTopLevelToInternalFix) INVISIBLE_MEMBER.registerFactory(ChangePrivateTopLevelToInternalFix) diff --git a/idea/testData/quickfix/modifiers/visibilityModifer1.kt b/idea/testData/quickfix/modifiers/visibilityModifer1.kt index 6c6521e0302..35dd2cfa18e 100644 --- a/idea/testData/quickfix/modifiers/visibilityModifer1.kt +++ b/idea/testData/quickfix/modifiers/visibilityModifer1.kt @@ -1,4 +1,4 @@ -// "Change visibility modifier" "true" +// "Use inherited visibility" "true" open class A { protected open fun run() {} } diff --git a/idea/testData/quickfix/modifiers/visibilityModifer1.kt.after b/idea/testData/quickfix/modifiers/visibilityModifer1.kt.after index ed204c0fa96..7fdf4b81e3c 100644 --- a/idea/testData/quickfix/modifiers/visibilityModifer1.kt.after +++ b/idea/testData/quickfix/modifiers/visibilityModifer1.kt.after @@ -1,4 +1,4 @@ -// "Change visibility modifier" "true" +// "Use inherited visibility" "true" open class A { protected open fun run() {} } diff --git a/idea/testData/quickfix/modifiers/visibilityModifer2.kt b/idea/testData/quickfix/modifiers/visibilityModifer2.kt index d88c204bde4..c8666318f8c 100644 --- a/idea/testData/quickfix/modifiers/visibilityModifer2.kt +++ b/idea/testData/quickfix/modifiers/visibilityModifer2.kt @@ -1,4 +1,4 @@ -// "Change visibility modifier" "true" +// "Use inherited visibility" "true" open class A { protected open fun run() {} } diff --git a/idea/testData/quickfix/modifiers/visibilityModifer2.kt.after b/idea/testData/quickfix/modifiers/visibilityModifer2.kt.after index ed204c0fa96..7fdf4b81e3c 100644 --- a/idea/testData/quickfix/modifiers/visibilityModifer2.kt.after +++ b/idea/testData/quickfix/modifiers/visibilityModifer2.kt.after @@ -1,4 +1,4 @@ -// "Change visibility modifier" "true" +// "Use inherited visibility" "true" open class A { protected open fun run() {} } diff --git a/idea/testData/quickfix/modifiers/visibilityModiferOverrideJavaRuntime.kt b/idea/testData/quickfix/modifiers/visibilityModiferOverrideJavaRuntime.kt index a5836ce0061..3c7f108bdef 100644 --- a/idea/testData/quickfix/modifiers/visibilityModiferOverrideJavaRuntime.kt +++ b/idea/testData/quickfix/modifiers/visibilityModiferOverrideJavaRuntime.kt @@ -1,4 +1,4 @@ -// "Change visibility modifier" "true" +// "Use inherited visibility" "true" abstract class C : ClassLoader() { private override fun findClass(var1: String): Class<*> { throw ClassNotFoundException(var1) diff --git a/idea/testData/quickfix/modifiers/visibilityModiferOverrideJavaRuntime.kt.after b/idea/testData/quickfix/modifiers/visibilityModiferOverrideJavaRuntime.kt.after index fffba28951c..04c91f4108f 100644 --- a/idea/testData/quickfix/modifiers/visibilityModiferOverrideJavaRuntime.kt.after +++ b/idea/testData/quickfix/modifiers/visibilityModiferOverrideJavaRuntime.kt.after @@ -1,4 +1,4 @@ -// "Change visibility modifier" "true" +// "Use inherited visibility" "true" abstract class C : ClassLoader() { override fun findClass(var1: String): Class<*> { throw ClassNotFoundException(var1) diff --git a/idea/testData/quickfix/modifiers/visibilityModiferParameter.kt b/idea/testData/quickfix/modifiers/visibilityModiferParameter.kt index 2f3016c17de..9234208cad9 100644 --- a/idea/testData/quickfix/modifiers/visibilityModiferParameter.kt +++ b/idea/testData/quickfix/modifiers/visibilityModiferParameter.kt @@ -1,4 +1,4 @@ -// "Change visibility modifier" "true" +// "Use inherited visibility" "true" interface ParseResult { public val success : Boolean public val value : T diff --git a/idea/testData/quickfix/modifiers/visibilityModiferParameter.kt.after b/idea/testData/quickfix/modifiers/visibilityModiferParameter.kt.after index e09ef4e1d99..cb96898da65 100644 --- a/idea/testData/quickfix/modifiers/visibilityModiferParameter.kt.after +++ b/idea/testData/quickfix/modifiers/visibilityModiferParameter.kt.after @@ -1,4 +1,4 @@ -// "Change visibility modifier" "true" +// "Use inherited visibility" "true" interface ParseResult { public val success : Boolean public val value : T