summaryrefslogtreecommitdiff
path: root/src/Language/Fiddle/Compiler/Qualification.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Language/Fiddle/Compiler/Qualification.hs')
-rw-r--r--src/Language/Fiddle/Compiler/Qualification.hs37
1 files changed, 29 insertions, 8 deletions
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