language-webidl 0.1.1.1 → 0.1.2.0
raw patch · 4 files changed
+94/−47 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Language.WebIDL.PPrint: prettyDefault :: Pretty a => a -> Doc
- Language.WebIDL.PPrint: prettyInherit :: Pretty a => Maybe a -> Doc
- Language.WebIDL.PPrint: prettyMaybe :: Maybe t -> (t -> Doc) -> Doc
- Language.WebIDL.PPrint: scope :: Pretty a => [a] -> Doc
- Language.WebIDL.Parser: ParserState :: [String] -> ParserState
- Language.WebIDL.Parser: Tagging :: [String] -> SourcePos -> Tagging
- Language.WebIDL.Parser: [_comments] :: ParserState -> [String]
- Language.WebIDL.Parser: angles :: ParsecT String u Identity a -> ParsecT String u Identity a
- Language.WebIDL.Parser: braces :: ParsecT String u Identity a -> ParsecT String u Identity a
- Language.WebIDL.Parser: data ParserState
- Language.WebIDL.Parser: data Tagging
- Language.WebIDL.Parser: getTag :: MyParser Tagging
- Language.WebIDL.Parser: initState :: ParserState
- Language.WebIDL.Parser: instance GHC.Classes.Eq Language.WebIDL.Parser.Tagging
- Language.WebIDL.Parser: instance GHC.Show.Show Language.WebIDL.Parser.Tagging
- Language.WebIDL.Parser: lexer :: GenTokenParser String u Identity
- Language.WebIDL.Parser: pArg :: MyParser Argument
- Language.WebIDL.Parser: pArgumentName :: MyParser ArgumentName
- Language.WebIDL.Parser: pArgumentNameKeyword :: MyParser ArgumentNameKeyword
- Language.WebIDL.Parser: pAttribute :: MyParser (Attribute Tagging)
- Language.WebIDL.Parser: pBlockComment :: ParsecT [Char] ParserState Identity ()
- Language.WebIDL.Parser: pBool :: MyParser Bool
- Language.WebIDL.Parser: pComment :: ParsecT [Char] ParserState Identity ()
- Language.WebIDL.Parser: pConst :: MyParser (Const Tagging)
- Language.WebIDL.Parser: pConstType :: MyParser ConstType
- Language.WebIDL.Parser: pConstValue :: MyParser ConstValue
- Language.WebIDL.Parser: pDef :: MyParser (Definition Tagging)
- Language.WebIDL.Parser: pDefault :: MyParser Default
- Language.WebIDL.Parser: pDictionary :: MyParser (Dictionary Tagging)
- Language.WebIDL.Parser: pDictionaryMember :: MyParser (DictionaryMember Tagging)
- Language.WebIDL.Parser: pEnum :: MyParser (Enum Tagging)
- Language.WebIDL.Parser: pEnumValues :: MyParser [EnumValue]
- Language.WebIDL.Parser: pEq :: ParsecT String u Identity Char
- Language.WebIDL.Parser: pException :: MyParser (Exception Tagging)
- Language.WebIDL.Parser: pExceptionMember :: MyParser (ExceptionMember Tagging)
- Language.WebIDL.Parser: pExtAttrs :: MyParser ()
- Language.WebIDL.Parser: pFloat :: ParsecT String u Identity Double
- Language.WebIDL.Parser: pFloatType :: MyParser FloatType
- Language.WebIDL.Parser: pIdent :: ParsecT String u Identity Ident
- Language.WebIDL.Parser: pImplementsStatement :: MyParser (ImplementsStatement Tagging)
- Language.WebIDL.Parser: pInheritance :: MyParser (Maybe Ident)
- Language.WebIDL.Parser: pInt :: ParsecT String u Identity Integer
- Language.WebIDL.Parser: pIntegerType :: MyParser IntegerType
- Language.WebIDL.Parser: pIntegerWidth :: ParsecT [Char] ParserState Identity IntegerWidth
- Language.WebIDL.Parser: pInterface :: MyParser (Interface Tagging)
- Language.WebIDL.Parser: pInterfaceMember :: MyParser (InterfaceMember Tagging)
- Language.WebIDL.Parser: pLineComment :: ParsecT [Char] ParserState Identity ()
- Language.WebIDL.Parser: pMaybeIdent :: MyParser (Maybe Ident)
- Language.WebIDL.Parser: pModifier :: a -> String -> MyParser (Maybe a)
- Language.WebIDL.Parser: pNonAnyType :: MyParser NonAnyType
- Language.WebIDL.Parser: pNull :: MyParser (Maybe Null)
- Language.WebIDL.Parser: pOperation :: MyParser (Operation Tagging)
- Language.WebIDL.Parser: pPartial :: MyParser (Partial Tagging)
- Language.WebIDL.Parser: pPrimTy :: MyParser PrimitiveType
- Language.WebIDL.Parser: pQualifier :: MyParser (Maybe Qualifier)
- Language.WebIDL.Parser: pReturnType :: MyParser ReturnType
- Language.WebIDL.Parser: pSingleType :: MyParser SingleType
- Language.WebIDL.Parser: pSpaces :: ParsecT [Char] ParserState Identity ()
- Language.WebIDL.Parser: pSpecial :: MyParser Special
- Language.WebIDL.Parser: pType :: MyParser Type
- Language.WebIDL.Parser: pTypeSuffix :: MyParser TypeSuffix
- Language.WebIDL.Parser: pTypedef :: MyParser (Typedef Tagging)
- Language.WebIDL.Parser: pUnionMemberType :: MyParser UnionMemberType
- Language.WebIDL.Parser: pUnionType :: MyParser UnionType
- Language.WebIDL.Parser: pUnsigned :: MyParser (Maybe Unsigned)
- Language.WebIDL.Parser: parens :: ParsecT String u Identity a -> ParsecT String u Identity a
- Language.WebIDL.Parser: reserved :: String -> ParsecT String u Identity ()
- Language.WebIDL.Parser: reservedOp :: String -> ParsecT String u Identity ()
- Language.WebIDL.Parser: semi :: ParsecT String u Identity String
- Language.WebIDL.Parser: stringLit :: ParsecT String u Identity String
- Language.WebIDL.Parser: testParse :: MyParser a -> String -> Either ParseError a
- Language.WebIDL.Parser: type MyParser = CharParser ParserState
- Language.WebIDL.Parser: whiteSpace :: ParsecT String u Identity ()
+ Language.WebIDL.Parser: Tag :: [String] -> SourcePos -> Tag
+ Language.WebIDL.Parser: data Tag
+ Language.WebIDL.Parser: instance GHC.Classes.Eq Language.WebIDL.Parser.Tag
+ Language.WebIDL.Parser: instance GHC.Show.Show Language.WebIDL.Parser.Tag
- Language.WebIDL.Parser: [_comment] :: Tagging -> [String]
+ Language.WebIDL.Parser: [_comment] :: Tag -> [String]
- Language.WebIDL.Parser: [_sourcePos] :: Tagging -> SourcePos
+ Language.WebIDL.Parser: [_sourcePos] :: Tag -> SourcePos
- Language.WebIDL.Parser: parseIDL :: String -> Either ParseError [Definition Tagging]
+ Language.WebIDL.Parser: parseIDL :: String -> Either ParseError [Definition Tag]
Files
- language-webidl.cabal +1/−1
- src/Language/WebIDL/AST.hs +52/−20
- src/Language/WebIDL/PPrint.hs +10/−2
- src/Language/WebIDL/Parser.hs +31/−24
language-webidl.cabal view
@@ -1,5 +1,5 @@ name: language-webidl-version: 0.1.1.1+version: 0.1.2.0 synopsis: Parser and Pretty Printer for WebIDL description: It is intended to replace the old package
src/Language/WebIDL/AST.hs view
@@ -1,8 +1,13 @@+{-|+ Module: Language.WebIDL.AST+ Description: Abstract Syntax Tree of WebIDL+-}+ module Language.WebIDL.AST where import Prelude hiding (Enum) --- Definition+-- | Definition data Definition a = DefInterface (Interface a) | DefPartial (Partial a) | DefDictionary (Dictionary a)@@ -12,74 +17,82 @@ | DefImplementsStatement (ImplementsStatement a) deriving (Show, Eq) --- Interface+-- | @interface@ data Interface a = Interface a Ident (Maybe Ident) [InterfaceMember a] deriving (Show, Eq) --- Partial+-- | Partial Definition data Partial a = PartialInterface a Ident [InterfaceMember a] | PartialDictionary a Ident [DictionaryMember a] deriving (Show, Eq) --- Dictionary+-- | @dictionary@ data Dictionary a = Dictionary a Ident (Maybe Ident) [DictionaryMember a] deriving (Show, Eq) --- Exception+-- | @exception@ data Exception a = Exception a Ident (Maybe Ident) [ExceptionMember a] deriving (Show, Eq) --- Enum+-- | @enum@ data Enum a = Enum a Ident [EnumValue] deriving (Show, Eq) --- Typedef+-- | @typedef@ data Typedef a = Typedef a Type Ident deriving (Show, Eq) --- Implements+-- | @implements@ statement data ImplementsStatement a = ImplementsStatement a Ident Ident deriving (Show, Eq) --- Fields+-- | Member of interface definition data InterfaceMember a = IMemConst (Const a) | IMemAttribute (Attribute a) | IMemOperation (Operation a) deriving (Show, Eq) +-- | Member of dictionary data DictionaryMember a = DictionaryMember a Type Ident (Maybe Default) deriving (Show, Eq) +-- | Member of exception definition data ExceptionMember a = ExConst a (Const a) | ExField a Type Ident deriving (Show, Eq) +-- | Attribute member of interface data Attribute a = Attribute a (Maybe Inherit) (Maybe ReadOnly) Type Ident deriving (Show, Eq) +-- | Operation member of interface data Operation a = Operation a (Maybe Qualifier) ReturnType (Maybe Ident) [Argument] deriving (Show, Eq) +-- | Argument of operation signature data Argument = ArgOptional Type ArgumentName Default | ArgNonOpt Type (Maybe Ellipsis) ArgumentName deriving (Show, Eq) +-- | Value of a @enum@ newtype EnumValue = EnumValue String deriving (Show, Eq) +-- | Name of argument data ArgumentName = ArgKey ArgumentNameKeyword | ArgIdent Ident deriving (Show, Eq)---- Values+-- | @const@ data Const a = Const a ConstType Ident ConstValue deriving (Show, Eq) +-- | @default@ specification data Default = DefaultValue ConstValue | DefaultString String deriving (Show, Eq) +-- | Constant value data ConstValue = ConstBooleanLiteral Bool | ConstFloatLiteral Double | ConstInteger Integer | ConstNull deriving (Show, Eq) ---- Qualifers+-- | Qualifers data Qualifier = QuaStatic | QSpecials [Special] deriving (Show, Eq) +-- | Special qualifier data Special = Getter | Setter | Ccreator @@ -87,6 +100,7 @@ | Legacycaller deriving (Show, Eq) +-- | Argument name keyword data ArgumentNameKeyword = ArgAttribute | ArgCallback | ArgConst | ArgCreator | ArgDeleter | ArgDictionary | ArgEnum | ArgException | ArgGetter | ArgImplements | ArgInherit | ArgInterface@@ -94,13 +108,15 @@ | ArgStringifier | ArgTypedef | ArgUnrestricted deriving (Show, Eq) --- Types+-- | Types data Type = TySingleType SingleType | TyUnionType UnionType TypeSuffix deriving (Show, Eq) +-- | Single type data SingleType = STyNonAny NonAnyType | STyAny TypeSuffix deriving (Show, Eq) +-- | Types that is not @any@ data NonAnyType = TyPrim PrimitiveType TypeSuffix | TyDOMString TypeSuffix | TyIdent Ident TypeSuffix@@ -109,7 +125,7 @@ | TyDate TypeSuffix deriving (Show, Eq) -+-- | Primitive type data PrimitiveType = PrimIntegerType IntegerType | PrimFloatType FloatType | Boolean@@ -117,43 +133,59 @@ | Octet deriving (Show, Eq) +-- | Integer type data IntegerType = IntegerType (Maybe Unsigned) IntegerWidth deriving (Show, Eq) +-- | Integer width, @short@, @long@ etc. data IntegerWidth = Short | Long Int deriving (Show, Eq) +-- | @unsigned@ modifier+data Unsigned = Unsigned deriving (Show, Eq)++-- | Suffix of type data TypeSuffix = TypeSuffixArray | TypeSuffixNullable | TypeSuffixNone deriving (Show, Eq) +-- | Float type data FloatType = TyFloat (Maybe Unrestricted) | TyDouble (Maybe Unrestricted) deriving (Show, Eq) +-- | Union of several types type UnionType = [UnionMemberType] +-- | Union member type data UnionMemberType = UnionTy UnionType TypeSuffix | UnionTyNonAny NonAnyType | UnionTyAny TypeSuffix deriving (Show, Eq) +-- | Return value's type data ReturnType = RetType Type | RetVoid deriving (Show, Eq) -+-- | Constant's type data ConstType = ConstPrim PrimitiveType (Maybe Null) | ConstIdent Ident (Maybe Null) deriving (Show, Eq) --- Markers+-- | @null@ keyword+data Null = Null deriving (Show, Eq) +-- | @ellipsis@ marker data Ellipsis = Ellipsis deriving (Show, Eq)++-- | @readonly@ marker data ReadOnly = ReadOnly deriving (Show, Eq)++-- | @inherit@ marker data Inherit = Inherit deriving (Show, Eq)++-- | @unrestricted@ marker data Unrestricted = Unrestricted deriving (Show, Eq)-data Null = Null deriving (Show, Eq)-data Unsigned = Unsigned deriving (Show, Eq) --- Ident+-- | Identifier newtype Ident = Ident String deriving (Show, Eq, Ord)
src/Language/WebIDL/PPrint.hs view
@@ -1,9 +1,17 @@-module Language.WebIDL.PPrint where+{-|+ Module: Language.WebIDL.PPrint+ Description: Pretty printer of WebIDL AST+-} +module Language.WebIDL.PPrint (+ printDef+) where+ import Language.WebIDL.AST import Prelude hiding (Enum) import Text.PrettyPrint.Leijen +-- | print definition printDef :: Definition a -> String printDef = show . pretty @@ -132,7 +140,7 @@ instance Pretty (Operation a) where pretty (Operation _ mQ retty mIdent args) =- pretty mQ <> pretty retty <+> prettyMaybe mIdent (\e -> pretty e)+ pretty mQ <> pretty retty <+> prettyMaybe mIdent pretty <> parens (hcat (punctuate (comma <> space) (map pretty args))) <> semi
src/Language/WebIDL/Parser.hs view
@@ -1,5 +1,12 @@-module Language.WebIDL.Parser where+{-|+ Module: Language.WebIDL.Parser+ Description: Parser of WebIDL source+-} +module Language.WebIDL.Parser (+ Tag(..), parseIDL+) where+ import Language.WebIDL.AST import Prelude hiding (Enum) import Text.ParserCombinators.Parsec@@ -12,16 +19,17 @@ _comments :: [String] } -data Tagging = Tagging {+-- | Tag of source+data Tag = Tag { _comment :: [String], _sourcePos :: SourcePos } -instance Eq Tagging where+instance Eq Tag where (==) _ _ = True -instance Show Tagging where- show (Tagging comments pos) =+instance Show Tag where+ show (Tag comments pos) = let line = if length comments > 0 then take 5 (head comments) ++ "..., " else "" in "(" ++ line ++ show (sourceLine pos) ++ ")" @@ -33,10 +41,11 @@ testParse :: MyParser a -> String -> Either ParseError a testParse p = runParser p initState "webidl" -parseIDL :: String -> Either ParseError [Definition Tagging]+-- | parse IDL source+parseIDL :: String -> Either ParseError [Definition Tag] parseIDL = testParse (pSpaces *> many1 (pDef <* pSpaces)) -pDef :: MyParser (Definition Tagging)+pDef :: MyParser (Definition Tag) pDef = DefInterface <$> (pExtAttrs *> pInterface) <|> DefPartial <$> pPartial <|> DefDictionary <$> pDictionary@@ -50,7 +59,7 @@ pExtAttrs = pSpaces *> void (char '[' *> (manyTill anyChar (try (char ']')))) <* pSpaces <|> pSpaces -pPartial :: MyParser (Partial Tagging)+pPartial :: MyParser (Partial Tag) pPartial = string "partial" *> pSpaces *> p where p = PartialInterface <$> getTag <*> (string "interface" *> pSpaces *> pIdent)@@ -58,29 +67,29 @@ <|> PartialDictionary <$> getTag <*> (string "dictionary" *> pSpaces *> pIdent) <*> braces (many pDictionaryMember) <* semi -pDictionary :: MyParser (Dictionary Tagging)+pDictionary :: MyParser (Dictionary Tag) pDictionary = Dictionary <$> getTag <*> (string "dictionary" *> pSpaces *> pIdent) <*> pInheritance <*> braces (many pDictionaryMember) <* semi -pInterface :: MyParser (Interface Tagging)+pInterface :: MyParser (Interface Tag) pInterface = Interface <$> getTag <*> (string "interface" *> pSpaces *> pIdent) <*> pInheritance <*> braces (pSpaces *> many (pInterfaceMember <* pSpaces)) <* semi -pException :: MyParser (Exception Tagging)+pException :: MyParser (Exception Tag) pException = Exception <$> getTag <*> (string "exception" *> pSpaces *> pIdent) <*> pInheritance <*> braces (many pExceptionMember) pInheritance :: MyParser (Maybe Ident) pInheritance = optionMaybe (spaces *> char ':' *> spaces *> pIdent) -pEnum :: MyParser (Enum Tagging)+pEnum :: MyParser (Enum Tag) pEnum = Enum <$> getTag <*> (string "enum" *> pSpaces *> pIdent) <*> braces pEnumValues <* semi pEnumValues :: MyParser [EnumValue] pEnumValues = sepBy1 (EnumValue <$> stringLit) (char ',') -pTypedef :: MyParser (Typedef Tagging)+pTypedef :: MyParser (Typedef Tag) pTypedef = do tag <- getTag string "typedef"@@ -91,27 +100,27 @@ semi return (Typedef tag ty ident) -pImplementsStatement :: MyParser (ImplementsStatement Tagging)+pImplementsStatement :: MyParser (ImplementsStatement Tag) pImplementsStatement = ImplementsStatement <$> getTag <*> pIdent <* pSpaces <*> (string "implements" *> pSpaces *> pIdent <* semi) -pDictionaryMember :: MyParser (DictionaryMember Tagging)+pDictionaryMember :: MyParser (DictionaryMember Tag) pDictionaryMember = DictionaryMember <$> getTag <*> pType <* pSpaces <*> pIdent <*> optionMaybe (spaces *> pEq *> spaces *> pDefault) <* semi -pExceptionMember :: MyParser (ExceptionMember Tagging)+pExceptionMember :: MyParser (ExceptionMember Tag) pExceptionMember = ExConst <$> getTag <*> pConst <|> ExField <$> getTag <*> pType <*> pIdent <* semi pMaybeIdent :: MyParser (Maybe Ident) pMaybeIdent = optionMaybe pIdent -pInterfaceMember :: MyParser (InterfaceMember Tagging)+pInterfaceMember :: MyParser (InterfaceMember Tag) pInterfaceMember = try (IMemConst <$> pConst) <|> try (IMemAttribute <$> pAttribute) <|> IMemOperation <$> (pExtAttrs *> pOperation) -pConst :: MyParser (Const Tagging)+pConst :: MyParser (Const Tag) pConst = Const <$> getTag <*> (string "const" *> pSpaces *> pConstType <* pSpaces) <*> (pIdent <* pEq) <*> (pSpaces *> pConstValue <* semi) @@ -119,7 +128,7 @@ pConstType = ConstPrim <$> pPrimTy <*> pNull <|> ConstIdent <$> pIdent <*> pNull -pAttribute :: MyParser (Attribute Tagging)+pAttribute :: MyParser (Attribute Tag) pAttribute = Attribute <$> getTag <*> pModifier Inherit "inherit" <*> pModifier ReadOnly "readonly" <*> (string "attribute" *> pSpaces *> pType) <*> (pSpaces *> pIdent <* semi)@@ -127,7 +136,7 @@ pModifier :: a -> String -> MyParser (Maybe a) pModifier m s = optionMaybe (string s *> pSpaces *> return m) -pOperation :: MyParser (Operation Tagging)+pOperation :: MyParser (Operation Tag) pOperation = Operation <$> getTag <*> pQualifier <* spaces <*> pReturnType <* pSpaces <*> pMaybeIdent <* pSpaces@@ -277,11 +286,9 @@ comment <- manyTill anyChar (try (string "*/")) modifyState (\ps -> ParserState { _comments = _comments ps ++ lines comment}) --getTag :: MyParser Tagging+getTag :: MyParser Tag getTag = do pos <- getPosition ParserState comments <- getState putState $ ParserState []- return $ Tagging comments pos-+ return $ Tag comments pos