Modifiers checks were moved to DeclarationsChecker; added 'open' modifier checks
This commit is contained in:
@@ -19,27 +19,16 @@ import org.jetbrains.jet.lexer.JetTokens;
|
||||
*/
|
||||
public class AddModifierFix extends ModifierFix {
|
||||
private final JetToken[] modifiersThanCanBeReplaced;
|
||||
private final JetToken[] conflictedModifiers;
|
||||
|
||||
private AddModifierFix(@NotNull JetModifierListOwner element, JetKeywordToken modifier, JetToken[] modifiersThanCanBeReplaced, JetToken[] conflictedModifiers) {
|
||||
private AddModifierFix(@NotNull JetModifierListOwner element, JetKeywordToken modifier, JetToken[] modifiersThanCanBeReplaced) {
|
||||
super(element, modifier);
|
||||
this.modifiersThanCanBeReplaced = modifiersThanCanBeReplaced;
|
||||
this.conflictedModifiers = conflictedModifiers;
|
||||
}
|
||||
|
||||
private static boolean checkConflictModifiers(JetModifierListOwner element, JetToken[] conflictedModifiers) {
|
||||
for (JetToken conflictedModifier : conflictedModifiers) {
|
||||
if (element.hasModifier(conflictedModifier)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String getText() {
|
||||
if (modifier == JetTokens.ABSTRACT_KEYWORD) {
|
||||
if (modifier == JetTokens.ABSTRACT_KEYWORD || modifier == JetTokens.OPEN_KEYWORD) {
|
||||
return "Make " + getElementName() + " " + modifier.getValue();
|
||||
}
|
||||
return "Add '" + modifier.getValue() + "' modifier";
|
||||
@@ -53,7 +42,7 @@ public class AddModifierFix extends ModifierFix {
|
||||
|
||||
@Override
|
||||
public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
|
||||
return element.isValid() && !checkConflictModifiers(element, conflictedModifiers);
|
||||
return element.isValid();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -97,17 +86,17 @@ public class AddModifierFix extends ModifierFix {
|
||||
return true;
|
||||
}
|
||||
|
||||
public static JetIntentionActionFactory<JetModifierListOwner> createFactory(final JetKeywordToken modifier, final JetToken[] modifiersThatCanBeReplaced, final JetToken[] conflictedModifiers) {
|
||||
public static JetIntentionActionFactory<JetModifierListOwner> createFactory(final JetKeywordToken modifier, final JetToken[] modifiersThatCanBeReplaced) {
|
||||
return new JetIntentionActionFactory<JetModifierListOwner>() {
|
||||
@Override
|
||||
public JetIntentionAction<JetModifierListOwner> createAction(DiagnosticWithPsiElement diagnostic) {
|
||||
assert diagnostic.getPsiElement() instanceof JetModifierListOwner;
|
||||
return new AddModifierFix((JetModifierListOwner) diagnostic.getPsiElement(), modifier, modifiersThatCanBeReplaced, conflictedModifiers);
|
||||
return new AddModifierFix((JetModifierListOwner) diagnostic.getPsiElement(), modifier, modifiersThatCanBeReplaced);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public static JetIntentionActionFactory<JetModifierListOwner> createFactory(final JetKeywordToken modifier) {
|
||||
return createFactory(modifier, new JetToken[0], new JetToken[0]);
|
||||
return createFactory(modifier, new JetToken[0]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ public class QuickFixes {
|
||||
|
||||
static {
|
||||
JetIntentionActionFactory<JetModifierListOwner> removeAbstractModifierFactory = RemoveModifierFix.createFactory(JetTokens.ABSTRACT_KEYWORD);
|
||||
JetIntentionActionFactory<JetModifierListOwner> addAbstractModifierFactory = AddModifierFix.createFactory(JetTokens.ABSTRACT_KEYWORD, new JetToken[]{JetTokens.OPEN_KEYWORD}, new JetToken[] {JetTokens.FINAL_KEYWORD});
|
||||
JetIntentionActionFactory<JetModifierListOwner> addAbstractModifierFactory = AddModifierFix.createFactory(JetTokens.ABSTRACT_KEYWORD, new JetToken[]{JetTokens.OPEN_KEYWORD, JetTokens.FINAL_KEYWORD});
|
||||
|
||||
add(Errors.ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, removeAbstractModifierFactory);
|
||||
add(Errors.ABSTRACT_PROPERTY_NOT_IN_CLASS, removeAbstractModifierFactory);
|
||||
@@ -84,14 +84,24 @@ public class QuickFixes {
|
||||
add(Errors.USELESS_ELVIS, RemoveRightPartOfBinaryExpressionFix.createRemoveElvisOperatorFactory());
|
||||
|
||||
add(Errors.UNNECESSARY_SAFE_CALL, ReplaceSafeCallToDotCall.createFactory());
|
||||
|
||||
add(Errors.REDUNDANT_MODIFIER, RemoveRedundantModifierFix.createFactory());
|
||||
|
||||
JetIntentionActionFactory<JetModifierList> removeRedundantModifierFactory = RemoveRedundantModifierFix.createFactory();
|
||||
add(Errors.REDUNDANT_MODIFIER, removeRedundantModifierFactory);
|
||||
add(Errors.REDUNDANT_MODIFIER_IN_TRAIT, removeRedundantModifierFactory);
|
||||
add(Errors.TRAIT_CAN_NOT_BE_FINAL, RemoveModifierFix.createFactory(JetTokens.FINAL_KEYWORD));
|
||||
|
||||
add(Errors.PROPERTY_INITIALIZER_NO_PRIMARY_CONSTRUCTOR, RemovePartsFromPropertyFix.createRemoveInitializerFactory());
|
||||
|
||||
JetIntentionActionFactory<JetClass> addPrimaryConstructorFactory = AddPrimaryConstructorFix.createFactory();
|
||||
add(Errors.PROPERTY_INITIALIZER_NO_PRIMARY_CONSTRUCTOR, QuickFixUtil.createFactoryRedirectingAdditionalInfoToAnotherFactory(addPrimaryConstructorFactory, DiagnosticParameters.CLASS));
|
||||
add(Errors.PRIMARY_CONSTRUCTOR_MISSING_STATEFUL_PROPERTY, addPrimaryConstructorFactory);
|
||||
|
||||
JetIntentionActionFactory<JetModifierListOwner> addOpenModifierFactory = AddModifierFix.createFactory(JetTokens.OPEN_KEYWORD, new JetToken[]{JetTokens.FINAL_KEYWORD});
|
||||
JetIntentionActionFactory<JetModifierListOwner> removeOpenModifierFactory = RemoveModifierFix.createFactory(JetTokens.OPEN_KEYWORD);
|
||||
add(Errors.NON_FINAL_MEMBER_IN_FINAL_CLASS, QuickFixUtil.createFactoryRedirectingAdditionalInfoToAnotherFactory(addOpenModifierFactory, DiagnosticParameters.CLASS));
|
||||
add(Errors.NON_FINAL_MEMBER_IN_FINAL_CLASS, removeOpenModifierFactory);
|
||||
add(Errors.NON_FINAL_ACCESSOR_OF_FINAL_PROPERTY, QuickFixUtil.createFactoryRedirectingAdditionalInfoToAnotherFactory(addOpenModifierFactory, DiagnosticParameters.PROPERTY));
|
||||
add(Errors.NON_FINAL_ACCESSOR_OF_FINAL_PROPERTY, removeOpenModifierFactory);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ public class RemoveModifierFix extends ModifierFix {
|
||||
@NotNull
|
||||
@Override
|
||||
public String getText() {
|
||||
if (modifier == JetTokens.ABSTRACT_KEYWORD) {
|
||||
if (modifier == JetTokens.ABSTRACT_KEYWORD || modifier == JetTokens.OPEN_KEYWORD) {
|
||||
return "Make " + getElementName() + " not " + modifier.getValue();
|
||||
}
|
||||
return "Remove '" + modifier.getValue() + "' modifier";
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
open trait A {
|
||||
trait A {
|
||||
fun foo() {}
|
||||
}
|
||||
open trait B : A, <error>E</error> {}
|
||||
open trait C : B {}
|
||||
open trait D : <error>B</error> {}
|
||||
open trait E : <error>F</error> {}
|
||||
open trait F : <error>D</error>, C {}
|
||||
open trait G : F {}
|
||||
open trait H : F {}
|
||||
trait B : A, <error>E</error> {}
|
||||
trait C : B {}
|
||||
trait D : <error>B</error> {}
|
||||
trait E : <error>F</error> {}
|
||||
trait F : <error>D</error>, C {}
|
||||
trait G : F {}
|
||||
trait H : F {}
|
||||
|
||||
val a : A? = null
|
||||
val b : B? = null
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
open trait A {
|
||||
trait A {
|
||||
fun foo() {}
|
||||
}
|
||||
open trait B : A, <!CYCLIC_INHERITANCE_HIERARCHY!>E<!> {}
|
||||
open trait C : B {}
|
||||
open trait D : <!CYCLIC_INHERITANCE_HIERARCHY!>B<!> {}
|
||||
open trait E : <!CYCLIC_INHERITANCE_HIERARCHY!>F<!> {}
|
||||
open trait F : <!CYCLIC_INHERITANCE_HIERARCHY!>D<!>, C {}
|
||||
open trait G : F {}
|
||||
open trait H : F {}
|
||||
trait B : A, <!CYCLIC_INHERITANCE_HIERARCHY!>E<!> {}
|
||||
trait C : B {}
|
||||
trait D : <!CYCLIC_INHERITANCE_HIERARCHY!>B<!> {}
|
||||
trait E : <!CYCLIC_INHERITANCE_HIERARCHY!>F<!> {}
|
||||
trait F : <!CYCLIC_INHERITANCE_HIERARCHY!>D<!>, C {}
|
||||
trait G : F {}
|
||||
trait H : F {}
|
||||
|
||||
val a : A? = null
|
||||
val b : B? = null
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace a
|
||||
|
||||
abstract class A() {
|
||||
<!INCOMPATIBLE_MODIFIERS!>abstract<!> <!INCOMPATIBLE_MODIFIERS!>final<!> fun f()
|
||||
abstract <!REDUNDANT_MODIFIER!>open<!> fun g()
|
||||
<!INCOMPATIBLE_MODIFIERS!>final<!> <!INCOMPATIBLE_MODIFIERS!>open<!> fun h() {}
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
// "Make 'foo' abstract" "false"
|
||||
class B() {
|
||||
final fun <caret>foo()
|
||||
}
|
||||
@@ -4,5 +4,5 @@ abstract class B() {
|
||||
}
|
||||
|
||||
abstract class A() : B() {
|
||||
<caret>abstract override fun foo()
|
||||
abstract <caret>override fun foo()
|
||||
}
|
||||
|
||||
@@ -4,5 +4,5 @@ abstract class B() {
|
||||
}
|
||||
|
||||
abstract class A() : B() {
|
||||
<caret>abstract override fun foo()
|
||||
abstract override<caret> fun foo()
|
||||
}
|
||||
|
||||
@@ -4,5 +4,5 @@ abstract class B() {
|
||||
}
|
||||
|
||||
abstract class A() : B() {
|
||||
<caret>abstract open override fun foo()
|
||||
abstract <caret>open override fun foo()
|
||||
}
|
||||
|
||||
@@ -4,5 +4,5 @@ abstract class B() {
|
||||
}
|
||||
|
||||
abstract class A() : B() {
|
||||
<caret>abstract override open fun foo()
|
||||
abstract override <caret>open fun foo()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user