From 7179bb2ea733a99c326642abbf48638d540ff651 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Wed, 4 Jul 2018 20:11:57 -0400 Subject: - Test (and fix) that global-reference analysis only allows you to see definitions within your current module, or exports from imported modules. --- .../lux/lang/compiler/analysis/reference.lux | 44 ++++++++++++++++------ stdlib/source/lux/macro.lux | 6 +-- 2 files changed, 35 insertions(+), 15 deletions(-) (limited to 'stdlib/source') diff --git a/stdlib/source/lux/lang/compiler/analysis/reference.lux b/stdlib/source/lux/lang/compiler/analysis/reference.lux index 6f4908f9d..5652e21fc 100644 --- a/stdlib/source/lux/lang/compiler/analysis/reference.lux +++ b/stdlib/source/lux/lang/compiler/analysis/reference.lux @@ -1,29 +1,49 @@ (.module: lux - (lux (control monad) + (lux (control monad + ["ex" exception #+ exception:]) [macro] (macro [code]) - (lang (type ["tc" check]))) + (lang (type ["tc" check])) + (data [text "text/" Eq] + text/format)) [///] [// #+ Analysis Operation] [//type] [////reference] [////scope]) +(exception: #export (foreign-module-has-not-been-imported {current Text} {foreign Text}) + (ex.report ["Current" current] + ["Foreign" foreign])) + +(exception: #export (definition-has-not-been-expored {definition Ident}) + (ex.report ["Definition" (%ident definition)])) + ## [Analysers] (def: (definition def-name) (-> Ident (Operation Analysis)) - (do ///.Monad - [[actualT def-anns _] (macro.find-def def-name)] - (case (macro.get-symbol-ann (ident-for #.alias) def-anns) - (#.Some real-def-name) - (definition real-def-name) + (with-expansions [ (wrap (|> def-name ////reference.constant #//.Reference))] + (do ///.Monad + [[actualT def-anns _] (macro.find-def def-name)] + (case (macro.get-symbol-ann (ident-for #.alias) def-anns) + (#.Some real-def-name) + (definition real-def-name) - _ - (do @ - [_ (//type.infer actualT)] - (:: @ map (|>> ////reference.constant #//.Reference) - (macro.normalize def-name)))))) + _ + (do @ + [_ (//type.infer actualT) + (^@ def-name [::module ::name]) (macro.normalize def-name) + current macro.current-module-name] + (if (text/= current ::module) + + (if (macro.export? def-anns) + (do @ + [imported! (macro.imported-by? ::module current)] + (if imported! + + (///.throw foreign-module-has-not-been-imported [current ::module]))) + (///.throw definition-has-not-been-expored def-name)))))))) (def: (variable var-name) (-> Text (Operation (Maybe Analysis))) diff --git a/stdlib/source/lux/macro.lux b/stdlib/source/lux/macro.lux index 9e26a49e4..404d76b32 100644 --- a/stdlib/source/lux/macro.lux +++ b/stdlib/source/lux/macro.lux @@ -721,7 +721,7 @@ #.None (fail ($_ text/compose "Wrong syntax for " "."))))] - [log-expand expand "log-expand"] - [log-expand-all expand-all "log-expand-all"] - [log-expand-once expand-once "log-expand-once"] + [log-expand! expand "log-expand!"] + [log-expand-all! expand-all "log-expand-all!"] + [log-expand-once! expand-once "log-expand-once!"] ) -- cgit v1.2.3