use sway_error::error::CompileError;
use sway_types::Spanned;
use crate::{
error::*,
language::{parsed::*, ty},
semantic_analysis::{declaration::insert_supertraits_into_namespace, Mode, TypeCheckContext},
CompileResult,
};
impl ty::TyAbiDeclaration {
pub(crate) fn type_check(
ctx: TypeCheckContext,
abi_decl: AbiDeclaration,
) -> CompileResult<Self> {
let mut warnings = vec![];
let mut errors = vec![];
let AbiDeclaration {
name,
interface_surface,
supertraits,
methods,
span,
attributes,
} = abi_decl;
let type_engine = ctx.type_engine;
let decl_engine = ctx.decl_engine;
let contract_type = type_engine.insert(decl_engine, crate::TypeInfo::Contract);
let mut abi_namespace = ctx.namespace.clone();
let mut ctx = ctx.scoped(&mut abi_namespace).with_mode(Mode::ImplAbiFn);
check!(
insert_supertraits_into_namespace(ctx.by_ref(), contract_type, &supertraits),
return err(warnings, errors),
warnings,
errors
);
let mut new_interface_surface = vec![];
for method in interface_surface.into_iter() {
let method = check!(
ty::TyTraitFn::type_check(ctx.by_ref(), method),
return err(warnings, errors),
warnings,
errors
);
for param in &method.parameters {
if param.is_reference || param.is_mutable {
errors.push(CompileError::RefMutableNotAllowedInContractAbi {
param_name: param.name.clone(),
span: param.name.span(),
})
}
}
new_interface_surface.push(ctx.decl_engine.insert(method));
}
let mut new_methods = vec![];
for method in methods.into_iter() {
let method = check!(
ty::TyFunctionDeclaration::type_check(ctx.by_ref(), method.clone(), true, false),
ty::TyFunctionDeclaration::error(method.clone()),
warnings,
errors
);
for param in &method.parameters {
if param.is_reference || param.is_mutable {
errors.push(CompileError::RefMutableNotAllowedInContractAbi {
param_name: param.name.clone(),
span: param.name.span(),
})
}
}
new_methods.push(ctx.decl_engine.insert(method));
}
let abi_decl = ty::TyAbiDeclaration {
interface_surface: new_interface_surface,
supertraits,
methods: new_methods,
name,
span,
attributes,
};
ok(abi_decl, warnings, errors)
}
}