[K/N] Prohibit empty ObjCNames

This commit is contained in:
Rick Clephas
2022-09-03 18:56:00 +02:00
committed by SvyatoslavScherbina
parent 0290f09ac2
commit b406722e20
11 changed files with 64 additions and 24 deletions
@@ -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")
@@ -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>()
@@ -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)
@@ -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 =