From: Bennet Bleßmann Date: Sat, 3 Aug 2024 20:59:29 +0000 (+0200) Subject: ajust/add devlaration errors to be more standard compliant X-Git-Tag: v0.10.0~123^2~4 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=df33da111e04577fad169e552846c8d48e77e5ac;p=scryer-prolog.git ajust/add devlaration errors to be more standard compliant --- diff --git a/src/machine/machine_errors.rs b/src/machine/machine_errors.rs index 899424b4..87c4adf3 100644 --- a/src/machine/machine_errors.rs +++ b/src/machine/machine_errors.rs @@ -268,6 +268,26 @@ impl DomainError for HeapCellValue { } } +impl DomainError for FunctorStub { + fn domain_error( + self, + machine_st: &mut MachineState, + valid_type: DomainErrorType, + ) -> MachineError { + let stub = functor!( + atom!("domain_error"), + [atom(valid_type.as_atom()), str(machine_st.heap.len(), 0)], + [self] + ); + + MachineError { + stub, + location: None, + from: ErrorProvenance::Constructed, + } + } +} + impl DomainError for Number { fn domain_error(self, machine_st: &mut MachineState, error: DomainErrorType) -> MachineError { let stub = functor!( @@ -731,6 +751,8 @@ pub enum DeclarationError { InvalidOpDeclSpecValue(Atom), InvalidOpDeclPrecType(Term), InvalidOpDeclPrecDomain(Fixnum), + ShallNotCreate(Atom), + ShallNotModify(Atom), } impl From for CompilationError { @@ -844,6 +866,7 @@ pub(crate) enum DomainErrorType { StreamOrAlias, OperatorSpecifier, OperatorPriority, + Declaration, } impl DomainErrorType { @@ -857,6 +880,7 @@ impl DomainErrorType { DomainErrorType::StreamOrAlias => atom!("stream_or_alias"), DomainErrorType::OperatorSpecifier => atom!("operator_specifier"), DomainErrorType::OperatorPriority => atom!("operator_priority"), + DomainErrorType::Declaration => atom!("declaration"), } } } diff --git a/src/machine/machine_state.rs b/src/machine/machine_state.rs index 4f03c8e0..919017ac 100644 --- a/src/machine/machine_state.rs +++ b/src/machine/machine_state.rs @@ -986,7 +986,7 @@ impl MachineState { atom_as_cell!(atom!("todo_insert_invalid_term_here")), ), DeclarationError::InvalidDecl(name, arity) => { - self.existence_error(ExistenceError::Declaration(name, arity)) + self.domain_error(DomainErrorType::Declaration, functor_stub(name, arity)) } DeclarationError::InvalidOpDeclNameType(_term) => self.type_error( ValidType::List, @@ -1006,6 +1006,12 @@ impl MachineState { DeclarationError::InvalidOpDeclPrecDomain(num) => { self.domain_error(DomainErrorType::OperatorPriority, fixnum_as_cell!(num)) } + DeclarationError::ShallNotCreate(atom) => { + self.permission_error(Permission::Create, atom!("operator"), atom) + } + DeclarationError::ShallNotModify(atom) => { + self.permission_error(Permission::Modify, atom!("operator"), atom) + } } } } diff --git a/src/machine/preprocessor.rs b/src/machine/preprocessor.rs index 4fcdf9b7..66d6e48e 100644 --- a/src/machine/preprocessor.rs +++ b/src/machine/preprocessor.rs @@ -60,6 +60,24 @@ fn setup_op_decl(mut terms: Vec, atom_tbl: &AtomTable) -> Result % Warning: singleton variables Var at line 0 of invalid_decl11.pl > error(instantiation_error,load/1). > ``` + +```trycmd +$ scryer-prolog -f --no-add-history tests-pl/invalid_decl12.pl -g halt + error(permission_error(create,operator,{}),load/1). + +``` + +```trycmd +$ scryer-prolog -f --no-add-history tests-pl/invalid_decl13.pl -g halt + error(permission_error(create,operator,{}),load/1). + +``` + +```trycmd +$ scryer-prolog -f --no-add-history tests-pl/invalid_decl14.pl -g halt + error(permission_error(create,operator,'|'),load/1). + +``` + +```trycmd +$ scryer-prolog -f --no-add-history tests-pl/invalid_decl15.pl -g halt + error(permission_error(create,operator,'|'),load/1). + +``` + +```trycmd +$ scryer-prolog -f --no-add-history tests-pl/invalid_decl16.pl -g halt + error(permission_error(modify,operator,','),load/1). + +```