如何让Kotlin对含Windows危险字符的函数名触发编译失败?
针对Windows危险字符函数名的编译错误定制方案
方案1:通过Kotlin编译参数定向转警告为错误
Kotlin编译器支持通过-Xwarnings-as-errors参数指定单个警告ID转为错误,你需要的目标警告ID是WIN_INCORRECT_JVM_NAME(对应FirJvmNamesChecker生成的Windows危险字符警告)。可以针对生产、测试代码分别配置规则:
Gradle Kotlin DSL配置示例
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach { kotlinOptions { // 生产代码:强制该警告为错误 if (name.contains("main", ignoreCase = true)) { freeCompilerArgs += "-Xwarnings-as-errors=WIN_INCORRECT_JVM_NAME" } // 测试代码:按需设置,这里示例为转为错误,若仅需警告则删除此行 if (name.contains("test", ignoreCase = true)) { freeCompilerArgs += "-Xwarnings-as-errors=WIN_INCORRECT_JVM_NAME" } } }
Gradle Groovy DSL配置示例
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { kotlinOptions { if (name.toLowerCase().contains('main')) { freeCompilerArgs += '-Xwarnings-as-errors=WIN_INCORRECT_JVM_NAME' } if (name.toLowerCase().contains('test')) { // 测试代码按需调整,此行是转为错误,不需要则删除 freeCompilerArgs += '-Xwarnings-as-errors=WIN_INCORRECT_JVM_NAME' } } }
方案2:自定义Detekt规则实现更灵活控制
如果需要更精细化的规则(比如通过注解识别测试函数),可以自定义Detekt规则,专门检查函数名中的Windows危险字符(如"、:、*、?、<、>、|),并区分生产/测试代码设置不同级别:
自定义规则核心代码示例
class WindowsInvalidCharFunctionNamingRule : Rule() { override val issue = Issue( id = "WindowsInvalidCharFunctionNaming", severity = Severity.Error, description = "函数名包含Windows系统禁止的危险字符", debt = Debt.FIVE_MINS ) private val windowsInvalidChars = setOf('"', ':', '*', '?', '<', '>', '|') override fun visitFunction(function: KtFunction) { super.visitFunction(function) val functionName = function.nameAsSafeName.asString() // 通过@Test注解判断是否为测试函数 val isTestFunction = function.annotationEntries.any { it.shortName?.asString() == "Test" } if (windowsInvalidChars.any { it in functionName }) { // 生产代码报错,测试代码可设为警告 val level = if (isTestFunction) Severity.Warning else Severity.Error report( CodeSmell( issue.copy(severity = level), Entity.from(function), "函数名包含Windows危险字符: $functionName" ) ) } } }
配置完成后,生产代码中含危险字符的函数会直接编译失败,测试代码可根据配置选择报错或仅警告。
内容的提问来源于stack exchange,提问作者Alan Smithee
相关产品推荐
相关产品推荐

