File(ClauseName),
}
+impl ModuleSource {
+ pub fn as_functor_stub(&self) -> MachineStub {
+ match self {
+ ModuleSource::Library(ref name) => {
+ functor!("library", [clause_name(name.clone())])
+ }
+ ModuleSource::File(ref name) => {
+ functor!(clause_name(name.clone()))
+ }
+ }
+ }
+}
+
pub type ScopedPredicateKey = (ClauseName, PredicateKey); // module name, predicate indicator.
#[derive(Clone)]
&listing_src,
)
}
- None => Err(SessionError::ModuleNotFound)
+ None => {
+ let err = ExistenceError::SourceSink(ModuleSource::Library(
+ name.clone()
+ ));
+
+ Err(SessionError::ExistenceError(err))
+ }
}
}
Ok(wam_indices.insert_module(submodule))
} else {
- Err(SessionError::ModuleNotFound)
+ let err = ExistenceError::SourceSink(ModuleSource::File(
+ module_name,
+ ));
+
+ Err(SessionError::ExistenceError(err))
}
}
Ok(wam_indices.insert_module(submodule))
} else {
- Err(SessionError::ModuleNotFound)
+ let err = ExistenceError::SourceSink(ModuleSource::File(
+ module_name
+ ));
+
+ Err(SessionError::ExistenceError(err))
}
}
insert_or_refresh_term_dir_quantum(term_dir, key, term_dirs);
}
None => {
- return Err(SessionError::ModuleNotFound);
+ let err = ExistenceError::SourceSink(ModuleSource::File(
+ module_name,
+ ));
+
+ return Err(SessionError::ExistenceError(err));
}
}
}
module: ClauseName,
indices: &mut IndexStore,
) -> Result<(), SessionError> {
- if let Some(module) = wam.indices.take_module(module) {
+ if let Some(module) = wam.indices.take_module(module.clone()) {
let flags = wam.machine_flags();
let result = indices.use_module(&mut wam.code_repo, flags, &module);
wam.indices.insert_module(module);
result
} else {
- Err(SessionError::ModuleNotFound)
+ let err = ExistenceError::SourceSink(ModuleSource::Library(
+ module
+ ));
+
+ Err(SessionError::ExistenceError(err))
}
}
use prolog_parser::ast::*;
-use crate::prolog::forms::{Number, PredicateKey};
+use crate::prolog::forms::{ModuleSource, Number, PredicateKey};
use crate::prolog::machine::heap::*;
use crate::prolog::machine::machine_indices::*;
use crate::prolog::machine::machine_state::*;
ExistenceError::Module(name) => {
let stub = functor!(
"existence_error",
- [atom("module"), clause_name(name)]
+ [atom("source_sink"), clause_name(name)]
);
MachineError {
from: ErrorProvenance::Constructed,
}
}
+ ExistenceError::SourceSink(source) => {
+ let source_stub = source.as_functor_stub();
+
+ let stub = functor!(
+ "existence_error",
+ [atom("source_sink"), aux(h, 0)],
+ [source_stub]
+ );
+
+ MachineError {
+ stub,
+ location: None,
+ from: ErrorProvenance::Constructed,
+ }
+ }
ExistenceError::Stream(culprit) => {
let stub = functor!(
"existence_error",
pub(super)
fn session_error(h: usize, err: SessionError) -> Self {
match err {
- SessionError::CannotOverwriteBuiltIn(pred_str)
- | SessionError::CannotOverwriteImport(pred_str) => {
+ SessionError::CannotOverwriteBuiltIn(pred_str) |
+ SessionError::CannotOverwriteImport(pred_str) => {
Self::permission_error(
h,
Permission::Modify,
functor!(clause_name(pred_str)),
)
}
+ SessionError::ExistenceError(err) => {
+ Self::existence_error(h, err)
+ }
SessionError::InvalidFileName(filename) => {
Self::existence_error(h, ExistenceError::Module(filename))
}
functor!("module_does_not_contain_claimed_export"),
)
}
- SessionError::ModuleNotFound => {
- Self::permission_error(
- h,
- Permission::Access,
- "private_procedure",
- functor!("module_does_not_exist"),
- )
- }
SessionError::NamelessEntry => {
Self::permission_error(
h,
pub enum ExistenceError {
Module(ClauseName),
Procedure(ClauseName, usize),
+ SourceSink(ModuleSource),
Stream(Addr),
}
pub enum SessionError {
CannotOverwriteBuiltIn(ClauseName),
CannotOverwriteImport(ClauseName),
+ ExistenceError(ExistenceError),
InvalidFileName(ClauseName),
ModuleDoesNotContainExport(ClauseName, PredicateKey),
- ModuleNotFound,
NamelessEntry,
OpIsInfixAndPostFix(ClauseName),
QueryCannotBePostedAsGoal,
Ok(self.indices.insert_module(module))
} else {
- Err(SessionError::ModuleNotFound)
+ let err = ExistenceError::SourceSink(ModuleSource::File(
+ clause_name!("$toplevel"),
+ ));
+
+ Err(SessionError::ExistenceError(err))
}
}
use_module(Module, QualifiedExports) :-
( nonvar(Module) ->
( list_si(QualifiedExports) ->
- maplist('$module_export'(use_module/2), QualifiedExports) ->
+ maplist('$module_export'(use_module/2), QualifiedExports) ->
( Module = library(Filename) ->
'$use_qualified_module'(Filename, QualifiedExports)
; atom(Module) ->
impl fmt::Display for SessionError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
+ &SessionError::ExistenceError(ref err) => {
+ write!(f, "{}", err)
+ }
&SessionError::CannotOverwriteBuiltIn(ref msg) => {
write!(f, "cannot overwrite {}", msg)
}
&SessionError::InvalidFileName(ref filename) => {
write!(f, "filename {} is invalid", filename)
}
- &SessionError::ModuleNotFound => write!(f, "module not found."),
&SessionError::ModuleDoesNotContainExport(ref module, ref key) => {
write!(
f,
}
}
+impl fmt::Display for ExistenceError {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match self {
+ &ExistenceError::Module(ref module_name) => {
+ write!(f, "the module {} does not exist", module_name)
+ }
+ &ExistenceError::Procedure(ref name, arity) => {
+ write!(f, "the procedure {}/{} does not exist", name, arity)
+ }
+ &ExistenceError::SourceSink(ref module_source) => {
+ write!(f, "the source/sink {} does not exist", module_source)
+ }
+ &ExistenceError::Stream(ref addr) => {
+ write!(f, "the stream at {} does not exist", addr)
+ }
+ }
+ }
+}
+
+impl fmt::Display for ModuleSource {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match self {
+ &ModuleSource::File(ref file) => {
+ write!(f, "at the file {}", file)
+ }
+ &ModuleSource::Library(ref library) => {
+ write!(f, "at library({})", library)
+ }
+ }
+ }
+}
+
impl fmt::Display for Line {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {