Expect/actual: introduce DEPRECATED_MODIFIER instead of ..._FOR_TARGET

This commit is contained in:
Mikhail Glukhikh
2017-09-18 11:29:28 +03:00
committed by Mikhail Glukhikh
parent 721889600f
commit 9b0f15137f
7 changed files with 37 additions and 41 deletions
@@ -199,6 +199,7 @@ public interface Errors {
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, KtModifierKeywordToken> REDUNDANT_MODIFIER = DiagnosticFactory2.create(WARNING);
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, String> WRONG_MODIFIER_TARGET = DiagnosticFactory2.create(ERROR);
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, String> DEPRECATED_MODIFIER_FOR_TARGET = DiagnosticFactory2.create(WARNING);
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, KtModifierKeywordToken> DEPRECATED_MODIFIER = DiagnosticFactory2.create(WARNING);
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, String> REDUNDANT_MODIFIER_FOR_TARGET = DiagnosticFactory2.create(WARNING);
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, String> WRONG_MODIFIER_CONTAINING_DECLARATION = DiagnosticFactory2.create(ERROR);
DiagnosticFactory2<PsiElement, KtModifierKeywordToken, String> DEPRECATED_MODIFIER_CONTAINING_DECLARATION = DiagnosticFactory2.create(WARNING);
@@ -142,6 +142,7 @@ public class DefaultErrorMessages {
MAP.put(REPEATED_MODIFIER, "Repeated ''{0}''", TO_STRING);
MAP.put(WRONG_MODIFIER_TARGET, "Modifier ''{0}'' is not applicable to ''{1}''", TO_STRING, TO_STRING);
MAP.put(DEPRECATED_MODIFIER_FOR_TARGET, "Modifier ''{0}'' is deprecated for ''{1}''", TO_STRING, TO_STRING);
MAP.put(DEPRECATED_MODIFIER, "Modifier ''{0}'' is deprecated, use ''{1}'' instead", TO_STRING, TO_STRING);
MAP.put(REDUNDANT_MODIFIER_FOR_TARGET, "Modifier ''{0}'' is redundant for ''{1}''", TO_STRING, TO_STRING);
MAP.put(WRONG_MODIFIER_CONTAINING_DECLARATION, "Modifier ''{0}'' is not applicable inside ''{1}''", TO_STRING, TO_STRING);
MAP.put(DEPRECATED_MODIFIER_CONTAINING_DECLARATION, "Modifier ''{0}'' is deprecated inside ''{1}''", TO_STRING, TO_STRING);
@@ -109,9 +109,11 @@ object ModifierCheckerCore {
)
// NOTE: deprecated targets must be possible!
private val deprecatedTargetMap = mapOf<KtModifierKeywordToken, Set<KotlinTarget>>(
HEADER_KEYWORD to EnumSet.of(TOP_LEVEL_FUNCTION, TOP_LEVEL_PROPERTY_WITHOUT_FIELD_OR_DELEGATE, CLASS_ONLY, OBJECT, INTERFACE, ENUM_CLASS, ANNOTATION_CLASS),
IMPL_KEYWORD to EnumSet.of(TOP_LEVEL_FUNCTION, MEMBER_FUNCTION, TOP_LEVEL_PROPERTY, MEMBER_PROPERTY, CONSTRUCTOR, CLASS_ONLY, OBJECT, INTERFACE, ENUM_CLASS, ANNOTATION_CLASS, TYPEALIAS)
private val deprecatedTargetMap = mapOf<KtModifierKeywordToken, Set<KotlinTarget>>()
private val deprecatedModifierMap = mapOf(
HEADER_KEYWORD to EXPECT_KEYWORD,
IMPL_KEYWORD to ACTUAL_KEYWORD
)
// NOTE: redundant targets must be possible!
@@ -279,13 +281,16 @@ object ModifierCheckerCore {
trace.report(Errors.WRONG_MODIFIER_TARGET.on(node.psi, modifier, actualTargets.firstOrNull()?.description ?: "this"))
return false
}
val deprecatedModifierReplacement = deprecatedModifierMap[modifier]
val deprecatedTargets = deprecatedTargetMap[modifier] ?: emptySet()
val redundantTargets = redundantTargetMap[modifier] ?: emptySet()
if (actualTargets.any { it in deprecatedTargets }) {
trace.report(Errors.DEPRECATED_MODIFIER_FOR_TARGET.on(node.psi, modifier, actualTargets.firstOrNull()?.description ?: "this"))
}
else if (actualTargets.any { it in redundantTargets }) {
trace.report(Errors.REDUNDANT_MODIFIER_FOR_TARGET.on(node.psi, modifier, actualTargets.firstOrNull()?.description ?: "this"))
when {
deprecatedModifierReplacement != null ->
trace.report(Errors.DEPRECATED_MODIFIER.on(node.psi, modifier, deprecatedModifierReplacement))
actualTargets.any { it in deprecatedTargets } ->
trace.report(Errors.DEPRECATED_MODIFIER_FOR_TARGET.on(node.psi, modifier, actualTargets.firstOrNull()?.description ?: "this"))
actualTargets.any { it in redundantTargets } ->
trace.report(Errors.REDUNDANT_MODIFIER_FOR_TARGET.on(node.psi, modifier, actualTargets.firstOrNull()?.description ?: "this"))
}
return true
}
@@ -2,29 +2,29 @@
// MODULE: m1-common
// FILE: common.kt
<!DEPRECATED_MODIFIER_FOR_TARGET, JVM:DEPRECATED_MODIFIER_FOR_TARGET!>header<!> class My
<!DEPRECATED_MODIFIER, JVM:DEPRECATED_MODIFIER!>header<!> class My
<!DEPRECATED_MODIFIER_FOR_TARGET, JVM:DEPRECATED_MODIFIER_FOR_TARGET!>header<!> fun foo(): Int
<!DEPRECATED_MODIFIER, JVM:DEPRECATED_MODIFIER!>header<!> fun foo(): Int
<!DEPRECATED_MODIFIER_FOR_TARGET, JVM:DEPRECATED_MODIFIER_FOR_TARGET!>header<!> val x: String
<!DEPRECATED_MODIFIER, JVM:DEPRECATED_MODIFIER!>header<!> val x: String
<!DEPRECATED_MODIFIER_FOR_TARGET, JVM:DEPRECATED_MODIFIER_FOR_TARGET!>header<!> object O
<!DEPRECATED_MODIFIER, JVM:DEPRECATED_MODIFIER!>header<!> object O
<!DEPRECATED_MODIFIER_FOR_TARGET, JVM:DEPRECATED_MODIFIER_FOR_TARGET!>header<!> enum class E {
<!DEPRECATED_MODIFIER, JVM:DEPRECATED_MODIFIER!>header<!> enum class E {
FIRST
}
// MODULE: m2-jvm(m1-common)
// FILE: jvm.kt
<!DEPRECATED_MODIFIER_FOR_TARGET!>impl<!> class My
<!DEPRECATED_MODIFIER!>impl<!> class My
<!DEPRECATED_MODIFIER_FOR_TARGET!>impl<!> fun foo() = 42
<!DEPRECATED_MODIFIER!>impl<!> fun foo() = 42
<!DEPRECATED_MODIFIER_FOR_TARGET!>impl<!> val x get() = "Hello"
<!DEPRECATED_MODIFIER!>impl<!> val x get() = "Hello"
<!DEPRECATED_MODIFIER_FOR_TARGET!>impl<!> object O
<!DEPRECATED_MODIFIER!>impl<!> object O
<!DEPRECATED_MODIFIER_FOR_TARGET!>impl<!> enum class E {
<!DEPRECATED_MODIFIER!>impl<!> enum class E {
FIRST
}
@@ -1,13 +1,13 @@
// !LANGUAGE: +MultiPlatformProjects
<!DEPRECATED_MODIFIER_FOR_TARGET, INCOMPATIBLE_MODIFIERS!>header<!> <!INCOMPATIBLE_MODIFIERS!>impl<!> class <!NO_ACTUAL_FOR_EXPECT!>First<!>
<!DEPRECATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>header<!> <!INCOMPATIBLE_MODIFIERS!>impl<!> class <!NO_ACTUAL_FOR_EXPECT!>First<!>
<!DEPRECATED_MODIFIER_FOR_TARGET, INCOMPATIBLE_MODIFIERS!>header<!> <!INCOMPATIBLE_MODIFIERS!>expect<!> class <!NO_ACTUAL_FOR_EXPECT!>Second<!>
<!DEPRECATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>header<!> <!INCOMPATIBLE_MODIFIERS!>expect<!> class <!NO_ACTUAL_FOR_EXPECT!>Second<!>
<!DEPRECATED_MODIFIER_FOR_TARGET, INCOMPATIBLE_MODIFIERS!>header<!> <!INCOMPATIBLE_MODIFIERS!>actual<!> class <!NO_ACTUAL_FOR_EXPECT!>Third<!>
<!DEPRECATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>header<!> <!INCOMPATIBLE_MODIFIERS!>actual<!> class <!NO_ACTUAL_FOR_EXPECT!>Third<!>
<!DEPRECATED_MODIFIER_FOR_TARGET, INCOMPATIBLE_MODIFIERS!>impl<!> <!INCOMPATIBLE_MODIFIERS!>expect<!> class <!NO_ACTUAL_FOR_EXPECT!>Fourth<!>
<!DEPRECATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>impl<!> <!INCOMPATIBLE_MODIFIERS!>expect<!> class <!NO_ACTUAL_FOR_EXPECT!>Fourth<!>
<!DEPRECATED_MODIFIER_FOR_TARGET, INCOMPATIBLE_MODIFIERS!>impl<!> <!INCOMPATIBLE_MODIFIERS!>actual<!> class <!ACTUAL_WITHOUT_EXPECT!>Fifth<!>
<!DEPRECATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>impl<!> <!INCOMPATIBLE_MODIFIERS!>actual<!> class <!ACTUAL_WITHOUT_EXPECT!>Fifth<!>
<!INCOMPATIBLE_MODIFIERS!>expect<!> <!INCOMPATIBLE_MODIFIERS!>actual<!> class <!NO_ACTUAL_FOR_EXPECT!>Sixth<!>