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::mod_cache::SharedModuleCache;
|
||||
use crate::ownercheck::OwnershipChecker;
|
||||
use crate::reorder::Reorderer;
|
||||
|
||||
/// Summarize lowering, side-effect checking, and ownership checking
|
||||
#[derive(Debug)]
|
||||
|
@ -99,9 +98,6 @@ impl HIRBuilder {
|
|||
pub fn build(&mut self, src: String, mode: &str) -> Result<HIR, CompileErrors> {
|
||||
let mut ast_builder = ASTBuilder::new(self.cfg().copy());
|
||||
let ast = ast_builder.build(src)?;
|
||||
let ast = Reorderer::new()
|
||||
.reorder(ast)
|
||||
.map_err(|errs| self.convert(errs))?;
|
||||
let hir = self.check(ast, mode)?;
|
||||
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 {
|
||||
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)]
|
||||
|
|
|
@ -30,6 +30,7 @@ use crate::error::{
|
|||
use crate::hir;
|
||||
use crate::hir::HIR;
|
||||
use crate::mod_cache::SharedModuleCache;
|
||||
use crate::reorder::Reorderer;
|
||||
use crate::varinfo::VarKind;
|
||||
use Visibility::*;
|
||||
|
||||
|
@ -533,6 +534,14 @@ impl ASTLowerer {
|
|||
|
||||
fn lower_def(&mut self, def: ast::Def) -> LowerResult<hir::Def> {
|
||||
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() {
|
||||
name
|
||||
} else {
|
||||
|
@ -589,7 +598,6 @@ impl ASTLowerer {
|
|||
}
|
||||
}
|
||||
let id = body.id;
|
||||
// TODO: cover all VarPatterns
|
||||
self.ctx
|
||||
.outer
|
||||
.as_mut()
|
||||
|
@ -994,6 +1002,7 @@ impl ASTLowerer {
|
|||
pub fn lower(&mut self, ast: AST, mode: &str) -> Result<(HIR, LowerWarnings), LowerErrors> {
|
||||
log!(info "the AST lowering 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());
|
||||
self.ctx.preregister(ast.module.block())?;
|
||||
for chunk in ast.module.into_iter() {
|
||||
|
|
|
@ -2842,6 +2842,7 @@ pub enum DefKind {
|
|||
Subsume,
|
||||
StructuralTrait,
|
||||
Module,
|
||||
/// type alias included
|
||||
Other,
|
||||
}
|
||||
|
||||
|
@ -2850,6 +2851,14 @@ impl DefKind {
|
|||
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 {
|
||||
matches!(self, Self::Module)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue