From 05aaea48e9806eb73fe7c51ea2ad94711d543f69 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 7 Oct 2014 15:46:17 +0400 Subject: [PATCH] Added API in PSI to add/remove modifiers and refactored quickfixes to use it --- .../org/jetbrains/jet/lang/psi/JetClass.java | 27 +++++ .../jet/lang/psi/JetDeclarationImpl.java | 14 ++- .../jet/lang/psi/JetModifierList.java | 22 +---- .../jet/lang/psi/JetModifierListOwner.java | 6 +- .../lang/psi/JetModifierListOwnerStub.java | 14 ++- .../jet/lang/psi/JetObjectDeclaration.java | 2 +- .../jet/lang/psi/addRemoveModifier.kt | 98 +++++++++++++++++++ .../plugin/formatter/kotlinSpacingRules.kt | 2 + .../jet/plugin/quickfix/AddModifierFix.java | 97 +----------------- .../AddOpenModifierToClassDeclarationFix.java | 2 +- ...ddOverrideToEqualsHashCodeToStringFix.java | 16 ++- .../quickfix/ChangeVisibilityModifierFix.java | 10 +- .../MakeClassAnAnnotationClassFix.java | 2 +- .../quickfix/MakeOverriddenMemberOpenFix.java | 11 ++- .../refactoring/JetRefactoringUtil.java | 5 +- .../usages/JetFunctionDefinitionUsage.java | 41 ++++---- ...fterAbstractPropertyInNonAbstractClass3.kt | 4 + ...foreAbstractPropertyInNonAbstractClass3.kt | 4 + .../modifiers/afterOpenMemberInFinalClass3.kt | 4 + .../modifiers/afterOpenMemberInFinalClass4.kt | 4 + .../beforeOpenMemberInFinalClass3.kt | 4 + .../beforeOpenMemberInFinalClass4.kt | 4 + .../quickfix/QuickFixTestGenerated.java | 18 ++++ 23 files changed, 250 insertions(+), 161 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/psi/addRemoveModifier.kt create mode 100644 idea/testData/quickfix/abstract/afterAbstractPropertyInNonAbstractClass3.kt create mode 100644 idea/testData/quickfix/abstract/beforeAbstractPropertyInNonAbstractClass3.kt create mode 100644 idea/testData/quickfix/modifiers/afterOpenMemberInFinalClass3.kt create mode 100644 idea/testData/quickfix/modifiers/afterOpenMemberInFinalClass4.kt create mode 100644 idea/testData/quickfix/modifiers/beforeOpenMemberInFinalClass3.kt create mode 100644 idea/testData/quickfix/modifiers/beforeOpenMemberInFinalClass4.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java index d04c3d8ef18..d7d622b9eab 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java @@ -27,9 +27,11 @@ import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.JetNodeTypes; +import org.jetbrains.jet.lang.psi.addRemoveModifier.AddRemoveModifierPackage; import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub; import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes; import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lexer.JetModifierKeywordToken; import org.jetbrains.jet.lexer.JetTokens; import java.util.ArrayList; @@ -90,6 +92,31 @@ public class JetClass extends JetTypeParameterListOwnerStub imp return getStubOrPsiChild(JetStubElementTypes.PRIMARY_CONSTRUCTOR_MODIFIER_LIST); } + public void addPrimaryConstructorModifier(@NotNull JetModifierKeywordToken modifier) { + JetModifierList modifierList = getPrimaryConstructorModifierList(); + if (modifierList != null) { + AddRemoveModifierPackage.addModifier(modifierList, modifier, JetTokens.PUBLIC_KEYWORD); + } + else { + if (modifier == JetTokens.PUBLIC_KEYWORD) return; + + JetParameterList parameterList = getPrimaryConstructorParameterList(); + assert parameterList != null; + JetModifierList newModifierList = new JetPsiFactory(getProject()).createModifierList(modifier); + addBefore(newModifierList, parameterList); + } + } + + public void removePrimaryConstructorModifier(@NotNull JetModifierKeywordToken modifier) { + JetModifierList list = getPrimaryConstructorModifierList(); + if (list != null) { + PsiElement token = list.getModifier(modifier); + if (token != null) { + token.delete(); + } + } + } + @Override @NotNull public List getAnonymousInitializers() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDeclarationImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDeclarationImpl.java index de7345695c2..daded86cf84 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDeclarationImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetDeclarationImpl.java @@ -20,7 +20,9 @@ import com.intellij.lang.ASTNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.JetNodeTypes; +import org.jetbrains.jet.lang.psi.addRemoveModifier.AddRemoveModifierPackage; import org.jetbrains.jet.lexer.JetModifierKeywordToken; +import org.jetbrains.jet.lexer.JetTokens; import java.util.Collections; import java.util.List; @@ -37,11 +39,21 @@ abstract class JetDeclarationImpl extends JetExpressionImpl implements JetDeclar } @Override - public boolean hasModifier(JetModifierKeywordToken modifier) { + public boolean hasModifier(@NotNull JetModifierKeywordToken modifier) { JetModifierList modifierList = getModifierList(); return modifierList != null && modifierList.hasModifier(modifier); } + @Override + public void addModifier(@NotNull JetModifierKeywordToken modifier) { + AddRemoveModifierPackage.addModifier(this, modifier, JetTokens.INTERNAL_KEYWORD); + } + + @Override + public void removeModifier(@NotNull JetModifierKeywordToken modifier) { + AddRemoveModifierPackage.removeModifier(this, modifier); + } + @NotNull @Override public List getAnnotationEntries() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetModifierList.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetModifierList.java index 5ce1d3f1b46..d6070e423bf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetModifierList.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetModifierList.java @@ -62,21 +62,7 @@ public abstract class JetModifierList extends JetElementImplStubemptyList(); } - @NotNull - public List getModifierNodes() { - List modifierNodes = new ArrayList(); - - ASTNode node = getNode().getFirstChildNode(); - while (node != null) { - if (node.getElementType() instanceof JetModifierKeywordToken) { - modifierNodes.add(node); - } - node = node.getTreeNext(); - } - return modifierNodes; - } - - public boolean hasModifier(JetModifierKeywordToken token) { + public boolean hasModifier(@NotNull JetModifierKeywordToken token) { PsiJetModifierListStub stub = getStub(); if (stub != null) { return stub.hasModifier(token); @@ -85,12 +71,12 @@ public abstract class JetModifierList extends JetElementImplStub extends JetElementI } @Override - public boolean hasModifier(JetModifierKeywordToken modifier) { + public boolean hasModifier(@NotNull JetModifierKeywordToken modifier) { JetModifierList modifierList = getModifierList(); return modifierList != null && modifierList.hasModifier(modifier); } + @Override + public void addModifier(@NotNull JetModifierKeywordToken modifier) { + AddRemoveModifierPackage.addModifier(this, modifier, JetTokens.INTERNAL_KEYWORD); + } + + @Override + public void removeModifier(@NotNull JetModifierKeywordToken modifier) { + AddRemoveModifierPackage.removeModifier(this, modifier); + } + @Override @NotNull public List getAnnotationEntries() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java index 81226973cfe..a4ff46637f9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java @@ -110,7 +110,7 @@ public class JetObjectDeclaration extends JetNamedDeclarationStub order + } + + val anchor = modifierList.getLastChild()?.siblings(forward = false)?.firstOrNull(::placeAfter) + modifierList.addAfter(newModifier, anchor) + } +} + +internal fun removeModifier(owner: JetModifierListOwner, modifier: JetModifierKeywordToken) { + owner.getModifierList()?.getModifier(modifier)?.delete() +} + +private val MODIFIERS_TO_REPLACE = mapOf( + ABSTRACT_KEYWORD to listOf(OPEN_KEYWORD, FINAL_KEYWORD), + OVERRIDE_KEYWORD to listOf(OPEN_KEYWORD), + OPEN_KEYWORD to listOf(FINAL_KEYWORD), + PUBLIC_KEYWORD to listOf(PROTECTED_KEYWORD, PRIVATE_KEYWORD, INTERNAL_KEYWORD), + PROTECTED_KEYWORD to listOf(PUBLIC_KEYWORD, PRIVATE_KEYWORD, INTERNAL_KEYWORD), + PRIVATE_KEYWORD to listOf(PUBLIC_KEYWORD, PROTECTED_KEYWORD, INTERNAL_KEYWORD), + INTERNAL_KEYWORD to listOf(PUBLIC_KEYWORD, PROTECTED_KEYWORD, PRIVATE_KEYWORD) +) + +private val MODIFIERS_ORDER = listOf(PUBLIC_KEYWORD, PROTECTED_KEYWORD, PRIVATE_KEYWORD, INTERNAL_KEYWORD, + FINAL_KEYWORD, OPEN_KEYWORD, ABSTRACT_KEYWORD, + OVERRIDE_KEYWORD, + INNER_KEYWORD, + ANNOTATION_KEYWORD, ENUM_KEYWORD) diff --git a/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt b/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt index 69bc021a028..a66998b7a63 100644 --- a/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt +++ b/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt @@ -131,6 +131,8 @@ fun createSpacingBuilder(settings: CodeStyleSettings): KotlinSpacingBuilder { aroundInside(ARROW, FUNCTION_TYPE).spaceIf(jetSettings.SPACE_AROUND_FUNCTION_TYPE_ARROW) betweenInside(REFERENCE_EXPRESSION, FUNCTION_LITERAL_ARGUMENT, CALL_EXPRESSION).spaces(1) + + betweenInside(IDENTIFIER, MODIFIER_LIST, CLASS).spaces(1) } custom { diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/AddModifierFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/AddModifierFix.java index afb7c6676f2..205087726b9 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/AddModifierFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/AddModifierFix.java @@ -23,31 +23,22 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiNameIdentifierOwner; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.lang.psi.JetModifierList; import org.jetbrains.jet.lang.psi.JetModifierListOwner; import org.jetbrains.jet.lang.psi.JetPropertyAccessor; -import org.jetbrains.jet.lexer.JetKeywordToken; import org.jetbrains.jet.lexer.JetModifierKeywordToken; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.plugin.JetBundle; -import java.util.HashMap; -import java.util.Map; - -import static org.jetbrains.jet.lang.psi.PsiPackage.JetPsiFactory; -import static org.jetbrains.jet.lexer.JetTokens.*; +import static org.jetbrains.jet.lexer.JetTokens.ABSTRACT_KEYWORD; public class AddModifierFix extends JetIntentionAction { - private final JetKeywordToken modifier; - private final JetModifierKeywordToken[] modifiersThanCanBeReplaced; + @NotNull private final JetModifierKeywordToken modifier; - private AddModifierFix(@NotNull JetModifierListOwner element, @NotNull JetKeywordToken modifier, @Nullable JetModifierKeywordToken[] modifiersThanCanBeReplaced) { + private AddModifierFix(@NotNull JetModifierListOwner element, @NotNull JetModifierKeywordToken modifier) { super(element); this.modifier = modifier; - this.modifiersThanCanBeReplaced = modifiersThanCanBeReplaced; } @NotNull @@ -85,78 +76,7 @@ public class AddModifierFix extends JetIntentionAction { @Override public void invoke(@NotNull Project project, Editor editor, JetFile file) throws IncorrectOperationException { - element.replace(addModifier(element, modifier, modifiersThanCanBeReplaced, project, false)); - } - - @NotNull - /*package*/ static JetModifierListOwner addModifier(@NotNull PsiElement element, @NotNull JetKeywordToken modifier, @Nullable JetModifierKeywordToken[] modifiersThatCanBeReplaced, @NotNull Project project, boolean toBeginning) { - JetModifierListOwner newElement = (JetModifierListOwner) (element.copy()); - changeModifier(newElement, newElement.getModifierList(), newElement.getFirstChild(), - modifiersThatCanBeReplaced, project, toBeginning, JetPsiFactory(project).createModifierList(modifier)); - return newElement; - } - - public static void changeModifier( - PsiElement element, @Nullable JetModifierList modifierList, @Nullable PsiElement insertAnchor, - JetModifierKeywordToken[] modifiersThatCanBeReplaced, Project project, boolean toBeginning, JetModifierList listWithModifier - ) { - PsiElement whiteSpace = JetPsiFactory(project).createWhiteSpace(); - if (modifierList == null) { - if (listWithModifier != null) { - if (insertAnchor != null) { - listWithModifier = (JetModifierList) element.addBefore(listWithModifier, insertAnchor); - element.addBefore(whiteSpace, insertAnchor); - element.addBefore(whiteSpace, listWithModifier); - } - else { - PsiElement firstChild = element.getFirstChild(); - element.addBefore(listWithModifier, firstChild); - element.addBefore(whiteSpace, firstChild); - } - } - } - else { - boolean replaced = false; - if (modifiersThatCanBeReplaced != null) { - PsiElement toBeReplaced = null; - PsiElement toReplace = null; - for (JetModifierKeywordToken modifierThatCanBeReplaced : modifiersThatCanBeReplaced) { - if (modifierList.hasModifier(modifierThatCanBeReplaced)) { - PsiElement modifierElement = modifierList.getModifierNode(modifierThatCanBeReplaced).getPsi(); - assert modifierElement != null; - if (!replaced && listWithModifier != null) { - toBeReplaced = modifierElement; - toReplace = listWithModifier.getFirstChild(); - //modifierElement.replace(listWithModifier.getFirstChild()); - replaced = true; - } - else { - modifierList.deleteChildInternal(modifierElement.getNode()); - } - } - } - if (toBeReplaced != null && toReplace != null) { - toBeReplaced.replace(toReplace); - } - } - if (!replaced && listWithModifier != null) { - if (toBeginning) { - PsiElement firstChild = modifierList.getFirstChild(); - modifierList.addBefore(listWithModifier.getFirstChild(), firstChild); - modifierList.addBefore(whiteSpace, firstChild); - } - else { - PsiElement lastChild = modifierList.getLastChild(); - modifierList.addAfter(listWithModifier.getFirstChild(), lastChild); - modifierList.addAfter(whiteSpace, lastChild); - } - } - } - } - - @NotNull - /*package*/ static JetModifierListOwner addModifierWithDefaultReplacement(@NotNull PsiElement element, @NotNull JetModifierKeywordToken modifier, @NotNull Project project, boolean toBeginning) { - return addModifier(element, modifier, MODIFIERS_THAT_CAN_BE_REPLACED.get(modifier), project, toBeginning); + element.addModifier(modifier); } @Override @@ -170,7 +90,7 @@ public class AddModifierFix extends JetIntentionAction { public IntentionAction createAction(Diagnostic diagnostic) { JetModifierListOwner modifierListOwner = QuickFixUtil.getParentElementOfType(diagnostic, modifierOwnerClass); if (modifierListOwner == null) return null; - return new AddModifierFix(modifierListOwner, modifier, MODIFIERS_THAT_CAN_BE_REPLACED.get(modifier)); + return new AddModifierFix(modifierListOwner, modifier); } }; } @@ -178,11 +98,4 @@ public class AddModifierFix extends JetIntentionAction { public static JetSingleIntentionActionFactory createFactory(JetModifierKeywordToken modifier) { return createFactory(modifier, JetModifierListOwner.class); } - - private static Map MODIFIERS_THAT_CAN_BE_REPLACED = new HashMap(); - static { - MODIFIERS_THAT_CAN_BE_REPLACED.put(ABSTRACT_KEYWORD, new JetModifierKeywordToken[]{OPEN_KEYWORD, FINAL_KEYWORD}); - MODIFIERS_THAT_CAN_BE_REPLACED.put(OVERRIDE_KEYWORD, new JetModifierKeywordToken[]{OPEN_KEYWORD}); - MODIFIERS_THAT_CAN_BE_REPLACED.put(OPEN_KEYWORD, new JetModifierKeywordToken[]{FINAL_KEYWORD}); - } } diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/AddOpenModifierToClassDeclarationFix.java b/idea/src/org/jetbrains/jet/plugin/quickfix/AddOpenModifierToClassDeclarationFix.java index fda634bbbdb..14de4b178d8 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/AddOpenModifierToClassDeclarationFix.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/AddOpenModifierToClassDeclarationFix.java @@ -78,7 +78,7 @@ public class AddOpenModifierToClassDeclarationFix extends JetIntentionAction { - private static final JetModifierKeywordToken[] MODIFIERS_TO_REPLACE = {PUBLIC_KEYWORD, OPEN_KEYWORD}; - public AddOverrideToEqualsHashCodeToStringFix(@NotNull PsiElement element) { super(element); } @@ -90,10 +85,11 @@ public class AddOverrideToEqualsHashCodeToStringFix extends JetIntentionAction

{ - private final List overriddenNonOverridableMembers = new ArrayList(); + private final List overriddenNonOverridableMembers = new ArrayList(); private final List containingDeclarationsNames = new ArrayList(); public MakeOverriddenMemberOpenFix(@NotNull JetDeclaration declaration) { @@ -68,11 +69,11 @@ public class MakeOverriddenMemberOpenFix extends JetIntentionAction 0; @@ -142,8 +143,8 @@ public class MakeOverriddenMemberOpenFix extends JetIntentionAction { } } } - else + else { parameterList = ((JetClass) element).getPrimaryConstructorParameterList(); + } if (changeInfo.isParameterSetOrOrderChanged()) { String parametersText = changeInfo.getNewParametersSignature(element, isInherited, 0); JetParameterList newParameterList = psiFactory.createParameterList(parametersText); - if (parameterList != null) - parameterList = (JetParameterList) parameterList.replace(newParameterList); + if (parameterList != null) { + parameterList.replace(newParameterList); + } else if (element instanceof JetClass) { PsiElement anchor = ((JetClass) element).getTypeParameterList(); - if (anchor == null) + if (anchor == null) { anchor = ((JetClass) element).getNameIdentifier(); - if (anchor != null) - parameterList = (JetParameterList) element.addAfter(newParameterList, anchor); + } + if (anchor != null) { + element.addAfter(newParameterList, anchor); + } } } else if (parameterList != null) { @@ -93,27 +94,21 @@ public class JetFunctionDefinitionUsage extends JetUsageInfo { } } - if (changeInfo.isVisibilityChanged()) - changeVisibility(changeInfo, element, parameterList); + if (changeInfo.isVisibilityChanged() && !JetPsiUtil.isLocal((JetDeclaration) element)) { + changeVisibility(changeInfo, element); + } return true; } - private void changeVisibility(JetChangeInfo changeInfo, PsiElement element, JetParameterList parameterList) { - JetKeywordToken newVisibilityToken = JetRefactoringUtil.getVisibilityToken(changeInfo.getNewVisibility()); + private static void changeVisibility(JetChangeInfo changeInfo, PsiElement element) { + JetModifierKeywordToken newVisibilityToken = JetRefactoringUtil.getVisibilityToken(changeInfo.getNewVisibility()); - JetPsiFactory psiFactory = JetPsiFactory(getProject()); if (element instanceof JetFunction) { - JetModifierList modifierList = newVisibilityToken == JetTokens.INTERNAL_KEYWORD ? null : - psiFactory.createModifierList(newVisibilityToken); - AddModifierFix.changeModifier(element, ((JetFunction) element).getModifierList(), null, - ChangeVisibilityModifierFix.VISIBILITY_TOKENS, getProject(), true, modifierList); + ((JetFunction)element).addModifier(newVisibilityToken); } else { - JetModifierList modifierList = newVisibilityToken == JetTokens.PUBLIC_KEYWORD ? null : - psiFactory.createConstructorModifierList(newVisibilityToken); - AddModifierFix.changeModifier(element, ((JetClass) element).getPrimaryConstructorModifierList(), parameterList, - ChangeVisibilityModifierFix.VISIBILITY_TOKENS, getProject(), true, modifierList); + ((JetClass)element).addPrimaryConstructorModifier(newVisibilityToken); } } diff --git a/idea/testData/quickfix/abstract/afterAbstractPropertyInNonAbstractClass3.kt b/idea/testData/quickfix/abstract/afterAbstractPropertyInNonAbstractClass3.kt new file mode 100644 index 00000000000..3b0dca4c6ac --- /dev/null +++ b/idea/testData/quickfix/abstract/afterAbstractPropertyInNonAbstractClass3.kt @@ -0,0 +1,4 @@ +// "Make 'A' abstract" "true" +public abstract class A() { + abstract var i : Int +} diff --git a/idea/testData/quickfix/abstract/beforeAbstractPropertyInNonAbstractClass3.kt b/idea/testData/quickfix/abstract/beforeAbstractPropertyInNonAbstractClass3.kt new file mode 100644 index 00000000000..0944fe137dd --- /dev/null +++ b/idea/testData/quickfix/abstract/beforeAbstractPropertyInNonAbstractClass3.kt @@ -0,0 +1,4 @@ +// "Make 'A' abstract" "true" +public class A() { + abstract var i : Int +} diff --git a/idea/testData/quickfix/modifiers/afterOpenMemberInFinalClass3.kt b/idea/testData/quickfix/modifiers/afterOpenMemberInFinalClass3.kt new file mode 100644 index 00000000000..adb248214fd --- /dev/null +++ b/idea/testData/quickfix/modifiers/afterOpenMemberInFinalClass3.kt @@ -0,0 +1,4 @@ +// "Make 'A' open" "true" +public open class A() { + open fun foo() {} +} diff --git a/idea/testData/quickfix/modifiers/afterOpenMemberInFinalClass4.kt b/idea/testData/quickfix/modifiers/afterOpenMemberInFinalClass4.kt new file mode 100644 index 00000000000..330aa997717 --- /dev/null +++ b/idea/testData/quickfix/modifiers/afterOpenMemberInFinalClass4.kt @@ -0,0 +1,4 @@ +// "Make 'A' open" "true" +deprecated("") open class A() { + open fun foo() {} +} diff --git a/idea/testData/quickfix/modifiers/beforeOpenMemberInFinalClass3.kt b/idea/testData/quickfix/modifiers/beforeOpenMemberInFinalClass3.kt new file mode 100644 index 00000000000..aea42c1d0ab --- /dev/null +++ b/idea/testData/quickfix/modifiers/beforeOpenMemberInFinalClass3.kt @@ -0,0 +1,4 @@ +// "Make 'A' open" "true" +public class A() { + open fun foo() {} +} diff --git a/idea/testData/quickfix/modifiers/beforeOpenMemberInFinalClass4.kt b/idea/testData/quickfix/modifiers/beforeOpenMemberInFinalClass4.kt new file mode 100644 index 00000000000..118c9b3858e --- /dev/null +++ b/idea/testData/quickfix/modifiers/beforeOpenMemberInFinalClass4.kt @@ -0,0 +1,4 @@ +// "Make 'A' open" "true" +deprecated("") class A() { + open fun foo() {} +} diff --git a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java index cb5a43c6e9a..054d159200c 100644 --- a/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/quickfix/QuickFixTestGenerated.java @@ -79,6 +79,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("beforeAbstractPropertyInNonAbstractClass3.kt") + public void testAbstractPropertyInNonAbstractClass3() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/abstract/beforeAbstractPropertyInNonAbstractClass3.kt"); + doTest(fileName); + } + @TestMetadata("beforeAbstractPropertyInPrimaryConstructorParameters.kt") public void testAbstractPropertyInPrimaryConstructorParameters() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/abstract/beforeAbstractPropertyInPrimaryConstructorParameters.kt"); @@ -1768,6 +1774,18 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("beforeOpenMemberInFinalClass3.kt") + public void testOpenMemberInFinalClass3() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/beforeOpenMemberInFinalClass3.kt"); + doTest(fileName); + } + + @TestMetadata("beforeOpenMemberInFinalClass4.kt") + public void testOpenMemberInFinalClass4() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/beforeOpenMemberInFinalClass4.kt"); + doTest(fileName); + } + @TestMetadata("beforeOpenModifierInEnum.kt") public void testOpenModifierInEnum() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/beforeOpenModifierInEnum.kt");