summaryrefslogtreecommitdiff
path: root/src/Language/Fiddle/Compiler
diff options
context:
space:
mode:
Diffstat (limited to 'src/Language/Fiddle/Compiler')
-rw-r--r--src/Language/Fiddle/Compiler/ConsistencyCheck.hs15
-rw-r--r--src/Language/Fiddle/Compiler/Qualification.hs37
2 files changed, 35 insertions, 17 deletions
diff --git a/src/Language/Fiddle/Compiler/ConsistencyCheck.hs b/src/Language/Fiddle/Compiler/ConsistencyCheck.hs
index 7ca618b..79ac9e7 100644
--- a/src/Language/Fiddle/Compiler/ConsistencyCheck.hs
+++ b/src/Language/Fiddle/Compiler/ConsistencyCheck.hs
@@ -159,11 +159,11 @@ deriving instance AdvanceStage CurrentStage FiddleDecl
instance AdvanceStage CurrentStage (Directed FiddleDecl) where
modifyState (Directed directives t _) s = case t of
- (BitsDecl () id typ annotation) -> do
+ (BitsDecl _ id typ annotation) -> do
typeSize <- getTypeSize typ
insertTypeSize annotation s id typeSize
return s
- (PackageDecl () n _ _) -> do
+ (PackageDecl _ n _ _) -> do
let strs = nameToList n
let (LocalState scopePath) = s
@@ -180,7 +180,7 @@ instance AdvanceStage CurrentStage (Directed FiddleDecl) where
_ -> return s
customAdvanceStage (Directed directives t a) (LocalState scopePath) = case t of
- (ObjTypeDecl () ident (Identity body) annot) -> do
+ (ObjTypeDecl q ident (Identity body) annot) -> do
(body', size) <- objTypeBodyToStage3 (LocalState scopePath) body 0
let fullName =
@@ -192,12 +192,9 @@ instance AdvanceStage CurrentStage (Directed FiddleDecl) where
let ui' = insertIntoUnitInterface fullName ui annot (ExportedObjType size)
modify' $ \gs -> gs {unitInterface = ui'}
- return $ Just $ Directed directives (ObjTypeDecl () ident (Identity body') annot) a
+ return $ Just $ Directed directives (ObjTypeDecl q ident (Identity body') annot) a
_ -> return Nothing
-nameToList :: Name f a -> [String]
-nameToList (Name idents _) = map (\(Identifier (Text.unpack -> s) _) -> s) (toList idents)
-
objTypeBodyToStage3 ::
LocalState ->
ObjTypeBody CurrentStage I Annot ->
@@ -456,8 +453,8 @@ registerBitsTypeRefToStage3 localState = \case
( RegisterBitsArray ref' expr' a,
size * fromIntegral multiplier
)
- RegisterBitsReference () name a ->
- (RegisterBitsReference () name a,) <$> lookupTypeSize localState name
+ RegisterBitsReference q name a ->
+ (RegisterBitsReference q name a,) <$> lookupTypeSize localState name
RegisterBitsJustBits expr a -> do
expr' <- advanceStage localState expr
(RegisterBitsJustBits expr' a,)
diff --git a/src/Language/Fiddle/Compiler/Qualification.hs b/src/Language/Fiddle/Compiler/Qualification.hs
index f8fbc0a..27c0911 100644
--- a/src/Language/Fiddle/Compiler/Qualification.hs
+++ b/src/Language/Fiddle/Compiler/Qualification.hs
@@ -10,7 +10,10 @@
-- removed, as they become unnecessary once references are fully qualified.
module Language.Fiddle.Compiler.Qualification (qualificationPhase) where
+import Control.Monad (forM)
import Control.Monad.Identity
+import Data.Foldable (foldlM)
+import Data.Maybe (catMaybes)
import Data.Word
import Language.Fiddle.Ast
import Language.Fiddle.Compiler
@@ -69,18 +72,36 @@ deriving instance AdvanceStage CurrentStage EnumConstantDecl
deriving instance AdvanceStage CurrentStage RegisterBitsDecl
-deriving instance AdvanceStage CurrentStage PackageBody
-
deriving instance AdvanceStage CurrentStage ObjTypeDecl
-deriving instance AdvanceStage CurrentStage FiddleDecl
-
-deriving instance AdvanceStage CurrentStage FiddleUnit
-
deriving instance AdvanceStage CurrentStage Expression
-deriving instance AdvanceStage CurrentStage RegisterBitsTypeRef
+instance AdvanceStage CurrentStage RegisterBitsTypeRef where
+ advanceStage = undefined
-deriving instance AdvanceStage CurrentStage ObjType
+instance AdvanceStage CurrentStage ObjType where
+ advanceStage = undefined
deriving instance (AdvanceStage CurrentStage t) => AdvanceStage CurrentStage (Directed t)
+
+instance AdvanceStage CurrentStage PackageBody where
+ advanceStage localState (PackageBody decls annot) =
+ PackageBody <$> advanceFiddleDecls localState decls <*> pure annot
+
+instance AdvanceStage CurrentStage FiddleUnit where
+ advanceStage localState (FiddleUnit () decls annot) =
+ FiddleUnit () <$> advanceFiddleDecls localState decls <*> pure annot
+
+advanceFiddleDecls ::
+ LocalState ->
+ [TreeType (Directed FiddleDecl) CurrentStage] ->
+ (StageMonad CurrentStage)
+ [TreeType (Directed FiddleDecl) Qualified]
+advanceFiddleDecls (LocalState scopePath) decls = fmap (reverse . fst) $ do
+ foldlM
+ ( \(declsRet, scopePath') -> \case
+ Directed {directedSubtree = UsingDecl {usingName = name}} ->
+ return (declsRet, addUsingPath (nameToList name) scopePath')
+ )
+ ([], scopePath)
+ decls