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

K1转K2 Kotlin编译器插件迁移:核心API替代方案咨询

K1到K2 Kotlin编译器插件迁移:核心API替代方案

一、analysisCompleted方法的替代实现

在K2编译器插件体系中,需继承K2AnalysisHandlerExtension而非原K1的AnalysisHandlerExtension,并重写其新签名的analysisCompleted方法。该方法以ModuleAnalysisSession作为核心分析入口,适配K2的分析流程。

代码示例:

class K2PluginExtension : K2AnalysisHandlerExtension() {
    override fun analysisCompleted(
        project: Project,
        module: ModuleDescriptor,
        analysisSession: ModuleAnalysisSession,
        files: Collection<KtFile>,
        bindingTrace: BindingTrace,
        filesBeingCompiled: Collection<KtFile>
    ): AnalysisResult? {
        // 业务逻辑实现区域
        return super.analysisCompleted(project, module, analysisSession, files, bindingTrace, filesBeingCompiled)
    }
}

二、bindingContext.getSliceContents(BindingContext.TYPE)的替代方案

K2中BindingContext的API进行了调整,原getSliceContents方法可直接替换为getAll方法获取指定切片的全部内容。若业务需操作类型符号而非类型实例,还可通过ModuleAnalysisSession的符号提供者筛选目标符号。

方式1:直接获取BindingContext中所有TYPE切片实例

完全对应K1中获取类型实例的逻辑:

bindingTrace.bindingContext.getAll(BindingContext.TYPE).forEach { type ->
    record(type)
}

方式2:通过分析会话获取所有类型符号(按需选择)

若需要处理类、类型别名等类型符号,可通过符号提供者精准筛选:

// 获取所有类符号并提取对应类型
analysisSession.symbolProvider.getAllSymbols().filterIsInstance<ClassSymbol>().forEach { classSymbol ->
    val defaultType = classSymbol.defaultType()
    record(defaultType)
}

// 获取所有类型别名符号并提取展开后的类型
analysisSession.symbolProvider.getAllSymbols().filterIsInstance<TypeAliasSymbol>().forEach { aliasSymbol ->
    val expandedType = aliasSymbol.expandedType
    record(expandedType)
}

额外注意事项

  • 确保插件依赖的编译器API切换为K2版本,避免混用K1的API导致兼容性问题。
  • K2的BindingContext切片Key与K1存在差异,涉及其他切片时需核对K2官方API定义。
  • 增量编译场景下,可利用analysisSession.getChangedSymbols()等方法优化性能,减少对未变更类型的重复处理。

内容的提问来源于stack exchange,提问作者Sergei Rybalkin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 19:43:08