diff options
Diffstat (limited to 'src/Language/Fiddle/Compiler/Qualification.hs')
-rw-r--r-- | src/Language/Fiddle/Compiler/Qualification.hs | 37 |
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 |