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