[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
@@ -46,6 +46,7 @@ private val DIAGNOSTIC_FACTORY_TO_RENDERER by lazy {
ErrorsNative.INVALID_OBJC_NAME_FIRST_CHAR, "@ObjCName contains illegal first characters: {0}",
CommonRenderers.STRING
)
put(ErrorsNative.EMPTY_OBJC_NAME, "Empty @ObjCName names aren't supported")
put(
ErrorsNative.INCOMPATIBLE_OBJC_NAME_OVERRIDE, "Member \"{0}\" inherits inconsistent @ObjCName from {1}",
Renderers.NAME,
@@ -45,6 +45,8 @@ object ErrorsNative {
@JvmField
val INVALID_OBJC_NAME_FIRST_CHAR = DiagnosticFactory1.create<KtElement, String>(Severity.ERROR)
@JvmField
val EMPTY_OBJC_NAME = DiagnosticFactory0.create<KtElement>(Severity.ERROR)
@JvmField
val INCOMPATIBLE_OBJC_NAME_OVERRIDE = DiagnosticFactory2.create<KtElement, DeclarationDescriptor, Collection<DeclarationDescriptor>>(Severity.ERROR)
@JvmField
val INAPPLICABLE_EXACT_OBJC_NAME = DiagnosticFactory0.create<KtElement>(Severity.ERROR)
@@ -64,6 +64,9 @@ object NativeObjCNameChecker : DeclarationChecker {
if (objCName.name == null && objCName.swiftName == null) {
context.trace.report(ErrorsNative.INVALID_OBJC_NAME.on(reportLocation))
}
if (objCName.name?.isEmpty() == true || objCName.swiftName?.isEmpty() == true) {
context.trace.report(ErrorsNative.EMPTY_OBJC_NAME.on(reportLocation))
}
val invalidNameFirstChar = objCName.name?.firstOrNull()?.takeUnless(validFirstChars::contains)
val invalidSwiftNameFirstChar = objCName.swiftName?.firstOrNull()?.takeUnless(validFirstChars::contains)
val invalidFirstChars = setOfNotNull(invalidNameFirstChar, invalidSwiftNameFirstChar)
@@ -87,8 +90,8 @@ object NativeObjCNameChecker : DeclarationChecker {
class ObjCName(
val annotation: AnnotationDescriptor
) {
val name: String? = annotation.argumentValue("name")?.value?.safeAs<String>()?.takeIf { it.isNotBlank() }
val swiftName: String? = annotation.argumentValue("swiftName")?.value?.safeAs<String>()?.takeIf { it.isNotBlank() }
val name: String? = annotation.argumentValue("name")?.value?.safeAs<String>()
val swiftName: String? = annotation.argumentValue("swiftName")?.value?.safeAs<String>()
val exact: Boolean = annotation.argumentValue("exact")?.value?.safeAs<Boolean>() ?: false
override fun equals(other: Any?): Boolean =