diff options
author | Josh Rahm <joshuarahm@gmail.com> | 2024-09-22 22:49:17 -0600 |
---|---|---|
committer | Josh Rahm <joshuarahm@gmail.com> | 2024-09-22 22:49:17 -0600 |
commit | 0c6ada2f5c8a3ac900fabd0384af558fb6bd334a (patch) | |
tree | 5c1d69c3ac15c90c1b64598196cc12e23de09c7a /src/Language/Fiddle/Ast.hs | |
parent | 0d2095b5d42989639c1861d7213c182abd064672 (diff) | |
download | fiddle-0c6ada2f5c8a3ac900fabd0384af558fb6bd334a.tar.gz fiddle-0c6ada2f5c8a3ac900fabd0384af558fb6bd334a.tar.bz2 fiddle-0c6ada2f5c8a3ac900fabd0384af558fb6bd334a.zip |
Add import statements, add using statements, properly cross-package
symbols.
Diffstat (limited to 'src/Language/Fiddle/Ast.hs')
-rw-r--r-- | src/Language/Fiddle/Ast.hs | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/Language/Fiddle/Ast.hs b/src/Language/Fiddle/Ast.hs index bb6605e..8680790 100644 --- a/src/Language/Fiddle/Ast.hs +++ b/src/Language/Fiddle/Ast.hs @@ -11,6 +11,7 @@ module Language.Fiddle.Ast where import Data.Functor.Identity import Data.Kind (Type) +import Data.List.NonEmpty import Data.Proxy import Data.Text (Text) import Data.Traversable @@ -47,6 +48,16 @@ type family ImportType (stage :: Stage) :: SynTreeKind where ImportType Stage2 = ImportStatement ImportType Stage3 = ImportStatement +-- Type-level constraint to determine if a stage is less than some natural +-- ordinal. Used to bound parts of the AST in multiple stages. +type StageLessThan stage (n :: Natural) = (CmpNat (StageNumber stage) n ~ LT) + +-- A Name is multiple identifiers separated by dots. It's the way of namespaces +-- to different packages. +data Name f a where + Name :: NonEmpty (Identifier f a) -> a -> Name f a + deriving (Generic, Annotated, Alter, Typeable) + -- [[packed, rust: name="field_name"]] data Directive f a where Directive :: f (DirectiveBody f a) -> a -> Directive f a @@ -146,9 +157,11 @@ data FiddleDecl (stage :: Stage) (f :: Type -> Type) a where ImportType stage f a -> a -> FiddleDecl stage f a + UsingDecl :: + Name f a -> a -> FiddleDecl stage f a {- Package Statement. Package Name, Package body -} PackageDecl :: - Identifier f a -> + Name f a -> f (PackageBody stage f a) -> a -> FiddleDecl stage f a @@ -197,11 +210,9 @@ data ObjType stage f a where -- <type>[<expr>] ArrayObjType :: ObjType stage f a -> Expression stage f a -> a -> ObjType stage f a -- <identifier> - ReferencedObjType :: Identifier f a -> a -> ObjType stage f a + ReferencedObjType :: Name f a -> a -> ObjType stage f a deriving (Typeable) -type StageLessThan stage (n :: Natural) = (CmpNat (StageNumber stage) n ~ LT) - data ObjTypeDecl stage f a where {- assert_pos(<expr>) -} AssertPosStatement :: @@ -278,7 +289,7 @@ data RegisterBitsTypeRef stage f a where a -> RegisterBitsTypeRef stage f a {- Reference to a type. -} - RegisterBitsReference :: Identifier f a -> a -> RegisterBitsTypeRef stage f a + RegisterBitsReference :: Name f a -> a -> RegisterBitsTypeRef stage f a {- enum(<expr>) { <body> } Anonymous types are only allowed in stage1. Stage2 should de-anonymize these type. -} |