fix: 语义重名诊断引擎侧复核,放行跨语句列的函数名合并

供应商语义检查器把"同语句列"近似为"声明域非 Top/Function
且前一项是函数声明",for-in/for-of 域用空 ScopeFlags 因而漏掉
Top|Function 守卫,误拒跨语句列的函数名与 var 头合法合并。
引擎侧在归一化前按 AST 复核:仅当函数非任一 block/case 列表
直接成员、或其外层链不含该列表时剔除该重名诊断,复核后无
剩余错误则落回解析成功。
This commit is contained in:
2026-09-15 02:18:07 +00:00
parent da5e6d13ba
commit 4b0b52ade3
7 changed files with 531 additions and 1 deletions
+8 -1
View File
@@ -2,6 +2,7 @@
mod error;
mod parser_log;
mod redeclaration_filter;
/// 解析错误:消息 + 源文件字节区间(起始,结束)。
pub use error::OxideError;
@@ -46,7 +47,13 @@ fn parse_with_source_type<'a>(
.with_check_syntax_error(true)
.build(&ret.program);
if !semantic_ret.errors.is_empty() {
return Err(semantic_ret.errors.into_iter().map(OxideError::from).collect());
// 重名诊断先经 AST 复核剔除跨语句列合法合并的误报(须在归一化前,
// 归一化只留首标签会丢失复核所需的新声明 span);复核后无剩余
// 错误时按解析成功落回。
let filtered = redeclaration_filter::filter_semantic_diagnostics(semantic_ret.errors, &ret.program);
if !filtered.is_empty() {
return Err(filtered.into_iter().map(OxideError::from).collect());
}
}
Ok(ret.program)