language-thrift 0.4.0.0 → 0.5.0.0
raw patch · 15 files changed
+1386/−721 lines, 15 filesdep +lensdep +transformersdep −mtldep ~parsersPVP ok
version bump matches the API change (PVP)
Dependencies added: lens, transformers
Dependencies removed: mtl
Dependency ranges changed: parsers
API changes (from Hackage documentation)
- Language.Thrift.Parser: fieldType :: (TokenParsing p, MonadPlus p) => ThriftParser p n FieldType
- Language.Thrift.Parser: function :: (TokenParsing p, MonadPlus p) => ThriftParser p n (Function n)
- Language.Thrift.Parser: instance (Functor p, MonadPlus p) => Alternative (ThriftParser p n)
- Language.Thrift.Parser: instance (Monad p, Functor p) => Applicative (ThriftParser p n)
- Language.Thrift.Parser: instance (MonadPlus p, CharParsing p) => CharParsing (ThriftParser p n)
- Language.Thrift.Parser: instance (MonadPlus p, Parsing p) => Parsing (ThriftParser p n)
- Language.Thrift.Parser: instance (TokenParsing p, MonadPlus p) => TokenParsing (ThriftParser p n)
- Language.Thrift.Parser: instance Eq ParserState
- Language.Thrift.Parser: instance Functor p => Functor (ThriftParser p n)
- Language.Thrift.Parser: instance Monad p => Monad (ThriftParser p n)
- Language.Thrift.Parser: instance MonadPlus p => MonadPlus (ThriftParser p n)
- Language.Thrift.Parser: instance Ord ParserState
- Language.Thrift.Parser: instance Show ParserState
- Language.Thrift.Pretty: fieldType :: Config -> FieldType -> Doc
- Language.Thrift.Pretty: function :: Config -> Function ann -> Doc
- Language.Thrift.Pretty: indentWidth :: Config -> Int
- Language.Thrift.Pretty: instance Eq Config
- Language.Thrift.Pretty: instance Ord Config
- Language.Thrift.Pretty: instance Show Config
- Language.Thrift.Types: constDocstring :: Definition srcAnnot -> Docstring
- Language.Thrift.Types: constName :: Definition srcAnnot -> Text
- Language.Thrift.Types: constSrcAnnot :: Definition srcAnnot -> srcAnnot
- Language.Thrift.Types: constType :: Definition srcAnnot -> FieldType
- Language.Thrift.Types: constValue :: Definition srcAnnot -> ConstValue
- Language.Thrift.Types: data FieldType
- Language.Thrift.Types: enumDefAnnotations :: EnumDef srcAnnot -> [TypeAnnotation]
- Language.Thrift.Types: enumDefDocstring :: EnumDef srcAnnot -> Docstring
- Language.Thrift.Types: enumDefName :: EnumDef srcAnnot -> Text
- Language.Thrift.Types: enumDefSrcAnnot :: EnumDef srcAnnot -> srcAnnot
- Language.Thrift.Types: enumDefValue :: EnumDef srcAnnot -> Maybe Integer
- Language.Thrift.Types: enumDocstring :: Type srcAnnot -> Docstring
- Language.Thrift.Types: enumName :: Type srcAnnot -> Text
- Language.Thrift.Types: enumSrcAnnot :: Type srcAnnot -> srcAnnot
- Language.Thrift.Types: enumValues :: Type srcAnnot -> [EnumDef srcAnnot]
- Language.Thrift.Types: exceptionDocstring :: Type srcAnnot -> Docstring
- Language.Thrift.Types: exceptionFields :: Type srcAnnot -> [Field srcAnnot]
- Language.Thrift.Types: exceptionName :: Type srcAnnot -> Text
- Language.Thrift.Types: exceptionSrcAnnot :: Type srcAnnot -> srcAnnot
- Language.Thrift.Types: fieldAnnotations :: Field srcAnnot -> [TypeAnnotation]
- Language.Thrift.Types: fieldDefault :: Field srcAnnot -> Maybe ConstValue
- Language.Thrift.Types: fieldDocstring :: Field srcAnnot -> Docstring
- Language.Thrift.Types: fieldIdentifier :: Field srcAnnot -> Maybe Integer
- Language.Thrift.Types: fieldName :: Field srcAnnot -> Text
- Language.Thrift.Types: fieldRequiredness :: Field srcAnnot -> Maybe FieldRequiredness
- Language.Thrift.Types: fieldSrcAnnot :: Field srcAnnot -> srcAnnot
- Language.Thrift.Types: fieldType :: Field srcAnnot -> FieldType
- Language.Thrift.Types: functionAnnotations :: Function srcAnnot -> [TypeAnnotation]
- Language.Thrift.Types: functionDocstring :: Function srcAnnot -> Docstring
- Language.Thrift.Types: functionExceptions :: Function srcAnnot -> Maybe [Field srcAnnot]
- Language.Thrift.Types: functionName :: Function srcAnnot -> Text
- Language.Thrift.Types: functionOneWay :: Function srcAnnot -> Bool
- Language.Thrift.Types: functionParameters :: Function srcAnnot -> [Field srcAnnot]
- Language.Thrift.Types: functionReturnType :: Function srcAnnot -> Maybe FieldType
- Language.Thrift.Types: functionSrcAnnot :: Function srcAnnot -> srcAnnot
- Language.Thrift.Types: includePath :: Header -> Text
- Language.Thrift.Types: instance Constructor C1_0ConstValue
- Language.Thrift.Types: instance Constructor C1_0Definition
- Language.Thrift.Types: instance Constructor C1_0EnumDef
- Language.Thrift.Types: instance Constructor C1_0Field
- Language.Thrift.Types: instance Constructor C1_0FieldRequiredness
- Language.Thrift.Types: instance Constructor C1_0FieldType
- Language.Thrift.Types: instance Constructor C1_0Function
- Language.Thrift.Types: instance Constructor C1_0Header
- Language.Thrift.Types: instance Constructor C1_0Program
- Language.Thrift.Types: instance Constructor C1_0Type
- Language.Thrift.Types: instance Constructor C1_0TypeAnnotation
- Language.Thrift.Types: instance Constructor C1_10FieldType
- Language.Thrift.Types: instance Constructor C1_11FieldType
- Language.Thrift.Types: instance Constructor C1_12FieldType
- Language.Thrift.Types: instance Constructor C1_1ConstValue
- Language.Thrift.Types: instance Constructor C1_1Definition
- Language.Thrift.Types: instance Constructor C1_1FieldRequiredness
- Language.Thrift.Types: instance Constructor C1_1FieldType
- Language.Thrift.Types: instance Constructor C1_1Header
- Language.Thrift.Types: instance Constructor C1_1Type
- Language.Thrift.Types: instance Constructor C1_2ConstValue
- Language.Thrift.Types: instance Constructor C1_2Definition
- Language.Thrift.Types: instance Constructor C1_2FieldType
- Language.Thrift.Types: instance Constructor C1_2Type
- Language.Thrift.Types: instance Constructor C1_3ConstValue
- Language.Thrift.Types: instance Constructor C1_3FieldType
- Language.Thrift.Types: instance Constructor C1_3Type
- Language.Thrift.Types: instance Constructor C1_4ConstValue
- Language.Thrift.Types: instance Constructor C1_4FieldType
- Language.Thrift.Types: instance Constructor C1_4Type
- Language.Thrift.Types: instance Constructor C1_5ConstValue
- Language.Thrift.Types: instance Constructor C1_5FieldType
- Language.Thrift.Types: instance Constructor C1_5Type
- Language.Thrift.Types: instance Constructor C1_6FieldType
- Language.Thrift.Types: instance Constructor C1_7FieldType
- Language.Thrift.Types: instance Constructor C1_8FieldType
- Language.Thrift.Types: instance Constructor C1_9FieldType
- Language.Thrift.Types: instance Data ConstValue
- Language.Thrift.Types: instance Data FieldRequiredness
- Language.Thrift.Types: instance Data FieldType
- Language.Thrift.Types: instance Data Header
- Language.Thrift.Types: instance Data TypeAnnotation
- Language.Thrift.Types: instance Data srcAnnot => Data (Definition srcAnnot)
- Language.Thrift.Types: instance Data srcAnnot => Data (EnumDef srcAnnot)
- Language.Thrift.Types: instance Data srcAnnot => Data (Field srcAnnot)
- Language.Thrift.Types: instance Data srcAnnot => Data (Function srcAnnot)
- Language.Thrift.Types: instance Data srcAnnot => Data (Program srcAnnot)
- Language.Thrift.Types: instance Data srcAnnot => Data (Type srcAnnot)
- Language.Thrift.Types: instance Datatype D1ConstValue
- Language.Thrift.Types: instance Datatype D1Definition
- Language.Thrift.Types: instance Datatype D1EnumDef
- Language.Thrift.Types: instance Datatype D1Field
- Language.Thrift.Types: instance Datatype D1FieldRequiredness
- Language.Thrift.Types: instance Datatype D1FieldType
- Language.Thrift.Types: instance Datatype D1Function
- Language.Thrift.Types: instance Datatype D1Header
- Language.Thrift.Types: instance Datatype D1Program
- Language.Thrift.Types: instance Datatype D1Type
- Language.Thrift.Types: instance Datatype D1TypeAnnotation
- Language.Thrift.Types: instance Eq ConstValue
- Language.Thrift.Types: instance Eq FieldRequiredness
- Language.Thrift.Types: instance Eq FieldType
- Language.Thrift.Types: instance Eq Header
- Language.Thrift.Types: instance Eq TypeAnnotation
- Language.Thrift.Types: instance Eq srcAnnot => Eq (Definition srcAnnot)
- Language.Thrift.Types: instance Eq srcAnnot => Eq (EnumDef srcAnnot)
- Language.Thrift.Types: instance Eq srcAnnot => Eq (Field srcAnnot)
- Language.Thrift.Types: instance Eq srcAnnot => Eq (Function srcAnnot)
- Language.Thrift.Types: instance Eq srcAnnot => Eq (Program srcAnnot)
- Language.Thrift.Types: instance Eq srcAnnot => Eq (Type srcAnnot)
- Language.Thrift.Types: instance Generic (Definition srcAnnot)
- Language.Thrift.Types: instance Generic (EnumDef srcAnnot)
- Language.Thrift.Types: instance Generic (Field srcAnnot)
- Language.Thrift.Types: instance Generic (Function srcAnnot)
- Language.Thrift.Types: instance Generic (Program srcAnnot)
- Language.Thrift.Types: instance Generic (Type srcAnnot)
- Language.Thrift.Types: instance Generic ConstValue
- Language.Thrift.Types: instance Generic FieldRequiredness
- Language.Thrift.Types: instance Generic FieldType
- Language.Thrift.Types: instance Generic Header
- Language.Thrift.Types: instance Generic TypeAnnotation
- Language.Thrift.Types: instance Ord ConstValue
- Language.Thrift.Types: instance Ord FieldRequiredness
- Language.Thrift.Types: instance Ord FieldType
- Language.Thrift.Types: instance Ord Header
- Language.Thrift.Types: instance Ord TypeAnnotation
- Language.Thrift.Types: instance Ord srcAnnot => Ord (Definition srcAnnot)
- Language.Thrift.Types: instance Ord srcAnnot => Ord (EnumDef srcAnnot)
- Language.Thrift.Types: instance Ord srcAnnot => Ord (Field srcAnnot)
- Language.Thrift.Types: instance Ord srcAnnot => Ord (Function srcAnnot)
- Language.Thrift.Types: instance Ord srcAnnot => Ord (Program srcAnnot)
- Language.Thrift.Types: instance Ord srcAnnot => Ord (Type srcAnnot)
- Language.Thrift.Types: instance Selector S1_0_0Definition
- Language.Thrift.Types: instance Selector S1_0_0EnumDef
- Language.Thrift.Types: instance Selector S1_0_0Field
- Language.Thrift.Types: instance Selector S1_0_0Function
- Language.Thrift.Types: instance Selector S1_0_0Header
- Language.Thrift.Types: instance Selector S1_0_0Program
- Language.Thrift.Types: instance Selector S1_0_0Type
- Language.Thrift.Types: instance Selector S1_0_0TypeAnnotation
- Language.Thrift.Types: instance Selector S1_0_1Definition
- Language.Thrift.Types: instance Selector S1_0_1EnumDef
- Language.Thrift.Types: instance Selector S1_0_1Field
- Language.Thrift.Types: instance Selector S1_0_1Function
- Language.Thrift.Types: instance Selector S1_0_1Program
- Language.Thrift.Types: instance Selector S1_0_1Type
- Language.Thrift.Types: instance Selector S1_0_1TypeAnnotation
- Language.Thrift.Types: instance Selector S1_0_2Definition
- Language.Thrift.Types: instance Selector S1_0_2EnumDef
- Language.Thrift.Types: instance Selector S1_0_2Field
- Language.Thrift.Types: instance Selector S1_0_2Function
- Language.Thrift.Types: instance Selector S1_0_2Type
- Language.Thrift.Types: instance Selector S1_0_3Definition
- Language.Thrift.Types: instance Selector S1_0_3EnumDef
- Language.Thrift.Types: instance Selector S1_0_3Field
- Language.Thrift.Types: instance Selector S1_0_3Function
- Language.Thrift.Types: instance Selector S1_0_3Type
- Language.Thrift.Types: instance Selector S1_0_4Definition
- Language.Thrift.Types: instance Selector S1_0_4EnumDef
- Language.Thrift.Types: instance Selector S1_0_4Field
- Language.Thrift.Types: instance Selector S1_0_4Function
- Language.Thrift.Types: instance Selector S1_0_5Field
- Language.Thrift.Types: instance Selector S1_0_5Function
- Language.Thrift.Types: instance Selector S1_0_6Field
- Language.Thrift.Types: instance Selector S1_0_6Function
- Language.Thrift.Types: instance Selector S1_0_7Field
- Language.Thrift.Types: instance Selector S1_0_7Function
- Language.Thrift.Types: instance Selector S1_1_0Definition
- Language.Thrift.Types: instance Selector S1_1_0Header
- Language.Thrift.Types: instance Selector S1_1_0Type
- Language.Thrift.Types: instance Selector S1_1_1Definition
- Language.Thrift.Types: instance Selector S1_1_1Header
- Language.Thrift.Types: instance Selector S1_1_1Type
- Language.Thrift.Types: instance Selector S1_1_2Type
- Language.Thrift.Types: instance Selector S1_1_3Type
- Language.Thrift.Types: instance Selector S1_2_0Definition
- Language.Thrift.Types: instance Selector S1_2_0Type
- Language.Thrift.Types: instance Selector S1_2_1Definition
- Language.Thrift.Types: instance Selector S1_2_1Type
- Language.Thrift.Types: instance Selector S1_2_2Definition
- Language.Thrift.Types: instance Selector S1_2_2Type
- Language.Thrift.Types: instance Selector S1_2_3Definition
- Language.Thrift.Types: instance Selector S1_2_3Type
- Language.Thrift.Types: instance Selector S1_2_4Definition
- Language.Thrift.Types: instance Selector S1_2_5Definition
- Language.Thrift.Types: instance Selector S1_3_0Type
- Language.Thrift.Types: instance Selector S1_3_1Type
- Language.Thrift.Types: instance Selector S1_3_2Type
- Language.Thrift.Types: instance Selector S1_3_3Type
- Language.Thrift.Types: instance Selector S1_4_0Type
- Language.Thrift.Types: instance Selector S1_4_1Type
- Language.Thrift.Types: instance Selector S1_4_2Type
- Language.Thrift.Types: instance Selector S1_4_3Type
- Language.Thrift.Types: instance Selector S1_5_0Type
- Language.Thrift.Types: instance Selector S1_5_1Type
- Language.Thrift.Types: instance Selector S1_5_2Type
- Language.Thrift.Types: instance Selector S1_5_3Type
- Language.Thrift.Types: instance Show ConstValue
- Language.Thrift.Types: instance Show FieldRequiredness
- Language.Thrift.Types: instance Show FieldType
- Language.Thrift.Types: instance Show Header
- Language.Thrift.Types: instance Show TypeAnnotation
- Language.Thrift.Types: instance Show srcAnnot => Show (Definition srcAnnot)
- Language.Thrift.Types: instance Show srcAnnot => Show (EnumDef srcAnnot)
- Language.Thrift.Types: instance Show srcAnnot => Show (Field srcAnnot)
- Language.Thrift.Types: instance Show srcAnnot => Show (Function srcAnnot)
- Language.Thrift.Types: instance Show srcAnnot => Show (Program srcAnnot)
- Language.Thrift.Types: instance Show srcAnnot => Show (Type srcAnnot)
- Language.Thrift.Types: instance Typeable ConstValue
- Language.Thrift.Types: instance Typeable Definition
- Language.Thrift.Types: instance Typeable EnumDef
- Language.Thrift.Types: instance Typeable Field
- Language.Thrift.Types: instance Typeable FieldRequiredness
- Language.Thrift.Types: instance Typeable FieldType
- Language.Thrift.Types: instance Typeable Function
- Language.Thrift.Types: instance Typeable Header
- Language.Thrift.Types: instance Typeable Program
- Language.Thrift.Types: instance Typeable Type
- Language.Thrift.Types: instance Typeable TypeAnnotation
- Language.Thrift.Types: namespaceLanguage :: Header -> Text
- Language.Thrift.Types: namespaceName :: Header -> Text
- Language.Thrift.Types: programDefinitions :: Program srcAnnot -> [Definition srcAnnot]
- Language.Thrift.Types: programHeaders :: Program srcAnnot -> [Header]
- Language.Thrift.Types: senumDocstring :: Type srcAnnot -> Docstring
- Language.Thrift.Types: senumName :: Type srcAnnot -> Text
- Language.Thrift.Types: senumSrcAnnot :: Type srcAnnot -> srcAnnot
- Language.Thrift.Types: senumValues :: Type srcAnnot -> [Text]
- Language.Thrift.Types: serviceAnnotations :: Definition srcAnnot -> [TypeAnnotation]
- Language.Thrift.Types: serviceDocstring :: Definition srcAnnot -> Docstring
- Language.Thrift.Types: serviceExtends :: Definition srcAnnot -> Maybe Text
- Language.Thrift.Types: serviceFunctions :: Definition srcAnnot -> [Function srcAnnot]
- Language.Thrift.Types: serviceName :: Definition srcAnnot -> Text
- Language.Thrift.Types: serviceSrcAnnot :: Definition srcAnnot -> srcAnnot
- Language.Thrift.Types: structDocstring :: Type srcAnnot -> Docstring
- Language.Thrift.Types: structFields :: Type srcAnnot -> [Field srcAnnot]
- Language.Thrift.Types: structName :: Type srcAnnot -> Text
- Language.Thrift.Types: structSrcAnnot :: Type srcAnnot -> srcAnnot
- Language.Thrift.Types: typeAnnotationName :: TypeAnnotation -> Text
- Language.Thrift.Types: typeAnnotationValue :: TypeAnnotation -> Text
- Language.Thrift.Types: typeAnnotations :: Definition srcAnnot -> [TypeAnnotation]
- Language.Thrift.Types: typeDefinition :: Definition srcAnnot -> Type srcAnnot
- Language.Thrift.Types: typedefDocstring :: Type srcAnnot -> Docstring
- Language.Thrift.Types: typedefName :: Type srcAnnot -> Text
- Language.Thrift.Types: typedefSrcAnnot :: Type srcAnnot -> srcAnnot
- Language.Thrift.Types: typedefType :: Type srcAnnot -> FieldType
- Language.Thrift.Types: unionDocstring :: Type srcAnnot -> Docstring
- Language.Thrift.Types: unionFields :: Type srcAnnot -> [Field srcAnnot]
- Language.Thrift.Types: unionName :: Type srcAnnot -> Text
- Language.Thrift.Types: unionSrcAnnot :: Type srcAnnot -> srcAnnot
+ Language.Thrift.Parser: constant :: (TokenParsing p, MonadPlus p) => ThriftParser p n (Const n)
+ Language.Thrift.Parser: enum :: (TokenParsing p, MonadPlus p) => ThriftParser p n (Enum n)
+ Language.Thrift.Parser: exception :: (TokenParsing p, MonadPlus p) => ThriftParser p n (Exception n)
+ Language.Thrift.Parser: include :: (TokenParsing p, MonadPlus p) => ThriftParser p n (Include n)
+ Language.Thrift.Parser: instance (GHC.Base.MonadPlus p, Text.Parser.Char.CharParsing p) => Text.Parser.Char.CharParsing (Language.Thrift.Parser.ThriftParser p n)
+ Language.Thrift.Parser: instance (GHC.Base.MonadPlus p, Text.Parser.Combinators.Parsing p) => Text.Parser.Combinators.Parsing (Language.Thrift.Parser.ThriftParser p n)
+ Language.Thrift.Parser: instance (Text.Parser.Token.TokenParsing p, GHC.Base.MonadPlus p) => Text.Parser.Token.TokenParsing (Language.Thrift.Parser.ThriftParser p n)
+ Language.Thrift.Parser: instance GHC.Base.Functor p => GHC.Base.Functor (Language.Thrift.Parser.ThriftParser p n)
+ Language.Thrift.Parser: instance GHC.Base.Monad p => GHC.Base.Applicative (Language.Thrift.Parser.ThriftParser p n)
+ Language.Thrift.Parser: instance GHC.Base.Monad p => GHC.Base.Monad (Language.Thrift.Parser.ThriftParser p n)
+ Language.Thrift.Parser: instance GHC.Base.MonadPlus p => GHC.Base.Alternative (Language.Thrift.Parser.ThriftParser p n)
+ Language.Thrift.Parser: instance GHC.Base.MonadPlus p => GHC.Base.MonadPlus (Language.Thrift.Parser.ThriftParser p n)
+ Language.Thrift.Parser: instance GHC.Classes.Eq Language.Thrift.Parser.ParserState
+ Language.Thrift.Parser: instance GHC.Classes.Ord Language.Thrift.Parser.ParserState
+ Language.Thrift.Parser: instance GHC.Show.Show Language.Thrift.Parser.ParserState
+ Language.Thrift.Parser: namespace :: (TokenParsing p, MonadPlus p) => ThriftParser p n (Namespace n)
+ Language.Thrift.Parser: senum :: (TokenParsing p, MonadPlus p) => ThriftParser p n (Senum n)
+ Language.Thrift.Parser: service :: (TokenParsing p, MonadPlus p) => ThriftParser p n (Service n)
+ Language.Thrift.Parser: struct :: (TokenParsing p, MonadPlus p) => ThriftParser p n (Struct n)
+ Language.Thrift.Parser: typeDefinition :: (TokenParsing p, MonadPlus p) => ThriftParser p n (Type n)
+ Language.Thrift.Parser: typeReference :: (TokenParsing p, MonadPlus p) => ThriftParser p n (TypeReference n)
+ Language.Thrift.Parser: typedef :: (TokenParsing p, MonadPlus p) => ThriftParser p n (Typedef n)
+ Language.Thrift.Parser: union :: (TokenParsing p, MonadPlus p) => ThriftParser p n (Union n)
+ Language.Thrift.Pretty: [indentWidth] :: Config -> Int
+ Language.Thrift.Pretty: constant :: Config -> Const ann -> Doc
+ Language.Thrift.Pretty: enum :: Config -> Enum ann -> Doc
+ Language.Thrift.Pretty: exception :: Config -> Exception ann -> Doc
+ Language.Thrift.Pretty: include :: Include ann -> Doc
+ Language.Thrift.Pretty: instance GHC.Classes.Eq Language.Thrift.Pretty.Config
+ Language.Thrift.Pretty: instance GHC.Classes.Ord Language.Thrift.Pretty.Config
+ Language.Thrift.Pretty: instance GHC.Show.Show Language.Thrift.Pretty.Config
+ Language.Thrift.Pretty: namespace :: Namespace ann -> Doc
+ Language.Thrift.Pretty: senum :: Config -> Senum ann -> Doc
+ Language.Thrift.Pretty: service :: Config -> Service ann -> Doc
+ Language.Thrift.Pretty: struct :: Config -> Struct ann -> Doc
+ Language.Thrift.Pretty: typeDefinition :: Config -> Type ann -> Doc
+ Language.Thrift.Pretty: typeReference :: Config -> TypeReference ann -> Doc
+ Language.Thrift.Pretty: typedef :: Config -> Typedef ann -> Doc
+ Language.Thrift.Pretty: union :: Config -> Union ann -> Doc
+ Language.Thrift.Types: Const :: TypeReference srcAnnot -> Text -> ConstValue srcAnnot -> Docstring -> srcAnnot -> Const srcAnnot
+ Language.Thrift.Types: EnumType :: (Enum srcAnnot) -> Type srcAnnot
+ Language.Thrift.Types: ExceptionType :: (Exception srcAnnot) -> Type srcAnnot
+ Language.Thrift.Types: HeaderInclude :: (Include srcAnnot) -> Header srcAnnot
+ Language.Thrift.Types: HeaderNamespace :: (Namespace srcAnnot) -> Header srcAnnot
+ Language.Thrift.Types: SenumType :: (Senum srcAnnot) -> Type srcAnnot
+ Language.Thrift.Types: Service :: Text -> Maybe Text -> [Function srcAnnot] -> [TypeAnnotation] -> Docstring -> srcAnnot -> Service srcAnnot
+ Language.Thrift.Types: StructType :: (Struct srcAnnot) -> Type srcAnnot
+ Language.Thrift.Types: TypedefType :: (Typedef srcAnnot) -> Type srcAnnot
+ Language.Thrift.Types: UnionType :: (Union srcAnnot) -> Type srcAnnot
+ Language.Thrift.Types: [constDocstring] :: Const srcAnnot -> Docstring
+ Language.Thrift.Types: [constName] :: Const srcAnnot -> Text
+ Language.Thrift.Types: [constSrcAnnot] :: Const srcAnnot -> srcAnnot
+ Language.Thrift.Types: [constValueType] :: Const srcAnnot -> TypeReference srcAnnot
+ Language.Thrift.Types: [constValue] :: Const srcAnnot -> ConstValue srcAnnot
+ Language.Thrift.Types: [enumAnnotations] :: Enum srcAnnot -> [TypeAnnotation]
+ Language.Thrift.Types: [enumDefAnnotations] :: EnumDef srcAnnot -> [TypeAnnotation]
+ Language.Thrift.Types: [enumDefDocstring] :: EnumDef srcAnnot -> Docstring
+ Language.Thrift.Types: [enumDefName] :: EnumDef srcAnnot -> Text
+ Language.Thrift.Types: [enumDefSrcAnnot] :: EnumDef srcAnnot -> srcAnnot
+ Language.Thrift.Types: [enumDefValue] :: EnumDef srcAnnot -> Maybe Integer
+ Language.Thrift.Types: [enumDocstring] :: Enum srcAnnot -> Docstring
+ Language.Thrift.Types: [enumName] :: Enum srcAnnot -> Text
+ Language.Thrift.Types: [enumSrcAnnot] :: Enum srcAnnot -> srcAnnot
+ Language.Thrift.Types: [enumValues] :: Enum srcAnnot -> [EnumDef srcAnnot]
+ Language.Thrift.Types: [exceptionAnnotations] :: Exception srcAnnot -> [TypeAnnotation]
+ Language.Thrift.Types: [exceptionDocstring] :: Exception srcAnnot -> Docstring
+ Language.Thrift.Types: [exceptionFields] :: Exception srcAnnot -> [Field srcAnnot]
+ Language.Thrift.Types: [exceptionName] :: Exception srcAnnot -> Text
+ Language.Thrift.Types: [exceptionSrcAnnot] :: Exception srcAnnot -> srcAnnot
+ Language.Thrift.Types: [fieldAnnotations] :: Field srcAnnot -> [TypeAnnotation]
+ Language.Thrift.Types: [fieldDefaultValue] :: Field srcAnnot -> Maybe (ConstValue srcAnnot)
+ Language.Thrift.Types: [fieldDocstring] :: Field srcAnnot -> Docstring
+ Language.Thrift.Types: [fieldIdentifier] :: Field srcAnnot -> Maybe Integer
+ Language.Thrift.Types: [fieldName] :: Field srcAnnot -> Text
+ Language.Thrift.Types: [fieldRequiredness] :: Field srcAnnot -> Maybe FieldRequiredness
+ Language.Thrift.Types: [fieldSrcAnnot] :: Field srcAnnot -> srcAnnot
+ Language.Thrift.Types: [fieldValueType] :: Field srcAnnot -> TypeReference srcAnnot
+ Language.Thrift.Types: [functionAnnotations] :: Function srcAnnot -> [TypeAnnotation]
+ Language.Thrift.Types: [functionDocstring] :: Function srcAnnot -> Docstring
+ Language.Thrift.Types: [functionExceptions] :: Function srcAnnot -> Maybe [Field srcAnnot]
+ Language.Thrift.Types: [functionName] :: Function srcAnnot -> Text
+ Language.Thrift.Types: [functionOneWay] :: Function srcAnnot -> Bool
+ Language.Thrift.Types: [functionParameters] :: Function srcAnnot -> [Field srcAnnot]
+ Language.Thrift.Types: [functionReturnType] :: Function srcAnnot -> Maybe (TypeReference srcAnnot)
+ Language.Thrift.Types: [functionSrcAnnot] :: Function srcAnnot -> srcAnnot
+ Language.Thrift.Types: [includePath] :: Include srcAnnot -> Text
+ Language.Thrift.Types: [includeSrcAnnot] :: Include srcAnnot -> srcAnnot
+ Language.Thrift.Types: [namespaceLanguage] :: Namespace srcAnnot -> Text
+ Language.Thrift.Types: [namespaceName] :: Namespace srcAnnot -> Text
+ Language.Thrift.Types: [namespaceSrcAnnot] :: Namespace srcAnnot -> srcAnnot
+ Language.Thrift.Types: [programDefinitions] :: Program srcAnnot -> [Definition srcAnnot]
+ Language.Thrift.Types: [programHeaders] :: Program srcAnnot -> [Header srcAnnot]
+ Language.Thrift.Types: [senumAnnotations] :: Senum srcAnnot -> [TypeAnnotation]
+ Language.Thrift.Types: [senumDocstring] :: Senum srcAnnot -> Docstring
+ Language.Thrift.Types: [senumName] :: Senum srcAnnot -> Text
+ Language.Thrift.Types: [senumSrcAnnot] :: Senum srcAnnot -> srcAnnot
+ Language.Thrift.Types: [senumValues] :: Senum srcAnnot -> [Text]
+ Language.Thrift.Types: [serviceAnnotations] :: Service srcAnnot -> [TypeAnnotation]
+ Language.Thrift.Types: [serviceDocstring] :: Service srcAnnot -> Docstring
+ Language.Thrift.Types: [serviceExtends] :: Service srcAnnot -> Maybe Text
+ Language.Thrift.Types: [serviceFunctions] :: Service srcAnnot -> [Function srcAnnot]
+ Language.Thrift.Types: [serviceName] :: Service srcAnnot -> Text
+ Language.Thrift.Types: [serviceSrcAnnot] :: Service srcAnnot -> srcAnnot
+ Language.Thrift.Types: [structAnnotations] :: Struct srcAnnot -> [TypeAnnotation]
+ Language.Thrift.Types: [structDocstring] :: Struct srcAnnot -> Docstring
+ Language.Thrift.Types: [structFields] :: Struct srcAnnot -> [Field srcAnnot]
+ Language.Thrift.Types: [structName] :: Struct srcAnnot -> Text
+ Language.Thrift.Types: [structSrcAnnot] :: Struct srcAnnot -> srcAnnot
+ Language.Thrift.Types: [typeAnnotationName] :: TypeAnnotation -> Text
+ Language.Thrift.Types: [typeAnnotationValue] :: TypeAnnotation -> Maybe Text
+ Language.Thrift.Types: [typedefAnnotations] :: Typedef srcAnnot -> [TypeAnnotation]
+ Language.Thrift.Types: [typedefDocstring] :: Typedef srcAnnot -> Docstring
+ Language.Thrift.Types: [typedefName] :: Typedef srcAnnot -> Text
+ Language.Thrift.Types: [typedefSrcAnnot] :: Typedef srcAnnot -> srcAnnot
+ Language.Thrift.Types: [typedefTargetType] :: Typedef srcAnnot -> TypeReference srcAnnot
+ Language.Thrift.Types: [unionAnnotations] :: Union srcAnnot -> [TypeAnnotation]
+ Language.Thrift.Types: [unionDocstring] :: Union srcAnnot -> Docstring
+ Language.Thrift.Types: [unionFields] :: Union srcAnnot -> [Field srcAnnot]
+ Language.Thrift.Types: [unionName] :: Union srcAnnot -> Text
+ Language.Thrift.Types: [unionSrcAnnot] :: Union srcAnnot -> srcAnnot
+ Language.Thrift.Types: _BinaryType :: Prism' (TypeReference srcAnnot_adud) [TypeAnnotation]
+ Language.Thrift.Types: _BoolType :: Prism' (TypeReference srcAnnot_adud) [TypeAnnotation]
+ Language.Thrift.Types: _ByteType :: Prism' (TypeReference srcAnnot_adud) [TypeAnnotation]
+ Language.Thrift.Types: _Const :: Prism' (Definition ann) (Const ann)
+ Language.Thrift.Types: _ConstFloat :: Prism' (ConstValue srcAnnot_acUE) Double
+ Language.Thrift.Types: _ConstIdentifier :: Prism' (ConstValue srcAnnot_acUE) (Text, srcAnnot_acUE)
+ Language.Thrift.Types: _ConstInt :: Prism' (ConstValue srcAnnot_acUE) Integer
+ Language.Thrift.Types: _ConstList :: Prism' (ConstValue srcAnnot_acUE) [ConstValue srcAnnot_acUE]
+ Language.Thrift.Types: _ConstLiteral :: Prism' (ConstValue srcAnnot_acUE) Text
+ Language.Thrift.Types: _ConstMap :: Prism' (ConstValue srcAnnot_acUE) [(ConstValue srcAnnot_acUE, ConstValue srcAnnot_acUE)]
+ Language.Thrift.Types: _DefinedType :: Prism' (TypeReference srcAnnot_adud) (Text, srcAnnot_adud)
+ Language.Thrift.Types: _DoubleType :: Prism' (TypeReference srcAnnot_adud) [TypeAnnotation]
+ Language.Thrift.Types: _Enum :: Prism' (Type ann) (Enum ann)
+ Language.Thrift.Types: _Exception :: Prism' (Type ann) (Exception ann)
+ Language.Thrift.Types: _I16Type :: Prism' (TypeReference srcAnnot_adud) [TypeAnnotation]
+ Language.Thrift.Types: _I32Type :: Prism' (TypeReference srcAnnot_adud) [TypeAnnotation]
+ Language.Thrift.Types: _I64Type :: Prism' (TypeReference srcAnnot_adud) [TypeAnnotation]
+ Language.Thrift.Types: _Include :: Prism' (Header ann) (Include ann)
+ Language.Thrift.Types: _ListType :: Prism' (TypeReference srcAnnot_adud) (TypeReference srcAnnot_adud, [TypeAnnotation])
+ Language.Thrift.Types: _MapType :: Prism' (TypeReference srcAnnot_adud) (TypeReference srcAnnot_adud, TypeReference srcAnnot_adud, [TypeAnnotation])
+ Language.Thrift.Types: _Namespace :: Prism' (Header ann) (Namespace ann)
+ Language.Thrift.Types: _Optional :: Prism' FieldRequiredness ()
+ Language.Thrift.Types: _Required :: Prism' FieldRequiredness ()
+ Language.Thrift.Types: _SListType :: Prism' (TypeReference srcAnnot_adud) [TypeAnnotation]
+ Language.Thrift.Types: _Senum :: Prism' (Type ann) (Senum ann)
+ Language.Thrift.Types: _Service :: Prism' (Definition ann) (Service ann)
+ Language.Thrift.Types: _SetType :: Prism' (TypeReference srcAnnot_adud) (TypeReference srcAnnot_adud, [TypeAnnotation])
+ Language.Thrift.Types: _StringType :: Prism' (TypeReference srcAnnot_adud) [TypeAnnotation]
+ Language.Thrift.Types: _Struct :: Prism' (Type ann) (Struct ann)
+ Language.Thrift.Types: _Type :: Prism' (Definition ann) (Type ann)
+ Language.Thrift.Types: _Typedef :: Prism' (Type ann) (Typedef ann)
+ Language.Thrift.Types: _Union :: Prism' (Type ann) (Union ann)
+ Language.Thrift.Types: annotations :: HasAnnotations s a => Lens' s a
+ Language.Thrift.Types: class HasAnnotations s a | s -> a
+ Language.Thrift.Types: class HasDefaultValue s a | s -> a
+ Language.Thrift.Types: class HasDefinitions s a | s -> a
+ Language.Thrift.Types: class HasDocstring s a | s -> a
+ Language.Thrift.Types: class HasExceptions s a | s -> a
+ Language.Thrift.Types: class HasExtends s a | s -> a
+ Language.Thrift.Types: class HasFields s a | s -> a
+ Language.Thrift.Types: class HasFunctions s a | s -> a
+ Language.Thrift.Types: class HasHeaders s a | s -> a
+ Language.Thrift.Types: class HasIdentifier s a | s -> a
+ Language.Thrift.Types: class HasLanguage s a | s -> a
+ Language.Thrift.Types: class HasName s a | s -> a
+ Language.Thrift.Types: class HasOneWay s a | s -> a
+ Language.Thrift.Types: class HasParameters s a | s -> a
+ Language.Thrift.Types: class HasPath s a | s -> a
+ Language.Thrift.Types: class HasRequiredness s a | s -> a
+ Language.Thrift.Types: class HasReturnType s a | s -> a
+ Language.Thrift.Types: class HasSrcAnnot s a | s -> a
+ Language.Thrift.Types: class HasTargetType s a | s -> a
+ Language.Thrift.Types: class HasValue s a | s -> a
+ Language.Thrift.Types: class HasValueType s a | s -> a
+ Language.Thrift.Types: class HasValues s a | s -> a
+ Language.Thrift.Types: data Const srcAnnot
+ Language.Thrift.Types: data Enum srcAnnot
+ Language.Thrift.Types: data Exception srcAnnot
+ Language.Thrift.Types: data Include srcAnnot
+ Language.Thrift.Types: data Namespace srcAnnot
+ Language.Thrift.Types: data Senum srcAnnot
+ Language.Thrift.Types: data Service srcAnnot
+ Language.Thrift.Types: data Struct srcAnnot
+ Language.Thrift.Types: data TypeReference srcAnnot
+ Language.Thrift.Types: data Typedef srcAnnot
+ Language.Thrift.Types: data Union srcAnnot
+ Language.Thrift.Types: defaultValue :: HasDefaultValue s a => Lens' s a
+ Language.Thrift.Types: definitions :: HasDefinitions s a => Lens' s a
+ Language.Thrift.Types: docstring :: HasDocstring s a => Lens' s a
+ Language.Thrift.Types: exceptions :: HasExceptions s a => Lens' s a
+ Language.Thrift.Types: extends :: HasExtends s a => Lens' s a
+ Language.Thrift.Types: fields :: HasFields s a => Lens' s a
+ Language.Thrift.Types: functions :: HasFunctions s a => Lens' s a
+ Language.Thrift.Types: headers :: HasHeaders s a => Lens' s a
+ Language.Thrift.Types: identifier :: HasIdentifier s a => Lens' s a
+ Language.Thrift.Types: instance Data.Data.Data Language.Thrift.Types.FieldRequiredness
+ Language.Thrift.Types: instance Data.Data.Data Language.Thrift.Types.TypeAnnotation
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Const srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.ConstValue srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Definition srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Enum srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.EnumDef srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Exception srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Field srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Function srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Header srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Include srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Namespace srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Program srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Senum srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Service srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Struct srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Type srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.TypeReference srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Typedef srcAnnot)
+ Language.Thrift.Types: instance Data.Data.Data srcAnnot => Data.Data.Data (Language.Thrift.Types.Union srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq Language.Thrift.Types.FieldRequiredness
+ Language.Thrift.Types: instance GHC.Classes.Eq Language.Thrift.Types.TypeAnnotation
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Const srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.ConstValue srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Definition srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Enum srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.EnumDef srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Exception srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Field srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Function srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Header srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Include srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Namespace srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Program srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Senum srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Service srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Struct srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Type srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.TypeReference srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Typedef srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Eq srcAnnot => GHC.Classes.Eq (Language.Thrift.Types.Union srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord Language.Thrift.Types.FieldRequiredness
+ Language.Thrift.Types: instance GHC.Classes.Ord Language.Thrift.Types.TypeAnnotation
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Const srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.ConstValue srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Definition srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Enum srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.EnumDef srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Exception srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Field srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Function srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Header srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Include srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Namespace srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Program srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Senum srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Service srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Struct srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Type srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.TypeReference srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Typedef srcAnnot)
+ Language.Thrift.Types: instance GHC.Classes.Ord srcAnnot => GHC.Classes.Ord (Language.Thrift.Types.Union srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Const
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0ConstValue
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Definition
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Enum
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0EnumDef
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Exception
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Field
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0FieldRequiredness
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Function
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Header
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Include
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Namespace
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Program
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Senum
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Service
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Struct
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Type
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0TypeAnnotation
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0TypeReference
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Typedef
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_0Union
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_10TypeReference
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_11TypeReference
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_12TypeReference
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_1ConstValue
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_1Definition
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_1FieldRequiredness
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_1Header
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_1Type
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_1TypeReference
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_2ConstValue
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_2Definition
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_2Type
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_2TypeReference
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_3ConstValue
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_3Type
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_3TypeReference
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_4ConstValue
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_4Type
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_4TypeReference
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_5ConstValue
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_5Type
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_5TypeReference
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_6TypeReference
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_7TypeReference
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_8TypeReference
+ Language.Thrift.Types: instance GHC.Generics.Constructor Language.Thrift.Types.C1_9TypeReference
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Const
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1ConstValue
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Definition
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Enum
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1EnumDef
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Exception
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Field
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1FieldRequiredness
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Function
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Header
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Include
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Namespace
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Program
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Senum
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Service
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Struct
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Type
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1TypeAnnotation
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1TypeReference
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Typedef
+ Language.Thrift.Types: instance GHC.Generics.Datatype Language.Thrift.Types.D1Union
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Const srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.ConstValue srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Definition srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Enum srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.EnumDef srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Exception srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Field srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Function srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Header srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Include srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Namespace srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Program srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Senum srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Service srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Struct srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Type srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.TypeReference srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Typedef srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic (Language.Thrift.Types.Union srcAnnot)
+ Language.Thrift.Types: instance GHC.Generics.Generic Language.Thrift.Types.FieldRequiredness
+ Language.Thrift.Types: instance GHC.Generics.Generic Language.Thrift.Types.TypeAnnotation
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_0Const
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_0Enum
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_0EnumDef
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_0Exception
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_0Field
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_0Function
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_0Include
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_0Namespace
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_0Program
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_0Senum
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_0Service
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_0Struct
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_0TypeAnnotation
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_0Typedef
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_0Union
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_1Const
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_1Enum
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_1EnumDef
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_1Exception
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_1Field
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_1Function
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_1Include
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_1Namespace
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_1Program
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_1Senum
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_1Service
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_1Struct
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_1TypeAnnotation
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_1Typedef
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_1Union
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_2Const
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_2Enum
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_2EnumDef
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_2Exception
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_2Field
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_2Function
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_2Namespace
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_2Senum
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_2Service
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_2Struct
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_2Typedef
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_2Union
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_3Const
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_3Enum
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_3EnumDef
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_3Exception
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_3Field
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_3Function
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_3Senum
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_3Service
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_3Struct
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_3Typedef
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_3Union
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_4Const
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_4Enum
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_4EnumDef
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_4Exception
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_4Field
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_4Function
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_4Senum
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_4Service
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_4Struct
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_4Typedef
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_4Union
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_5Field
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_5Function
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_5Service
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_6Field
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_6Function
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_7Field
+ Language.Thrift.Types: instance GHC.Generics.Selector Language.Thrift.Types.S1_0_7Function
+ Language.Thrift.Types: instance GHC.Show.Show Language.Thrift.Types.FieldRequiredness
+ Language.Thrift.Types: instance GHC.Show.Show Language.Thrift.Types.TypeAnnotation
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Const srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.ConstValue srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Definition srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Enum srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.EnumDef srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Exception srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Field srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Function srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Header srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Include srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Namespace srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Program srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Senum srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Service srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Struct srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Type srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.TypeReference srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Typedef srcAnnot)
+ Language.Thrift.Types: instance GHC.Show.Show srcAnnot => GHC.Show.Show (Language.Thrift.Types.Union srcAnnot)
+ Language.Thrift.Types: instance Language.Thrift.Types.HasAnnotations (Language.Thrift.Types.Enum srcAnnot0) [Language.Thrift.Types.TypeAnnotation]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasAnnotations (Language.Thrift.Types.EnumDef srcAnnot0) [Language.Thrift.Types.TypeAnnotation]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasAnnotations (Language.Thrift.Types.Exception srcAnnot0) [Language.Thrift.Types.TypeAnnotation]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasAnnotations (Language.Thrift.Types.Field srcAnnot0) [Language.Thrift.Types.TypeAnnotation]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasAnnotations (Language.Thrift.Types.Function srcAnnot0) [Language.Thrift.Types.TypeAnnotation]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasAnnotations (Language.Thrift.Types.Senum srcAnnot0) [Language.Thrift.Types.TypeAnnotation]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasAnnotations (Language.Thrift.Types.Service srcAnnot0) [Language.Thrift.Types.TypeAnnotation]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasAnnotations (Language.Thrift.Types.Struct srcAnnot0) [Language.Thrift.Types.TypeAnnotation]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasAnnotations (Language.Thrift.Types.Typedef srcAnnot0) [Language.Thrift.Types.TypeAnnotation]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasAnnotations (Language.Thrift.Types.Union srcAnnot0) [Language.Thrift.Types.TypeAnnotation]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasDefaultValue (Language.Thrift.Types.Field srcAnnot0) (GHC.Base.Maybe (Language.Thrift.Types.ConstValue srcAnnot0))
+ Language.Thrift.Types: instance Language.Thrift.Types.HasDefinitions (Language.Thrift.Types.Program srcAnnot0) [Language.Thrift.Types.Definition srcAnnot0]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasDocstring (Language.Thrift.Types.Const srcAnnot0) Language.Thrift.Types.Docstring
+ Language.Thrift.Types: instance Language.Thrift.Types.HasDocstring (Language.Thrift.Types.Enum srcAnnot0) Language.Thrift.Types.Docstring
+ Language.Thrift.Types: instance Language.Thrift.Types.HasDocstring (Language.Thrift.Types.EnumDef srcAnnot0) Language.Thrift.Types.Docstring
+ Language.Thrift.Types: instance Language.Thrift.Types.HasDocstring (Language.Thrift.Types.Exception srcAnnot0) Language.Thrift.Types.Docstring
+ Language.Thrift.Types: instance Language.Thrift.Types.HasDocstring (Language.Thrift.Types.Field srcAnnot0) Language.Thrift.Types.Docstring
+ Language.Thrift.Types: instance Language.Thrift.Types.HasDocstring (Language.Thrift.Types.Function srcAnnot0) Language.Thrift.Types.Docstring
+ Language.Thrift.Types: instance Language.Thrift.Types.HasDocstring (Language.Thrift.Types.Senum srcAnnot0) Language.Thrift.Types.Docstring
+ Language.Thrift.Types: instance Language.Thrift.Types.HasDocstring (Language.Thrift.Types.Service srcAnnot0) Language.Thrift.Types.Docstring
+ Language.Thrift.Types: instance Language.Thrift.Types.HasDocstring (Language.Thrift.Types.Struct srcAnnot0) Language.Thrift.Types.Docstring
+ Language.Thrift.Types: instance Language.Thrift.Types.HasDocstring (Language.Thrift.Types.Typedef srcAnnot0) Language.Thrift.Types.Docstring
+ Language.Thrift.Types: instance Language.Thrift.Types.HasDocstring (Language.Thrift.Types.Union srcAnnot0) Language.Thrift.Types.Docstring
+ Language.Thrift.Types: instance Language.Thrift.Types.HasExceptions (Language.Thrift.Types.Function srcAnnot0) (GHC.Base.Maybe [Language.Thrift.Types.Field srcAnnot0])
+ Language.Thrift.Types: instance Language.Thrift.Types.HasExtends (Language.Thrift.Types.Service srcAnnot0) (GHC.Base.Maybe Data.Text.Internal.Text)
+ Language.Thrift.Types: instance Language.Thrift.Types.HasFields (Language.Thrift.Types.Exception srcAnnot0) [Language.Thrift.Types.Field srcAnnot0]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasFields (Language.Thrift.Types.Struct srcAnnot0) [Language.Thrift.Types.Field srcAnnot0]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasFields (Language.Thrift.Types.Union srcAnnot0) [Language.Thrift.Types.Field srcAnnot0]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasFunctions (Language.Thrift.Types.Service srcAnnot0) [Language.Thrift.Types.Function srcAnnot0]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasHeaders (Language.Thrift.Types.Program srcAnnot0) [Language.Thrift.Types.Header srcAnnot0]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasIdentifier (Language.Thrift.Types.Field srcAnnot0) (GHC.Base.Maybe GHC.Integer.Type.Integer)
+ Language.Thrift.Types: instance Language.Thrift.Types.HasLanguage (Language.Thrift.Types.Namespace srcAnnot0) Data.Text.Internal.Text
+ Language.Thrift.Types: instance Language.Thrift.Types.HasName (Language.Thrift.Types.Const srcAnnot0) Data.Text.Internal.Text
+ Language.Thrift.Types: instance Language.Thrift.Types.HasName (Language.Thrift.Types.Enum srcAnnot0) Data.Text.Internal.Text
+ Language.Thrift.Types: instance Language.Thrift.Types.HasName (Language.Thrift.Types.EnumDef srcAnnot0) Data.Text.Internal.Text
+ Language.Thrift.Types: instance Language.Thrift.Types.HasName (Language.Thrift.Types.Exception srcAnnot0) Data.Text.Internal.Text
+ Language.Thrift.Types: instance Language.Thrift.Types.HasName (Language.Thrift.Types.Field srcAnnot0) Data.Text.Internal.Text
+ Language.Thrift.Types: instance Language.Thrift.Types.HasName (Language.Thrift.Types.Function srcAnnot0) Data.Text.Internal.Text
+ Language.Thrift.Types: instance Language.Thrift.Types.HasName (Language.Thrift.Types.Namespace srcAnnot0) Data.Text.Internal.Text
+ Language.Thrift.Types: instance Language.Thrift.Types.HasName (Language.Thrift.Types.Senum srcAnnot0) Data.Text.Internal.Text
+ Language.Thrift.Types: instance Language.Thrift.Types.HasName (Language.Thrift.Types.Service srcAnnot0) Data.Text.Internal.Text
+ Language.Thrift.Types: instance Language.Thrift.Types.HasName (Language.Thrift.Types.Struct srcAnnot0) Data.Text.Internal.Text
+ Language.Thrift.Types: instance Language.Thrift.Types.HasName (Language.Thrift.Types.Typedef srcAnnot0) Data.Text.Internal.Text
+ Language.Thrift.Types: instance Language.Thrift.Types.HasName (Language.Thrift.Types.Union srcAnnot0) Data.Text.Internal.Text
+ Language.Thrift.Types: instance Language.Thrift.Types.HasName Language.Thrift.Types.TypeAnnotation Data.Text.Internal.Text
+ Language.Thrift.Types: instance Language.Thrift.Types.HasOneWay (Language.Thrift.Types.Function srcAnnot0) GHC.Types.Bool
+ Language.Thrift.Types: instance Language.Thrift.Types.HasParameters (Language.Thrift.Types.Function srcAnnot0) [Language.Thrift.Types.Field srcAnnot0]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasPath (Language.Thrift.Types.Include srcAnnot0) Data.Text.Internal.Text
+ Language.Thrift.Types: instance Language.Thrift.Types.HasRequiredness (Language.Thrift.Types.Field srcAnnot0) (GHC.Base.Maybe Language.Thrift.Types.FieldRequiredness)
+ Language.Thrift.Types: instance Language.Thrift.Types.HasReturnType (Language.Thrift.Types.Function srcAnnot0) (GHC.Base.Maybe (Language.Thrift.Types.TypeReference srcAnnot0))
+ Language.Thrift.Types: instance Language.Thrift.Types.HasSrcAnnot (Language.Thrift.Types.Const srcAnnot0) srcAnnot0
+ Language.Thrift.Types: instance Language.Thrift.Types.HasSrcAnnot (Language.Thrift.Types.Enum srcAnnot0) srcAnnot0
+ Language.Thrift.Types: instance Language.Thrift.Types.HasSrcAnnot (Language.Thrift.Types.EnumDef srcAnnot0) srcAnnot0
+ Language.Thrift.Types: instance Language.Thrift.Types.HasSrcAnnot (Language.Thrift.Types.Exception srcAnnot0) srcAnnot0
+ Language.Thrift.Types: instance Language.Thrift.Types.HasSrcAnnot (Language.Thrift.Types.Field srcAnnot0) srcAnnot0
+ Language.Thrift.Types: instance Language.Thrift.Types.HasSrcAnnot (Language.Thrift.Types.Function srcAnnot0) srcAnnot0
+ Language.Thrift.Types: instance Language.Thrift.Types.HasSrcAnnot (Language.Thrift.Types.Include srcAnnot0) srcAnnot0
+ Language.Thrift.Types: instance Language.Thrift.Types.HasSrcAnnot (Language.Thrift.Types.Namespace srcAnnot0) srcAnnot0
+ Language.Thrift.Types: instance Language.Thrift.Types.HasSrcAnnot (Language.Thrift.Types.Senum srcAnnot0) srcAnnot0
+ Language.Thrift.Types: instance Language.Thrift.Types.HasSrcAnnot (Language.Thrift.Types.Service srcAnnot0) srcAnnot0
+ Language.Thrift.Types: instance Language.Thrift.Types.HasSrcAnnot (Language.Thrift.Types.Struct srcAnnot0) srcAnnot0
+ Language.Thrift.Types: instance Language.Thrift.Types.HasSrcAnnot (Language.Thrift.Types.Typedef srcAnnot0) srcAnnot0
+ Language.Thrift.Types: instance Language.Thrift.Types.HasSrcAnnot (Language.Thrift.Types.Union srcAnnot0) srcAnnot0
+ Language.Thrift.Types: instance Language.Thrift.Types.HasTargetType (Language.Thrift.Types.Typedef srcAnnot0) (Language.Thrift.Types.TypeReference srcAnnot0)
+ Language.Thrift.Types: instance Language.Thrift.Types.HasValue (Language.Thrift.Types.Const srcAnnot0) (Language.Thrift.Types.ConstValue srcAnnot0)
+ Language.Thrift.Types: instance Language.Thrift.Types.HasValue (Language.Thrift.Types.EnumDef srcAnnot0) (GHC.Base.Maybe GHC.Integer.Type.Integer)
+ Language.Thrift.Types: instance Language.Thrift.Types.HasValue Language.Thrift.Types.TypeAnnotation (GHC.Base.Maybe Data.Text.Internal.Text)
+ Language.Thrift.Types: instance Language.Thrift.Types.HasValueType (Language.Thrift.Types.Const srcAnnot0) (Language.Thrift.Types.TypeReference srcAnnot0)
+ Language.Thrift.Types: instance Language.Thrift.Types.HasValueType (Language.Thrift.Types.Field srcAnnot0) (Language.Thrift.Types.TypeReference srcAnnot0)
+ Language.Thrift.Types: instance Language.Thrift.Types.HasValues (Language.Thrift.Types.Enum srcAnnot0) [Language.Thrift.Types.EnumDef srcAnnot0]
+ Language.Thrift.Types: instance Language.Thrift.Types.HasValues (Language.Thrift.Types.Senum srcAnnot0) [Data.Text.Internal.Text]
+ Language.Thrift.Types: language :: HasLanguage s a => Lens' s a
+ Language.Thrift.Types: name :: HasName s a => Lens' s a
+ Language.Thrift.Types: oneWay :: HasOneWay s a => Lens' s a
+ Language.Thrift.Types: parameters :: HasParameters s a => Lens' s a
+ Language.Thrift.Types: path :: HasPath s a => Lens' s a
+ Language.Thrift.Types: requiredness :: HasRequiredness s a => Lens' s a
+ Language.Thrift.Types: returnType :: HasReturnType s a => Lens' s a
+ Language.Thrift.Types: srcAnnot :: HasSrcAnnot s a => Lens' s a
+ Language.Thrift.Types: targetType :: HasTargetType s a => Lens' s a
+ Language.Thrift.Types: value :: HasValue s a => Lens' s a
+ Language.Thrift.Types: valueType :: HasValueType s a => Lens' s a
+ Language.Thrift.Types: values :: HasValues s a => Lens' s a
- Language.Thrift.Parser: constantValue :: (TokenParsing p, MonadPlus p) => ThriftParser p n ConstValue
+ Language.Thrift.Parser: constantValue :: (TokenParsing p, MonadPlus p) => ThriftParser p n (ConstValue n)
- Language.Thrift.Parser: header :: (TokenParsing p, MonadPlus p) => ThriftParser p n Header
+ Language.Thrift.Parser: header :: (TokenParsing p, MonadPlus p) => ThriftParser p n (Header n)
- Language.Thrift.Pretty: constantValue :: Config -> ConstValue -> Doc
+ Language.Thrift.Pretty: constantValue :: Config -> ConstValue ann -> Doc
- Language.Thrift.Pretty: header :: Header -> Doc
+ Language.Thrift.Pretty: header :: Header ann -> Doc
- Language.Thrift.Types: BinaryType :: [TypeAnnotation] -> FieldType
+ Language.Thrift.Types: BinaryType :: [TypeAnnotation] -> TypeReference srcAnnot
- Language.Thrift.Types: BoolType :: [TypeAnnotation] -> FieldType
+ Language.Thrift.Types: BoolType :: [TypeAnnotation] -> TypeReference srcAnnot
- Language.Thrift.Types: ByteType :: [TypeAnnotation] -> FieldType
+ Language.Thrift.Types: ByteType :: [TypeAnnotation] -> TypeReference srcAnnot
- Language.Thrift.Types: ConstDefinition :: FieldType -> Text -> ConstValue -> Docstring -> srcAnnot -> Definition srcAnnot
+ Language.Thrift.Types: ConstDefinition :: (Const srcAnnot) -> Definition srcAnnot
- Language.Thrift.Types: ConstFloat :: Double -> ConstValue
+ Language.Thrift.Types: ConstFloat :: Double -> ConstValue srcAnnot
- Language.Thrift.Types: ConstIdentifier :: Text -> ConstValue
+ Language.Thrift.Types: ConstIdentifier :: Text -> srcAnnot -> ConstValue srcAnnot
- Language.Thrift.Types: ConstInt :: Integer -> ConstValue
+ Language.Thrift.Types: ConstInt :: Integer -> ConstValue srcAnnot
- Language.Thrift.Types: ConstList :: [ConstValue] -> ConstValue
+ Language.Thrift.Types: ConstList :: [ConstValue srcAnnot] -> ConstValue srcAnnot
- Language.Thrift.Types: ConstLiteral :: Text -> ConstValue
+ Language.Thrift.Types: ConstLiteral :: Text -> ConstValue srcAnnot
- Language.Thrift.Types: ConstMap :: [(ConstValue, ConstValue)] -> ConstValue
+ Language.Thrift.Types: ConstMap :: [(ConstValue srcAnnot, ConstValue srcAnnot)] -> ConstValue srcAnnot
- Language.Thrift.Types: DefinedType :: Text -> FieldType
+ Language.Thrift.Types: DefinedType :: Text -> srcAnnot -> TypeReference srcAnnot
- Language.Thrift.Types: DoubleType :: [TypeAnnotation] -> FieldType
+ Language.Thrift.Types: DoubleType :: [TypeAnnotation] -> TypeReference srcAnnot
- Language.Thrift.Types: Enum :: Text -> [EnumDef srcAnnot] -> Docstring -> srcAnnot -> Type srcAnnot
+ Language.Thrift.Types: Enum :: Text -> [EnumDef srcAnnot] -> [TypeAnnotation] -> Docstring -> srcAnnot -> Enum srcAnnot
- Language.Thrift.Types: Exception :: Text -> [Field srcAnnot] -> Docstring -> srcAnnot -> Type srcAnnot
+ Language.Thrift.Types: Exception :: Text -> [Field srcAnnot] -> [TypeAnnotation] -> Docstring -> srcAnnot -> Exception srcAnnot
- Language.Thrift.Types: Field :: Maybe Integer -> Maybe FieldRequiredness -> FieldType -> Text -> Maybe ConstValue -> [TypeAnnotation] -> Docstring -> srcAnnot -> Field srcAnnot
+ Language.Thrift.Types: Field :: Maybe Integer -> Maybe FieldRequiredness -> TypeReference srcAnnot -> Text -> Maybe (ConstValue srcAnnot) -> [TypeAnnotation] -> Docstring -> srcAnnot -> Field srcAnnot
- Language.Thrift.Types: Function :: Bool -> Maybe FieldType -> Text -> [Field srcAnnot] -> Maybe [Field srcAnnot] -> [TypeAnnotation] -> Docstring -> srcAnnot -> Function srcAnnot
+ Language.Thrift.Types: Function :: Bool -> Maybe (TypeReference srcAnnot) -> Text -> [Field srcAnnot] -> Maybe [Field srcAnnot] -> [TypeAnnotation] -> Docstring -> srcAnnot -> Function srcAnnot
- Language.Thrift.Types: I16Type :: [TypeAnnotation] -> FieldType
+ Language.Thrift.Types: I16Type :: [TypeAnnotation] -> TypeReference srcAnnot
- Language.Thrift.Types: I32Type :: [TypeAnnotation] -> FieldType
+ Language.Thrift.Types: I32Type :: [TypeAnnotation] -> TypeReference srcAnnot
- Language.Thrift.Types: I64Type :: [TypeAnnotation] -> FieldType
+ Language.Thrift.Types: I64Type :: [TypeAnnotation] -> TypeReference srcAnnot
- Language.Thrift.Types: Include :: Text -> Header
+ Language.Thrift.Types: Include :: Text -> srcAnnot -> Include srcAnnot
- Language.Thrift.Types: ListType :: FieldType -> [TypeAnnotation] -> FieldType
+ Language.Thrift.Types: ListType :: (TypeReference srcAnnot) -> [TypeAnnotation] -> TypeReference srcAnnot
- Language.Thrift.Types: MapType :: FieldType -> FieldType -> [TypeAnnotation] -> FieldType
+ Language.Thrift.Types: MapType :: (TypeReference srcAnnot) -> (TypeReference srcAnnot) -> [TypeAnnotation] -> TypeReference srcAnnot
- Language.Thrift.Types: Namespace :: Text -> Text -> Header
+ Language.Thrift.Types: Namespace :: Text -> Text -> srcAnnot -> Namespace srcAnnot
- Language.Thrift.Types: Program :: [Header] -> [Definition srcAnnot] -> Program srcAnnot
+ Language.Thrift.Types: Program :: [Header srcAnnot] -> [Definition srcAnnot] -> Program srcAnnot
- Language.Thrift.Types: SListType :: [TypeAnnotation] -> FieldType
+ Language.Thrift.Types: SListType :: [TypeAnnotation] -> TypeReference srcAnnot
- Language.Thrift.Types: Senum :: Text -> [Text] -> Docstring -> srcAnnot -> Type srcAnnot
+ Language.Thrift.Types: Senum :: Text -> [Text] -> [TypeAnnotation] -> Docstring -> srcAnnot -> Senum srcAnnot
- Language.Thrift.Types: ServiceDefinition :: Text -> Maybe Text -> [Function srcAnnot] -> [TypeAnnotation] -> Docstring -> srcAnnot -> Definition srcAnnot
+ Language.Thrift.Types: ServiceDefinition :: (Service srcAnnot) -> Definition srcAnnot
- Language.Thrift.Types: SetType :: FieldType -> [TypeAnnotation] -> FieldType
+ Language.Thrift.Types: SetType :: (TypeReference srcAnnot) -> [TypeAnnotation] -> TypeReference srcAnnot
- Language.Thrift.Types: StringType :: [TypeAnnotation] -> FieldType
+ Language.Thrift.Types: StringType :: [TypeAnnotation] -> TypeReference srcAnnot
- Language.Thrift.Types: Struct :: Text -> [Field srcAnnot] -> Docstring -> srcAnnot -> Type srcAnnot
+ Language.Thrift.Types: Struct :: Text -> [Field srcAnnot] -> [TypeAnnotation] -> Docstring -> srcAnnot -> Struct srcAnnot
- Language.Thrift.Types: TypeAnnotation :: Text -> Text -> TypeAnnotation
+ Language.Thrift.Types: TypeAnnotation :: Text -> Maybe Text -> TypeAnnotation
- Language.Thrift.Types: TypeDefinition :: Type srcAnnot -> [TypeAnnotation] -> Definition srcAnnot
+ Language.Thrift.Types: TypeDefinition :: (Type srcAnnot) -> Definition srcAnnot
- Language.Thrift.Types: Typedef :: FieldType -> Text -> Docstring -> srcAnnot -> Type srcAnnot
+ Language.Thrift.Types: Typedef :: TypeReference srcAnnot -> Text -> [TypeAnnotation] -> Docstring -> srcAnnot -> Typedef srcAnnot
- Language.Thrift.Types: Union :: Text -> [Field srcAnnot] -> Docstring -> srcAnnot -> Type srcAnnot
+ Language.Thrift.Types: Union :: Text -> [Field srcAnnot] -> [TypeAnnotation] -> Docstring -> srcAnnot -> Union srcAnnot
- Language.Thrift.Types: data ConstValue
+ Language.Thrift.Types: data ConstValue srcAnnot
- Language.Thrift.Types: data Header
+ Language.Thrift.Types: data Header srcAnnot
Files
- CHANGES.md +35/−0
- Language/Thrift/Parser.hs +154/−67
- Language/Thrift/Pretty.hs +90/−38
- Language/Thrift/Types.hs +492/−227
- README.md +3/−0
- examples/Setup.hs +2/−0
- examples/generateHaskellTypes.hs +151/−116
- examples/reformatIDL.hs +7/−6
- language-thrift.cabal +20/−9
- test/Language/Thrift/Arbitrary.hs +288/−0
- test/Language/Thrift/ParserSpec.hs +47/−0
- test/Language/Thrift/TypesSpec.hs +36/−257
- test/Main.hs +11/−0
- test/Spec.hs +1/−1
- test/TestUtils.hs +49/−0
CHANGES.md view
@@ -1,3 +1,38 @@+0.5.0.0+=======++The AST representation has been overhauled to be more consistent and+accessible. As a result, this release contains a number of breaking changes:++- Moved `Header` records into `Include` and `Namespace` types.+- Moved `ConstDefinition` record into separate type, `Const`.+- Moved `ServiceDefinition` record into separate type, `Service`.+- Moved `Type` records into separate types: `Typedef`, `Enum`, `Struct`,+ `Union`, `Exception`, `Senum`.+- Renamed `FieldType` to `TypeReference`.+- Renamed parser and pretty printer for `TypeReference` to `typeReference`.+- Renamed the following record fields: `constType` to `constValueType`,+ `typedefType` to `typedefTargetType`, `fieldType` to `fieldValueType`, and+ `fieldDefault` to `fieldDefaultValue`.+- Hide `function` parser and pretty printer.+- Moved type annotations for defined types into the records for the types+ themselves.++Other changes:++- Added lenses and prisms for AST types where appropriate.+- Parsing will fail if the end of the document is not reached when the parser+ stops. This fixes the bug where the parser would stop half way through a+ file when it saw a recoverable error.+- Added source annotations to headers, type references (`DefinedType`) and+ constant value references (`ConstIdentifer`).+- Added `i8` as an alias for `byte`.+- Type annotations are now allowed to have no associated value.+- Expose parsers and pretty printers for different headers and definitions.+- Fixed a bug which would cause parsing to fail if a definition ended with a+ semicolon or a comma.+- Drop dependency on mtl.+ 0.4.0.0 =======
Language/Thrift/Parser.hs view
@@ -29,10 +29,24 @@ -- * Components , program+ , header+ , include+ , namespace+ , definition- , function- , fieldType+ , constant+ , typeDefinition+ , service++ , typedef+ , enum+ , struct+ , union+ , exception+ , senum++ , typeReference , constantValue -- * Parser@@ -43,17 +57,17 @@ import Control.Applicative import Control.Monad-import Control.Monad.Reader (ReaderT)-import Control.Monad.State (StateT)-import Control.Monad.Trans (lift)+import Control.Monad.Trans.Reader (ReaderT)+import Control.Monad.Trans.State (StateT)+import Control.Monad.Trans.Class (lift) import Data.Text (Text) import Text.Parser.Char import Text.Parser.Combinators import Text.Parser.Token import Text.Parser.Token.Style (emptyIdents) -import qualified Control.Monad.Reader as Reader-import qualified Control.Monad.State as State+import qualified Control.Monad.Trans.Reader as Reader+import qualified Control.Monad.Trans.State as State import qualified Data.Text as Text import qualified Language.Thrift.Types as T@@ -87,7 +101,8 @@ -- allows injecting a configurable action @(p n)@ which produces annotations -- that will be attached to entities in the Thrift file. See 'thriftIDLParser' -- for an example.-newtype ThriftParser p n a = ThriftParser (StateT ParserState (ReaderT (p n) p) a)+newtype ThriftParser p n a =+ ThriftParser (StateT ParserState (ReaderT (p n) p) a) deriving ( Functor , Applicative@@ -119,7 +134,8 @@ Reader.runReaderT (State.evalStateT p (ParserState Nothing)) getAnnot -instance (TokenParsing p, MonadPlus p) => TokenParsing (ThriftParser p n) where+instance+ (TokenParsing p, MonadPlus p) => TokenParsing (ThriftParser p n) where -- Docstring parsing works by cheating. We define docstrings as -- whitespace, but we record it when we move over it. If we run into -- another newline or other comments after seeing the docstring's "*/\n",@@ -184,7 +200,11 @@ -- | Top-level parser to parse complete Thrift documents. program :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Program n)-program = whiteSpace >> T.Program <$> many header <*> many definition+program = whiteSpace >>+ T.Program+ <$> many (header <* optionalSep)+ <*> many (definition <* optionalSep)+ <* eof -- | A string literal. @"hello"@@@ -198,25 +218,63 @@ -- | Headers defined for the IDL.-header :: (TokenParsing p, MonadPlus p) => ThriftParser p n T.Header-header = choice [- reserved "include" >> T.Include <$> literal- , reserved "namespace" >>- T.Namespace <$> (text "*" <|> identifier) <*> identifier- , reserved "cpp_namespace" >> T.Namespace "cpp" <$> identifier- , reserved "php_namespace" >> T.Namespace "php" <$> identifier- , reserved "py_module" >> T.Namespace "py" <$> identifier- , reserved "perl_package" >> T.Namespace "perl" <$> identifier- , reserved "ruby_namespace" >> T.Namespace "rb" <$> identifier- , reserved "java_package" >> T.Namespace "java" <$> identifier- , reserved "cocoa_package" >> T.Namespace "cocoa" <$> identifier- , reserved "csharp_namespace" >> T.Namespace "csharp" <$> identifier+header :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Header n)+header = choice+ [ T.HeaderInclude <$> include+ , T.HeaderNamespace <$> namespace ] +-- | The IDL includes another Thrift file.+--+-- > include "common.thrift"+-- >+-- > typedef common.Foo Bar+--+include :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Include n)+include = reserved "include" >> withSrcAnnot (T.Include <$> literal) --- | Convenience wrapper for parsers that expect a docstring and a location--- 'Delta'.+-- | Namespace directives allows control of the namespace or package+-- name used by the generated code for certain languages. --+-- > namespace py my_service.generated+namespace :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Namespace n)+namespace = choice+ [ reserved "namespace" >>+ withSrcAnnot (T.Namespace <$> (text "*" <|> identifier) <*> identifier)+ , reserved "cpp_namespace" >>+ withSrcAnnot (T.Namespace "cpp" <$> identifier)+ , reserved "php_namespace" >>+ withSrcAnnot (T.Namespace "php" <$> identifier)+ , reserved "py_module" >>+ withSrcAnnot (T.Namespace "py" <$> identifier)+ , reserved "perl_package" >>+ withSrcAnnot (T.Namespace "perl" <$> identifier)+ , reserved "ruby_namespace" >>+ withSrcAnnot (T.Namespace "rb" <$> identifier)+ , reserved "java_package" >>+ withSrcAnnot (T.Namespace "java" <$> identifier)+ , reserved "cocoa_package" >>+ withSrcAnnot (T.Namespace "cocoa" <$> identifier)+ , reserved "csharp_namespace" >>+ withSrcAnnot (T.Namespace "csharp" <$> identifier)+ ]++-- | Retrieve the current source annotation.+getSrcAnnot :: Monad p => ThriftParser p n n+getSrcAnnot = ThriftParser . lift $ Reader.ask >>= lift++-- | Convenience wrapper for parsers expecting a source annotation.+--+-- The source annotation will be retrieved BEFORE the parser itself is+-- executed.+withSrcAnnot+ :: (Functor p, Monad p)+ => ThriftParser p n (n -> a) -> ThriftParser p n a+withSrcAnnot p = getSrcAnnot >>= \annot -> p <*> pure annot++-- | Convenience wrapper for parsers that expect a docstring and a+-- source annotation.+-- -- > data Foo = Foo { bar :: Bar, doc :: Docstring, pos :: Delta } -- > -- > parseFoo = docstring $ Foo <$> parseBar@@ -224,29 +282,38 @@ :: (Functor p, Monad p) => ThriftParser p n (T.Docstring -> n -> a) -> ThriftParser p n a docstring p = lastDocstring >>= \s -> do- annot <- ThriftParser . lift $ Reader.ask >>= lift+ annot <- getSrcAnnot p <*> pure s <*> pure annot -- | A constant, type, or service definition.-definition :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Definition n)-definition = choice [constant, typeDefinition, service]+definition+ :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Definition n)+definition = whiteSpace >> choice+ [ T.ConstDefinition <$> constant+ , T.TypeDefinition <$> typeDefinition+ , T.ServiceDefinition <$> service+ ] -- | A type definition.-typeDefinition :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Definition n)-typeDefinition =- T.TypeDefinition- <$> choice [typedef, enum, senum, struct, union, exception]- <*> typeAnnotations+typeDefinition :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Type n)+typeDefinition = choice+ [ T.TypedefType <$> typedef+ , T.EnumType <$> enum+ , T.SenumType <$> senum+ , T.StructType <$> struct+ , T.UnionType <$> union+ , T.ExceptionType <$> exception+ ] -- | A typedef is just an alias for another type. -- -- > typedef common.Foo Bar-typedef :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Type n)+typedef :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Typedef n) typedef = reserved "typedef" >>- docstring (T.Typedef <$> fieldType <*> identifier)+ docstring (T.Typedef <$> typeReference <*> identifier <*> typeAnnotations) -- | Enums are sets of named integer values.@@ -254,9 +321,12 @@ -- > enum Role { -- > User = 1, Admin -- > }-enum :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Type n)+enum :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Enum n) enum = reserved "enum" >>- docstring (T.Enum <$> identifier <*> braces (many enumDef))+ docstring (T.Enum+ <$> identifier+ <*> braces (many enumDef)+ <*> typeAnnotations) -- | A @struct@.@@ -265,9 +335,12 @@ -- > 1: string name -- > 2: Role role = Role.User; -- > }-struct :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Type n)+struct :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Struct n) struct = reserved "struct" >>- docstring (T.Struct <$> identifier <*> braces (many field))+ docstring (T.Struct+ <$> identifier+ <*> braces (many field)+ <*> typeAnnotations) -- | A @union@ of types.@@ -276,9 +349,12 @@ -- > 1: string stringValue; -- > 2: i32 intValue; -- > }-union :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Type n)+union :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Union n) union = reserved "union" >>- docstring (T.Union <$> identifier <*> braces (many field))+ docstring (T.Union+ <$> identifier+ <*> braces (many field)+ <*> typeAnnotations) -- | An @exception@ that can be raised by service methods.@@ -287,9 +363,12 @@ -- > 1: optional string message -- > 2: required string username -- > }-exception :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Type n)+exception :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Exception n) exception = reserved "exception" >>- docstring (T.Exception <$> identifier <*> braces (many field))+ docstring (T.Exception+ <$> identifier+ <*> braces (many field)+ <*> typeAnnotations) -- | Whether a field is @required@ or @optional@.@@ -306,7 +385,7 @@ T.Field <$> optional (integer <* symbolic ':') <*> optional fieldRequiredness- <*> fieldType+ <*> typeReference <*> identifier <*> optional (equals *> constantValue) <*> typeAnnotations@@ -325,37 +404,42 @@ -- | An string-only enum. These are a deprecated feature of Thrift and -- shouldn't be used.-senum :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Type n)+senum :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Senum n) senum = reserved "senum" >> docstring- (T.Senum <$> identifier <*> braces (many (literal <* optionalSep)))+ (T.Senum+ <$> identifier+ <*> braces (many (literal <* optionalSep))+ <*> typeAnnotations) -- | A 'const' definition. -- -- > const i32 code = 1;-constant :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Definition n)+constant :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Const n) constant = do reserved "const" docstring $- T.ConstDefinition- <$> fieldType+ T.Const+ <$> typeReference <*> (identifier <* equals) <*> constantValue <* optionalSep -- | A constant value literal.-constantValue :: (TokenParsing p, MonadPlus p) => ThriftParser p n T.ConstValue+constantValue+ :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.ConstValue n) constantValue = choice [ either T.ConstInt T.ConstFloat <$> integerOrDouble , T.ConstLiteral <$> literal- , T.ConstIdentifier <$> identifier+ , withSrcAnnot (T.ConstIdentifier <$> identifier) , T.ConstList <$> constList , T.ConstMap <$> constMap ] -constList :: (TokenParsing p, MonadPlus p) => ThriftParser p n [T.ConstValue]+constList+ :: (TokenParsing p, MonadPlus p) => ThriftParser p n [T.ConstValue n] constList = symbolic '[' *> loop [] where loop xs = choice [@@ -368,7 +452,7 @@ constMap :: (TokenParsing p, MonadPlus p)- => ThriftParser p n [(T.ConstValue, T.ConstValue)]+ => ThriftParser p n [(T.ConstValue n, T.ConstValue n)] constMap = symbolic '{' *> loop [] where loop xs = choice [@@ -381,22 +465,24 @@ constantValuePair :: (TokenParsing p, MonadPlus p)- => ThriftParser p n (T.ConstValue, T.ConstValue)+ => ThriftParser p n (T.ConstValue n, T.ConstValue n) constantValuePair = (,) <$> (constantValue <* colon) <*> (constantValue <* optionalSep) -- | A reference to a built-in or defined field.-fieldType :: (TokenParsing p, MonadPlus p) => ThriftParser p n T.FieldType-fieldType = choice [+typeReference+ :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.TypeReference n)+typeReference = choice [ baseType , containerType- , T.DefinedType <$> identifier+ , withSrcAnnot (T.DefinedType <$> identifier) ] -baseType :: (TokenParsing p, MonadPlus p) => ThriftParser p n T.FieldType+baseType+ :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.TypeReference n) baseType = choice [reserved s *> (v <$> typeAnnotations) | (s, v) <- bases] where@@ -406,6 +492,7 @@ , ("slist", T.SListType) , ("bool", T.BoolType) , ("byte", T.ByteType)+ , ("i8", T.ByteType) , ("i16", T.I16Type) , ("i32", T.I32Type) , ("i64", T.I64Type)@@ -413,14 +500,15 @@ ] -containerType :: (TokenParsing p, MonadPlus p) => ThriftParser p n T.FieldType+containerType+ :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.TypeReference n) containerType = choice [mapType, setType, listType] <*> typeAnnotations where mapType = reserved "map" >>- angles (T.MapType <$> (fieldType <* comma) <*> fieldType)- setType = reserved "set" >> angles (T.SetType <$> fieldType)- listType = reserved "list" >> angles (T.ListType <$> fieldType)+ angles (T.MapType <$> (typeReference <* comma) <*> typeReference)+ setType = reserved "set" >> angles (T.SetType <$> typeReference)+ listType = reserved "list" >> angles (T.ListType <$> typeReference) -- | A service.@@ -428,11 +516,11 @@ -- > service MyService { -- > // ... -- > }-service :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Definition n)+service :: (TokenParsing p, MonadPlus p) => ThriftParser p n (T.Service n) service = do reserved "service" docstring $- T.ServiceDefinition+ T.Service <$> identifier <*> optional (reserved "extends" *> identifier) <*> braces (many function)@@ -447,7 +535,7 @@ function = docstring $ T.Function <$> ((reserved "oneway" *> pure True) <|> pure False)- <*> ((reserved "void" *> pure Nothing) <|> Just <$> fieldType)+ <*> ((reserved "void" *> pure Nothing) <|> Just <$> typeReference) <*> identifier <*> parens (many field) <*> optional (reserved "throws" *> parens (many field))@@ -473,7 +561,7 @@ typeAnnotation = T.TypeAnnotation <$> identifier- <*> (equals *> literal <* optionalSep)+ <*> (optional (equals *> literal) <* optionalSep) optionalSep :: (TokenParsing p, MonadPlus p) => ThriftParser p n ()@@ -482,4 +570,3 @@ equals :: (TokenParsing p, MonadPlus p) => ThriftParser p n () equals = void $ symbolic '='-
Language/Thrift/Pretty.hs view
@@ -22,10 +22,24 @@ -- * Components , program+ , header+ , include+ , namespace+ , definition- , function- , fieldType+ , constant+ , typeDefinition+ , service++ , typedef+ , enum+ , struct+ , union+ , exception+ , senum++ , typeReference , constantValue -- * Configuration@@ -72,27 +86,39 @@ -- | Print the headers for a program.-header :: T.Header -> Doc-header T.Include{..} =- text "include" <+> literal includePath-header T.Namespace{..} = hsep+header :: T.Header ann -> Doc+header (T.HeaderInclude inc) = include inc+header (T.HeaderNamespace ns) = namespace ns+++include :: T.Include ann -> Doc+include T.Include{..} = text "include" <+> literal includePath+++namespace :: T.Namespace ann -> Doc+namespace T.Namespace{..} = hsep [text "namespace", text namespaceLanguage, text namespaceName] -- | Print a constant, type, or service definition. definition :: Config -> T.Definition ann -> Doc-definition c T.ConstDefinition{..} = constDocstring $$ hsep+definition c (T.ConstDefinition cd) = constant c cd+definition c (T.TypeDefinition def) = typeDefinition c def+definition c (T.ServiceDefinition s) = service c s+++constant :: Config -> T.Const ann -> Doc+constant c T.Const{..} = constDocstring $$ hsep [ text "const"- , fieldType c constType+ , typeReference c constValueType , text constName , text "=" , constantValue c constValue ] -definition c T.TypeDefinition{typeDefinition = def, ..} =- typeDefinition c def <> typeAnnots c typeAnnotations -definition c@Config{indentWidth} T.ServiceDefinition{..} =+service :: Config -> T.Service ann -> Doc+service c@Config{indentWidth} T.Service{..} = serviceDocstring $$ text "service" <+> text serviceName <> extends <+> block indentWidth (line <> line) (map (function c) serviceFunctions) <>@@ -119,7 +145,7 @@ encloseSep indentWidth lparen rparen comma (map (field c) es) returnType = case functionReturnType of Nothing -> text "void"- Just rt -> fieldType c rt+ Just rt -> typeReference c rt oneway = if functionOneWay then text "oneway" <> space@@ -127,29 +153,53 @@ typeDefinition :: Config -> T.Type ann -> Doc-typeDefinition c@Config{indentWidth} t = case t of- T.Typedef{..} -> typedefDocstring $$- text "typedef" <+> fieldType c typedefType <+> text typedefName- T.Enum{..} -> enumDocstring $$+typeDefinition c td = case td of+ T.TypedefType t -> c `typedef` t+ T.EnumType t -> c `enum` t+ T.StructType t -> c `struct` t+ T.UnionType t -> c `union` t+ T.ExceptionType t -> c `exception` t+ T.SenumType t -> c `senum` t++typedef :: Config -> T.Typedef ann -> Doc+typedef c T.Typedef{..} = typedefDocstring $$+ text "typedef" <+> typeReference c typedefTargetType <+> text typedefName+ <> typeAnnots c typedefAnnotations++enum :: Config -> T.Enum ann -> Doc+enum c@Config{indentWidth} T.Enum{..} = enumDocstring $$ text "enum" <+> text enumName <+> block indentWidth (comma <> line) (map (enumValue c) enumValues)- T.Struct{..} -> structDocstring $$+ <> typeAnnots c enumAnnotations++struct :: Config -> T.Struct ann -> Doc+struct c@Config{indentWidth} T.Struct{..} = structDocstring $$ text "struct" <+> text structName <+> block indentWidth line (map (\f -> field c f <> semi) structFields)- T.Union{..} -> unionDocstring $$+ <> typeAnnots c structAnnotations++union :: Config -> T.Union ann -> Doc+union c@Config{indentWidth} T.Union{..} = unionDocstring $$ text "union" <+> text unionName <+> block indentWidth line (map (\f -> field c f <> semi) unionFields)- T.Exception{..} -> exceptionDocstring $$+ <> typeAnnots c unionAnnotations++exception :: Config -> T.Exception ann -> Doc+exception c@Config{indentWidth} T.Exception{..} = exceptionDocstring $$ text "exception" <+> text exceptionName <+> block indentWidth line (map (\f -> field c f <> semi) exceptionFields)- T.Senum{..} -> senumDocstring $$+ <> typeAnnots c exceptionAnnotations++senum :: Config -> T.Senum ann -> Doc+senum c@Config{indentWidth} T.Senum{..} = senumDocstring $$ text "senum" <+> text senumName <+> encloseSep indentWidth lbrace rbrace comma (map literal senumValues)+ <> typeAnnots c senumAnnotations field :: Config -> T.Field ann -> Doc-field c T.Field{fieldType = typ, ..} = fieldDocstring $$- hcat [fid, req, fieldType c typ, space, text fieldName, def, annots]+field c T.Field{fieldValueType = typ, ..} = fieldDocstring $$+ hcat [fid, req, typeReference c typ, space, text fieldName, def, annots] where fid = case fieldIdentifier of Nothing -> empty@@ -158,7 +208,7 @@ Nothing -> empty Just T.Optional -> text "optional " Just T.Required -> text "required "- def = case fieldDefault of+ def = case fieldDefaultValue of Nothing -> empty Just v -> space <> equals <+> constantValue c v annots = typeAnnots c fieldAnnotations@@ -174,9 +224,9 @@ -- | Pretty print a field type.-fieldType :: Config -> T.FieldType -> Doc-fieldType c ft = case ft of- T.DefinedType t -> text t+typeReference :: Config -> T.TypeReference ann -> Doc+typeReference c ft = case ft of+ T.DefinedType t _ -> text t T.StringType anns -> text "string" <> typeAnnots c anns T.BinaryType anns -> text "binary" <> typeAnnots c anns@@ -189,29 +239,26 @@ T.DoubleType anns -> text "double" <> typeAnnots c anns T.MapType k v anns ->- text "map" <> angles (fieldType c k <> comma <+> fieldType c v)+ text "map" <> angles (typeReference c k <> comma <+> typeReference c v) <> typeAnnots c anns T.SetType v anns ->- text "set" <> angles (fieldType c v) <> typeAnnots c anns+ text "set" <> angles (typeReference c v) <> typeAnnots c anns T.ListType v anns ->- text "list" <> angles (fieldType c v) <> typeAnnots c anns+ text "list" <> angles (typeReference c v) <> typeAnnots c anns -- | Pretty print a constant value.-constantValue :: Config -> T.ConstValue -> Doc+constantValue :: Config -> T.ConstValue ann -> Doc constantValue c@Config{indentWidth} value = case value of T.ConstInt i -> integer i T.ConstFloat f -> double f T.ConstLiteral l -> literal l- T.ConstIdentifier i -> text i-+ T.ConstIdentifier i _ -> text i T.ConstList vs ->- encloseSep indentWidth lbracket rbracket comma $- map (constantValue c) vs+ encloseSep indentWidth lbracket rbracket comma $ map (constantValue c) vs T.ConstMap vs -> encloseSep indentWidth lbrace rbrace comma $- map (\(k, v) -> constantValue c k <> colon <+> constantValue c v)- vs+ map (\(k, v) -> constantValue c k <> colon <+> constantValue c v) vs typeAnnots :: Config -> [T.TypeAnnotation] -> Doc@@ -222,7 +269,11 @@ typeAnnot :: T.TypeAnnotation -> Doc typeAnnot T.TypeAnnotation{..} =- text typeAnnotationName <+> equals <+> literal typeAnnotationValue+ text typeAnnotationName <> value+ where+ value = case typeAnnotationValue of+ Nothing -> empty+ Just v -> space <> equals <+> literal v literal :: Text -> Doc@@ -261,5 +312,6 @@ encloseSep _ left right _ [v] = left <> v <> right encloseSep indent left right s vs = group $ nest indent (left <$$> go vs) <$$> right- where go [x] = x+ where go [] = empty+ go [x] = x go (x:xs) = (x <> s) <$> go xs
Language/Thrift/Types.hs view
@@ -1,5 +1,9 @@-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TemplateHaskell #-} -- | -- Module : Language.Thrift.Types -- Copyright : (c) Abhinav Gupta 2015@@ -10,254 +14,162 @@ -- -- This module defines types that compose a Thrift IDL file. --+-- Most of the types have an optional @srcAnnot@ parameter that represents a+-- parser-specific source annotation. With @trifecta@ this can hold the+-- 'Text.Trifecta.Delta.Delta'. If you do not have need of this, you can use+-- @()@ as the parameter.+-- module Language.Thrift.Types ( Program(..)+ , Header(..)+ , _Include+ , _Namespace++ , Include(..)+ , Namespace(..)+ , Definition(..)+ , _Const+ , _Service+ , _Type++ , Const(..)+ , Service(..)+ , Type(..)+ , _Typedef+ , _Enum+ , _Struct+ , _Union+ , _Exception+ , _Senum++ , Typedef(..)+ , Enum(..)+ , Struct(..)+ , Union(..)+ , Exception(..)+ , Senum(..)+ , FieldRequiredness(..)+ , _Required+ , _Optional+ , Field(..) , EnumDef(..)+ , ConstValue(..)- , FieldType(..)+ , _ConstInt+ , _ConstFloat+ , _ConstLiteral+ , _ConstIdentifier+ , _ConstList+ , _ConstMap++ , TypeReference(..)+ , _DefinedType+ , _StringType+ , _BinaryType+ , _SListType+ , _BoolType+ , _ByteType+ , _I16Type+ , _I32Type+ , _I64Type+ , _DoubleType+ , _MapType+ , _SetType+ , _ListType+ , Function(..) , TypeAnnotation(..) , Docstring++ , HasAnnotations(..)+ , HasDefaultValue(..)+ , HasDefinitions(..)+ , HasDocstring(..)+ , HasExceptions(..)+ , HasExtends(..)+ , HasFields(..)+ , HasFunctions(..)+ , HasHeaders(..)+ , HasIdentifier(..)+ , HasLanguage(..)+ , HasName(..)+ , HasOneWay(..)+ , HasParameters(..)+ , HasPath(..)+ , HasRequiredness(..)+ , HasReturnType(..)+ , HasSrcAnnot(..)+ , HasTargetType(..)+ , HasValue(..)+ , HasValues(..)+ , HasValueType(..) ) where import Data.Data (Data, Typeable) import Data.Text (Text) import GHC.Generics (Generic)+import Prelude hiding (Enum) --- | A program represents a single Thrift document.-data Program srcAnnot = Program- { programHeaders :: [Header]- -- ^ Headers in a document define includes and namespaces.- , programDefinitions :: [Definition srcAnnot]- -- ^ Types and services defined in the document.- }- deriving (Show, Ord, Eq, Data, Typeable, Generic)+import qualified Control.Lens as L --- | Headers for a program.-data Header- = -- | The IDL includes another Thrift file.- --- -- > include "common.thrift"- -- >- -- > typedef common.Foo Bar- --- Include- { includePath :: Text- -- ^ Path to the included file.- }- | -- | Namespace directives allows control of the namespace or package- -- name used by the generated code for certain languages.- --- -- > namespace py my_service.generated- Namespace- { namespaceLanguage :: Text- -- ^ The language for which the namespace is being specified. This may- -- be @*@ to refer to all languages.- , namespaceName :: Text- -- ^ Namespace or package path to use in the generated code for that- -- language.- }- deriving (Show, Ord, Eq, Data, Typeable, Generic) --- | A definition either consists of new constants, new types, or new--- services.-data Definition srcAnnot- = -- | A declared constant.- --- -- > const i32 code = 1;- ConstDefinition- { constType :: FieldType- -- ^ Type of the constant.- , constName :: Text- -- ^ Name of the constant.- , constValue :: ConstValue- -- ^ Value of the constant.- , constDocstring :: Docstring- -- ^ Documentation.- , constSrcAnnot :: srcAnnot- }- | -- | A declared type.- TypeDefinition- { typeDefinition :: Type srcAnnot- -- ^ Details of the type definition.- , typeAnnotations :: [TypeAnnotation]- -- ^ Annotations added to the type.- }- | -- | A service definition.- --- -- > service MyService {- -- > // ...- -- > }- ServiceDefinition- { serviceName :: Text- -- ^ Name of the service.- , serviceExtends :: Maybe Text- -- ^ Name of the service this service extends.- , serviceFunctions :: [Function srcAnnot]- -- ^ All the functions defined for the service.- , serviceAnnotations :: [TypeAnnotation]- -- ^ Annotations added to the service.- , serviceDocstring :: Docstring- -- ^ Documentation.- , serviceSrcAnnot :: srcAnnot- }+-- | Type annoations may be added in various places in the form,+--+-- > (foo = "bar", baz, qux = "quux")+--+-- These do not usually affect code generation but allow for custom logic if+-- writing your own code generator.+data TypeAnnotation = TypeAnnotation+ { typeAnnotationName :: Text+ -- ^ Name of the annotation.+ , typeAnnotationValue :: Maybe Text+ -- ^ Value for the annotation.+ } deriving (Show, Ord, Eq, Data, Typeable, Generic) --- | Defines the various types that can be declared in Thrift.-data Type srcAnnot- = -- | A typedef is just an alias for another type.- --- -- > typedef common.Foo Bar- Typedef- { typedefType :: FieldType- -- ^ The aliased type.- , typedefName :: Text- -- ^ Name of the new type.- , typedefDocstring :: Docstring- -- ^ Documentation.- , typedefSrcAnnot :: srcAnnot- }- | -- | Enums are sets of named integer values.- --- -- > enum Role {- -- > User = 1, Admin = 2- -- > }- Enum- { enumName :: Text- -- ^ Name of the enum type.- , enumValues :: [EnumDef srcAnnot]- -- ^ Values defined in the enum.- , enumDocstring :: Docstring- -- ^ Documentation.- , enumSrcAnnot :: srcAnnot- }- | -- | A struct definition- --- -- > struct User {- -- > 1: Role role = Role.User;- -- > }- Struct- { structName :: Text- -- ^ Name of the struct.- , structFields :: [Field srcAnnot]- -- ^ Fields defined in the struct.- , structDocstring :: Docstring- -- ^ Documentation.- , structSrcAnnot :: srcAnnot- }- | -- | A union of other types.- --- -- > union Value {- -- > 1: string stringValue;- -- > 2: i32 intValue;- -- > }- Union- { unionName :: Text- -- ^ Name of the union.- , unionFields :: [Field srcAnnot]- -- ^ Fields defined in the union.- , unionDocstring :: Docstring- -- ^ Documentation.- , unionSrcAnnot :: srcAnnot- }- | -- | Exception types.- --- -- > exception UserDoesNotExist {- -- > 1: optional string message- -- > 2: required string username- -- > }- Exception- { exceptionName :: Text- , exceptionFields :: [Field srcAnnot]- , exceptionDocstring :: Docstring- , exceptionSrcAnnot :: srcAnnot- }- | -- | An string-only enum. These are a deprecated feature of Thrift and- -- shouldn't be used.- Senum- { senumName :: Text- , senumValues :: [Text]- , senumDocstring :: Docstring- -- ^ Documentation.- , senumSrcAnnot :: srcAnnot- }- deriving (Show, Ord, Eq, Data, Typeable, Generic)+L.makeFields ''TypeAnnotation --- | Whether a field is required or optional.-data FieldRequiredness- = Required -- ^ The field is @required@.- | Optional -- ^ The field is @optional@.- deriving (Show, Ord, Eq, Data, Typeable, Generic) --- | A field inside a struct, exception, or function parameters list.-data Field srcAnnot = Field- { fieldIdentifier :: Maybe Integer- -- ^ Position of the field.- --- -- While this is optional, it is recommended that Thrift files always- -- contain specific field IDs.- , fieldRequiredness :: Maybe FieldRequiredness- -- ^ Whether this field is required or not.- --- -- Behavior may differ between languages if requiredness is not specified.- -- Therefore it's recommended that requiredness for a field is always- -- specified.- , fieldType :: FieldType- -- ^ Type of value the field holds.- , fieldName :: Text- -- ^ Name of the field.- , fieldDefault :: Maybe ConstValue- -- ^ Default value of the field, if any.- , fieldAnnotations :: [TypeAnnotation]- -- ^ Field annotations.- , fieldDocstring :: Docstring- -- ^ Documentation.- , fieldSrcAnnot :: srcAnnot- }- deriving (Show, Ord, Eq, Data, Typeable, Generic)+-- | Docstrings are Javadoc-style comments attached various defined objects.+--+-- > /**+-- > * Fetches an item.+-- > */+-- > Item getItem()+type Docstring = Maybe Text --- | A named value inside an enum.-data EnumDef srcAnnot = EnumDef- { enumDefName :: Text- -- ^ Name of the value.- , enumDefValue :: Maybe Integer- -- ^ Value attached to the enum for that name.- , enumDefAnnotations :: [TypeAnnotation]- -- ^ Annotations added to this enum field.- , enumDefDocstring :: Docstring- -- ^ Documentation- , enumDefSrcAnnot :: srcAnnot- }- deriving (Show, Ord, Eq, Data, Typeable, Generic) -- | A constant literal value in the IDL. Only a few basic types, lists, and -- maps can be presented in Thrift files as literals. -- -- Constants are used for IDL-level constants and default values for fields.-data ConstValue+data ConstValue srcAnnot = ConstInt Integer -- ^ An integer. @42@ | ConstFloat Double -- ^ A float. @4.2@ | ConstLiteral Text -- ^ A literal string. @"hello"@- | ConstIdentifier Text- -- ^ A literal identifier. @hello@- | ConstList [ConstValue]+ | ConstIdentifier Text srcAnnot+ -- ^ A reference to another constant. @Foo.bar@+ | ConstList [ConstValue srcAnnot] -- ^ A literal list containing other constant values. @[42]@- | ConstMap [(ConstValue, ConstValue)]+ | ConstMap [(ConstValue srcAnnot, ConstValue srcAnnot)] -- ^ A literal list containing other constant values. -- @{"hellO": 1, "world": 2}@ deriving (Show, Ord, Eq, Data, Typeable, Generic) +L.makePrisms ''ConstValue++ -- | A reference to a type.-data FieldType- = DefinedType Text+data TypeReference srcAnnot+ = DefinedType Text srcAnnot -- ^ A custom defined type referred to by name. | StringType [TypeAnnotation]@@ -280,20 +192,64 @@ -- ^ @double@ and annotations. -- Container types- | MapType FieldType FieldType [TypeAnnotation]+ | MapType+ (TypeReference srcAnnot)+ (TypeReference srcAnnot)+ [TypeAnnotation] -- ^ @map\<foo, bar\>@ and annotations.- | SetType FieldType [TypeAnnotation]+ | SetType (TypeReference srcAnnot) [TypeAnnotation] -- ^ @set\<baz\>@ and annotations.- | ListType FieldType [TypeAnnotation]+ | ListType (TypeReference srcAnnot) [TypeAnnotation] -- ^ @list\<qux\>@ and annotations. deriving (Show, Ord, Eq, Data, Typeable, Generic) +L.makePrisms ''TypeReference+++-- | Whether a field is required or optional.+data FieldRequiredness+ = Required -- ^ The field is @required@.+ | Optional -- ^ The field is @optional@.+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++L.makePrisms ''FieldRequiredness++-- | A field inside a struct, exception, or function parameters list.+data Field srcAnnot = Field+ { fieldIdentifier :: Maybe Integer+ -- ^ Position of the field.+ --+ -- While this is optional, it is recommended that Thrift files always+ -- contain specific field IDs.+ , fieldRequiredness :: Maybe FieldRequiredness+ -- ^ Whether this field is required or not.+ --+ -- Behavior may differ between languages if requiredness is not specified.+ -- Therefore it's recommended that requiredness for a field is always+ -- specified.+ , fieldValueType :: TypeReference srcAnnot+ -- ^ Type of value the field holds.+ , fieldName :: Text+ -- ^ Name of the field.+ , fieldDefaultValue :: Maybe (ConstValue srcAnnot)+ -- ^ Default value of the field, if any.+ , fieldAnnotations :: [TypeAnnotation]+ -- ^ Field annotations.+ , fieldDocstring :: Docstring+ -- ^ Documentation.+ , fieldSrcAnnot :: srcAnnot+ }+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++L.makeFields ''Field++ -- | A function defined inside a service. data Function srcAnnot = Function { functionOneWay :: Bool -- ^ Whether the function is @oneway@. If it's one way, it cannot receive -- repsonses.- , functionReturnType :: Maybe FieldType+ , functionReturnType :: Maybe (TypeReference srcAnnot) -- ^ Return type of the function, or @Nothing@ if it's @void@ or @oneway@. , functionName :: Text -- ^ Name of the function.@@ -309,24 +265,333 @@ } deriving (Show, Ord, Eq, Data, Typeable, Generic) --- | Type annoations may be added in various places in the form,+L.makeFields ''Function+++-- | A service definition. ----- > (foo = "bar", baz = "qux")+-- > service MyService {+-- > // ...+-- > }+data Service srcAnnot = Service+ { serviceName :: Text+ -- ^ Name of the service.+ , serviceExtends :: Maybe Text+ -- ^ Name of the service this service extends.+ , serviceFunctions :: [Function srcAnnot]+ -- ^ All the functions defined for the service.+ , serviceAnnotations :: [TypeAnnotation]+ -- ^ Annotations added to the service.+ , serviceDocstring :: Docstring+ -- ^ Documentation.+ , serviceSrcAnnot :: srcAnnot+ }+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++L.makeFields ''Service++-- | A declared constant. ----- These do not usually affect code generation but allow for custom logic if--- writing your own code generator.-data TypeAnnotation = TypeAnnotation- { typeAnnotationName :: Text- -- ^ Name of the annotation.- , typeAnnotationValue :: Text- -- ^ Value for the annotation.+-- > const i32 code = 1;+data Const srcAnnot = Const+ { constValueType :: TypeReference srcAnnot+ -- ^ Type of the constant.+ , constName :: Text+ -- ^ Name of the constant.+ , constValue :: ConstValue srcAnnot+ -- ^ Value of the constant.+ , constDocstring :: Docstring+ -- ^ Documentation.+ , constSrcAnnot :: srcAnnot } deriving (Show, Ord, Eq, Data, Typeable, Generic) --- | Docstrings are Javadoc-style comments attached various defined objects.+L.makeFields ''Const+++-- | A typedef is just an alias for another type. ----- > /**--- > * Fetches an item.--- > */--- > Item getItem()-type Docstring = Maybe Text+-- > typedef common.Foo Bar+data Typedef srcAnnot = Typedef+ { typedefTargetType :: TypeReference srcAnnot+ -- ^ The aliased type.+ , typedefName :: Text+ -- ^ Name of the new type.+ , typedefAnnotations :: [TypeAnnotation]+ -- ^ Annotations added to the typedef.+ , typedefDocstring :: Docstring+ -- ^ Documentation.+ , typedefSrcAnnot :: srcAnnot+ }+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++L.makeFields ''Typedef+++-- | A named value inside an enum.+data EnumDef srcAnnot = EnumDef+ { enumDefName :: Text+ -- ^ Name of the value.+ , enumDefValue :: Maybe Integer+ -- ^ Value attached to the enum for that name.+ , enumDefAnnotations :: [TypeAnnotation]+ -- ^ Annotations added to this enum field.+ , enumDefDocstring :: Docstring+ -- ^ Documentation+ , enumDefSrcAnnot :: srcAnnot+ }+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++L.makeFields ''EnumDef+++-- | Enums are sets of named integer values.+--+-- > enum Role {+-- > User = 1, Admin = 2+-- > }+data Enum srcAnnot = Enum+ { enumName :: Text+ -- ^ Name of the enum type.+ , enumValues :: [EnumDef srcAnnot]+ -- ^ Values defined in the enum.+ , enumAnnotations :: [TypeAnnotation]+ -- ^ Annotations added to the enum.+ , enumDocstring :: Docstring+ -- ^ Documentation.+ , enumSrcAnnot :: srcAnnot+ }+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++L.makeFields ''Enum+++-- | A struct definition+--+-- > struct User {+-- > 1: Role role = Role.User;+-- > }+data Struct srcAnnot = Struct+ { structName :: Text+ -- ^ Name of the struct.+ , structFields :: [Field srcAnnot]+ -- ^ Fields defined in the struct.+ , structAnnotations :: [TypeAnnotation]+ -- ^ Annotations added to the struct.+ , structDocstring :: Docstring+ -- ^ Documentation.+ , structSrcAnnot :: srcAnnot+ }+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++L.makeFields ''Struct+++-- | A union of other types.+--+-- > union Value {+-- > 1: string stringValue;+-- > 2: i32 intValue;+-- > }+data Union srcAnnot = Union+ { unionName :: Text+ -- ^ Name of the union.+ , unionFields :: [Field srcAnnot]+ -- ^ Fields defined in the union.+ , unionAnnotations :: [TypeAnnotation]+ -- ^ Annotations added to the union.+ , unionDocstring :: Docstring+ -- ^ Documentation.+ , unionSrcAnnot :: srcAnnot+ }+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++L.makeFields ''Union+++-- | Exception types.+--+-- > exception UserDoesNotExist {+-- > 1: optional string message+-- > 2: required string username+-- > }+data Exception srcAnnot = Exception+ { exceptionName :: Text+ -- ^ Name of the exception.+ , exceptionFields :: [Field srcAnnot]+ -- ^ Fields defined in the exception.+ , exceptionAnnotations :: [TypeAnnotation]+ -- ^ Annotations added to the exception.+ , exceptionDocstring :: Docstring+ -- ^ Documentation.+ , exceptionSrcAnnot :: srcAnnot+ }+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++L.makeFields ''Exception+++-- | An string-only enum. These are a deprecated feature of Thrift and+-- shouldn't be used.+data Senum srcAnnot = Senum+ { senumName :: Text+ , senumValues :: [Text]+ , senumAnnotations :: [TypeAnnotation]+ -- ^ Annotations added to the senum.+ , senumDocstring :: Docstring+ -- ^ Documentation.+ , senumSrcAnnot :: srcAnnot+ }+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++L.makeFields ''Senum+++-- | Defines the various types that can be declared in Thrift.+data Type srcAnnot+ = -- | @typedef@+ TypedefType (Typedef srcAnnot)+ | -- | @enum@+ EnumType (Enum srcAnnot)+ | -- | @struct@+ StructType (Struct srcAnnot)+ | -- | @union@+ UnionType (Union srcAnnot)+ | -- | @exception@+ ExceptionType (Exception srcAnnot)+ | -- | @senum@+ SenumType (Senum srcAnnot)+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++_Typedef :: L.Prism' (Type ann) (Typedef ann)+_Typedef = L.prism' TypedefType $ \t ->+ case t of+ TypedefType a -> Just a+ _ -> Nothing++_Enum :: L.Prism' (Type ann) (Enum ann)+_Enum = L.prism' EnumType $ \t ->+ case t of+ EnumType a -> Just a+ _ -> Nothing++_Struct :: L.Prism' (Type ann) (Struct ann)+_Struct = L.prism' StructType $ \t ->+ case t of+ StructType a -> Just a+ _ -> Nothing++_Union :: L.Prism' (Type ann) (Union ann)+_Union = L.prism' UnionType $ \t ->+ case t of+ UnionType a -> Just a+ _ -> Nothing++_Exception :: L.Prism' (Type ann) (Exception ann)+_Exception = L.prism' ExceptionType $ \t ->+ case t of+ ExceptionType a -> Just a+ _ -> Nothing++_Senum :: L.Prism' (Type ann) (Senum ann)+_Senum = L.prism' SenumType $ \t ->+ case t of+ SenumType a -> Just a+ _ -> Nothing+++-- | A definition either consists of new constants, new types, or new+-- services.+data Definition srcAnnot+ = -- | A declared constant.+ ConstDefinition (Const srcAnnot)+ | -- | A custom type.+ TypeDefinition (Type srcAnnot)+ | -- | A service definition.+ ServiceDefinition (Service srcAnnot)+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++_Const :: L.Prism' (Definition ann) (Const ann)+_Const = L.prism' ConstDefinition $ \def ->+ case def of+ ConstDefinition c -> Just c+ _ -> Nothing++_Type :: L.Prism' (Definition ann) (Type ann)+_Type = L.prism' TypeDefinition $ \def ->+ case def of+ TypeDefinition c -> Just c+ _ -> Nothing++_Service :: L.Prism' (Definition ann) (Service ann)+_Service = L.prism' ServiceDefinition $ \def ->+ case def of+ ServiceDefinition c -> Just c+ _ -> Nothing+++-- | Namespace directives allows control of the namespace or package+-- name used by the generated code for certain languages.+--+-- > namespace py my_service.generated+data Namespace srcAnnot = Namespace+ { namespaceLanguage :: Text+ -- ^ The language for which the namespace is being specified. This may+ -- be @*@ to refer to all languages.+ , namespaceName :: Text+ -- ^ Namespace or package path to use in the generated code for that+ -- language.+ , namespaceSrcAnnot :: srcAnnot+ }+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++L.makeFields ''Namespace+++-- | The IDL includes another Thrift file.+--+-- > include "common.thrift"+-- >+-- > typedef common.Foo Bar+--+data Include srcAnnot = Include+ { includePath :: Text+ -- ^ Path to the included file.+ , includeSrcAnnot :: srcAnnot+ }+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++L.makeFields ''Include+++-- | Headers for a program.+data Header srcAnnot+ = -- | Request to include another Thrift file.+ HeaderInclude (Include srcAnnot)+ | -- | A @namespace@ specifier.+ HeaderNamespace (Namespace srcAnnot)+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++_Include :: L.Prism' (Header ann) (Include ann)+_Include = L.prism' HeaderInclude $ \h ->+ case h of+ HeaderInclude inc -> Just inc+ _ -> Nothing++_Namespace :: L.Prism' (Header ann) (Namespace ann)+_Namespace = L.prism' HeaderNamespace $ \h ->+ case h of+ HeaderNamespace ns -> Just ns+ _ -> Nothing+++-- | A program represents a single Thrift document.+data Program srcAnnot = Program+ { programHeaders :: [Header srcAnnot]+ -- ^ Headers in a document define includes and namespaces.+ , programDefinitions :: [Definition srcAnnot]+ -- ^ Types and services defined in the document.+ }+ deriving (Show, Ord, Eq, Data, Typeable, Generic)++L.makeFields ''Program
README.md view
@@ -1,3 +1,5 @@+[![build-status]](https://travis-ci.org/abhinav/language-thrift)+ `language-thrift` provides a parser and pretty printer for the [Thrift IDL format]. In addition to parsing the IDL, it keeps track of Javadoc-style comments (`/** ... */`) and attaches them to the type, service, function, or@@ -11,6 +13,7 @@ Haddock-generated docs are available on [Hackage] and [here]. + [build-status]: https://travis-ci.org/abhinav/language-thrift.svg?branch=master [Thrift IDL format]: http://thrift.apache.org/docs/idl [`parsers`]: http://hackage.haskell.org/package/parsers [`trifecta`]: http://hackage.haskell.org/package/trifecta
+ examples/Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
examples/generateHaskellTypes.hs view
@@ -1,14 +1,18 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RecordWildCards #-} module Main (main) where -- This is a fairly simple code generator that uses language-thrift to parse -- IDL files and produces pretty printed Haskell code for all the types. -- -- For services, it just generates a simple GADT that defines the inputs and--- outputs for that service. Service inheritanec is not supported and--- service method exceptions are ignored.+-- outputs for that service. Service inheritance is not supported and service+-- method exceptions are ignored. +#if __GLASGOW_HASKELL__ >= 709 import Prelude hiding ((<$>))+#endif import Data.Char (toLower, toUpper) import Data.Maybe (isNothing)@@ -23,8 +27,9 @@ import Text.Trifecta.Delta (Delta (Directed)) import Language.Thrift.Parser.Trifecta (thriftIDL)-import Language.Thrift.Types +import qualified Language.Thrift.Types as T+ die :: String -> IO a die s = putStrLn s >> exitFailure @@ -33,7 +38,7 @@ (<&>) = flip fmap infixl 1 <&> -($$) :: Docstring -> Doc -> Doc+($$) :: T.Docstring -> Doc -> Doc ($$) Nothing y = y ($$) (Just t) y = case Text.lines t of [] -> y@@ -49,107 +54,167 @@ tupled :: [Doc] -> Doc tupled = encloseSep lparen rparen (text ", ") -renderConstValue :: ConstValue -> Doc-renderConstValue (ConstInt i) = integer i-renderConstValue (ConstFloat f) = double f-renderConstValue (ConstLiteral l) = dquotes $ text (unpack l) -- TODO escaping-renderConstValue (ConstIdentifier i) = text (unpack i)-renderConstValue (ConstList l) = list (map renderConstValue l)-renderConstValue (ConstMap m) = text "Map.fromList" <+> list (map renderConstTuple m)+renderConstValue :: T.ConstValue a -> Doc+renderConstValue (T.ConstInt i) = integer i+renderConstValue (T.ConstFloat f) = double f+renderConstValue (T.ConstLiteral l) = dquotes $ text (unpack l) -- TODO escaping+renderConstValue (T.ConstIdentifier i _) = text (unpack i)+renderConstValue (T.ConstList l) = list (map renderConstValue l)+renderConstValue (T.ConstMap m) = text "Map.fromList" <+> list (map renderConstTuple m) where- renderConstTuple (a, b) = tupled [- renderConstValue a- , renderConstValue b- ]+ renderConstTuple (a, b) = tupled [renderConstValue a, renderConstValue b] -renderFieldType :: FieldType -> Doc-renderFieldType (DefinedType t) = text (unpack t)-renderFieldType (StringType _) = text "Text"-renderFieldType (BinaryType _) = text "ByteString"-renderFieldType (BoolType _) = text "Bool"-renderFieldType (ByteType _) = text "Word8"-renderFieldType (I16Type _) = text "Word16"-renderFieldType (I32Type _) = text "Word32"-renderFieldType (I64Type _) = text "Word64"-renderFieldType (DoubleType _) = text "Double"-renderFieldType (MapType k v _) =- parens $ hsep [text "Map", renderFieldType k, renderFieldType v]-renderFieldType (SetType i _) = parens $ text "Set" <+> renderFieldType i-renderFieldType (ListType i _) = brackets $ renderFieldType i-renderFieldType t = error $ "Unsupported field type: " ++ show t+renderTypeReference :: Show a => T.TypeReference a -> Doc+renderTypeReference (T.DefinedType t _) = text (unpack t)+renderTypeReference (T.StringType _) = text "Text"+renderTypeReference (T.BinaryType _) = text "ByteString"+renderTypeReference (T.BoolType _) = text "Bool"+renderTypeReference (T.ByteType _) = text "Word8"+renderTypeReference (T.I16Type _) = text "Word16"+renderTypeReference (T.I32Type _) = text "Word32"+renderTypeReference (T.I64Type _) = text "Word64"+renderTypeReference (T.DoubleType _) = text "Double"+renderTypeReference (T.MapType k v _) =+ parens $ hsep [text "Map", renderTypeReference k, renderTypeReference v]+renderTypeReference (T.SetType i _) = parens $ text "Set" <+> renderTypeReference i+renderTypeReference (T.ListType i _) = brackets $ renderTypeReference i+renderTypeReference t = error $ "Unsupported field type: " ++ show t -renderStructField :: Show a => Text -> Field a -> Doc-renderStructField structName (Field _ req ftype fname def _ docstring _) = hang 4 $- docstring $$- fieldName </>- hsep [- text "::"+renderStructField :: Show a => Text -> T.Field a -> Doc+renderStructField structName T.Field{..} = hang 4 $+ fieldDocstring $$ name </> hsep+ [ text "::" , (if isOptional then text "Maybe" <> space- else empty) <> renderFieldType ftype+ else empty)+ <> renderTypeReference fieldValueType ] where isOptional- | isNothing req = False- | otherwise = r == Optional && isNothing def- where (Just r) = req- fieldName = text . unpack $ Text.concat [+ | isNothing fieldRequiredness = False+ | otherwise = r == T.Optional && isNothing fieldDefaultValue+ where (Just r) = fieldRequiredness+ name = text . unpack $ Text.concat [ structName- , underscoresToCamelCase False fname+ , underscoresToCamelCase False fieldName ] -renderType :: Show a => Type a -> Doc-renderType = go+renderTypedef :: Show a => T.Typedef a -> Doc+renderTypedef T.Typedef{..} = typedefDocstring $$ hsep+ [ text "type"+ , typeName typedefName+ , equals+ , renderTypeReference typedefTargetType+ ]++renderEnum :: T.Enum a -> Doc+renderEnum T.Enum{..} = enumDocstring $$+ text "data" <+> typeName enumName <>+ encloseSep (text " = ") empty (text " | ") (map renderDef enumValues)+ <$$> indent 4 derivingClause where- derivingClause =- text "deriving" <+> tupled (map text ["Show", "Ord", "Eq"])+ renderDef T.EnumDef{..} = enumDefDocstring $$ typeName enumDefName - go (Typedef fieldType name docstring _) = docstring $$- hsep [text "type", typeName name, equals, renderFieldType fieldType]- go (Enum name defs docstring _) = docstring $$- text "data" <+> typeName name <>- encloseSep (text " = ") empty (text " | ") (map renderDef defs)- <$$> indent 4 derivingClause- where- renderDef (EnumDef e _ _ docstring _) = docstring $$ typeName e- go (Exception name fields docstring a) = go (Struct name fields docstring a)- go (Struct name fields docstring _) = docstring $$- text "data" <+> typeName name </> equals <+> typeName name <$$>- (if null fields- then empty- else indent 2 renderFields)- </> derivingClause- -- TODO prefix should be configurable using annotations- where- renderFields =- encloseSep (text "{ ") (line <> text "}") (text ", ") $- map (renderStructField structName) fields- structName = underscoresToCamelCase True name- go (Union name fields docstring _) =- hang 4- (docstring $$- text "data" <+> typeName name <$>- encloseSep (text "= ") empty (text " | ")- (map renderField fields))- <$$> indent 4 derivingClause+renderStruct :: Show a => T.Struct a -> Doc+renderStruct T.Struct{..} = structDocstring $$+ text "data" <+> typeName structName </>+ equals <+> typeName structName <$$>+ (if null structFields+ then empty+ else indent 2 renderFields) </> derivingClause+ -- TODO prefix should be configurable using annotations+ where+ renderFields = encloseSep (text "{ ") (line <> text "}") (text ", ") $+ map (renderStructField $ underscoresToCamelCase True structName)+ structFields++renderException :: Show a => T.Exception a -> Doc+renderException T.Exception{..} = renderStruct T.Struct+ { T.structName = exceptionName+ , T.structFields = exceptionFields+ , T.structAnnotations = exceptionAnnotations+ , T.structDocstring = exceptionDocstring+ , T.structSrcAnnot = exceptionSrcAnnot+ }++renderUnion :: Show a => T.Union a -> Doc+renderUnion T.Union{..} =+ hang 4+ (unionDocstring $$+ text "data" <+> typeName unionName <$>+ encloseSep (text "= ") empty (text " | ")+ (map renderField unionFields))+ <$$> indent 4 derivingClause+ where+ renderField (T.Field _ _ ftype fname _ _ docstring _) =+ docstring $$ fieldName </> renderTypeReference ftype where- structName = underscoresToCamelCase False name- renderField (Field _ _ ftype fname _ _ docstring _) =- docstring $$ fieldName </> renderFieldType ftype- where- fieldName = text . unpack $ Text.concat [- structName- , underscoresToCamelCase False fname- ]- go t = error $ "Unsupported type: " ++ show t+ fieldName = text . unpack $ Text.concat+ [ underscoresToCamelCase False unionName+ , underscoresToCamelCase False fname+ ] +derivingClause :: Doc+derivingClause =+ text "deriving" <+> tupled (map text ["Show", "Ord", "Eq"])++renderType :: Show a => T.Type a -> Doc+renderType (T.TypedefType t) = renderTypedef t+renderType (T.EnumType t) = renderEnum t+renderType (T.ExceptionType t) = renderException t+renderType (T.StructType t) = renderStruct t+renderType (T.UnionType t) = renderUnion t+renderType t = error $ "Unsupported type: " ++ show t+ typeName :: Text -> Doc typeName = mkName False -generateOutput :: Show a => Program a -> IO ()-generateOutput (Program _ definitions) = do+renderConst :: Show a => T.Const a -> Doc+renderConst T.Const{..} = constDocstring $$+ sep [name, text "::", renderTypeReference constValueType] <$>+ sep [name, text "=", renderConstValue constValue]+ where+ name = mkName True constName+++renderFunction :: Show a => Text -> T.Function a -> Doc+renderFunction serviceName T.Function{functionOneWay = False, ..} =+ functionDocstring $$+ typeName functionName <+> text "::" <>+ (if null functionParameters+ then space+ else linebreak <> renderParams) <>+ typeName serviceName <+> returnType <> linebreak+ where+ returnType = case functionReturnType of+ Nothing -> text "()"+ Just t -> renderTypeReference t++ renderParams = indent 2 $+ encloseSep (text "{ ") (line <> text "} -> ") (text ", ") $+ map (renderStructField structName) functionParameters+ where+ structName = underscoresToCamelCase True functionName+renderFunction _ f = error $ "Unsupported function: " ++ show f+++renderService :: Show a => T.Service a -> Doc+renderService T.Service{serviceExtends = Nothing, ..} = serviceDocstring $$+ text "data" <+> typeName serviceName <+> text "a where" <$$>+ indent 2 (vcat (map (renderFunction serviceName) serviceFunctions))+renderService s = error $ "Unsupported service: " ++ show s+++renderDefinition :: Show a => T.Definition a -> Doc+renderDefinition (T.ConstDefinition c) = renderConst c+renderDefinition (T.TypeDefinition t) = renderType t+renderDefinition (T.ServiceDefinition s) = renderService s+++generateOutput :: Show a => T.Program a -> IO ()+generateOutput (T.Program _ definitions) = do let doc = headers <$> empty <$>- vcat (map ((<$> empty) . genDef) definitions)+ vcat (map ((<$> empty) . renderDefinition) definitions) displayIO stdout $ renderPretty 0.8 80 doc where import_ m items = sep [@@ -174,36 +239,6 @@ , text "" , importQualified "Data.Map" "Map" ]-- genDef :: Show a => Definition a -> Doc- genDef (ConstDefinition fieldType name value docstring _) = docstring $$- sep [fieldName name, text "::", renderFieldType fieldType] <$>- sep [fieldName name, text "=", renderConstValue value]- genDef (TypeDefinition typeDef _) = renderType typeDef- genDef (ServiceDefinition sname Nothing funcs _ docstring _) = docstring $$- text "data" <+> typeName sname <+> text "a where" <$$>- indent 2 (vcat (map renderFunc funcs))- where- renderFunc (Function False rtype name params _ _ docstring _) =- docstring $$- typeName name <+> text "::" <>- (if null params- then space- else linebreak <> renderParams name params) <>- typeName sname <+> returnType- <> linebreak- where- returnType = case rtype of- Nothing -> text "()"- Just t -> renderFieldType t-- renderParams fname params = indent 2 $- encloseSep (text "{ ") (line <> text "} -> ") (text ", ") $- map (renderStructField structName) params- where- structName = underscoresToCamelCase True fname-- fieldName = mkName True mkName :: Bool -> Text -> Doc mkName lowerFirst = text . unpack . underscoresToCamelCase lowerFirst
examples/reformatIDL.hs view
@@ -6,19 +6,20 @@ -- -- Docstrings in the IDL are preserved but COMMENTS WILL BE LOST. -import System.IO (stderr)-import Text.Trifecta (Result (..), parseString)-import Text.Trifecta.Delta (Delta (Directed))-import Text.PrettyPrint.Leijen (putDoc)+import System.IO (stderr)+import Text.PrettyPrint.Leijen (putDoc)+import Text.Trifecta (Result (..), parseString)+import Text.Trifecta.Delta (Delta (Directed)) import qualified Text.PrettyPrint.ANSI.Leijen as AnsiPP -import Language.Thrift.Pretty (prettyPrint) import Language.Thrift.Parser.Trifecta (thriftIDL)+import Language.Thrift.Pretty (prettyPrint) main :: IO () main = do- result <- parseString thriftIDL (Directed "stdin" 0 0 0 0) <$> getContents+ result <-+ parseString thriftIDL (Directed "stdin" 0 0 0 0) `fmap` getContents case result of Success p -> putDoc (prettyPrint p) >> putStrLn "" Failure doc ->
language-thrift.cabal view
@@ -1,5 +1,5 @@ name : language-thrift-version : 0.4.0.0+version : 0.5.0.0 synopsis : Parser and pretty printer for the Thrift IDL format. homepage : https://github.com/abhinav/language-thrift license : BSD3@@ -22,24 +22,35 @@ , Language.Thrift.Parser.Trifecta , Language.Thrift.Pretty , Language.Thrift.Types- build-depends : base >= 4.7 && < 4.9- , mtl- , text >= 1.2- , parsers >= 0.12 && < 0.13- , trifecta >= 1.5 && < 1.6- , wl-pprint >= 1.1+ ghc-options : -Wall+ build-depends : base >= 4.7 && < 4.9++ , lens >= 4.0 && < 5.0+ , parsers >= 0.12 && < 0.13+ , text >= 1.2+ , transformers+ , trifecta >= 1.5 && < 1.6+ , wl-pprint >= 1.1 default-language : Haskell2010 test-suite spec type : exitcode-stdio-1.0 hs-source-dirs : test- main-is : Spec.hs- other-modules : Language.Thrift.TypesSpec+ main-is : Main.hs+ ghc-options : -Wall+ other-modules : Language.Thrift.Arbitrary+ , Language.Thrift.ParserSpec+ , Language.Thrift.TypesSpec+ , Spec+ , TestUtils build-depends : base+ , hspec >= 2.0 , hspec-discover >= 2.1 , QuickCheck >= 2.5++ , parsers , text , trifecta , wl-pprint
+ test/Language/Thrift/Arbitrary.hs view
@@ -0,0 +1,288 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE OverloadedStrings #-}+module Language.Thrift.Arbitrary () where++#if __GLASGOW_HASKELL__ < 709+import Control.Applicative+#endif++import Data.Text (Text)+import Data.Typeable (Typeable)+import GHC.Generics (Generic)+import Test.QuickCheck++import qualified Data.Text as Text++import qualified Language.Thrift.Types as T++#ifdef MIN_VERSION_QuickCheck+#if !MIN_VERSION_QuickCheck(2, 8, 0)+scale :: (Int -> Int) -> Gen a -> Gen a+scale f g = sized (\n -> resize (f n) g)+#endif+#endif+++-- | Halve the maximum size of generated values.+--+-- Generally speaking, it's a good idea to use this for calls that will+-- recursively generate lists of things so that they terminate at some point.+halfSize :: Gen a -> Gen a+halfSize = scale (\n -> truncate (fromIntegral n / 2 :: Double))++------------------------------------------------------------------------------++instance Arbitrary Text where+ arbitrary = Text.pack <$> listOf1 (elements charset)+ where+ charset = ['a'..'z'] ++ ['A'..'Z']++ shrink t+ | Text.length t < 2 = []+ | otherwise =+ [xs]+ ++ [Text.cons x xs' | xs' <- shrink xs]+ ++ [Text.cons x' xs | x' <- shrink x]+ where+ Just (x, xs) = Text.uncons t++newtype Docstring = Docstring { getDocstring :: Maybe Text }++instance Arbitrary Docstring where+ arbitrary = Docstring <$> oneof [return Nothing, comment]+ where+ commentLine = Text.unwords <$> listOf arbitrary+ comment = do+ s <- Text.strip . Text.unlines <$> listOf1 (halfSize commentLine)+ if Text.null s+ then return Nothing+ else return (Just s)++ shrink (Docstring t) = Docstring <$> shrink t++------------------------------------------------------------------------------++instance Arbitrary (T.Program ()) where+ shrink = genericShrink+ arbitrary = T.Program <$> arbitrary <*> arbitrary++instance Arbitrary (T.Header ()) where+ shrink = genericShrink+ arbitrary = oneof+ [ T.HeaderInclude <$> arbitrary+ , T.HeaderNamespace <$> arbitrary+ ]++instance Arbitrary (T.Include ()) where+ shrink = genericShrink+ arbitrary = T.Include <$> arbitrary <*> pure ()++instance Arbitrary (T.Namespace ()) where+ shrink = genericShrink+ arbitrary = T.Namespace <$> elements scopes <*> arbitrary <*> pure ()+ where+ scopes = ["py", "rb", "java", "hs", "cpp"]+++instance Arbitrary (T.Definition ()) where+ shrink = genericShrink+ arbitrary = oneof+ [ T.ConstDefinition <$> arbitrary+ , T.TypeDefinition <$> arbitrary+ , T.ServiceDefinition <$> arbitrary+ ]++instance Arbitrary (T.Const ()) where+ shrink = genericShrink+ arbitrary =+ T.Const+ <$> arbitrary+ <*> arbitrary+ <*> arbitrary+ <*> (getDocstring <$> arbitrary)+ <*> pure ()++instance Arbitrary (T.Service ()) where+ shrink = genericShrink+ arbitrary =+ T.Service+ <$> arbitrary+ <*> arbitrary+ <*> arbitrary+ <*> halfSize arbitrary+ <*> (getDocstring <$> arbitrary)+ <*> pure ()++instance Arbitrary (T.Function ()) where+ shrink = genericShrink+ arbitrary =+ T.Function+ <$> arbitrary+ <*> halfSize arbitrary+ <*> arbitrary+ <*> halfSize arbitrary+ <*> halfSize arbitrary+ <*> halfSize arbitrary+ <*> (getDocstring <$> arbitrary)+ <*> pure ()++instance Arbitrary (T.Type ()) where+ shrink = genericShrink+ arbitrary = oneof+ [ T.TypedefType <$> arbitrary+ , T.EnumType <$> arbitrary+ , T.StructType <$> arbitrary+ , T.UnionType <$> arbitrary+ , T.ExceptionType <$> arbitrary+ , T.SenumType <$> arbitrary+ ]++instance Arbitrary (T.Typedef ()) where+ shrink = genericShrink+ arbitrary = T.Typedef+ <$> arbitrary+ <*> arbitrary+ <*> halfSize arbitrary+ <*> (getDocstring <$> arbitrary)+ <*> pure ()++instance Arbitrary (T.Enum ()) where+ shrink = genericShrink+ arbitrary = T.Enum+ <$> arbitrary+ <*> arbitrary+ <*> halfSize arbitrary+ <*> (getDocstring <$> arbitrary)+ <*> pure ()++instance Arbitrary (T.EnumDef ()) where+ shrink = genericShrink+ arbitrary =+ T.EnumDef+ <$> arbitrary+ <*> arbitrary+ <*> halfSize arbitrary+ <*> (getDocstring <$> arbitrary)+ <*> pure ()++instance Arbitrary (T.Struct ()) where+ shrink = genericShrink+ arbitrary = T.Struct+ <$> arbitrary+ <*> arbitrary+ <*> halfSize arbitrary+ <*> (getDocstring <$> arbitrary)+ <*> pure ()++instance Arbitrary (T.Union ()) where+ shrink = genericShrink+ arbitrary = T.Union+ <$> arbitrary+ <*> arbitrary+ <*> halfSize arbitrary+ <*> (getDocstring <$> arbitrary)+ <*> pure ()++instance Arbitrary (T.Exception ()) where+ shrink = genericShrink+ arbitrary = T.Exception+ <$> arbitrary+ <*> arbitrary+ <*> halfSize arbitrary+ <*> (getDocstring <$> arbitrary)+ <*> pure ()++instance Arbitrary (T.Senum ()) where+ shrink = genericShrink+ arbitrary = T.Senum+ <$> arbitrary+ <*> arbitrary+ <*> halfSize arbitrary+ <*> (getDocstring <$> arbitrary)+ <*> pure ()++instance Arbitrary (T.Field ()) where+ shrink = genericShrink+ arbitrary =+ T.Field+ <$> (fmap getPositive <$> arbitrary)+ <*> arbitrary+ <*> halfSize arbitrary+ <*> arbitrary+ <*> halfSize arbitrary+ <*> halfSize arbitrary+ <*> (getDocstring <$> arbitrary)+ <*> pure ()++instance Arbitrary (T.TypeReference ()) where+ shrink = genericShrink+ arbitrary = oneof+ [ T.DefinedType <$> arbitrary <*> pure ()++ , halfSize $ T.StringType <$> arbitrary+ , halfSize $ T.BinaryType <$> arbitrary+ , halfSize $ T.SListType <$> arbitrary+ , halfSize $ T.BoolType <$> arbitrary+ , halfSize $ T.ByteType <$> arbitrary+ , halfSize $ T.I16Type <$> arbitrary+ , halfSize $ T.I32Type <$> arbitrary+ , halfSize $ T.I64Type <$> arbitrary+ , halfSize $ T.DoubleType <$> arbitrary+ , halfSize $ T.MapType <$> arbitrary <*> arbitrary <*> arbitrary+ , halfSize $ T.SetType <$> arbitrary <*> arbitrary+ , halfSize $ T.ListType <$> arbitrary <*> arbitrary+ ]++instance Arbitrary (T.FieldRequiredness) where+ shrink = genericShrink+ arbitrary = elements [T.Required, T.Optional]++instance Arbitrary T.TypeAnnotation where+ shrink = genericShrink+ arbitrary = T.TypeAnnotation <$> arbitrary <*> arbitrary+++newtype BasicConstValue = BasicConstValue {+ getBasicConstValue :: T.ConstValue ()+ } deriving (Typeable, Generic)+++instance Arbitrary BasicConstValue where+ shrink = genericShrink+ arbitrary = BasicConstValue <$> oneof+ [ T.ConstFloat <$> choose (0.0, 10000.0)+ , T.ConstInt <$> arbitrary+ , T.ConstLiteral <$> arbitrary+ , T.ConstIdentifier <$> arbitrary <*> pure ()+ ]++-- | newtype wrapper around const values so that we're not generating lists+-- and maps that go on forever.+newtype FiniteConstValue =+ FiniteConstValue { getFiniteConstValue :: T.ConstValue () }+ deriving (Typeable, Generic)++instance Arbitrary FiniteConstValue where+ shrink = genericShrink+ arbitrary = FiniteConstValue <$> oneof+ [ basicConsts+ , T.ConstList <$> constList+ , T.ConstMap <$> constMap+ ]+ where+ basicConsts = getBasicConstValue <$> arbitrary+ constList+ = listOf $ halfSize $ getFiniteConstValue <$> arbitrary+ constMap+ = listOf $+ (,) <$> basicConsts+ <*> halfSize (getFiniteConstValue <$> arbitrary)+++instance Arbitrary (T.ConstValue ()) where+ shrink = genericShrink+ arbitrary = getFiniteConstValue <$> arbitrary
+ test/Language/Thrift/ParserSpec.hs view
@@ -0,0 +1,47 @@+{-# LANGUAGE CPP #-}+module Language.Thrift.ParserSpec (spec) where++#if __GLASGOW_HASKELL__ < 709+import Control.Applicative+#endif++import Test.Hspec+import Text.Parser.Combinators (eof)++import TestUtils++import qualified Language.Thrift.Parser as P+import qualified Language.Thrift.Types as T++spec :: Spec+spec = describe "Parser" $ do++ it "can parse empty documents" $+ assertParses P.program (T.Program [] []) ""++ testParseFailure++testParseFailure :: Spec+testParseFailure = do++ it "cannot parse invalid documents" $+ parseFailureCases P.program+ [ "namespace foo"+ , "const i32 100 = \"foo\""+ , "include \"foo"+ , "enum { }"+ , "struct { }"+ , "service A extends B"+ , "service A extends {}"+ ]++ it "cannot parse invalid type references" $+ parseFailureCases (P.typeReference <* eof)+ [ "list<i32"+ , "set<string, string>"+ , "map<i64>"+ , "something_else<foo>"+ ]++parseFailureCases :: Show a => Parser a -> [String] -> Expectation+parseFailureCases p = mapM_ (p `shouldNotParse`)
test/Language/Thrift/TypesSpec.hs view
@@ -1,283 +1,62 @@-{-# OPTIONS_GHC -fno-warn-orphans #-}-{-# LANGUAGE CPP #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE ScopedTypeVariables #-}-module Language.Thrift.TypesSpec where--#if __GLASGOW_HASKELL__ < 709-import Control.Applicative-#endif+{-# LANGUAGE OverloadedStrings #-}+module Language.Thrift.TypesSpec (spec) where -import Control.Monad (unless)-import Data.Text (Text) import Test.Hspec import Test.Hspec.QuickCheck-import Test.QuickCheck import Text.PrettyPrint.Leijen (Doc)--import Text.Trifecta (parseString)-import Text.Trifecta.Delta (Delta (..))+import Text.Parser.Token (whiteSpace) -import qualified Data.Text as Text-import qualified Text.Trifecta as Tri+import Language.Thrift.Arbitrary ()+import TestUtils import qualified Language.Thrift.Parser as P import qualified Language.Thrift.Pretty as PP-import qualified Language.Thrift.Types as T ---- | Halve the maximum size of generated values.------ Generally speaking, it's a good idea to use this for calls that will--- recursively generate lists of things so that they terminate at some point.-halfSize :: Gen a -> Gen a-halfSize = scale (\n -> truncate (fromIntegral n / 2 :: Double))--newtype Identifier = Identifier { getIdentifier :: Text }--instance Arbitrary Identifier where- arbitrary = Identifier . Text.pack <$> listOf1 (elements charset)- where- charset = ['a'..'z'] ++ ['A'..'Z']--newtype Docstring = Docstring { getDocstring :: Maybe Text }--instance Arbitrary Docstring where- arbitrary = Docstring <$> oneof [return Nothing, comment]- where- commentLine =- Text.unwords <$> listOf (getIdentifier <$> arbitrary)- comment = do- s <- Text.strip . Text.unlines <$> listOf1 (halfSize commentLine)- if Text.null s- then return Nothing- else return (Just s)---instance Arbitrary (T.Program ()) where- arbitrary = T.Program <$> arbitrary <*> arbitrary---instance Arbitrary (T.Definition ()) where- arbitrary = oneof [arbitraryConst, arbitraryType, arbitraryService]- where- arbitraryConst =- T.ConstDefinition- <$> arbitrary- <*> (getIdentifier <$> arbitrary)- <*> arbitrary- <*> (getDocstring <$> arbitrary)- <*> pure ()-- arbitraryType =- T.TypeDefinition- <$> arbitrary- <*> arbitrary-- arbitraryService =- T.ServiceDefinition- <$> (getIdentifier <$> arbitrary)- <*> (fmap getIdentifier <$> arbitrary)- <*> arbitrary- <*> arbitrary- <*> (getDocstring <$> arbitrary)- <*> pure ()---instance Arbitrary T.Header where- arbitrary = oneof- [ T.Include <$> (getIdentifier <$> arbitrary)- , T.Namespace <$> elements scopes- <*> (getIdentifier <$> arbitrary)- ]- where- scopes = ["py", "rb", "java", "hs", "cpp"]---instance Arbitrary (T.Field ()) where- arbitrary =- T.Field- <$> (fmap getPositive <$> arbitrary)- <*> arbitrary- <*> halfSize arbitrary- <*> (getIdentifier <$> arbitrary)- <*> halfSize arbitrary- <*> arbitrary- <*> (getDocstring <$> arbitrary)- <*> pure ()---instance Arbitrary (T.Function ()) where- arbitrary =- T.Function- <$> elements [True, False]- <*> arbitrary- <*> (getIdentifier <$> arbitrary)- <*> arbitrary- <*> arbitrary- <*> arbitrary- <*> (getDocstring <$> arbitrary)- <*> pure ()---instance Arbitrary T.TypeAnnotation where- arbitrary =- T.TypeAnnotation- <$> (getIdentifier <$> arbitrary)- <*> (getIdentifier <$> arbitrary)---instance Arbitrary (T.EnumDef ()) where- arbitrary =- T.EnumDef- <$> (getIdentifier <$> arbitrary)- <*> arbitrary- <*> arbitrary- <*> (getDocstring <$> arbitrary)- <*> pure ()---instance Arbitrary (T.Type ()) where- arbitrary = oneof- [ T.Typedef- <$> arbitrary- <*> (getIdentifier <$> arbitrary)- <*> (getDocstring <$> arbitrary)- <*> pure ()- , T.Enum- <$> (getIdentifier <$> arbitrary)- <*> arbitrary- <*> (getDocstring <$> arbitrary)- <*> pure ()- , T.Struct- <$> (getIdentifier <$> arbitrary)- <*> arbitrary- <*> (getDocstring <$> arbitrary)- <*> pure ()- , T.Union- <$> (getIdentifier <$> arbitrary)- <*> arbitrary- <*> (getDocstring <$> arbitrary)- <*> pure ()- , T.Exception- <$> (getIdentifier <$> arbitrary)- <*> arbitrary- <*> (getDocstring <$> arbitrary)- <*> pure ()- , T.Senum- <$> (getIdentifier <$> arbitrary)- <*> (map getIdentifier <$> arbitrary)- <*> (getDocstring <$> arbitrary)- <*> pure ()- ]---instance Arbitrary (T.FieldRequiredness) where- arbitrary = elements [T.Required, T.Optional]--instance Arbitrary T.FieldType where- arbitrary = oneof- [ T.DefinedType . getIdentifier <$> arbitrary-- , T.StringType <$> arbitrary- , T.BinaryType <$> arbitrary- , T.SListType <$> arbitrary- , T.BoolType <$> arbitrary- , T.ByteType <$> arbitrary- , T.I16Type <$> arbitrary- , T.I32Type <$> arbitrary- , T.I64Type <$> arbitrary- , T.DoubleType <$> arbitrary-- , halfSize $- T.MapType <$> arbitrary <*> arbitrary <*> arbitrary- , halfSize $- T.SetType <$> arbitrary <*> arbitrary- , halfSize $- T.ListType <$> arbitrary <*> arbitrary- ]---newtype BasicConstValue = BasicConstValue {- getBasicConstValue :: T.ConstValue- }---instance Arbitrary BasicConstValue where- arbitrary = BasicConstValue <$> oneof- [ T.ConstFloat <$> choose (0.0, 10000.0)- , T.ConstInt <$> arbitrary- , T.ConstLiteral . getIdentifier <$> arbitrary- , T.ConstIdentifier . getIdentifier <$> arbitrary- ]+spec :: Spec+spec =+ describe "Parser and Printer" $ do --- | newtype wrapper around const values so that we're not generating lists--- and maps that go on forever.-newtype FiniteConstValue =- FiniteConstValue { getFiniteConstValue :: T.ConstValue }+ prop "can round-trip type references" $+ roundtrip PP.typeReference P.typeReference + prop "can round-trip constant values" $+ roundtrip PP.constantValue P.constantValue -instance Arbitrary FiniteConstValue where- arbitrary = FiniteConstValue <$> oneof- [ basicConsts- , T.ConstList <$> constList- , T.ConstMap <$> constMap- ]- where- basicConsts = getBasicConstValue <$> arbitrary- constList- = listOf $ halfSize $ getFiniteConstValue <$> arbitrary- constMap- = listOf $- (,) <$> basicConsts- <*> halfSize (getFiniteConstValue <$> arbitrary)+ prop "can round-trip typedefs" $+ roundtrip PP.typedef (whiteSpace >> P.typedef) + prop "can round-trip enums" $+ roundtrip PP.enum (whiteSpace >> P.enum) -instance Arbitrary T.ConstValue where- arbitrary = getFiniteConstValue <$> arbitrary+ prop "can round-trip structs" $+ roundtrip PP.struct (whiteSpace >> P.struct) + prop "can round-trip unions" $+ roundtrip PP.union (whiteSpace >> P.union) -spec :: Spec-spec =- describe "Can round trip" $ do+ prop "can round-trip exceptions" $+ roundtrip PP.exception (whiteSpace >> P.exception) - prop "field types" $- roundtrip PP.fieldType P.fieldType+ prop "can round-trip senums" $+ roundtrip PP.senum (whiteSpace >> P.senum) - prop "constant values" $- roundtrip PP.constantValue P.constantValue+ prop "can round-trip services" $+ roundtrip PP.service (whiteSpace >> P.service) - prop "functions" $- roundtrip PP.function (Tri.whiteSpace *> P.function)+ prop "can round-trip constants" $+ roundtrip PP.constant (whiteSpace >> P.constant) - prop "definitions" $- roundtrip PP.definition (Tri.whiteSpace *> P.definition)+ prop "can round-trip includes" $+ roundtrip (const PP.include) (whiteSpace >> P.include) - prop "headers" $- roundtrip (const PP.header) P.header+ prop "can round-trip namespaces" $+ roundtrip (const PP.namespace) (whiteSpace >> P.namespace) - prop "documents" $+ prop "can round-trip documents" $ roundtrip PP.program P.program roundtrip- :: (Show a, Eq a)- => (PP.Config -> a -> Doc)- -> P.ThriftParser Tri.Parser () a- -> a- -> IO ()-roundtrip printer parser value = do- let pretty = show . printer (PP.Config 4)- triParser = P.runThriftParser (return ()) parser- result =- parseString triParser (Directed "memory" 0 0 0 0) (pretty value)- case result of- Tri.Success parsed ->- unless (parsed == value) $ expectationFailure $- "expected: " ++ show value ++ "\n but got: " ++ show parsed ++- "\n\n expected (pretty): " ++ pretty value ++- "\n but got (pretty): " ++ pretty parsed- Tri.Failure msg -> expectationFailure $- "failed to parse " ++ pretty value ++- "\n with " ++ show msg+ :: (Show a, Eq a) => (PP.Config -> a -> Doc) -> Parser a -> a -> IO ()+roundtrip printer parser value =+ assertParses parser value (show $ printer (PP.Config 4) value)
+ test/Main.hs view
@@ -0,0 +1,11 @@+module Main (main) where++import Test.Hspec.Runner++import qualified Spec++main :: IO ()+main =+ hspecWith+ defaultConfig { configQuickCheckMaxSize = Just 25 }+ Spec.spec
test/Spec.hs view
@@ -1,1 +1,1 @@-{-# OPTIONS_GHC -F -pgmF hspec-discover #-}+{-# OPTIONS_GHC -F -pgmF hspec-discover -optF --module-name=Spec #-}
+ test/TestUtils.hs view
@@ -0,0 +1,49 @@+{-# LANGUAGE OverloadedStrings #-}+module TestUtils+ ( assertParses+ , shouldNotParse+ , Parser+ ) where++import Test.Hspec (expectationFailure, shouldBe)++import qualified Text.Trifecta as T+import qualified Text.Trifecta.Delta as T++import qualified Language.Thrift.Parser as P++type Parser a = P.ThriftParser T.Parser () a++parse :: Parser a -> String -> T.Result a+parse parser = T.parseString trifectaParser (T.Directed "memory" 0 0 0 0)+ where+ trifectaParser = P.runThriftParser (return ()) parser++-- | @assertParses parser expected input@ will assert that running @parser@ on+-- @input@ will produce @expected@.+assertParses :: (Show a, Eq a) => Parser a -> a -> String -> IO ()+assertParses parser expected input =+ case parse parser input of+ T.Success got -> got `shouldBe` expected+ T.Failure msg -> expectationFailure $+ "failed to parse:\n" ++ indent 8 input +++ "\n\texpected: " ++ show expected +++ "\n\tgot (error): " ++ show msg++-- | @parser `shouldNotParse` input@ will assert that running @parser@ on+-- @input@ will fail.+shouldNotParse :: Show a => Parser a -> String -> IO ()+shouldNotParse parser input =+ case parse parser input of+ T.Success result -> expectationFailure $+ "expected parse failure for\n" ++ indent 8 input +++ "\n\tgot success: " ++ show result+ T.Failure _ -> return ()+++-- | Indent all lines in the string the given number of spaces.+indent :: Int -> String -> String+indent n = unlines . map go . lines+ where+ go l = if null l then l else space ++ l+ space = replicate n ' '