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
相关产品推荐
相关产品推荐

