mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-30 21:01:10 +00:00
Prohibit inner scope type definition
This commit is contained in:
parent
f6e1a7b117
commit
6cfb0d1544
4 changed files with 37 additions and 5 deletions
|
@ -13,7 +13,6 @@ use crate::hir::HIR;
|
||||||
use crate::lower::ASTLowerer;
|
use crate::lower::ASTLowerer;
|
||||||
use crate::mod_cache::SharedModuleCache;
|
use crate::mod_cache::SharedModuleCache;
|
||||||
use crate::ownercheck::OwnershipChecker;
|
use crate::ownercheck::OwnershipChecker;
|
||||||
use crate::reorder::Reorderer;
|
|
||||||
|
|
||||||
/// Summarize lowering, side-effect checking, and ownership checking
|
/// Summarize lowering, side-effect checking, and ownership checking
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -99,9 +98,6 @@ impl HIRBuilder {
|
||||||
pub fn build(&mut self, src: String, mode: &str) -> Result<HIR, CompileErrors> {
|
pub fn build(&mut self, src: String, mode: &str) -> Result<HIR, CompileErrors> {
|
||||||
let mut ast_builder = ASTBuilder::new(self.cfg().copy());
|
let mut ast_builder = ASTBuilder::new(self.cfg().copy());
|
||||||
let ast = ast_builder.build(src)?;
|
let ast = ast_builder.build(src)?;
|
||||||
let ast = Reorderer::new()
|
|
||||||
.reorder(ast)
|
|
||||||
.map_err(|errs| self.convert(errs))?;
|
|
||||||
let hir = self.check(ast, mode)?;
|
let hir = self.check(ast, mode)?;
|
||||||
Ok(hir)
|
Ok(hir)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1296,6 +1296,24 @@ passed keyword args: {RED}{kw_args_len}{RESET}"
|
||||||
pub fn file_error(errno: usize, desc: String, loc: Location, caused_by: AtomicStr) -> Self {
|
pub fn file_error(errno: usize, desc: String, loc: Location, caused_by: AtomicStr) -> Self {
|
||||||
Self::new(ErrorCore::new(errno, IoError, loc, desc, None), caused_by)
|
Self::new(ErrorCore::new(errno, IoError, loc, desc, None), caused_by)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn inner_typedef_error(errno: usize, loc: Location, caused_by: AtomicStr) -> Self {
|
||||||
|
Self::new(
|
||||||
|
ErrorCore::new(
|
||||||
|
errno,
|
||||||
|
TypeError,
|
||||||
|
loc,
|
||||||
|
switch_lang!(
|
||||||
|
"japanese" => format!("型はトップレベルで定義されなければなりません"),
|
||||||
|
"simplified_chinese" => format!("类型必须在顶层定义"),
|
||||||
|
"traditional_chinese" => format!("類型必須在頂層定義"),
|
||||||
|
"english" => format!("types must be defined at the top level"),
|
||||||
|
),
|
||||||
|
None,
|
||||||
|
),
|
||||||
|
caused_by,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
|
@ -30,6 +30,7 @@ use crate::error::{
|
||||||
use crate::hir;
|
use crate::hir;
|
||||||
use crate::hir::HIR;
|
use crate::hir::HIR;
|
||||||
use crate::mod_cache::SharedModuleCache;
|
use crate::mod_cache::SharedModuleCache;
|
||||||
|
use crate::reorder::Reorderer;
|
||||||
use crate::varinfo::VarKind;
|
use crate::varinfo::VarKind;
|
||||||
use Visibility::*;
|
use Visibility::*;
|
||||||
|
|
||||||
|
@ -533,6 +534,14 @@ impl ASTLowerer {
|
||||||
|
|
||||||
fn lower_def(&mut self, def: ast::Def) -> LowerResult<hir::Def> {
|
fn lower_def(&mut self, def: ast::Def) -> LowerResult<hir::Def> {
|
||||||
log!(info "entered {}({})", fn_name!(), def.sig);
|
log!(info "entered {}({})", fn_name!(), def.sig);
|
||||||
|
if def.def_kind().is_class_or_trait() && self.ctx.kind != ContextKind::Module {
|
||||||
|
self.ctx.decls.remove(def.sig.ident().unwrap().inspect());
|
||||||
|
return Err(LowerError::inner_typedef_error(
|
||||||
|
line!() as usize,
|
||||||
|
def.loc(),
|
||||||
|
self.ctx.caused_by(),
|
||||||
|
));
|
||||||
|
}
|
||||||
let name = if let Some(name) = def.sig.name_as_str() {
|
let name = if let Some(name) = def.sig.name_as_str() {
|
||||||
name
|
name
|
||||||
} else {
|
} else {
|
||||||
|
@ -589,7 +598,6 @@ impl ASTLowerer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let id = body.id;
|
let id = body.id;
|
||||||
// TODO: cover all VarPatterns
|
|
||||||
self.ctx
|
self.ctx
|
||||||
.outer
|
.outer
|
||||||
.as_mut()
|
.as_mut()
|
||||||
|
@ -994,6 +1002,7 @@ impl ASTLowerer {
|
||||||
pub fn lower(&mut self, ast: AST, mode: &str) -> Result<(HIR, LowerWarnings), LowerErrors> {
|
pub fn lower(&mut self, ast: AST, mode: &str) -> Result<(HIR, LowerWarnings), LowerErrors> {
|
||||||
log!(info "the AST lowering process has started.");
|
log!(info "the AST lowering process has started.");
|
||||||
log!(info "the type-checking process has started.");
|
log!(info "the type-checking process has started.");
|
||||||
|
let ast = Reorderer::new().reorder(ast)?;
|
||||||
let mut module = hir::Module::with_capacity(ast.module.len());
|
let mut module = hir::Module::with_capacity(ast.module.len());
|
||||||
self.ctx.preregister(ast.module.block())?;
|
self.ctx.preregister(ast.module.block())?;
|
||||||
for chunk in ast.module.into_iter() {
|
for chunk in ast.module.into_iter() {
|
||||||
|
|
|
@ -2842,6 +2842,7 @@ pub enum DefKind {
|
||||||
Subsume,
|
Subsume,
|
||||||
StructuralTrait,
|
StructuralTrait,
|
||||||
Module,
|
Module,
|
||||||
|
/// type alias included
|
||||||
Other,
|
Other,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2850,6 +2851,14 @@ impl DefKind {
|
||||||
matches!(self, Self::Trait | Self::Subsume | Self::StructuralTrait)
|
matches!(self, Self::Trait | Self::Subsume | Self::StructuralTrait)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub const fn is_class(&self) -> bool {
|
||||||
|
matches!(self, Self::Class | Self::Inherit)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub const fn is_class_or_trait(&self) -> bool {
|
||||||
|
self.is_class() || self.is_trait()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn is_module(&self) -> bool {
|
pub fn is_module(&self) -> bool {
|
||||||
matches!(self, Self::Module)
|
matches!(self, Self::Module)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue