@@ -118,17 +118,19 @@ type Rule = Named Type0
118
118
119
119
-- | Top-level Huddle type is a list of rules.
120
120
data Huddle = Huddle
121
- { rules :: NE. NonEmpty Rule ,
121
+ { -- | Root elements
122
+ roots :: [Rule ],
123
+ rules :: NE. NonEmpty Rule ,
122
124
groups :: [Named Group ],
123
125
gRules :: [GRuleDef ]
124
126
}
125
- deriving (Show )
127
+ deriving (Generic , Show )
126
128
127
129
-- | This instance is mostly used for testing
128
130
instance IsList Huddle where
129
131
type Item Huddle = Rule
130
132
fromList [] = error " Huddle: Cannot have empty ruleset"
131
- fromList (x : xs) = Huddle (x NE. :| xs) mempty mempty
133
+ fromList (x : xs) = Huddle mempty (x NE. :| xs) mempty mempty
132
134
133
135
toList = NE. toList . rules
134
136
@@ -815,7 +817,9 @@ binding2 fRule t0 t1 =
815
817
-- Collecting all top-level rules
816
818
--------------------------------------------------------------------------------
817
819
818
- -- | Collect all rules starting from a given point.
820
+ -- | Collect all rules starting from a given point. This will also insert a
821
+ -- single pseudo-rule as the first element which references the specified
822
+ -- top-level rules.
819
823
collectFrom :: [Rule ] -> Huddle
820
824
collectFrom topRs =
821
825
toHuddle $
@@ -825,7 +829,8 @@ collectFrom topRs =
825
829
where
826
830
toHuddle (rules, groups, gRules) =
827
831
Huddle
828
- { rules = NE. fromList $ view _2 <$> HaskMap. toList rules,
832
+ { roots = topRs,
833
+ rules = NE. fromList $ view _2 <$> HaskMap. toList rules,
829
834
groups = view _2 <$> HaskMap. toList groups,
830
835
gRules = view _2 <$> HaskMap. toList gRules
831
836
}
@@ -871,10 +876,16 @@ collectFrom topRs =
871
876
toCDDL :: Huddle -> CDDL
872
877
toCDDL hdl =
873
878
C. CDDL $
874
- fmap toCDDLRule (rules hdl)
875
- `appendList` fmap toCDDLGroup (groups hdl)
876
- `appendList` fmap toGenRuleDef (gRules hdl)
879
+ toTopLevelPseudoRoot (roots hdl)
880
+ NE. <| fmap toCDDLRule (rules hdl)
881
+ `appendList` fmap toCDDLGroup (groups hdl)
882
+ `appendList` fmap toGenRuleDef (gRules hdl)
877
883
where
884
+ toTopLevelPseudoRoot :: [Rule ] -> C. WithComments C. Rule
885
+ toTopLevelPseudoRoot topRs =
886
+ toCDDLRule $
887
+ comment " Pseudo-rule introduced by Cuddle to collect root elements" $
888
+ " huddle_root_defs" =:= arr (fromList (fmap a topRs))
878
889
-- This function is missing from NonEmpty prior to 4.16, so we temporarily
879
890
-- add it here.
880
891
appendList :: NE. NonEmpty a -> [a ] -> NE. NonEmpty a
0 commit comments