Skip to content
This repository was archived by the owner on Apr 1, 2025. It is now read-only.

Commit 8f15669

Browse files
authored
Merge pull request #184 from github/scope-safety
Scope safety
2 parents 212a37c + 1c832f5 commit 8f15669

File tree

16 files changed

+768
-387
lines changed

16 files changed

+768
-387
lines changed

semantic-core/semantic-core.cabal

+3-1
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,16 @@ library
2626
, Analysis.ScopeGraph
2727
, Analysis.Typecheck
2828
, Control.Effect.Readline
29+
, Control.Monad.Module
2930
, Data.Core
3031
, Data.Core.Parser
3132
, Data.Core.Pretty
3233
, Data.File
3334
, Data.Loc
3435
, Data.Name
36+
, Data.Scope
3537
, Data.Stack
38+
, Data.Term
3639
-- other-modules:
3740
-- other-extensions:
3841
build-depends: algebraic-graphs ^>= 0.3
@@ -45,7 +48,6 @@ library
4548
, parsers ^>= 0.12.10
4649
, prettyprinter ^>= 1.2.1
4750
, prettyprinter-ansi-terminal ^>= 1.1.1
48-
, recursion-schemes ^>= 5.1
4951
, semigroupoids ^>= 5.3
5052
, text ^>= 1.2.3.1
5153
, transformers ^>= 0.5.6

semantic-core/src/Analysis/Concrete.hs

+10-9
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@ import Control.Effect.State
2222
import Control.Monad ((<=<), guard)
2323
import qualified Data.Core as Core
2424
import Data.File
25+
import Data.Foldable (foldl')
2526
import Data.Function (fix)
2627
import qualified Data.IntMap as IntMap
2728
import qualified Data.IntSet as IntSet
2829
import Data.Loc
2930
import qualified Data.Map as Map
3031
import Data.Monoid (Alt(..))
31-
import Data.Name
32+
import Data.Name hiding (fresh)
33+
import Data.Term
3234
import Data.Text (Text, pack)
3335
import Prelude hiding (fail)
3436

@@ -39,7 +41,7 @@ newtype FrameId = FrameId { unFrameId :: Precise }
3941
deriving (Eq, Ord, Show)
4042

4143
data Concrete
42-
= Closure Loc Name Core.Core Precise
44+
= Closure Loc Name (Term Core.Core Name) Precise
4345
| Unit
4446
| Bool Bool
4547
| String Text
@@ -61,22 +63,24 @@ type Heap = IntMap.IntMap Concrete
6163

6264
-- | Concrete evaluation of a term to a value.
6365
--
64-
-- >>> map fileBody (snd (concrete [File (Loc "bool" emptySpan) (Core.Bool True)]))
66+
-- >>> map fileBody (snd (concrete [File (Loc "bool" emptySpan) (Core.bool True)]))
6567
-- [Right (Bool True)]
66-
concrete :: [File Core.Core] -> (Heap, [File (Either (Loc, String) Concrete)])
68+
concrete :: [File (Term Core.Core Name)] -> (Heap, [File (Either (Loc, String) Concrete)])
6769
concrete
6870
= run
6971
. runFresh
72+
. runNaming
7073
. runHeap
7174
. traverse runFile
7275

7376
runFile :: ( Carrier sig m
7477
, Effect sig
7578
, Member Fresh sig
79+
, Member Naming sig
7680
, Member (Reader FrameId) sig
7781
, Member (State Heap) sig
7882
)
79-
=> File Core.Core
83+
=> File (Term Core.Core Name)
8084
-> m (File (Either (Loc, String) Concrete))
8185
runFile file = traverse run file
8286
where run = runReader (fileLoc file)
@@ -200,10 +204,7 @@ addressStyle heap = (G.defaultStyle vertex) { G.edgeAttributes }
200204
Obj _ -> "{}"
201205
showPos (Pos l c) = pack (show l) <> ":" <> pack (show c)
202206
fromName (User s) = s
203-
fromName (Gen sym) = fromGensym sym
204-
fromName (Path p) = pack $ show p
205-
fromGensym (Root s) = s
206-
fromGensym (ss :/ (s, i)) = fromGensym ss <> "." <> s <> pack (show i)
207+
fromName (Gen (Gensym ss i)) = foldl' (\ ss s -> ss <> "." <> s) (pack (show i)) ss
207208

208209
data EdgeType
209210
= Edge Core.Edge

0 commit comments

Comments
 (0)