已关闭
[FIX] Parser incorrectly treats unique/keyof/readonly as type operators in expression context #9675
ElevenDuan创建于  3月29日关闭于  4月27日
ElevenDuan
ElevenDuan成员
3月29日 创建

问题描述

当将 TypeScript 类型操作符关键字(uniquekeyofreadonly)作为变量名使用时,解析器错误地将它们视为类型操作符而非普通标识符,导致编译合法 TypeScript 代码时报 "SyntaxError: Type expected"。

复现用例

// 以下合法代码均报错 SyntaxError: Type expected
let unique: number[] = []
for (let i: number = 0; i < unique.length; i++) {}

let keyof: number[] = []
for (let i: number = 0; i < keyof.length; i++) {}

let readonly: number[] = []
for (let i: number = 0; i < readonly.length; i++) {}

根因分析

ParseTsTypeOperatorOrTypeReference() 无条件将这三个关键字路由到 ParseTsTypeOperator(),在推测性解析路径(ParsePotentialTsGenericFunctionCall)中未区分类型上下文和表达式上下文。ParseTsTypeOperator() 硬编码 THROW_ERROR,而 ParsePotentialTsGenericFunctionCall< 的错误会重新抛出(只对 << 吞没错误),导致合法的比较表达式被错误解析。

修复方案

  1. 新增 IsStartOfTypeOperator() 辅助函数,通过前瞻(lookahead)判断当前关键字是否处于类型操作符上下文
  2. 修改 ParseTsTypeOperatorOrTypeReference()
    • throwError=true(真正类型上下文):保持原有行为
    • throwError=false(推测性解析):用前瞻区分,只有明确是类型操作符时才走 ParseTsTypeOperator()
  3. 前瞻规则:.( 统一排除(表达式上下文);[ 仅对 unique 排除(readonly [T] 是合法元组语法)

影响范围

  • 修改文件:es2panda/parser/parserImpl.cppes2panda/parser/parserImpl.h
  • 全部测试通过(Compiler 1033、TSC 4378、Regression 1353 等共 6800+ 测试用例,0 失败)
  • 额外修复了 9 个已有 TSC 失败和 3 个 ts-compiler 失败
likedislike
openharmony_ci
openharmony_ci成员
3月29日 评论:

感谢提交Issue!关于Issue的交互操作,请访问OpenHarmony社区支持命令清单。如果有问题,请联系 [@xucheng46](https://gitcode.com/xucheng46) [@gavin1012_hw](https://gitcode.com/gavin1012_hw) [@trubachevilya](https://gitcode.com/trubachevilya) [@vpukhov](https://gitcode.com/vpukhov) [@chernykhsergey](https://gitcode.com/chernykhsergey) [@zhuoli](https://gitcode.com/zhuoli) 。如果需要调整订阅PR、Issue的变更状态,请访问链接


Thanks for submitting the issue. For more commands, please visit OpenHarmony Command List. If you have any questions, please refer to committer gitcode for help. If you need to change the subscription of a Pull Request or Issue, please visit the link.

likedislike
openharmony_ciopenharmony_ci成员
3月29日 添加了label:waiting_for_assign
ElevenDuanElevenDuan成员
4月27日 issue状态由 待办的 改变为 已完成
ElevenDuanElevenDuan成员
4月27日 关闭了 issue
ElevenDuanElevenDuan成员
5月27日 issue类型由 任务 改变为 缺陷