From 9256682cc5f4168b3c44f4ee8bbb8f61bef4c923 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Wed, 30 Sep 2015 23:08:23 +0300 Subject: [PATCH] Fix quickfix and tests --- .../idea/inspections/KotlinCleanupInspection.kt | 1 - .../ChangePrivateTopLevelToInternalFix.kt | 16 +++++++++++++--- .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 6 ++++-- .../privateTopLevelFunInFile.after.kt | 2 +- .../privateTopLevelFunInFile.before.Main.kt | 2 +- .../privateTopLevelValInFile.after.kt | 2 +- .../privateTopLevelValInFile.before.Main.kt | 2 +- .../privateTopLevelVarInFile.after.kt | 2 +- .../privateTopLevelVarInFile.before.Main.kt | 2 +- .../privateTopLevelVarWithSetterInFile.after.kt | 2 +- ...ateTopLevelVarWithSetterInFile.before.Main.kt | 2 +- 11 files changed, 25 insertions(+), 14 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinCleanupInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinCleanupInspection.kt index 455d20bf170..11ff7b4407b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinCleanupInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinCleanupInspection.kt @@ -89,7 +89,6 @@ public class KotlinCleanupInspection(): LocalInspectionTool(), CleanupLocalInspe Errors.USELESS_ELVIS, ErrorsJvm.POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION, Errors.DEPRECATED_SYMBOL_WITH_MESSAGE, - Errors.ACCESS_TO_PRIVATE_TOP_LEVEL_FROM_ANOTHER_FILE, Errors.NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION, Errors.BACKING_FIELD_SYNTAX_DEPRECATED, Errors.OPERATOR_MODIFIER_REQUIRED diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangePrivateTopLevelToInternalFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangePrivateTopLevelToInternalFix.kt index b0ce3f3c41d..6749dca7536 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangePrivateTopLevelToInternalFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangePrivateTopLevelToInternalFix.kt @@ -19,12 +19,16 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.codeInsight.intention.IntentionAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.diagnostics.Diagnostic -import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.diagnostics.DiagnosticFactory3 import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetModifierListOwner import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils +import org.jetbrains.kotlin.resolve.DescriptorUtils public class ChangePrivateTopLevelToInternalFix(element: JetModifierListOwner, private val elementName: String) : JetIntentionAction(element), CleanupFix { override fun getText() = "Make $elementName internal" @@ -36,9 +40,15 @@ public class ChangePrivateTopLevelToInternalFix(element: JetModifierListOwner, p companion object : JetSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): IntentionAction? { - val descriptor = Errors.ACCESS_TO_PRIVATE_TOP_LEVEL_FROM_ANOTHER_FILE.cast(diagnostic).a + @Suppress("UNCHECKED_CAST") + val factory = diagnostic.factory as DiagnosticFactory3<*, DeclarationDescriptor, *, DeclarationDescriptor> + val descriptor = factory.cast(diagnostic).c + if (!DescriptorUtils.isTopLevelDeclaration(descriptor) || + descriptor !is DeclarationDescriptorWithVisibility || + descriptor.visibility != Visibilities.PRIVATE) return null + val declaration = DescriptorToSourceUtils.getSourceFromDescriptor(descriptor) as? JetModifierListOwner ?: return null return ChangePrivateTopLevelToInternalFix(declaration, descriptor.name.asString()) } } -} \ No newline at end of file +} diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 4e30f0e8bc6..c5a6f5b6852 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -66,8 +66,6 @@ public class QuickFixRegistrar : QuickFixContributor { ABSTRACT_MEMBER_NOT_IMPLEMENTED.registerFactory(addAbstractModifierFactory) MANY_IMPL_MEMBER_NOT_IMPLEMENTED.registerFactory(addAbstractModifierFactory) - ACCESS_TO_PRIVATE_TOP_LEVEL_FROM_ANOTHER_FILE.registerFactory(ChangePrivateTopLevelToInternalFix) - val removeFinalModifierFactory = RemoveModifierFix.createRemoveModifierFromListOwnerFactory(FINAL_KEYWORD) val addAbstractToClassFactory = AddModifierFix.createFactory(ABSTRACT_KEYWORD, javaClass()) ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS.registerFactory(removeAbstractModifierFactory, addAbstractToClassFactory) @@ -144,6 +142,10 @@ public class QuickFixRegistrar : QuickFixContributor { CANNOT_CHANGE_ACCESS_PRIVILEGE.registerFactory(ChangeVisibilityModifierFix.createFactory()) CANNOT_WEAKEN_ACCESS_PRIVILEGE.registerFactory(ChangeVisibilityModifierFix.createFactory()) + INVISIBLE_REFERENCE.registerFactory(ChangePrivateTopLevelToInternalFix) + INVISIBLE_MEMBER.registerFactory(ChangePrivateTopLevelToInternalFix) + INVISIBLE_SETTER.registerFactory(ChangePrivateTopLevelToInternalFix) + REDUNDANT_NULLABLE.registerFactory(RemoveNullableFix.createFactory(RemoveNullableFix.NullableKind.REDUNDANT)) NULLABLE_SUPERTYPE.registerFactory(RemoveNullableFix.createFactory(RemoveNullableFix.NullableKind.SUPERTYPE)) USELESS_NULLABLE_CHECK.registerFactory(RemoveNullableFix.createFactory(RemoveNullableFix.NullableKind.USELESS)) diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.after.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.after.kt index 9bf60210eaa..a41739600cf 100644 --- a/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.after.kt +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.after.kt @@ -1,5 +1,5 @@ // "Make f internal" "true" -// ERROR: Cannot access 'f': it is 'private' in 'privateTopLevelFunInFile.before.Dependency.kt' +// ERROR: Cannot access 'f': it is 'private' in file package test diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.before.Main.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.before.Main.kt index 92566640acf..03c3047200d 100644 --- a/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.before.Main.kt +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelFunInFile.before.Main.kt @@ -1,5 +1,5 @@ // "Make f internal" "true" -// ERROR: Cannot access 'f': it is 'private' in 'privateTopLevelFunInFile.before.Dependency.kt' +// ERROR: Cannot access 'f': it is 'private' in file package test diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.after.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.after.kt index 3b1f30a9ef1..a030d83f681 100644 --- a/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.after.kt +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.after.kt @@ -1,5 +1,5 @@ // "Make prop internal" "true" -// ERROR: Cannot access 'prop': it is 'private' in 'privateTopLevelValInFile.before.Dependency.kt' +// ERROR: Cannot access 'prop': it is 'private' in file package test diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.before.Main.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.before.Main.kt index 902c18756e8..0e79346b47f 100644 --- a/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.before.Main.kt +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelValInFile.before.Main.kt @@ -1,5 +1,5 @@ // "Make prop internal" "true" -// ERROR: Cannot access 'prop': it is 'private' in 'privateTopLevelValInFile.before.Dependency.kt' +// ERROR: Cannot access 'prop': it is 'private' in file package test diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.after.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.after.kt index aff6aec77c5..55f0804f6c1 100644 --- a/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.after.kt +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.after.kt @@ -1,5 +1,5 @@ // "Make prop internal" "true" -// ERROR: Cannot access 'prop': it is 'private' in 'privateTopLevelVarInFile.before.Dependency.kt' +// ERROR: Cannot access 'prop': it is 'private' in file package test diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.before.Main.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.before.Main.kt index 898697c8544..44536817fa7 100644 --- a/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.before.Main.kt +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelVarInFile.before.Main.kt @@ -1,5 +1,5 @@ // "Make prop internal" "true" -// ERROR: Cannot access 'prop': it is 'private' in 'privateTopLevelVarInFile.before.Dependency.kt' +// ERROR: Cannot access 'prop': it is 'private' in file package test diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.after.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.after.kt index 1e53a99d875..c60aa2a3653 100644 --- a/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.after.kt +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.after.kt @@ -1,5 +1,5 @@ // "Make internal" "true" -// ERROR: Cannot access '': it is 'private' in 'privateTopLevelVarWithSetterInFile.before.Dependency.kt' +// ERROR: Cannot assign to 'prop': the setter is 'private' in file package test diff --git a/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.before.Main.kt b/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.before.Main.kt index 04dbe67d473..90c329e9094 100644 --- a/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.before.Main.kt +++ b/idea/testData/quickfix/privateInFiles/privateTopLevelVarWithSetterInFile.before.Main.kt @@ -1,5 +1,5 @@ // "Make internal" "true" -// ERROR: Cannot access '': it is 'private' in 'privateTopLevelVarWithSetterInFile.before.Dependency.kt' +// ERROR: Cannot assign to 'prop': the setter is 'private' in file package test