FIR(前端 IR)是 Kotlin 编译器前端使用的现代中间表示。它充当 PSI(程序结构接口)树生成和编译器后端 IR 阶段之间的桥梁。FIR 提供了一个结构化且类型化的 Kotlin 代码表示,能够进行高级分析、强大的诊断和各种优化。
FIR 被设计为一个模块化系统,包含多个阶段,这些阶段逐步丰富和解析代码表示。
来源
由 FirDeclarationsResolveTransformer 实现的声明解析阶段处理 Kotlin 代码中的所有声明。
该转换器处理
声明解析过程解析
来源
FirExpressionsResolveTransformer 处理表达式解析。
此转换器解析
来源
调用解析是一个复杂的过程,由 FirCallResolver 实现。
调用解析过程
来源
类型推断在整个解析过程中是集成的,但在以下方面尤其重要:
类型推断系统组件包括:
FirCallCompleter:管理整体类型推断过程PostponedArgumentsAnalyzer:处理推迟的参数,如 lambdaConstraintSystemCompleter:完成约束系统FirPCLAInferenceSession:管理推迟的可调用和 Lambda 参数来源
FIR 解析系统使用几个重要概念:
解析原子(ConeResolutionAtom):表示需要解析的实体(表达式、Lambda、可调用引用)
候选(Candidate):表示调用的潜在函数或属性匹配,包含
来源
调用解析的最后阶段涉及使用解析的类型信息来完成调用。
FirCallCompletionResultsWriterTransformer 负责将调用解析的结果写回 FIR 树。
来源
FIR 拥有广泛的测试基础设施以确保正确性。
测试系统包括:
来源
FIR 位于 Kotlin 编译器管道中的 PSI 生成和中间件 IR 之间。
FIR 与 K1(遗留前端)并行工作,但提供了更现代的前端处理方法,具有更好的性能、增量编译支持和改进的诊断。
来源
FIR(前端 IR)是 Kotlin 编译器的一个关键组件,它在源代码表示和中间件 IR 之间架起了桥梁。通过一系列转换阶段,它解析声明、表达式和类型,提供 Kotlin 代码的完全类型化表示,从而实现精确的诊断和高效的代码生成。