LGTM.
Thanks,
Jose
On Fri, Dec 13, 2013 at 01:36:10PM +0100, Petr Pudlák wrote:
> Interdiff:
>
> diff --git a/src/Ganeti/Hs2Py/GenOpCodes.hs b/src/Ganeti/Hs2Py/GenOpCodes.hs
> index 5f0c48c..0f8fbb1 100644
> --- a/src/Ganeti/Hs2Py/GenOpCodes.hs
> +++ b/src/Ganeti/Hs2Py/GenOpCodes.hs
> @@ -45,10 +45,10 @@ pyClassDoc doc
> pyClassField :: OpCodeField -> String
> pyClassField (OpCodeField name typ Nothing doc) =
> "(" ++ intercalate ", " [show name, "None", typ, show doc] ++ ")"
> -
> +
> pyClassField (OpCodeField name typ (Just def) doc) =
> "(" ++ intercalate ", " [show name, showValue def, typ, show doc] ++ ")"
> -
> +
> -- | Comma intercalates and indents opcode parameters in Python.
> intercalateIndent :: [String] -> String
> intercalateIndent xs = intercalate "," (map ("\n " ++) xs)
> diff --git a/src/Ganeti/THH.hs b/src/Ganeti/THH.hs
> index c6b48e6..e7eb7b6 100644
> --- a/src/Ganeti/THH.hs
> +++ b/src/Ganeti/THH.hs
> @@ -717,12 +717,6 @@ pyClass (consName, consType, consDoc, consFields,
> consDscField) =
> consName' = stringE consName
> let consType' = genPyType' NotOptional consType
> let consDoc' = stringE consDoc
> -{-
> - consFieldNames = listE $ map (stringE . fieldName) consFields
> - consFieldDocs = listE $ map (stringE . fieldDoc) consFields
> - consFieldTypes <- genPyTypes consFields
> - let consFieldDefaults = genPyDefaults consFields
> - -}
> [| OpCodeDescriptor $consName'
> $consType'
> $consDoc'
>
>
>
> On Fri, Dec 13, 2013 at 1:18 PM, Jose A. Lopes <[email protected]> wrote:
>
> > On Fri, Dec 13, 2013 at 12:47:52PM +0100, Petr Pudlak wrote:
> > > This greatly enhances code readability.
> > >
> > > Also fix monadic types "Q ExpQ" [which is "Q (Q Exp)"] to "Q Exp".
> > >
> > > Signed-off-by: Petr Pudlak <[email protected]>
> > > ---
> > > src/Ganeti/Hs2Py/GenOpCodes.hs | 12 ++++----
> > > src/Ganeti/THH.hs | 65
> > ++++++++++++++++++++++++------------------
> > > 2 files changed, 44 insertions(+), 33 deletions(-)
> > >
> > > diff --git a/src/Ganeti/Hs2Py/GenOpCodes.hs
> > b/src/Ganeti/Hs2Py/GenOpCodes.hs
> > > index 0683b5d..5f0c48c 100644
> > > --- a/src/Ganeti/Hs2Py/GenOpCodes.hs
> > > +++ b/src/Ganeti/Hs2Py/GenOpCodes.hs
> > > @@ -28,7 +28,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor,
> > Boston, MA
> > >
> > > module Ganeti.Hs2Py.GenOpCodes (showPyClasses) where
> > >
> > > -import Data.List (intercalate, zipWith4)
> > > +import Data.List (intercalate)
> > >
> > > import Ganeti.OpCodes
> > > import Ganeti.THH
> > > @@ -42,11 +42,11 @@ pyClassDoc doc
> > > " \"\"\"" ++ doc ++ "\"\"\"" ++ "\n"
> > >
> > > -- | Generates an opcode parameter in Python.
> > > -pyClassField :: String -> String -> Maybe PyValueEx -> String -> String
> > > -pyClassField name typ Nothing doc =
> > > +pyClassField :: OpCodeField -> String
> > > +pyClassField (OpCodeField name typ Nothing doc) =
> > > "(" ++ intercalate ", " [show name, "None", typ, show doc] ++ ")"
> > >
> >
> > Trailing whitespace.
> >
> > > -pyClassField name typ (Just (PyValueEx def)) doc =
> > > +pyClassField (OpCodeField name typ (Just def) doc) =
> > > "(" ++ intercalate ", " [show name, showValue def, typ, show doc] ++
> > ")"
> > >
> >
> > Trailing whitespace.
> >
> > > -- | Comma intercalates and indents opcode parameters in Python.
> > > @@ -55,7 +55,7 @@ intercalateIndent xs = intercalate "," (map ("\n "
> > ++) xs)
> > >
> > > -- | Generates an opcode as a Python class.
> > > showPyClass :: OpCodeDescriptor -> String
> > > -showPyClass (name, typ, doc, fields, types, defs, docs, dsc) =
> > > +showPyClass (OpCodeDescriptor name typ doc fields dsc) =
> > > let
> > > baseclass
> > > | name == "OpInstanceMultiAlloc" = "OpInstanceMultiAllocBase"
> > > @@ -71,7 +71,7 @@ showPyClass (name, typ, doc, fields, types, defs,
> > docs, dsc) =
> > > pyClassDoc doc ++
> > > opDscField ++
> > > " OP_PARAMS = [" ++
> > > - intercalateIndent (zipWith4 pyClassField fields types defs docs) ++
> > > + intercalateIndent (map pyClassField fields) ++
> > > "\n ]" ++ "\n" ++
> > > " OP_RESULT = " ++ typ ++
> > > withLU ++ "\n\n"
> > > diff --git a/src/Ganeti/THH.hs b/src/Ganeti/THH.hs
> > > index 7728e4d..c6b48e6 100644
> > > --- a/src/Ganeti/THH.hs
> > > +++ b/src/Ganeti/THH.hs
> > > @@ -40,7 +40,8 @@ module Ganeti.THH ( declareSADT
> > > , genAllOpIDs
> > > , PyValue(..)
> > > , PyValueEx(..)
> > > - , OpCodeDescriptor
> > > + , OpCodeField(..)
> > > + , OpCodeDescriptor(..)
> > > , genOpCode
> > > , genStrOfOp
> > > , genStrOfKey
> > > @@ -67,9 +68,11 @@ module Ganeti.THH ( declareSADT
> > > , excErrMsg
> > > ) where
> > >
> > > -import Control.Monad (liftM)
> > > +import Control.Applicative
> > > +import Control.Monad
> > > import Data.Char
> > > import Data.List
> > > +import Data.Maybe
> > > import qualified Data.Set as Set
> > > import Language.Haskell.TH
> > >
> > > @@ -79,8 +82,6 @@ import Text.JSON.Pretty (pp_value)
> > > import Ganeti.JSON
> > > import Ganeti.PyValue
> > >
> > > -import Data.Maybe
> > > -import Data.Functor ((<$>))
> > >
> > > -- * Exported types
> > >
> > > @@ -585,11 +586,20 @@ type OpParam = (String, Q Type, Q Exp)
> > >
> > > -- * Python code generation
> > >
> > > +data OpCodeField = OpCodeField { ocfName :: String
> > > + , ocfType :: String
> > > + , ocfDefl :: Maybe PyValueEx
> > > + , ocfDoc :: String
> > > + }
> > > +
> > > -- | Transfers opcode data between the opcode description (through
> > > -- @genOpCode@) and the Python code generation functions.
> > > -type OpCodeDescriptor =
> > > - (String, String, String, [String],
> > > - [String], [Maybe PyValueEx], [String], String)
> > > +data OpCodeDescriptor = OpCodeDescriptor { ocdName :: String
> > > + , ocdType :: String
> > > + , ocdDoc :: String
> > > + , ocdFields :: [OpCodeField]
> > > + , ocdDescr :: String
> > > + }
> > >
> > > -- | Strips out the module name
> > > --
> > > @@ -682,41 +692,42 @@ maybeApp (Just expr) typ =
> > >
> > > -- | Generates a Python type according to whether the field is
> > > -- optional
> > > -genPyType :: OptionalType -> Q Type -> Q ExpQ
> > > -genPyType opt typ =
> > > - do t <- typ
> > > - stringE <$> pyOptionalType (opt /= NotOptional) t
> > > +genPyType' :: OptionalType -> Q Type -> Q Exp
> > > +genPyType' opt typ = typ >>= pyOptionalType (opt /= NotOptional) >>=
> > stringE
> > >
> > > -- | Generates Python types from opcode parameters.
> > > -genPyTypes :: [Field] -> Q ExpQ
> > > -genPyTypes fs =
> > > - listE <$> mapM (\f -> genPyType (fieldIsOptional f) (fieldType f)) fs
> > > +genPyType :: Field -> Q Exp
> > > +genPyType f = genPyType' (fieldIsOptional f) (fieldType f)
> > >
> > > -- | Generates Python default values from opcode parameters.
> > > -genPyDefaults :: [Field] -> ExpQ
> > > -genPyDefaults fs =
> > > - listE $ map (\f -> maybeApp (fieldDefault f) (fieldType f)) fs
> > > +genPyDefault :: Field -> Q Exp
> > > +genPyDefault f = maybeApp (fieldDefault f) (fieldType f)
> > > +
> > > +pyField :: Field -> Q Exp
> > > +pyField f = [| OpCodeField $(stringE (fieldName f))
> > > + $(genPyType f)
> > > + $(genPyDefault f)
> > > + $(stringE (fieldDoc f)) |]
> > >
> > > -- | Generates a Haskell function call to "showPyClass" with the
> > > -- necessary information on how to build the Python class string.
> > > -pyClass :: OpCodeConstructor -> ExpQ
> > > +pyClass :: OpCodeConstructor -> Q Exp
> > > pyClass (consName, consType, consDoc, consFields, consDscField) =
> > > do let pyClassVar = varNameE "showPyClass"
> > > consName' = stringE consName
> > > - consType' <- genPyType NotOptional consType
> > > + let consType' = genPyType' NotOptional consType
> > > let consDoc' = stringE consDoc
> > > +{-
> > > consFieldNames = listE $ map (stringE . fieldName) consFields
> > > consFieldDocs = listE $ map (stringE . fieldDoc) consFields
> > > consFieldTypes <- genPyTypes consFields
> > > let consFieldDefaults = genPyDefaults consFields
> > > - [| ($consName',
> > > - $consType',
> > > - $consDoc',
> > > - $consFieldNames,
> > > - $consFieldTypes,
> > > - $consFieldDefaults,
> > > - $consFieldDocs,
> > > - consDscField) |]
> > > + -}
> >
> > This is a comment.
> >
> > Rest LGTM.
> >
> > Thanks,
> > Jose
> >
> > > + [| OpCodeDescriptor $consName'
> > > + $consType'
> > > + $consDoc'
> > > + $(listE $ map pyField consFields)
> > > + consDscField |]
> > >
> > > -- | Generates a function called "pyClasses" that holds the list of
> > > -- all the opcode descriptors necessary for generating the Python
> > > --
> > > 1.8.5.1
> > >
> >
> > --
> > Jose Antonio Lopes
> > Ganeti Engineering
> > Google Germany GmbH
> > Dienerstr. 12, 80331, München
> >
> > Registergericht und -nummer: Hamburg, HRB 86891
> > Sitz der Gesellschaft: Hamburg
> > Geschäftsführer: Graham Law, Christine Elizabeth Flores
> > Steuernummer: 48/725/00206
> > Umsatzsteueridentifikationsnummer: DE813741370
> >
--
Jose Antonio Lopes
Ganeti Engineering
Google Germany GmbH
Dienerstr. 12, 80331, München
Registergericht und -nummer: Hamburg, HRB 86891
Sitz der Gesellschaft: Hamburg
Geschäftsführer: Graham Law, Christine Elizabeth Flores
Steuernummer: 48/725/00206
Umsatzsteueridentifikationsnummer: DE813741370