module Language.Go.Syntax.AST where
data GoSource = GoSource {
getPackage :: GoId,
getTopLevelPrel :: [GoPrel],
getTopLevelDecl :: [GoDecl]}
deriving (Eq, Read, Show)
data GoPrel = GoImportDecl [GoImpSpec]
deriving (Eq, Read, Show)
data GoDecl = GoConst [GoCVSpec]
| GoType [GoTypeSpec]
| GoVar [GoCVSpec]
| GoFunc GoFuncDecl
| GoMeth GoMethDecl
deriving (Eq, Read, Show)
data GoImpSpec = GoImpSpec GoImpType String
deriving (Eq, Read, Show)
data GoImpType = GoImp
| GoImpDot
| GoImpQual GoId
deriving (Eq, Read, Show)
data GoCVSpec = GoCVSpec [GoId] (Maybe GoType) [GoExpr]
deriving (Eq, Read, Show)
data GoTypeSpec = GoTypeSpec GoId GoType
deriving (Eq, Read, Show)
data GoFuncExpr = GoFuncExpr GoSig GoBlock
deriving (Eq, Read, Show)
data GoFuncDecl = GoFuncDecl GoId GoSig GoBlock
deriving (Eq, Read, Show)
data GoMethDecl = GoMethDecl GoRec GoId GoSig GoBlock
deriving (Eq, Read, Show)
data GoMethSpec = GoMethSpec GoId GoSig
| GoIfaceName (Maybe GoId) GoId
deriving (Eq, Read, Show)
data GoId = GoId String
deriving (Eq, Read, Show)
data GoOp = GoOp String
deriving (Eq, Read, Show)
data GoRec = GoRec Bool (Maybe GoId) GoType
deriving (Eq, Read, Show)
data GoSig = GoSig [GoParam] [GoParam]
deriving (Eq, Read, Show)
data GoParam = GoParam [GoId] GoType
deriving (Eq, Read, Show)
data GoType = GoTypeName (Maybe GoId) GoId
| GoArrayType GoExpr GoType
| GoChannelType GoChanKind GoType
| GoFunctionType GoSig
| GoInterfaceType [GoMethSpec]
| GoMapType GoType GoType
| GoPointerType GoType
| GoSliceType GoType
| GoStructType [GoFieldType]
| GoEllipsisType GoType
| GoVariadicType GoType
deriving (Eq, Read, Show)
data GoChanKind = GoIChan
| GoOChan
| GoIOChan
deriving (Eq, Read, Show)
data GoFieldType = GoFieldType {
getFieldTag :: Maybe GoLit,
getFieldId :: [GoId],
getFieldType :: GoType }
| GoFieldAnon {
getFieldTag :: Maybe GoLit,
getFieldPtr :: Bool,
getFieldType :: GoType }
deriving (Eq, Read, Show)
data GoExpr = GoPrim GoPrim
| Go1Op GoOp GoExpr
| Go2Op GoOp GoExpr GoExpr
deriving (Eq, Read, Show)
data GoPrim = GoLiteral GoLit
| GoQual (Maybe GoId) GoId
| GoMethod GoRec GoId
| GoParen GoExpr
| GoCast GoType GoExpr
| GoNew GoType
| GoMake GoType [GoExpr]
| GoSelect GoPrim GoId
| GoIndex GoPrim GoExpr
| GoSlice GoPrim (Maybe GoExpr) (Maybe GoExpr)
| GoTA GoPrim GoType
| GoCall GoPrim [GoExpr] Bool
deriving (Eq, Read, Show)
data GoLit = GoLitInt String Integer
| GoLitReal String Float
| GoLitImag String Float
| GoLitChar String Char
| GoLitStr String String
| GoLitComp GoType GoComp
| GoLitFunc GoFuncExpr
deriving (Eq, Read, Show)
data GoComp = GoComp [GoElement]
deriving (Eq, Read, Show)
data GoElement = GoElement GoKey GoValue
deriving (Eq, Read, Show)
data GoKey = GoKeyNone
| GoKeyField GoId
| GoKeyIndex GoExpr
deriving (Eq, Read, Show)
data GoValue = GoValueExpr GoExpr
| GoValueComp GoComp
deriving (Eq, Read, Show)
data GoBlock = GoBlock { getStmt::[GoStmt] }
| GoNoBlock
deriving (Eq, Read, Show)
data GoForClause = GoForWhile (Maybe GoExpr)
| GoForThree GoSimp (Maybe GoExpr) GoSimp
| GoForRange [GoExpr] GoExpr Bool
deriving (Eq, Read, Show)
data GoStmt = GoStmtDecl GoDecl
| GoStmtLabeled GoId GoStmt
| GoStmtSimple GoSimp
| GoStmtGo GoExpr
| GoStmtReturn [GoExpr]
| GoStmtBreak (Maybe GoId)
| GoStmtContinue (Maybe GoId)
| GoStmtGoto GoId
| GoStmtFallthrough
| GoStmtBlock GoBlock
| GoStmtIf GoCond GoBlock (Maybe GoStmt)
| GoStmtSelect [GoCase GoChan]
| GoStmtSwitch GoCond [GoCase GoExpr]
| GoStmtTypeSwitch GoCond [GoCase GoType] (Maybe GoId)
| GoStmtFor GoForClause GoBlock
| GoStmtDefer GoExpr
deriving (Eq, Read, Show)
data GoSimp = GoSimpEmpty
| GoSimpSend GoExpr GoExpr
| GoSimpExpr GoExpr
| GoSimpInc GoExpr
| GoSimpDec GoExpr
| GoSimpAsn [GoExpr] GoOp [GoExpr]
| GoSimpVar [GoId] [GoExpr]
deriving (Eq, Read, Show)
data GoChan = GoChanRecv (Maybe (GoExpr, Maybe GoExpr, GoOp)) GoExpr
| GoChanSend GoExpr GoExpr
deriving (Eq, Read, Show)
data GoCond = GoCond (Maybe GoSimp) (Maybe GoExpr)
deriving (Eq, Read, Show)
data GoCase a = GoCase [a] [GoStmt]
| GoDefault [GoStmt]
deriving (Eq, Read, Show)