From 915d95659619e85113b36a6571e7205eeef7c05f Mon Sep 17 00:00:00 2001 From: Andrew Cowie Date: Thu, 11 Jun 2026 18:07:08 +1000 Subject: [PATCH] Defer external invocation targets in translation stage --- src/language/types.rs | 2 +- src/problem/messages.rs | 5 +---- src/program/types.rs | 4 +++- src/runner/runner.rs | 5 +++++ src/translation/translator.rs | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/language/types.rs b/src/language/types.rs index a1f68dd1..da453bbb 100644 --- a/src/language/types.rs +++ b/src/language/types.rs @@ -131,7 +131,7 @@ impl<'i> Identifier<'i> { } } -#[derive(Eq, Debug)] +#[derive(Clone, Copy, Eq, Debug)] pub struct External<'i> { pub value: &'i str, pub span: Span, diff --git a/src/problem/messages.rs b/src/problem/messages.rs index c5496131..79e38357 100644 --- a/src/problem/messages.rs +++ b/src/problem/messages.rs @@ -1137,10 +1137,7 @@ functions calls: function: Identifier { value: name, .. }, } => ( format!("Unknown function {}()", name), - format!( - "The function {}() is neither builtin nor provided by the selected domain.", - name - ), + "The function is neither builtin nor provided by the selected domain.".to_string(), ), } } diff --git a/src/program/types.rs b/src/program/types.rs index 401f7a75..3a9c560d 100644 --- a/src/program/types.rs +++ b/src/program/types.rs @@ -144,11 +144,13 @@ pub struct Invocable<'i> { /// subroutine into `Program.subroutines`; the resolve pass walks the /// translated tree replacing matching `Unresolved` references with /// `Resolved`. Names that don't match any declared subroutine become a -/// translation error. +/// translation error. `Deferred` references (ie URLs) are left as-is; they +/// are resolved at a later phase or at runtime. #[derive(Debug, Eq, PartialEq)] pub enum SubroutineRef<'i> { Unresolved(language::Identifier<'i>), Resolved(SubroutineId), + Deferred(language::External<'i>), } /// Lowered form of `language::Function`. Functions live in a separate diff --git a/src/runner/runner.rs b/src/runner/runner.rs index 293d9d9c..d4f8eaf3 100644 --- a/src/runner/runner.rs +++ b/src/runner/runner.rs @@ -314,6 +314,11 @@ impl<'i, P: Prompt> Runner<'i, P> { .announce(&format!("<{}>", id.value)); Ok(Outcome::Done(Value::Unitus)) } + SubroutineRef::Deferred(ext) => { + self.driver + .announce(&format!("<{}>", ext.value)); + Ok(Outcome::Done(Value::Unitus)) + } } } diff --git a/src/translation/translator.rs b/src/translation/translator.rs index 5ce5f100..0a68afa1 100644 --- a/src/translation/translator.rs +++ b/src/translation/translator.rs @@ -743,7 +743,7 @@ impl<'i> Translator<'i> { fn translate_invocation(&mut self, invocation: &'i language::Invocation<'i>) -> Invocable<'i> { let target = match &invocation.target { language::Target::Local(id) => SubroutineRef::Unresolved(*id), - language::Target::Remote(_) => todo!("remote invocation target"), + language::Target::Remote(external) => SubroutineRef::Deferred(*external), }; let arguments = match &invocation.parameters { Some(params) => params