impl Buildable for HIRBuilder, Transpiler

This commit is contained in:
Shunsuke Shibayama 2022-12-12 00:21:27 +09:00
parent 87d13b8f09
commit e07b0dfa67
3 changed files with 40 additions and 4 deletions

View file

@ -2,6 +2,7 @@ use std::fmt;
use erg_common::traits::Stream; use erg_common::traits::Stream;
use crate::context::Context;
use crate::error::CompileErrors; use crate::error::CompileErrors;
use crate::hir::HIR; use crate::hir::HIR;
@ -77,6 +78,12 @@ impl ErrorArtifact {
} }
} }
pub trait Buildable { pub trait Buildable<T = HIR> {
fn build(&mut self, src: String, mode: &str) -> Result<CompleteArtifact, IncompleteArtifact>; fn build(
&mut self,
src: String,
mode: &str,
) -> Result<CompleteArtifact<T>, IncompleteArtifact<T>>;
fn pop_context(&mut self) -> Option<Context>;
fn get_context(&self) -> Option<&Context>;
} }

View file

@ -6,7 +6,7 @@ use erg_common::Str;
use erg_parser::ast::{VarName, AST}; use erg_parser::ast::{VarName, AST};
use erg_parser::build_ast::ASTBuilder; use erg_parser::build_ast::ASTBuilder;
use crate::artifact::{CompleteArtifact, IncompleteArtifact}; use crate::artifact::{Buildable, CompleteArtifact, IncompleteArtifact};
use crate::context::{Context, ContextProvider}; use crate::context::{Context, ContextProvider};
use crate::effectcheck::SideEffectChecker; use crate::effectcheck::SideEffectChecker;
use crate::error::{CompileError, CompileErrors}; use crate::error::{CompileError, CompileErrors};
@ -72,6 +72,18 @@ impl Runnable for HIRBuilder {
} }
} }
impl Buildable for HIRBuilder {
fn build(&mut self, src: String, mode: &str) -> Result<CompleteArtifact, IncompleteArtifact> {
self.build(src, mode)
}
fn pop_context(&mut self) -> Option<Context> {
Some(self.pop_mod_ctx())
}
fn get_context(&self) -> Option<&Context> {
Some(&self.lowerer.ctx)
}
}
impl ContextProvider for HIRBuilder { impl ContextProvider for HIRBuilder {
fn dir(&self) -> Vec<(&VarName, &VarInfo)> { fn dir(&self) -> Vec<(&VarName, &VarInfo)> {
self.lowerer.dir() self.lowerer.dir()

View file

@ -10,7 +10,7 @@ use erg_common::Str;
use erg_parser::ast::{ParamPattern, TypeSpec, VarName}; use erg_parser::ast::{ParamPattern, TypeSpec, VarName};
use erg_parser::token::TokenKind; use erg_parser::token::TokenKind;
use crate::artifact::{CompleteArtifact, ErrorArtifact}; use crate::artifact::{Buildable, CompleteArtifact, ErrorArtifact, IncompleteArtifact};
use crate::build_hir::HIRBuilder; use crate::build_hir::HIRBuilder;
use crate::codegen::PyCodeGenerator; use crate::codegen::PyCodeGenerator;
use crate::context::{Context, ContextProvider}; use crate::context::{Context, ContextProvider};
@ -174,6 +174,23 @@ impl ContextProvider for Transpiler {
} }
} }
impl Buildable<PyScript> for Transpiler {
fn build(
&mut self,
src: String,
mode: &str,
) -> Result<CompleteArtifact<PyScript>, IncompleteArtifact<PyScript>> {
self.transpile(src, mode)
.map_err(|err| IncompleteArtifact::new(None, err.errors, err.warns))
}
fn pop_context(&mut self) -> Option<Context> {
self.builder.pop_context()
}
fn get_context(&self) -> Option<&Context> {
self.builder.get_context()
}
}
impl Transpiler { impl Transpiler {
pub fn transpile( pub fn transpile(
&mut self, &mut self,