Skip to content

Commit 19ca6df

Browse files
committed
Get rid of -'Kind' types
This removes 'ItemKind', 'ForeignItemKind', 'TraitItemKind', 'ImplItemKind'. Motivation: * The -'Kind' constructors don't translate to separate parsing rules * Types are too loose in some cases (allow visibility/names on things that don't have them * They add an extra mental and machine overhead In the process, the parser/types are more accurate and simpler than before. Parser conflicts: 1 S/R Compile time: 2 minutes
1 parent b9c573b commit 19ca6df

File tree

10 files changed

+876
-567
lines changed

10 files changed

+876
-567
lines changed

sample-sources/attributes.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,10 @@ fn expressions() {
118118
}
119119

120120
fn foreign_items() {
121+
#[foreign_outer]
121122
extern "C" {
123+
#![foreign_inner]
124+
122125
#[static_outer]
123126
static ext: u8;
124127

@@ -143,6 +146,9 @@ trait Trait {
143146
foo!();
144147
}
145148

149+
#[defaultimpl_outer]
150+
impl Trait for .. { }
151+
146152

147153
#[impl_outer]
148154
impl Impls {
@@ -198,11 +204,12 @@ fn items() {
198204
#[macro_outer]
199205
foo!{ .. }
200206

201-
// #[macrodef_outer]
202-
// macro_rules! foo { .. }
207+
#[macrodef_outer]
208+
macro_rules! foo { () => ( .. ) }
203209

204210
}
205211

206212
fn foo<
207213
#[lifetimedef_outer] 'a: 'b,
214+
#[typaram_outer] T
208215
>() { }

sample-sources/items.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
extern crate foo;
32
extern crate foo_bar as foo;
43

src/Language/Rust/Parser.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,9 @@ instance Parse TokenTree where parser = parseTt
8080
instance Parse (Block Span) where parser = parseBlock
8181
instance Parse (ImplItem Span) where parser = parseImplItem
8282
instance Parse (TraitItem Span) where parser = parseTraitItem
83+
instance Parse (TyParamBound Span) where parser = parseTyParamBound
84+
instance Parse (TyParam Span) where parser = parseTyParam
85+
instance Parse (LifetimeDef Span) where parser = parseLifetimeDef
86+
instance Parse (Generics Span) where parser = parseGenerics
87+
instance Parse (WhereClause Span) where parser = parseWhereClause
8388

src/Language/Rust/Parser/Internal.y

Lines changed: 226 additions & 154 deletions
Large diffs are not rendered by default.

src/Language/Rust/Pretty/Internal.hs

Lines changed: 90 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -713,54 +713,84 @@ printCookedIdent ident@(Ident str _)
713713
| '-' `elem` str = printStr Cooked str
714714
| otherwise = printIdent ident
715715

716+
716717
-- | Print an item (@print_item@)
717718
printItem :: Item a -> Doc a
718-
printItem (Item ident attrs node vis x) = annotate x $ align $ printOuterAttrs attrs <#> case node of
719-
ExternCrate p -> hsep [ printVis vis, "extern", "crate", perhaps (\p' -> printCookedIdent p' <+> "as") p, printIdent ident <> ";" ]
720-
Use vp -> hsep [ printVis vis, "use", printViewPath vp <> ";" ]
721-
Static ty m e -> hsep [ printVis vis, "static", printMutability m, printIdent ident <> ":", printType ty, "=", printExpr e <> ";" ]
722-
ConstItem t e -> hsep [ printVis vis, "const", printIdent ident <> ":", printType t, "=", printExpr e <> ";" ]
723-
Fn d s c a t b -> printFn d s c a (Just ident) t vis (Just (b, attrs))
724-
Mod items -> hsep [ printVis vis, "mod", printIdent ident, printMod items attrs ]
725-
ForeignMod a i -> hsep [ printAbi a, printForeignMod i attrs ]
726-
TyAlias ty ps -> let wc = printWhereClause True (whereClause ps)
727-
leading = printVis vis <+> "type" <+> printIdent ident <> printGenerics ps
728-
in case wc of
729-
WL.Empty -> group (leading <+> "=" <#> indent n (printType ty <> ";"))
730-
_ -> leading <#> wc <#> "=" <+> printType ty <> ";"
731-
Enum vars ps -> printEnumDef vars ps ident vis
732-
StructItem s g -> hsep [ printVis vis, "struct", printStruct s g ident True True ]
733-
Union s g -> hsep [ printVis vis, "union", printStruct s g ident True True ]
734-
DefaultImpl u t -> hsep [ printVis vis, printUnsafety u, "impl", printTraitRef t, "for", "..", "{ }" ]
735-
Impl u p g t ty i -> let generics = case g of { Generics [] [] _ _ -> mempty; _ -> printGenerics g }
736-
traitref = perhaps (\t' -> printPolarity p <> printTraitRef t' <+> "for") t
737-
leading = hsep [ printVis vis, printUnsafety u
738-
, "impl" <> generics, traitref, printType ty
739-
]
740-
lagging = block Brace False mempty (printInnerAttrs attrs) (printImplItem `map` i)
741-
wc = printWhereClause True (whereClause g)
742-
in case wc of
743-
WL.Empty -> leading <+> lagging
744-
_ -> leading <#> wc <#> lagging
745-
Trait u g tys i -> let leading = hsep [ printVis vis, printUnsafety u, "trait"
746-
, printIdent ident <> printGenerics g <> printBounds ":" tys
747-
]
748-
lagging = block Brace False mempty (printInnerAttrs attrs) (printTraitItem `map` i)
749-
wc = printWhereClause True (whereClause g)
750-
in case wc of
751-
WL.Empty -> leading <+> lagging
752-
_ -> leading <#> wc <#> lagging
753-
MacItem m -> printMac m Paren <> ";"
754-
MacroDef tts -> "macro_rules" <> "!" <+> printIdent ident <+> block Brace True mempty mempty [ printTts tts ]
719+
printItem (ExternCrate as vis ident p x) = annotate x $ align $ printOuterAttrs as <#>
720+
hsep [ printVis vis, "extern", "crate", perhaps (\p' -> printCookedIdent p' <+> "as") p, printIdent ident <> ";" ]
721+
722+
printItem (Use as vis vp x) = annotate x $ align $ printOuterAttrs as <#>
723+
hsep [ printVis vis, "use", printViewPath vp <> ";" ]
724+
725+
printItem (Static as vis ident ty m e x) = annotate x $ align $ printOuterAttrs as <#>
726+
hsep [ printVis vis, "static", printMutability m, printIdent ident <> ":", printType ty, "=", printExpr e <> ";" ]
727+
728+
printItem (ConstItem as vis ident t e x) = annotate x $ align $ printOuterAttrs as <#>
729+
hsep [ printVis vis, "const", printIdent ident <> ":", printType t, "=", printExpr e <> ";" ]
730+
731+
printItem (Fn as vis ident d s c a t b x) = annotate x $ align $ printOuterAttrs as <#>
732+
printFn d s c a (Just ident) t vis (Just (b, as))
733+
734+
printItem (Mod as vis ident items x) = annotate x $ align $ printOuterAttrs as <#>
735+
hsep [ printVis vis, "mod", printIdent ident, printMod items as ]
736+
737+
printItem (ForeignMod as vis a i x) = annotate x $ align $ printOuterAttrs as <#>
738+
hsep [ printVis vis, printAbi a, printForeignMod i as ]
739+
740+
printItem (TyAlias as vis ident ty ps x) = annotate x $ align $ printOuterAttrs as <#>
741+
let wc = printWhereClause True (whereClause ps)
742+
leading = printVis vis <+> "type" <+> printIdent ident <> printGenerics ps
743+
in case wc of
744+
WL.Empty -> group (leading <+> "=" <#> indent n (printType ty <> ";"))
745+
_ -> leading <#> wc <#> "=" <+> printType ty <> ";"
746+
747+
printItem (Enum as vis ident vars ps x) = annotate x $ align $ printOuterAttrs as <#>
748+
printEnumDef vars ps ident vis
749+
750+
printItem (StructItem as vis ident s g x) = annotate x $ align $ printOuterAttrs as <#>
751+
hsep [ printVis vis, "struct", printStruct s g ident True True ]
752+
753+
printItem (Union as vis ident s g x) = annotate x $ align $ printOuterAttrs as <#>
754+
hsep [ printVis vis, "union", printStruct s g ident True True ]
755+
756+
printItem (Trait as vis ident u g tys i x) = annotate x $ align $ printOuterAttrs as <#>
757+
let leading = hsep [ printVis vis, printUnsafety u, "trait"
758+
, printIdent ident <> printGenerics g <> printBounds ":" tys
759+
]
760+
lagging = block Brace False mempty (printInnerAttrs as) (printTraitItem `map` i)
761+
wc = printWhereClause True (whereClause g)
762+
in case wc of
763+
WL.Empty -> leading <+> lagging
764+
_ -> leading <#> wc <#> lagging
765+
766+
printItem (DefaultImpl as vis u t x) = annotate x $ align $ printOuterAttrs as <#>
767+
hsep [ printVis vis, printUnsafety u, "impl", printTraitRef t, "for", "..", "{ }" ]
768+
769+
printItem (Impl as vis d u p g t ty i x) = annotate x $ align $ printOuterAttrs as <#>
770+
let generics = case g of { Generics [] [] _ _ -> mempty; _ -> printGenerics g }
771+
traitref = perhaps (\t' -> printPolarity p <> printTraitRef t' <+> "for") t
772+
leading = hsep [ printVis vis, printDef d, printUnsafety u
773+
, "impl" <> generics, traitref, printType ty
774+
]
775+
lagging = block Brace False mempty (printInnerAttrs as) (printImplItem `map` i)
776+
wc = printWhereClause True (whereClause g)
777+
in case wc of
778+
WL.Empty -> leading <+> lagging
779+
_ -> leading <#> wc <#> lagging
780+
781+
printItem (MacItem as i (Mac p tts y) x) = annotate x $ annotate y $ align $ printOuterAttrs as <#>
782+
(printPath p True <> "!" <+> perhaps printIdent i <+> block Brace True mempty mempty [ printTts tts ])
783+
784+
printItem (MacroDef as i tts x) = annotate x $ align $ printOuterAttrs as <#>
785+
("macro_rules" <> "!" <+> printIdent i <+> block Brace True mempty mempty [ printTts tts ])
786+
755787

756788
-- | Print a trait item (@print_trait_item@)
757789
printTraitItem :: TraitItem a -> Doc a
758-
printTraitItem (TraitItem ident attrs node x) = annotate x $ printOuterAttrs attrs <#>
759-
case node of
760-
ConstT ty default_m -> printAssociatedConst ident ty default_m InheritedV
761-
MethodT sig block_m -> printMethodSig ident sig InheritedV (fmap (\b -> (b, attrs)) block_m)
762-
TypeT bounds default_m -> printAssociatedType ident (Just bounds) default_m
763-
MacroT m -> printMac m Paren <> ";"
790+
printTraitItem (ConstT as ident ty expr x) = annotate x $ printOuterAttrs as <#> printAssociatedConst ident ty expr InheritedV
791+
printTraitItem (MethodT as ident sig body x) = annotate x $ printOuterAttrs as <#> printMethodSig ident sig InheritedV (fmap (\b -> (b, as)) body)
792+
printTraitItem (TypeT as ident bounds ty x) = annotate x $ printOuterAttrs as <#> printAssociatedType ident (Just bounds) ty
793+
printTraitItem (MacroT as m x) = annotate x $ printOuterAttrs as <#> printMac m Paren <> ";"
764794

765795
-- | Print type parameter bounds with the given prefix, but only if there are any bounds (@print_bounds@)
766796
-- TODO: follow up on <https://github.com/rust-lang-nursery/fmt-rfcs/issues/80>
@@ -781,14 +811,19 @@ printFormalLifetimeList defs = "for" <> angles (align (fillSep (punctuate "," (p
781811

782812
-- | Print an impl item (@print_impl_item@)
783813
printImplItem :: ImplItem a -> Doc a
784-
printImplItem (ImplItem ident vis defaultness attrs node x) = annotate x $ printOuterAttrs attrs <#> hsep
785-
[ printVis vis, when (defaultness == Default) "default"
786-
, case node of
787-
ConstI ty expr -> printAssociatedConst ident ty (Just expr) InheritedV
788-
MethodI sig body -> printMethodSig ident sig InheritedV (Just (body, attrs))
789-
TypeI ty -> printAssociatedType ident Nothing (Just ty)
790-
MacroI m -> printMac m Paren <> ";"
791-
]
814+
printImplItem (ConstI as vis def ident ty expr x) = annotate x $ printOuterAttrs as <#>
815+
(printVis vis <+> printDef def <+> printAssociatedConst ident ty (Just expr) InheritedV)
816+
printImplItem (MethodI as vis def ident sig body x) = annotate x $ printOuterAttrs as <#>
817+
(printVis vis <+> printDef def <+> printMethodSig ident sig InheritedV (Just (body, as)))
818+
printImplItem (TypeI as vis def ident ty x) = annotate x $ printOuterAttrs as <#>
819+
(printVis vis <+> printDef def <+> printAssociatedType ident Nothing (Just ty))
820+
printImplItem (MacroI as def mac x) = annotate x $ printOuterAttrs as <#>
821+
(printDef def <+> printMac mac Paren <> ";")
822+
823+
-- | Print defaultness (@Defaultness@)
824+
printDef :: Defaultness -> Doc a
825+
printDef Default = "default"
826+
printDef Final = mempty
792827

793828
-- | Print an associated type (@printAssociatedType@)
794829
printAssociatedType :: Ident -> Maybe [TyParamBound a] -> Maybe (Ty a) -> Doc a
@@ -823,11 +858,10 @@ printVis InheritedV = mempty
823858

824859
-- | Print a foreign item (@print_foreign_item@)
825860
printForeignItem :: ForeignItem a -> Doc a
826-
printForeignItem (ForeignItem ident attrs node vis x) = annotate x $ printOuterAttrs attrs <+>
827-
case node of
828-
ForeignFn decl generics -> printFn decl Normal NotConst Rust (Just ident) generics vis Nothing
829-
ForeignStatic ty mut -> printVis vis <+> "static" <+> when mut "mut" <+> printIdent ident <> ":" <+> printType ty <> ";"
830-
861+
printForeignItem (ForeignFn attrs vis ident decl generics x) = annotate x $
862+
printOuterAttrs attrs <+> printFn decl Normal NotConst Rust (Just ident) generics vis Nothing
863+
printForeignItem (ForeignStatic attrs vis ident ty mut x) = annotate x $
864+
printOuterAttrs attrs <+> printVis vis <+> "static" <+> printMutability mut <+> printIdent ident <> ":" <+> printType ty <> ";"
831865

832866
-- | Print a struct definition (@print_struct@)
833867
printStruct :: VariantData a -> Generics a -> Ident -> Bool -> Bool -> Doc a

0 commit comments

Comments
 (0)