Prohibit inner scope type definition

This commit is contained in:
Shunsuke Shibayama 2022-09-25 18:43:45 +09:00
parent f6e1a7b117
commit 6cfb0d1544
4 changed files with 37 additions and 5 deletions

View file

@ -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)
} }

View file

@ -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)]

View file

@ -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() {

View file

@ -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)
} }