You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:13:20