[K/N] Prohibit empty ObjCNames
This commit is contained in:
committed by
SvyatoslavScherbina
parent
0290f09ac2
commit
b406722e20
+1
@@ -55,6 +55,7 @@ object NATIVE_DIAGNOSTICS_LIST : DiagnosticList("FirNativeErrors") {
|
||||
val INVALID_OBJC_NAME_FIRST_CHAR by error<KtElement> {
|
||||
parameter<String>("characters")
|
||||
}
|
||||
val EMPTY_OBJC_NAME by error<KtElement>()
|
||||
val INCOMPATIBLE_OBJC_NAME_OVERRIDE by error<KtElement> {
|
||||
parameter<FirBasedSymbol<*>>("declaration")
|
||||
parameter<Collection<FirRegularClassSymbol>>("containingClasses")
|
||||
|
||||
+1
@@ -40,6 +40,7 @@ object FirNativeErrors {
|
||||
val INVALID_OBJC_NAME by error0<KtElement>()
|
||||
val INVALID_OBJC_NAME_CHARS by error1<KtElement, String>()
|
||||
val INVALID_OBJC_NAME_FIRST_CHAR by error1<KtElement, String>()
|
||||
val EMPTY_OBJC_NAME by error0<KtElement>()
|
||||
val INCOMPATIBLE_OBJC_NAME_OVERRIDE by error2<KtElement, FirBasedSymbol<*>, Collection<FirRegularClassSymbol>>()
|
||||
val INAPPLICABLE_EXACT_OBJC_NAME by error0<KtElement>()
|
||||
val MISSING_EXACT_OBJC_NAME by error0<KtElement>()
|
||||
|
||||
+2
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.diagnostics.rendering.BaseDiagnosticRendererFactory
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.SYMBOL
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.SYMBOLS
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.checkMissingMessages
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.native.FirNativeErrors.EMPTY_OBJC_NAME
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.native.FirNativeErrors.INAPPLICABLE_EXACT_OBJC_NAME
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.native.FirNativeErrors.INAPPLICABLE_OBJC_NAME
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.native.FirNativeErrors.INAPPLICABLE_SHARED_IMMUTABLE_PROPERTY
|
||||
@@ -65,6 +66,7 @@ object FirNativeErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
|
||||
)
|
||||
map.put(INAPPLICABLE_OBJC_NAME, "@ObjCName is not applicable on overrides")
|
||||
map.put(INVALID_OBJC_NAME, "@ObjCName should have a name and/or swiftName")
|
||||
map.put(EMPTY_OBJC_NAME, "Empty @ObjCName names aren't supported")
|
||||
map.put(INVALID_OBJC_NAME_CHARS, "@ObjCName contains illegal characters: {0}", TO_STRING)
|
||||
map.put(INVALID_OBJC_NAME_FIRST_CHAR, "@ObjCName contains illegal first characters: {0}", TO_STRING)
|
||||
map.put(INCOMPATIBLE_OBJC_NAME_OVERRIDE, "Member \"{0}\" inherits inconsistent @ObjCName from {1}", SYMBOL, SYMBOLS)
|
||||
|
||||
+6
-2
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.FirAnnotationContainer
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclarationChecker
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.native.FirNativeErrors.EMPTY_OBJC_NAME
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.native.FirNativeErrors.INAPPLICABLE_EXACT_OBJC_NAME
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.native.FirNativeErrors.INAPPLICABLE_OBJC_NAME
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.native.FirNativeErrors.INVALID_OBJC_NAME
|
||||
@@ -79,6 +80,9 @@ object FirNativeObjCNameChecker : FirBasicDeclarationChecker() {
|
||||
if (invalidFirstChars.isNotEmpty()) {
|
||||
reporter.reportOn(annotationSource, INVALID_OBJC_NAME_FIRST_CHAR, invalidFirstChars.joinToString(""), context)
|
||||
}
|
||||
if (objCName.name?.isEmpty() == true || objCName.swiftName?.isEmpty() == true) {
|
||||
reporter.reportOn(annotationSource, EMPTY_OBJC_NAME, context)
|
||||
}
|
||||
val invalidNameChars = objCName.name?.toSet()?.subtract(validChars) ?: emptySet()
|
||||
val invalidSwiftNameChars = objCName.swiftName?.toSet()?.subtract(validChars) ?: emptySet()
|
||||
val invalidChars = invalidNameChars + invalidSwiftNameChars
|
||||
@@ -96,8 +100,8 @@ object FirNativeObjCNameChecker : FirBasicDeclarationChecker() {
|
||||
class ObjCName(
|
||||
val annotation: FirAnnotation
|
||||
) {
|
||||
val name: String? = annotation.getStringArgument(nameName)?.takeIf { it.isNotBlank() }
|
||||
val swiftName: String? = annotation.getStringArgument(swiftNameName)?.takeIf { it.isNotBlank() }
|
||||
val name: String? = annotation.getStringArgument(nameName)
|
||||
val swiftName: String? = annotation.getStringArgument(swiftNameName)
|
||||
val exact: Boolean = annotation.getBooleanArgument(exactName) ?: false
|
||||
|
||||
override fun equals(other: Any?): Boolean =
|
||||
|
||||
Reference in New Issue
Block a user