TypePHP 编译器 https://swoole.com/aot/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

2.5 KiB

AST 转换(Lowering)

doConvert() 遍历 AST 时,src/Transform/Visitor.php 作为 NodeVisitor 挂载在遍历链上,对节点做编译期改写(lowering)——把 PHP 8.x 的高层语法(属性钩子、构造函数提升、getter、编译期属性等)降级为编译器能直接翻译的普通结构。

Sources: src/Transform/Visitor.php · src/Translator.php

两个遍历钩子

Visitor 实现 enterNode()leaveNode() 两阶段处理:

  • enterNode(进入节点前):校验 + 即时 lowering。依次调用 CompileTimeAttribute::validateNodeFunctionAttributeLowering::lowerGetterLowering::validateTargetPropertyMethodLowering::validateTargetConstructorLowering::validateTarget
  • leaveNode(离开节点后):对函数/闭包做 ParameterValidationLowering;对类/属性做 PropertyHookLoweringGetterLoweringPropertyMethodLowering,把钩子属性、getter、提升属性改写成方法或标记。

Sources: src/Transform/Visitor.php

Lowering 算子清单

作用
CompileTimeAttribute / CompileTimeAttributeRegistry 识别并校验编译期属性(如 AnyMustUse
FunctionAttributeLowering 处理函数上的编译期属性
ConstructorLowering 处理构造函数提升参数
GetterLowering get 钩子属性 → getter 方法
PropertyHookLowering get/set 钩子属性 → 访问器方法
PropertyMethodLowering 属性 ↔ 方法互转
ParameterValidationLowering 参数类型校验,拒绝箭头函数误用
PrinterLowering / ValidateLowering 打印/校验相关降级
ArrayableLowering / NotEmptyLowering / NotNullLowering 特定表达式降级
RuntimeAttributeFactoryLowering 运行时工厂属性(遍历链上独立挂载)

Sources: src/Transform/ · src/Translator.php

顺序意义

Lowering 必须早于 C++ 生成:例如属性钩子若不先降级成方法,后续 genClassWrapper 就无法生成对应的 C++ 访问逻辑。它处在 解析器与 AST 之后、代码生成 之前。

相关阅读