-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Analysis and generation of Objective C code -- -- Language-ObjC is a haskell library for the analysis and generation of -- Objective C code. It features a complete, well tested parser and -- pretty printer. @package language-objc @version 0.4.2.2 -- | This module manages name spaces. -- --
-- nameSpaceToList ns = (localDefInnermost ns ++ .. ++ localDefsOutermost ns) ++ globalDefs ns --nsMapToList :: Ord k => NameSpaceMap k a -> [(k, a)] globalNames :: Ord k => NameSpaceMap k v -> Map k v localNames :: Ord k => NameSpaceMap k v -> [[(k, v)]] hasLocalNames :: NameSpaceMap k v -> Bool -- | Add global definition -- -- (ns',oldDef) = defGlobal ns ident def adds a global -- definition ident := def to the namespace. It returns the -- modified namespace ns'. If the identifier is already declared -- in the global namespace, the definition is overwritten and the old -- definition oldDef is returned. defGlobal :: Ord k => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a) -- | Enter new local scope -- -- ns' = enterNewScope ns creates and enters a new local scope. enterNewScope :: Ord k => NameSpaceMap k a -> NameSpaceMap k a -- | Leave innermost local scope -- -- (ns',defs) = leaveScope ns pops leaves the innermost local -- scope. and returns its definitions leaveScope :: Ord k => NameSpaceMap k a -> (NameSpaceMap k a, [(k, a)]) -- | Add local definition -- -- (ns',oldDef) = defLocal ns ident def adds the local -- definition ident := def to the innermost local scope, if -- there is a local scope, and to the global scope otherwise. It returns -- the modified name space ns' and the old binding of the -- identifier oldDef, which is overwritten. defLocal :: Ord k => NameSpaceMap k a -> k -> a -> (NameSpaceMap k a, Maybe a) -- | Search for a definition -- -- def = find ns ident returns the definition in some scope -- (inner to outer), if there is one. lookupName :: Ord k => NameSpaceMap k a -> k -> Maybe a lookupGlobal :: Ord k => NameSpaceMap k a -> k -> Maybe a lookupInnermostScope :: Ord k => NameSpaceMap k a -> k -> Maybe a -- | Merge two namespaces. If they disagree on the types of any variables, -- all bets are off. mergeNameSpace :: Ord k => NameSpaceMap k a -> NameSpaceMap k a -> NameSpaceMap k a -- | Unary, binary and asssignment operators. Exported via AST. module Language.ObjC.Syntax.Ops -- | C assignment operators (K&R A7.17) data CAssignOp CAssignOp :: CAssignOp CMulAssOp :: CAssignOp CDivAssOp :: CAssignOp -- | remainder and assignment CRmdAssOp :: CAssignOp CAddAssOp :: CAssignOp CSubAssOp :: CAssignOp CShlAssOp :: CAssignOp CShrAssOp :: CAssignOp CAndAssOp :: CAssignOp CXorAssOp :: CAssignOp COrAssOp :: CAssignOp assignBinop :: CAssignOp -> CBinaryOp -- | C binary operators (K&R A7.6-15) data CBinaryOp CMulOp :: CBinaryOp CDivOp :: CBinaryOp -- | remainder of division CRmdOp :: CBinaryOp CAddOp :: CBinaryOp CSubOp :: CBinaryOp -- | shift left CShlOp :: CBinaryOp -- | shift right CShrOp :: CBinaryOp -- | less CLeOp :: CBinaryOp -- | greater CGrOp :: CBinaryOp -- | less or equal CLeqOp :: CBinaryOp -- | greater or equal CGeqOp :: CBinaryOp -- | equal CEqOp :: CBinaryOp -- | not equal CNeqOp :: CBinaryOp -- | bitwise and CAndOp :: CBinaryOp -- | exclusive bitwise or CXorOp :: CBinaryOp -- | inclusive bitwise or COrOp :: CBinaryOp -- | logical and CLndOp :: CBinaryOp -- | logical or CLorOp :: CBinaryOp isCmpOp :: CBinaryOp -> Bool isPtrOp :: CBinaryOp -> Bool isBitOp :: CBinaryOp -> Bool isLogicOp :: CBinaryOp -> Bool -- | C unary operator (K&R A7.3-4) data CUnaryOp -- | prefix increment operator CPreIncOp :: CUnaryOp -- | prefix decrement operator CPreDecOp :: CUnaryOp -- | postfix increment operator CPostIncOp :: CUnaryOp -- | postfix decrement operator CPostDecOp :: CUnaryOp -- | address operator CAdrOp :: CUnaryOp -- | indirection operator CIndOp :: CUnaryOp -- | prefix plus CPlusOp :: CUnaryOp -- | prefix minus CMinOp :: CUnaryOp -- | one's complement CCompOp :: CUnaryOp -- | logical negation CNegOp :: CUnaryOp isEffectfulOp :: CUnaryOp -> Bool instance Typeable CAssignOp instance Typeable CBinaryOp instance Typeable CUnaryOp instance Eq CAssignOp instance Ord CAssignOp instance Show CAssignOp instance Data CAssignOp instance Eq CBinaryOp instance Ord CBinaryOp instance Show CBinaryOp instance Data CBinaryOp instance Eq CUnaryOp instance Ord CUnaryOp instance Show CUnaryOp instance Data CUnaryOp -- | This module provides support for representing, checking and exporting -- c constants, i.e. integral, float, character and string constants. module Language.ObjC.Syntax.Constants escapeChar :: Char -> String unescapeChar :: String -> (Char, String) unescapeString :: String -> String newtype Flags f Flags :: Integer -> Flags f noFlags :: Flags f setFlag :: Enum f => f -> Flags f -> Flags f clearFlag :: Enum f => f -> Flags f -> Flags f testFlag :: Enum f => f -> Flags f -> Bool -- | construct a character constant from a haskell Char Use -- cchar_w if you want a wide character constant. cChar :: Char -> CChar -- | construct a wide chararacter constant cChar_w :: Char -> CChar -- | create a multi-character character constant cChars :: [Char] -> Bool -> CChar -- | C char constants (abstract) data CChar CChar :: !Char -> !Bool -> CChar CChars :: [Char] -> !Bool -> CChar -- | get the haskell representation of a char constant getCChar :: CChar -> [Char] -- | get integer value of a C char constant undefined result for multi-char -- char constants getCCharAsInt :: CChar -> Integer -- | return true if the character constant is wide. isWideChar :: CChar -> Bool -- | showCharConst c prepends _a_ String representing the C char -- constant corresponding to c. If necessary uses octal or -- hexadecimal escape sequences. showCharConst :: Char -> ShowS -- | datatype representing type flags for integers data CIntFlag FlagUnsigned :: CIntFlag FlagLong :: CIntFlag FlagLongLong :: CIntFlag FlagImag :: CIntFlag -- | datatype for memorizing the representation of an integer data CIntRepr DecRepr :: CIntRepr HexRepr :: CIntRepr OctalRepr :: CIntRepr -- | construct a integer constant (without type flags) from a haskell -- integer cInteger :: Integer -> CInteger data CInteger CInteger :: !Integer -> !CIntRepr -> !Flags CIntFlag -> CInteger getCInteger :: CInteger -> Integer readCInteger :: CIntRepr -> String -> Either String CInteger cFloat :: Float -> CFloat -- | Floats (represented as strings) data CFloat CFloat :: !String -> CFloat readCFloat :: String -> CFloat cString :: String -> CString cString_w :: String -> CString -- | C String literals data CString CString :: [Char] -> Bool -> CString getCString :: CString -> String -- | showStringLiteral s prepends a String representing the C -- string literal corresponding to s. If necessary it uses octal -- or hexadecimal escape sequences. showStringLit :: String -> ShowS -- | concatenate a list of C string literals concatCStrings :: [CString] -> CString instance Typeable CChar instance Typeable CIntRepr instance Typeable CIntFlag instance Typeable CFloat instance Typeable CString instance Typeable1 Flags instance Typeable CInteger instance Eq CChar instance Ord CChar instance Data CChar instance Eq CIntRepr instance Ord CIntRepr instance Enum CIntRepr instance Bounded CIntRepr instance Data CIntRepr instance Eq CIntFlag instance Ord CIntFlag instance Enum CIntFlag instance Bounded CIntFlag instance Data CIntFlag instance Eq CFloat instance Ord CFloat instance Data CFloat instance Eq CString instance Ord CString instance Data CString instance Eq (Flags f) instance Ord (Flags f) instance Data f => Data (Flags f) instance Eq CInteger instance Ord CInteger instance Data CInteger instance Show CString instance Show CFloat instance Show CInteger instance Show CIntFlag instance Show CChar -- | Source code position module Language.ObjC.Data.Position -- | uniform representation of source file positions data Position Position :: {-# UNPACK #-} !Int -> String -> {-# UNPACK #-} !Int -> {-# UNPACK #-} !Int -> Position -- | absolute offset in the preprocessed file posOffset' :: Position -> {-# UNPACK #-} !Int -- | source file posFile' :: Position -> String -- | row (line) in the original file. Affected by #LINE pragmas. posRow' :: Position -> {-# UNPACK #-} !Int -- | column in the preprocessed file. Inaccurate w.r.t. to the original -- file in the presence of preprocessor macros. posColumn' :: Position -> {-# UNPACK #-} !Int NoPosition :: Position BuiltinPosition :: Position InternalPosition :: Position -- | position absoluteOffset fileName lineNumber columnNumber -- initializes a Position using the given arguments position :: Int -> String -> Int -> Int -> Position -- | Position and length of a token data PosLength PL :: !Position -> {-# UNPACK #-} !Int -> PosLength mkPosLength :: Position -> Int -> PosLength unPosLength :: PosLength -> (Position, Int) posFile :: Position -> String posRow :: Position -> Int posColumn :: Position -> Int posOffset :: Position -> Int -- | initialize a Position to the start of the translation unit starting in -- the given file initPos :: FilePath -> Position -- | returns True if the given position refers to an actual source -- file isSourcePos :: Position -> Bool -- | no position (for unknown position information) nopos :: Position -- | returns True if the there is no position information -- available isNoPos :: Position -> Bool -- | position attached to built-in objects builtinPos :: Position -- | returns True if the given position refers to a builtin -- definition isBuiltinPos :: Position -> Bool -- | position used for internal errors internalPos :: Position -- | returns True if the given position is internal isInternalPos :: Position -> Bool -- | advance column incPos :: Position -> Int -> Position -- | advance to next line retPos :: Position -> Position -- | adjust position: change file and line number, reseting column to 1. -- This is usually used for #LINE pragmas. The absolute offset is not -- changed - this can be done by adjustPos newFile line . incPos -- (length pragma). adjustPos :: FilePath -> Int -> Position -> Position -- | advance just the offset incOffset :: Position -> Int -> Position -- | class of type which aggregate a source code location class Pos a posOf :: Pos a => a -> Position instance Typeable Position instance Typeable PosLength instance Eq Position instance Ord Position instance Data Position instance Eq PosLength instance Ord PosLength instance Data PosLength instance Show PosLength instance Show Position -- | Unique Names with fast equality (newtype Int) module Language.ObjC.Data.Name -- | Name is a unique identifier newtype Name Name :: Int -> Name nameId :: Name -> Int -- | return an infinite stream of Names starting with -- nameId 0 newNameSupply :: [Name] -- | get the infinite stream of unique names starting from the given -- integer namesStartingFrom :: Int -> [Name] instance Typeable Name instance Show Name instance Read Name instance Eq Name instance Ord Name instance Ix Name instance Data Name instance Enum Name -- | source position and unqiue name module Language.ObjC.Data.Node -- | Parsed entity attribute data NodeInfo OnlyPos :: !Position -> {-# UNPACK #-} !PosLength -> NodeInfo NodeInfo :: !Position -> {-# UNPACK #-} !PosLength -> {-# UNPACK #-} !Name -> NodeInfo -- | create a node with neither name nor positional information undefNode :: NodeInfo -- | return True if the node carries neither name nor positional -- information isUndefNode :: NodeInfo -> Bool -- | | Given only a source position, create a new node attribute mkNodeInfoOnlyPos :: Position -> NodeInfo -- | Given a source position and the position and length of the last token, -- create a new node attribute mkNodeInfoPosLen :: Position -> (Position, Int) -> NodeInfo -- | Given a source position and a unique name, create a new attribute -- identifier mkNodeInfo :: Position -> Name -> NodeInfo -- | Given a source position, the position and length of the last token and -- a unique name, create a new attribute identifier. Strict in mkNodeInfo' :: Position -> (Position, Int) -> Name -> NodeInfo internalNode :: NodeInfo -- | a class for convenient access to the attributes of an attributed -- object class CNode a nodeInfo :: CNode a => a -> NodeInfo fileOfNode :: CNode a => a -> Maybe FilePath posOfNode :: NodeInfo -> Position nameOfNode :: NodeInfo -> Maybe Name -- | get the position and length of the last token getLastTokenPos :: NodeInfo -> PosLength -- | get the number of characters an AST node spans lengthOfNode :: NodeInfo -> Maybe Int -- | equality by name eqByName :: CNode a => a -> a -> Bool instance Typeable NodeInfo instance Data NodeInfo instance (CNode a, CNode b) => CNode (Either a b) instance CNode NodeInfo instance Pos NodeInfo instance Ord NodeInfo instance Eq NodeInfo instance Show NodeInfo -- | This module provides the notion of identifiers in C, speed up using -- hashing. Identifiers are associated optionally associated with a -- NodeInfo, i.e. with a unique Name and a source location -- (Position). The ordering relation on identifiers is based on -- the hash and does not follow the lexical order. module Language.ObjC.Data.Ident -- | C identifiers data Ident Ident :: String -> {-# UNPACK #-} !Int -> NodeInfo -> Ident -- | References uniquely determining a struct, union or enum type. Those -- are either identified by an string identifier, or by a unique name -- (anonymous types). data SUERef AnonymousRef :: Name -> SUERef NamedRef :: Ident -> SUERef -- | Return true if the struct/union/enum reference is anonymous. isAnonymousRef :: SUERef -> Bool -- | build an identifier from a string. -- --
-- typeof(expr) --CTypeOfExpr :: (CExpression a) -> a -> CTypeSpecifier a -- |
-- typeof(type) --CTypeOfType :: (CDeclaration a) -> a -> CTypeSpecifier a -- | class name with protocol list ObjCClassProto :: !Ident -> [ObjCProtocolName a] -> a -> CTypeSpecifier a -- | Typedef name with protocol list ObjCTypeProto :: !Ident -> [ObjCProtocolName a] -> a -> CTypeSpecifier a data CTypeQualifier a CConstQual :: a -> CTypeQualifier a CVolatQual :: a -> CTypeQualifier a CRestrQual :: a -> CTypeQualifier a CInlineQual :: a -> CTypeQualifier a CAttrQual :: (CAttribute a) -> CTypeQualifier a ObjCProtoQual :: (ObjCProtoQualifier a) -> CTypeQualifier a data CAttribute a CAttr :: !Ident -> [CExpression a] -> a -> CAttribute a type ObjCPropMod = ObjCPropertyModifier NodeInfo type ObjCProtoQual = ObjCProtoQualifier NodeInfo data ObjCPropertyModifier a ObjCPropMod :: !Ident -> (Maybe Ident) -> a -> ObjCPropertyModifier a data ObjCProtoQualifier a ObjCInQual :: a -> ObjCProtoQualifier a ObjCOutQual :: a -> ObjCProtoQualifier a ObjCInOutQual :: a -> ObjCProtoQualifier a ObjCBycopyQual :: a -> ObjCProtoQualifier a ObjCOnewayQual :: a -> ObjCProtoQualifier a -- | C declarator (K&R A8.5, C99 6.7.5) and abstract declarator -- (K&R A8.8, C99 6.7.6) -- -- A declarator declares a single object, function, or type. It is always -- associated with a declaration (CDecl), which specifies the -- declaration's type and the additional storage qualifiers and -- attributes, which apply to the declared object. -- -- A declarator is of the form CDeclr name? indirections asm-name? -- attrs _, where name is the name of the declared object -- (missing for abstract declarators), declquals is a set of -- additional declaration specifiers, asm-name is the optional -- assembler name and attributes is a set of attrs is a set of -- __attribute__ annotations for the declared object. -- -- indirections is a set of pointer, array and function -- declarators, which modify the type of the declared object as described -- below. If the declaration specifies the non-derived type -- T, and we have indirections = [D1, D2, ..., Dn] than -- the declared object has type (D1 indirect (D2 -- indirect ... (Dn indirect T))), where -- --
-- int x; -- CDeclr "x" [] ---- --
-- const int * const * restrict x; -- CDeclr "x" [CPtrDeclr [restrict], CPtrDeclr [const]] ---- --
-- int* const f(); -- CDeclr "f" [CFunDeclr [],CPtrDeclr [const]] ---- --
-- int (* const f)(); ==> -- CDeclr "f" [CPtrDeclr [const], CFunDeclr []] --type CDeclr = CDeclarator NodeInfo -- | Derived declarators, see CDeclr -- -- Indirections are qualified using type-qualifiers and generic -- attributes, and additionally -- --
-- CUnknownSize isCompleteType --CNoArrSize :: !Bool -> CArraySize a -- |
-- CArrSize isStatic expr --CArrSize :: !Bool -> (CExpression a) -> CArraySize a type ObjCClassNm = ObjCClassName NodeInfo type ObjCClassDeclr = ObjCClassDeclarator NodeInfo type ObjCIfaceDecl = ObjCInterfaceDeclaration NodeInfo type ObjCKeyDeclr = ObjCKeywordDeclarator NodeInfo data ObjCClassName a ObjCClassNm :: !Ident -> a -> ObjCClassName a data ObjCClassDeclarator a ObjCClassDeclr :: !Ident -> a -> ObjCClassDeclarator a data ObjCInterfaceDeclaration a ObjCIfaceDecl :: (CDeclaration a) -> a -> ObjCInterfaceDeclaration a ObjCIfaceMethodDecl :: (ObjCMethodDeclaration a) -> a -> ObjCInterfaceDeclaration a ObjCIfacePropDecl :: (ObjCPropertyDeclaration a) -> a -> ObjCInterfaceDeclaration a data ObjCKeywordDeclarator a ObjCKeyDeclr :: (Maybe (ObjCSelector a)) -> (Maybe (CDeclaration a)) -> !Ident -> a -> ObjCKeywordDeclarator a -- | C initialization (K&R A8.7, C99 6.7.8) -- -- Initializers are either assignment expressions or initializer lists -- (surrounded in curly braces), whose elements are themselves -- initializers, paired with an optional list of designators. type CInit = CInitializer NodeInfo -- | Initializer List -- -- The members of an initializer list are of the form -- (designator-list,initializer). The designator-list -- specifies one member of the compound type which is initialized. It is -- allowed to be empty - in this case the initializer refers to the -- ''next'' member of the compound type (see C99 6.7.8). -- -- Examples (simplified expressions and identifiers): -- --
-- -- int x[3][4] = { [0][3] = 4, [2] = 5, 8 };
-- -- corresponds to the assignments
-- -- x[0][3] = 4; x[2][0] = 5; x[2][1] = 8;
-- let init1 = ([CArrDesig 0, CArrDesig 3], CInitExpr 4)
-- init2 = ([CArrDesig 2] , CInitExpr 5)
-- init3 = ([] , CInitExpr 8)
-- in CInitList [init1, init2, init3]
--
--
--
-- -- struct { struct { int a[2]; int b[2]; int c[2]; } s; } x = { .s = { {2,3} , .c[0] = 1 } };
-- -- corresponds to the assignments
-- -- x.s.a[0] = 2; x.s.a[1] = 3; x.s.c[0] = 1;
-- let init_s_0 = CInitList [ ([], CInitExpr 2), ([], CInitExpr 3)]
-- init_s = CInitList [
-- ([], init_s_0),
-- ([CMemberDesig "c", CArrDesig 0], CInitExpr 1)
-- ]
-- in CInitList [(CMemberDesig "s", init_s)]
--
type CInitList = CInitializerList NodeInfo
-- | Designators
--
-- A designator specifies a member of an object, either an element or
-- range of an array, or the named member of a struct / union.
type CDesignator = CPartDesignator NodeInfo
data CInitializer a
-- | assignment expression
CInitExpr :: (CExpression a) -> a -> CInitializer a
-- | initialization list (see CInitList)
CInitList :: (CInitializerList a) -> a -> CInitializer a
type CInitializerList a = [([CPartDesignator a], CInitializer a)]
data CPartDesignator a
-- | array position designator
CArrDesig :: (CExpression a) -> a -> CPartDesignator a
-- | member designator
CMemberDesig :: !Ident -> a -> CPartDesignator a
-- | array range designator CRangeDesig from to _ (GNU C)
CRangeDesig :: (CExpression a) -> (CExpression a) -> a -> CPartDesignator a
-- | C statement (K&R A9, C99 6.8)
type CStat = CStatement NodeInfo
-- | C99 Block items
--
-- Things that may appear in compound statements: either statements,
-- declarations or nested function definitions.
type CBlockItem = CCompoundBlockItem NodeInfo
-- | GNU Assembler statement
--
-- -- CAssemblyStatement type-qual? asm-expr out-ops in-ops clobbers _ ---- -- is an inline assembler statement. The only type-qualifier (if any) -- allowed is volatile. asm-expr is the actual assembler -- epxression (a string), out-ops and in-ops are the -- input and output operands of the statement. clobbers is a -- list of registers which are clobbered when executing the assembler -- statement type CAsmStmt = CAssemblyStatement NodeInfo -- | Assembler operand -- -- CAsmOperand argName? constraintExpr arg specifies an operand -- for an assembler statement. type CAsmOperand = CAssemblyOperand NodeInfo data CStatement a -- | An (attributed) label followed by a statement CLabel :: !Ident -> (CStatement a) -> [CAttribute a] -> a -> CStatement a -- | A statement of the form case expr : stmt CCase :: (CExpression a) -> (CStatement a) -> a -> CStatement a -- | A case range of the form case lower ... upper : stmt CCases :: (CExpression a) -> (CExpression a) -> (CStatement a) -> a -> CStatement a -- | The default case default : stmt CDefault :: (CStatement a) -> a -> CStatement a -- | A simple statement, that is in C: evaluating an expression with -- side-effects and discarding the result. CExpr :: (Maybe (CExpression a)) -> a -> CStatement a -- | compound statement CCompound localLabels blockItems at CCompound :: [Ident] -> [CCompoundBlockItem a] -> a -> CStatement a -- | conditional statement CIf ifExpr thenStmt maybeElseStmt at CIf :: (CExpression a) -> (CStatement a) -> (Maybe (CStatement a)) -> a -> CStatement a -- | switch statement CSwitch selectorExpr switchStmt, where -- switchStmt usually includes case, break and -- default statements CSwitch :: (CExpression a) -> (CStatement a) -> a -> CStatement a -- | while or do-while statement CWhile guard stmt isDoWhile at CWhile :: (CExpression a) -> (CStatement a) -> Bool -> a -> CStatement a -- | for statement CFor init expr-2 expr-3 stmt, where -- init is either a declaration or initializing expression CFor :: (Either (Maybe (CExpression a)) (CDeclaration a)) -> (Maybe (CExpression a)) -> (Maybe (CExpression a)) -> (CStatement a) -> a -> CStatement a -- | goto statement CGoto label CGoto :: !Ident -> a -> CStatement a -- | computed goto CGotoPtr labelExpr CGotoPtr :: (CExpression a) -> a -> CStatement a -- | continue statement CCont :: a -> CStatement a -- | break statement CBreak :: a -> CStatement a -- | return statement CReturn returnExpr CReturn :: (Maybe (CExpression a)) -> a -> CStatement a -- | assembly statement CAsm :: (CAssemblyStatement a) -> a -> CStatement a data CCompoundBlockItem a -- | A statement CBlockStmt :: (CStatement a) -> CCompoundBlockItem a -- | A local declaration CBlockDecl :: (CDeclaration a) -> CCompoundBlockItem a -- | A nested function (GNU C) CNestedFunDef :: (CFunctionDef a) -> CCompoundBlockItem a data CAssemblyStatement a CAsmStmt :: (Maybe (CTypeQualifier a)) -> (CStringLiteral a) -> [CAssemblyOperand a] -> [CAssemblyOperand a] -> [CStringLiteral a] -> a -> CAssemblyStatement a data CAssemblyOperand a CAsmOperand :: (Maybe Ident) -> (CStringLiteral a) -> (CExpression a) -> a -> CAssemblyOperand a -- | C expression (K&R A7) -- --
-- (expr, type) --CBuiltinVaArg :: (CExpression a) -> (CDeclaration a) -> a -> CBuiltinThing a -- |
-- (type, designator-list) --CBuiltinOffsetOf :: (CDeclaration a) -> [CPartDesignator a] -> a -> CBuiltinThing a -- |
-- (type,type) --CBuiltinTypesCompatible :: (CDeclaration a) -> (CDeclaration a) -> a -> CBuiltinThing a type ObjCMsgExpr = ObjCMessageExpression NodeInfo type ObjCMsgSel = ObjCMessageSelector NodeInfo type ObjCKeyArg = ObjCKeywordArg NodeInfo type ObjCSelName = ObjCSelectorName NodeInfo type ObjCSelKeyName = ObjCSelectorKeyName NodeInfo data ObjCMessageExpression a ObjCMsgExpr :: (CExpression a) -> (ObjCMessageSelector a) -> a -> ObjCMessageExpression a ObjCMsgClass :: (ObjCClassName a) -> (ObjCMessageSelector a) -> a -> ObjCMessageExpression a ObjCMsgSup :: (ObjCMessageSelector a) -> a -> ObjCMessageExpression a data ObjCMessageSelector a ObjCMsgSel :: (ObjCSelector a) -> a -> ObjCMessageSelector a ObjCKeyArgs :: [ObjCKeywordArg a] -> a -> ObjCMessageSelector a data ObjCKeywordArg a ObjCKeyArg :: (ObjCSelectorKeyName a) -> (CExpression a) -> a -> ObjCKeywordArg a data ObjCSelectorName a ObjCSelPlain :: (ObjCSelector a) -> a -> ObjCSelectorName a ObjCSelKeys :: [ObjCSelectorKeyName a] -> a -> ObjCSelectorName a data ObjCSelectorKeyName a ObjCSelKeyName :: (Maybe (ObjCSelector a)) -> a -> ObjCSelectorKeyName a -- | C constant (K&R A2.5 & A7.2) type CConst = CConstant NodeInfo -- | Attributed string literals type CStrLit = CStringLiteral NodeInfo cstringOfLit :: CStringLiteral a -> CString -- | Lift a string literal to a C constant liftStrLit :: CStringLiteral a -> CConstant a data CConstant a CIntConst :: CInteger -> a -> CConstant a CCharConst :: CChar -> a -> CConstant a CFloatConst :: CFloat -> a -> CConstant a CStrConst :: CString -> a -> CConstant a data CStringLiteral a CStrLit :: CString -> a -> CStringLiteral a -- | Objective-C constant (NSString) type ObjCConst = ObjCConstant NodeInfo data ObjCConstant a ObjCStrConst :: CString -> a -> ObjCConstant a instance Typeable1 ObjCClassDeclarator instance Typeable1 ObjCClassListDef instance Typeable1 ObjCClassName instance Typeable1 ObjCProtocolName instance Typeable ObjCVisType instance Typeable1 ObjCVisibilitySpec instance Typeable ObjCMethodType instance Typeable1 ObjCPropertyModifier instance Typeable1 CStorageSpecifier instance Typeable1 ObjCProtoQualifier instance Typeable CStructTag instance Typeable1 ObjCSelector instance Typeable1 ObjCSelectorKeyName instance Typeable1 ObjCSelectorName instance Typeable1 ObjCConstant instance Typeable1 CConstant instance Typeable1 CStringLiteral instance Typeable1 CDeclarator instance Typeable1 CAttribute instance Typeable1 CExpression instance Typeable1 CBuiltinThing instance Typeable1 CPartDesignator instance Typeable1 CDeclaration instance Typeable1 CInitializer instance Typeable1 CDeclarationSpecifier instance Typeable1 CTypeQualifier instance Typeable1 CTypeSpecifier instance Typeable1 CEnumeration instance Typeable1 CStructureUnion instance Typeable1 ObjCMessageExpression instance Typeable1 ObjCMessageSelector instance Typeable1 ObjCKeywordArg instance Typeable1 CStatement instance Typeable1 CCompoundBlockItem instance Typeable1 CFunctionDef instance Typeable1 CAssemblyStatement instance Typeable1 CAssemblyOperand instance Typeable1 CDerivedDeclarator instance Typeable1 CArraySize instance Typeable1 ObjCPropertyDeclaration instance Typeable1 ObjCKeywordDeclarator instance Typeable1 ObjCMethodSelector instance Typeable1 ObjCMethodDeclaration instance Typeable1 ObjCInterfaceDeclaration instance Typeable1 ObjCProtocolDeclBlock instance Typeable1 ObjCProtocolDec instance Typeable1 ObjCCategoryDec instance Typeable1 ObjCInstanceVariableBlock instance Typeable1 ObjCInterface instance Typeable1 ObjCMethodDefinition instance Typeable1 ObjCImplementationDefinition instance Typeable1 ObjCImplementation instance Typeable1 ObjCCategoryImplementation instance Typeable1 CExternalDeclaration instance Typeable1 CTranslationUnit instance Show a => Show (ObjCClassDeclarator a) instance Data a => Data (ObjCClassDeclarator a) instance Functor ObjCClassDeclarator instance Show a => Show (ObjCClassListDef a) instance Data a => Data (ObjCClassListDef a) instance Show a => Show (ObjCClassName a) instance Data a => Data (ObjCClassName a) instance Functor ObjCClassName instance Show a => Show (ObjCProtocolName a) instance Data a => Data (ObjCProtocolName a) instance Functor ObjCProtocolName instance Show ObjCVisType instance Data ObjCVisType instance Enum ObjCVisType instance Show a => Show (ObjCVisibilitySpec a) instance Data a => Data (ObjCVisibilitySpec a) instance Functor ObjCVisibilitySpec instance Show ObjCMethodType instance Data ObjCMethodType instance Enum ObjCMethodType instance Show a => Show (ObjCPropertyModifier a) instance Data a => Data (ObjCPropertyModifier a) instance Functor ObjCPropertyModifier instance Show a => Show (CStorageSpecifier a) instance Eq a => Eq (CStorageSpecifier a) instance Ord a => Ord (CStorageSpecifier a) instance Data a => Data (CStorageSpecifier a) instance Show a => Show (ObjCProtoQualifier a) instance Data a => Data (ObjCProtoQualifier a) instance Functor ObjCProtoQualifier instance Show CStructTag instance Eq CStructTag instance Data CStructTag instance Data a => Data (ObjCSelector a) instance Show a => Show (ObjCSelector a) instance Functor ObjCSelector instance Data a => Data (ObjCSelectorKeyName a) instance Show a => Show (ObjCSelectorKeyName a) instance Functor ObjCSelectorKeyName instance Data a => Data (ObjCSelectorName a) instance Show a => Show (ObjCSelectorName a) instance Functor ObjCSelectorName instance Show a => Show (ObjCConstant a) instance Data a => Data (ObjCConstant a) instance Functor ObjCConstant instance Show a => Show (CConstant a) instance Data a => Data (CConstant a) instance Show a => Show (CStringLiteral a) instance Data a => Data (CStringLiteral a) instance Show a => Show (CDeclarator a) instance Data a => Data (CDeclarator a) instance Show a => Show (CAttribute a) instance Data a => Data (CAttribute a) instance Data a => Data (CExpression a) instance Show a => Show (CExpression a) instance Functor CExpression instance Show a => Show (CBuiltinThing a) instance Data a => Data (CBuiltinThing a) instance Show a => Show (CPartDesignator a) instance Data a => Data (CPartDesignator a) instance Show a => Show (CDeclaration a) instance Data a => Data (CDeclaration a) instance Show a => Show (CInitializer a) instance Data a => Data (CInitializer a) instance Show a => Show (CDeclarationSpecifier a) instance Data a => Data (CDeclarationSpecifier a) instance Show a => Show (CTypeQualifier a) instance Data a => Data (CTypeQualifier a) instance Show a => Show (CTypeSpecifier a) instance Data a => Data (CTypeSpecifier a) instance Show a => Show (CEnumeration a) instance Data a => Data (CEnumeration a) instance Show a => Show (CStructureUnion a) instance Data a => Data (CStructureUnion a) instance Data a => Data (ObjCMessageExpression a) instance Show a => Show (ObjCMessageExpression a) instance Functor ObjCMessageExpression instance Data a => Data (ObjCMessageSelector a) instance Show a => Show (ObjCMessageSelector a) instance Functor ObjCMessageSelector instance Data a => Data (ObjCKeywordArg a) instance Show a => Show (ObjCKeywordArg a) instance Functor ObjCKeywordArg instance Show a => Show (CStatement a) instance Data a => Data (CStatement a) instance Show a => Show (CCompoundBlockItem a) instance Data a => Data (CCompoundBlockItem a) instance Show a => Show (CFunctionDef a) instance Data a => Data (CFunctionDef a) instance Show a => Show (CAssemblyStatement a) instance Data a => Data (CAssemblyStatement a) instance Show a => Show (CAssemblyOperand a) instance Data a => Data (CAssemblyOperand a) instance Show a => Show (CDerivedDeclarator a) instance Data a => Data (CDerivedDeclarator a) instance Show a => Show (CArraySize a) instance Data a => Data (CArraySize a) instance Show a => Show (ObjCPropertyDeclaration a) instance Data a => Data (ObjCPropertyDeclaration a) instance Functor ObjCPropertyDeclaration instance Show a => Show (ObjCKeywordDeclarator a) instance Data a => Data (ObjCKeywordDeclarator a) instance Functor ObjCKeywordDeclarator instance Show a => Show (ObjCMethodSelector a) instance Data a => Data (ObjCMethodSelector a) instance Functor ObjCMethodSelector instance Show a => Show (ObjCMethodDeclaration a) instance Data a => Data (ObjCMethodDeclaration a) instance Functor ObjCMethodDeclaration instance Show a => Show (ObjCInterfaceDeclaration a) instance Data a => Data (ObjCInterfaceDeclaration a) instance Functor ObjCInterfaceDeclaration instance Show a => Show (ObjCProtocolDeclBlock a) instance Data a => Data (ObjCProtocolDeclBlock a) instance Show a => Show (ObjCProtocolDec a) instance Data a => Data (ObjCProtocolDec a) instance Show a => Show (ObjCCategoryDec a) instance Data a => Data (ObjCCategoryDec a) instance Functor ObjCCategoryDec instance Show a => Show (ObjCInstanceVariableBlock a) instance Data a => Data (ObjCInstanceVariableBlock a) instance Functor ObjCInstanceVariableBlock instance Show a => Show (ObjCInterface a) instance Data a => Data (ObjCInterface a) instance Functor ObjCInterface instance Show a => Show (ObjCMethodDefinition a) instance Data a => Data (ObjCMethodDefinition a) instance Functor ObjCMethodDefinition instance Show a => Show (ObjCImplementationDefinition a) instance Data a => Data (ObjCImplementationDefinition a) instance Functor ObjCImplementationDefinition instance Show a => Show (ObjCImplementation a) instance Data a => Data (ObjCImplementation a) instance Functor ObjCImplementation instance Show a => Show (ObjCCategoryImplementation a) instance Data a => Data (ObjCCategoryImplementation a) instance Functor ObjCCategoryImplementation instance Show a => Show (CExternalDeclaration a) instance Data a => Data (CExternalDeclaration a) instance Show a => Show (CTranslationUnit a) instance Data a => Data (CTranslationUnit a) instance Annotated CStringLiteral instance Functor CStringLiteral instance CNode t1 => Pos (CStringLiteral t1) instance CNode t1 => CNode (CStringLiteral t1) instance Annotated CConstant instance Functor CConstant instance CNode t1 => Pos (CConstant t1) instance CNode t1 => CNode (CConstant t1) instance Annotated ObjCConstant instance CNode t1 => Pos (ObjCConstant t1) instance CNode t1 => CNode (ObjCConstant t1) instance Annotated CBuiltinThing instance Functor CBuiltinThing instance CNode t1 => Pos (CBuiltinThing t1) instance CNode t1 => CNode (CBuiltinThing t1) instance Annotated ObjCKeywordArg instance CNode t1 => Pos (ObjCKeywordArg t1) instance CNode t1 => CNode (ObjCKeywordArg t1) instance Annotated ObjCMessageSelector instance CNode t1 => Pos (ObjCMessageSelector t1) instance CNode t1 => CNode (ObjCMessageSelector t1) instance Annotated ObjCMessageExpression instance CNode t1 => Pos (ObjCMessageExpression t1) instance CNode t1 => CNode (ObjCMessageExpression t1) instance Annotated ObjCSelector instance CNode t1 => Pos (ObjCSelector t1) instance CNode t1 => CNode (ObjCSelector t1) instance Annotated ObjCSelectorKeyName instance CNode t1 => Pos (ObjCSelectorKeyName t1) instance CNode t1 => CNode (ObjCSelectorKeyName t1) instance Annotated ObjCSelectorName instance CNode t1 => Pos (ObjCSelectorName t1) instance CNode t1 => CNode (ObjCSelectorName t1) instance Annotated CExpression instance CNode t1 => Pos (CExpression t1) instance CNode t1 => CNode (CExpression t1) instance Annotated CAttribute instance Functor CAttribute instance CNode t1 => Pos (CAttribute t1) instance CNode t1 => CNode (CAttribute t1) instance Annotated CPartDesignator instance Functor CPartDesignator instance CNode t1 => Pos (CPartDesignator t1) instance CNode t1 => CNode (CPartDesignator t1) instance Annotated CInitializer instance CNode t1 => Pos (CInitializer t1) instance CNode t1 => CNode (CInitializer t1) instance Annotated CEnumeration instance Functor CEnumeration instance CNode t1 => Pos (CEnumeration t1) instance CNode t1 => CNode (CEnumeration t1) instance Annotated CStructureUnion instance Functor CStructureUnion instance CNode t1 => Pos (CStructureUnion t1) instance CNode t1 => CNode (CStructureUnion t1) instance Annotated ObjCProtoQualifier instance CNode t1 => Pos (ObjCProtoQualifier t1) instance CNode t1 => CNode (ObjCProtoQualifier t1) instance Annotated CTypeQualifier instance Functor CTypeQualifier instance CNode t1 => Pos (CTypeQualifier t1) instance CNode t1 => CNode (CTypeQualifier t1) instance Annotated CTypeSpecifier instance Functor CTypeSpecifier instance CNode t1 => Pos (CTypeSpecifier t1) instance CNode t1 => CNode (CTypeSpecifier t1) instance Annotated CStorageSpecifier instance Functor CStorageSpecifier instance CNode t1 => Pos (CStorageSpecifier t1) instance CNode t1 => CNode (CStorageSpecifier t1) instance Annotated CDeclarationSpecifier instance Functor CDeclarationSpecifier instance CNode t1 => Pos (CDeclarationSpecifier t1) instance CNode t1 => CNode (CDeclarationSpecifier t1) instance Annotated CCompoundBlockItem instance Functor CCompoundBlockItem instance CNode t1 => Pos (CCompoundBlockItem t1) instance CNode t1 => CNode (CCompoundBlockItem t1) instance Annotated CAssemblyOperand instance Functor CAssemblyOperand instance CNode t1 => Pos (CAssemblyOperand t1) instance CNode t1 => CNode (CAssemblyOperand t1) instance Annotated CAssemblyStatement instance Functor CAssemblyStatement instance CNode t1 => Pos (CAssemblyStatement t1) instance CNode t1 => CNode (CAssemblyStatement t1) instance Annotated CStatement instance CNode t1 => Pos (CStatement t1) instance CNode t1 => CNode (CStatement t1) instance Functor CArraySize instance Annotated CDerivedDeclarator instance CNode t1 => Pos (CDerivedDeclarator t1) instance CNode t1 => CNode (CDerivedDeclarator t1) instance Annotated CDeclarator instance Functor CDeclarator instance CNode t1 => Pos (CDeclarator t1) instance CNode t1 => CNode (CDeclarator t1) instance Annotated CDeclaration instance CNode t1 => Pos (CDeclaration t1) instance CNode t1 => CNode (CDeclaration t1) instance Annotated ObjCPropertyModifier instance CNode t1 => Pos (ObjCPropertyModifier t1) instance CNode t1 => CNode (ObjCPropertyModifier t1) instance Annotated ObjCPropertyDeclaration instance CNode t1 => Pos (ObjCPropertyDeclaration t1) instance CNode t1 => CNode (ObjCPropertyDeclaration t1) instance Annotated ObjCKeywordDeclarator instance CNode t1 => Pos (ObjCKeywordDeclarator t1) instance CNode t1 => CNode (ObjCKeywordDeclarator t1) instance Annotated ObjCMethodSelector instance CNode t1 => Pos (ObjCMethodSelector t1) instance CNode t1 => CNode (ObjCMethodSelector t1) instance Annotated ObjCMethodDefinition instance CNode t1 => Pos (ObjCMethodDefinition t1) instance CNode t1 => CNode (ObjCMethodDefinition t1) instance Annotated ObjCMethodDeclaration instance CNode t1 => Pos (ObjCMethodDeclaration t1) instance CNode t1 => CNode (ObjCMethodDeclaration t1) instance Annotated ObjCImplementationDefinition instance CNode t1 => Pos (ObjCImplementationDefinition t1) instance CNode t1 => CNode (ObjCImplementationDefinition t1) instance Annotated ObjCInterfaceDeclaration instance CNode t1 => Pos (ObjCInterfaceDeclaration t1) instance CNode t1 => CNode (ObjCInterfaceDeclaration t1) instance Annotated ObjCVisibilitySpec instance CNode t1 => Pos (ObjCVisibilitySpec t1) instance CNode t1 => CNode (ObjCVisibilitySpec t1) instance Annotated ObjCInstanceVariableBlock instance CNode t1 => Pos (ObjCInstanceVariableBlock t1) instance CNode t1 => CNode (ObjCInstanceVariableBlock t1) instance Annotated ObjCProtocolName instance CNode t1 => Pos (ObjCProtocolName t1) instance CNode t1 => CNode (ObjCProtocolName t1) instance Annotated ObjCClassName instance CNode t1 => Pos (ObjCClassName t1) instance CNode t1 => CNode (ObjCClassName t1) instance Annotated ObjCClassDeclarator instance CNode t1 => Pos (ObjCClassDeclarator t1) instance CNode t1 => CNode (ObjCClassDeclarator t1) instance Annotated ObjCImplementation instance CNode t1 => Pos (ObjCImplementation t1) instance CNode t1 => CNode (ObjCImplementation t1) instance Annotated ObjCInterface instance CNode t1 => Pos (ObjCInterface t1) instance CNode t1 => CNode (ObjCInterface t1) instance Annotated ObjCProtocolDeclBlock instance Functor ObjCProtocolDeclBlock instance CNode t1 => Pos (ObjCProtocolDeclBlock t1) instance CNode t1 => CNode (ObjCProtocolDeclBlock t1) instance Annotated ObjCProtocolDec instance Functor ObjCProtocolDec instance CNode t1 => Pos (ObjCProtocolDec t1) instance CNode t1 => CNode (ObjCProtocolDec t1) instance Annotated ObjCClassListDef instance Functor ObjCClassListDef instance CNode t1 => Pos (ObjCClassListDef t1) instance CNode t1 => CNode (ObjCClassListDef t1) instance Annotated ObjCCategoryImplementation instance CNode t1 => Pos (ObjCCategoryImplementation t1) instance CNode t1 => CNode (ObjCCategoryImplementation t1) instance Annotated ObjCCategoryDec instance CNode t1 => Pos (ObjCCategoryDec t1) instance CNode t1 => CNode (ObjCCategoryDec t1) instance Annotated CFunctionDef instance Functor CFunctionDef instance CNode t1 => Pos (CFunctionDef t1) instance CNode t1 => CNode (CFunctionDef t1) instance Annotated CExternalDeclaration instance Functor CExternalDeclaration instance CNode t1 => Pos (CExternalDeclaration t1) instance CNode t1 => CNode (CExternalDeclaration t1) instance Annotated CTranslationUnit instance Functor CTranslationUnit instance CNode t1 => Pos (CTranslationUnit t1) instance CNode t1 => CNode (CTranslationUnit t1) instance Functor CInitializer instance Functor CStatement instance Functor CDerivedDeclarator instance Functor CDeclaration -- | Functions to assist with writing abstract syntax manually. module Language.ObjC.Syntax.Builders idType :: CDecl idTypeSpec :: CDeclSpec idSpec :: CTypeSpec -- | Create a type name of id protoname protoType :: Ident -> CDecl nonode :: NodeInfo module Language.ObjC.Syntax.Utils getSubStmts :: CStat -> [CStat] mapSubStmts :: (CStat -> Bool) -> (CStat -> CStat) -> CStat -> CStat mapBlockItemStmts :: (CStat -> Bool) -> (CStat -> CStat) -> CBlockItem -> CBlockItem getLabels :: CStat -> [Ident] -- | Base type for errors occurring in parsing, analysing and -- pretty-printing. With ideas from Simon Marlow's An extensible -- dynamically-typed hierarchy of execeptions [2006] module Language.ObjC.Data.Error -- | Error levels (severity) data ErrorLevel LevelWarn :: ErrorLevel LevelError :: ErrorLevel LevelFatal :: ErrorLevel -- | return True when the given error makes it impossible to -- continue analysis or compilation. isHardError :: Error ex => ex -> Bool -- | errors in Language.ObjC are instance of Error class (Typeable e, Show e) => Error e where fromError (CError e) = cast e toError = CError changeErrorLevel e lvl = if errorLevel e == lvl then e else error $ "changeErrorLevel: not possible for " ++ show e errorInfo :: Error e => e -> ErrorInfo toError :: Error e => e -> CError fromError :: Error e => CError -> (Maybe e) changeErrorLevel :: Error e => e -> ErrorLevel -> e -- | position of an Error errorPos :: Error e => e -> Position -- | severity level of an Error errorLevel :: Error e => e -> ErrorLevel -- | message lines of an Error errorMsgs :: Error e => e -> [String] -- | supertype of all errors data CError CError :: err -> CError -- | information attached to every error in Language.ObjC data ErrorInfo ErrorInfo :: ErrorLevel -> Position -> [String] -> ErrorInfo showError :: Error e => String -> e -> String -- | converts an error into a string using a fixed format -- --
-- <fname>:<row>: (column <col>) [<err lvl>] -- >>> <line_1> -- <line_2> -- ... -- <line_n> --showErrorInfo :: String -> ErrorInfo -> String mkErrorInfo :: ErrorLevel -> String -> NodeInfo -> ErrorInfo -- | error raised if a operation requires an unsupported or not yet -- implemented feature. data UnsupportedFeature unsupportedFeature :: Pos a => String -> a -> UnsupportedFeature unsupportedFeature_ :: String -> UnsupportedFeature -- | unspecified error raised by the user (in case the user does not want -- to define her own error types). data UserError userErr :: String -> UserError -- | raise a fatal internal error; message may have multiple lines internalErr :: String -> a instance Typeable ErrorInfo instance Typeable CError instance Typeable UnsupportedFeature instance Typeable UserError instance Eq ErrorLevel instance Ord ErrorLevel instance Show UserError instance Error UserError instance Show UnsupportedFeature instance Error UnsupportedFeature instance Error CError instance Show CError instance Error ErrorInfo instance Show ErrorInfo instance Show ErrorLevel -- | Compile time input abstraction for the parser, relying on ByteString. -- The String interface only supports Latin-1 since alex-3, as alex now -- requires byte based access to the input stream. module Language.ObjC.Data.InputStream type InputStream = ByteString -- | read a file into an InputStream readInputStream :: FilePath -> IO InputStream -- | convert InputStream to String inputStreamToString :: InputStream -> String -- | convert a String to an InputStream inputStreamFromString :: String -> InputStream -- | (b,is') = takeByte is reads and removes the first byte -- b from the InputStream is takeByte :: InputStream -> (Word8, InputStream) -- | (c,is') = takeChar is reads and removes the first character -- c from the InputStream is takeChar :: InputStream -> (Char, InputStream) -- | return True if the given input stream is empty inputStreamEmpty :: InputStream -> Bool -- | str = takeChars n is returns the first n characters -- of the given input stream, without removing them takeChars :: Int -> InputStream -> [Char] -- | countLines returns the number of text lines in the given -- InputStream countLines :: InputStream -> Int -- | Invoking external preprocessors. module Language.ObjC.System.Preprocess -- | Preprocessor encapsulates the abstract interface for invoking C -- preprocessors class Preprocessor cpp parseCPPArgs :: Preprocessor cpp => cpp -> [String] -> Either String (CppArgs, [String]) runCPP :: Preprocessor cpp => cpp -> CppArgs -> IO ExitCode -- | Generic Options for the preprocessor data CppOption IncludeDir :: FilePath -> CppOption Define :: String -> String -> CppOption Undefine :: String -> CppOption IncludeFile :: FilePath -> CppOption -- | Generic arguments for the preprocessor data CppArgs CppArgs :: [CppOption] -> [String] -> Maybe FilePath -> FilePath -> Maybe FilePath -> CppArgs cppOptions :: CppArgs -> [CppOption] extraOptions :: CppArgs -> [String] cppTmpDir :: CppArgs -> Maybe FilePath inputFile :: CppArgs -> FilePath outputFile :: CppArgs -> Maybe FilePath -- | use the given preprocessor arguments without analyzing them rawCppArgs :: [String] -> FilePath -> CppArgs -- | add a typed option to the given preprocessor arguments addCppOption :: CppArgs -> CppOption -> CppArgs -- | add a string option to the given preprocessor arguments addExtraOption :: CppArgs -> String -> CppArgs -- | Cpp arguments that only specify the input file name. cppFile :: FilePath -> CppArgs -- | run the preprocessor and return an InputStream if -- preprocesssing succeeded runPreprocessor :: Preprocessor cpp => cpp -> CppArgs -> IO (Either ExitCode InputStream) -- | guess whether a file is preprocessed (file end with .i) isPreprocessed :: FilePath -> Bool -- | Invoking gcc for preprocessing and compiling. module Language.ObjC.System.GCC -- | GCC represents a reference to the gcc compiler data GCC -- | create a reference to gcc newGCC :: FilePath -> GCC instance Preprocessor GCC module Language.ObjC.System -- | Syntax of C files: The abstract syntax tree and constants. module Language.ObjC.Syntax -- | Common data types for Language.ObjC: Identifiers, unique names, source -- code locations, ast node attributes and extensible errors. module Language.ObjC.Data -- | References uniquely determining a struct, union or enum type. Those -- are either identified by an string identifier, or by a unique name -- (anonymous types). data SUERef AnonymousRef :: Name -> SUERef NamedRef :: Ident -> SUERef -- | Return true if the struct/union/enum reference is anonymous. isAnonymousRef :: SUERef -> Bool -- | C identifiers data Ident -- | build an identifier from a string. -- --
-- MemberDecl vardecl bitfieldsize node --MemberDecl :: VarDecl -> (Maybe Expr) -> NodeInfo -> MemberDecl -- |
-- AnonBitField typ size --AnonBitField :: Type -> Expr -> NodeInfo -> MemberDecl -- | typedef definitions. -- -- The identifier is a new name for the given type. data TypeDef TypeDef :: Ident -> Type -> Attributes -> NodeInfo -> TypeDef -- | return the idenitifier of a typedef identOfTypeDef :: TypeDef -> Ident -- | Generic variable declarations data VarDecl VarDecl :: VarName -> DeclAttrs -> Type -> VarDecl -- | Declaration attributes of the form DeclAttrs isInlineFunction -- storage linkage attrs -- -- They specify the storage and linkage of a declared object. data DeclAttrs -- |
-- DeclAttrs inline storage attrs --DeclAttrs :: Bool -> Storage -> Attributes -> DeclAttrs isExtDecl :: Declaration n => n -> Bool -- | Storage duration and linkage of a variable data Storage -- | no storage NoStorage :: Storage -- | automatic storage (optional: register) Auto :: Register -> Storage -- | static storage, linkage spec and thread local specifier (gnu c) Static :: Linkage -> ThreadLocal -> Storage -- | function, either internal or external linkage FunLinkage :: Linkage -> Storage -- | get the Storage of a declaration declStorage :: Declaration d => d -> Storage type ThreadLocal = Bool type Register = Bool -- | Linkage: Either no linkage, internal to the translation unit or -- external data Linkage NoLinkage :: Linkage InternalLinkage :: Linkage ExternalLinkage :: Linkage -- | return True if the object has linkage hasLinkage :: Storage -> Bool -- | Get the linkage of a definition declLinkage :: Declaration d => d -> Linkage -- | types of C objects data Type -- | a non-derived type DirectType :: TypeName -> TypeQuals -> Attributes -> Type -- | pointer type PtrType :: Type -> TypeQuals -> Attributes -> Type -- | block type BlockType :: Type -> TypeQuals -> Attributes -> Type -- | array type ArrayType :: Type -> ArraySize -> TypeQuals -> Attributes -> Type -- | function type FunctionType :: FunType -> Attributes -> Type -- | a defined type TypeDefType :: TypeDefRef -> TypeQuals -> Attributes -> Type -- | Function types are of the form FunType return-type params -- isVariadic. -- -- If the parameter types aren't yet known, the function has type -- FunTypeIncomplete type attrs. data FunType FunType :: Type -> [ParamDecl] -> Bool -> FunType FunTypeIncomplete :: Type -> FunType -- | An array type may either have unknown size or a specified array size, -- the latter either variable or constant. Furthermore, when used as a -- function parameters, the size may be qualified as static. In a -- function prototype, the size may be `Unspecified variable size' -- ([*]). data ArraySize -- |
-- UnknownArraySize is-starred --UnknownArraySize :: Bool -> ArraySize -- |
-- FixedSizeArray is-static size-expr --ArraySize :: Bool -> Expr -> ArraySize -- | typdef references If the actual type is known, it is attached for -- convenience data TypeDefRef TypeDefRef :: Ident -> (Maybe Type) -> NodeInfo -> TypeDefRef -- | normalized type representation data TypeName TyVoid :: TypeName TyIntegral :: IntType -> TypeName TyFloating :: FloatType -> TypeName TyComplex :: FloatType -> TypeName TyComp :: CompTypeRef -> TypeName TyEnum :: EnumTypeRef -> TypeName TyBuiltin :: BuiltinType -> TypeName -- | Builtin type (va_list, anything) data BuiltinType TyVaList :: BuiltinType TyAny :: BuiltinType -- | integral types (C99 6.7.2.2) data IntType TyBool :: IntType TyChar :: IntType TySChar :: IntType TyUChar :: IntType TyShort :: IntType TyUShort :: IntType TyInt :: IntType TyUInt :: IntType TyLong :: IntType TyULong :: IntType TyLLong :: IntType TyULLong :: IntType -- | floating point type (C99 6.7.2.2) data FloatType TyFloat :: FloatType TyDouble :: FloatType TyLDouble :: FloatType -- | accessor class : struct/union/enum names class HasSUERef a sueRef :: HasSUERef a => a -> SUERef -- | accessor class : composite type tags (struct or union) class HasCompTyKind a compTag :: HasCompTyKind a => a -> CompTyKind -- | composite type declarations data CompTypeRef CompTypeRef :: SUERef -> CompTyKind -> NodeInfo -> CompTypeRef -- | Composite type (struct or union). data CompType CompType :: SUERef -> CompTyKind -> [MemberDecl] -> Attributes -> NodeInfo -> CompType -- | return the type of a composite type definition typeOfCompDef :: CompType -> TypeName -- | a tag to determine wheter we refer to a struct or -- union, see CompType. data CompTyKind StructTag :: CompTyKind UnionTag :: CompTyKind data EnumTypeRef EnumTypeRef :: SUERef -> NodeInfo -> EnumTypeRef -- | Representation of C enumeration types data EnumType -- |
-- EnumType name enumeration-constants attrs node --EnumType :: SUERef -> [Enumerator] -> Attributes -> NodeInfo -> EnumType -- | return the type of an enum definition typeOfEnumDef :: EnumType -> TypeName -- | An Enumerator consists of an identifier, a constant expressions and -- the link to its type data Enumerator Enumerator :: Ident -> Expr -> EnumType -> NodeInfo -> Enumerator -- | Type qualifiers: constant, volatile, proto, and restrict data TypeQuals TypeQuals :: Bool -> Bool -> Bool -> ProtoQuals -> TypeQuals constant :: TypeQuals -> Bool volatile :: TypeQuals -> Bool restrict :: TypeQuals -> Bool protocol :: TypeQuals -> ProtoQuals -- | no type qualifiers noTypeQuals :: TypeQuals -- | merge (&&) two type qualifier sets mergeTypeQuals :: TypeQuals -> TypeQuals -> TypeQuals data ProtoQuals ProtoQuals :: Bool -> Bool -> Bool -> Bool -> Bool -> ProtoQuals inQ :: ProtoQuals -> Bool outQ :: ProtoQuals -> Bool inoutQ :: ProtoQuals -> Bool bycopyQ :: ProtoQuals -> Bool onewayQ :: ProtoQuals -> Bool noProtoQuals :: ProtoQuals -- | merge (&&) two protocol qualifier sets mergeProtoQuals :: ProtoQuals -> ProtoQuals -> ProtoQuals -- | Convert protocol qualifier from AST representation protoFromAST :: ObjCProtoQualifier a -> ProtoQuals -- | VarName name assembler-name is a name of an declared object data VarName VarName :: Ident -> (Maybe AsmName) -> VarName NoName :: VarName identOfVarName :: VarName -> Ident isNoName :: VarName -> Bool -- | Assembler name (alias for CStrLit) type AsmName = CStrLit -- | __attribute__ annotations -- -- Those are of the form Attr attribute-name -- attribute-parameters, and serve as generic properties of some -- syntax tree elements. -- -- Some examples: -- --
typeof(T)
-- int f(d,c,a,b)
-- char a,*b;
-- int c;
-- { }
--
--
-- is converted to
--
-- -- int f(int d, int c, char a, char* b) ---- -- TODO: This could be moved to syntax, as it operates on the AST only mergeOldStyle :: MonadCError m => NodeInfo -> [CDecl] -> [CDerivedDeclr] -> m [CDerivedDeclr] canonicalTypeSpec :: MonadTrav m => [CTypeSpec] -> m TypeSpecAnalysis data NumBaseType NoBaseType :: NumBaseType BaseChar :: NumBaseType BaseInt :: NumBaseType BaseFloat :: NumBaseType BaseDouble :: NumBaseType data SignSpec NoSignSpec :: SignSpec Signed :: SignSpec Unsigned :: SignSpec data SizeMod NoSizeMod :: SizeMod ShortMod :: SizeMod LongMod :: SizeMod LongLongMod :: SizeMod data NumTypeSpec NumTypeSpec :: NumBaseType -> SignSpec -> SizeMod -> Bool -> NumTypeSpec base :: NumTypeSpec -> NumBaseType signSpec :: NumTypeSpec -> SignSpec sizeMod :: NumTypeSpec -> SizeMod isComplex :: NumTypeSpec -> Bool data TypeSpecAnalysis TSNone :: TypeSpecAnalysis TSVoid :: TypeSpecAnalysis TSBool :: TypeSpecAnalysis TSNum :: NumTypeSpec -> TypeSpecAnalysis TSTypeDef :: TypeDefRef -> TypeSpecAnalysis TSType :: Type -> TypeSpecAnalysis TSNonBasic :: CTypeSpec -> TypeSpecAnalysis canonicalStorageSpec :: MonadCError m => [CStorageSpec] -> m StorageSpec data StorageSpec NoStorageSpec :: StorageSpec AutoSpec :: StorageSpec RegSpec :: StorageSpec ThreadSpec :: StorageSpec StaticSpec :: Bool -> StorageSpec ExternSpec :: Bool -> StorageSpec hasThreadLocalSpec :: StorageSpec -> Bool isTypeDef :: [CDeclSpec] -> Bool data VarDeclInfo VarDeclInfo :: VarName -> Bool -> StorageSpec -> Attributes -> Type -> NodeInfo -> VarDeclInfo -- | translate __attribute__ annotations TODO: This is a unwrap -- and wrap stub tAttr :: (MonadCError m, MonadSymtab m) => CAttr -> m Attr -- | construct a name for a variable TODO: more or less bogus mkVarName :: (MonadCError m, MonadSymtab m) => NodeInfo -> Maybe Ident -> Maybe AsmName -> m VarName getOnlyDeclr :: MonadCError m => CDecl -> m CDeclr nameOfDecl :: MonadCError m => CDecl -> m Ident -- | analyse declarators analyseVarDecl :: MonadTrav m => Bool -> [CStorageSpec] -> [CAttr] -> [CTypeQual] -> TypeSpecAnalysis -> Bool -> CDeclr -> [CDecl] -> (Maybe CInit) -> m VarDeclInfo analyseVarDecl' :: MonadTrav m => Bool -> [CDeclSpec] -> CDeclr -> [CDecl] -> (Maybe CInit) -> m VarDeclInfo instance Eq StorageSpec instance Ord StorageSpec instance Show StorageSpec instance Read StorageSpec instance Eq NumBaseType instance Ord NumBaseType instance Eq SignSpec instance Ord SignSpec instance Eq SizeMod instance Ord SizeMod module Language.ObjC.Analysis.ConstEval data MachineDesc MachineDesc :: (IntType -> Integer) -> (FloatType -> Integer) -> (BuiltinType -> Integer) -> Integer -> Integer -> (IntType -> Integer) -> (FloatType -> Integer) -> (BuiltinType -> Integer) -> Integer -> Integer -> MachineDesc iSize :: MachineDesc -> IntType -> Integer fSize :: MachineDesc -> FloatType -> Integer builtinSize :: MachineDesc -> BuiltinType -> Integer ptrSize :: MachineDesc -> Integer voidSize :: MachineDesc -> Integer iAlign :: MachineDesc -> IntType -> Integer fAlign :: MachineDesc -> FloatType -> Integer builtinAlign :: MachineDesc -> BuiltinType -> Integer ptrAlign :: MachineDesc -> Integer voidAlign :: MachineDesc -> Integer intExpr :: (Pos n, MonadName m) => n -> Integer -> m CExpr sizeofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer alignofType :: (MonadTrav m, CNode n) => MachineDesc -> n -> Type -> m Integer compSize :: MonadTrav m => MachineDesc -> CompTypeRef -> m Integer intOp :: CBinaryOp -> Integer -> Integer -> Integer intUnOp :: CUnaryOp -> Integer -> Maybe Integer withWordBytes :: Int -> Integer -> Integer boolValue :: CExpr -> Maybe Bool intValue :: CExpr -> Maybe Integer constEval :: MonadTrav m => MachineDesc -> Map Ident CExpr -> CExpr -> m CExpr module Language.ObjC.Analysis.TypeCheck pType :: Type -> String typeErrorOnLeft :: MonadCError m => NodeInfo -> Either String a -> m a typeError :: MonadCError m => NodeInfo -> String -> m a notFound :: Ident -> Either String a checkScalar' :: MonadCError m => NodeInfo -> Type -> m () checkIntegral' :: MonadCError m => NodeInfo -> Type -> m () assignCompatible' :: MonadCError m => NodeInfo -> CAssignOp -> Type -> Type -> m () binopType' :: MonadCError m => NodeInfo -> CBinaryOp -> Type -> Type -> m Type conditionalType' :: MonadCError m => NodeInfo -> Type -> Type -> m Type checkScalar :: Type -> Either String () checkIntegral :: Type -> Either String () -- | Determine the type of a constant. constType :: (MonadCError m, MonadName m) => CConst -> m Type -- | Determine whether two types are compatible. compatible :: Type -> Type -> Either String () -- | Determine the composite type of two compatible types. compositeType :: Type -> Type -> Either String Type compositeSize :: ArraySize -> ArraySize -> Either String ArraySize sizeEqual :: CExpr -> CExpr -> Bool mergeAttrs :: Attributes -> Attributes -> Attributes compositeParamDecl :: ParamDecl -> ParamDecl -> Either String ParamDecl compositeParamDecl' :: (VarDecl -> NodeInfo -> ParamDecl) -> VarDecl -> VarDecl -> NodeInfo -> Either String ParamDecl compositeVarDecl :: VarDecl -> VarDecl -> Either String VarDecl compositeDeclAttrs :: DeclAttrs -> DeclAttrs -> DeclAttrs castCompatible :: Type -> Type -> Either String () -- | Determine whether two types are compatible in an assignment -- expression. assignCompatible :: CAssignOp -> Type -> Type -> Either String () -- | Determine the type of a binary operation. binopType :: CBinaryOp -> Type -> Type -> Either String Type -- | Determine the type of a conditional expression. conditionalType :: Type -> Type -> Either String Type derefType :: Type -> Either String Type varAddrType :: IdentDecl -> Either String Type -- | Get the type of field m of type t fieldType :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> Type -> m Type -- | Get all members of a struct, union, or enum, with their types. -- Collapse fields of anonymous members. tagMembers :: (MonadCError m, MonadSymtab m) => NodeInfo -> TagDef -> m [(Ident, Type)] -- | Expand an anonymous composite type into a list of member names and -- their associated types. expandAnonymous :: (MonadCError m, MonadSymtab m) => NodeInfo -> (VarName, Type) -> m [(Ident, Type)] lookupSUE :: (MonadCError m, MonadSymtab m) => NodeInfo -> SUERef -> m TagDef deepTypeAttrs :: (MonadCError m, MonadSymtab m) => Type -> m Attributes typeDefAttrs :: (MonadCError m, MonadSymtab m) => NodeInfo -> Ident -> m Attributes sueAttrs :: (MonadCError m, MonadSymtab m) => NodeInfo -> SUERef -> m Attributes -- | Analyse the parse tree -- -- Traverses the AST, analyses declarations and invokes handlers. module Language.ObjC.Analysis.AstAnalysis -- | Analyse the given AST -- -- analyseAST ast results in global declaration dictionaries. If -- you want to perform specific actions on declarations or definitions, -- you may provide callbacks in the MonadTrav m. -- -- Returns the set of global declarations and definitions which where -- successfully translated. It is the users responsibility to check -- whether any hard errors occurred (runTrav does this for you). analyseAST :: MonadTrav m => CTranslUnit -> m GlobalDecls -- | Analyse an top-level declaration analyseExt :: MonadTrav m => CExtDecl -> m () -- | Analyse a function definition analyseFunDef :: MonadTrav m => CFunDef -> m () -- | Analyse a declaration other than a function definition analyseDecl :: MonadTrav m => Bool -> CDecl -> m () analyseFunctionBody :: MonadTrav m => NodeInfo -> VarDecl -> CStat -> m Stmt defineParams :: MonadTrav m => NodeInfo -> VarDecl -> m () tExpr :: MonadTrav m => [StmtCtx] -> ExprSide -> CExpr -> m Type data ExprSide LValue :: ExprSide RValue :: ExprSide -- | Typecheck a statement, given a statement context. The type of a -- statement is usually void, but expression statements and -- blocks can sometimes have other types. tStmt :: MonadTrav m => [StmtCtx] -> CStat -> m Type data StmtCtx FunCtx :: VarDecl -> StmtCtx LoopCtx :: StmtCtx SwitchCtx :: StmtCtx tDesignator :: MonadTrav m => Type -> [CDesignator] -> m Type defaultMD :: MachineDesc instance Eq ExprSide instance Show ExprSide -- | Analysis of the AST. -- -- Currently, we provide a monad for analysis and analyze declarations -- and types. Especially note that there is no direct support for -- analyzing function bodies and constant expressions. -- -- NOTE This is an experimental interface, and therefore the API -- will change in the future. -- -- DONE: -- --
-- Synopsis: parseCFile preprocesssor tmp-dir? cpp-opts file -- Example: parseCFile (newGCC "gcc") Nothing ["-I/usr/include/gtk-2.0"] my-gtk-exts.c --parseCFile :: Preprocessor cpp => cpp -> (Maybe FilePath) -> [String] -> FilePath -> IO (Either ParseError CTranslUnit) -- | parse an already preprocessed C file -- --
-- Synopsis: parseCFilePre file.i --parseCFilePre :: FilePath -> IO (Either ParseError CTranslUnit)