summaryrefslogtreecommitdiff
path: root/src/Language/Fiddle/Internal/UnitInterface.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Language/Fiddle/Internal/UnitInterface.hs')
-rw-r--r--src/Language/Fiddle/Internal/UnitInterface.hs171
1 files changed, 147 insertions, 24 deletions
diff --git a/src/Language/Fiddle/Internal/UnitInterface.hs b/src/Language/Fiddle/Internal/UnitInterface.hs
index aacb71d..c5cbc2c 100644
--- a/src/Language/Fiddle/Internal/UnitInterface.hs
+++ b/src/Language/Fiddle/Internal/UnitInterface.hs
@@ -1,14 +1,19 @@
-{-# LANGUAGE OverloadedStrings #-}
-
module Language.Fiddle.Internal.UnitInterface where
import Data.Aeson
+import Data.List.NonEmpty (NonEmpty)
import Data.Text
import Data.Word
import GHC.Generics
import Language.Fiddle.Internal.Scopes (Scope)
+import qualified Language.Fiddle.Internal.Scopes as Scopes
import Language.Fiddle.Types (SourceSpan)
+data InternalDirectiveExpression
+ = InternalDirectiveExpressionNumber String
+ | InternalDirectiveExpressionString String
+ deriving (Generic, ToJSON, FromJSON, Show, Eq, Ord)
+
-- | Represents a compiler directive that provides configuration for the compiler
-- or its various backends. Directives can adjust the behavior of the compiler
-- or influence the code generation in the backends.
@@ -21,7 +26,7 @@ data InternalDirective = InternalDirective
directiveKey :: String,
-- | The optional value associated with this directive. Some directives
-- may not require a value (e.g., flags), in which case this field is 'Nothing'.
- directiveValue :: Maybe String
+ directiveValue :: Maybe InternalDirectiveExpression
}
deriving (Generic, ToJSON, FromJSON, Show, Eq, Ord)
@@ -29,7 +34,9 @@ data InternalDirective = InternalDirective
-- location, doc comments and compiler directives associated with the exported
-- symbol.
data Metadata = Metadata
- { -- | Source location for the exported symbol.
+ { -- | Fully-qualified path the the element.
+ metadataFullyQualifiedPath :: NonEmpty String,
+ -- | Source location for the exported symbol.
metadataSourceSpan :: SourceSpan,
-- | Doc comment associated with the symbol.
metadataDocComment :: Text,
@@ -44,11 +51,23 @@ data Metadata = Metadata
-- direct dependencies.
data UnitInterface where
UnitInterface ::
- { rootScope :: Scope String (Metadata, ExportedValue),
+ { rootScope :: Scope String (Metadata, ExportedDecl),
dependencies :: [FilePath]
} ->
UnitInterface
- deriving (Eq, Ord, Show)
+ deriving (Generic, Eq, Ord, Show, FromJSON, ToJSON)
+
+insert :: (ExportableDecl d) => d -> UnitInterface -> UnitInterface
+insert decl (UnitInterface sc deps) =
+ let metadata = getMetadata decl
+ path = metadataFullyQualifiedPath metadata
+ in UnitInterface (Scopes.insertScope path (metadata, toExportedDecl decl) sc) deps
+
+singleton :: (ExportableDecl d) => d -> UnitInterface
+singleton decl =
+ let path = metadataFullyQualifiedPath (getMetadata decl)
+ metadata = getMetadata decl
+ in UnitInterface (Scopes.singleton path (metadata, toExportedDecl decl)) []
instance Semigroup UnitInterface where
(<>) (UnitInterface s d) (UnitInterface s1 d1) =
@@ -57,24 +76,128 @@ instance Semigroup UnitInterface where
instance Monoid UnitInterface where
mempty = UnitInterface mempty mempty
-data ExportedValue where
- ExportedBitsType ::
- {exportBitsTypeSize :: Word32} ->
- ExportedValue
- ExportedObjType ::
- {exportObjTypeSize :: Word32} ->
- ExportedValue
+-- | Represents an exported package declaration in the syntax tree.
+-- This is a higher-level abstraction with metadata detailing the package.
+data ExportedPackageDecl where
+ ExportedPackageDecl ::
+ { -- | Metadata associated with the package.
+ exportedPackageMetadata :: Metadata
+ } ->
+ ExportedPackageDecl
+ deriving (Show, Eq, Ord, Generic, FromJSON, ToJSON)
+
+-- | Represents an exported location declaration in the syntax tree.
+-- Contains metadata and the actual integer value of the location.
+data ExportedLocationDecl where
+ ExportedLocationDecl ::
+ { -- | Metadata associated with the location.
+ exportedLocationMetadata :: Metadata,
+ -- | The value of the location as an integer.
+ exportedLocationValue :: Integer
+ } ->
+ ExportedLocationDecl
deriving (Show, Eq, Ord, Generic, FromJSON, ToJSON)
-instance ToJSON UnitInterface where
- toJSON ui =
- object
- [ "rootScope" .= rootScope ui,
- "dependencies" .= dependencies ui
- ]
+-- | Represents an exported bits declaration in the syntax tree.
+-- Contains metadata and the size of the bits in a Word32 format.
+data ExportedBitsDecl where
+ ExportedBitsDecl ::
+ { -- | Metadata associated with the bits declaration.
+ exportedBitsDeclMetadata :: Metadata,
+ -- | The size of the bits in this declaration.
+ exportedBitsDeclSizeBits :: Word32
+ } ->
+ ExportedBitsDecl
+ deriving (Show, Eq, Ord, Generic, FromJSON, ToJSON)
-instance FromJSON UnitInterface where
- parseJSON = withObject "UnitInterface" $ \v ->
- UnitInterface
- <$> v .: "rootScope"
- <*> v .: "dependencies"
+-- | Represents an exported type declaration in the syntax tree.
+-- Contains metadata and the size of the type in bytes.
+data ExportedTypeDecl where
+ ExportedTypeDecl ::
+ { -- | Metadata associated with the type declaration.
+ exportedTypeDeclMetadata :: Metadata,
+ -- | The size of the type in bytes.
+ exportedTypeDeclSizeBytes :: Word32
+ } ->
+ ExportedTypeDecl
+ deriving (Show, Eq, Ord, Generic, FromJSON, ToJSON)
+
+data ReferencedObjectType where
+ ReferencedObjectType ::
+ {objectTypeReference :: String} -> ReferencedObjectType
+ ArrayObjectType ::
+ { arrayObjectTypeType :: ReferencedObjectType,
+ arryObjecttTypeNumber :: Word32
+ } ->
+ ReferencedObjectType
+ deriving (Show, Eq, Ord, Generic, FromJSON, ToJSON)
+
+-- | Represents an exported object declaration in the syntax tree.
+-- This includes metadata, location, and the type of the object.
+data ExportedObjectDecl where
+ ExportedObjectDecl ::
+ { -- | Metadata associated with the object declaration.
+ exportedObjectDeclMetadata :: Metadata,
+ -- | The memory location of the object.
+ exportedObjectDeclLocation :: Integer,
+ -- | The type of the object as a string.
+ exportedObjectDeclType :: ReferencedObjectType
+ } ->
+ ExportedObjectDecl
+ deriving (Show, Eq, Ord, Generic, FromJSON, ToJSON)
+
+-- | A typeclass for converting various exported declarations into the
+-- generalized 'ExportedDecl' type. This allows treating different exported
+-- declarations uniformly in the compilation process.
+class ExportableDecl a where
+ toExportedDecl :: a -> ExportedDecl
+ fromExportedDecl :: ExportedDecl -> Maybe a
+ getMetadata :: a -> Metadata
+
+-- Instances of 'ExportableDecl' to convert specific exported declaration types
+-- into the generalized 'ExportedDecl' type.
+instance ExportableDecl ExportedPackageDecl where
+ toExportedDecl = ExportedPackage
+ fromExportedDecl = \case
+ ExportedPackage x -> Just x
+ _ -> Nothing
+ getMetadata = exportedPackageMetadata
+
+instance ExportableDecl ExportedLocationDecl where
+ toExportedDecl = ExportedLocation
+ fromExportedDecl = \case
+ ExportedLocation x -> Just x
+ _ -> Nothing
+ getMetadata = exportedLocationMetadata
+
+instance ExportableDecl ExportedBitsDecl where
+ toExportedDecl = ExportedBits
+ fromExportedDecl = \case
+ ExportedBits x -> Just x
+ _ -> Nothing
+ getMetadata = exportedBitsDeclMetadata
+
+instance ExportableDecl ExportedTypeDecl where
+ toExportedDecl = ExportedType
+ fromExportedDecl = \case
+ ExportedType x -> Just x
+ _ -> Nothing
+ getMetadata = exportedTypeDeclMetadata
+
+instance ExportableDecl ExportedObjectDecl where
+ toExportedDecl = ExportedObject
+ fromExportedDecl = \case
+ ExportedObject x -> Just x
+ _ -> Nothing
+ getMetadata = exportedObjectDeclMetadata
+
+-- | A generalized representation of different exported declarations.
+-- This data type allows for a uniform way to handle various exportable
+-- syntax tree elements (e.g., packages, locations, bits, types, objects).
+data ExportedDecl where
+ ExportedPackage :: ExportedPackageDecl -> ExportedDecl
+ ExportedLocation :: ExportedLocationDecl -> ExportedDecl
+ ExportedBits :: ExportedBitsDecl -> ExportedDecl
+ ExportedType :: ExportedTypeDecl -> ExportedDecl
+ ExportedObject :: ExportedObjectDecl -> ExportedDecl
+ deriving (Show, Eq, Ord, Generic, FromJSON, ToJSON)