Finish parser refactor, simplifying code and diagnostics handling.

This commit is contained in:
Jesse Brault 2026-08-21 16:38:30 -05:00
parent 4e3f1677be
commit 2dfd8e8a29
3 changed files with 366 additions and 862 deletions

View File

@ -105,14 +105,10 @@ fn compile_statement(
register_count: usize,
constants_table: &mut ConstantsTable,
) -> Result<Function, Diagnostics> {
let maybe_statement = parse_statement(input);
if !maybe_statement.is_ok() {
Err(maybe_statement.into_diagnostics())
let parse_result = parse_statement(input);
if !parse_result.is_ok() {
Err(parse_result.1)
} else {
session.compile_statement(
&maybe_statement.into_inner(),
register_count,
constants_table,
)
session.compile_statement(&parse_result.0.unwrap(), register_count, constants_table)
}
}

View File

@ -1,3 +1,5 @@
#![feature(option_zip)]
use crate::ast::statement::Statement;
use crate::constants_table::ConstantsTable;
use crate::diagnostic::Diagnostics;
@ -5,7 +7,7 @@ use crate::ir::compile_dvm_function;
use crate::ir::ir_variable::{IrStackFrameVariables, IrVariable, IrVariableInfo};
use crate::lowering::util::to_ir_type_info;
use crate::lowering::{lower_to_ir_compilation_unit, lower_to_ir_synthetic_function};
use crate::parser::parse_compilation_unit;
use crate::parser::{ParseResult, parse_compilation_unit};
use crate::semantic_analysis::symbol::SymbolId;
use crate::semantic_analysis::{analyze_compilation_unit, analyze_statement};
use dvm_lib::vm::function::Function;
@ -39,14 +41,14 @@ pub fn compile_compilation_unit(
register_count: usize,
constants_table: &mut ConstantsTable,
) -> Result<CompileCompilationUnitResult, Diagnostics> {
let (compilation_unit, diagnostics) = parse_compilation_unit(input, None);
if !diagnostics.is_empty() {
return Err(diagnostics);
}
let ParseResult(compilation_unit, mut parse_diagnostics) = parse_compilation_unit(input, None);
let mut analysis_diagnostics = analyze_compilation_unit(&compilation_unit, analysis_context);
let diagnostics = analyze_compilation_unit(&compilation_unit, analysis_context);
if !diagnostics.is_empty() {
return Err(diagnostics);
if !parse_diagnostics.is_empty() || !analysis_diagnostics.is_empty() {
let mut all_diagnostics = Vec::new();
all_diagnostics.append(&mut parse_diagnostics);
all_diagnostics.append(&mut analysis_diagnostics);
return Err(all_diagnostics);
}
let lower_to_ir_result = lower_to_ir_compilation_unit(&compilation_unit, analysis_context);

File diff suppressed because it is too large Load Diff