packages feed

curry-base 1.0.0 → 1.1.0

raw patch · 25 files changed

+2887/−828 lines, 25 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Curry.Base.Ident: [idPosition] :: Ident -> Position
- Curry.Base.Ident: [midPosition] :: ModuleIdent -> Position
- Curry.Base.Ident: qidPosition :: QualIdent -> Position
- Curry.Base.Pretty: instance Curry.Base.Pretty.Pretty a => Curry.Base.Pretty.Pretty (GHC.Base.Maybe a)
- Curry.FlatCurry.Annotated.Typing: class Typeable a
- Curry.FlatCurry.Annotated.Typing: instance Curry.FlatCurry.Annotated.Typing.Typeable Curry.FlatCurry.Type.TypeExpr
- Curry.FlatCurry.Annotated.Typing: instance Curry.FlatCurry.Annotated.Typing.Typeable a => Curry.FlatCurry.Annotated.Typing.Typeable (Curry.FlatCurry.Annotated.Type.AExpr a)
- Curry.FlatCurry.Annotated.Typing: instance Curry.FlatCurry.Annotated.Typing.Typeable a => Curry.FlatCurry.Annotated.Typing.Typeable (Curry.FlatCurry.Annotated.Type.APattern a)
- Curry.FlatCurry.Annotated.Typing: typeOf :: Typeable a => a -> TypeExpr
- Curry.Syntax.InterfaceEquivalence: instance Curry.Syntax.InterfaceEquivalence.Equiv a => Curry.Syntax.InterfaceEquivalence.Equiv (GHC.Base.Maybe a)
- Curry.Syntax.InterfaceEquivalence: instance Curry.Syntax.InterfaceEquivalence.FixInterface a => Curry.Syntax.InterfaceEquivalence.FixInterface (GHC.Base.Maybe a)
- Curry.Syntax.Type: CallConvCCall :: CallConv
- Curry.Syntax.Type: CallConvPrimitive :: CallConv
- Curry.Syntax.Type: data CallConv
- Curry.Syntax.Type: instance GHC.Classes.Eq Curry.Syntax.Type.CallConv
- Curry.Syntax.Type: instance GHC.Read.Read Curry.Syntax.Type.CallConv
- Curry.Syntax.Type: instance GHC.Show.Show Curry.Syntax.Type.CallConv
+ Curry.Base.Ident: [idSpanInfo] :: Ident -> SpanInfo
+ Curry.Base.Ident: [midSpanInfo] :: ModuleIdent -> SpanInfo
+ Curry.Base.Ident: [qidSpanInfo] :: QualIdent -> SpanInfo
+ Curry.Base.Ident: identLength :: Ident -> Int
+ Curry.Base.Ident: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Base.Ident.Ident
+ Curry.Base.Ident: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Base.Ident.ModuleIdent
+ Curry.Base.Ident: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Base.Ident.QualIdent
+ Curry.Base.Ident: mIdentLength :: ModuleIdent -> Int
+ Curry.Base.Ident: qIdentLength :: QualIdent -> Int
+ Curry.Base.LLParseComb: sepBy1Sp :: Symbol s => Parser a s b -> Parser a s c -> Parser a s ([b], [Span])
+ Curry.Base.LLParseComb: sepBySp :: Symbol s => Parser a s b -> Parser a s c -> Parser a s ([b], [Span])
+ Curry.Base.LLParseComb: spanPosition :: Symbol s => Parser a s Span
+ Curry.Base.Pretty: instance Curry.Base.Pretty.Pretty a => Curry.Base.Pretty.Pretty (GHC.Maybe.Maybe a)
+ Curry.Base.Span: addSpan :: Span -> (a, [Span]) -> (a, [Span])
+ Curry.Base.Span: combineSpans :: Span -> Span -> Span
+ Curry.Base.Span: instance Curry.Base.Position.HasPosition Curry.Base.Span.Span
+ Curry.Base.SpanInfo: NoSpanInfo :: SpanInfo
+ Curry.Base.SpanInfo: SpanInfo :: Span -> [Span] -> SpanInfo
+ Curry.Base.SpanInfo: [srcInfoPoints] :: SpanInfo -> [Span]
+ Curry.Base.SpanInfo: [srcSpan] :: SpanInfo -> Span
+ Curry.Base.SpanInfo: class HasPosition a => HasSpanInfo a
+ Curry.Base.SpanInfo: data SpanInfo
+ Curry.Base.SpanInfo: fromSrcInfoPoints :: [Span] -> SpanInfo
+ Curry.Base.SpanInfo: fromSrcSpan :: Span -> SpanInfo
+ Curry.Base.SpanInfo: fromSrcSpanBoth :: Span -> SpanInfo
+ Curry.Base.SpanInfo: getSpanInfo :: HasSpanInfo a => a -> SpanInfo
+ Curry.Base.SpanInfo: getSrcInfoPoints :: HasSpanInfo a => a -> [Span]
+ Curry.Base.SpanInfo: getSrcSpan :: HasSpanInfo a => a -> Span
+ Curry.Base.SpanInfo: getSrcSpanEnd :: HasSpanInfo a => a -> Position
+ Curry.Base.SpanInfo: getStartPosition :: HasSpanInfo a => a -> Position
+ Curry.Base.SpanInfo: instance Curry.Base.Position.HasPosition Curry.Base.SpanInfo.SpanInfo
+ Curry.Base.SpanInfo: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Base.SpanInfo.SpanInfo
+ Curry.Base.SpanInfo: instance GHC.Classes.Eq Curry.Base.SpanInfo.SpanInfo
+ Curry.Base.SpanInfo: instance GHC.Read.Read Curry.Base.SpanInfo.SpanInfo
+ Curry.Base.SpanInfo: instance GHC.Show.Show Curry.Base.SpanInfo.SpanInfo
+ Curry.Base.SpanInfo: setEndPosition :: HasSpanInfo a => Position -> a -> a
+ Curry.Base.SpanInfo: setSpanInfo :: HasSpanInfo a => SpanInfo -> a -> a
+ Curry.Base.SpanInfo: setSrcInfoPoints :: HasSpanInfo a => [Span] -> a -> a
+ Curry.Base.SpanInfo: setSrcSpan :: HasSpanInfo a => Span -> a -> a
+ Curry.Base.SpanInfo: setStartPosition :: HasSpanInfo a => Position -> a -> a
+ Curry.Base.SpanInfo: spanInfo2Pos :: HasSpanInfo a => a -> Position
+ Curry.Base.SpanInfo: updateEndPos :: HasSpanInfo a => a -> a
+ Curry.Files.Filenames: astName :: FilePath -> FilePath
+ Curry.Files.Filenames: commentsName :: FilePath -> FilePath
+ Curry.Files.Filenames: shortASTName :: FilePath -> FilePath
+ Curry.Files.Filenames: typeAnnFlatName :: FilePath -> FilePath
+ Curry.FlatCurry.Annotated.Goodies: allTypeCons :: TypeExpr -> [QName]
+ Curry.FlatCurry.Annotated.Goodies: allVarsInTypeExpr :: TypeExpr -> [TVarIndex]
+ Curry.FlatCurry.Annotated.Goodies: argTypes :: TypeExpr -> [TypeExpr]
+ Curry.FlatCurry.Annotated.Goodies: consArgs :: ConsDecl -> [TypeExpr]
+ Curry.FlatCurry.Annotated.Goodies: consArity :: ConsDecl -> Int
+ Curry.FlatCurry.Annotated.Goodies: consName :: ConsDecl -> QName
+ Curry.FlatCurry.Annotated.Goodies: consVisibility :: ConsDecl -> Visibility
+ Curry.FlatCurry.Annotated.Goodies: domain :: TypeExpr -> TypeExpr
+ Curry.FlatCurry.Annotated.Goodies: isCombTypeConsCall :: CombType -> Bool
+ Curry.FlatCurry.Annotated.Goodies: isCombTypeConsPartCall :: CombType -> Bool
+ Curry.FlatCurry.Annotated.Goodies: isCombTypeFuncCall :: CombType -> Bool
+ Curry.FlatCurry.Annotated.Goodies: isCombTypeFuncPartCall :: CombType -> Bool
+ Curry.FlatCurry.Annotated.Goodies: isDataTypeDecl :: TypeDecl -> Bool
+ Curry.FlatCurry.Annotated.Goodies: isExternalType :: TypeDecl -> Bool
+ Curry.FlatCurry.Annotated.Goodies: isFuncType :: TypeExpr -> Bool
+ Curry.FlatCurry.Annotated.Goodies: isPublic :: Visibility -> Bool
+ Curry.FlatCurry.Annotated.Goodies: isPublicCons :: ConsDecl -> Bool
+ Curry.FlatCurry.Annotated.Goodies: isPublicType :: TypeDecl -> Bool
+ Curry.FlatCurry.Annotated.Goodies: isTCons :: TypeExpr -> Bool
+ Curry.FlatCurry.Annotated.Goodies: isTVar :: TypeExpr -> Bool
+ Curry.FlatCurry.Annotated.Goodies: isTypeSyn :: TypeDecl -> Bool
+ Curry.FlatCurry.Annotated.Goodies: opFixity :: OpDecl -> Fixity
+ Curry.FlatCurry.Annotated.Goodies: opName :: OpDecl -> QName
+ Curry.FlatCurry.Annotated.Goodies: opPrecedence :: OpDecl -> Integer
+ Curry.FlatCurry.Annotated.Goodies: range :: TypeExpr -> TypeExpr
+ Curry.FlatCurry.Annotated.Goodies: resultType :: TypeExpr -> TypeExpr
+ Curry.FlatCurry.Annotated.Goodies: rnmAllVarsInTypeExpr :: (TVarIndex -> TVarIndex) -> TypeExpr -> TypeExpr
+ Curry.FlatCurry.Annotated.Goodies: tConsArgs :: TypeExpr -> [TypeExpr]
+ Curry.FlatCurry.Annotated.Goodies: tConsName :: TypeExpr -> QName
+ Curry.FlatCurry.Annotated.Goodies: tVarIndex :: TypeExpr -> TVarIndex
+ Curry.FlatCurry.Annotated.Goodies: trCombType :: a -> (Int -> a) -> a -> (Int -> a) -> CombType -> a
+ Curry.FlatCurry.Annotated.Goodies: trCons :: (QName -> Int -> Visibility -> [TypeExpr] -> a) -> ConsDecl -> a
+ Curry.FlatCurry.Annotated.Goodies: trOp :: (QName -> Fixity -> Integer -> a) -> OpDecl -> a
+ Curry.FlatCurry.Annotated.Goodies: trType :: (QName -> Visibility -> [TVarIndex] -> [ConsDecl] -> a) -> (QName -> Visibility -> [TVarIndex] -> TypeExpr -> a) -> TypeDecl -> a
+ Curry.FlatCurry.Annotated.Goodies: trTypeExpr :: (TVarIndex -> a) -> (QName -> [a] -> a) -> (a -> a -> a) -> ([TVarIndex] -> a -> a) -> TypeExpr -> a
+ Curry.FlatCurry.Annotated.Goodies: type Update a b = (b -> b) -> a -> a
+ Curry.FlatCurry.Annotated.Goodies: typeArity :: TypeExpr -> Int
+ Curry.FlatCurry.Annotated.Goodies: typeConsDecls :: TypeDecl -> [ConsDecl]
+ Curry.FlatCurry.Annotated.Goodies: typeName :: TypeDecl -> QName
+ Curry.FlatCurry.Annotated.Goodies: typeParams :: TypeDecl -> [TVarIndex]
+ Curry.FlatCurry.Annotated.Goodies: typeSyn :: TypeDecl -> TypeExpr
+ Curry.FlatCurry.Annotated.Goodies: typeVisibility :: TypeDecl -> Visibility
+ Curry.FlatCurry.Annotated.Goodies: updCons :: (QName -> QName) -> (Int -> Int) -> (Visibility -> Visibility) -> ([TypeExpr] -> [TypeExpr]) -> ConsDecl -> ConsDecl
+ Curry.FlatCurry.Annotated.Goodies: updConsArgs :: Update ConsDecl [TypeExpr]
+ Curry.FlatCurry.Annotated.Goodies: updConsArity :: Update ConsDecl Int
+ Curry.FlatCurry.Annotated.Goodies: updConsName :: Update ConsDecl QName
+ Curry.FlatCurry.Annotated.Goodies: updConsVisibility :: Update ConsDecl Visibility
+ Curry.FlatCurry.Annotated.Goodies: updFuncTypes :: (TypeExpr -> TypeExpr -> TypeExpr) -> TypeExpr -> TypeExpr
+ Curry.FlatCurry.Annotated.Goodies: updOp :: (QName -> QName) -> (Fixity -> Fixity) -> (Integer -> Integer) -> OpDecl -> OpDecl
+ Curry.FlatCurry.Annotated.Goodies: updOpFixity :: Update OpDecl Fixity
+ Curry.FlatCurry.Annotated.Goodies: updOpName :: Update OpDecl QName
+ Curry.FlatCurry.Annotated.Goodies: updOpPrecedence :: Update OpDecl Integer
+ Curry.FlatCurry.Annotated.Goodies: updQNamesInConsDecl :: Update ConsDecl QName
+ Curry.FlatCurry.Annotated.Goodies: updQNamesInType :: Update TypeDecl QName
+ Curry.FlatCurry.Annotated.Goodies: updQNamesInTypeExpr :: (QName -> QName) -> TypeExpr -> TypeExpr
+ Curry.FlatCurry.Annotated.Goodies: updTCons :: (QName -> [TypeExpr] -> TypeExpr) -> TypeExpr -> TypeExpr
+ Curry.FlatCurry.Annotated.Goodies: updTVars :: (TVarIndex -> TypeExpr) -> TypeExpr -> TypeExpr
+ Curry.FlatCurry.Annotated.Goodies: updType :: (QName -> QName) -> (Visibility -> Visibility) -> ([TVarIndex] -> [TVarIndex]) -> ([ConsDecl] -> [ConsDecl]) -> (TypeExpr -> TypeExpr) -> TypeDecl -> TypeDecl
+ Curry.FlatCurry.Annotated.Goodies: updTypeConsDecls :: Update TypeDecl [ConsDecl]
+ Curry.FlatCurry.Annotated.Goodies: updTypeName :: Update TypeDecl QName
+ Curry.FlatCurry.Annotated.Goodies: updTypeParams :: Update TypeDecl [TVarIndex]
+ Curry.FlatCurry.Annotated.Goodies: updTypeSynonym :: Update TypeDecl TypeExpr
+ Curry.FlatCurry.Annotated.Goodies: updTypeVisibility :: Update TypeDecl Visibility
+ Curry.FlatCurry.Annotated.Type: Charc :: Char -> Literal
+ Curry.FlatCurry.Annotated.Type: Cons :: QName -> Int -> Visibility -> [TypeExpr] -> ConsDecl
+ Curry.FlatCurry.Annotated.Type: ConsCall :: CombType
+ Curry.FlatCurry.Annotated.Type: ConsPartCall :: Int -> CombType
+ Curry.FlatCurry.Annotated.Type: Flex :: CaseType
+ Curry.FlatCurry.Annotated.Type: Floatc :: Double -> Literal
+ Curry.FlatCurry.Annotated.Type: ForallType :: [TVarIndex] -> TypeExpr -> TypeExpr
+ Curry.FlatCurry.Annotated.Type: FuncCall :: CombType
+ Curry.FlatCurry.Annotated.Type: FuncPartCall :: Int -> CombType
+ Curry.FlatCurry.Annotated.Type: FuncType :: TypeExpr -> TypeExpr -> TypeExpr
+ Curry.FlatCurry.Annotated.Type: InfixOp :: Fixity
+ Curry.FlatCurry.Annotated.Type: InfixlOp :: Fixity
+ Curry.FlatCurry.Annotated.Type: InfixrOp :: Fixity
+ Curry.FlatCurry.Annotated.Type: Intc :: Integer -> Literal
+ Curry.FlatCurry.Annotated.Type: Op :: QName -> Fixity -> Integer -> OpDecl
+ Curry.FlatCurry.Annotated.Type: Private :: Visibility
+ Curry.FlatCurry.Annotated.Type: Public :: Visibility
+ Curry.FlatCurry.Annotated.Type: Rigid :: CaseType
+ Curry.FlatCurry.Annotated.Type: TCons :: QName -> [TypeExpr] -> TypeExpr
+ Curry.FlatCurry.Annotated.Type: TVar :: TVarIndex -> TypeExpr
+ Curry.FlatCurry.Annotated.Type: Type :: QName -> Visibility -> [TVarIndex] -> [ConsDecl] -> TypeDecl
+ Curry.FlatCurry.Annotated.Type: TypeSyn :: QName -> Visibility -> [TVarIndex] -> TypeExpr -> TypeDecl
+ Curry.FlatCurry.Annotated.Type: data CaseType
+ Curry.FlatCurry.Annotated.Type: data CombType
+ Curry.FlatCurry.Annotated.Type: data ConsDecl
+ Curry.FlatCurry.Annotated.Type: data Fixity
+ Curry.FlatCurry.Annotated.Type: data Literal
+ Curry.FlatCurry.Annotated.Type: data OpDecl
+ Curry.FlatCurry.Annotated.Type: data TypeDecl
+ Curry.FlatCurry.Annotated.Type: data TypeExpr
+ Curry.FlatCurry.Annotated.Type: data Visibility
+ Curry.FlatCurry.Annotated.Type: instance Curry.FlatCurry.Typeable.Typeable a => Curry.FlatCurry.Typeable.Typeable (Curry.FlatCurry.Annotated.Type.AExpr a)
+ Curry.FlatCurry.Annotated.Type: instance Curry.FlatCurry.Typeable.Typeable a => Curry.FlatCurry.Typeable.Typeable (Curry.FlatCurry.Annotated.Type.APattern a)
+ Curry.FlatCurry.Annotated.Type: type QName = (String, String)
+ Curry.FlatCurry.Annotated.Type: type TVarIndex = Int
+ Curry.FlatCurry.Annotated.Type: type VarIndex = Int
+ Curry.FlatCurry.Typeable: class Typeable a
+ Curry.FlatCurry.Typeable: instance Curry.FlatCurry.Typeable.Typeable Curry.FlatCurry.Type.TypeExpr
+ Curry.FlatCurry.Typeable: typeOf :: Typeable a => a -> TypeExpr
+ Curry.FlatCurry.Typed.Goodies: allTypeCons :: TypeExpr -> [QName]
+ Curry.FlatCurry.Typed.Goodies: allVars :: TExpr -> [(VarIndex, TypeExpr)]
+ Curry.FlatCurry.Typed.Goodies: allVarsInTFunc :: TFuncDecl -> [(VarIndex, TypeExpr)]
+ Curry.FlatCurry.Typed.Goodies: allVarsInTProg :: TProg -> [(VarIndex, TypeExpr)]
+ Curry.FlatCurry.Typed.Goodies: allVarsInTRule :: TRule -> [(VarIndex, TypeExpr)]
+ Curry.FlatCurry.Typed.Goodies: allVarsInTypeExpr :: TypeExpr -> [TVarIndex]
+ Curry.FlatCurry.Typed.Goodies: argTypes :: TypeExpr -> [TypeExpr]
+ Curry.FlatCurry.Typed.Goodies: caseBranches :: TExpr -> [TBranchExpr]
+ Curry.FlatCurry.Typed.Goodies: caseExpr :: TExpr -> TExpr
+ Curry.FlatCurry.Typed.Goodies: caseType :: TExpr -> CaseType
+ Curry.FlatCurry.Typed.Goodies: combArgs :: TExpr -> [TExpr]
+ Curry.FlatCurry.Typed.Goodies: combName :: TExpr -> QName
+ Curry.FlatCurry.Typed.Goodies: combType :: TExpr -> CombType
+ Curry.FlatCurry.Typed.Goodies: consArgs :: ConsDecl -> [TypeExpr]
+ Curry.FlatCurry.Typed.Goodies: consArity :: ConsDecl -> Int
+ Curry.FlatCurry.Typed.Goodies: consName :: ConsDecl -> QName
+ Curry.FlatCurry.Typed.Goodies: consVisibility :: ConsDecl -> Visibility
+ Curry.FlatCurry.Typed.Goodies: domain :: TypeExpr -> TypeExpr
+ Curry.FlatCurry.Typed.Goodies: freeExpr :: TExpr -> TExpr
+ Curry.FlatCurry.Typed.Goodies: freeVars :: TExpr -> [(VarIndex, TypeExpr)]
+ Curry.FlatCurry.Typed.Goodies: isCombTypeConsCall :: CombType -> Bool
+ Curry.FlatCurry.Typed.Goodies: isCombTypeConsPartCall :: CombType -> Bool
+ Curry.FlatCurry.Typed.Goodies: isCombTypeFuncCall :: CombType -> Bool
+ Curry.FlatCurry.Typed.Goodies: isCombTypeFuncPartCall :: CombType -> Bool
+ Curry.FlatCurry.Typed.Goodies: isConsCall :: TExpr -> Bool
+ Curry.FlatCurry.Typed.Goodies: isConsPartCall :: TExpr -> Bool
+ Curry.FlatCurry.Typed.Goodies: isConsPattern :: TPattern -> Bool
+ Curry.FlatCurry.Typed.Goodies: isDataTypeDecl :: TypeDecl -> Bool
+ Curry.FlatCurry.Typed.Goodies: isExternal :: TFuncDecl -> Bool
+ Curry.FlatCurry.Typed.Goodies: isExternalType :: TypeDecl -> Bool
+ Curry.FlatCurry.Typed.Goodies: isFuncCall :: TExpr -> Bool
+ Curry.FlatCurry.Typed.Goodies: isFuncPartCall :: TExpr -> Bool
+ Curry.FlatCurry.Typed.Goodies: isFuncType :: TypeExpr -> Bool
+ Curry.FlatCurry.Typed.Goodies: isGround :: TExpr -> Bool
+ Curry.FlatCurry.Typed.Goodies: isPublic :: Visibility -> Bool
+ Curry.FlatCurry.Typed.Goodies: isPublicCons :: ConsDecl -> Bool
+ Curry.FlatCurry.Typed.Goodies: isPublicTFunc :: TFuncDecl -> Bool
+ Curry.FlatCurry.Typed.Goodies: isPublicType :: TypeDecl -> Bool
+ Curry.FlatCurry.Typed.Goodies: isTCase :: TExpr -> Bool
+ Curry.FlatCurry.Typed.Goodies: isTComb :: TExpr -> Bool
+ Curry.FlatCurry.Typed.Goodies: isTCons :: TypeExpr -> Bool
+ Curry.FlatCurry.Typed.Goodies: isTFree :: TExpr -> Bool
+ Curry.FlatCurry.Typed.Goodies: isTLet :: TExpr -> Bool
+ Curry.FlatCurry.Typed.Goodies: isTLit :: TExpr -> Bool
+ Curry.FlatCurry.Typed.Goodies: isTOr :: TExpr -> Bool
+ Curry.FlatCurry.Typed.Goodies: isTRuleExternal :: TRule -> Bool
+ Curry.FlatCurry.Typed.Goodies: isTVar :: TypeExpr -> Bool
+ Curry.FlatCurry.Typed.Goodies: isTVarE :: TExpr -> Bool
+ Curry.FlatCurry.Typed.Goodies: isTypeSyn :: TypeDecl -> Bool
+ Curry.FlatCurry.Typed.Goodies: letBinds :: TExpr -> [((VarIndex, TypeExpr), TExpr)]
+ Curry.FlatCurry.Typed.Goodies: letBody :: TExpr -> TExpr
+ Curry.FlatCurry.Typed.Goodies: literal :: TExpr -> Literal
+ Curry.FlatCurry.Typed.Goodies: missingCombArgs :: TExpr -> Int
+ Curry.FlatCurry.Typed.Goodies: opFixity :: OpDecl -> Fixity
+ Curry.FlatCurry.Typed.Goodies: opName :: OpDecl -> QName
+ Curry.FlatCurry.Typed.Goodies: opPrecedence :: OpDecl -> Integer
+ Curry.FlatCurry.Typed.Goodies: orExps :: TExpr -> [TExpr]
+ Curry.FlatCurry.Typed.Goodies: range :: TypeExpr -> TypeExpr
+ Curry.FlatCurry.Typed.Goodies: resultType :: TypeExpr -> TypeExpr
+ Curry.FlatCurry.Typed.Goodies: rnmAllVars :: Update TExpr VarIndex
+ Curry.FlatCurry.Typed.Goodies: rnmAllVarsInTFunc :: Update TFuncDecl VarIndex
+ Curry.FlatCurry.Typed.Goodies: rnmAllVarsInTProg :: Update TProg VarIndex
+ Curry.FlatCurry.Typed.Goodies: rnmAllVarsInTRule :: Update TRule VarIndex
+ Curry.FlatCurry.Typed.Goodies: rnmAllVarsInTypeExpr :: (TVarIndex -> TVarIndex) -> TypeExpr -> TypeExpr
+ Curry.FlatCurry.Typed.Goodies: rnmTProg :: String -> TProg -> TProg
+ Curry.FlatCurry.Typed.Goodies: tBranchTExpr :: TBranchExpr -> TExpr
+ Curry.FlatCurry.Typed.Goodies: tBranchTPattern :: TBranchExpr -> TPattern
+ Curry.FlatCurry.Typed.Goodies: tConsArgs :: TypeExpr -> [TypeExpr]
+ Curry.FlatCurry.Typed.Goodies: tConsName :: TypeExpr -> QName
+ Curry.FlatCurry.Typed.Goodies: tFuncArgs :: TFuncDecl -> [(VarIndex, TypeExpr)]
+ Curry.FlatCurry.Typed.Goodies: tFuncArity :: TFuncDecl -> Int
+ Curry.FlatCurry.Typed.Goodies: tFuncBody :: TFuncDecl -> TExpr
+ Curry.FlatCurry.Typed.Goodies: tFuncName :: TFuncDecl -> QName
+ Curry.FlatCurry.Typed.Goodies: tFuncRHS :: TFuncDecl -> [TExpr]
+ Curry.FlatCurry.Typed.Goodies: tFuncTRule :: TFuncDecl -> TRule
+ Curry.FlatCurry.Typed.Goodies: tFuncType :: TFuncDecl -> TypeExpr
+ Curry.FlatCurry.Typed.Goodies: tFuncVisibility :: TFuncDecl -> Visibility
+ Curry.FlatCurry.Typed.Goodies: tPatArgs :: TPattern -> [(VarIndex, TypeExpr)]
+ Curry.FlatCurry.Typed.Goodies: tPatCons :: TPattern -> QName
+ Curry.FlatCurry.Typed.Goodies: tPatExpr :: TPattern -> TExpr
+ Curry.FlatCurry.Typed.Goodies: tPatLiteral :: TPattern -> Literal
+ Curry.FlatCurry.Typed.Goodies: tProgImports :: TProg -> [String]
+ Curry.FlatCurry.Typed.Goodies: tProgName :: TProg -> String
+ Curry.FlatCurry.Typed.Goodies: tProgOps :: TProg -> [OpDecl]
+ Curry.FlatCurry.Typed.Goodies: tProgTFuncs :: TProg -> [TFuncDecl]
+ Curry.FlatCurry.Typed.Goodies: tProgTypes :: TProg -> [TypeDecl]
+ Curry.FlatCurry.Typed.Goodies: tRuleArgs :: TRule -> [(VarIndex, TypeExpr)]
+ Curry.FlatCurry.Typed.Goodies: tRuleBody :: TRule -> TExpr
+ Curry.FlatCurry.Typed.Goodies: tRuleExtDecl :: TRule -> String
+ Curry.FlatCurry.Typed.Goodies: tVarIndex :: TypeExpr -> TVarIndex
+ Curry.FlatCurry.Typed.Goodies: trCombType :: a -> (Int -> a) -> a -> (Int -> a) -> CombType -> a
+ Curry.FlatCurry.Typed.Goodies: trCons :: (QName -> Int -> Visibility -> [TypeExpr] -> a) -> ConsDecl -> a
+ Curry.FlatCurry.Typed.Goodies: trOp :: (QName -> Fixity -> Integer -> a) -> OpDecl -> a
+ Curry.FlatCurry.Typed.Goodies: trTBranch :: (TPattern -> TExpr -> b) -> TBranchExpr -> b
+ Curry.FlatCurry.Typed.Goodies: trTExpr :: (TypeExpr -> VarIndex -> b) -> (TypeExpr -> Literal -> b) -> (TypeExpr -> CombType -> QName -> [b] -> b) -> ([((VarIndex, TypeExpr), b)] -> b -> b) -> ([(VarIndex, TypeExpr)] -> b -> b) -> (b -> b -> b) -> (CaseType -> b -> [c] -> b) -> (TPattern -> b -> c) -> (b -> TypeExpr -> b) -> TExpr -> b
+ Curry.FlatCurry.Typed.Goodies: trTFunc :: (QName -> Int -> Visibility -> TypeExpr -> TRule -> b) -> TFuncDecl -> b
+ Curry.FlatCurry.Typed.Goodies: trTPattern :: (TypeExpr -> QName -> [(VarIndex, TypeExpr)] -> b) -> (TypeExpr -> Literal -> b) -> TPattern -> b
+ Curry.FlatCurry.Typed.Goodies: trTProg :: (String -> [String] -> [TypeDecl] -> [TFuncDecl] -> [OpDecl] -> b) -> TProg -> b
+ Curry.FlatCurry.Typed.Goodies: trTRule :: ([(VarIndex, TypeExpr)] -> TExpr -> b) -> (TypeExpr -> String -> b) -> TRule -> b
+ Curry.FlatCurry.Typed.Goodies: trType :: (QName -> Visibility -> [TVarIndex] -> [ConsDecl] -> a) -> (QName -> Visibility -> [TVarIndex] -> TypeExpr -> a) -> TypeDecl -> a
+ Curry.FlatCurry.Typed.Goodies: trTypeExpr :: (TVarIndex -> a) -> (QName -> [a] -> a) -> (a -> a -> a) -> ([TVarIndex] -> a -> a) -> TypeExpr -> a
+ Curry.FlatCurry.Typed.Goodies: type Update a b = (b -> b) -> a -> a
+ Curry.FlatCurry.Typed.Goodies: typeArity :: TypeExpr -> Int
+ Curry.FlatCurry.Typed.Goodies: typeConsDecls :: TypeDecl -> [ConsDecl]
+ Curry.FlatCurry.Typed.Goodies: typeName :: TypeDecl -> QName
+ Curry.FlatCurry.Typed.Goodies: typeParams :: TypeDecl -> [TVarIndex]
+ Curry.FlatCurry.Typed.Goodies: typeSyn :: TypeDecl -> TypeExpr
+ Curry.FlatCurry.Typed.Goodies: typeVisibility :: TypeDecl -> Visibility
+ Curry.FlatCurry.Typed.Goodies: updBranches :: (TPattern -> TExpr -> TBranchExpr) -> TExpr -> TExpr
+ Curry.FlatCurry.Typed.Goodies: updCases :: (CaseType -> TExpr -> [TBranchExpr] -> TExpr) -> TExpr -> TExpr
+ Curry.FlatCurry.Typed.Goodies: updCombs :: (TypeExpr -> CombType -> QName -> [TExpr] -> TExpr) -> TExpr -> TExpr
+ Curry.FlatCurry.Typed.Goodies: updCons :: (QName -> QName) -> (Int -> Int) -> (Visibility -> Visibility) -> ([TypeExpr] -> [TypeExpr]) -> ConsDecl -> ConsDecl
+ Curry.FlatCurry.Typed.Goodies: updConsArgs :: Update ConsDecl [TypeExpr]
+ Curry.FlatCurry.Typed.Goodies: updConsArity :: Update ConsDecl Int
+ Curry.FlatCurry.Typed.Goodies: updConsName :: Update ConsDecl QName
+ Curry.FlatCurry.Typed.Goodies: updConsVisibility :: Update ConsDecl Visibility
+ Curry.FlatCurry.Typed.Goodies: updFrees :: ([(VarIndex, TypeExpr)] -> TExpr -> TExpr) -> TExpr -> TExpr
+ Curry.FlatCurry.Typed.Goodies: updFuncType :: Update TFuncDecl TypeExpr
+ Curry.FlatCurry.Typed.Goodies: updFuncTypes :: (TypeExpr -> TypeExpr -> TypeExpr) -> TypeExpr -> TypeExpr
+ Curry.FlatCurry.Typed.Goodies: updLets :: ([((VarIndex, TypeExpr), TExpr)] -> TExpr -> TExpr) -> TExpr -> TExpr
+ Curry.FlatCurry.Typed.Goodies: updLiterals :: (TypeExpr -> Literal -> TExpr) -> TExpr -> TExpr
+ Curry.FlatCurry.Typed.Goodies: updOp :: (QName -> QName) -> (Fixity -> Fixity) -> (Integer -> Integer) -> OpDecl -> OpDecl
+ Curry.FlatCurry.Typed.Goodies: updOpFixity :: Update OpDecl Fixity
+ Curry.FlatCurry.Typed.Goodies: updOpName :: Update OpDecl QName
+ Curry.FlatCurry.Typed.Goodies: updOpPrecedence :: Update OpDecl Integer
+ Curry.FlatCurry.Typed.Goodies: updOrs :: (TExpr -> TExpr -> TExpr) -> TExpr -> TExpr
+ Curry.FlatCurry.Typed.Goodies: updQNames :: Update TExpr QName
+ Curry.FlatCurry.Typed.Goodies: updQNamesInConsDecl :: Update ConsDecl QName
+ Curry.FlatCurry.Typed.Goodies: updQNamesInTFunc :: Update TFuncDecl QName
+ Curry.FlatCurry.Typed.Goodies: updQNamesInTProg :: Update TProg QName
+ Curry.FlatCurry.Typed.Goodies: updQNamesInTRule :: Update TRule QName
+ Curry.FlatCurry.Typed.Goodies: updQNamesInType :: Update TypeDecl QName
+ Curry.FlatCurry.Typed.Goodies: updQNamesInTypeExpr :: (QName -> QName) -> TypeExpr -> TypeExpr
+ Curry.FlatCurry.Typed.Goodies: updTBranch :: (TPattern -> TPattern) -> (TExpr -> TExpr) -> TBranchExpr -> TBranchExpr
+ Curry.FlatCurry.Typed.Goodies: updTBranchTExpr :: Update TBranchExpr TExpr
+ Curry.FlatCurry.Typed.Goodies: updTBranchTPattern :: Update TBranchExpr TPattern
+ Curry.FlatCurry.Typed.Goodies: updTCons :: (QName -> [TypeExpr] -> TypeExpr) -> TypeExpr -> TypeExpr
+ Curry.FlatCurry.Typed.Goodies: updTFunc :: (QName -> QName) -> (Int -> Int) -> (Visibility -> Visibility) -> (TypeExpr -> TypeExpr) -> (TRule -> TRule) -> TFuncDecl -> TFuncDecl
+ Curry.FlatCurry.Typed.Goodies: updTFuncArgs :: Update TFuncDecl [(VarIndex, TypeExpr)]
+ Curry.FlatCurry.Typed.Goodies: updTFuncArity :: Update TFuncDecl Int
+ Curry.FlatCurry.Typed.Goodies: updTFuncBody :: Update TFuncDecl TExpr
+ Curry.FlatCurry.Typed.Goodies: updTFuncName :: Update TFuncDecl QName
+ Curry.FlatCurry.Typed.Goodies: updTFuncTRule :: Update TFuncDecl TRule
+ Curry.FlatCurry.Typed.Goodies: updTFuncVisibility :: Update TFuncDecl Visibility
+ Curry.FlatCurry.Typed.Goodies: updTPatArgs :: ([(VarIndex, TypeExpr)] -> [(VarIndex, TypeExpr)]) -> TPattern -> TPattern
+ Curry.FlatCurry.Typed.Goodies: updTPatCons :: (QName -> QName) -> TPattern -> TPattern
+ Curry.FlatCurry.Typed.Goodies: updTPatLiteral :: (Literal -> Literal) -> TPattern -> TPattern
+ Curry.FlatCurry.Typed.Goodies: updTPatType :: (TypeExpr -> TypeExpr) -> TPattern -> TPattern
+ Curry.FlatCurry.Typed.Goodies: updTPattern :: (TypeExpr -> TypeExpr) -> (QName -> QName) -> ([(VarIndex, TypeExpr)] -> [(VarIndex, TypeExpr)]) -> (Literal -> Literal) -> TPattern -> TPattern
+ Curry.FlatCurry.Typed.Goodies: updTProg :: (String -> String) -> ([String] -> [String]) -> ([TypeDecl] -> [TypeDecl]) -> ([TFuncDecl] -> [TFuncDecl]) -> ([OpDecl] -> [OpDecl]) -> TProg -> TProg
+ Curry.FlatCurry.Typed.Goodies: updTProgImports :: Update TProg [String]
+ Curry.FlatCurry.Typed.Goodies: updTProgName :: Update TProg String
+ Curry.FlatCurry.Typed.Goodies: updTProgOps :: Update TProg [OpDecl]
+ Curry.FlatCurry.Typed.Goodies: updTProgTExps :: Update TProg TExpr
+ Curry.FlatCurry.Typed.Goodies: updTProgTFuncs :: Update TProg [TFuncDecl]
+ Curry.FlatCurry.Typed.Goodies: updTProgTypes :: Update TProg [TypeDecl]
+ Curry.FlatCurry.Typed.Goodies: updTRule :: (TypeExpr -> TypeExpr) -> ([(VarIndex, TypeExpr)] -> [(VarIndex, TypeExpr)]) -> (TExpr -> TExpr) -> (String -> String) -> TRule -> TRule
+ Curry.FlatCurry.Typed.Goodies: updTRuleArgs :: Update TRule [(VarIndex, TypeExpr)]
+ Curry.FlatCurry.Typed.Goodies: updTRuleBody :: Update TRule TExpr
+ Curry.FlatCurry.Typed.Goodies: updTRuleExtDecl :: Update TRule String
+ Curry.FlatCurry.Typed.Goodies: updTRuleType :: Update TRule TypeExpr
+ Curry.FlatCurry.Typed.Goodies: updTVars :: (TVarIndex -> TypeExpr) -> TypeExpr -> TypeExpr
+ Curry.FlatCurry.Typed.Goodies: updType :: (QName -> QName) -> (Visibility -> Visibility) -> ([TVarIndex] -> [TVarIndex]) -> ([ConsDecl] -> [ConsDecl]) -> (TypeExpr -> TypeExpr) -> TypeDecl -> TypeDecl
+ Curry.FlatCurry.Typed.Goodies: updTypeConsDecls :: Update TypeDecl [ConsDecl]
+ Curry.FlatCurry.Typed.Goodies: updTypeName :: Update TypeDecl QName
+ Curry.FlatCurry.Typed.Goodies: updTypeParams :: Update TypeDecl [TVarIndex]
+ Curry.FlatCurry.Typed.Goodies: updTypeSynonym :: Update TypeDecl TypeExpr
+ Curry.FlatCurry.Typed.Goodies: updTypeVisibility :: Update TypeDecl Visibility
+ Curry.FlatCurry.Typed.Goodies: updTypeds :: (TExpr -> TypeExpr -> TExpr) -> TExpr -> TExpr
+ Curry.FlatCurry.Typed.Goodies: updVars :: (TypeExpr -> VarIndex -> TExpr) -> TExpr -> TExpr
+ Curry.FlatCurry.Typed.Goodies: varNr :: TExpr -> VarIndex
+ Curry.FlatCurry.Typed.Type: Charc :: Char -> Literal
+ Curry.FlatCurry.Typed.Type: Cons :: QName -> Int -> Visibility -> [TypeExpr] -> ConsDecl
+ Curry.FlatCurry.Typed.Type: ConsCall :: CombType
+ Curry.FlatCurry.Typed.Type: ConsPartCall :: Int -> CombType
+ Curry.FlatCurry.Typed.Type: Flex :: CaseType
+ Curry.FlatCurry.Typed.Type: Floatc :: Double -> Literal
+ Curry.FlatCurry.Typed.Type: ForallType :: [TVarIndex] -> TypeExpr -> TypeExpr
+ Curry.FlatCurry.Typed.Type: FuncCall :: CombType
+ Curry.FlatCurry.Typed.Type: FuncPartCall :: Int -> CombType
+ Curry.FlatCurry.Typed.Type: FuncType :: TypeExpr -> TypeExpr -> TypeExpr
+ Curry.FlatCurry.Typed.Type: InfixOp :: Fixity
+ Curry.FlatCurry.Typed.Type: InfixlOp :: Fixity
+ Curry.FlatCurry.Typed.Type: InfixrOp :: Fixity
+ Curry.FlatCurry.Typed.Type: Intc :: Integer -> Literal
+ Curry.FlatCurry.Typed.Type: Op :: QName -> Fixity -> Integer -> OpDecl
+ Curry.FlatCurry.Typed.Type: Private :: Visibility
+ Curry.FlatCurry.Typed.Type: Public :: Visibility
+ Curry.FlatCurry.Typed.Type: Rigid :: CaseType
+ Curry.FlatCurry.Typed.Type: TBranch :: TPattern -> TExpr -> TBranchExpr
+ Curry.FlatCurry.Typed.Type: TCase :: CaseType -> TExpr -> [TBranchExpr] -> TExpr
+ Curry.FlatCurry.Typed.Type: TComb :: TypeExpr -> CombType -> QName -> [TExpr] -> TExpr
+ Curry.FlatCurry.Typed.Type: TCons :: QName -> [TypeExpr] -> TypeExpr
+ Curry.FlatCurry.Typed.Type: TExternal :: TypeExpr -> String -> TRule
+ Curry.FlatCurry.Typed.Type: TFree :: [(VarIndex, TypeExpr)] -> TExpr -> TExpr
+ Curry.FlatCurry.Typed.Type: TFunc :: QName -> Int -> Visibility -> TypeExpr -> TRule -> TFuncDecl
+ Curry.FlatCurry.Typed.Type: TLPattern :: TypeExpr -> Literal -> TPattern
+ Curry.FlatCurry.Typed.Type: TLet :: [((VarIndex, TypeExpr), TExpr)] -> TExpr -> TExpr
+ Curry.FlatCurry.Typed.Type: TLit :: TypeExpr -> Literal -> TExpr
+ Curry.FlatCurry.Typed.Type: TOr :: TExpr -> TExpr -> TExpr
+ Curry.FlatCurry.Typed.Type: TPattern :: TypeExpr -> QName -> [(VarIndex, TypeExpr)] -> TPattern
+ Curry.FlatCurry.Typed.Type: TProg :: String -> [String] -> [TypeDecl] -> [TFuncDecl] -> [OpDecl] -> TProg
+ Curry.FlatCurry.Typed.Type: TRule :: [(VarIndex, TypeExpr)] -> TExpr -> TRule
+ Curry.FlatCurry.Typed.Type: TTyped :: TExpr -> TypeExpr -> TExpr
+ Curry.FlatCurry.Typed.Type: TVar :: TVarIndex -> TypeExpr
+ Curry.FlatCurry.Typed.Type: TVarE :: TypeExpr -> VarIndex -> TExpr
+ Curry.FlatCurry.Typed.Type: Type :: QName -> Visibility -> [TVarIndex] -> [ConsDecl] -> TypeDecl
+ Curry.FlatCurry.Typed.Type: TypeSyn :: QName -> Visibility -> [TVarIndex] -> TypeExpr -> TypeDecl
+ Curry.FlatCurry.Typed.Type: data CaseType
+ Curry.FlatCurry.Typed.Type: data CombType
+ Curry.FlatCurry.Typed.Type: data ConsDecl
+ Curry.FlatCurry.Typed.Type: data Fixity
+ Curry.FlatCurry.Typed.Type: data Literal
+ Curry.FlatCurry.Typed.Type: data OpDecl
+ Curry.FlatCurry.Typed.Type: data TBranchExpr
+ Curry.FlatCurry.Typed.Type: data TExpr
+ Curry.FlatCurry.Typed.Type: data TFuncDecl
+ Curry.FlatCurry.Typed.Type: data TPattern
+ Curry.FlatCurry.Typed.Type: data TProg
+ Curry.FlatCurry.Typed.Type: data TRule
+ Curry.FlatCurry.Typed.Type: data TypeDecl
+ Curry.FlatCurry.Typed.Type: data TypeExpr
+ Curry.FlatCurry.Typed.Type: data Visibility
+ Curry.FlatCurry.Typed.Type: instance Curry.FlatCurry.Typeable.Typeable Curry.FlatCurry.Typed.Type.TBranchExpr
+ Curry.FlatCurry.Typed.Type: instance Curry.FlatCurry.Typeable.Typeable Curry.FlatCurry.Typed.Type.TExpr
+ Curry.FlatCurry.Typed.Type: instance Curry.FlatCurry.Typeable.Typeable Curry.FlatCurry.Typed.Type.TPattern
+ Curry.FlatCurry.Typed.Type: instance Curry.FlatCurry.Typeable.Typeable Curry.FlatCurry.Typed.Type.TRule
+ Curry.FlatCurry.Typed.Type: instance GHC.Classes.Eq Curry.FlatCurry.Typed.Type.TBranchExpr
+ Curry.FlatCurry.Typed.Type: instance GHC.Classes.Eq Curry.FlatCurry.Typed.Type.TExpr
+ Curry.FlatCurry.Typed.Type: instance GHC.Classes.Eq Curry.FlatCurry.Typed.Type.TFuncDecl
+ Curry.FlatCurry.Typed.Type: instance GHC.Classes.Eq Curry.FlatCurry.Typed.Type.TPattern
+ Curry.FlatCurry.Typed.Type: instance GHC.Classes.Eq Curry.FlatCurry.Typed.Type.TProg
+ Curry.FlatCurry.Typed.Type: instance GHC.Classes.Eq Curry.FlatCurry.Typed.Type.TRule
+ Curry.FlatCurry.Typed.Type: instance GHC.Read.Read Curry.FlatCurry.Typed.Type.TBranchExpr
+ Curry.FlatCurry.Typed.Type: instance GHC.Read.Read Curry.FlatCurry.Typed.Type.TExpr
+ Curry.FlatCurry.Typed.Type: instance GHC.Read.Read Curry.FlatCurry.Typed.Type.TFuncDecl
+ Curry.FlatCurry.Typed.Type: instance GHC.Read.Read Curry.FlatCurry.Typed.Type.TPattern
+ Curry.FlatCurry.Typed.Type: instance GHC.Read.Read Curry.FlatCurry.Typed.Type.TProg
+ Curry.FlatCurry.Typed.Type: instance GHC.Read.Read Curry.FlatCurry.Typed.Type.TRule
+ Curry.FlatCurry.Typed.Type: instance GHC.Show.Show Curry.FlatCurry.Typed.Type.TBranchExpr
+ Curry.FlatCurry.Typed.Type: instance GHC.Show.Show Curry.FlatCurry.Typed.Type.TExpr
+ Curry.FlatCurry.Typed.Type: instance GHC.Show.Show Curry.FlatCurry.Typed.Type.TFuncDecl
+ Curry.FlatCurry.Typed.Type: instance GHC.Show.Show Curry.FlatCurry.Typed.Type.TPattern
+ Curry.FlatCurry.Typed.Type: instance GHC.Show.Show Curry.FlatCurry.Typed.Type.TProg
+ Curry.FlatCurry.Typed.Type: instance GHC.Show.Show Curry.FlatCurry.Typed.Type.TRule
+ Curry.FlatCurry.Typed.Type: type QName = (String, String)
+ Curry.FlatCurry.Typed.Type: type TVarIndex = Int
+ Curry.FlatCurry.Typed.Type: type VarIndex = Int
+ Curry.Syntax.InterfaceEquivalence: instance Curry.Syntax.InterfaceEquivalence.Equiv a => Curry.Syntax.InterfaceEquivalence.Equiv (GHC.Maybe.Maybe a)
+ Curry.Syntax.InterfaceEquivalence: instance Curry.Syntax.InterfaceEquivalence.FixInterface a => Curry.Syntax.InterfaceEquivalence.FixInterface (GHC.Maybe.Maybe a)
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition (Curry.Syntax.Type.Alt a)
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition (Curry.Syntax.Type.CondExpr a)
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition (Curry.Syntax.Type.Decl a)
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition (Curry.Syntax.Type.Equation a)
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition (Curry.Syntax.Type.Expression a)
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition (Curry.Syntax.Type.Field a)
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition (Curry.Syntax.Type.Goal a)
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition (Curry.Syntax.Type.InfixOp a)
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition (Curry.Syntax.Type.Lhs a)
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition (Curry.Syntax.Type.Module a)
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition (Curry.Syntax.Type.Pattern a)
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition (Curry.Syntax.Type.Rhs a)
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition (Curry.Syntax.Type.Statement a)
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition Curry.Syntax.Type.ConstrDecl
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition Curry.Syntax.Type.Constraint
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition Curry.Syntax.Type.Export
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition Curry.Syntax.Type.ExportSpec
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition Curry.Syntax.Type.FieldDecl
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition Curry.Syntax.Type.Import
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition Curry.Syntax.Type.ImportDecl
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition Curry.Syntax.Type.ImportSpec
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition Curry.Syntax.Type.ModulePragma
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition Curry.Syntax.Type.NewConstrDecl
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition Curry.Syntax.Type.QualTypeExpr
+ Curry.Syntax.Type: instance Curry.Base.Position.HasPosition Curry.Syntax.Type.TypeExpr
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo (Curry.Syntax.Type.Alt a)
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo (Curry.Syntax.Type.CondExpr a)
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo (Curry.Syntax.Type.Decl a)
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo (Curry.Syntax.Type.Equation a)
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo (Curry.Syntax.Type.Expression a)
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo (Curry.Syntax.Type.Field a)
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo (Curry.Syntax.Type.Goal a)
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo (Curry.Syntax.Type.Lhs a)
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo (Curry.Syntax.Type.Module a)
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo (Curry.Syntax.Type.Pattern a)
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo (Curry.Syntax.Type.Rhs a)
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo (Curry.Syntax.Type.Statement a)
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Syntax.Type.ConstrDecl
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Syntax.Type.Constraint
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Syntax.Type.Export
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Syntax.Type.ExportSpec
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Syntax.Type.FieldDecl
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Syntax.Type.Import
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Syntax.Type.ImportDecl
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Syntax.Type.ImportSpec
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Syntax.Type.ModulePragma
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Syntax.Type.NewConstrDecl
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Syntax.Type.QualTypeExpr
+ Curry.Syntax.Type: instance Curry.Base.SpanInfo.HasSpanInfo Curry.Syntax.Type.TypeExpr
+ Curry.Syntax.Utils: instance Curry.Syntax.Utils.ShortenAST (Curry.Syntax.Type.Decl a)
+ Curry.Syntax.Utils: instance Curry.Syntax.Utils.ShortenAST (Curry.Syntax.Type.Module a)
+ Curry.Syntax.Utils: shortenModuleAST :: Module () -> Module ()
- Curry.AbstractCurry.Type: CurryProg :: MName -> [MName] -> (Maybe CDefaultDecl) -> [CClassDecl] -> [CInstanceDecl] -> [CTypeDecl] -> [CFuncDecl] -> [COpDecl] -> CurryProg
+ Curry.AbstractCurry.Type: CurryProg :: MName -> [MName] -> Maybe CDefaultDecl -> [CClassDecl] -> [CInstanceDecl] -> [CTypeDecl] -> [CFuncDecl] -> [COpDecl] -> CurryProg
- Curry.Base.Ident: Ident :: Position -> String -> Integer -> Ident
+ Curry.Base.Ident: Ident :: SpanInfo -> String -> Integer -> Ident
- Curry.Base.Ident: ModuleIdent :: Position -> [String] -> ModuleIdent
+ Curry.Base.Ident: ModuleIdent :: SpanInfo -> [String] -> ModuleIdent
- Curry.Base.Ident: QualIdent :: Maybe ModuleIdent -> Ident -> QualIdent
+ Curry.Base.Ident: QualIdent :: SpanInfo -> Maybe ModuleIdent -> Ident -> QualIdent
- Curry.Base.LLParseComb: (<*>) :: Applicative f => forall a b. () => f (a -> b) -> f a -> f b
+ Curry.Base.LLParseComb: (<*>) :: Applicative f => f (a -> b) -> f a -> f b
- Curry.Base.LexComb: type P a = Span Current source code span -> String 'String' to be parsed -> Bool Flag whether the beginning of a line should be parsed, which requires layout checking -> Context context as a stack of 'Indent's -> CYM a
+ Curry.Base.LexComb: type P a = Span " Current source code span" -> String " 'String' to be parsed" -> Bool " Flag whether the beginning of a line should be parsed, which requires layout checking" -> Context " context as a stack of 'Indent's" -> CYM a
- Curry.CondCompile.Type: Else :: (Maybe [Stmt]) -> Else
+ Curry.CondCompile.Type: Else :: Maybe [Stmt] -> Else
- Curry.FlatCurry.Annotated.Type: ABranch :: (APattern a) -> (AExpr a) -> ABranchExpr a
+ Curry.FlatCurry.Annotated.Type: ABranch :: APattern a -> AExpr a -> ABranchExpr a
- Curry.FlatCurry.Annotated.Type: ACase :: a -> CaseType -> (AExpr a) -> [ABranchExpr a] -> AExpr a
+ Curry.FlatCurry.Annotated.Type: ACase :: a -> CaseType -> AExpr a -> [ABranchExpr a] -> AExpr a
- Curry.FlatCurry.Annotated.Type: AFree :: a -> [(VarIndex, a)] -> (AExpr a) -> AExpr a
+ Curry.FlatCurry.Annotated.Type: AFree :: a -> [(VarIndex, a)] -> AExpr a -> AExpr a
- Curry.FlatCurry.Annotated.Type: AFunc :: QName -> Int -> Visibility -> TypeExpr -> (ARule a) -> AFuncDecl a
+ Curry.FlatCurry.Annotated.Type: AFunc :: QName -> Int -> Visibility -> TypeExpr -> ARule a -> AFuncDecl a
- Curry.FlatCurry.Annotated.Type: ALet :: a -> [((VarIndex, a), AExpr a)] -> (AExpr a) -> AExpr a
+ Curry.FlatCurry.Annotated.Type: ALet :: a -> [((VarIndex, a), AExpr a)] -> AExpr a -> AExpr a
- Curry.FlatCurry.Annotated.Type: AOr :: a -> (AExpr a) -> (AExpr a) -> AExpr a
+ Curry.FlatCurry.Annotated.Type: AOr :: a -> AExpr a -> AExpr a -> AExpr a
- Curry.FlatCurry.Annotated.Type: ARule :: a -> [(VarIndex, a)] -> (AExpr a) -> ARule a
+ Curry.FlatCurry.Annotated.Type: ARule :: a -> [(VarIndex, a)] -> AExpr a -> ARule a
- Curry.FlatCurry.Annotated.Type: ATyped :: a -> (AExpr a) -> TypeExpr -> AExpr a
+ Curry.FlatCurry.Annotated.Type: ATyped :: a -> AExpr a -> TypeExpr -> AExpr a
- Curry.Syntax.Type: Alt :: Position -> (Pattern a) -> (Rhs a) -> Alt a
+ Curry.Syntax.Type: Alt :: SpanInfo -> Pattern a -> Rhs a -> Alt a
- Curry.Syntax.Type: ApLhs :: (Lhs a) -> [Pattern a] -> Lhs a
+ Curry.Syntax.Type: ApLhs :: SpanInfo -> Lhs a -> [Pattern a] -> Lhs a
- Curry.Syntax.Type: Apply :: (Expression a) -> (Expression a) -> Expression a
+ Curry.Syntax.Type: Apply :: SpanInfo -> Expression a -> Expression a -> Expression a
- Curry.Syntax.Type: ApplyType :: TypeExpr -> TypeExpr -> TypeExpr
+ Curry.Syntax.Type: ApplyType :: SpanInfo -> TypeExpr -> TypeExpr -> TypeExpr
- Curry.Syntax.Type: ArrowType :: TypeExpr -> TypeExpr -> TypeExpr
+ Curry.Syntax.Type: ArrowType :: SpanInfo -> TypeExpr -> TypeExpr -> TypeExpr
- Curry.Syntax.Type: AsPattern :: Ident -> (Pattern a) -> Pattern a
+ Curry.Syntax.Type: AsPattern :: SpanInfo -> Ident -> Pattern a -> Pattern a
- Curry.Syntax.Type: Case :: CaseType -> (Expression a) -> [Alt a] -> Expression a
+ Curry.Syntax.Type: Case :: SpanInfo -> CaseType -> Expression a -> [Alt a] -> Expression a
- Curry.Syntax.Type: ClassDecl :: Position -> Context -> Ident -> Ident -> [Decl a] -> Decl a
+ Curry.Syntax.Type: ClassDecl :: SpanInfo -> Context -> Ident -> Ident -> [Decl a] -> Decl a
- Curry.Syntax.Type: ConOpDecl :: Position -> [Ident] -> Context -> TypeExpr -> Ident -> TypeExpr -> ConstrDecl
+ Curry.Syntax.Type: ConOpDecl :: SpanInfo -> [Ident] -> Context -> TypeExpr -> Ident -> TypeExpr -> ConstrDecl
- Curry.Syntax.Type: CondExpr :: Position -> (Expression a) -> (Expression a) -> CondExpr a
+ Curry.Syntax.Type: CondExpr :: SpanInfo -> Expression a -> Expression a -> CondExpr a
- Curry.Syntax.Type: ConstrDecl :: Position -> [Ident] -> Context -> Ident -> [TypeExpr] -> ConstrDecl
+ Curry.Syntax.Type: ConstrDecl :: SpanInfo -> [Ident] -> Context -> Ident -> [TypeExpr] -> ConstrDecl
- Curry.Syntax.Type: Constraint :: QualIdent -> TypeExpr -> Constraint
+ Curry.Syntax.Type: Constraint :: SpanInfo -> QualIdent -> TypeExpr -> Constraint
- Curry.Syntax.Type: Constructor :: a -> QualIdent -> Expression a
+ Curry.Syntax.Type: Constructor :: SpanInfo -> a -> QualIdent -> Expression a
- Curry.Syntax.Type: ConstructorPattern :: a -> QualIdent -> [Pattern a] -> Pattern a
+ Curry.Syntax.Type: ConstructorPattern :: SpanInfo -> a -> QualIdent -> [Pattern a] -> Pattern a
- Curry.Syntax.Type: ConstructorType :: QualIdent -> TypeExpr
+ Curry.Syntax.Type: ConstructorType :: SpanInfo -> QualIdent -> TypeExpr
- Curry.Syntax.Type: DataDecl :: Position -> Ident -> [Ident] -> [ConstrDecl] -> [QualIdent] -> Decl a
+ Curry.Syntax.Type: DataDecl :: SpanInfo -> Ident -> [Ident] -> [ConstrDecl] -> [QualIdent] -> Decl a
- Curry.Syntax.Type: DefaultDecl :: Position -> [TypeExpr] -> Decl a
+ Curry.Syntax.Type: DefaultDecl :: SpanInfo -> [TypeExpr] -> Decl a
- Curry.Syntax.Type: Do :: [Statement a] -> (Expression a) -> Expression a
+ Curry.Syntax.Type: Do :: SpanInfo -> [Statement a] -> Expression a -> Expression a
- Curry.Syntax.Type: EnumFrom :: (Expression a) -> Expression a
+ Curry.Syntax.Type: EnumFrom :: SpanInfo -> Expression a -> Expression a
- Curry.Syntax.Type: EnumFromThen :: (Expression a) -> (Expression a) -> Expression a
+ Curry.Syntax.Type: EnumFromThen :: SpanInfo -> Expression a -> Expression a -> Expression a
- Curry.Syntax.Type: EnumFromThenTo :: (Expression a) -> (Expression a) -> (Expression a) -> Expression a
+ Curry.Syntax.Type: EnumFromThenTo :: SpanInfo -> Expression a -> Expression a -> Expression a -> Expression a
- Curry.Syntax.Type: EnumFromTo :: (Expression a) -> (Expression a) -> Expression a
+ Curry.Syntax.Type: EnumFromTo :: SpanInfo -> Expression a -> Expression a -> Expression a
- Curry.Syntax.Type: Equation :: Position -> (Lhs a) -> (Rhs a) -> Equation a
+ Curry.Syntax.Type: Equation :: SpanInfo -> Lhs a -> Rhs a -> Equation a
- Curry.Syntax.Type: Export :: QualIdent -> Export
+ Curry.Syntax.Type: Export :: SpanInfo -> QualIdent -> Export
- Curry.Syntax.Type: ExportModule :: ModuleIdent -> Export
+ Curry.Syntax.Type: ExportModule :: SpanInfo -> ModuleIdent -> Export
- Curry.Syntax.Type: ExportTypeAll :: QualIdent -> Export
+ Curry.Syntax.Type: ExportTypeAll :: SpanInfo -> QualIdent -> Export
- Curry.Syntax.Type: ExportTypeWith :: QualIdent -> [Ident] -> Export
+ Curry.Syntax.Type: ExportTypeWith :: SpanInfo -> QualIdent -> [Ident] -> Export
- Curry.Syntax.Type: Exporting :: Position -> [Export] -> ExportSpec
+ Curry.Syntax.Type: Exporting :: SpanInfo -> [Export] -> ExportSpec
- Curry.Syntax.Type: ExternalDataDecl :: Position -> Ident -> [Ident] -> Decl a
+ Curry.Syntax.Type: ExternalDataDecl :: SpanInfo -> Ident -> [Ident] -> Decl a
- Curry.Syntax.Type: ExternalDecl :: Position -> [Var a] -> Decl a
+ Curry.Syntax.Type: ExternalDecl :: SpanInfo -> [Var a] -> Decl a
- Curry.Syntax.Type: Field :: Position -> QualIdent -> a -> Field a
+ Curry.Syntax.Type: Field :: SpanInfo -> QualIdent -> a -> Field a
- Curry.Syntax.Type: FieldDecl :: Position -> [Ident] -> TypeExpr -> FieldDecl
+ Curry.Syntax.Type: FieldDecl :: SpanInfo -> [Ident] -> TypeExpr -> FieldDecl
- Curry.Syntax.Type: ForallType :: [Ident] -> TypeExpr -> TypeExpr
+ Curry.Syntax.Type: ForallType :: SpanInfo -> [Ident] -> TypeExpr -> TypeExpr
- Curry.Syntax.Type: FreeDecl :: Position -> [Var a] -> Decl a
+ Curry.Syntax.Type: FreeDecl :: SpanInfo -> [Var a] -> Decl a
- Curry.Syntax.Type: FunLhs :: Ident -> [Pattern a] -> Lhs a
+ Curry.Syntax.Type: FunLhs :: SpanInfo -> Ident -> [Pattern a] -> Lhs a
- Curry.Syntax.Type: FunctionDecl :: Position -> a -> Ident -> [Equation a] -> Decl a
+ Curry.Syntax.Type: FunctionDecl :: SpanInfo -> a -> Ident -> [Equation a] -> Decl a
- Curry.Syntax.Type: FunctionPattern :: a -> QualIdent -> [Pattern a] -> Pattern a
+ Curry.Syntax.Type: FunctionPattern :: SpanInfo -> a -> QualIdent -> [Pattern a] -> Pattern a
- Curry.Syntax.Type: Goal :: Position -> (Expression a) -> [Decl a] -> Goal a
+ Curry.Syntax.Type: Goal :: SpanInfo -> Expression a -> [Decl a] -> Goal a
- Curry.Syntax.Type: GuardedRhs :: [CondExpr a] -> [Decl a] -> Rhs a
+ Curry.Syntax.Type: GuardedRhs :: SpanInfo -> [CondExpr a] -> [Decl a] -> Rhs a
- Curry.Syntax.Type: Hiding :: Position -> [Import] -> ImportSpec
+ Curry.Syntax.Type: Hiding :: SpanInfo -> [Import] -> ImportSpec
- Curry.Syntax.Type: HidingClassDecl :: Position -> Context -> QualIdent -> (Maybe KindExpr) -> Ident -> IDecl
+ Curry.Syntax.Type: HidingClassDecl :: Position -> Context -> QualIdent -> Maybe KindExpr -> Ident -> IDecl
- Curry.Syntax.Type: HidingDataDecl :: Position -> QualIdent -> (Maybe KindExpr) -> [Ident] -> IDecl
+ Curry.Syntax.Type: HidingDataDecl :: Position -> QualIdent -> Maybe KindExpr -> [Ident] -> IDecl
- Curry.Syntax.Type: IClassDecl :: Position -> Context -> QualIdent -> (Maybe KindExpr) -> Ident -> [IMethodDecl] -> [Ident] -> IDecl
+ Curry.Syntax.Type: IClassDecl :: Position -> Context -> QualIdent -> Maybe KindExpr -> Ident -> [IMethodDecl] -> [Ident] -> IDecl
- Curry.Syntax.Type: IDataDecl :: Position -> QualIdent -> (Maybe KindExpr) -> [Ident] -> [ConstrDecl] -> [Ident] -> IDecl
+ Curry.Syntax.Type: IDataDecl :: Position -> QualIdent -> Maybe KindExpr -> [Ident] -> [ConstrDecl] -> [Ident] -> IDecl
- Curry.Syntax.Type: IFunctionDecl :: Position -> QualIdent -> (Maybe Ident) -> Arity -> QualTypeExpr -> IDecl
+ Curry.Syntax.Type: IFunctionDecl :: Position -> QualIdent -> Maybe Ident -> Arity -> QualTypeExpr -> IDecl
- Curry.Syntax.Type: IInstanceDecl :: Position -> Context -> QualIdent -> InstanceType -> [IMethodImpl] -> (Maybe ModuleIdent) -> IDecl
+ Curry.Syntax.Type: IInstanceDecl :: Position -> Context -> QualIdent -> InstanceType -> [IMethodImpl] -> Maybe ModuleIdent -> IDecl
- Curry.Syntax.Type: IMethodDecl :: Position -> Ident -> (Maybe Arity) -> QualTypeExpr -> IMethodDecl
+ Curry.Syntax.Type: IMethodDecl :: Position -> Ident -> Maybe Arity -> QualTypeExpr -> IMethodDecl
- Curry.Syntax.Type: INewtypeDecl :: Position -> QualIdent -> (Maybe KindExpr) -> [Ident] -> NewConstrDecl -> [Ident] -> IDecl
+ Curry.Syntax.Type: INewtypeDecl :: Position -> QualIdent -> Maybe KindExpr -> [Ident] -> NewConstrDecl -> [Ident] -> IDecl
- Curry.Syntax.Type: ITypeDecl :: Position -> QualIdent -> (Maybe KindExpr) -> [Ident] -> TypeExpr -> IDecl
+ Curry.Syntax.Type: ITypeDecl :: Position -> QualIdent -> Maybe KindExpr -> [Ident] -> TypeExpr -> IDecl
- Curry.Syntax.Type: IfThenElse :: (Expression a) -> (Expression a) -> (Expression a) -> Expression a
+ Curry.Syntax.Type: IfThenElse :: SpanInfo -> Expression a -> Expression a -> Expression a -> Expression a
- Curry.Syntax.Type: Import :: Ident -> Import
+ Curry.Syntax.Type: Import :: SpanInfo -> Ident -> Import
- Curry.Syntax.Type: ImportDecl :: Position -> ModuleIdent -> Qualified -> (Maybe ModuleIdent) -> (Maybe ImportSpec) -> ImportDecl
+ Curry.Syntax.Type: ImportDecl :: SpanInfo -> ModuleIdent -> Qualified -> Maybe ModuleIdent -> Maybe ImportSpec -> ImportDecl
- Curry.Syntax.Type: ImportTypeAll :: Ident -> Import
+ Curry.Syntax.Type: ImportTypeAll :: SpanInfo -> Ident -> Import
- Curry.Syntax.Type: ImportTypeWith :: Ident -> [Ident] -> Import
+ Curry.Syntax.Type: ImportTypeWith :: SpanInfo -> Ident -> [Ident] -> Import
- Curry.Syntax.Type: Importing :: Position -> [Import] -> ImportSpec
+ Curry.Syntax.Type: Importing :: SpanInfo -> [Import] -> ImportSpec
- Curry.Syntax.Type: InfixApply :: (Expression a) -> (InfixOp a) -> (Expression a) -> Expression a
+ Curry.Syntax.Type: InfixApply :: SpanInfo -> Expression a -> InfixOp a -> Expression a -> Expression a
- Curry.Syntax.Type: InfixDecl :: Position -> Infix -> (Maybe Precedence) -> [Ident] -> Decl a
+ Curry.Syntax.Type: InfixDecl :: SpanInfo -> Infix -> Maybe Precedence -> [Ident] -> Decl a
- Curry.Syntax.Type: InfixFuncPattern :: a -> (Pattern a) -> QualIdent -> (Pattern a) -> Pattern a
+ Curry.Syntax.Type: InfixFuncPattern :: SpanInfo -> a -> Pattern a -> QualIdent -> Pattern a -> Pattern a
- Curry.Syntax.Type: InfixPattern :: a -> (Pattern a) -> QualIdent -> (Pattern a) -> Pattern a
+ Curry.Syntax.Type: InfixPattern :: SpanInfo -> a -> Pattern a -> QualIdent -> Pattern a -> Pattern a
- Curry.Syntax.Type: InstanceDecl :: Position -> Context -> QualIdent -> InstanceType -> [Decl a] -> Decl a
+ Curry.Syntax.Type: InstanceDecl :: SpanInfo -> Context -> QualIdent -> InstanceType -> [Decl a] -> Decl a
- Curry.Syntax.Type: Lambda :: [Pattern a] -> (Expression a) -> Expression a
+ Curry.Syntax.Type: Lambda :: SpanInfo -> [Pattern a] -> Expression a -> Expression a
- Curry.Syntax.Type: LanguagePragma :: Position -> [Extension] -> ModulePragma
+ Curry.Syntax.Type: LanguagePragma :: SpanInfo -> [Extension] -> ModulePragma
- Curry.Syntax.Type: LazyPattern :: (Pattern a) -> Pattern a
+ Curry.Syntax.Type: LazyPattern :: SpanInfo -> Pattern a -> Pattern a
- Curry.Syntax.Type: LeftSection :: (Expression a) -> (InfixOp a) -> Expression a
+ Curry.Syntax.Type: LeftSection :: SpanInfo -> Expression a -> InfixOp a -> Expression a
- Curry.Syntax.Type: Let :: [Decl a] -> (Expression a) -> Expression a
+ Curry.Syntax.Type: Let :: SpanInfo -> [Decl a] -> Expression a -> Expression a
- Curry.Syntax.Type: List :: a -> [Expression a] -> Expression a
+ Curry.Syntax.Type: List :: SpanInfo -> a -> [Expression a] -> Expression a
- Curry.Syntax.Type: ListCompr :: (Expression a) -> [Statement a] -> Expression a
+ Curry.Syntax.Type: ListCompr :: SpanInfo -> Expression a -> [Statement a] -> Expression a
- Curry.Syntax.Type: ListPattern :: a -> [Pattern a] -> Pattern a
+ Curry.Syntax.Type: ListPattern :: SpanInfo -> a -> [Pattern a] -> Pattern a
- Curry.Syntax.Type: ListType :: TypeExpr -> TypeExpr
+ Curry.Syntax.Type: ListType :: SpanInfo -> TypeExpr -> TypeExpr
- Curry.Syntax.Type: Literal :: a -> Literal -> Expression a
+ Curry.Syntax.Type: Literal :: SpanInfo -> a -> Literal -> Expression a
- Curry.Syntax.Type: LiteralPattern :: a -> Literal -> Pattern a
+ Curry.Syntax.Type: LiteralPattern :: SpanInfo -> a -> Literal -> Pattern a
- Curry.Syntax.Type: Module :: [ModulePragma] -> ModuleIdent -> (Maybe ExportSpec) -> [ImportDecl] -> [Decl a] -> Module a
+ Curry.Syntax.Type: Module :: SpanInfo -> [ModulePragma] -> ModuleIdent -> Maybe ExportSpec -> [ImportDecl] -> [Decl a] -> Module a
- Curry.Syntax.Type: NegativePattern :: a -> Literal -> Pattern a
+ Curry.Syntax.Type: NegativePattern :: SpanInfo -> a -> Literal -> Pattern a
- Curry.Syntax.Type: NewConstrDecl :: Position -> Ident -> TypeExpr -> NewConstrDecl
+ Curry.Syntax.Type: NewConstrDecl :: SpanInfo -> Ident -> TypeExpr -> NewConstrDecl
- Curry.Syntax.Type: NewRecordDecl :: Position -> Ident -> (Ident, TypeExpr) -> NewConstrDecl
+ Curry.Syntax.Type: NewRecordDecl :: SpanInfo -> Ident -> (Ident, TypeExpr) -> NewConstrDecl
- Curry.Syntax.Type: NewtypeDecl :: Position -> Ident -> [Ident] -> NewConstrDecl -> [QualIdent] -> Decl a
+ Curry.Syntax.Type: NewtypeDecl :: SpanInfo -> Ident -> [Ident] -> NewConstrDecl -> [QualIdent] -> Decl a
- Curry.Syntax.Type: OpLhs :: (Pattern a) -> Ident -> (Pattern a) -> Lhs a
+ Curry.Syntax.Type: OpLhs :: SpanInfo -> Pattern a -> Ident -> Pattern a -> Lhs a
- Curry.Syntax.Type: OptionsPragma :: Position -> (Maybe Tool) -> String -> ModulePragma
+ Curry.Syntax.Type: OptionsPragma :: SpanInfo -> Maybe Tool -> String -> ModulePragma
- Curry.Syntax.Type: Paren :: (Expression a) -> Expression a
+ Curry.Syntax.Type: Paren :: SpanInfo -> Expression a -> Expression a
- Curry.Syntax.Type: ParenPattern :: (Pattern a) -> Pattern a
+ Curry.Syntax.Type: ParenPattern :: SpanInfo -> Pattern a -> Pattern a
- Curry.Syntax.Type: ParenType :: TypeExpr -> TypeExpr
+ Curry.Syntax.Type: ParenType :: SpanInfo -> TypeExpr -> TypeExpr
- Curry.Syntax.Type: PatternDecl :: Position -> (Pattern a) -> (Rhs a) -> Decl a
+ Curry.Syntax.Type: PatternDecl :: SpanInfo -> Pattern a -> Rhs a -> Decl a
- Curry.Syntax.Type: QualTypeExpr :: Context -> TypeExpr -> QualTypeExpr
+ Curry.Syntax.Type: QualTypeExpr :: SpanInfo -> Context -> TypeExpr -> QualTypeExpr
- Curry.Syntax.Type: Record :: a -> QualIdent -> [Field (Expression a)] -> Expression a
+ Curry.Syntax.Type: Record :: SpanInfo -> a -> QualIdent -> [Field (Expression a)] -> Expression a
- Curry.Syntax.Type: RecordDecl :: Position -> [Ident] -> Context -> Ident -> [FieldDecl] -> ConstrDecl
+ Curry.Syntax.Type: RecordDecl :: SpanInfo -> [Ident] -> Context -> Ident -> [FieldDecl] -> ConstrDecl
- Curry.Syntax.Type: RecordPattern :: a -> QualIdent -> [Field (Pattern a)] -> Pattern a
+ Curry.Syntax.Type: RecordPattern :: SpanInfo -> a -> QualIdent -> [Field (Pattern a)] -> Pattern a
- Curry.Syntax.Type: RecordUpdate :: (Expression a) -> [Field (Expression a)] -> Expression a
+ Curry.Syntax.Type: RecordUpdate :: SpanInfo -> Expression a -> [Field (Expression a)] -> Expression a
- Curry.Syntax.Type: RightSection :: (InfixOp a) -> (Expression a) -> Expression a
+ Curry.Syntax.Type: RightSection :: SpanInfo -> InfixOp a -> Expression a -> Expression a
- Curry.Syntax.Type: SimpleRhs :: Position -> (Expression a) -> [Decl a] -> Rhs a
+ Curry.Syntax.Type: SimpleRhs :: SpanInfo -> Expression a -> [Decl a] -> Rhs a
- Curry.Syntax.Type: StmtBind :: (Pattern a) -> (Expression a) -> Statement a
+ Curry.Syntax.Type: StmtBind :: SpanInfo -> Pattern a -> Expression a -> Statement a
- Curry.Syntax.Type: StmtDecl :: [Decl a] -> Statement a
+ Curry.Syntax.Type: StmtDecl :: SpanInfo -> [Decl a] -> Statement a
- Curry.Syntax.Type: StmtExpr :: (Expression a) -> Statement a
+ Curry.Syntax.Type: StmtExpr :: SpanInfo -> Expression a -> Statement a
- Curry.Syntax.Type: Tuple :: [Expression a] -> Expression a
+ Curry.Syntax.Type: Tuple :: SpanInfo -> [Expression a] -> Expression a
- Curry.Syntax.Type: TuplePattern :: [Pattern a] -> Pattern a
+ Curry.Syntax.Type: TuplePattern :: SpanInfo -> [Pattern a] -> Pattern a
- Curry.Syntax.Type: TupleType :: [TypeExpr] -> TypeExpr
+ Curry.Syntax.Type: TupleType :: SpanInfo -> [TypeExpr] -> TypeExpr
- Curry.Syntax.Type: TypeDecl :: Position -> Ident -> [Ident] -> TypeExpr -> Decl a
+ Curry.Syntax.Type: TypeDecl :: SpanInfo -> Ident -> [Ident] -> TypeExpr -> Decl a
- Curry.Syntax.Type: TypeSig :: Position -> [Ident] -> QualTypeExpr -> Decl a
+ Curry.Syntax.Type: TypeSig :: SpanInfo -> [Ident] -> QualTypeExpr -> Decl a
- Curry.Syntax.Type: Typed :: (Expression a) -> QualTypeExpr -> Expression a
+ Curry.Syntax.Type: Typed :: SpanInfo -> Expression a -> QualTypeExpr -> Expression a
- Curry.Syntax.Type: UnaryMinus :: (Expression a) -> Expression a
+ Curry.Syntax.Type: UnaryMinus :: SpanInfo -> Expression a -> Expression a
- Curry.Syntax.Type: Variable :: a -> QualIdent -> Expression a
+ Curry.Syntax.Type: Variable :: SpanInfo -> a -> QualIdent -> Expression a
- Curry.Syntax.Type: VariablePattern :: a -> Ident -> Pattern a
+ Curry.Syntax.Type: VariablePattern :: SpanInfo -> a -> Ident -> Pattern a
- Curry.Syntax.Type: VariableType :: Ident -> TypeExpr
+ Curry.Syntax.Type: VariableType :: SpanInfo -> Ident -> TypeExpr
- Curry.Syntax.Utils: caseAlt :: Position -> Pattern a -> Expression a -> Alt a
+ Curry.Syntax.Utils: caseAlt :: SpanInfo -> Pattern a -> Expression a -> Alt a
- Curry.Syntax.Utils: funDecl :: Position -> a -> Ident -> [Pattern a] -> Expression a -> Decl a
+ Curry.Syntax.Utils: funDecl :: SpanInfo -> a -> Ident -> [Pattern a] -> Expression a -> Decl a
- Curry.Syntax.Utils: mkEquation :: Position -> Ident -> [Pattern a] -> Expression a -> Equation a
+ Curry.Syntax.Utils: mkEquation :: SpanInfo -> Ident -> [Pattern a] -> Expression a -> Equation a
- Curry.Syntax.Utils: patDecl :: Position -> Pattern a -> Expression a -> Decl a
+ Curry.Syntax.Utils: patDecl :: SpanInfo -> Pattern a -> Expression a -> Decl a
- Curry.Syntax.Utils: simpleRhs :: Position -> Expression a -> Rhs a
+ Curry.Syntax.Utils: simpleRhs :: SpanInfo -> Expression a -> Rhs a
- Curry.Syntax.Utils: varDecl :: Position -> a -> Ident -> Expression a -> Decl a
+ Curry.Syntax.Utils: varDecl :: SpanInfo -> a -> Ident -> Expression a -> Decl a

Files

CHANGELOG.md view
@@ -1,6 +1,11 @@ Change log for curry-base ========================= +Version (1.1.0)+===================================++  * Added SpanInfos to AST+ Version (1.0.0) =============== 
curry-base.cabal view
@@ -1,5 +1,5 @@ Name:          curry-base-Version:       1.0.0+Version:       1.1.0 Cabal-Version: >= 1.10 Synopsis:      Functions for manipulating Curry programs Description:   This package serves as a foundation for Curry compilers.@@ -64,6 +64,7 @@     Curry.Base.Position     Curry.Base.Pretty     Curry.Base.Span+    Curry.Base.SpanInfo     Curry.CondCompile.Parser     Curry.CondCompile.Transform     Curry.CondCompile.Type@@ -76,9 +77,11 @@     Curry.FlatCurry.InterfaceEquivalence     Curry.FlatCurry.Pretty     Curry.FlatCurry.Type+    Curry.FlatCurry.Typeable     Curry.FlatCurry.Annotated.Goodies     Curry.FlatCurry.Annotated.Type-    Curry.FlatCurry.Annotated.Typing+    Curry.FlatCurry.Typed.Goodies+    Curry.FlatCurry.Typed.Type     Curry.Syntax     Curry.Syntax.Extension     Curry.Syntax.InterfaceEquivalence
src/Curry/Base/Ident.hs view
@@ -21,21 +21,21 @@      Qualified identifiers may optionally be prefixed by a module name. -}-+{-# LANGUAGE CPP #-} module Curry.Base.Ident   ( -- * Module identifiers     ModuleIdent (..), mkMIdent, moduleName, escModuleName-  , fromModuleName, isValidModuleName, addPositionModuleIdent+  , fromModuleName, isValidModuleName, addPositionModuleIdent, mIdentLength      -- * Local identifiers   , Ident (..), mkIdent, showIdent, escName, identSupply   , globalScope, hasGlobalScope, isRenamed, renameIdent, unRenameIdent-  , updIdentName, addPositionIdent, isInfixOp+  , updIdentName, addPositionIdent, isInfixOp, identLength      -- * Qualified identifiers-  , QualIdent (..), qualName, escQualName, qidPosition, isQInfixOp, qualify+  , QualIdent (..), qualName, escQualName, isQInfixOp, qualify   , qualifyWith, qualQualify, qualifyLike, isQualified, unqualify, qualUnqualify-  , localIdent, isLocalIdent, updQualIdent+  , localIdent, isLocalIdent, updQualIdent, qIdentLength      -- * Predefined simple identifiers     -- ** Identifiers for modules@@ -86,12 +86,18 @@   , renameLabel, mkLabelIdent   ) where +#if __GLASGOW_HASKELL__ >= 804+import Prelude hiding ((<>))+#endif+ import Data.Char           (isAlpha, isAlphaNum) import Data.Function       (on) import Data.List           (intercalate, isInfixOf, isPrefixOf) import Data.Maybe          (isJust, fromMaybe)  import Curry.Base.Position+import Curry.Base.Span hiding (file)+import Curry.Base.SpanInfo import Curry.Base.Pretty  -- ---------------------------------------------------------------------------@@ -100,7 +106,7 @@  -- | Module identifier data ModuleIdent = ModuleIdent-  { midPosition   :: Position -- ^ source code 'Position'+  { midSpanInfo   :: SpanInfo -- ^ source code 'SpanInfo'   , midQualifiers :: [String] -- ^ hierarchical idenfiers   } deriving (Read, Show) @@ -110,17 +116,27 @@ instance Ord ModuleIdent where   compare = compare `on` midQualifiers +instance HasSpanInfo ModuleIdent where+  getSpanInfo = midSpanInfo+  setSpanInfo spi a = a { midSpanInfo = spi }+  updateEndPos i =+    setEndPosition (incr (getPosition i) (mIdentLength i - 1)) i+ instance HasPosition ModuleIdent where-  getPosition = midPosition-  setPosition = addPositionModuleIdent+  getPosition = getStartPosition+  setPosition = setStartPosition  instance Pretty ModuleIdent where   pPrint = hcat . punctuate dot . map text . midQualifiers +mIdentLength :: ModuleIdent -> Int+mIdentLength a = length (concat (midQualifiers a))+               + length (midQualifiers a)+ -- |Construct a 'ModuleIdent' from a list of 'String's forming the --  the hierarchical module name. mkMIdent :: [String] -> ModuleIdent-mkMIdent = ModuleIdent NoPos+mkMIdent = ModuleIdent NoSpanInfo  -- |Retrieve the hierarchical name of a module moduleName :: ModuleIdent -> String@@ -132,7 +148,7 @@  -- |Add a source code 'Position' to a 'ModuleIdent' addPositionModuleIdent :: Position -> ModuleIdent -> ModuleIdent-addPositionModuleIdent pos mi = mi { midPosition = pos }+addPositionModuleIdent = setPosition  -- |Check whether a 'String' is a valid module name. --@@ -175,7 +191,7 @@  -- |Simple identifier data Ident = Ident-  { idPosition :: Position -- ^ Source code 'Position'+  { idSpanInfo :: SpanInfo -- ^ Source code 'SpanInfo'   , idName     :: String   -- ^ Name of the identifier   , idUnique   :: Integer  -- ^ Unique number of the identifier   } deriving (Read, Show)@@ -186,21 +202,32 @@ instance Ord Ident where   Ident _ m i `compare` Ident _ n j = (m, i) `compare` (n, j) +instance HasSpanInfo Ident where+  getSpanInfo = idSpanInfo+  setSpanInfo spi a = a { idSpanInfo = spi }+  updateEndPos i@(Ident (SpanInfo _ [_,ss]) _ _) =+    setEndPosition (end ss) i+  updateEndPos i =+    setEndPosition (incr (getPosition i) (identLength i - 1)) i+ instance HasPosition Ident where-  getPosition = idPosition-  setPosition = addPositionIdent+  getPosition = getStartPosition+  setPosition = setStartPosition  instance Pretty Ident where   pPrint (Ident _ x n) | n == globalScope = text x                        | otherwise        = text x <> dot <> integer n +identLength :: Ident -> Int+identLength a = length (idName a)+ -- |Global scope for renaming globalScope :: Integer globalScope = 0  -- |Construct an 'Ident' from a 'String' mkIdent :: String -> Ident-mkIdent x = Ident NoPos x globalScope+mkIdent x = Ident NoSpanInfo x globalScope  -- |Infinite list of different 'Ident's identSupply :: [Ident]@@ -239,8 +266,7 @@  -- |Add a 'Position' to an 'Ident' addPositionIdent :: Position -> Ident -> Ident-addPositionIdent pos      (Ident NoPos x n) = Ident pos x n-addPositionIdent pos      (Ident _     x n) = Ident pos x n+addPositionIdent = setPosition  -- |Check whether an 'Ident' identifies an infix operation isInfixOp :: Ident -> Bool@@ -255,30 +281,45 @@  -- |Qualified identifier data QualIdent = QualIdent-  { qidModule :: Maybe ModuleIdent -- ^ optional module identifier-  , qidIdent  :: Ident             -- ^ identifier itself-  } deriving (Eq, Ord, Read, Show)+  { qidSpanInfo :: SpanInfo          -- ^ Source code 'SpanInfo'+  , qidModule   :: Maybe ModuleIdent -- ^ optional module identifier+  , qidIdent    :: Ident             -- ^ identifier itself+  } deriving (Read, Show) +instance Eq QualIdent where+  QualIdent _ m i == QualIdent _ n j = (m, i) == (n, j)++instance Ord QualIdent where+  QualIdent _ m i `compare` QualIdent _ n j = (m, i) `compare` (n, j)++instance HasSpanInfo QualIdent where+  getSpanInfo = qidSpanInfo+  setSpanInfo spi a = a { qidSpanInfo = spi }+  updateEndPos i@(QualIdent (SpanInfo _ [_,ss]) _ _) =+    setEndPosition (end ss) i+  updateEndPos i =+    setEndPosition (incr (getPosition i) (qIdentLength i - 1)) i+ instance HasPosition QualIdent where-  getPosition     = getPosition . qidIdent-  setPosition p q = q { qidIdent = setPosition p $ qidIdent q }+  getPosition = getStartPosition+  setPosition = setStartPosition  instance Pretty QualIdent where   pPrint = text . qualName --- |show function for qualified identifiers+qIdentLength :: QualIdent -> Int+qIdentLength (QualIdent _ (Just m) i) = identLength i + mIdentLength m+qIdentLength (QualIdent _ Nothing  i) = identLength i++-- |show function for qualified identifiers)= qualName :: QualIdent -> String-qualName (QualIdent Nothing  x) = idName x-qualName (QualIdent (Just m) x) = moduleName m ++ "." ++ idName x+qualName (QualIdent _ Nothing  x) = idName x+qualName (QualIdent _ (Just m) x) = moduleName m ++ "." ++ idName x  -- |Show the name of an 'QualIdent' escaped by ticks escQualName :: QualIdent -> String escQualName qn = '`' : qualName qn ++ "'" --- |Retrieve the 'Position' of a 'QualIdent'-qidPosition :: QualIdent -> Position-qidPosition = idPosition . qidIdent- -- |Check whether an 'QualIdent' identifies an infix operation isQInfixOp :: QualIdent -> Bool isQInfixOp = isInfixOp . qidIdent@@ -291,24 +332,25 @@  -- | Convert an 'Ident' to a 'QualIdent' qualify :: Ident -> QualIdent-qualify = QualIdent Nothing+qualify i = QualIdent (getSpanInfo i) Nothing i  -- | Convert an 'Ident' to a 'QualIdent' with a given 'ModuleIdent' qualifyWith :: ModuleIdent -> Ident -> QualIdent-qualifyWith = QualIdent . Just+qualifyWith mid i = updateEndPos $+  QualIdent (fromSrcSpan (getSrcSpan mid)) (Just mid) i  -- | Convert an 'QualIdent' to a new 'QualIdent' with a given 'ModuleIdent'. --   If the original 'QualIdent' already contains an 'ModuleIdent' it --   remains unchanged. qualQualify :: ModuleIdent -> QualIdent -> QualIdent-qualQualify m (QualIdent Nothing x) = QualIdent (Just m) x+qualQualify m (QualIdent _ Nothing x) = qualifyWith m x qualQualify _ x = x  -- |Qualify an 'Ident' with the 'ModuleIdent' of the given 'QualIdent', -- if present. qualifyLike :: QualIdent -> Ident -> QualIdent-qualifyLike (QualIdent Nothing  _) x = qualify x-qualifyLike (QualIdent (Just m) _) x = qualifyWith m x+qualifyLike (QualIdent _ Nothing  _) x = qualify x+qualifyLike (QualIdent _ (Just m) _) x = qualifyWith m x  -- | Check whether a 'QualIdent' contains a 'ModuleIdent' isQualified :: QualIdent -> Bool@@ -322,8 +364,8 @@ --   original 'QualIdent' has no 'ModuleIdent' or a different one, it --   remains unchanged. qualUnqualify :: ModuleIdent -> QualIdent -> QualIdent-qualUnqualify _ qid@(QualIdent Nothing   _) = qid-qualUnqualify m     (QualIdent (Just m') x) = QualIdent m'' x+qualUnqualify _ qid@(QualIdent _   Nothing   _) = qid+qualUnqualify m     (QualIdent spi (Just m') x) = QualIdent spi m'' x   where m'' | m == m'   = Nothing             | otherwise = Just m' @@ -331,8 +373,8 @@ --   'ModuleIdent', i.e. if the 'Ident' is either unqualified or qualified --   with the given 'ModuleIdent'. localIdent :: ModuleIdent -> QualIdent -> Maybe Ident-localIdent _ (QualIdent Nothing   x) = Just x-localIdent m (QualIdent (Just m') x)+localIdent _ (QualIdent _ Nothing   x) = Just x+localIdent m (QualIdent _ (Just m') x)   | m == m'   = Just x   | otherwise = Nothing @@ -343,23 +385,22 @@ -- | Update a 'QualIdent' by applying functions to its components updQualIdent :: (ModuleIdent -> ModuleIdent) -> (Ident -> Ident)              -> QualIdent -> QualIdent-updQualIdent f g (QualIdent m x) = QualIdent (fmap f m) (g x)+updQualIdent f g (QualIdent spi m x) = QualIdent spi (fmap f m) (g x)  -- --------------------------------------------------------------------------- -- A few identifiers are predefined here. -- ---------------------------------------------------------------------------- -- | 'ModuleIdent' for the empty module emptyMIdent :: ModuleIdent-emptyMIdent = ModuleIdent NoPos []+emptyMIdent = ModuleIdent NoSpanInfo []  -- | 'ModuleIdent' for the main module mainMIdent :: ModuleIdent-mainMIdent = ModuleIdent NoPos ["main"]+mainMIdent = ModuleIdent NoSpanInfo ["main"]  -- | 'ModuleIdent' for the Prelude preludeMIdent :: ModuleIdent-preludeMIdent = ModuleIdent NoPos ["Prelude"]+preludeMIdent = ModuleIdent NoSpanInfo ["Prelude"]  -- --------------------------------------------------------------------------- -- Identifiers for types
src/Curry/Base/LLParseComb.hs view
@@ -31,12 +31,13 @@   , fullParser, prefixParser      -- * Basic parsers-  , position, succeed, failure, symbol+  , position, spanPosition, succeed, failure, symbol      -- *  parser combinators   , (<?>), (<|>), (<|?>), (<*>), (<\>), (<\\>)   , (<$>), (<$->), (<*->), (<-*>), (<**>), (<??>), (<.>)   , opt, choice, flag, optional, option, many, many1, sepBy, sepBy1+  , sepBySp, sepBy1Sp   , chainr, chainr1, chainl, chainl1, between, ops      -- * Layout combinators@@ -53,7 +54,7 @@  import Curry.Base.LexComb import Curry.Base.Position-import Curry.Base.Span (span2Pos)+import Curry.Base.Span (span2Pos, Span, startCol, setDistance)  infixl 5 <\>, <\\> infixl 4 <$->, <*->, <-*>, <**>, <??>, <.>@@ -136,6 +137,10 @@ position = Parser (Just p) Map.empty   where p success _ sp = success (span2Pos sp) sp +spanPosition :: Symbol s => Parser a s Span+spanPosition = Parser (Just p) Map.empty+  where p success _ sp s = success (setDistance sp (dist (startCol sp) s)) sp s+ -- |Always succeeding parser succeed :: b -> Parser a s b succeed x = Parser (Just p) Map.empty@@ -304,6 +309,15 @@ -- |Parse a non-empty list with is separated by a seperator sepBy1 :: Symbol s => Parser a s b -> Parser a s c -> Parser a s [b] p `sepBy1` q = (:) <$> p <*> many (q <-*> p)++-- |Parse a list with is separated by a seperator+sepBySp :: Symbol s => Parser a s b -> Parser a s c -> Parser a s ([b], [Span])+p `sepBySp` q = p `sepBy1Sp` q `opt` ([], [])++sepBy1Sp :: Symbol s => Parser a s b -> Parser a s c -> Parser a s ([b], [Span])+p `sepBy1Sp` q = comb <$> p <*> many ((,) <$> spanPosition <*-> q <*> p)+  where comb x xs = let (ss, ys) = unzip xs+                    in (x:ys,ss)  -- |@chainr p op x@ parses zero or more occurrences of @p@, separated by @op@. -- Returns a value produced by a *right* associative application of all
src/Curry/Base/Message.hs view
@@ -12,11 +12,15 @@     The type message represents a compiler message with an optional source     code position. -}-+{-# LANGUAGE CPP #-} module Curry.Base.Message   ( Message (..), message, posMessage, showWarning, showError   , ppMessage, ppWarning, ppError, ppMessages   ) where++#if __GLASGOW_HASKELL__ >= 804+import Prelude hiding ((<>))+#endif  import Data.Maybe          (fromMaybe) 
src/Curry/Base/Position.hs view
@@ -13,13 +13,17 @@     of a filename, a line number, and a column number. A tab stop is assumed     at every eighth column. -}-+{-# LANGUAGE CPP #-} module Curry.Base.Position   ( -- * Source code position     HasPosition (..), Position (..), (@>)   , showPosition, ppPosition, ppLine, showLine   , first, next, incr, tab, tabWidth, nl   ) where++#if __GLASGOW_HASKELL__ >= 804+import Prelude hiding ((<>))+#endif  import System.FilePath 
src/Curry/Base/Pretty.hs view
@@ -19,6 +19,10 @@   , module Text.PrettyPrint   ) where +#if __GLASGOW_HASKELL__ >= 804+import Prelude hiding ((<>))+#endif+ import Text.PrettyPrint  -- | Pretty printing class.
src/Curry/Base/Span.hs view
@@ -17,12 +17,16 @@     the abstract syntax tree by argument positions, which is used for     debugging purposes. -}-+{-# LANGUAGE CPP #-} module Curry.Base.Span where +#if __GLASGOW_HASKELL__ >= 804+import Prelude hiding ((<>))+#endif+ import System.FilePath -import Curry.Base.Position+import Curry.Base.Position hiding (file) import Curry.Base.Pretty  data Span@@ -39,6 +43,13 @@ instance Pretty Span where   pPrint = ppSpan +instance HasPosition Span where+  setPosition p NoSpan       = Span "" p NoPos+  setPosition p (Span f _ e) = Span f p e++  getPosition NoSpan       = NoPos+  getPosition (Span _ p _) = p+ -- |Show a 'Span' as a 'String' showSpan :: Span -> String showSpan = show . ppSpan@@ -81,6 +92,12 @@ span2Pos (Span _ p _) = p span2Pos NoSpan       = NoPos +combineSpans :: Span -> Span -> Span+combineSpans sp1 sp2 = Span f s e+  where s = start sp1+        e = end sp2+        f = file sp1+ -- |First position after the next tabulator tabSpan :: Span -> Span tabSpan (Span fn s e) = Span fn (tab s) (tab e)@@ -90,6 +107,9 @@ nlSpan :: Span -> Span nlSpan (Span fn s e) = Span fn (nl s) (nl e) nlSpan sp            = sp++addSpan :: Span -> (a, [Span]) -> (a, [Span])+addSpan sp (a, ss) = (a, sp:ss)  -- |Distance of a span, i.e. the line and column distance between start -- and end position
+ src/Curry/Base/SpanInfo.hs view
@@ -0,0 +1,101 @@+{- |+    Module      :  $Header$+    Description :  SpansInfo for entities+    Copyright   :  (c) 2017 Kai-Oliver Prott+    License     :  BSD-3-clause++    Maintainer  :  fte@informatik.uni-kiel.de+    Stability   :  experimental+    Portability :  portable++    This module implements a data type for span information for entities from a+    source file and function to operate on them. A span info consists of the+    span of the entity and a list of sub-spans whith additional information+    about location of keywords, e.g.+-}+module Curry.Base.SpanInfo+  ( SpanInfo(..), HasSpanInfo(..)+  , fromSrcSpan, fromSrcSpanBoth, getSrcSpan, setSrcSpan+  , fromSrcInfoPoints, getSrcInfoPoints, setSrcInfoPoints+  , getStartPosition, getSrcSpanEnd, setStartPosition, setEndPosition+  , spanInfo2Pos+  ) where++import Curry.Base.Position+import Curry.Base.Span++data SpanInfo = SpanInfo+    { srcSpan        :: Span+    , srcInfoPoints  :: [Span]+    }+    | NoSpanInfo+  deriving (Eq, Read, Show)++class HasPosition a => HasSpanInfo a where++  getSpanInfo :: a -> SpanInfo++  setSpanInfo :: SpanInfo -> a -> a++  updateEndPos :: a -> a+  updateEndPos = id++instance HasSpanInfo SpanInfo where+  getSpanInfo = id+  setSpanInfo = const++instance HasPosition SpanInfo where+  getPosition = getStartPosition+  setPosition = setStartPosition++fromSrcSpan :: Span -> SpanInfo+fromSrcSpan sp = SpanInfo sp []++fromSrcSpanBoth :: Span -> SpanInfo+fromSrcSpanBoth sp = SpanInfo sp [sp]++getSrcSpan :: HasSpanInfo a => a -> Span+getSrcSpan a = case getSpanInfo a of+  NoSpanInfo   -> NoSpan+  SpanInfo s _ -> s++setSrcSpan :: HasSpanInfo a => Span -> a -> a+setSrcSpan s a = case getSpanInfo a of+  NoSpanInfo     -> setSpanInfo (SpanInfo s [])  a+  SpanInfo _ inf -> setSpanInfo (SpanInfo s inf) a++fromSrcInfoPoints :: [Span] -> SpanInfo+fromSrcInfoPoints = SpanInfo NoSpan++getSrcInfoPoints :: HasSpanInfo a => a -> [Span]+getSrcInfoPoints a = case getSpanInfo a of+  NoSpanInfo    -> []+  SpanInfo _ xs -> xs++setSrcInfoPoints :: HasSpanInfo a => [Span] -> a -> a+setSrcInfoPoints inf a = case getSpanInfo a of+  NoSpanInfo   -> setSpanInfo (SpanInfo NoSpan inf) a+  SpanInfo s _ -> setSpanInfo (SpanInfo s      inf) a++getStartPosition :: HasSpanInfo a => a -> Position+getStartPosition a =  case getSrcSpan a of+  NoSpan     -> NoPos+  Span _ s _ -> s++getSrcSpanEnd :: HasSpanInfo a => a -> Position+getSrcSpanEnd a = case getSpanInfo a of+  NoSpanInfo     -> NoPos+  (SpanInfo s _) -> end s++setStartPosition :: HasSpanInfo a => Position -> a -> a+setStartPosition p a = case getSrcSpan a of+  NoSpan       -> setSrcSpan (Span "" p NoPos) a+  (Span f _ e) -> setSrcSpan (Span f  p     e) a++setEndPosition :: HasSpanInfo a => Position -> a -> a+setEndPosition e a = case getSrcSpan a of+  NoSpan       -> setSrcSpan (Span "" NoPos e) a+  (Span f p _) -> setSrcSpan (Span f  p     e) a++spanInfo2Pos :: HasSpanInfo a => a -> Position+spanInfo2Pos = getStartPosition
src/Curry/CondCompile/Type.hs view
@@ -11,9 +11,14 @@      TODO -}+{-# LANGUAGE CPP #-} module Curry.CondCompile.Type   ( Program, Stmt (..), Else (..), Elif (..), Cond (..), Op (..)   ) where++#if __GLASGOW_HASKELL__ >= 804+import Prelude hiding ((<>))+#endif  import Curry.Base.Pretty 
src/Curry/Files/Filenames.hs view
@@ -3,9 +3,10 @@     Description :  File names for several intermediate file formats.     Copyright   :  (c) 2009        Holger Siegel                        2013 - 2014 Björn Peemöller+                       2018        Kai-Oliver Prott     License     :  BSD-3-clause -    Maintainer  :  bjp@informatik.uni-kiel.de+    Maintainer  :  fte@informatik.uni-kiel.de     Stability   :  experimental     Portability :  portable @@ -37,8 +38,9 @@   , sourceRepExt, sourceExts, moduleExts      -- * Functions for computing file names-  , interfName, typedFlatName, flatName, flatIntName-  , acyName, uacyName, sourceRepName, tokensName, htmlName+  , interfName, typedFlatName, typeAnnFlatName, flatName, flatIntName+  , acyName, uacyName, sourceRepName, tokensName, commentsName+  , astName, shortASTName, htmlName   ) where  import System.FilePath@@ -152,6 +154,10 @@ typedFlatExt :: String typedFlatExt = ".tfcy" +-- |Filename extension for type-annotated flat-curry files+typeAnnFlatExt :: String+typeAnnFlatExt = ".tafcy"+ -- |Filename extension for flat-curry files flatExt :: String flatExt = ".fcy"@@ -176,6 +182,18 @@ tokensExt :: String tokensExt = ".tokens" +-- |Filename extension for comment token files+commentsExt :: String+commentsExt = ".cycom"++-- |Filename extension for AST files+astExt :: String+astExt = ".ast"++-- |Filename extension for shortened AST files+shortASTExt :: String+shortASTExt = ".sast"+ -- --------------------------------------------------------------------------- -- Computation of file names for a given source file -- ---------------------------------------------------------------------------@@ -188,6 +206,10 @@ typedFlatName :: FilePath -> FilePath typedFlatName = replaceExtensionWith typedFlatExt +-- |Compute the filename of the typed flat curry file for a source file+typeAnnFlatName :: FilePath -> FilePath+typeAnnFlatName = replaceExtensionWith typeAnnFlatExt+ -- |Compute the filename of the flat curry file for a source file flatName :: FilePath -> FilePath flatName = replaceExtensionWith flatExt@@ -211,6 +233,18 @@ -- |Compute the filename of the tokens file for a source file tokensName :: FilePath -> FilePath tokensName = replaceExtensionWith tokensExt++-- |Compute the filename of the comment tokens file for a source file+commentsName :: FilePath -> FilePath+commentsName = replaceExtensionWith commentsExt++-- |Compute the filename of the ast file for a source file+astName :: FilePath -> FilePath+astName = replaceExtensionWith astExt++-- |Compute the filename of the ast file for a source file+shortASTName :: FilePath -> FilePath+shortASTName = replaceExtensionWith shortASTExt  -- |Compute the filename of the HTML file for a source file htmlName :: ModuleIdent -> String
src/Curry/FlatCurry/Annotated/Goodies.hs view
@@ -4,11 +4,21 @@     Copyright   : (c) 2016 - 2017 Finn Teegen     License     : BSD-3-clause -    Maintainer  : bjp@informatik.uni-kiel.de+    Maintainer  : fte@informatik.uni-kiel.de     Stability   : experimental     Portability : portable -    TODO+    This library provides selector functions, test and update operations+    as well as some useful auxiliary functions for AnnotatedFlatCurry data terms.+    Most of the provided functions are based on general transformation+    functions that replace constructors with user-defined+    functions. For recursive datatypes the transformations are defined+    inductively over the term structure. This is quite usual for+    transformations on AnnotatedFlatCurry terms,+    so the provided functions can be used to implement specific transformations+    without having to explicitly state the recursion. Essentially, the tedious+    part of such transformations - descend in fairly complex term structures -+    is abstracted away, which hopefully makes the code more clear and brief. -}  module Curry.FlatCurry.Annotated.Goodies
src/Curry/FlatCurry/Annotated/Type.hs view
@@ -4,7 +4,7 @@     Copyright   : (c) 2016 - 2017 Finn Teegen     License     : BSD-3-clause -    Maintainer  : bjp@informatik.uni-kiel.de+    Maintainer  : fte@informatik.uni-kiel.de     Stability   : experimental     Portability : portable @@ -13,9 +13,11 @@  module Curry.FlatCurry.Annotated.Type   ( module Curry.FlatCurry.Annotated.Type+  , module Curry.FlatCurry.Typeable   , module Curry.FlatCurry.Type   ) where +import Curry.FlatCurry.Typeable import Curry.FlatCurry.Type ( QName, VarIndex, Visibility (..), TVarIndex                             , TypeDecl (..), OpDecl (..), Fixity (..)                             , TypeExpr (..), ConsDecl (..)@@ -51,3 +53,17 @@   = APattern  a (QName, a) [(VarIndex, a)]   | ALPattern a Literal   deriving (Eq, Read, Show)++instance Typeable a => Typeable (AExpr a) where+  typeOf (AVar a _) = typeOf a+  typeOf (ALit a _) = typeOf a+  typeOf (AComb a _ _ _) = typeOf a+  typeOf (ALet a _ _) = typeOf a+  typeOf (AFree a _ _) = typeOf a+  typeOf (AOr a _ _) = typeOf a+  typeOf (ACase a _ _ _) = typeOf a+  typeOf (ATyped a _ _) = typeOf a++instance Typeable a => Typeable (APattern a) where+  typeOf (APattern a _ _) = typeOf a+  typeOf (ALPattern a _) = typeOf a
− src/Curry/FlatCurry/Annotated/Typing.hs
@@ -1,36 +0,0 @@-{- |-    Module      :  $Header$-    Description :  TODO-    Copyright   :  (c)        2017 Finn Teegen-    License     :  BSD-3-clause--    Maintainer  :  bjp@informatik.uni-kiel.de-    Stability   :  experimental-    Portability :  portable--   TODO--}--module Curry.FlatCurry.Annotated.Typing (Typeable(..)) where--import Curry.FlatCurry.Annotated.Type--class Typeable a where-  typeOf :: a -> TypeExpr--instance Typeable TypeExpr where-  typeOf = id--instance Typeable a => Typeable (AExpr a) where-  typeOf (AVar a _) = typeOf a-  typeOf (ALit a _) = typeOf a-  typeOf (AComb a _ _ _) = typeOf a-  typeOf (ALet a _ _) = typeOf a-  typeOf (AFree a _ _) = typeOf a-  typeOf (AOr a _ _) = typeOf a-  typeOf (ACase a _ _ _) = typeOf a-  typeOf (ATyped a _ _) = typeOf a--instance Typeable a => Typeable (APattern a) where-  typeOf (APattern a _ _) = typeOf a-  typeOf (ALPattern a _) = typeOf a
+ src/Curry/FlatCurry/Typeable.hs view
@@ -0,0 +1,22 @@+{- |+    Module      : $Header$+    Description : Typeclass of Typeable entities+    Copyright   : (c) 2018        Kai-Oliver Prott+    License     : BSD-3-clause++    Maintainer  : fte@informatik.uni-kiel.de+    Stability   : experimental+    Portability : portable++    This module defines a Typeclass for easy access to the type of entites+-}++module Curry.FlatCurry.Typeable (Typeable(..)) where++import Curry.FlatCurry.Type (TypeExpr)++class Typeable a where+  typeOf :: a -> TypeExpr++instance Typeable TypeExpr where+  typeOf = id
+ src/Curry/FlatCurry/Typed/Goodies.hs view
@@ -0,0 +1,661 @@+{- |+    Module      : $Header$+    Description : Utility functions for working with TypedFlatCurry.+    Copyright   : (c) 2016 - 2017 Finn Teegen+                      2018        Kai-Oliver Prott+    License     : BSD-3-clause++    Maintainer  : fte@informatik.uni-kiel.de+    Stability   : experimental+    Portability : portable++    This library provides selector functions, test and update operations+    as well as some useful auxiliary functions for TypedFlatCurry data terms.+    Most of the provided functions are based on general transformation+    functions that replace constructors with user-defined+    functions. For recursive datatypes the transformations are defined+    inductively over the term structure. This is quite usual for+    transformations on TypedFlatCurry terms,+    so the provided functions can be used to implement specific transformations+    without having to explicitly state the recursion. Essentially, the tedious+    part of such transformations - descend in fairly complex term structures -+    is abstracted away, which hopefully makes the code more clear and brief.+-}++module Curry.FlatCurry.Typed.Goodies+  ( module Curry.FlatCurry.Typed.Goodies+  , module Curry.FlatCurry.Goodies+  ) where++import Curry.FlatCurry.Goodies ( Update+                               , trType, typeName, typeVisibility, typeParams+                               , typeConsDecls, typeSyn, isTypeSyn+                               , isDataTypeDecl, isExternalType, isPublicType+                               , updType, updTypeName, updTypeVisibility+                               , updTypeParams, updTypeConsDecls, updTypeSynonym+                               , updQNamesInType+                               , trCons, consName, consArity, consVisibility+                               , isPublicCons, consArgs, updCons, updConsName+                               , updConsArity, updConsVisibility, updConsArgs+                               , updQNamesInConsDecl+                               , tVarIndex, domain, range, tConsName, tConsArgs+                               , trTypeExpr, isTVar, isTCons, isFuncType+                               , updTVars, updTCons, updFuncTypes, argTypes+                               , typeArity, resultType, allVarsInTypeExpr+                               , allTypeCons, rnmAllVarsInTypeExpr+                               , updQNamesInTypeExpr+                               , trOp, opName, opFixity, opPrecedence, updOp+                               , updOpName, updOpFixity, updOpPrecedence+                               , trCombType, isCombTypeFuncCall+                               , isCombTypeFuncPartCall, isCombTypeConsCall+                               , isCombTypeConsPartCall+                               , isPublic+                               )++import Curry.FlatCurry.Typed.Type++-- TProg ----------------------------------------------------------------------++-- |transform program+trTProg :: (String -> [String] -> [TypeDecl] -> [TFuncDecl] -> [OpDecl] -> b)+        -> TProg -> b+trTProg prog (TProg name imps types funcs ops) = prog name imps types funcs ops++-- Selectors++-- |get name from program+tProgName :: TProg -> String+tProgName = trTProg (\name _ _ _ _ -> name)++-- |get imports from program+tProgImports :: TProg -> [String]+tProgImports = trTProg (\_ imps _ _ _ -> imps)++-- |get type declarations from program+tProgTypes :: TProg -> [TypeDecl]+tProgTypes = trTProg (\_ _ types _ _ -> types)++-- |get functions from program+tProgTFuncs :: TProg -> [TFuncDecl]+tProgTFuncs = trTProg (\_ _ _ funcs _ -> funcs)++-- |get infix operators from program+tProgOps :: TProg -> [OpDecl]+tProgOps = trTProg (\_ _ _ _ ops -> ops)++-- Update Operations++-- |update program+updTProg :: (String -> String) ->+            ([String] -> [String]) ->+            ([TypeDecl] -> [TypeDecl]) ->+            ([TFuncDecl] -> [TFuncDecl]) ->+            ([OpDecl] -> [OpDecl]) -> TProg -> TProg+updTProg fn fi ft ff fo = trTProg prog+ where+  prog name imps types funcs ops+    = TProg (fn name) (fi imps) (ft types) (ff funcs) (fo ops)++-- |update name of program+updTProgName :: Update TProg String+updTProgName f = updTProg f id id id id++-- |update imports of program+updTProgImports :: Update TProg [String]+updTProgImports f = updTProg id f id id id++-- |update type declarations of program+updTProgTypes :: Update TProg [TypeDecl]+updTProgTypes f = updTProg id id f id id++-- |update functions of program+updTProgTFuncs :: Update TProg [TFuncDecl]+updTProgTFuncs f = updTProg id id id f id++-- |update infix operators of program+updTProgOps :: Update TProg [OpDecl]+updTProgOps = updTProg id id id id++-- Auxiliary Functions++-- |get all program variables (also from patterns)+allVarsInTProg :: TProg -> [(VarIndex, TypeExpr)]+allVarsInTProg = concatMap allVarsInTFunc . tProgTFuncs++-- |lift transformation on expressions to program+updTProgTExps :: Update TProg TExpr+updTProgTExps = updTProgTFuncs . map . updTFuncBody++-- |rename programs variables+rnmAllVarsInTProg :: Update TProg VarIndex+rnmAllVarsInTProg = updTProgTFuncs . map . rnmAllVarsInTFunc++-- |update all qualified names in program+updQNamesInTProg :: Update TProg QName+updQNamesInTProg f = updTProg id id+  (map (updQNamesInType f)) (map (updQNamesInTFunc f)) (map (updOpName f))++-- |rename program (update name of and all qualified names in program)+rnmTProg :: String -> TProg -> TProg+rnmTProg name p = updTProgName (const name) (updQNamesInTProg rnm p)+ where+  rnm (m, n) | m == tProgName p = (name, n)+             | otherwise = (m, n)++-- TFuncDecl ------------------------------------------------------------------++-- |transform function+trTFunc :: (QName -> Int -> Visibility -> TypeExpr -> TRule -> b) -> TFuncDecl -> b+trTFunc func (TFunc name arity vis t rule) = func name arity vis t rule++-- Selectors++-- |get name of function+tFuncName :: TFuncDecl -> QName+tFuncName = trTFunc (\name _ _ _ _ -> name)++-- |get arity of function+tFuncArity :: TFuncDecl -> Int+tFuncArity = trTFunc (\_ arity _ _ _ -> arity)++-- |get visibility of function+tFuncVisibility :: TFuncDecl -> Visibility+tFuncVisibility = trTFunc (\_ _ vis _ _ -> vis)++-- |get type of function+tFuncType :: TFuncDecl -> TypeExpr+tFuncType = trTFunc (\_ _ _ t _ -> t)++-- |get rule of function+tFuncTRule :: TFuncDecl -> TRule+tFuncTRule = trTFunc (\_ _ _ _ rule -> rule)++-- Update Operations++-- |update function+updTFunc :: (QName -> QName) ->+            (Int -> Int) ->+            (Visibility -> Visibility) ->+            (TypeExpr -> TypeExpr) ->+            (TRule -> TRule) -> TFuncDecl -> TFuncDecl+updTFunc fn fa fv ft fr = trTFunc func+ where+  func name arity vis t rule+    = TFunc (fn name) (fa arity) (fv vis) (ft t) (fr rule)++-- |update name of function+updTFuncName :: Update TFuncDecl QName+updTFuncName f = updTFunc f id id id id++-- |update arity of function+updTFuncArity :: Update TFuncDecl Int+updTFuncArity f = updTFunc id f id id id++-- |update visibility of function+updTFuncVisibility :: Update TFuncDecl Visibility+updTFuncVisibility f = updTFunc id id f id id++-- |update type of function+updFuncType :: Update TFuncDecl TypeExpr+updFuncType f = updTFunc id id id f id++-- |update rule of function+updTFuncTRule :: Update TFuncDecl TRule+updTFuncTRule = updTFunc id id id id++-- Auxiliary Functions++-- |is function public?+isPublicTFunc :: TFuncDecl -> Bool+isPublicTFunc = isPublic . tFuncVisibility++-- |is function externally defined?+isExternal :: TFuncDecl -> Bool+isExternal = isTRuleExternal . tFuncTRule++-- |get variable names in a function declaration+allVarsInTFunc :: TFuncDecl -> [(VarIndex, TypeExpr)]+allVarsInTFunc = allVarsInTRule . tFuncTRule++-- |get arguments of function, if not externally defined+tFuncArgs :: TFuncDecl -> [(VarIndex, TypeExpr)]+tFuncArgs = tRuleArgs . tFuncTRule++-- |get body of function, if not externally defined+tFuncBody :: TFuncDecl -> TExpr+tFuncBody = tRuleBody . tFuncTRule++-- |get the right-hand-sides of a 'FuncDecl'+tFuncRHS :: TFuncDecl -> [TExpr]+tFuncRHS f | not (isExternal f) = orCase (tFuncBody f)+           | otherwise = []+ where+  orCase e+    | isTOr e = concatMap orCase (orExps e)+    | isTCase e = concatMap (orCase . tBranchTExpr) (caseBranches e)+    | otherwise = [e]++-- |rename all variables in function+rnmAllVarsInTFunc :: Update TFuncDecl VarIndex+rnmAllVarsInTFunc = updTFunc id id id id . rnmAllVarsInTRule++-- |update all qualified names in function+updQNamesInTFunc :: Update TFuncDecl QName+updQNamesInTFunc f = updTFunc f id id (updQNamesInTypeExpr f) (updQNamesInTRule f)++-- |update arguments of function, if not externally defined+updTFuncArgs :: Update TFuncDecl [(VarIndex, TypeExpr)]+updTFuncArgs = updTFuncTRule . updTRuleArgs++-- |update body of function, if not externally defined+updTFuncBody :: Update TFuncDecl TExpr+updTFuncBody = updTFuncTRule . updTRuleBody++-- TRule ----------------------------------------------------------------------++-- |transform rule+trTRule :: ([(VarIndex, TypeExpr)] -> TExpr -> b) -> (TypeExpr -> String -> b) -> TRule -> b+trTRule rule _ (TRule args e) = rule args e+trTRule _ ext (TExternal ty s) = ext ty s++-- Selectors++-- |get rules arguments if it's not external+tRuleArgs :: TRule -> [(VarIndex, TypeExpr)]+tRuleArgs = trTRule const undefined++-- |get rules body if it's not external+tRuleBody :: TRule -> TExpr+tRuleBody = trTRule (\_ e -> e) undefined++-- |get rules external declaration+tRuleExtDecl :: TRule -> String+tRuleExtDecl = trTRule undefined (\_ s -> s)++-- Test Operations++-- |is rule external?+isTRuleExternal :: TRule -> Bool+isTRuleExternal = trTRule (\_ _ -> False) (\_ _ -> True)++-- Update Operations++-- |update rule+updTRule :: (TypeExpr -> TypeExpr) ->+            ([(VarIndex, TypeExpr)] -> [(VarIndex, TypeExpr)]) ->+            (TExpr -> TExpr) ->+            (String -> String) -> TRule -> TRule+updTRule fannot fa fe fs = trTRule rule ext+ where+  rule args e = TRule (fa args) (fe e)+  ext ty s = TExternal (fannot ty) (fs s)++-- |update rules TypeExpr+updTRuleType :: Update TRule TypeExpr+updTRuleType f = updTRule f id id id++-- |update rules arguments+updTRuleArgs :: Update TRule [(VarIndex, TypeExpr)]+updTRuleArgs f = updTRule id f id id++-- |update rules body+updTRuleBody :: Update TRule TExpr+updTRuleBody f = updTRule id id f id++-- |update rules external declaration+updTRuleExtDecl :: Update TRule String+updTRuleExtDecl = updTRule id id id++-- Auxiliary Functions++-- |get variable names in a functions rule+allVarsInTRule :: TRule -> [(VarIndex, TypeExpr)]+allVarsInTRule = trTRule (\args body -> args ++ allVars body) (\_ _ -> [])++-- |rename all variables in rule+rnmAllVarsInTRule :: Update TRule VarIndex+rnmAllVarsInTRule f = updTRule id (map (\(a, b) -> (f a, b))) (rnmAllVars f) id++-- |update all qualified names in rule+updQNamesInTRule :: Update TRule QName+updQNamesInTRule = updTRuleBody . updQNames++-- TExpr ----------------------------------------------------------------------++-- Selectors++-- |get internal number of variable+varNr :: TExpr -> VarIndex+varNr (TVarE _ n) = n+varNr _           = error "Curry.FlatCurry.Typed.Goodies.varNr: no variable"++-- |get literal if expression is literal expression+literal :: TExpr -> Literal+literal (TLit _ l) = l+literal _          = error "Curry.FlatCurry.Typed.Goodies.literal: no literal"++-- |get combination type of a combined expression+combType :: TExpr -> CombType+combType (TComb _ ct _ _) = ct+combType _                = error $ "Curry.FlatCurry.Typed.Goodies.combType: " +++                                    "no combined expression"++-- |get name of a combined expression+combName :: TExpr -> QName+combName (TComb _ _ name _) = name+combName _                  = error $ "Curry.FlatCurry.Typed.Goodies.combName: " +++                                      "no combined expression"++-- |get arguments of a combined expression+combArgs :: TExpr -> [TExpr]+combArgs (TComb _ _ _ args) = args+combArgs _                  = error $ "Curry.FlatCurry.Typed.Goodies.combArgs: " +++                                      "no combined expression"++-- |get number of missing arguments if expression is combined+missingCombArgs :: TExpr -> Int+missingCombArgs = missingArgs . combType+  where+  missingArgs :: CombType -> Int+  missingArgs = trCombType 0 id 0 id++-- |get indices of variables in let declaration+letBinds :: TExpr -> [((VarIndex, TypeExpr), TExpr)]+letBinds (TLet vs _) = vs+letBinds _           = error $ "Curry.FlatCurry.Typed.Goodies.letBinds: " +++                               "no let expression"++-- |get body of let declaration+letBody :: TExpr -> TExpr+letBody (TLet _ e) = e+letBody _          = error $ "Curry.FlatCurry.Typed.Goodies.letBody: " +++                             "no let expression"++-- |get variable indices from declaration of free variables+freeVars :: TExpr -> [(VarIndex, TypeExpr)]+freeVars (TFree vs _) = vs+freeVars _            = error $ "Curry.FlatCurry.Typed.Goodies.freeVars: " +++                                "no declaration of free variables"++-- |get expression from declaration of free variables+freeExpr :: TExpr -> TExpr+freeExpr (TFree _ e) = e+freeExpr _           = error $ "Curry.FlatCurry.Typed.Goodies.freeExpr: " +++                               "no declaration of free variables"++-- |get expressions from or-expression+orExps :: TExpr -> [TExpr]+orExps (TOr e1 e2) = [e1, e2]+orExps _           = error $ "Curry.FlatCurry.Typed.Goodies.orExps: " +++                             "no or expression"++-- |get case-type of case expression+caseType :: TExpr -> CaseType+caseType (TCase ct _ _) = ct+caseType _              = error $ "Curry.FlatCurry.Typed.Goodies.caseType: " +++                                  "no case expression"++-- |get scrutinee of case expression+caseExpr :: TExpr -> TExpr+caseExpr (TCase _ e _) = e+caseExpr _             = error $ "Curry.FlatCurry.Typed.Goodies.caseExpr: " +++                                   "no case expression"+++-- |get branch expressions from case expression+caseBranches :: TExpr -> [TBranchExpr]+caseBranches (TCase _ _ bs) = bs+caseBranches _              = error "Curry.FlatCurry.Typed.Goodies.caseBranches: no case expression"++-- Test Operations++-- |is expression a variable?+isTVarE :: TExpr -> Bool+isTVarE e = case e of+  TVarE _ _ -> True+  _ -> False++-- |is expression a literal expression?+isTLit :: TExpr -> Bool+isTLit e = case e of+  TLit _ _ -> True+  _ -> False++-- |is expression combined?+isTComb :: TExpr -> Bool+isTComb e = case e of+  TComb _ _ _ _ -> True+  _ -> False++-- |is expression a let expression?+isTLet :: TExpr -> Bool+isTLet e = case e of+  TLet _ _ -> True+  _ -> False++-- |is expression a declaration of free variables?+isTFree :: TExpr -> Bool+isTFree e = case e of+  TFree _ _ -> True+  _ -> False++-- |is expression an or-expression?+isTOr :: TExpr -> Bool+isTOr e = case e of+  TOr _ _ -> True+  _ -> False++-- |is expression a case expression?+isTCase :: TExpr -> Bool+isTCase e = case e of+  TCase _ _ _ -> True+  _ -> False++-- |transform expression+trTExpr  :: (TypeExpr -> VarIndex -> b)+         -> (TypeExpr -> Literal -> b)+         -> (TypeExpr -> CombType -> QName -> [b] -> b)+         -> ([((VarIndex, TypeExpr), b)] -> b -> b)+         -> ([(VarIndex, TypeExpr)] -> b -> b)+         -> (b -> b -> b)+         -> (CaseType -> b -> [c] -> b)+         -> (TPattern -> b -> c)+         -> (b -> TypeExpr -> b)+         -> TExpr+         -> b+trTExpr var lit comb lt fr oR cas branch typed expr = case expr of+  TVarE ty n            -> var ty n+  TLit ty l             -> lit ty l+  TComb ty ct name args -> comb ty ct name (map f args)+  TLet bs e             -> lt (map (\(v, x) -> (v, f x)) bs) (f e)+  TFree vs e            -> fr vs (f e)+  TOr e1 e2             -> oR (f e1) (f e2)+  TCase ct e bs         -> cas ct (f e) (map (\ (TBranch p e') -> branch p (f e')) bs)+  TTyped e ty           -> typed (f e) ty+  where+  f = trTExpr var lit comb lt fr oR cas branch typed++-- |update all variables in given expression+updVars :: (TypeExpr -> VarIndex -> TExpr) -> TExpr -> TExpr+updVars var = trTExpr var TLit TComb TLet TFree TOr TCase TBranch TTyped++-- |update all literals in given expression+updLiterals :: (TypeExpr -> Literal -> TExpr) -> TExpr -> TExpr+updLiterals lit = trTExpr TVarE lit TComb TLet TFree TOr TCase TBranch TTyped++-- |update all combined expressions in given expression+updCombs :: (TypeExpr -> CombType -> QName -> [TExpr] -> TExpr) -> TExpr -> TExpr+updCombs comb = trTExpr TVarE TLit comb TLet TFree TOr TCase TBranch TTyped++-- |update all let expressions in given expression+updLets :: ([((VarIndex, TypeExpr), TExpr)] -> TExpr -> TExpr) -> TExpr -> TExpr+updLets lt = trTExpr TVarE TLit TComb lt TFree TOr TCase TBranch TTyped++-- |update all free declarations in given expression+updFrees :: ([(VarIndex, TypeExpr)] -> TExpr -> TExpr) -> TExpr -> TExpr+updFrees fr = trTExpr TVarE TLit TComb TLet fr TOr TCase TBranch TTyped++-- |update all or expressions in given expression+updOrs :: (TExpr -> TExpr -> TExpr) -> TExpr -> TExpr+updOrs oR = trTExpr TVarE TLit TComb TLet TFree oR TCase TBranch TTyped++-- |update all case expressions in given expression+updCases :: (CaseType -> TExpr -> [TBranchExpr] -> TExpr) -> TExpr -> TExpr+updCases cas = trTExpr TVarE TLit TComb TLet TFree TOr cas TBranch TTyped++-- |update all case branches in given expression+updBranches :: (TPattern -> TExpr -> TBranchExpr) -> TExpr -> TExpr+updBranches branch = trTExpr TVarE TLit TComb TLet TFree TOr TCase branch TTyped++-- |update all typed expressions in given expression+updTypeds :: (TExpr -> TypeExpr -> TExpr) -> TExpr -> TExpr+updTypeds = trTExpr TVarE TLit TComb TLet TFree TOr TCase TBranch++-- Auxiliary Functions++-- |is expression a call of a function where all arguments are provided?+isFuncCall :: TExpr -> Bool+isFuncCall e = isTComb e && isCombTypeFuncCall (combType e)++-- |is expression a partial function call?+isFuncPartCall :: TExpr -> Bool+isFuncPartCall e = isTComb e && isCombTypeFuncPartCall (combType e)++-- |is expression a call of a constructor?+isConsCall :: TExpr -> Bool+isConsCall e = isTComb e && isCombTypeConsCall (combType e)++-- |is expression a partial constructor call?+isConsPartCall :: TExpr -> Bool+isConsPartCall e = isTComb e && isCombTypeConsPartCall (combType e)++-- |is expression fully evaluated?+isGround :: TExpr -> Bool+isGround e+  = case e of+      TComb _ ConsCall _ args -> all isGround args+      _ -> isTLit e++-- |get all variables (also pattern variables) in expression+allVars :: TExpr -> [(VarIndex, TypeExpr)]+allVars e = trTExpr var lit comb lt fr (.) cas branch typ e []+ where+  var a v = (:) (v, a)+  lit = const (const id)+  comb _ _ _ = foldr (.) id+  lt bs e' = e' . foldr (.) id (map (\(n,ns) -> (n:) . ns) bs)+  fr vs e' = (vs++) . e'+  cas _ e' bs = e' . foldr (.) id bs+  branch pat e' = (args pat ++) . e'+  typ = const+  args pat | isConsPattern pat = tPatArgs pat+           | otherwise = []++-- |rename all variables (also in patterns) in expression+rnmAllVars :: Update TExpr VarIndex+rnmAllVars f = trTExpr var TLit TComb lt fr TOr TCase branch TTyped+ where+   var a = TVarE a . f+   lt = TLet . map (\((n, b), e) -> ((f n, b), e))+   fr = TFree . map (\(b, c) -> (f b, c))+   branch = TBranch . updTPatArgs (map (\(a, b) -> (f a, b)))++-- |update all qualified names in expression+updQNames :: Update TExpr QName+updQNames f = trTExpr TVarE TLit comb TLet TFree TOr TCase branch TTyped+ where+  comb ty ct name args = TComb ty ct (f name) args+  branch = TBranch . updTPatCons f++-- TBranchExpr ----------------------------------------------------------------++-- |transform branch expression+trTBranch :: (TPattern -> TExpr -> b) -> TBranchExpr -> b+trTBranch branch (TBranch pat e) = branch pat e++-- Selectors++-- |get pattern from branch expression+tBranchTPattern :: TBranchExpr -> TPattern+tBranchTPattern = trTBranch const++-- |get expression from branch expression+tBranchTExpr :: TBranchExpr -> TExpr+tBranchTExpr = trTBranch (\_ e -> e)++-- Update Operations++-- |update branch expression+updTBranch :: (TPattern -> TPattern) -> (TExpr -> TExpr) -> TBranchExpr -> TBranchExpr+updTBranch fp fe = trTBranch branch+ where+  branch pat e = TBranch (fp pat) (fe e)++-- |update pattern of branch expression+updTBranchTPattern :: Update TBranchExpr TPattern+updTBranchTPattern f = updTBranch f id++-- |update expression of branch expression+updTBranchTExpr :: Update TBranchExpr TExpr+updTBranchTExpr = updTBranch id++-- TPattern -------------------------------------------------------------------++-- |transform pattern+trTPattern :: (TypeExpr -> QName -> [(VarIndex, TypeExpr)] -> b) -> (TypeExpr -> Literal -> b) -> TPattern -> b+trTPattern pattern _ (TPattern ty name args) = pattern ty name args+trTPattern _ lpattern (TLPattern a l) = lpattern a l++-- Selectors++-- |get name from constructor pattern+tPatCons :: TPattern -> QName+tPatCons = trTPattern (\_ name _ -> name) undefined++-- |get arguments from constructor pattern+tPatArgs :: TPattern -> [(VarIndex, TypeExpr)]+tPatArgs = trTPattern (\_ _ args -> args) undefined++-- |get literal from literal pattern+tPatLiteral :: TPattern -> Literal+tPatLiteral = trTPattern undefined (const id)++-- Test Operations++-- |is pattern a constructor pattern?+isConsPattern :: TPattern -> Bool+isConsPattern = trTPattern (\_ _ _ -> True) (\_ _ -> False)++-- Update Operations++-- |update pattern+updTPattern :: (TypeExpr -> TypeExpr) ->+               (QName -> QName) ->+               ([(VarIndex, TypeExpr)] -> [(VarIndex, TypeExpr)]) ->+               (Literal -> Literal) -> TPattern -> TPattern+updTPattern fannot fn fa fl = trTPattern pattern lpattern+ where+  pattern ty name args = TPattern (fannot ty) (fn name) (fa args)+  lpattern ty l = TLPattern (fannot ty) (fl l)++-- |update TypeExpr of pattern+updTPatType :: (TypeExpr -> TypeExpr) -> TPattern -> TPattern+updTPatType f = updTPattern f id id id++-- |update constructors name of pattern+updTPatCons :: (QName -> QName) -> TPattern -> TPattern+updTPatCons f = updTPattern id f id id++-- |update arguments of constructor pattern+updTPatArgs :: ([(VarIndex, TypeExpr)] -> [(VarIndex, TypeExpr)]) -> TPattern -> TPattern+updTPatArgs f = updTPattern id id f id++-- |update literal of pattern+updTPatLiteral :: (Literal -> Literal) -> TPattern -> TPattern+updTPatLiteral = updTPattern id id id++-- Auxiliary Functions++-- |build expression from pattern+tPatExpr :: TPattern -> TExpr+tPatExpr = trTPattern (\ty name -> TComb ty ConsCall name . map (uncurry (flip TVarE))) TLit
+ src/Curry/FlatCurry/Typed/Type.hs view
@@ -0,0 +1,83 @@+{- |+    Module      : $Header$+    Description : Representation of annotated FlatCurry.+    Copyright   : (c) 2016 - 2017 Finn Teegen+                      2018        Kai-Oliver Prott+    License     : BSD-3-clause++    Maintainer  : fte@informatik.uni-kiel.de+    Stability   : experimental+    Portability : portable+ +    This library contains a version of FlatCurry's abstract syntax tree+    modified with type information++    For more information about the abstract syntax tree of `FlatCurry`,+    see the documentation of the respective module.+-}++module Curry.FlatCurry.Typed.Type+  ( module Curry.FlatCurry.Typed.Type+  , module Curry.FlatCurry.Typeable+  , module Curry.FlatCurry.Type+  ) where++import Curry.FlatCurry.Typeable+import Curry.FlatCurry.Type ( QName, VarIndex, Visibility (..), TVarIndex+                            , TypeDecl (..), OpDecl (..), Fixity (..)+                            , TypeExpr (..), ConsDecl (..)+                            , Literal (..), CombType (..), CaseType (..)+                            )++data TProg = TProg String [String] [TypeDecl] [TFuncDecl] [OpDecl]+  deriving (Eq, Read, Show)++data TFuncDecl = TFunc QName Int Visibility TypeExpr TRule+  deriving (Eq, Read, Show)++data TRule+  = TRule     [(VarIndex, TypeExpr)] TExpr+  | TExternal TypeExpr String+  deriving (Eq, Read, Show)++data TExpr+  = TVarE  TypeExpr VarIndex -- otherwise name clash with TypeExpr's TVar+  | TLit   TypeExpr Literal+  | TComb  TypeExpr CombType QName [TExpr]+  | TLet   [((VarIndex, TypeExpr), TExpr)] TExpr+  | TFree  [(VarIndex, TypeExpr)] TExpr+  | TOr    TExpr TExpr+  | TCase  CaseType TExpr [TBranchExpr]+  | TTyped TExpr TypeExpr+  deriving (Eq, Read, Show)++data TBranchExpr = TBranch TPattern TExpr+  deriving (Eq, Read, Show)++data TPattern+  = TPattern  TypeExpr QName [(VarIndex, TypeExpr)]+  | TLPattern TypeExpr Literal+  deriving (Eq, Read, Show)++instance Typeable TRule where+  typeOf (TRule args e) = foldr (FuncType . snd) (typeOf e) args+  typeOf (TExternal ty _) = ty++instance Typeable TExpr where+  typeOf (TVarE ty _) = ty+  typeOf (TLit ty _) = ty+  typeOf (TComb  ty _ _ _) = ty+  typeOf (TLet _ e) = typeOf e+  typeOf (TFree _ e) = typeOf e+  typeOf (TOr e _) = typeOf e+  typeOf (TCase _ _ (e:_)) = typeOf e+  typeOf (TTyped _ ty) = ty+  typeOf (TCase _ _ []) = error $ "Curry.FlatCurry.Typed.Type.typeOf: " +++                                  "empty list in case expression"++instance Typeable TPattern where+  typeOf (TPattern ty _ _) = ty+  typeOf (TLPattern ty _) = ty++instance Typeable TBranchExpr where+  typeOf (TBranch _ e) = typeOf e
src/Curry/Syntax/Extension.hs view
@@ -50,8 +50,8 @@ -- |Classifies a 'String' as an 'Extension' classifyExtension :: Ident -> Extension classifyExtension i = case reads extName of-  [(e, "")] -> KnownExtension   (idPosition i) e-  _         -> UnknownExtension (idPosition i) extName+  [(e, "")] -> KnownExtension   (getPosition i) e+  _         -> UnknownExtension (getPosition i) extName   where extName = idName i  -- |'Extension's available by Kiel's Curry compilers.
src/Curry/Syntax/InterfaceEquivalence.hs view
@@ -175,29 +175,29 @@   fix tcs (IMethodDecl p f a qty) = IMethodDecl p f a (fix tcs qty)  instance FixInterface QualTypeExpr where-  fix tcs (QualTypeExpr cx ty) = QualTypeExpr (fix tcs cx) (fix tcs ty)+  fix tcs (QualTypeExpr spi cx ty) = QualTypeExpr spi (fix tcs cx) (fix tcs ty)  instance FixInterface Constraint where-  fix tcs (Constraint qcls ty) = Constraint qcls (fix tcs ty)+  fix tcs (Constraint spi qcls ty) = Constraint spi qcls (fix tcs ty)  instance FixInterface TypeExpr where-  fix tcs (ConstructorType tc)+  fix tcs (ConstructorType spi tc)     | not (isQualified tc) && not (isPrimTypeId tc) && tc' `Set.notMember` tcs-    = VariableType tc'-    | otherwise = ConstructorType tc+    = VariableType spi tc'+    | otherwise = ConstructorType spi tc     where tc' = unqualify tc-  fix tcs (ApplyType  ty1 ty2) = ApplyType (fix tcs ty1) (fix tcs ty2)-  fix tcs (VariableType    tv)-    | tv `Set.member` tcs = ConstructorType (qualify tv)-    | otherwise           = VariableType tv-  fix tcs (TupleType      tys) = TupleType (fix tcs tys)-  fix tcs (ListType        ty) = ListType  (fix tcs ty)-  fix tcs (ArrowType  ty1 ty2) = ArrowType (fix tcs ty1) (fix tcs ty2)-  fix tcs (ParenType       ty) = ParenType (fix tcs ty)-  fix tcs (ForallType   vs ty) = ForallType vs (fix tcs ty)+  fix tcs (ApplyType  spi ty1 ty2) = ApplyType spi (fix tcs ty1) (fix tcs ty2)+  fix tcs (VariableType    spi tv)+    | tv `Set.member` tcs = ConstructorType spi (qualify tv)+    | otherwise           = VariableType spi tv+  fix tcs (TupleType      spi tys) = TupleType spi (fix tcs tys)+  fix tcs (ListType        spi ty) = ListType  spi (fix tcs ty)+  fix tcs (ArrowType  spi ty1 ty2) = ArrowType spi (fix tcs ty1) (fix tcs ty2)+  fix tcs (ParenType       spi ty) = ParenType spi (fix tcs ty)+  fix tcs (ForallType   spi vs ty) = ForallType spi vs (fix tcs ty)  typeConstructors :: [IDecl] -> [Ident]-typeConstructors ds = [tc | (QualIdent Nothing tc) <- foldr tyCons [] ds]+typeConstructors ds = [tc | (QualIdent _ Nothing tc) <- foldr tyCons [] ds]   where tyCons (IInfixDecl          _ _ _ _) tcs = tcs         tyCons (HidingDataDecl     _ tc _ _) tcs = tc : tcs         tyCons (IDataDecl      _ tc _ _ _ _) tcs = tc : tcs
src/Curry/Syntax/Lexer.hs view
@@ -654,9 +654,15 @@ -- Lex an optionally qualified entity (identifier or symbol). lexOptQual :: (Token -> P a) -> Token -> [String] -> P a lexOptQual cont token mIdent sp cs@('.':c:s)-  | isAlpha  c       = lexQualIdent     cont identCont mIdent (nextSpan sp) (c:s)-  | isSymbolChar c   = lexQualSymbol    cont identCont mIdent (nextSpan sp) (c:s)+  | isAlpha  c                 = lexQualIdent cont identCont mIdent+                                   (nextSpan sp) (c:s)+  | isSymbolChar c && c /= '.' = lexQualSymbol cont identCont mIdent+                                   (nextSpan sp) (c:s) --   | c `elem` ":[("   = lexQualPrimitive cont token     mIdent (nextSpan sp) (c:s)+  where identCont _ _ = cont token sp cs+lexOptQual cont token mIdent sp cs@('.':'.':c:s)+  | isSymbolChar c =             lexQualSymbol cont identCont mIdent+                                   (nextSpan sp) ('.':c:s)   where identCont _ _ = cont token sp cs lexOptQual cont token _      sp cs = cont token sp cs 
src/Curry/Syntax/Parser.hs view
@@ -20,8 +20,10 @@  import Curry.Base.Ident import Curry.Base.Monad       (CYM)-import Curry.Base.Position    (Position)+import Curry.Base.Position    (Position(..), getPosition, setPosition, incr) import Curry.Base.LLParseComb+import Curry.Base.Span        hiding (file) -- clash with Position.file+import Curry.Base.SpanInfo  import Curry.Syntax.Extension import Curry.Syntax.Lexer (Token (..), Category (..), Attributes (..), lexer)@@ -29,13 +31,16 @@  -- |Parse a 'Module' parseSource :: FilePath -> String -> CYM (Module ())-parseSource fn-  = fullParser (uncurry <$> moduleHeader <*> layout moduleDecls) lexer fn+parseSource = fullParser (uncurry <$> moduleHeader <*> layout moduleDecls) lexer +-- TODO position on prefix parsers? -- |Parse only pragmas of a 'Module' parsePragmas :: FilePath -> String -> CYM (Module ()) parsePragmas-  = prefixParser ((\ps -> Module ps mainMIdent Nothing [] []) <$> modulePragmas)+  = prefixParser ((\ps sp -> setEndPosition NoPos+                              (Module (SpanInfo sp []) ps mainMIdent+                                 Nothing [] []))+                    <$> modulePragmas <*> spanPosition)       lexer  -- |Parse a 'Module' header@@ -58,42 +63,63 @@  -- |Parser for a module header moduleHeader :: Parser a Token ([ImportDecl] -> [Decl b] -> Module b)-moduleHeader = (\ps (m, es) -> Module ps m es)-           <$> modulePragmas-           <*> header-  where header = (,) <$-> token KW_module <*> modIdent-                     <*>  option exportSpec-                     <*-> expectWhere-                `opt` (mainMIdent, Nothing)+moduleHeader =+  (\sp ps (m, es, inf) is ds -> updateEndPos+      (Module (SpanInfo sp inf) ps m es is ds))+    <$> spanPosition+    <*> modulePragmas+    <*> header+  where header = (\sp1 m es sp2 -> (m, es, [sp1,sp2]))+                    <$>  tokenSpan KW_module+                    <*>  modIdent+                    <*>  option exportSpec+                    <*>  spanPosition+                    <*-> expectWhere+                `opt` (mainMIdent, Nothing, [])  modulePragmas :: Parser a Token [ModulePragma] modulePragmas = many (languagePragma <|> optionsPragma)  languagePragma :: Parser a Token ModulePragma-languagePragma =   LanguagePragma-              <$>  tokenPos PragmaLanguage-              <*>  (languageExtension `sepBy1` comma)-              <*-> token PragmaEnd+languagePragma =   languagePragma'+              <$>  tokenSpan PragmaLanguage+              <*>  (languageExtension `sepBy1Sp` comma)+              <*>  tokenSpan PragmaEnd   where languageExtension = classifyExtension <$> ident+        languagePragma' sp1 (ex, ss) sp2 = updateEndPos $+          LanguagePragma (SpanInfo sp1 (sp1 : ss ++ [sp2])) ex +-- TODO The span info is not 100% complete due to the lexer+-- combining OPTIONS, toolVal and toolArgs optionsPragma :: Parser a Token ModulePragma-optionsPragma = (\pos a -> OptionsPragma pos (fmap classifyTool $ toolVal a)-                                             (toolArgs a))-           <$>  position+optionsPragma = optionsPragma'+           <$>  spanPosition            <*>  token PragmaOptions-           <*-> token PragmaEnd+           <*>  tokenSpan PragmaEnd+  where optionsPragma' sp1 a sp2 = updateEndPos $+          OptionsPragma (SpanInfo sp1 [sp1, sp2])+                        (classifyTool <$> toolVal a)+                        (toolArgs a)  -- |Parser for an export specification exportSpec :: Parser a Token ExportSpec-exportSpec = Exporting <$> position <*> parens (export `sepBy` comma)+exportSpec = exportSpec' <$> spanPosition <*> parensSp (export `sepBySp` comma)+  where exportSpec' sp1 ((ex, ss),sp2,sp3) = updateEndPos $+          Exporting (SpanInfo sp1 (sp2:(ss ++ [sp3]))) ex  -- |Parser for an export item export :: Parser a Token Export-export =  qtycon <**> (parens spec `opt` Export)         -- type constructor-      <|> Export <$> qfun <\> qtycon                     -- fun-      <|> ExportModule <$-> token KW_module <*> modIdent -- module-  where spec =       ExportTypeAll  <$-> token DotDot-            <|> flip ExportTypeWith <$>  con `sepBy` comma+export =  qtycon <**> (tcExportWith <$> parensSp spec `opt` tcExport)+      <|> tcExport <$> qfun <\> qtycon+      <|> exportModule' <$> tokenSpan KW_module <*> modIdent+  where spec =  (\sp      -> (ExportTypeAll    , [sp])) <$> tokenSpan DotDot+            <|> (\(c, ss) -> (exportTypeWith' c,  ss )) <$> con `sepBySp` comma+        tcExport qtc = updateEndPos $ Export (fromSrcSpan (getSrcSpan qtc)) qtc+        tcExportWith ((spc, ss), sp1, sp2) qtc =+          updateEndPos $ setSrcInfoPoints (sp1 : (ss ++ [sp2])) $+          spc (fromSrcSpan (getSrcSpan qtc)) qtc+        exportTypeWith' c spi qtc = ExportTypeWith spi qtc c+        exportModule' sp = updateEndPos . ExportModule (SpanInfo sp [])  moduleDecls :: Parser a Token ([ImportDecl], [Decl ()]) moduleDecls = impDecl <$> importDecl@@ -103,24 +129,43 @@  -- |Parser for a single import declaration importDecl :: Parser a Token ImportDecl-importDecl =  flip . ImportDecl-          <$> tokenPos KW_import-          <*> flag (token Id_qualified)+importDecl =  importDecl'+          <$> tokenSpan KW_import+          <*> option (tokenSpan Id_qualified)           <*> modIdent-          <*> option (token Id_as <-*> modIdent)+          <*> option ((,) <$> tokenSpan Id_as <*> modIdent)           <*> option importSpec+  where+    importDecl' sp1 (Just sp2) mid (Just (sp3, alias)) = updateEndPos .+      ImportDecl (SpanInfo sp1 [sp1, sp2, sp3]) mid True  (Just alias)+    importDecl' sp1 Nothing    mid (Just (sp3, alias)) = updateEndPos .+      ImportDecl (SpanInfo sp1      [sp1, sp3]) mid False (Just alias)+    importDecl' sp1 (Just sp2) mid Nothing             = updateEndPos .+      ImportDecl (SpanInfo sp1      [sp1, sp2]) mid True  Nothing+    importDecl' sp1 Nothing    mid Nothing             = updateEndPos .+      ImportDecl (SpanInfo sp1           [sp1]) mid False Nothing  -- |Parser for an import specification importSpec :: Parser a Token ImportSpec-importSpec =   position-          <**> (Hiding <$-> token Id_hiding `opt` Importing)-          <*>  parens (spec `sepBy` comma)+importSpec =   spanPosition+          <**> (hiding' <$-> token Id_hiding `opt` importing')+          <*>  parensSp (importSp `sepBySp` comma)   where-  spec    =  tycon <**> (parens constrs `opt` Import)-         <|> Import <$> fun <\> tycon-  constrs =  ImportTypeAll       <$-> token DotDot-         <|> flip ImportTypeWith <$>  con `sepBy` comma+    hiding' sp1 ((specs, ss), sp2, sp3) = updateEndPos $+      Hiding    (SpanInfo sp1 (sp1 : sp2 : (ss ++ [sp3]))) specs+    importing' sp1 ((specs, ss), sp2, sp3) = updateEndPos $+      Importing (SpanInfo sp1 (      sp2 : (ss ++ [sp3]))) specs +importSp :: Parser a Token Import+importSp = tycon <**> (tcImportWith <$> parensSp spec `opt` tcImport)+      <|> tcImport <$> fun <\> tycon+  where spec =  (\sp      -> (ImportTypeAll    , [sp])) <$> tokenSpan DotDot+            <|> (\(c, ss) -> (importTypeWith' c,  ss )) <$> con `sepBySp` comma+        tcImport tc = updateEndPos $ Import (fromSrcSpan (getSrcSpan tc)) tc+        tcImportWith ((spc, ss), sp1, sp2) tc =+          updateEndPos $ setSrcInfoPoints (sp1 : (ss ++ [sp2])) $+          spc (fromSrcSpan (getSrcSpan tc)) tc+        importTypeWith' c spi tc = ImportTypeWith spi tc c -- --------------------------------------------------------------------------- -- Interfaces -- ---------------------------------------------------------------------------@@ -150,7 +195,8 @@  -- |Parser for an interface infix declaration iInfixDecl :: Parser a Token IDecl-iInfixDecl = infixDeclLhs IInfixDecl <*> integer <*> qfunop+iInfixDecl = infixDeclLhs iInfixDecl' <*> integer <*> qfunop+  where iInfixDecl' sp = IInfixDecl (span2Pos sp)  -- |Parser for an interface hiding declaration iHidingDecl :: Parser a Token IDecl@@ -159,7 +205,7 @@   hDataDecl = hiddenData <$-> token KW_data <*> withKind qtycon <*> many tyvar   hClassDecl = hiddenClass <$> classInstHead KW_class (withKind qtycls) clsvar   hiddenData (tc, k) tvs p = HidingDataDecl p tc k tvs-  hiddenClass (_, cx, (qcls, k), tv) p = HidingClassDecl p cx qcls k tv+  hiddenClass (_, _, cx, (qcls, k), tv) p = HidingClassDecl p cx qcls k tv  -- |Parser for an interface data declaration iDataDecl :: Parser a Token IDecl@@ -204,7 +250,8 @@  -- |Parser for an interface class declaration iClassDecl :: Parser a Token IDecl-iClassDecl = (\(p, cx, (qcls, k), tv) -> IClassDecl p cx qcls k tv)+iClassDecl = (\(sp, _, cx, (qcls, k), tv) ->+               IClassDecl (span2Pos sp) cx qcls k tv)         <$> classInstHead KW_class (withKind qtycls) clsvar         <*> braces (iMethod `sepBy` semicolon)         <*> iClassHidden@@ -223,7 +270,8 @@  -- |Parser for an interface instance declaration iInstanceDecl :: Parser a Token IDecl-iInstanceDecl = (\(p, cx, qcls, inst) -> IInstanceDecl p cx qcls inst)+iInstanceDecl = (\(sp, _, cx, qcls, inst) ->+                   IInstanceDecl (span2Pos sp) cx qcls inst)            <$> classInstHead KW_instance qtycls type2            <*> braces (iImpl `sepBy` semicolon)            <*> option iModulePragma@@ -248,113 +296,176 @@                  , infixDecl, functionDecl ]  dataDecl :: Parser a Token (Decl ())-dataDecl = typeDeclLhs DataDecl KW_data <*> constrs <*> deriv-  where constrs = equals <-*> constrDecl `sepBy1` bar `opt` []+dataDecl = combineWithSpans+             <$> typeDeclLhs dataDecl' KW_data+             <*> ((addSpan <$> tokenSpan Equals <*> constrs) `opt` ([],[]))+             <*> deriv+  where constrs = constrDecl `sepBy1Sp` bar+        dataDecl' sp = DataDecl (SpanInfo sp [sp])  externalDataDecl :: Parser a Token (Decl ())-externalDataDecl = decl <$> tokenPos KW_external <*> typeDeclLhs (,,) KW_data-  where decl p (_, tc, tvs) = ExternalDataDecl p tc tvs+externalDataDecl = decl <$> tokenSpan KW_external <*> typeDeclLhs (,,) KW_data+  where decl sp1 (sp2, tc, tvs) = updateEndPos $+          ExternalDataDecl (SpanInfo sp1 [sp1, sp2]) tc tvs  newtypeDecl :: Parser a Token (Decl ())-newtypeDecl = typeDeclLhs NewtypeDecl KW_newtype <*-> equals <*> newConstrDecl-                                                             <*> deriv+newtypeDecl = combineWithSpans+             <$> typeDeclLhs newtypeDecl' KW_newtype+             <*> ((\sp c -> (c, [sp]))  <$> tokenSpan Equals <*> newConstrDecl)+             <*> deriv+  where newtypeDecl' sp = NewtypeDecl (SpanInfo sp [sp]) +combineWithSpans :: HasSpanInfo a =>+                    (t1 -> t2 -> a) -> (t1, [Span]) -> (t2, [Span]) -> a+combineWithSpans df (cs, sps1) (cls, sps2)+  = updateEndPos $ setSrcInfoPoints (getSrcInfoPoints res ++ sps1 ++ sps2) res+  where res = df cs cls+ typeDecl :: Parser a Token (Decl ())-typeDecl = typeDeclLhs TypeDecl KW_type <*-> equals <*> type0+typeDecl = typeDeclLhs typeDecl' KW_type <*> tokenSpan Equals <*> type0+  where typeDecl' sp1 tyc tyv sp2 txp = updateEndPos $+          TypeDecl (SpanInfo sp1 [sp1, sp2]) tyc tyv txp -typeDeclLhs :: (Position -> Ident -> [Ident] -> a) -> Category+typeDeclLhs :: (Span -> Ident -> [Ident] -> a) -> Category             -> Parser b Token a-typeDeclLhs f kw = f <$> tokenPos kw <*> tycon <*> many anonOrTyvar+typeDeclLhs f kw = f <$> tokenSpan kw <*> tycon <*> many anonOrTyvar  constrDecl :: Parser a Token ConstrDecl-constrDecl = position <**> (existVars <**> optContext (flip ($)) constr)+constrDecl = spanPosition <**> (existVars+                          <**> optContext (\cx sp f -> f sp cx) constr)   where   constr =  conId     <**> identDecl-        <|> leftParen <-*> parenDecl+        <|> tokenSpan LeftParen <**> parenDecl         <|> type1 <\> conId <\> leftParen <**> opDecl   identDecl =  many type2 <**> (conType <$> opDecl `opt` conDecl)            <|> recDecl <$> recFields   parenDecl =  conOpDeclPrefix-           <$> conSym    <*-> rightParen <*> type2 <*> type2-           <|> tupleType <*-> rightParen <**> opDecl+           <$> conSym    <*>   tokenSpan RightParen <*> type2 <*> type2+           <|> tupleType <**> (tokenSpan RightParen <**> opDeclParen)   opDecl = conOpDecl <$> conop <*> type1-  recFields                        = layoutOff <-*> braces-                                       (fieldDecl `sepBy` comma)-  conType f tys c                  = f $ apply (ConstructorType $ qualify c) tys-  apply                            = foldl ApplyType-  conDecl tys c cx tvs p              = ConstrDecl p tvs cx c tys-  conOpDecl op ty2 ty1 cx tvs p       = ConOpDecl p tvs cx ty1 op ty2-  conOpDeclPrefix op ty1 ty2 cx tvs p = ConOpDecl p tvs cx ty1 op ty2-  recDecl fs c cx tvs p               = RecordDecl p tvs cx c fs+  opDeclParen = conOpDeclParen <$> conop <*> type1+  recFields = layoutOff <-*> bracesSp (fieldDecl `sepBySp` comma)+  conType f tys c = f $ foldl mkApply (mkConstructorType $ qualify c) tys+  mkApply t1 t2 = updateEndPos $ ApplyType (fromSrcSpan (getSrcSpan t1)) t1 t2+  mkConstructorType qid = ConstructorType (fromSrcSpan (getSrcSpan qid)) qid+  conDecl tys c ss1 cx (ss2, tvs) sp = updateEndPos $+    ConstrDecl (SpanInfo sp (ss2 ++ ss1)) tvs cx c tys+  conOpDecl op ty2 ty1 ss1 cx (ss2, tvs) sp = updateEndPos $+    ConOpDecl (SpanInfo sp (ss2 ++ ss1)) tvs cx ty1 op ty2+  conOpDeclParen op ty2 sp1 ty1 sp2 ss1 cx (ss2, tvs) sp5 = updateEndPos $+    ConOpDecl (SpanInfo sp5 (ss2 ++ ss1 ++ [sp2, sp1])) tvs cx ty1 op ty2+  conOpDeclPrefix op sp1 ty1 ty2 sp2 ss1 cx (ss2, tvs) sp3 = updateEndPos $+    ConOpDecl (SpanInfo sp3 (ss2 ++ ss1 ++ [sp2,sp1])) tvs cx ty1 op ty2+  recDecl ((fs, ss), sp1, sp2) c ss1 cx (ss2, tvs) sp3 = updateEndPos $+    RecordDecl (SpanInfo sp3 (ss2 ++ ss1 ++ (sp1: (ss ++ [sp2])))) tvs cx c fs  fieldDecl :: Parser a Token FieldDecl-fieldDecl = FieldDecl <$> position <*> labels <*-> token DoubleColon <*> type0-  where labels = fun `sepBy1` comma+fieldDecl = mkFieldDecl <$> spanPosition <*> labels+                        <*> tokenSpan DoubleColon <*> type0+  where labels = fun `sepBy1Sp` comma+        mkFieldDecl sp1 (idt,ss) sp2 ty = updateEndPos $+          FieldDecl (SpanInfo sp1 (ss ++ [sp2])) idt ty  newConstrDecl :: Parser a Token NewConstrDecl-newConstrDecl = position <**> (con <**> newConstr)+newConstrDecl = spanPosition <**> (con <**> newConstr)   where newConstr =  newConDecl <$> type2                  <|> newRecDecl <$> newFieldDecl-        newConDecl ty  c p = NewConstrDecl p c ty-        newRecDecl fld c p = NewRecordDecl p c fld+        newConDecl ty  c sp = updateEndPos $ NewConstrDecl (SpanInfo sp []) c ty+        newRecDecl ((idt, sp2, ty), sp3, sp4) c sp1 = updateEndPos $+          NewRecordDecl (SpanInfo sp1 [sp3,sp2,sp4]) c (idt, ty) -newFieldDecl :: Parser a Token (Ident, TypeExpr)-newFieldDecl = layoutOff <-*> braces labelDecl-  where labelDecl = (,) <$> fun <*-> token DoubleColon <*> type0+newFieldDecl :: Parser a Token ((Ident, Span, TypeExpr), Span, Span)+newFieldDecl = layoutOff <-*> bracesSp labelDecl+  where labelDecl = (,,) <$> fun <*> tokenSpan DoubleColon <*> type0 -deriv :: Parser a Token [QualIdent]-deriv = token KW_deriving <-*> classes `opt` []-  where classes =  return <$> qtycls-               <|> parens (qtycls `sepBy` comma)+deriv :: Parser a Token ([QualIdent], [Span])+deriv = (addSpan <$> tokenSpan KW_deriving <*> classes) `opt` ([], [])+  where classes = ((\q -> ([q], [])) <$> qtycls)+               <|> ((\sp1 (qs, ss) sp2 -> (qs, sp1 : (ss ++ [sp2])))+                      <$> tokenSpan LeftParen+                      <*> (qtycls `sepBySp` comma)+                      <*> tokenSpan RightParen)  -- Parsing of existential variables-existVars :: Parser a Token [Ident]-existVars = token Id_forall <-*> many1 tyvar <*-> dot `opt` []+existVars :: Parser a Token ([Span], [Ident])+existVars = mk <$> tokenSpan Id_forall <*> many1 tyvar <*>+                   tokenSpan SymDot+              `opt` ([],[])+  where mk sp1 a sp2 = ([sp1,sp2], a)  functionDecl :: Parser a Token (Decl ())-functionDecl = position <**> decl-  where decl = fun `sepBy1` comma <**> funListDecl <|?> funRule+functionDecl = spanPosition <**> decl+  where decl = fun `sepBy1Sp` comma <**> funListDecl <|?> funRule -funRule :: Parser a Token (Position -> Decl ())+funRule :: Parser a Token (Span -> Decl ()) funRule = mkFunDecl <$> lhs <*> declRhs-  where lhs = (\f -> (f, FunLhs f [])) <$> fun <|?> funLhs+  where lhs = (\f ->+                 (f, updateEndPos $ FunLhs (fromSrcSpan (getSrcSpan f)) f []))+                 <$> fun <|?> funLhs -funListDecl :: Parser a Token ([Ident] -> Position -> Decl ())-funListDecl = typeSig-          <|> flip ExternalDecl . map (Var ()) <$-> token KW_external+funListDecl :: Parser a Token (([Ident],[Span]) -> Span -> Decl ())+funListDecl = typeSig <|> mkExtFun <$> tokenSpan KW_external+  where mkExtFun sp1 (vs,ss) sp2 = updateEndPos $+          ExternalDecl (SpanInfo sp2 (ss++[sp1])) (map (Var ()) vs) -typeSig :: Parser a Token ([Ident] -> Position -> Decl ())-typeSig = sig <$-> token DoubleColon <*> qualType-  where sig qty vs p = TypeSig p vs qty -mkFunDecl :: (Ident, Lhs ()) -> Rhs () -> Position -> Decl ()-mkFunDecl (f, lhs) rhs' p = FunctionDecl p () f [Equation p lhs rhs']+typeSig :: Parser a Token (([Ident],[Span]) -> Span -> Decl ())+typeSig = sig <$> tokenSpan DoubleColon <*> qualType+  where sig sp1 qty (vs,ss) sp2 = updateEndPos $+          TypeSig (SpanInfo sp2 (ss++[sp1])) vs qty +mkFunDecl :: (Ident, Lhs ()) -> Rhs () -> Span -> Decl ()+mkFunDecl (f, lhs) rhs' p = updateEndPos $+    FunctionDecl (SpanInfo p []) () f [updateEndPos $+                                         Equation (SpanInfo p []) lhs rhs']+ funLhs :: Parser a Token (Ident, Lhs ()) funLhs = mkFunLhs    <$> fun      <*> many1 pattern2-    <|?> flip ($ id) <$> pattern1 <*> opLhs+    <|?> flip ($ updateEndPos) <$> pattern1 <*> opLhs     <|?> curriedLhs   where   opLhs  =                opLHS funSym (gConSym <\> funSym)-       <|> backquote <-*> opLHS (funId            <*-> expectBackquote)-                                (qConId <\> funId <*-> expectBackquote)-  opLHS funP consP = mkOpLhs    <$> funP  <*> pattern0-                 <|> mkInfixPat <$> consP <*> pattern1 <*> opLhs-  mkFunLhs f ts           = (f , FunLhs f ts)-  mkOpLhs op t2 f t1      = (op, OpLhs (f t1) op t2)-  mkInfixPat op t2 f g t1 = f (g . InfixPattern () t1 op) t2+       <|> tokenSpan Backquote <**>+             opLHSSp ((,) <$> funId            <*>  spanPosition+                                               <*-> expectBackquote)+                     ((,) <$> qConId <\> funId <*>  spanPosition+                                               <*-> expectBackquote)+  opLHS funP consP   = mkOpLhs       <$> funP  <*> pattern0+                    <|> mkInfixPat   <$> consP <*> pattern1 <*> opLhs+  opLHSSp funP consP = mkOpLhsSp     <$> funP  <*> pattern0+                    <|> mkInfixPatSp <$> consP <*> pattern1 <*> opLhs+  mkFunLhs f ts = (f , updateEndPos $ FunLhs (fromSrcSpan (getSrcSpan f)) f ts)+  mkOpLhs op t2 f t1      =+    let t1' = f t1+    in (op, updateEndPos $ OpLhs (fromSrcSpan (getSrcSpan t1')) t1' op t2)+  mkInfixPat op t2 f g t1 =+    f (g . InfixPattern (fromSrcSpan (getSrcSpan t1)) () t1 op) t2+  mkOpLhsSp (op, sp1)    t2   sp2 f t1 =+    let t1' = f t1+    in (op, updateEndPos $+              OpLhs (SpanInfo (getSrcSpan t1') [sp2, sp1]) t1' op t2) +  mkInfixPatSp (op, sp1) t2 g sp2 f t1 =+    g (f . InfixPattern (SpanInfo (getSrcSpan t1) [sp2, sp1]) () t1 op) t2++ curriedLhs :: Parser a Token (Ident, Lhs ())-curriedLhs = apLhs <$> parens funLhs <*> many1 pattern2-  where apLhs (f, lhs) ts = (f, ApLhs lhs ts)+curriedLhs = apLhs <$> parensSp funLhs <*> many1 pattern2+  where apLhs ((f, lhs), sp1, sp2) ts =+          let spi = fromSrcSpan sp1+          in (f, updateEndPos $ setSrcInfoPoints [sp1, sp2] $ ApLhs spi lhs ts)  declRhs :: Parser a Token (Rhs ()) declRhs = rhs equals  rhs :: Parser a Token b -> Parser a Token (Rhs ())-rhs eq = rhsExpr <*> localDecls-  where rhsExpr =  SimpleRhs  <$-> eq <*> position <*> expr-               <|> GuardedRhs <$>  many1 (condExpr eq)+rhs eq = rhsExpr <*> spanPosition <*> localDecls+  where rhsExpr =  mkSimpleRhs  <$> spanPosition <*-> eq <*> expr+               <|> mkGuardedRhs <$> spanPosition <*>  many1 (condExpr eq)+        mkSimpleRhs  sp1 e  sp2 ds = updateEndPos $+          SimpleRhs  (SpanInfo sp1 [sp2]) e  ds+        mkGuardedRhs sp1 ce sp2 ds = updateEndPos $+          GuardedRhs (SpanInfo sp1 [sp2]) ce ds  whereClause :: Parser a Token [b] -> Parser a Token [b] whereClause decls = token KW_where <-*> layout decls `opt` []@@ -366,83 +477,111 @@ valueDecls  = choice [infixDecl, valueDecl] `sepBy` semicolon  infixDecl :: Parser a Token (Decl ())-infixDecl = infixDeclLhs InfixDecl <*> option integer <*> funop `sepBy1` comma+infixDecl = infixDeclLhs infixDecl'+              <*> option ((,) <$> spanPosition <*> integer)+              <*> funop `sepBy1Sp` comma+  where infixDecl' sp1 inf (Just (sp2, pr)) (ids, ss) =+          updateEndPos $ InfixDecl (SpanInfo sp1 (sp1:sp2:ss)) inf (Just pr) ids+        infixDecl' sp1 inf Nothing          (ids, ss) =+          updateEndPos $ InfixDecl (SpanInfo sp1 (sp1    :ss)) inf Nothing   ids -infixDeclLhs :: (Position -> Infix -> a) -> Parser b Token a-infixDeclLhs f = f <$> position <*> tokenOps infixKW+infixDeclLhs :: (Span -> Infix -> a) -> Parser b Token a+infixDeclLhs f = f <$> spanPosition <*> tokenOps infixKW   where infixKW = [(KW_infix, Infix), (KW_infixl, InfixL), (KW_infixr, InfixR)]  valueDecl :: Parser a Token (Decl ())-valueDecl = position <**> decl+valueDecl = spanPosition <**> decl   where-  decl =   var `sepBy1` comma         <**> valListDecl+  decl =   var `sepBy1Sp` comma       <**> valListDecl       <|?> patOrFunDecl <$> pattern0   <*> declRhs       <|?> mkFunDecl    <$> curriedLhs <*> declRhs    valListDecl =  funListDecl-             <|> (flip FreeDecl . map (Var ())) <$-> token KW_free+             <|> mkFree <$> tokenSpan KW_free+    where mkFree sp1 (vs, ss) sp2 = updateEndPos $+            FreeDecl (SpanInfo sp2 (ss ++ [sp1])) (map (Var ()) vs) -  patOrFunDecl (ConstructorPattern _ c ts)-    | not (isConstrId c) = mkFunDecl (f, FunLhs f ts)+  patOrFunDecl (ConstructorPattern spi _ c ts)+    | not (isConstrId c) = mkFunDecl (f, FunLhs spi f ts)     where f = unqualify c-  patOrFunDecl t = patOrOpDecl id t+  patOrFunDecl t = patOrOpDecl updateEndPos t -  patOrOpDecl f (InfixPattern a t1 op t2)-    | isConstrId op = patOrOpDecl (f . InfixPattern a t1 op) t2-    | otherwise     = mkFunDecl (op', OpLhs (f t1) op' t2)+  patOrOpDecl f (InfixPattern spi a t1 op t2)+    | isConstrId op = patOrOpDecl (f . InfixPattern spi a t1 op) t2+    | otherwise     = mkFunDecl (op', updateEndPos $ OpLhs spi (f t1) op' t2)     where op' = unqualify op   patOrOpDecl f t = mkPatDecl (f t) -  mkPatDecl t rhs' p = PatternDecl p t rhs'+  mkPatDecl t rhs' sp = updateEndPos $ PatternDecl (fromSrcSpan sp) t rhs'    isConstrId c = c == qConsId || isQualified c || isQTupleId c  defaultDecl :: Parser a Token (Decl ())-defaultDecl = DefaultDecl <$> position <*-> token KW_default-                          <*> parens (type0 `sepBy` comma)+defaultDecl = mkDefaultDecl <$> tokenSpan KW_default+                            <*> parensSp (type0 `sepBySp` comma)+  where mkDefaultDecl sp1 ((ty, ss), sp2, sp3) = updateEndPos $+          DefaultDecl (SpanInfo sp1 (sp1 : sp2 : (ss ++ [sp3]))) ty  classInstHead :: Category -> Parser a Token b -> Parser a Token c-              -> Parser a Token (Position, Context, b, c)-classInstHead kw cls ty = f <$> tokenPos kw-                            <*> optContext (,) ((,) <$> cls <*> ty)-  where f p (cx, (cls', ty')) = (p, cx, cls', ty')+              -> Parser a Token (Span, [Span], Context, b, c)+classInstHead kw cls ty = f <$> tokenSpan kw+                            <*> optContext (,,) ((,) <$> cls <*> ty)+  where f sp (cx, ss, (cls', ty')) = (sp, ss, cx, cls', ty')  classDecl :: Parser a Token (Decl ())-classDecl = (\(p, cx, cls, tv) -> ClassDecl p cx cls tv)+classDecl = (\(sp1, ss, cx, cls, tv) sp2 -> updateEndPos .+                ClassDecl (SpanInfo sp1 (sp1 : (ss ++ [sp2]))) cx cls tv)         <$> classInstHead KW_class tycls clsvar+        <*> spanPosition         <*> whereClause innerDecls   where   innerDecls = innerDecl `sepBy` semicolon   --TODO: Refactor by left-factorization   --TODO: Support infixDecl-  innerDecl = foldr1 (<|?>) [ position <**> (fun `sepBy1` comma <**> typeSig)-                            , position <**> funRule+  innerDecl = foldr1 (<|?>)+    [ spanPosition <**> (fun `sepBy1Sp` comma <**> typeSig)+    , spanPosition <**> funRule                             {-, infixDecl-} ]  instanceDecl :: Parser a Token (Decl ())-instanceDecl = (\(p, cx, qcls, inst) -> InstanceDecl p cx qcls inst)+instanceDecl = (\(sp1, ss, cx, qcls, inst) sp2 ->  updateEndPos .+                   InstanceDecl (SpanInfo sp1 (sp1 : (ss ++ [sp2]))) cx qcls inst)            <$> classInstHead KW_instance qtycls type2+           <*> spanPosition            <*> whereClause innerDecls   where-  innerDecls = (position <**> funRule) `sepBy` semicolon-+  innerDecls = (spanPosition <**> funRule) `sepBy` semicolon -- --------------------------------------------------------------------------- -- Type classes -- --------------------------------------------------------------------------- -optContext :: (Context -> a -> b) -> Parser c Token a -> Parser c Token b-optContext f p = f <$> context <*-> token DoubleArrow <*> p-            <|?> f [] <$> p+optContext :: (Context -> [Span] -> a -> b)+           -> Parser c Token a+           -> Parser c Token b+optContext f p = combine <$> context <*> tokenSpan DoubleArrow <*> p+            <|?> f [] [] <$> p+  where combine (ctx, ss) sp = f ctx (ss ++ [sp]) -context :: Parser a Token Context-context = return <$> constraint-      <|> parens (constraint `sepBy` comma)+context :: Parser a Token (Context, [Span])+context = (\c -> ([c], [])) <$> constraint+      <|> combine <$> parensSp (constraint `sepBySp` comma)+  where combine ((ctx, ss), sp1, sp2) = (ctx, sp1 : (ss ++ [sp2])) +-- TODO: ??? constraint :: Parser a Token Constraint-constraint = Constraint <$> qtycls <*> conType-  where varType = VariableType <$> clsvar-        conType = varType-              <|> parens (foldl ApplyType <$> varType <*> many1 type2)+constraint = mkConstraint <$> spanPosition <*> qtycls <*> conType+  where varType = mkVariableType <$> spanPosition <*> clsvar+        conType = fmap ((,) []) varType+               <|> mk <$> parensSp+                            (foldl mkApplyType <$> varType <*> many1 type2)+        mkConstraint sp qtc (ss, ty) = updateEndPos $+          Constraint (SpanInfo sp ss) qtc ty+        mkVariableType sp = VariableType (fromSrcSpan sp)+        mkApplyType t1 t2 =+          ApplyType (fromSrcSpan (combineSpans (getSrcSpan t1)+                                               (getSrcSpan t2)))+                    t1 t2+        mk (a, sp1, sp2) = ([sp1, sp2], a)  -- --------------------------------------------------------------------------- -- Kinds@@ -469,15 +608,21 @@  -- qualType ::= [context '=>']  type0 qualType :: Parser a Token QualTypeExpr-qualType = optContext QualTypeExpr type0+qualType = mkQualTypeExpr <$> spanPosition <*> optContext (,,) type0+  where mkQualTypeExpr sp (cx, ss, ty) = updateEndPos $+          QualTypeExpr (SpanInfo sp ss) cx ty  -- type0 ::= type1 ['->' type0] type0 :: Parser a Token TypeExpr-type0 = type1 `chainr1` (ArrowType <$-> token RightArrow)+type0 = type1 `chainr1` (mkArrowType <$> tokenSpan RightArrow)+  where mkArrowType sp ty1 ty2 = updateEndPos $+          ArrowType (SpanInfo (getSrcSpan ty1) [sp]) ty1 ty2  -- type1 ::= [type1] type2 type1 :: Parser a Token TypeExpr-type1 = foldl1 ApplyType <$> many1 type2+type1 = foldl1 mkApplyType <$> many1 type2+  where mkApplyType ty1 ty2 = updateEndPos $+          ApplyType (fromSrcSpan (getSrcSpan ty1)) ty1 ty2  -- type2 ::= anonType | identType | parenType | bracketType type2 :: Parser a Token TypeExpr@@ -485,16 +630,19 @@  -- anonType ::= '_' anonType :: Parser a Token TypeExpr-anonType = VariableType <$> anonIdent+anonType = mkVariableType <$> spanPosition <*> anonIdent+  where mkVariableType sp = VariableType (fromSrcSpan sp)  -- identType ::= <identifier> identType :: Parser a Token TypeExpr-identType = VariableType <$> tyvar-        <|> ConstructorType <$> qtycon <\> tyvar+identType =  mkVariableType    <$> spanPosition <*> tyvar+         <|> mkConstructorType <$> spanPosition <*> qtycon <\> tyvar+  where mkVariableType    sp = VariableType    (fromSrcSpan sp)+        mkConstructorType sp = ConstructorType (fromSrcSpan sp)  -- parenType ::= '(' tupleType ')' parenType :: Parser a Token TypeExpr-parenType = parens tupleType+parenType = fmap updateSpanWithBrackets (parensSp tupleType)  -- tupleType ::= type0                         (parenthesized type) --            |  type0 ',' type0 { ',' type0 } (tuple type)@@ -502,20 +650,26 @@ --            |  ',' { ',' }                   (tuple type constructor) --            |                                (unit type) tupleType :: Parser a Token TypeExpr-tupleType = type0 <**> (tuple <$> many1 (comma <-*> type0) `opt` ParenType)-        <|> token RightArrow <-*> succeed (ConstructorType qArrowId)-        <|> ConstructorType . qTupleId . (+1) . length <$> many1 comma-        <|> succeed (ConstructorType qUnitId)-  where tuple tys ty = TupleType (ty : tys)+tupleType = type0 <**> (mkTuple <$> many1 ((,) <$> tokenSpan Comma <*> type0)+                          `opt` ParenType NoSpanInfo)+        <|> tokenSpan RightArrow <**> succeed (mkConstructorType qArrowId)+        <|> mkConstructorTupleType <$> many1 (tokenSpan Comma)+        <|> succeed (ConstructorType NoSpanInfo qUnitId)+  where mkTuple stys ty = let (ss, tys) = unzip stys+                          in TupleType (fromSrcInfoPoints ss) (ty : tys)+        mkConstructorType qid sp = ConstructorType (fromSrcInfoPoints [sp]) qid+        mkConstructorTupleType ss = ConstructorType (fromSrcInfoPoints ss)+                                                    (qTupleId (length ss + 1))  -- bracketType ::= '[' listType ']' bracketType :: Parser a Token TypeExpr-bracketType = brackets listType+bracketType = fmap updateSpanWithBrackets (bracketsSp listType)  -- listType ::= type0 (list type) --           |        (list type constructor) listType :: Parser a Token TypeExpr-listType = ListType <$> type0 `opt` (ConstructorType qListId)+listType = ListType NoSpanInfo <$> type0+             `opt` ConstructorType NoSpanInfo qListId  -- --------------------------------------------------------------------------- -- Literals@@ -537,7 +691,11 @@  -- pattern0 ::= pattern1 [ gconop pattern0 ] pattern0 :: Parser a Token (Pattern ())-pattern0 = pattern1 `chainr1` (flip (InfixPattern ()) <$> gconop)+pattern0 = pattern1 `chainr1` (mkInfixPattern <$> gconop)+  where mkInfixPattern qid p1 p2 =+          InfixPattern (fromSrcSpan (combineSpans (getSrcSpan p1)+                                                  (getSrcSpan p2)))+            () p1 qid p2  -- pattern1 ::= varId --           |  QConId { pattern2 }@@ -546,10 +704,10 @@ --           |  '(' parenPattern' --           | pattern2 pattern1 :: Parser a Token (Pattern ())-pattern1 =  varId <**> identPattern'            -- unqualified+pattern1 = varId <**> identPattern'            -- unqualified         <|> qConId <\> varId <**> constrPattern -- qualified-        <|> minus     <-*> negNum-        <|> leftParen <-*> parenPattern'+        <|> mkNegNum <$> minus <*> negNum+        <|> tokenSpan LeftParen <**> parenPattern'         <|> pattern2  <\> qConId <\> leftParen   where   identPattern' =  optAsRecPattern@@ -558,28 +716,38 @@   constrPattern =  mkConsPattern id <$> many1 pattern2                <|> optRecPattern -  mkConsPattern f ts c = ConstructorPattern () (f c) ts    parenPattern' =  minus <**> minusPattern-               <|> gconPattern-               <|> funSym <\> minus <*-> rightParen <**> identPattern'-               <|> parenTuplePattern <\> minus <*-> rightParen-  minusPattern = rightParen         <-*> identPattern'-              <|> parenMinusPattern <*-> rightParen-  gconPattern = ConstructorPattern () <$> gconId <*-> rightParen-                                      <*> many pattern2+      <|> mkGconPattern <$> gconId <*> tokenSpan RightParen <*> many pattern2+      <|> mkFunIdentP <$> funSym <\> minus <*> tokenSpan RightParen+                                           <*> identPattern'+      <|> mkParenTuple <$> parenTuplePattern <\> minus <*> tokenSpan RightParen+  minusPattern = flip mkParenMinus <$> tokenSpan RightParen <*> identPattern'+         <|> mkParenMinus <$> parenMinusPattern <*> tokenSpan RightParen +  mkNegNum idt p = setEndPosition (end (getSrcSpan idt)) p+  mkParenTuple p sp1 sp2 =+    setSpanInfo (SpanInfo (combineSpans sp2 sp1) [sp2, sp1]) p+  mkFunIdentP idt sp1 f sp2 = setSrcSpan (combineSpans sp2 sp1) (f idt)+  mkParenMinus f sp1 idt sp2 = setSrcSpan (combineSpans sp2 sp1) (f idt)+  mkConsPattern f ts c = updateEndPos $+    ConstructorPattern (fromSrcSpan (getSrcSpan (f c))) () (f c) ts+  mkGconPattern qid sp1 ps sp2 = updateEndPos $+    ConstructorPattern (SpanInfo (getSrcSpan qid) [sp2,sp1]) () qid ps+ pattern2 :: Parser a Token (Pattern ()) pattern2 =  literalPattern <|> anonPattern <|> identPattern         <|> parenPattern   <|> listPattern <|> lazyPattern  -- literalPattern ::= <integer> | <char> | <float> | <string> literalPattern :: Parser a Token (Pattern ())-literalPattern = LiteralPattern () <$> literal+literalPattern = flip LiteralPattern () <$> fmap fromSrcSpan spanPosition+                                        <*> literal  -- anonPattern ::= '_' anonPattern :: Parser a Token (Pattern ())-anonPattern = VariablePattern () <$> anonIdent+anonPattern = flip VariablePattern () <$> fmap fromSrcSpan spanPosition+                                      <*> anonIdent  -- identPattern ::= Variable [ '@' pattern2 | '{' fields '}' --               |  qConId   [ '{' fields '}' ]@@ -589,31 +757,54 @@  -- TODO: document me! parenPattern :: Parser a Token (Pattern ())-parenPattern = leftParen <-*> parenPattern'+parenPattern = tokenSpan LeftParen <**> parenPattern'   where   parenPattern' = minus <**> minusPattern-              <|> flip (ConstructorPattern ()) [] <$> gconId <*-> rightParen-              <|> funSym <\> minus <*-> rightParen <**> optAsRecPattern-              <|> parenTuplePattern <\> minus <*-> rightParen-  minusPattern = rightParen <-*> optAsRecPattern-              <|> parenMinusPattern <*-> rightParen+      <|> mkConstructorPattern <$> gconId <*> tokenSpan RightParen+      <|> mkFunAsRec <$> funSym <\> minus <*> tokenSpan RightParen+                     <*> optAsRecPattern+      <|> mkParenTuple <$> parenTuplePattern <\> minus <*> tokenSpan RightParen+  minusPattern = mkOptAsRec <$> tokenSpan RightParen <*> optAsRecPattern+      <|> mkParen <$> parenMinusPattern <*> tokenSpan RightParen +  mkConstructorPattern qid sp1 sp2 =+    ConstructorPattern (fromSrcSpan (combineSpans sp2 sp1)) () qid []+  mkFunAsRec = flip (flip . mkOptAsRec)+  mkParenTuple p sp1 sp2 =+    let ss  = getSrcInfoPoints p+        spi = SpanInfo (combineSpans sp2 sp1) (sp2 : (ss ++ [sp1]))+    in setSpanInfo spi p+  mkOptAsRec sp1 f idt sp2 =+    let p   = f idt+        ss  = getSrcInfoPoints p+        spi = SpanInfo (combineSpans sp2 sp1) ([sp2, sp1] ++ ss)+    in setSpanInfo spi p+  mkParen f sp1 idt sp2 =+    let p   = f idt+        ss  = getSrcInfoPoints p+        spi = SpanInfo (combineSpans sp2 sp1) (sp2 : (ss ++ [sp1]))+    in setSpanInfo spi p+ -- listPattern ::= '[' pattern0s ']' -- pattern0s   ::= {- empty -} --              |  pattern0 ',' pattern0s listPattern :: Parser a Token (Pattern ())-listPattern = ListPattern () <$> brackets (pattern0 `sepBy` comma)+listPattern = mkListPattern <$> bracketsSp (pattern0 `sepBySp` comma)+  where mkListPattern ((ps, ss), sp1, sp2) = updateEndPos $+          ListPattern (SpanInfo sp1 (sp1 : (ss ++ [sp2]))) () ps  -- lazyPattern ::= '~' pattern2 lazyPattern :: Parser a Token (Pattern ())-lazyPattern = LazyPattern <$-> token Tilde <*> pattern2+lazyPattern = mkLazyPattern <$> tokenSpan Tilde <*> pattern2+  where mkLazyPattern sp p = updateEndPos $ LazyPattern (SpanInfo sp [sp]) p  -- optRecPattern ::= [ '{' fields '}' ] optRecPattern :: Parser a Token (QualIdent -> Pattern ())-optRecPattern = mkRecPattern <$> fields pattern0 `opt` mkConPattern+optRecPattern = mkRecordPattern <$> fieldsSp pattern0 `opt` mkConPattern   where-  mkRecPattern fs c = RecordPattern () c fs-  mkConPattern c    = ConstructorPattern () c []+  mkRecordPattern ((fs, ss), sp1, sp2) c = updateEndPos $+    RecordPattern (SpanInfo (getSrcSpan c) (sp1 : (ss ++ [sp2]))) () c fs+  mkConPattern c = ConstructorPattern (fromSrcSpan (getSrcSpan c)) () c []  -- --------------------------------------------------------------------------- -- Partial patterns used in the combinators above, but also for parsing@@ -624,31 +815,47 @@ gconId = colon <|> tupleCommas  negNum :: Parser a Token (Pattern ())-negNum = NegativePattern ()-         <$> (Int <$> integer <|> Float <$> float)+negNum = mkNegativePattern <$> spanPosition <*>+                             (Int <$> integer <|> Float <$> float)+  where mkNegativePattern sp = NegativePattern (fromSrcSpan sp) ()  optAsRecPattern :: Parser a Token (Ident -> Pattern ())-optAsRecPattern =  flip AsPattern <$-> token At <*> pattern2-               <|> recPattern     <$>  fields pattern0-               `opt` VariablePattern ()-  where recPattern fs v = RecordPattern () (qualify v) fs+optAsRecPattern =  mkAsPattern     <$> tokenSpan At <*> pattern2+               <|> mkRecordPattern <$> fieldsSp pattern0+               `opt` mkVariablePattern+  where mkRecordPattern ((fs,ss),sp1,sp2) v =+          let s = getPosition v+              e = end sp2+              f = file s+              spi = SpanInfo (Span f s e) (sp1 : (ss ++ [sp2]))+          in updateEndPos $ RecordPattern spi () (qualify v) fs+        mkAsPattern sp p idt =+          AsPattern (SpanInfo (getSrcSpan idt) [sp]) idt p+        mkVariablePattern idt =+          VariablePattern (fromSrcSpan (getSrcSpan idt)) () idt  optInfixPattern :: Parser a Token (Pattern () -> Pattern ()) optInfixPattern = mkInfixPat <$> gconop <*> pattern0             `opt` id-  where mkInfixPat op t2 t1 = InfixPattern () t1 op t2+  where mkInfixPat op t2 t1 =+          let s = getPosition t1+              e = getSrcSpanEnd t2+              f = file s+          in InfixPattern (fromSrcSpan (Span f s e)) () t1 op t2  optTuplePattern :: Parser a Token (Pattern () -> Pattern ())-optTuplePattern = tuple <$> many1 (comma <-*> pattern0)-            `opt` ParenPattern-  where tuple ts t = TuplePattern (t:ts)+optTuplePattern = mkTuple <$> many1 ((,) <$> tokenSpan Comma <*> pattern0)+            `opt` ParenPattern NoSpanInfo+  where mkTuple ts t = let (ss, ps) = unzip ts+                       in TuplePattern (fromSrcInfoPoints ss) (t:ps)  parenMinusPattern :: Parser a Token (Ident -> Pattern ())-parenMinusPattern = const <$> negNum <.> optInfixPattern <.> optTuplePattern+parenMinusPattern = mkNeg <$> negNum <.> optInfixPattern <.> optTuplePattern+  where mkNeg neg idt = setEndPosition (end (getSrcSpan idt)) neg  parenTuplePattern :: Parser a Token (Pattern ()) parenTuplePattern = pattern0 <**> optTuplePattern-              `opt` ConstructorPattern () qUnitId []+              `opt` ConstructorPattern NoSpanInfo () qUnitId []  -- --------------------------------------------------------------------------- -- Expressions@@ -663,124 +870,196 @@ -- @ -- can not be parsed with a limited parser lookahead. condExpr :: Parser a Token b -> Parser a Token (CondExpr ())-condExpr eq = CondExpr <$> position <*-> bar <*> expr0 <*-> eq <*> expr+condExpr eq = mkCondExpr <$> spanPosition <*-> bar <*> expr0+                         <*> spanPosition <*-> eq  <*> expr+  where mkCondExpr sp1 e1 sp2 e2 = updateEndPos $+          CondExpr (SpanInfo sp1 [sp1, sp2]) e1 e2  -- expr ::= expr0 [ '::' type0 ] expr :: Parser a Token (Expression ())-expr = expr0 <??> (flip Typed <$-> token DoubleColon <*> qualType)+expr = expr0 <??> (mkTyped <$> tokenSpan DoubleColon <*> qualType)+  where mkTyped sp qty e = updateEndPos $ setSrcSpan (getSrcSpan e) $+          Typed (fromSrcInfoPoints [sp]) e qty  -- expr0 ::= expr1 { infixOp expr1 } expr0 :: Parser a Token (Expression ())-expr0 = expr1 `chainr1` (flip InfixApply <$> infixOp)+expr0 = expr1 `chainr1` (mkInfixApply <$> infixOp)+  where mkInfixApply op e1 e2 = InfixApply+          (fromSrcSpan (combineSpans (getSrcSpan e1) (getSrcSpan e2))) e1 op e2  -- expr1 ::= - expr2 | -. expr2 | expr2 expr1 :: Parser a Token (Expression ())-expr1 =  UnaryMinus <$-> minus <*> expr2+expr1 =  mkUnaryMinus <$> minus <*> expr2      <|> expr2+  where mkUnaryMinus idt ex =+          let p = getPosition idt+              e = getSrcSpanEnd ex+              f = file p+          in UnaryMinus (SpanInfo (Span f p e) [Span f p (incr p 1)]) ex  -- expr2 ::= lambdaExpr | letExpr | doExpr | ifExpr | caseExpr | expr3 expr2 :: Parser a Token (Expression ()) expr2 = choice [ lambdaExpr, letExpr, doExpr, ifExpr, caseExpr-               , foldl1 Apply <$> many1 expr3+               , foldl1 mkApply <$> many1 expr3                ]+  where mkApply e1 e2 = updateEndPos $ Apply (fromSrcSpan (getSrcSpan e1)) e1 e2  expr3 :: Parser a Token (Expression ())-expr3 = foldl RecordUpdate <$> expr4 <*> many recUpdate-  where recUpdate = layoutOff <-*> braces (field expr0 `sepBy1` comma)+expr3 = foldl mkRecordUpdate <$> expr4 <*> many recUpdate+  where recUpdate = layoutOff <-*> bracesSp (field expr0 `sepBy1Sp` comma)+        mkRecordUpdate e ((fs,ss), sp1, sp2) = updateEndPos $+          setSrcInfoPoints (sp1 : (ss ++ [sp2])) $+          RecordUpdate (fromSrcSpan (getSrcSpan e)) e fs  expr4 :: Parser a Token (Expression ()) expr4 = choice   [constant, anonFreeVariable, variable, parenExpr, listExpr]  constant :: Parser a Token (Expression ())-constant = Literal () <$> literal+constant = mkLiteral <$> spanPosition <*> literal+  where mkLiteral sp = Literal (fromSrcSpan sp) ()  anonFreeVariable :: Parser a Token (Expression ())-anonFreeVariable =  (\ p v -> Variable () $ qualify $ addPositionIdent p v)+anonFreeVariable =  (\ p v -> mkVariable $ qualify $ addPositionIdent p v)                 <$> position <*> anonIdent+  where mkVariable qid = Variable (fromSrcSpan (getSrcSpan qid)) () qid  variable :: Parser a Token (Expression ()) variable = qFunId <**> optRecord-  where optRecord = flip (Record ()) <$> fields expr0 `opt` Variable ()+  where optRecord = mkRecord <$> fieldsSp expr0 `opt` mkVariable+        mkRecord ((fs,ss), sp1, sp2) qid =+          let spi = SpanInfo (getSrcSpan qid) (sp1 : (ss ++ [sp2]))+          in updateEndPos $ Record spi () qid fs+        mkVariable qid = Variable (fromSrcSpan (getSrcSpan qid)) () qid  parenExpr :: Parser a Token (Expression ())-parenExpr = parens pExpr+parenExpr = fmap updateSpanWithBrackets (parensSp pExpr)   where   pExpr = minus <**> minusOrTuple-      <|> Constructor () <$> tupleCommas+      <|> mkConstructor () <$> tupleCommas       <|> leftSectionOrTuple <\> minus       <|> opOrRightSection <\> minus-      `opt` Constructor () qUnitId-  minusOrTuple = const . UnaryMinus <$> expr1 <.> infixOrTuple-            `opt` Variable () . qualify+      `opt` Constructor (fromSrcInfoPoints []) () qUnitId+  minusOrTuple = mkUnaryMinus <$> expr1 <.> infixOrTuple+            `opt` mkVariable . qualify   leftSectionOrTuple = expr1 <**> infixOrTuple-  infixOrTuple = ($ id) <$> infixOrTuple'+  infixOrTuple = ($ updateEndPos) <$> infixOrTuple'   infixOrTuple' = infixOp <**> leftSectionOrExp               <|> (.) <$> (optType <.> tupleExpr)   leftSectionOrExp = expr1 <**> (infixApp <$> infixOrTuple')                 `opt` leftSection-  optType   = flip Typed <$-> token DoubleColon <*> qualType `opt` id-  tupleExpr = tuple <$> many1 (comma <-*> expr) `opt` Paren+  optType   = mkTyped <$> tokenSpan DoubleColon <*> qualType `opt` id+  tupleExpr = mkTuple <$> many1 ((,) <$> tokenSpan Comma <*> expr)+               `opt` Paren NoSpanInfo   opOrRightSection =  qFunSym <**> optRightSection                   <|> colon   <**> optCRightSection                   <|> infixOp <\> colon <\> qFunSym <**> rightSection-  optRightSection  = (. InfixOp ()    ) <$> rightSection `opt` Variable ()-  optCRightSection = (. InfixConstr ()) <$> rightSection `opt` Constructor ()-  rightSection     = flip RightSection <$> expr0-  infixApp f e2 op g e1 = f (g . InfixApply e1 op) e2-  leftSection op f e = LeftSection (f e) op-  tuple es e = Tuple (e:es)+  optRightSection  = (. InfixOp ()    ) <$> rightSection+                       `opt` Variable NoSpanInfo ()+  optCRightSection = (. InfixConstr ()) <$> rightSection+                       `opt` Constructor NoSpanInfo ()+  rightSection     = mkRightSection <$> expr0+  infixApp f e2 op g e1 = f (g . mkInfixApply e1 op) e2+  leftSection op f e = mkLeftSection (f e) op+  mkTuple ses e = let (ss,es) = unzip ses+                  in Tuple (fromSrcInfoPoints ss) (e:es)+  mkConstructor = Constructor NoSpanInfo+  mkTyped sp ty e = Typed (fromSrcInfoPoints [sp]) e ty+  mkRightSection = flip (RightSection NoSpanInfo)+  mkLeftSection  = LeftSection  NoSpanInfo+  mkInfixApply e1 op e2 = InfixApply (fromSrcSpan+    (combineSpans (getSrcSpan e1) (getSrcSpan e2))) e1 op e2+  mkVariable = Variable NoSpanInfo ()+  mkUnaryMinus ex idt =+    let p = getPosition idt+        e = getSrcSpanEnd ex+        f = file p+    in UnaryMinus (SpanInfo (Span f p e) [Span f p (incr p 1)]) ex  infixOp :: Parser a Token (InfixOp ()) infixOp = InfixOp () <$> qfunop <|> InfixConstr () <$> colon  listExpr :: Parser a Token (Expression ())-listExpr = brackets (elements `opt` List () [])+listExpr = updateSpanWithBrackets <$>+             bracketsSp (elements `opt` List (fromSrcInfoPoints []) () [])   where   elements = expr <**> rest   rest = comprehension-      <|> enumeration (flip EnumFromTo) EnumFrom-      <|> comma <-*> expr <**>-          (enumeration (flip3 EnumFromThenTo) (flip EnumFromThen)-          <|> list <$> many (comma <-*> expr))-    `opt` (\e -> List () [e])-  comprehension = flip ListCompr <$-> bar <*> quals+      <|> enumeration mkEnumFromTo mkEnumFrom+      <|> (tokenSpan Comma <**> (expr <**>(+           enumeration mkEnumFromThenTo mkEnumFromThen+          <|> list <$> many ((,) <$> tokenSpan Comma <*> expr)))+    `opt` (\ e -> List (fromSrcInfoPoints []) () [e]))+  comprehension = mkListCompr <$> tokenSpan Bar <*> quals   enumeration enumTo enum =-    token DotDot <-*> (enumTo <$> expr `opt` enum)-  list es e2 e1 = List () (e1:e2:es)-  flip3 f x y z = f z y x+    tokenSpan DotDot <**> (enumTo <$> expr `opt` enum) +  mkEnumFrom                 sp     =+    EnumFrom (fromSrcInfoPoints [sp])+  mkEnumFromTo            e1 sp  e2 =+    EnumFromTo (fromSrcInfoPoints [sp]) e2 e1+  mkEnumFromThen      sp1 e1 sp2 e2 =+    EnumFromThen (fromSrcInfoPoints [sp2,sp1]) e2 e1+  mkEnumFromThenTo e1 sp1 e2 sp2 e3 =+    EnumFromThenTo (fromSrcInfoPoints [sp2,sp1]) e3 e2 e1+  mkListCompr sp qu e = ListCompr (fromSrcInfoPoints [sp]) e qu++  list xs e2 sp e1 = let (ss, es) = unzip xs+                     in List (fromSrcInfoPoints (sp:ss)) () (e1:e2:es)++updateSpanWithBrackets :: HasSpanInfo a => (a, Span, Span) -> a+updateSpanWithBrackets (ex, sp1, sp2) =+  let ss = getSrcInfoPoints ex+      s  = getPosition sp1+      e  = end sp2+      f  = file s+      spi = SpanInfo (Span f s e) (sp1 : (ss ++ [sp2]))+  in setSpanInfo spi ex+ lambdaExpr :: Parser a Token (Expression ())-lambdaExpr = Lambda <$-> token Backslash <*> many1 pattern2-                    <*-> expectRightArrow <*> expr+lambdaExpr = mkLambda <$> tokenSpan Backslash <*> many1 pattern2+                      <*> spanPosition <*-> expectRightArrow+                      <*> expr+  where mkLambda sp1 ps sp2 e = updateEndPos $ Lambda (SpanInfo sp1 [sp1, sp2]) ps e  letExpr :: Parser a Token (Expression ())-letExpr = Let <$-> token KW_let <*> layout valueDecls-              <*-> (token KW_in <?> "in expected") <*> expr+letExpr = mkLet <$>  tokenSpan KW_let <*> layout valueDecls+                <*> (tokenSpan KW_in <?> "in expected") <*> expr+  where mkLet sp1 ds sp2 e = updateEndPos $ Let (SpanInfo sp1 [sp1, sp2]) ds e  doExpr :: Parser a Token (Expression ())-doExpr = uncurry Do <$-> token KW_do <*> layout stmts+doExpr = mkDo <$> tokenSpan KW_do <*> layout stmts+  where mkDo sp (stms, ex) = updateEndPos $ Do (SpanInfo sp [sp]) stms ex  ifExpr :: Parser a Token (Expression ())-ifExpr = IfThenElse-    <$-> token KW_if                         <*> expr-    <*-> (token KW_then <?> "then expected") <*> expr-    <*-> (token KW_else <?> "else expected") <*> expr+ifExpr = mkIfThenElse+    <$>  tokenSpan KW_if                        <*> expr+    <*> (tokenSpan KW_then <?> "then expected") <*> expr+    <*> (tokenSpan KW_else <?> "else expected") <*> expr+  where mkIfThenElse sp1 e1 sp2 e2 sp3 e3 = updateEndPos $+          IfThenElse (SpanInfo sp1 [sp1, sp2, sp3]) e1 e2 e3  caseExpr :: Parser a Token (Expression ())-caseExpr = keyword <*> expr-      <*-> (token KW_of <?> "of expected") <*> layout (alt `sepBy1` semicolon)-  where keyword =  Case Flex  <$-> token KW_fcase-               <|> Case Rigid <$-> token KW_case+caseExpr = (mkCase Flex  <$> tokenSpan KW_fcase+        <|> mkCase Rigid <$> tokenSpan KW_case)+          <*> expr+          <*> (tokenSpan KW_of <?> "of expected")+          <*> layout (alt `sepBy1` semicolon)+  where mkCase ct sp1 e sp2 = updateEndPos . Case (SpanInfo sp1 [sp1, sp2]) ct e  alt :: Parser a Token (Alt ())-alt = Alt <$> position <*> pattern0 <*> rhs expectRightArrow+alt = mkAlt <$> spanPosition <*> pattern0+            <*> spanPosition <*> rhs expectRightArrow+  where mkAlt sp1 p sp2 = updateEndPos . Alt (SpanInfo sp1 [sp2]) p -fields :: Parser a Token b -> Parser a Token [Field b]-fields p = layoutOff <-*> braces (field p `sepBy` comma)+fieldsSp :: Parser a Token b -> Parser a Token (([Field b], [Span]), Span, Span)+fieldsSp p = layoutOff <-*> bracesSp (field p `sepBySp` comma)  field :: Parser a Token b -> Parser a Token (Field b)-field p = Field <$> position <*> qfun <*-> expectEquals <*> p+field p = mkField <$> spanPosition <*> qfun+                  <*> spanPosition <*-> expectEquals+                  <*> p+  where mkField sp1 q sp2 = updateEndPos . Field (SpanInfo sp1 [sp2]) q  -- --------------------------------------------------------------------------- -- \paragraph{Statements in list comprehensions and \texttt{do} expressions}@@ -800,10 +1079,12 @@ reqStmts = (\ (sts, e) st -> (st : sts, e)) <$-> semicolon <*> stmts  optStmts :: Parser a Token (Expression () -> ([Statement ()], Expression ()))-optStmts = succeed StmtExpr <.> reqStmts `opt` (,) []+optStmts = succeed mkStmtExpr <.> reqStmts `opt` (,) []+  where mkStmtExpr e = StmtExpr (fromSrcSpan (getSrcSpan e)) e  quals :: Parser a Token [Statement ()]-quals = stmt (succeed id) (succeed StmtExpr) `sepBy1` comma+quals = stmt (succeed id) (succeed mkStmtExpr) `sepBy1` comma+  where mkStmtExpr e = StmtExpr (fromSrcSpan (getSrcSpan e)) e  stmt :: Parser a Token (Statement () -> b)      -> Parser a Token (Expression () -> b) -> Parser a Token b@@ -812,23 +1093,35 @@  letStmt :: Parser a Token (Statement () -> b)         -> Parser a Token (Expression () -> b) -> Parser a Token b-letStmt stmtCont exprCont = token KW_let <-*> layout valueDecls <**> optExpr-  where optExpr =  flip Let <$-> token KW_in <*> expr <.> exprCont-               <|> succeed StmtDecl <.> stmtCont+letStmt stmtCont exprCont = ((,) <$> tokenSpan KW_let <*> layout valueDecls)+                              <**> optExpr+  where optExpr =  let' <$> tokenSpan KW_in <*> expr <.> exprCont+               <|> succeed stmtDecl' <.> stmtCont+          where+            let' sp1 e (sp2, ds) = updateEndPos $+              Let (SpanInfo sp2 [sp2, sp1]) ds e+            stmtDecl'  (sp2, ds) = updateEndPos $+              StmtDecl (SpanInfo sp2 [sp2]) ds  exprOrBindStmt :: Parser a Token (Statement () -> b)                -> Parser a Token (Expression () -> b)                -> Parser a Token b exprOrBindStmt stmtCont exprCont =-       StmtBind <$> pattern0 <*-> leftArrow <*> expr <**> stmtCont+       stmtBind' <$> spanPosition <*> pattern0 <*> tokenSpan LeftArrow <*> expr+         <**> stmtCont   <|?> expr <\> token KW_let <**> exprCont+  where+    stmtBind' sp1 p sp2 e = updateEndPos $+      StmtBind (SpanInfo sp1 [sp2]) p e  -- --------------------------------------------------------------------------- -- Goals -- ---------------------------------------------------------------------------  goal :: Parser a Token (Goal ())-goal = Goal <$> position <*> expr <*> localDecls+goal = mkGoal <$> spanPosition <*> expr <*> spanPosition <*> localDecls+  where mkGoal sp1 ex sp2 ds = updateEndPos $+          Goal (SpanInfo sp1 [sp2]) ex ds  -- --------------------------------------------------------------------------- -- Literals, identifiers, and (infix) operators@@ -889,19 +1182,24 @@ modIdent = mIdent <?> "module name expected"  var :: Parser a Token Ident-var = varId <|> parens (funSym <?> "operator symbol expected")+var = varId <|> updateSpanWithBrackets+                     <$> parensSp (funSym <?> "operator symbol expected")  fun :: Parser a Token Ident-fun = funId <|> parens (funSym <?> "operator symbol expected")+fun = funId <|> updateSpanWithBrackets+                     <$> parensSp (funSym <?> "operator symbol expected")  con :: Parser a Token Ident-con = conId <|> parens (conSym <?> "operator symbol expected")+con = conId <|> updateSpanWithBrackets+                     <$> parensSp (conSym <?> "operator symbol expected")  funop :: Parser a Token Ident-funop = funSym <|> backquotes (funId <?> "operator name expected")+funop = funSym <|> updateSpanWithBrackets+                     <$> backquotesSp (funId <?> "operator name expected")  conop :: Parser a Token Ident-conop = conSym <|> backquotes (conId <?> "operator name expected")+conop = conSym <|> updateSpanWithBrackets+                     <$> backquotesSp (conId <?> "operator name expected")  qFunId :: Parser a Token QualIdent qFunId = qIdent@@ -919,53 +1217,62 @@ gConSym = qConSym <|> colon  qfun :: Parser a Token QualIdent-qfun = qFunId <|> parens (qFunSym <?> "operator symbol expected")+qfun = qFunId <|> updateSpanWithBrackets+                     <$> parensSp (qFunSym <?> "operator symbol expected")  qfunop :: Parser a Token QualIdent-qfunop = qFunSym <|> backquotes (qFunId <?> "operator name expected")+qfunop = qFunSym <|> updateSpanWithBrackets+                     <$> backquotesSp (qFunId <?> "operator name expected")  gconop :: Parser a Token QualIdent-gconop = gConSym <|> backquotes (qConId <?> "operator name expected")+gconop = gConSym <|> updateSpanWithBrackets+                     <$> backquotesSp (qConId <?> "operator name expected")  anonIdent :: Parser a Token Ident-anonIdent = (\ p -> addPositionIdent p anonId) <$> tokenPos Underscore+anonIdent = ((`setSpanInfo` anonId) . fromSrcSpanBoth) <$> tokenSpan Underscore  mIdent :: Parser a Token ModuleIdent-mIdent = mIdent' <$> position <*>+mIdent = mIdent' <$> spanPosition <*>      tokens [Id,QId,Id_as,Id_ccall,Id_forall,Id_hiding,              Id_interface,Id_primitive,Id_qualified]-  where mIdent' p a = addPositionModuleIdent p $-                      mkMIdent (modulVal a ++ [sval a])+  where mIdent' sp a = ModuleIdent (fromSrcSpanBoth sp) (modulVal a ++ [sval a])  ident :: Parser a Token Ident-ident = (\ pos -> mkIdentPosition pos . sval) <$> position <*>-       tokens [Id,Id_as,Id_ccall,Id_forall,Id_hiding,-               Id_interface,Id_primitive,Id_qualified]+ident = (\ sp t -> setSpanInfo (fromSrcSpanBoth sp) (mkIdent (sval t)))+          <$> spanPosition <*> tokens [Id,Id_as,Id_ccall,Id_forall,Id_hiding,+                                       Id_interface,Id_primitive,Id_qualified]  qIdent :: Parser a Token QualIdent-qIdent =  qualify  <$> ident-      <|> mkQIdent <$> position <*> token QId-  where mkQIdent p a = qualifyWith (mkMIdent (modulVal a))-                                   (mkIdentPosition p (sval a))+qIdent = qualify <$> ident <|> qIdentWith QId  sym :: Parser a Token Ident-sym = (\ pos -> mkIdentPosition pos . sval) <$> position <*>-      tokens [Sym, SymDot, SymMinus, SymStar]+sym = (\ sp t -> setSpanInfo (fromSrcSpanBoth sp) (mkIdent (sval t)))+        <$> spanPosition <*> tokens [Sym, SymDot, SymMinus, SymStar]  qSym :: Parser a Token QualIdent-qSym = qualify <$> sym <|> mkQIdent <$> position <*> token QSym-  where mkQIdent p a = qualifyWith (mkMIdent (modulVal a))-                                   (mkIdentPosition p (sval a))+qSym = qualify <$> sym <|> qIdentWith QSym +qIdentWith :: Category -> Parser a Token QualIdent+qIdentWith c = mkQIdent <$> spanPosition <*> token c+  where mkQIdent :: Span -> Attributes -> QualIdent+        mkQIdent sp a =+          let mid  = ModuleIdent (fromSrcSpan sp) (modulVal a)+              p    = incr (getPosition sp) (mIdentLength mid - 1)+              mid' = setEndPosition p mid+              idt  = setSrcSpan sp $ mkIdent (sval a)+              idt' = setPosition (incr p 1) idt+          in QualIdent (fromSrcSpanBoth sp) (Just mid') idt'+ colon :: Parser a Token QualIdent-colon = (\ p -> qualify $ addPositionIdent p consId) <$> tokenPos Colon+colon = (qualify . (`setSpanInfo` consId) . fromSrcSpanBoth) <$> tokenSpan Colon  minus :: Parser a Token Ident-minus = (\ p -> addPositionIdent p minusId) <$> tokenPos SymMinus+minus = ((`setSpanInfo` minusId) . fromSrcSpanBoth) <$> tokenSpan SymMinus  tupleCommas :: Parser a Token QualIdent-tupleCommas = (\ p -> qualify . addPositionIdent p . tupleId . succ . length)-              <$> position <*> many1 comma+tupleCommas = (\ sp ss -> qualify $ updateEndPos $ setSpanInfo (SpanInfo sp ss)+                                  $ tupleId      $ succ $ length  ss)+              <$> spanPosition <*> many1 (tokenSpan Comma)  -- --------------------------------------------------------------------------- -- Layout@@ -988,15 +1295,36 @@ braces :: Parser a Token b -> Parser a Token b braces p = between leftBrace p rightBrace -brackets :: Parser a Token b -> Parser a Token b-brackets p = between leftBracket p rightBracket+bracesSp :: Parser a Token b -> Parser a Token (b, Span, Span)+bracesSp p = (\sp1 b sp2 -> (b, sp1, sp2))+               <$> tokenSpan LeftBrace+               <*> p+               <*> tokenSpan RightBrace +bracketsSp :: Parser a Token b -> Parser a Token (b, Span, Span)+bracketsSp p = (\sp1 b sp2 -> (b, sp1, sp2))+                 <$> tokenSpan LeftBracket+                 <*> p+                 <*> tokenSpan RightBracket+ parens :: Parser a Token b -> Parser a Token b parens p = between leftParen p rightParen +parensSp :: Parser a Token b -> Parser a Token (b, Span, Span)+parensSp p = (\sp1 b sp2 -> (b, sp1, sp2))+               <$> tokenSpan LeftParen+               <*> p+               <*> tokenSpan RightParen+ backquotes :: Parser a Token b -> Parser a Token b backquotes p = between backquote p expectBackquote +backquotesSp :: Parser a Token b -> Parser a Token (b, Span, Span)+backquotesSp p = (\sp1 b sp2 -> (b, sp1, sp2))+                   <$> tokenSpan Backquote+                   <*> p+                   <*> spanPosition <*-> expectBackquote+ -- --------------------------------------------------------------------------- -- Simple token parsers -- ---------------------------------------------------------------------------@@ -1011,15 +1339,15 @@ tokenPos :: Category -> Parser a Token Position tokenPos c = position <*-> token c +tokenSpan :: Category -> Parser a Token Span+tokenSpan c = spanPosition <*-> token c+ tokenOps :: [(Category, b)] -> Parser a Token b tokenOps cs = ops [(Token c NoAttributes, x) | (c, x) <- cs]  comma :: Parser a Token Attributes comma = token Comma -dot :: Parser a Token Attributes-dot = token SymDot- semicolon :: Parser a Token Attributes semicolon = token Semicolon <|> token VSemicolon @@ -1050,24 +1378,8 @@ rightParen :: Parser a Token Attributes rightParen = token RightParen -leftBracket :: Parser a Token Attributes-leftBracket = token LeftBracket--rightBracket :: Parser a Token Attributes-rightBracket = token RightBracket- leftBrace :: Parser a Token Attributes leftBrace = token LeftBrace  rightBrace :: Parser a Token Attributes rightBrace = token RightBrace--leftArrow :: Parser a Token Attributes-leftArrow = token LeftArrow---- ------------------------------------------------------------------------------ Ident--- -----------------------------------------------------------------------------mkIdentPosition :: Position -> String -> Ident-mkIdentPosition pos = addPositionIdent pos . mkIdent
src/Curry/Syntax/Pretty.hs view
@@ -15,6 +15,7 @@     derived from the Haskell pretty printer provided in Simon Marlow's     Haskell parser. -}+{-# LANGUAGE CPP #-} module Curry.Syntax.Pretty   ( ppModule, ppInterface, ppIDecl, ppDecl, ppIdent, ppPattern, ppFieldPatt   , ppExpr, ppOp, ppStmt, ppFieldExpr, ppQualTypeExpr, ppTypeExpr, ppKindExpr@@ -22,15 +23,21 @@   , ppFieldDecl, ppEquation, ppMIdent   ) where +#if __GLASGOW_HASKELL__ >= 804+import Prelude hiding ((<>))+#endif+ import Curry.Base.Ident import Curry.Base.Pretty  import Curry.Syntax.Type import Curry.Syntax.Utils (opName) +-- TODO use span infos+ -- |Pretty print a module ppModule :: Module a -> Doc-ppModule (Module ps m es is ds) = ppModuleHeader ps m es is $$ ppSepBlock ds+ppModule (Module _ ps m es is ds) = ppModuleHeader ps m es is $$ ppSepBlock ds  ppModuleHeader :: [ModulePragma] -> ModuleIdent -> Maybe ExportSpec                -> [ImportDecl] -> Doc@@ -62,10 +69,10 @@ ppExportSpec (Exporting _ es) = parenList (map ppExport es)  ppExport :: Export -> Doc-ppExport (Export             x) = ppQIdent x-ppExport (ExportTypeWith tc cs) = ppQIdent tc <> parenList (map ppIdent cs)-ppExport (ExportTypeAll     tc) = ppQIdent tc <> text "(..)"-ppExport (ExportModule       m) = text "module" <+> ppMIdent m+ppExport (Export             _ x) = ppQIdent x+ppExport (ExportTypeWith _ tc cs) = ppQIdent tc <> parenList (map ppIdent cs)+ppExport (ExportTypeAll     _ tc) = ppQIdent tc <> text "(..)"+ppExport (ExportModule       _ m) = text "module" <+> ppMIdent m  ppImportDecl :: ImportDecl -> Doc ppImportDecl (ImportDecl _ m q asM is) =@@ -79,9 +86,9 @@ ppImportSpec (Hiding    _ is) = text "hiding" <+> parenList (map ppImport is)  ppImport :: Import -> Doc-ppImport (Import             x) = ppIdent x-ppImport (ImportTypeWith tc cs) = ppIdent tc <> parenList (map ppIdent cs)-ppImport (ImportTypeAll     tc) = ppIdent tc <> text "(..)"+ppImport (Import             _ x) = ppIdent x+ppImport (ImportTypeWith _ tc cs) = ppIdent tc <> parenList (map ppIdent cs)+ppImport (ImportTypeAll     _ tc) = ppIdent tc <> text "(..)"  ppBlock :: [Decl a] -> Doc ppBlock = vcat . map ppDecl@@ -128,7 +135,7 @@ ppContext cs  = parenList (map ppConstraint cs) <+> darrow  ppConstraint :: Constraint -> Doc-ppConstraint (Constraint qcls ty) = ppQIdent qcls <+> ppTypeExpr 2 ty+ppConstraint (Constraint _ qcls ty) = ppQIdent qcls <+> ppTypeExpr 2 ty  ppInstanceType :: InstanceType -> Doc ppInstanceType = ppTypeExpr 2@@ -179,14 +186,14 @@ ppEquation (Equation _ lhs rhs) = ppRule (ppLhs lhs) equals rhs  ppLhs :: Lhs a -> Doc-ppLhs (FunLhs   f ts) = ppIdent f <+> fsep (map (ppPattern 2) ts)-ppLhs (OpLhs t1 f t2) = ppPattern 1 t1 <+> ppInfixOp f <+> ppPattern 1 t2-ppLhs (ApLhs  lhs ts) = parens (ppLhs lhs) <+> fsep (map (ppPattern 2) ts)+ppLhs (FunLhs   _ f ts) = ppIdent f <+> fsep (map (ppPattern 2) ts)+ppLhs (OpLhs _ t1 f t2) = ppPattern 1 t1 <+> ppInfixOp f <+> ppPattern 1 t2+ppLhs (ApLhs  _ lhs ts) = parens (ppLhs lhs) <+> fsep (map (ppPattern 2) ts)  ppRule :: Doc -> Doc -> Rhs a -> Doc ppRule lhs eq (SimpleRhs _ e ds) =   sep [lhs <+> eq, indent (ppExpr 0 e)] $$ ppLocalDefs ds-ppRule lhs eq (GuardedRhs es ds) =+ppRule lhs eq (GuardedRhs _ es ds) =   sep [lhs, indent (vcat (map (ppCondExpr eq) es))] $$ ppLocalDefs ds  ppLocalDefs :: [Decl a] -> Doc@@ -278,26 +285,26 @@  -- |Pretty print a qualified type expression ppQualTypeExpr :: QualTypeExpr -> Doc-ppQualTypeExpr (QualTypeExpr cx ty) = ppContext cx <+> ppTypeExpr 0 ty+ppQualTypeExpr (QualTypeExpr _ cx ty) = ppContext cx <+> ppTypeExpr 0 ty  -- |Pretty print a type expression ppTypeExpr :: Int -> TypeExpr -> Doc-ppTypeExpr _ (ConstructorType tc) = ppQIdent tc-ppTypeExpr p (ApplyType  ty1 ty2) = parenIf (p > 1) (ppApplyType ty1 [ty2])-  where ppApplyType (ApplyType ty1' ty2') tys = ppApplyType ty1' (ty2' : tys)+ppTypeExpr _ (ConstructorType _ tc) = ppQIdent tc+ppTypeExpr p (ApplyType  _ ty1 ty2) = parenIf (p > 1) (ppApplyType ty1 [ty2])+  where ppApplyType (ApplyType _ ty1' ty2') tys = ppApplyType ty1' (ty2' : tys)         ppApplyType ty tys                  =           ppTypeExpr 1 ty <+> fsep (map (ppTypeExpr 2) tys)-ppTypeExpr _ (VariableType    tv) = ppIdent tv-ppTypeExpr _ (TupleType      tys) = parenList (map (ppTypeExpr 0) tys)-ppTypeExpr _ (ListType        ty) = brackets (ppTypeExpr 0 ty)-ppTypeExpr p (ArrowType  ty1 ty2) = parenIf (p > 0)-  (fsep (ppArrowType (ArrowType ty1 ty2)))+ppTypeExpr _ (VariableType    _ tv) = ppIdent tv+ppTypeExpr _ (TupleType      _ tys) = parenList (map (ppTypeExpr 0) tys)+ppTypeExpr _ (ListType        _ ty) = brackets (ppTypeExpr 0 ty)+ppTypeExpr p (ArrowType  spi ty1 ty2) = parenIf (p > 0)+  (fsep (ppArrowType (ArrowType spi ty1 ty2)))   where-  ppArrowType (ArrowType ty1' ty2') =+  ppArrowType (ArrowType _ ty1' ty2') =     ppTypeExpr 1 ty1' <+> rarrow : ppArrowType ty2'   ppArrowType ty                    = [ppTypeExpr 0 ty]-ppTypeExpr _ (ParenType       ty) = parens (ppTypeExpr 0 ty)-ppTypeExpr p (ForallType   vs ty)+ppTypeExpr _ (ParenType       _ ty) = parens (ppTypeExpr 0 ty)+ppTypeExpr p (ForallType   _ vs ty)   | null vs   = ppTypeExpr p ty   | otherwise = parenIf (p > 0) $ ppQuantifiedVars vs <+> ppTypeExpr 0 ty @@ -317,28 +324,28 @@  -- |Pretty print a constructor term ppPattern :: Int -> Pattern a -> Doc-ppPattern p (LiteralPattern _ l) = parenIf (p > 1 && isNegative l) (ppLiteral l)+ppPattern p (LiteralPattern _ _ l) = parenIf (p > 1 && isNegative l) (ppLiteral l)   where isNegative (Char   _) = False         isNegative (Int    i) = i < 0         isNegative (Float  f) = f < 0.0         isNegative (String _) = False-ppPattern p (NegativePattern        _ l) = parenIf (p > 1)+ppPattern p (NegativePattern        _ _ l) = parenIf (p > 1)   (ppInfixOp minusId <> ppLiteral l)-ppPattern _ (VariablePattern        _ v) = ppIdent v-ppPattern p (ConstructorPattern  _ c ts) = parenIf (p > 1 && not (null ts))+ppPattern _ (VariablePattern        _ _ v) = ppIdent v+ppPattern p (ConstructorPattern  _ _ c ts) = parenIf (p > 1 && not (null ts))   (ppQIdent c <+> fsep (map (ppPattern 2) ts))-ppPattern p (InfixPattern     _ t1 c t2) = parenIf (p > 0)+ppPattern p (InfixPattern     _ _ t1 c t2) = parenIf (p > 0)   (sep [ppPattern 1 t1 <+> ppQInfixOp c, indent (ppPattern 0 t2)])-ppPattern _ (ParenPattern             t) = parens (ppPattern 0 t)-ppPattern _ (TuplePattern            ts) = parenList (map (ppPattern 0) ts)-ppPattern _ (ListPattern           _ ts) = bracketList (map (ppPattern 0) ts)-ppPattern _ (AsPattern              v t) = ppIdent v <> char '@' <> ppPattern 2 t-ppPattern _ (LazyPattern              t) = char '~' <> ppPattern 2 t-ppPattern p (FunctionPattern     _ f ts) = parenIf (p > 1 && not (null ts))+ppPattern _ (ParenPattern             _ t) = parens (ppPattern 0 t)+ppPattern _ (TuplePattern            _ ts) = parenList (map (ppPattern 0) ts)+ppPattern _ (ListPattern           _ _ ts) = bracketList (map (ppPattern 0) ts)+ppPattern _ (AsPattern              _ v t) = ppIdent v <> char '@' <> ppPattern 2 t+ppPattern _ (LazyPattern              _ t) = char '~' <> ppPattern 2 t+ppPattern p (FunctionPattern     _ _ f ts) = parenIf (p > 1 && not (null ts))   (ppQIdent f <+> fsep (map (ppPattern 2) ts))-ppPattern p (InfixFuncPattern _ t1 f t2) = parenIf (p > 0)+ppPattern p (InfixFuncPattern _ _ t1 f t2) = parenIf (p > 0)   (sep [ppPattern 1 t1 <+> ppQInfixOp f, indent (ppPattern 0 t2)])-ppPattern p (RecordPattern       _ c fs) = parenIf (p > 1)+ppPattern p (RecordPattern       _ _ c fs) = parenIf (p > 1)   (ppQIdent c <+> record (list (map ppFieldPatt fs)))  -- |Pretty print a record field pattern@@ -355,57 +362,57 @@  -- |Pretty print an expression ppExpr :: Int -> Expression a -> Doc-ppExpr _ (Literal        _ l) = ppLiteral l-ppExpr _ (Variable       _ v) = ppQIdent v-ppExpr _ (Constructor    _ c) = ppQIdent c-ppExpr _ (Paren            e) = parens (ppExpr 0 e)-ppExpr p (Typed        e qty) =+ppExpr _ (Literal        _ _ l) = ppLiteral l+ppExpr _ (Variable       _ _ v) = ppQIdent v+ppExpr _ (Constructor    _ _ c) = ppQIdent c+ppExpr _ (Paren            _ e) = parens (ppExpr 0 e)+ppExpr p (Typed        _ e qty) =   parenIf (p > 0) (ppExpr 0 e <+> text "::" <+> ppQualTypeExpr qty)-ppExpr _ (Tuple           es) = parenList (map (ppExpr 0) es)-ppExpr _ (List          _ es) = bracketList (map (ppExpr 0) es)-ppExpr _ (ListCompr     e qs) =+ppExpr _ (Tuple           _ es) = parenList (map (ppExpr 0) es)+ppExpr _ (List          _ _ es) = bracketList (map (ppExpr 0) es)+ppExpr _ (ListCompr     _ e qs) =   brackets (ppExpr 0 e <+> vbar <+> list (map ppStmt qs))-ppExpr _ (EnumFrom              e) = brackets (ppExpr 0 e <+> text "..")-ppExpr _ (EnumFromThen      e1 e2) =+ppExpr _ (EnumFrom              _ e) = brackets (ppExpr 0 e <+> text "..")+ppExpr _ (EnumFromThen      _ e1 e2) =   brackets (ppExpr 0 e1 <> comma <+> ppExpr 0 e2 <+> text "..")-ppExpr _ (EnumFromTo        e1 e2) =+ppExpr _ (EnumFromTo        _ e1 e2) =   brackets (ppExpr 0 e1 <+> text ".." <+> ppExpr 0 e2)-ppExpr _ (EnumFromThenTo e1 e2 e3) =+ppExpr _ (EnumFromThenTo _ e1 e2 e3) =   brackets (ppExpr 0 e1 <> comma <+> ppExpr 0 e2               <+> text ".." <+> ppExpr 0 e3)-ppExpr p (UnaryMinus          e) =+ppExpr p (UnaryMinus          _ e) =   parenIf (p > 1) (ppInfixOp minusId <> ppExpr 1 e)-ppExpr p (Apply           e1 e2) =+ppExpr p (Apply           _ e1 e2) =   parenIf (p > 1) (sep [ppExpr 1 e1,indent (ppExpr 2 e2)])-ppExpr p (InfixApply   e1 op e2) =+ppExpr p (InfixApply   _ e1 op e2) =   parenIf (p > 0) (sep [ppExpr 1 e1 <+> ppQInfixOp (opName op),                          indent (ppExpr 1 e2)])-ppExpr _ (LeftSection      e op) = parens (ppExpr 1 e <+> ppQInfixOp (opName op))-ppExpr _ (RightSection     op e) = parens (ppQInfixOp (opName op) <+> ppExpr 1 e)-ppExpr p (Lambda            t e) = parenIf (p > 0)+ppExpr _ (LeftSection      _ e op) = parens (ppExpr 1 e <+> ppQInfixOp (opName op))+ppExpr _ (RightSection     _ op e) = parens (ppQInfixOp (opName op) <+> ppExpr 1 e)+ppExpr p (Lambda            _ t e) = parenIf (p > 0)   (sep [backsl <> fsep (map (ppPattern 2) t) <+> rarrow, indent (ppExpr 0 e)])-ppExpr p (Let              ds e) = parenIf (p > 0)+ppExpr p (Let              _ ds e) = parenIf (p > 0)           (sep [text "let" <+> ppBlock ds, text "in" <+> ppExpr 0 e])-ppExpr p (Do              sts e) = parenIf (p > 0)+ppExpr p (Do              _ sts e) = parenIf (p > 0)           (text "do" <+> (vcat (map ppStmt sts) $$ ppExpr 0 e))-ppExpr p (IfThenElse   e1 e2 e3) = parenIf (p > 0)+ppExpr p (IfThenElse   _ e1 e2 e3) = parenIf (p > 0)            (text "if" <+>             sep [ppExpr 0 e1,                  text "then" <+> ppExpr 0 e2,                  text "else" <+> ppExpr 0 e3])-ppExpr p (Case      ct e alts) = parenIf (p > 0)+ppExpr p (Case      _ ct e alts) = parenIf (p > 0)            (ppCaseType ct <+> ppExpr 0 e <+> text "of" $$             indent (vcat (map ppAlt alts)))-ppExpr p (Record     _ c fs) = parenIf (p > 0)+ppExpr p (Record     _ _ c fs) = parenIf (p > 0)   (ppQIdent c <+> record (list (map ppFieldExpr fs)))-ppExpr _ (RecordUpdate e fs) =+ppExpr _ (RecordUpdate _ e fs) =   ppExpr 0 e <+> record (list (map ppFieldExpr fs))  -- |Pretty print a statement ppStmt :: Statement a -> Doc-ppStmt (StmtExpr   e) = ppExpr 0 e-ppStmt (StmtBind t e) = sep [ppPattern 0 t <+> larrow,indent (ppExpr 0 e)]-ppStmt (StmtDecl  ds) = text "let" <+> ppBlock ds+ppStmt (StmtExpr   _ e) = ppExpr 0 e+ppStmt (StmtBind _ t e) = sep [ppPattern 0 t <+> larrow,indent (ppExpr 0 e)]+ppStmt (StmtDecl  _ ds) = text "let" <+> ppBlock ds  ppCaseType :: CaseType -> Doc ppCaseType Rigid = text "case"
src/Curry/Syntax/ShowModule.hs view
@@ -18,6 +18,8 @@  import Curry.Base.Ident import Curry.Base.Position+import Curry.Base.Span+import Curry.Base.SpanInfo  import Curry.Syntax.Type @@ -26,8 +28,9 @@ showModule m = showsModule m "\n"  showsModule :: Show a => Module a -> ShowS-showsModule (Module ps mident espec imps decls)+showsModule (Module spi ps mident espec imps decls)   = showsString "Module "+  . showsSpanInfo spi . space   . showsList (\p -> showsPragma p . newline) ps . space   . showsModuleIdent mident . newline   . showsMaybe showsExportSpec espec . newline@@ -37,12 +40,12 @@ showsPragma :: ModulePragma -> ShowS showsPragma (LanguagePragma pos exts)   = showsString "(LanguagePragma "-  . showsPosition pos . space+  . showsSpanInfo pos . space   . showsList showsExtension exts   . showsString ")" showsPragma (OptionsPragma pos mbTool args)   = showsString "(OptionsPragma "-  . showsPosition pos . space+  . showsSpanInfo pos . space   . showsMaybe shows mbTool   . shows args   . showsString ")"@@ -62,33 +65,37 @@ showsExportSpec :: ExportSpec -> ShowS showsExportSpec (Exporting pos exports)   = showsString "(Exporting "-  . showsPosition pos . space+  . showsSpanInfo pos . space   . showsList showsExport exports   . showsString ")"  showsExport :: Export -> ShowS-showsExport (Export qident)+showsExport (Export spi qident)   = showsString "(Export "+  . showsSpanInfo spi . space   . showsQualIdent qident   . showsString ")"-showsExport (ExportTypeWith qident ids)+showsExport (ExportTypeWith spi qident ids)   = showsString "(ExportTypeWith "+  . showsSpanInfo spi . space   . showsQualIdent qident . space   . showsList showsIdent ids   . showsString ")"-showsExport (ExportTypeAll qident)+showsExport (ExportTypeAll spi qident)   = showsString "(ExportTypeAll "+  . showsSpanInfo spi . space   . showsQualIdent qident   . showsString ")"-showsExport (ExportModule m)+showsExport (ExportModule spi m)   = showsString "(ExportModule "+  . showsSpanInfo spi . space   . showsModuleIdent m   . showsString ")"  showsImportDecl :: ImportDecl -> ShowS-showsImportDecl (ImportDecl pos mident quali mmident mimpspec)+showsImportDecl (ImportDecl spi mident quali mmident mimpspec)   = showsString "(ImportDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsModuleIdent mident . space   . shows quali . space   . showsMaybe showsModuleIdent mmident . space@@ -96,114 +103,117 @@   . showsString ")"  showsImportSpec :: ImportSpec -> ShowS-showsImportSpec (Importing pos imports)+showsImportSpec (Importing spi imports)   = showsString "(Importing "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsList showsImport imports   . showsString ")"-showsImportSpec (Hiding pos imports)+showsImportSpec (Hiding spi imports)   = showsString "(Hiding "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsList showsImport imports   . showsString ")"  showsImport :: Import -> ShowS-showsImport (Import ident)+showsImport (Import spi ident)   = showsString "(Import "+  . showsSpanInfo spi . space   . showsIdent ident   . showsString ")"-showsImport (ImportTypeWith ident idents)+showsImport (ImportTypeWith spi ident idents)   = showsString "(ImportTypeWith "+  . showsSpanInfo spi . space   . showsIdent ident . space   . showsList showsIdent idents   . showsString ")"-showsImport (ImportTypeAll ident)+showsImport (ImportTypeAll spi ident)   = showsString "(ImportTypeAll "+  . showsSpanInfo spi . space   . showsIdent ident   . showsString ")"  showsDecl :: Show a => Decl a -> ShowS-showsDecl (InfixDecl pos infx prec idents)+showsDecl (InfixDecl spi infx prec idents)   = showsString "(InfixDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . shows infx . space   . showsMaybe shows prec . space   . showsList showsIdent idents   . showsString ")"-showsDecl (DataDecl pos ident idents consdecls classes)+showsDecl (DataDecl spi ident idents consdecls classes)   = showsString "(DataDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsIdent ident . space   . showsList showsIdent idents . space   . showsList showsConsDecl consdecls . space   . showsList showsQualIdent classes   . showsString ")"-showsDecl (ExternalDataDecl pos ident idents)+showsDecl (ExternalDataDecl spi ident idents)   = showsString "(ExternalDataDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsIdent ident . space   . showsList showsIdent idents   . showsString ")"-showsDecl (NewtypeDecl pos ident idents newconsdecl classes)+showsDecl (NewtypeDecl spi ident idents newconsdecl classes)   = showsString "(NewtypeDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsIdent ident . space   . showsList showsIdent idents . space   . showsNewConsDecl newconsdecl . space   . showsList showsQualIdent classes   . showsString ")"-showsDecl (TypeDecl pos ident idents typ)+showsDecl (TypeDecl spi ident idents typ)   = showsString "(TypeDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsIdent ident . space   . showsList showsIdent idents . space   . showsTypeExpr typ   . showsString ")"-showsDecl (TypeSig pos idents qtype)+showsDecl (TypeSig spi idents qtype)   = showsString "(TypeSig "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsList showsIdent idents . space   . showsQualTypeExpr qtype   . showsString ")"-showsDecl (FunctionDecl pos a ident eqs)+showsDecl (FunctionDecl spi a ident eqs)   = showsString "(FunctionDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsPrec 11 a . space   . showsIdent ident . space   . showsList showsEquation eqs   . showsString ")"-showsDecl (ExternalDecl pos vars)+showsDecl (ExternalDecl spi vars)   = showsString "(ExternalDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsList showsVar vars   . showsString ")"-showsDecl (PatternDecl pos cons rhs)+showsDecl (PatternDecl spi cons rhs)   = showsString "(PatternDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsConsTerm cons . space   . showsRhs rhs   . showsString ")"-showsDecl (FreeDecl pos vars)+showsDecl (FreeDecl spi vars)   = showsString "(FreeDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsList showsVar vars   . showsString ")"-showsDecl (DefaultDecl pos types)+showsDecl (DefaultDecl spi types)   = showsString "(DefaultDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsList showsTypeExpr types   . showsString ")"-showsDecl (ClassDecl pos context cls clsvar decls)+showsDecl (ClassDecl spi context cls clsvar decls)   = showsString "(ClassDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsContext context . space   . showsIdent cls . space   . showsIdent clsvar . space   . showsList showsDecl decls   . showsString ")"-showsDecl (InstanceDecl pos context qcls inst decls)+showsDecl (InstanceDecl spi context qcls inst decls)   = showsString "(InstanceDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsContext context . space   . showsQualIdent qcls . space   . showsInstanceType inst . space@@ -211,12 +221,12 @@   . showsString ")"  showsContext :: Context -> ShowS-showsContext constraints-  = showsList showsConstraint constraints+showsContext = showsList showsConstraint  showsConstraint :: Constraint -> ShowS-showsConstraint (Constraint qcls ty)+showsConstraint (Constraint spi qcls ty)   = showsString "(Constraint "+  . showsSpanInfo spi . space   . showsQualIdent qcls . space   . showsTypeExpr ty   . showsString ")"@@ -225,26 +235,26 @@ showsInstanceType = showsTypeExpr  showsConsDecl :: ConstrDecl -> ShowS-showsConsDecl (ConstrDecl pos idents context ident types)+showsConsDecl (ConstrDecl spi idents context ident types)   = showsString "(ConstrDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsList showsIdent idents . space   . showsContext context . space   . showsIdent ident . space   . showsList showsTypeExpr types   . showsString ")"-showsConsDecl (ConOpDecl pos idents context ty1 ident ty2)+showsConsDecl (ConOpDecl spi idents context ty1 ident ty2)   = showsString "(ConOpDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsList showsIdent idents . space   . showsContext context . space   . showsTypeExpr ty1 . space   . showsIdent ident . space   . showsTypeExpr ty2   . showsString ")"-showsConsDecl (RecordDecl pos idents context ident fs)+showsConsDecl (RecordDecl spi idents context ident fs)   = showsString "(RecordDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsList showsIdent idents . space   . showsContext context . space   . showsIdent ident . space@@ -252,114 +262,127 @@   . showsString ")"  showsFieldDecl :: FieldDecl -> ShowS-showsFieldDecl (FieldDecl pos labels ty)+showsFieldDecl (FieldDecl spi labels ty)   = showsString "(FieldDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsList showsIdent labels . space   . showsTypeExpr ty   . showsString ")"  showsNewConsDecl :: NewConstrDecl -> ShowS-showsNewConsDecl (NewConstrDecl pos ident typ)+showsNewConsDecl (NewConstrDecl spi ident typ)   = showsString "(NewConstrDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsIdent ident . space   . showsTypeExpr typ   . showsString ")"-showsNewConsDecl (NewRecordDecl pos ident fld)+showsNewConsDecl (NewRecordDecl spi ident fld)   = showsString "(NewRecordDecl "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsIdent ident . space   . showsPair showsIdent showsTypeExpr fld   . showsString ")"  showsQualTypeExpr :: QualTypeExpr -> ShowS-showsQualTypeExpr (QualTypeExpr context typ)+showsQualTypeExpr (QualTypeExpr spi context typ)   = showsString "(QualTypeExpr "+  . showsSpanInfo spi . space   . showsContext context . space   . showsTypeExpr typ   . showsString ")"  showsTypeExpr :: TypeExpr -> ShowS-showsTypeExpr (ConstructorType qident)+showsTypeExpr (ConstructorType spi qident)   = showsString "(ConstructorType "+  . showsSpanInfo spi . space   . showsQualIdent qident . space   . showsString ")"-showsTypeExpr (ApplyType type1 type2)+showsTypeExpr (ApplyType spi type1 type2)   = showsString "(ApplyType "+  . showsSpanInfo spi . space   . showsTypeExpr type1 . space   . showsTypeExpr type2 . space   . showsString ")"-showsTypeExpr (VariableType ident)+showsTypeExpr (VariableType spi ident)   = showsString "(VariableType "+  . showsSpanInfo spi . space   . showsIdent ident   . showsString ")"-showsTypeExpr (TupleType types)+showsTypeExpr (TupleType spi types)   = showsString "(TupleType "+  . showsSpanInfo spi . space   . showsList showsTypeExpr types   . showsString ")"-showsTypeExpr (ListType typ)+showsTypeExpr (ListType spi typ)   = showsString "(ListType "+  . showsSpanInfo spi . space   . showsTypeExpr typ   . showsString ")"-showsTypeExpr (ArrowType dom ran)+showsTypeExpr (ArrowType spi dom ran)   = showsString "(ArrowType "+  . showsSpanInfo spi . space   . showsTypeExpr dom . space   . showsTypeExpr ran   . showsString ")"-showsTypeExpr (ParenType ty)+showsTypeExpr (ParenType spi ty)   = showsString "(ParenType "+  . showsSpanInfo spi . space   . showsTypeExpr ty   . showsString ")"-showsTypeExpr (ForallType vars ty)+showsTypeExpr (ForallType spi vars ty)   = showsString "(ForallType "+  . showsSpanInfo spi . space   . showsList showsIdent vars   . showsTypeExpr ty   . showsString ")"  showsEquation :: Show a => Equation a -> ShowS-showsEquation (Equation pos lhs rhs)+showsEquation (Equation spi lhs rhs)   = showsString "(Equation "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsLhs lhs . space   . showsRhs rhs   . showsString ")"  showsLhs :: Show a => Lhs a -> ShowS-showsLhs (FunLhs ident conss)+showsLhs (FunLhs spi ident conss)   = showsString "(FunLhs "+  . showsSpanInfo spi . space   . showsIdent ident . space   . showsList showsConsTerm conss   . showsString ")"-showsLhs (OpLhs cons1 ident cons2)+showsLhs (OpLhs spi cons1 ident cons2)   = showsString "(OpLhs "+  . showsSpanInfo spi . space   . showsConsTerm cons1 . space   . showsIdent ident . space   . showsConsTerm cons2   . showsString ")"-showsLhs (ApLhs lhs conss)+showsLhs (ApLhs spi lhs conss)   = showsString "(ApLhs "+  . showsSpanInfo spi . space   . showsLhs lhs . space   . showsList showsConsTerm conss   . showsString ")"  showsRhs :: Show a => Rhs a -> ShowS-showsRhs (SimpleRhs pos expr decls)+showsRhs (SimpleRhs spi expr decls)   = showsString "(SimpleRhs "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsExpression expr . space   . showsList showsDecl decls   . showsString ")"-showsRhs (GuardedRhs cexps decls)+showsRhs (GuardedRhs spi cexps decls)   = showsString "(GuardedRhs "+  . showsSpanInfo spi . space   . showsList showsCondExpr cexps . space   . showsList showsDecl decls   . showsString ")"  showsCondExpr :: Show a => CondExpr a -> ShowS-showsCondExpr (CondExpr pos exp1 exp2)+showsCondExpr (CondExpr spi exp1 exp2)   = showsString "(CondExpr "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsExpression exp1 . space   . showsExpression exp2   . showsString ")"@@ -383,194 +406,231 @@   . showsString ")"  showsConsTerm :: Show a => Pattern a -> ShowS-showsConsTerm (LiteralPattern a lit)+showsConsTerm (LiteralPattern spi a lit)   = showsString "(LiteralPattern "+  . showsSpanInfo spi . space   . showsPrec 11 a . space   . showsLiteral lit   . showsString ")"-showsConsTerm (NegativePattern a lit)+showsConsTerm (NegativePattern spi a lit)   = showsString "(NegativePattern "+  . showsSpanInfo spi . space   . showsPrec 11 a . space   . showsLiteral lit   . showsString ")"-showsConsTerm (VariablePattern a ident)+showsConsTerm (VariablePattern spi a ident)   = showsString "(VariablePattern "+  . showsSpanInfo spi . space   . showsPrec 11 a . space   . showsIdent ident   . showsString ")"-showsConsTerm (ConstructorPattern a qident conss)+showsConsTerm (ConstructorPattern spi a qident conss)   = showsString "(ConstructorPattern "+  . showsSpanInfo spi . space   . showsPrec 11 a . space   . showsQualIdent qident . space   . showsList showsConsTerm conss   . showsString ")"-showsConsTerm (InfixPattern a cons1 qident cons2)+showsConsTerm (InfixPattern spi a cons1 qident cons2)   = showsString "(InfixPattern "+  . showsSpanInfo spi . space   . showsPrec 11 a . space   . showsConsTerm cons1 . space   . showsQualIdent qident . space   . showsConsTerm cons2   . showsString ")"-showsConsTerm (ParenPattern cons)+showsConsTerm (ParenPattern spi cons)   = showsString "(ParenPattern "+  . showsSpanInfo spi . space   . showsConsTerm cons   . showsString ")"-showsConsTerm (TuplePattern conss)+showsConsTerm (TuplePattern spi conss)   = showsString "(TuplePattern "+  . showsSpanInfo spi . space   . showsList showsConsTerm conss   . showsString ")"-showsConsTerm (ListPattern a conss)+showsConsTerm (ListPattern spi a conss)   = showsString "(ListPattern "+  . showsSpanInfo spi . space   . showsPrec 11 a . space   . showsList showsConsTerm conss   . showsString ")"-showsConsTerm (AsPattern ident cons)+showsConsTerm (AsPattern spi ident cons)   = showsString "(AsPattern "+  . showsSpanInfo spi . space   . showsIdent ident . space   . showsConsTerm cons   . showsString ")"-showsConsTerm (LazyPattern cons)+showsConsTerm (LazyPattern spi cons)   = showsString "(LazyPattern "+  . showsSpanInfo spi . space   . showsConsTerm cons   . showsString ")"-showsConsTerm (FunctionPattern a qident conss)+showsConsTerm (FunctionPattern spi a qident conss)   = showsString "(FunctionPattern "+  . showsSpanInfo spi . space   . showsPrec 11 a . space   . showsQualIdent qident . space   . showsList showsConsTerm conss   . showsString ")"-showsConsTerm (InfixFuncPattern a cons1 qident cons2)+showsConsTerm (InfixFuncPattern spi a cons1 qident cons2)   = showsString "(InfixFuncPattern "+  . showsSpanInfo spi . space   . showsPrec 11 a . space   . showsConsTerm cons1 . space   . showsQualIdent qident . space   . showsConsTerm cons2   . showsString ")"-showsConsTerm (RecordPattern a qident cfields)+showsConsTerm (RecordPattern spi a qident cfields)   = showsString "(RecordPattern "+  . showsSpanInfo spi . space   . showsPrec 11 a . space   . showsQualIdent qident . space   . showsList (showsField showsConsTerm) cfields . space   . showsString ")"  showsExpression :: Show a => Expression a -> ShowS-showsExpression (Literal a lit)+showsExpression (Literal spi a lit)   = showsString "(Literal "+  . showsSpanInfo spi . space   . showsPrec 11 a . space   . showsLiteral lit   . showsString ")"-showsExpression (Variable a qident)+showsExpression (Variable spi a qident)   = showsString "(Variable "+  . showsSpanInfo spi . space   . showsPrec 11 a . space   . showsQualIdent qident   . showsString ")"-showsExpression (Constructor a qident)+showsExpression (Constructor spi a qident)   = showsString "(Constructor "+  . showsSpanInfo spi . space   . showsPrec 11 a . space   . showsQualIdent qident   . showsString ")"-showsExpression (Paren expr)+showsExpression (Paren spi expr)   = showsString "(Paren "+  . showsSpanInfo spi . space   . showsExpression expr   . showsString ")"-showsExpression (Typed expr qtype)+showsExpression (Typed spi expr qtype)   = showsString "(Typed "+  . showsSpanInfo spi . space   . showsExpression expr . space   . showsQualTypeExpr qtype   . showsString ")"-showsExpression (Tuple exps)+showsExpression (Tuple spi exps)   = showsString "(Tuple "+  . showsSpanInfo spi . space   . showsList showsExpression exps   . showsString ")"-showsExpression (List a exps)+showsExpression (List spi a exps)   = showsString "(List "+  . showsSpanInfo spi . space   . showsPrec 11 a . space   . showsList showsExpression exps   . showsString ")"-showsExpression (ListCompr expr stmts)+showsExpression (ListCompr spi expr stmts)   = showsString "(ListCompr "+  . showsSpanInfo spi . space   . showsExpression expr . space   . showsList showsStatement stmts   . showsString ")"-showsExpression (EnumFrom expr)+showsExpression (EnumFrom spi expr)   = showsString "(EnumFrom "+  . showsSpanInfo spi . space   . showsExpression expr   . showsString ")"-showsExpression (EnumFromThen exp1 exp2)+showsExpression (EnumFromThen spi exp1 exp2)   = showsString "(EnumFromThen "+  . showsSpanInfo spi . space   . showsExpression exp1 . space   . showsExpression exp2   . showsString ")"-showsExpression (EnumFromTo exp1 exp2)+showsExpression (EnumFromTo spi exp1 exp2)   = showsString "(EnumFromTo "+  . showsSpanInfo spi . space   . showsExpression exp1 . space   . showsExpression exp2   . showsString ")"-showsExpression (EnumFromThenTo exp1 exp2 exp3)+showsExpression (EnumFromThenTo spi exp1 exp2 exp3)   = showsString "(EnumFromThenTo "+  . showsSpanInfo spi . space   . showsExpression exp1 . space   . showsExpression exp2 . space   . showsExpression exp3   . showsString ")"-showsExpression (UnaryMinus expr)+showsExpression (UnaryMinus spi expr)   = showsString "(UnaryMinus "+  . showsSpanInfo spi . space   . showsExpression expr   . showsString ")"-showsExpression (Apply exp1 exp2)+showsExpression (Apply spi exp1 exp2)   = showsString "(Apply "+  . showsSpanInfo spi . space   . showsExpression exp1 . space   . showsExpression exp2   . showsString ")"-showsExpression (InfixApply exp1 op exp2)+showsExpression (InfixApply spi exp1 op exp2)   = showsString "(InfixApply "+  . showsSpanInfo spi . space   . showsExpression exp1 . space   . showsInfixOp op . space   . showsExpression exp2   . showsString ")"-showsExpression (LeftSection expr op)+showsExpression (LeftSection spi expr op)   = showsString "(LeftSection "+  . showsSpanInfo spi . space   . showsExpression expr . space   . showsInfixOp op   . showsString ")"-showsExpression (RightSection op expr)+showsExpression (RightSection spi op expr)   = showsString "(RightSection "+  . showsSpanInfo spi . space   . showsInfixOp op . space   . showsExpression expr   . showsString ")"-showsExpression (Lambda conss expr)+showsExpression (Lambda spi conss expr)   = showsString "(Lambda "+  . showsSpanInfo spi . space   . showsList showsConsTerm conss . space   . showsExpression expr   . showsString ")"-showsExpression (Let decls expr)+showsExpression (Let spi decls expr)   = showsString "(Let "+  . showsSpanInfo spi . space   . showsList showsDecl decls . space   . showsExpression expr   . showsString ")"-showsExpression (Do stmts expr)+showsExpression (Do spi stmts expr)   = showsString "(Do "+  . showsSpanInfo spi . space   . showsList showsStatement stmts . space   . showsExpression expr   . showsString ")"-showsExpression (IfThenElse exp1 exp2 exp3)+showsExpression (IfThenElse spi exp1 exp2 exp3)   = showsString "(IfThenElse "+  . showsSpanInfo spi . space   . showsExpression exp1 . space   . showsExpression exp2 . space   . showsExpression exp3   . showsString ")"-showsExpression (Case ct expr alts)+showsExpression (Case spi ct expr alts)   = showsString "(Case "+  . showsSpanInfo spi . space   . showsCaseType ct . space   . showsExpression expr . space   . showsList showsAlt alts   . showsString ")"-showsExpression (RecordUpdate expr efields)+showsExpression (RecordUpdate spi expr efields)   = showsString "(RecordUpdate "+  . showsSpanInfo spi . space   . showsExpression expr . space   . showsList (showsField showsExpression) efields   . showsString ")"-showsExpression (Record a qident efields)+showsExpression (Record spi a qident efields)   = showsString "(Record "+  . showsSpanInfo spi . space   . showsPrec 11 a . space   . showsQualIdent qident . space   . showsList (showsField showsExpression) efields@@ -589,16 +649,19 @@   . showsString ")"  showsStatement :: Show a => Statement a -> ShowS-showsStatement (StmtExpr expr)+showsStatement (StmtExpr spi expr)   = showsString "(StmtExpr "+  . showsSpanInfo spi . space   . showsExpression expr   . showsString ")"-showsStatement (StmtDecl decls)+showsStatement (StmtDecl spi decls)   = showsString "(StmtDecl "+  . showsSpanInfo spi . space   . showsList showsDecl decls   . showsString ")"-showsStatement (StmtBind cons expr)+showsStatement (StmtBind spi cons expr)   = showsString "(StmtBind "+  . showsSpanInfo spi . space   . showsConsTerm cons . space   . showsExpression expr   . showsString ")"@@ -608,17 +671,17 @@ showsCaseType Flex  = showsString "Flex"  showsAlt :: Show a => Alt a -> ShowS-showsAlt (Alt pos cons rhs)+showsAlt (Alt spi cons rhs)   = showsString "(Alt "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsConsTerm cons . space   . showsRhs rhs   . showsString ")"  showsField :: (a -> ShowS) -> Field a -> ShowS-showsField sa (Field pos ident a)+showsField sa (Field spi ident a)   = showsString "(Field "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsQualIdent ident . space   . sa a   . showsString ")"@@ -631,15 +694,29 @@   . showsString ")"  showsPosition :: Position -> ShowS-showsPosition Position { line = l, column = c } = showsPair shows shows (l, c)-showsPosition _ = showsString "(0,0)"--- showsPosition (Position file row col)---   = showsString "(Position "---   . shows file . space---   . shows row . space---   . shows col---   . showsString ")"+showsPosition NoPos = showsString "NoPos"+showsPosition Position { line = l, column = c }+   = showsString "(Position "+   . shows l . space+   . shows c+   . showsString ")" +showsSpanInfo :: SpanInfo -> ShowS+showsSpanInfo NoSpanInfo = showsString "NoSpanInfo"+showsSpanInfo SpanInfo { srcSpan = sp, srcInfoPoints = ss }+  = showsString "(SpanInfo "+  . showsSpan sp . space+  . showsList showsSpan ss+  . showsString ")"++showsSpan :: Span -> ShowS+showsSpan NoSpan = showsString "NoSpan"+showsSpan Span { start = s, end = e }+  = showsString "(Span "+  . showsPosition s . space+  . showsPosition e+  . showsString ")"+ showsString :: String -> ShowS showsString = (++) @@ -665,22 +742,23 @@   = showsString "(" . sa a . showsString "," . sb b . showsString ")"  showsIdent :: Ident -> ShowS-showsIdent (Ident p x n)-  = showsString "(Ident " . showsPosition p . space+showsIdent (Ident spi x n)+  = showsString "(Ident " . showsSpanInfo spi . space   . shows x . space . shows n . showsString ")"  showsQualIdent :: QualIdent -> ShowS-showsQualIdent (QualIdent mident ident)+showsQualIdent (QualIdent spi mident ident)   = showsString "(QualIdent "+  . showsSpanInfo spi . space   . showsMaybe showsModuleIdent mident   . space   . showsIdent ident   . showsString ")"  showsModuleIdent :: ModuleIdent -> ShowS-showsModuleIdent (ModuleIdent pos ss)+showsModuleIdent (ModuleIdent spi ss)   = showsString "(ModuleIdent "-  . showsPosition pos . space+  . showsSpanInfo spi . space   . showsList (showsQuotes showsString) ss   . showsString ")" 
src/Curry/Syntax/Type.hs view
@@ -31,7 +31,7 @@     -- * Declarations   , Decl (..), Precedence, Infix (..), ConstrDecl (..), NewConstrDecl (..)   , FieldDecl (..)-  , CallConv (..), TypeExpr (..), QualTypeExpr (..)+  , TypeExpr (..), QualTypeExpr (..)   , Equation (..), Lhs (..), Rhs (..), CondExpr (..)   , Literal (..), Pattern (..), Expression (..), InfixOp (..)   , Statement (..), CaseType (..), Alt (..), Field (..), Var (..)@@ -43,6 +43,8 @@  import Curry.Base.Ident import Curry.Base.Position+import Curry.Base.SpanInfo+import Curry.Base.Span import Curry.Base.Pretty      (Pretty(..))  import Curry.Syntax.Extension@@ -54,30 +56,30 @@ -- ---------------------------------------------------------------------------  -- |Curry module-data Module a = Module [ModulePragma] ModuleIdent (Maybe ExportSpec)+data Module a = Module SpanInfo [ModulePragma] ModuleIdent (Maybe ExportSpec)                        [ImportDecl] [Decl a]     deriving (Eq, Read, Show)  -- |Module pragma data ModulePragma-  = LanguagePragma Position [Extension]         -- ^ language pragma-  | OptionsPragma  Position (Maybe Tool) String -- ^ options pragma+  = LanguagePragma SpanInfo [Extension]         -- ^ language pragma+  | OptionsPragma  SpanInfo (Maybe Tool) String -- ^ options pragma     deriving (Eq, Read, Show)  -- |Export specification-data ExportSpec = Exporting Position [Export]+data ExportSpec = Exporting SpanInfo [Export]     deriving (Eq, Read, Show)  -- |Single exported entity data Export-  = Export         QualIdent         -- f/T-  | ExportTypeWith QualIdent [Ident] -- T (C1,...,Cn)-  | ExportTypeAll  QualIdent         -- T (..)-  | ExportModule   ModuleIdent       -- module M+  = Export         SpanInfo QualIdent         -- f/T+  | ExportTypeWith SpanInfo QualIdent [Ident] -- T (C1,...,Cn)+  | ExportTypeAll  SpanInfo QualIdent         -- T (..)+  | ExportModule   SpanInfo ModuleIdent       -- module M     deriving (Eq, Read, Show)  -- |Import declaration-data ImportDecl = ImportDecl Position ModuleIdent Qualified+data ImportDecl = ImportDecl SpanInfo ModuleIdent Qualified                              (Maybe ModuleIdent) (Maybe ImportSpec)     deriving (Eq, Read, Show) @@ -86,15 +88,15 @@  -- |Import specification data ImportSpec-  = Importing Position [Import]-  | Hiding    Position [Import]+  = Importing SpanInfo [Import]+  | Hiding    SpanInfo [Import]     deriving (Eq, Read, Show)  -- |Single imported entity data Import-  = Import         Ident            -- f/T-  | ImportTypeWith Ident [Ident]    -- T (C1,...,Cn)-  | ImportTypeAll  Ident            -- T (..)+  = Import         SpanInfo Ident            -- f/T+  | ImportTypeWith SpanInfo Ident [Ident]    -- T (C1,...,Cn)+  | ImportTypeAll  SpanInfo Ident            -- T (..)     deriving (Eq, Read, Show)  -- ---------------------------------------------------------------------------@@ -149,19 +151,19 @@  -- |Declaration in a module data Decl a-  = InfixDecl        Position Infix (Maybe Precedence) [Ident]         -- infixl 5 (op), `fun`-  | DataDecl         Position Ident [Ident] [ConstrDecl] [QualIdent]   -- data C a b = C1 a | C2 b deriving (D, ...)-  | ExternalDataDecl Position Ident [Ident]-  | NewtypeDecl      Position Ident [Ident] NewConstrDecl [QualIdent]  -- newtype C a b = C a b deriving (D, ...)-  | TypeDecl         Position Ident [Ident] TypeExpr                   -- type C a b = D a b-  | TypeSig          Position [Ident] QualTypeExpr                     -- f, g :: Bool-  | FunctionDecl     Position a Ident [Equation a]                     -- f True = 1 ; f False = 0-  | ExternalDecl     Position [Var a]                                  -- f, g external-  | PatternDecl      Position (Pattern a) (Rhs a)                      -- Just x = ...-  | FreeDecl         Position [Var a]                                  -- x, y free-  | DefaultDecl      Position [TypeExpr]                               -- default (Int, Float)-  | ClassDecl        Position Context Ident Ident [Decl a]             -- class C a => D a where {TypeSig|InfixDecl|FunctionDecl}-  | InstanceDecl     Position Context QualIdent InstanceType [Decl a]  -- instance C a => M.D (N.T a b c) where {FunctionDecl}+  = InfixDecl        SpanInfo Infix (Maybe Precedence) [Ident]         -- infixl 5 (op), `fun`+  | DataDecl         SpanInfo Ident [Ident] [ConstrDecl] [QualIdent]   -- data C a b = C1 a | C2 b deriving (D, ...)+  | ExternalDataDecl SpanInfo Ident [Ident]+  | NewtypeDecl      SpanInfo Ident [Ident] NewConstrDecl [QualIdent]  -- newtype C a b = C a b deriving (D, ...)+  | TypeDecl         SpanInfo Ident [Ident] TypeExpr                   -- type C a b = D a b+  | TypeSig          SpanInfo [Ident] QualTypeExpr                     -- f, g :: Bool+  | FunctionDecl     SpanInfo a Ident [Equation a]                     -- f True = 1 ; f False = 0+  | ExternalDecl     SpanInfo [Var a]                                  -- f, g external+  | PatternDecl      SpanInfo (Pattern a) (Rhs a)                      -- Just x = ...+  | FreeDecl         SpanInfo [Var a]                                  -- x, y free+  | DefaultDecl      SpanInfo [TypeExpr]                               -- default (Int, Float)+  | ClassDecl        SpanInfo Context Ident Ident [Decl a]             -- class C a => D a where {TypeSig|InfixDecl|FunctionDecl}+  | InstanceDecl     SpanInfo Context QualIdent InstanceType [Decl a]  -- instance C a => M.D (N.T a b c) where {FunctionDecl}     deriving (Eq, Read, Show)  -- ---------------------------------------------------------------------------@@ -180,41 +182,35 @@  -- |Constructor declaration for algebraic data types data ConstrDecl-  = ConstrDecl Position [Ident] Context Ident [TypeExpr]-  | ConOpDecl  Position [Ident] Context TypeExpr Ident TypeExpr-  | RecordDecl Position [Ident] Context Ident [FieldDecl]+  = ConstrDecl SpanInfo [Ident] Context Ident [TypeExpr]+  | ConOpDecl  SpanInfo [Ident] Context TypeExpr Ident TypeExpr+  | RecordDecl SpanInfo [Ident] Context Ident [FieldDecl]     deriving (Eq, Read, Show)  -- |Constructor declaration for renaming types (newtypes) data NewConstrDecl-  = NewConstrDecl Position Ident TypeExpr-  | NewRecordDecl Position Ident (Ident, TypeExpr)+  = NewConstrDecl SpanInfo Ident TypeExpr+  | NewRecordDecl SpanInfo Ident (Ident, TypeExpr)    deriving (Eq, Read, Show)  -- |Declaration for labelled fields-data FieldDecl = FieldDecl Position [Ident] TypeExpr+data FieldDecl = FieldDecl SpanInfo [Ident] TypeExpr   deriving (Eq, Read, Show) --- |Calling convention for C code-data CallConv-  = CallConvPrimitive-  | CallConvCCall-    deriving (Eq, Read, Show)- -- |Type expressions data TypeExpr-  = ConstructorType QualIdent-  | ApplyType       TypeExpr TypeExpr-  | VariableType    Ident-  | TupleType       [TypeExpr]-  | ListType        TypeExpr-  | ArrowType       TypeExpr TypeExpr-  | ParenType       TypeExpr-  | ForallType      [Ident] TypeExpr+  = ConstructorType SpanInfo QualIdent+  | ApplyType       SpanInfo TypeExpr TypeExpr+  | VariableType    SpanInfo Ident+  | TupleType       SpanInfo [TypeExpr]+  | ListType        SpanInfo TypeExpr+  | ArrowType       SpanInfo TypeExpr TypeExpr+  | ParenType       SpanInfo TypeExpr+  | ForallType      SpanInfo [Ident] TypeExpr     deriving (Eq, Read, Show)  -- |Qualified type expressions-data QualTypeExpr = QualTypeExpr Context TypeExpr+data QualTypeExpr = QualTypeExpr SpanInfo Context TypeExpr     deriving (Eq, Read, Show)  -- ---------------------------------------------------------------------------@@ -223,7 +219,7 @@  type Context = [Constraint] -data Constraint = Constraint QualIdent TypeExpr+data Constraint = Constraint SpanInfo QualIdent TypeExpr     deriving (Eq, Read, Show)  type InstanceType = TypeExpr@@ -233,24 +229,24 @@ -- ---------------------------------------------------------------------------  -- |Function defining equation-data Equation a = Equation Position (Lhs a) (Rhs a)+data Equation a = Equation SpanInfo (Lhs a) (Rhs a)     deriving (Eq, Read, Show)  -- |Left-hand-side of an 'Equation' (function identifier and patterns) data Lhs a-  = FunLhs Ident [Pattern a]             -- f x y-  | OpLhs  (Pattern a) Ident (Pattern a) -- x $ y-  | ApLhs  (Lhs a) [Pattern a]           -- ($) x y+  = FunLhs SpanInfo Ident [Pattern a]             -- f x y+  | OpLhs  SpanInfo (Pattern a) Ident (Pattern a) -- x $ y+  | ApLhs  SpanInfo (Lhs a) [Pattern a]           -- ($) x y     deriving (Eq, Read, Show)  -- |Right-hand-side of an 'Equation' data Rhs a-  = SimpleRhs  Position (Expression a) [Decl a] -- @expr where decls@-  | GuardedRhs [CondExpr a] [Decl a]            -- @| cond = expr where decls@+  = SimpleRhs  SpanInfo (Expression a) [Decl a] -- @expr where decls@+  | GuardedRhs SpanInfo [CondExpr a] [Decl a]   -- @| cond = expr where decls@     deriving (Eq, Read, Show)  -- |Conditional expression (expression conditioned by a guard)-data CondExpr a = CondExpr Position (Expression a) (Expression a)+data CondExpr a = CondExpr SpanInfo (Expression a) (Expression a)     deriving (Eq, Read, Show)  -- |Literal@@ -263,47 +259,47 @@  -- |Constructor term (used for patterns) data Pattern a-  = LiteralPattern     a Literal-  | NegativePattern    a Literal-  | VariablePattern    a Ident-  | ConstructorPattern a QualIdent [Pattern a]-  | InfixPattern       a (Pattern a) QualIdent (Pattern a)-  | ParenPattern       (Pattern a)-  | RecordPattern      a QualIdent [Field (Pattern a)] -- C { l1 = p1, ..., ln = pn }-  | TuplePattern       [Pattern a]-  | ListPattern        a [Pattern a]-  | AsPattern          Ident (Pattern a)-  | LazyPattern        (Pattern a)-  | FunctionPattern    a QualIdent [Pattern a]-  | InfixFuncPattern   a (Pattern a) QualIdent (Pattern a)+  = LiteralPattern     SpanInfo a Literal+  | NegativePattern    SpanInfo a Literal+  | VariablePattern    SpanInfo a Ident+  | ConstructorPattern SpanInfo a QualIdent [Pattern a]+  | InfixPattern       SpanInfo a (Pattern a) QualIdent (Pattern a)+  | ParenPattern       SpanInfo (Pattern a)+  | RecordPattern      SpanInfo a QualIdent [Field (Pattern a)] -- C { l1 = p1, ..., ln = pn }+  | TuplePattern       SpanInfo [Pattern a]+  | ListPattern        SpanInfo a [Pattern a]+  | AsPattern          SpanInfo Ident (Pattern a)+  | LazyPattern        SpanInfo (Pattern a)+  | FunctionPattern    SpanInfo a QualIdent [Pattern a]+  | InfixFuncPattern   SpanInfo a (Pattern a) QualIdent (Pattern a)     deriving (Eq, Read, Show)  -- |Expression data Expression a-  = Literal           a Literal-  | Variable          a QualIdent-  | Constructor       a QualIdent-  | Paren             (Expression a)-  | Typed             (Expression a) QualTypeExpr-  | Record            a QualIdent [Field (Expression a)]    -- C {l1 = e1,..., ln = en}-  | RecordUpdate      (Expression a) [Field (Expression a)] -- e {l1 = e1,..., ln = en}-  | Tuple             [Expression a]-  | List              a [Expression a]-  | ListCompr         (Expression a) [Statement a]   -- the ref corresponds to the main list-  | EnumFrom          (Expression a)-  | EnumFromThen      (Expression a) (Expression a)-  | EnumFromTo        (Expression a) (Expression a)-  | EnumFromThenTo    (Expression a) (Expression a) (Expression a)-  | UnaryMinus        (Expression a)-  | Apply             (Expression a) (Expression a)-  | InfixApply        (Expression a) (InfixOp a) (Expression a)-  | LeftSection       (Expression a) (InfixOp a)-  | RightSection      (InfixOp a) (Expression a)-  | Lambda            [Pattern a] (Expression a)-  | Let               [Decl a] (Expression a)-  | Do                [Statement a] (Expression a)-  | IfThenElse        (Expression a) (Expression a) (Expression a)-  | Case              CaseType (Expression a) [Alt a]+  = Literal           SpanInfo a Literal+  | Variable          SpanInfo a QualIdent+  | Constructor       SpanInfo a QualIdent+  | Paren             SpanInfo (Expression a)+  | Typed             SpanInfo (Expression a) QualTypeExpr+  | Record            SpanInfo a QualIdent [Field (Expression a)]    -- C {l1 = e1,..., ln = en}+  | RecordUpdate      SpanInfo (Expression a) [Field (Expression a)] -- e {l1 = e1,..., ln = en}+  | Tuple             SpanInfo [Expression a]+  | List              SpanInfo a [Expression a]+  | ListCompr         SpanInfo (Expression a) [Statement a]   -- the ref corresponds to the main list+  | EnumFrom          SpanInfo (Expression a)+  | EnumFromThen      SpanInfo (Expression a) (Expression a)+  | EnumFromTo        SpanInfo (Expression a) (Expression a)+  | EnumFromThenTo    SpanInfo (Expression a) (Expression a) (Expression a)+  | UnaryMinus        SpanInfo (Expression a)+  | Apply             SpanInfo (Expression a) (Expression a)+  | InfixApply        SpanInfo (Expression a) (InfixOp a) (Expression a)+  | LeftSection       SpanInfo (Expression a) (InfixOp a)+  | RightSection      SpanInfo (InfixOp a) (Expression a)+  | Lambda            SpanInfo [Pattern a] (Expression a)+  | Let               SpanInfo [Decl a] (Expression a)+  | Do                SpanInfo [Statement a] (Expression a)+  | IfThenElse        SpanInfo (Expression a) (Expression a) (Expression a)+  | Case              SpanInfo CaseType (Expression a) [Alt a]     deriving (Eq, Read, Show)  -- |Infix operation@@ -314,9 +310,9 @@  -- |Statement (used for do-sequence and list comprehensions) data Statement a-  = StmtExpr (Expression a)-  | StmtDecl [Decl a]-  | StmtBind (Pattern a) (Expression a)+  = StmtExpr SpanInfo (Expression a)+  | StmtDecl SpanInfo [Decl a]+  | StmtBind SpanInfo (Pattern a) (Expression a)     deriving (Eq, Read, Show)  -- |Type of case expressions@@ -326,11 +322,11 @@     deriving (Eq, Read, Show)  -- |Single case alternative-data Alt a = Alt Position (Pattern a) (Rhs a)+data Alt a = Alt SpanInfo (Pattern a) (Rhs a)     deriving (Eq, Read, Show)  -- |Record field-data Field a = Field Position QualIdent a+data Field a = Field SpanInfo QualIdent a     deriving (Eq, Read, Show)  -- |Annotated identifier@@ -342,7 +338,7 @@ -- ---------------------------------------------------------------------------  -- |Goal in REPL (expression to evaluate)-data Goal a = Goal Position (Expression a) [Decl a]+data Goal a = Goal SpanInfo (Expression a) [Decl a]     deriving (Eq, Read, Show)  -- ---------------------------------------------------------------------------@@ -350,97 +346,97 @@ -- ---------------------------------------------------------------------------  instance Functor Module where-  fmap f (Module ps m es is ds) = Module ps m es is (map (fmap f) ds)+  fmap f (Module sp ps m es is ds) = Module sp ps m es is (map (fmap f) ds)  instance Functor Decl where-  fmap _ (InfixDecl p fix prec ops) = InfixDecl p fix prec ops-  fmap _ (DataDecl p tc tvs cs clss) = DataDecl p tc tvs cs clss-  fmap _ (ExternalDataDecl p tc tvs) = ExternalDataDecl p tc tvs-  fmap _ (NewtypeDecl p tc tvs nc clss) = NewtypeDecl p tc tvs nc clss-  fmap _ (TypeDecl p tc tvs ty) = TypeDecl p tc tvs ty-  fmap _ (TypeSig p fs qty) = TypeSig p fs qty-  fmap f (FunctionDecl p a f' eqs) = FunctionDecl p (f a) f' (map (fmap f) eqs)-  fmap f (ExternalDecl p vs) = ExternalDecl p (map (fmap f) vs)-  fmap f (PatternDecl p t rhs) = PatternDecl p (fmap f t) (fmap f rhs)-  fmap f (FreeDecl p vs) = FreeDecl p (map (fmap f) vs)-  fmap _ (DefaultDecl p tys) = DefaultDecl p tys-  fmap f (ClassDecl p cx cls clsvar ds) =-    ClassDecl p cx cls clsvar (map (fmap f) ds)-  fmap f (InstanceDecl p cx qcls inst ds) =-    InstanceDecl p cx qcls inst (map (fmap f) ds)+  fmap _ (InfixDecl sp fix prec ops) = InfixDecl sp fix prec ops+  fmap _ (DataDecl sp tc tvs cs clss) = DataDecl sp tc tvs cs clss+  fmap _ (ExternalDataDecl sp tc tvs) = ExternalDataDecl sp tc tvs+  fmap _ (NewtypeDecl sp tc tvs nc clss) = NewtypeDecl sp tc tvs nc clss+  fmap _ (TypeDecl sp tc tvs ty) = TypeDecl sp tc tvs ty+  fmap _ (TypeSig sp fs qty) = TypeSig sp fs qty+  fmap f (FunctionDecl sp a f' eqs) = FunctionDecl sp (f a) f' (map (fmap f) eqs)+  fmap f (ExternalDecl sp vs) = ExternalDecl sp (map (fmap f) vs)+  fmap f (PatternDecl sp t rhs) = PatternDecl sp (fmap f t) (fmap f rhs)+  fmap f (FreeDecl sp vs) = FreeDecl sp (map (fmap f) vs)+  fmap _ (DefaultDecl sp tys) = DefaultDecl sp tys+  fmap f (ClassDecl sp cx cls clsvar ds) =+    ClassDecl sp cx cls clsvar (map (fmap f) ds)+  fmap f (InstanceDecl sp cx qcls inst ds) =+    InstanceDecl sp cx qcls inst (map (fmap f) ds)  instance Functor Equation where   fmap f (Equation p lhs rhs) = Equation p (fmap f lhs) (fmap f rhs)  instance Functor Lhs where-  fmap f (FunLhs f' ts) = FunLhs f' (map (fmap f) ts)-  fmap f (OpLhs t1 op t2) = OpLhs (fmap f t1) op (fmap f t2)-  fmap f (ApLhs lhs ts) = ApLhs (fmap f lhs) (map (fmap f) ts)+  fmap f (FunLhs p f' ts) = FunLhs p f' (map (fmap f) ts)+  fmap f (OpLhs p t1 op t2) = OpLhs p (fmap f t1) op (fmap f t2)+  fmap f (ApLhs p lhs ts) = ApLhs p (fmap f lhs) (map (fmap f) ts)  instance Functor Rhs where   fmap f (SimpleRhs p e ds) = SimpleRhs p (fmap f e) (map (fmap f) ds)-  fmap f (GuardedRhs cs ds) = GuardedRhs (map (fmap f) cs) (map (fmap f) ds)+  fmap f (GuardedRhs p cs ds) = GuardedRhs p (map (fmap f) cs) (map (fmap f) ds)  instance Functor CondExpr where   fmap f (CondExpr p g e) = CondExpr p (fmap f g) (fmap f e)  instance Functor Pattern where-  fmap f (LiteralPattern a l) = LiteralPattern (f a) l-  fmap f (NegativePattern a l) = NegativePattern (f a) l-  fmap f (VariablePattern a v) = VariablePattern (f a) v-  fmap f (ConstructorPattern a c ts) =-    ConstructorPattern (f a) c (map (fmap f) ts)-  fmap f (InfixPattern a t1 op t2) =-    InfixPattern (f a) (fmap f t1) op (fmap f t2)-  fmap f (ParenPattern t) = ParenPattern (fmap f t)-  fmap f (RecordPattern a c fs) =-    RecordPattern (f a) c (map (fmap (fmap f)) fs)-  fmap f (TuplePattern ts) = TuplePattern (map (fmap f) ts)-  fmap f (ListPattern a ts) = ListPattern (f a) (map (fmap f) ts)-  fmap f (AsPattern v t) = AsPattern v (fmap f t)-  fmap f (LazyPattern t) = LazyPattern (fmap f t)-  fmap f (FunctionPattern a f' ts) =-    FunctionPattern (f a) f' (map (fmap f) ts)-  fmap f (InfixFuncPattern a t1 op t2) =-    InfixFuncPattern (f a) (fmap f t1) op (fmap f t2)+  fmap f (LiteralPattern p a l) = LiteralPattern p (f a) l+  fmap f (NegativePattern p a l) = NegativePattern p (f a) l+  fmap f (VariablePattern p a v) = VariablePattern p (f a) v+  fmap f (ConstructorPattern p a c ts) =+    ConstructorPattern p (f a) c (map (fmap f) ts)+  fmap f (InfixPattern p a t1 op t2) =+    InfixPattern p (f a) (fmap f t1) op (fmap f t2)+  fmap f (ParenPattern p t) = ParenPattern p (fmap f t)+  fmap f (RecordPattern p a c fs) =+    RecordPattern p (f a) c (map (fmap (fmap f)) fs)+  fmap f (TuplePattern p ts) = TuplePattern p (map (fmap f) ts)+  fmap f (ListPattern p a ts) = ListPattern p (f a) (map (fmap f) ts)+  fmap f (AsPattern p v t) = AsPattern p v (fmap f t)+  fmap f (LazyPattern p t) = LazyPattern p (fmap f t)+  fmap f (FunctionPattern p a f' ts) =+    FunctionPattern p (f a) f' (map (fmap f) ts)+  fmap f (InfixFuncPattern p a t1 op t2) =+    InfixFuncPattern p (f a) (fmap f t1) op (fmap f t2)  instance Functor Expression where-  fmap f (Literal a l) = Literal (f a) l-  fmap f (Variable a v) = Variable (f a) v-  fmap f (Constructor a c) = Constructor (f a) c-  fmap f (Paren e) = Paren (fmap f e)-  fmap f (Typed e qty) = Typed (fmap f e) qty-  fmap f (Record a c fs) = Record (f a) c (map (fmap (fmap f)) fs)-  fmap f (RecordUpdate e fs) = RecordUpdate (fmap f e) (map (fmap (fmap f)) fs)-  fmap f (Tuple es) = Tuple (map (fmap f) es)-  fmap f (List a es) = List (f a) (map (fmap f) es)-  fmap f (ListCompr e stms) = ListCompr (fmap f e) (map (fmap f) stms)-  fmap f (EnumFrom e) = EnumFrom (fmap f e)-  fmap f (EnumFromThen e1 e2) = EnumFromThen (fmap f e1) (fmap f e2)-  fmap f (EnumFromTo e1 e2) = EnumFromTo (fmap f e1) (fmap f e2)-  fmap f (EnumFromThenTo e1 e2 e3) =-    EnumFromThenTo (fmap f e1) (fmap f e2) (fmap f e3)-  fmap f (UnaryMinus e) = UnaryMinus (fmap f e)-  fmap f (Apply e1 e2) = Apply (fmap f e1) (fmap f e2)-  fmap f (InfixApply e1 op e2) =-    InfixApply (fmap f e1) (fmap f op) (fmap f e2)-  fmap f (LeftSection e op) = LeftSection (fmap f e) (fmap f op)-  fmap f (RightSection op e) = RightSection (fmap f op) (fmap f e)-  fmap f (Lambda ts e) = Lambda (map (fmap f) ts) (fmap f e)-  fmap f (Let ds e) = Let (map (fmap f) ds) (fmap f e)-  fmap f (Do stms e) = Do (map (fmap f) stms) (fmap f e)-  fmap f (IfThenElse e1 e2 e3) =-    IfThenElse (fmap f e1) (fmap f e2) (fmap f e3)-  fmap f (Case ct e as) = Case ct (fmap f e) (map (fmap f) as)+  fmap f (Literal p a l) = Literal p (f a) l+  fmap f (Variable p a v) = Variable p (f a) v+  fmap f (Constructor p a c) = Constructor p (f a) c+  fmap f (Paren p e) = Paren p (fmap f e)+  fmap f (Typed p e qty) = Typed p (fmap f e) qty+  fmap f (Record p a c fs) = Record p (f a) c (map (fmap (fmap f)) fs)+  fmap f (RecordUpdate p e fs) = RecordUpdate p (fmap f e) (map (fmap (fmap f)) fs)+  fmap f (Tuple p es) = Tuple p (map (fmap f) es)+  fmap f (List p a es) = List p (f a) (map (fmap f) es)+  fmap f (ListCompr p e stms) = ListCompr p (fmap f e) (map (fmap f) stms)+  fmap f (EnumFrom p e) = EnumFrom p (fmap f e)+  fmap f (EnumFromThen p e1 e2) = EnumFromThen p (fmap f e1) (fmap f e2)+  fmap f (EnumFromTo p e1 e2) = EnumFromTo p (fmap f e1) (fmap f e2)+  fmap f (EnumFromThenTo p e1 e2 e3) =+    EnumFromThenTo p (fmap f e1) (fmap f e2) (fmap f e3)+  fmap f (UnaryMinus p e) = UnaryMinus p (fmap f e)+  fmap f (Apply p e1 e2) = Apply p (fmap f e1) (fmap f e2)+  fmap f (InfixApply p e1 op e2) =+    InfixApply p (fmap f e1) (fmap f op) (fmap f e2)+  fmap f (LeftSection p e op) = LeftSection p (fmap f e) (fmap f op)+  fmap f (RightSection p op e) = RightSection p (fmap f op) (fmap f e)+  fmap f (Lambda p ts e) = Lambda p (map (fmap f) ts) (fmap f e)+  fmap f (Let p ds e) = Let p (map (fmap f) ds) (fmap f e)+  fmap f (Do p stms e) = Do p (map (fmap f) stms) (fmap f e)+  fmap f (IfThenElse p e1 e2 e3) =+    IfThenElse p (fmap f e1) (fmap f e2) (fmap f e3)+  fmap f (Case p ct e as) = Case p ct (fmap f e) (map (fmap f) as)  instance Functor InfixOp where   fmap f (InfixOp a op) = InfixOp (f a) op   fmap f (InfixConstr a op) = InfixConstr (f a) op  instance Functor Statement where-  fmap f (StmtExpr e) = StmtExpr (fmap f e)-  fmap f (StmtDecl ds) = StmtDecl (map (fmap f) ds)-  fmap f (StmtBind t e) = StmtBind (fmap f t) (fmap f e)+  fmap f (StmtExpr p e) = StmtExpr p (fmap f e)+  fmap f (StmtDecl p ds) = StmtDecl p (map (fmap f) ds)+  fmap f (StmtBind p t e) = StmtBind p (fmap f t) (fmap f e)  instance Functor Alt where   fmap f (Alt p t rhs) = Alt p (fmap f t) (fmap f rhs)@@ -458,3 +454,644 @@   pPrint InfixL = text "infixl"   pPrint InfixR = text "infixr"   pPrint Infix  = text "infix"++instance HasSpanInfo (Module a) where+  getSpanInfo (Module sp _ _ _ _ _) = sp++  setSpanInfo sp (Module _ ps m es is ds) = Module sp ps m es is ds++  updateEndPos m@(Module _ _ _ _ _ (d:ds)) =+    setEndPosition (getSrcSpanEnd (last (d:ds))) m+  updateEndPos m@(Module _ _ _ _ (i:is) _) =+    setEndPosition (getSrcSpanEnd (last (i:is))) m+  updateEndPos m@(Module (SpanInfo _ (s:ss)) _ _ _ _ _) =+    setEndPosition (end (last (s:ss))) m+  updateEndPos m@(Module _ (p:ps) _ _ _ _) =+    setEndPosition (getSrcSpanEnd (last (p:ps))) m+  updateEndPos m = m++instance HasSpanInfo (Decl a) where+  getSpanInfo (InfixDecl        sp _ _ _)   = sp+  getSpanInfo (DataDecl         sp _ _ _ _) = sp+  getSpanInfo (ExternalDataDecl sp _ _)     = sp+  getSpanInfo (NewtypeDecl      sp _ _ _ _) = sp+  getSpanInfo (TypeDecl         sp _ _ _)   = sp+  getSpanInfo (TypeSig          sp _ _)     = sp+  getSpanInfo (FunctionDecl     sp _ _ _)   = sp+  getSpanInfo (ExternalDecl     sp _)       = sp+  getSpanInfo (PatternDecl      sp _ _)     = sp+  getSpanInfo (FreeDecl         sp _)       = sp+  getSpanInfo (DefaultDecl      sp _)       = sp+  getSpanInfo (ClassDecl        sp _ _ _ _) = sp+  getSpanInfo (InstanceDecl     sp _ _ _ _) = sp++  setSpanInfo sp (InfixDecl _ fix prec ops) = InfixDecl sp fix prec ops+  setSpanInfo sp (DataDecl _ tc tvs cs clss) = DataDecl sp tc tvs cs clss+  setSpanInfo sp (ExternalDataDecl _ tc tvs) = ExternalDataDecl sp tc tvs+  setSpanInfo sp (NewtypeDecl _ tc tvs nc clss) = NewtypeDecl sp tc tvs nc clss+  setSpanInfo sp (TypeDecl _ tc tvs ty) = TypeDecl sp tc tvs ty+  setSpanInfo sp (TypeSig _ fs qty) = TypeSig sp fs qty+  setSpanInfo sp (FunctionDecl _ a f' eqs) = FunctionDecl sp a f' eqs+  setSpanInfo sp (ExternalDecl _ vs) = ExternalDecl sp vs+  setSpanInfo sp (PatternDecl _ t rhs) = PatternDecl sp t rhs+  setSpanInfo sp (FreeDecl _ vs) = FreeDecl sp vs+  setSpanInfo sp (DefaultDecl _ tys) = DefaultDecl sp tys+  setSpanInfo sp (ClassDecl _ cx cls clsvar ds) = ClassDecl sp cx cls clsvar ds+  setSpanInfo sp (InstanceDecl _ cx qcls inst ds) = InstanceDecl sp cx qcls inst ds++  updateEndPos d@(InfixDecl _ _ _ ops) =+    let i' = last ops+    in setEndPosition (incr (getPosition i') (identLength i' - 1)) d+  updateEndPos d@(DataDecl _ _ _ _ (c:cs)) =+    let i' = last (c:cs)+    in setEndPosition (incr (getPosition i') (qIdentLength i' - 1)) d+  updateEndPos d@(DataDecl _ _ _ (c:cs) _) =+    setEndPosition (getSrcSpanEnd (last (c:cs))) d+  updateEndPos d@(DataDecl _ _ (i:is) _ _) =+    let i' = last (i:is)+    in setEndPosition (incr (getPosition i') (identLength i' - 1)) d+  updateEndPos d@(DataDecl _ i _ _ _) =+    setEndPosition (incr (getPosition i) (identLength i - 1)) d+  updateEndPos d@(ExternalDataDecl _ _ (i:is)) =+    let i' = last (i:is)+    in setEndPosition (incr (getPosition i') (identLength i' - 1)) d+  updateEndPos d@(ExternalDataDecl _ i _) =+    setEndPosition (incr (getPosition i) (identLength i - 1)) d+  updateEndPos d@(NewtypeDecl _ _ _ _ (c:cs)) =+    let i' = last (c:cs)+    in setEndPosition (incr (getPosition i') (qIdentLength i' - 1)) d+  updateEndPos d@(NewtypeDecl _ _ _ c _) =+    setEndPosition (getSrcSpanEnd c) d+  updateEndPos d@(TypeDecl _ _ _ ty) =+    setEndPosition (getSrcSpanEnd ty) d+  updateEndPos d@(TypeSig _ _ qty) =+    setEndPosition (getSrcSpanEnd qty) d+  updateEndPos d@(FunctionDecl _ _ _ eqs) =+    setEndPosition (getSrcSpanEnd (last eqs)) d+  updateEndPos d@(ExternalDecl (SpanInfo _ ss) _) =+    setEndPosition (end (last ss)) d+  updateEndPos d@(ExternalDecl _ _) = d+  updateEndPos d@(PatternDecl _ _ rhs) =+    setEndPosition (getSrcSpanEnd rhs) d+  updateEndPos d@(FreeDecl (SpanInfo _ ss) _) =+    setEndPosition (end (last ss)) d+  updateEndPos d@(FreeDecl _ _) = d+  updateEndPos d@(DefaultDecl (SpanInfo _ ss) _) =+    setEndPosition (end (last ss)) d+  updateEndPos d@(DefaultDecl _ _) = d+  updateEndPos d@(ClassDecl _ _ _ _ (d':ds)) =+    setEndPosition (getSrcSpanEnd (last (d':ds))) d+  updateEndPos d@(ClassDecl (SpanInfo _ ss) _ _ _ _) =+    setEndPosition (end (last ss)) d+  updateEndPos d@(ClassDecl _ _ _ _ _) = d+  updateEndPos d@(InstanceDecl _ _ _ _ (d':ds)) =+    setEndPosition (getSrcSpanEnd (last (d':ds))) d+  updateEndPos d@(InstanceDecl (SpanInfo _ ss) _ _ _ _) =+    setEndPosition (end (last ss)) d+  updateEndPos d@(InstanceDecl _ _ _ _ _) = d++instance HasSpanInfo (Equation a) where+  getSpanInfo (Equation spi _ _) = spi+  setSpanInfo spi (Equation _ lhs rhs) = Equation spi lhs rhs+  updateEndPos e@(Equation _ _ rhs) =+    setEndPosition (getSrcSpanEnd rhs) e++instance HasSpanInfo ModulePragma where+  getSpanInfo (LanguagePragma sp _  ) = sp+  getSpanInfo (OptionsPragma  sp _ _) = sp++  setSpanInfo sp (LanguagePragma _ ex ) = LanguagePragma sp ex+  setSpanInfo sp (OptionsPragma  _ t a) = OptionsPragma sp t a++  updateEndPos p@(LanguagePragma (SpanInfo _ ss) _) =+    setEndPosition (end (last ss)) p+  updateEndPos p@(LanguagePragma _ _) = p+  updateEndPos p@(OptionsPragma (SpanInfo _ ss) _ _) =+    setEndPosition (end (last ss)) p+  updateEndPos p@(OptionsPragma _ _ _) = p++instance HasSpanInfo ExportSpec where+  getSpanInfo (Exporting sp _) = sp+  setSpanInfo sp (Exporting _ ex) = Exporting sp ex++  updateEndPos e@(Exporting (SpanInfo _ ss) _) =+    setEndPosition (end (last ss)) e+  updateEndPos e@(Exporting _ _) = e++instance HasSpanInfo Export where+  getSpanInfo (Export sp _)           = sp+  getSpanInfo (ExportTypeWith sp _ _) = sp+  getSpanInfo (ExportTypeAll sp _)    = sp+  getSpanInfo (ExportModule sp _)     = sp++  setSpanInfo sp (Export _ qid)            = Export sp qid+  setSpanInfo sp (ExportTypeWith _ qid cs) = ExportTypeWith sp qid cs+  setSpanInfo sp (ExportTypeAll _ qid)     = ExportTypeAll sp qid+  setSpanInfo sp (ExportModule _ mid)      = ExportModule sp mid++  updateEndPos e@(Export _ idt) =+    setEndPosition (incr (getPosition idt) (qIdentLength idt - 1)) e+  updateEndPos e@(ExportTypeWith (SpanInfo _ ss) _ _) =+    setEndPosition (end (last ss)) e+  updateEndPos e@(ExportTypeWith _ _ _) = e+  updateEndPos e@(ExportTypeAll (SpanInfo _ ss) _) =+    setEndPosition (end (last ss)) e+  updateEndPos e@(ExportTypeAll _ _) = e+  updateEndPos e@(ExportModule _ mid) =+    setEndPosition (incr (getPosition mid) (mIdentLength mid - 1)) e++instance HasSpanInfo ImportDecl where+  getSpanInfo (ImportDecl sp _ _ _ _) = sp+  setSpanInfo sp (ImportDecl _ mid q as spec) = ImportDecl sp mid q as spec++  updateEndPos i@(ImportDecl _ _ _ _ (Just spec)) =+    setEndPosition (getSrcSpanEnd spec) i+  updateEndPos i@(ImportDecl _ _ _ (Just mid) _) =+    setEndPosition (incr (getPosition mid) (mIdentLength mid - 1)) i+  updateEndPos i@(ImportDecl _ mid _ _ _) =+    setEndPosition (incr (getPosition mid) (mIdentLength mid - 1)) i++instance HasSpanInfo ImportSpec where+  getSpanInfo (Importing sp _) = sp+  getSpanInfo (Hiding    sp _) = sp++  setSpanInfo sp (Importing _ im) = Importing sp im+  setSpanInfo sp (Hiding    _ im) = Hiding sp im++  updateEndPos i@(Importing (SpanInfo _ ss) _) =+    setEndPosition (end (last ss)) i+  updateEndPos i@(Importing _ _) = i+  updateEndPos i@(Hiding (SpanInfo _ ss) _) =+    setEndPosition (end (last ss)) i+  updateEndPos i@(Hiding _ _) = i++instance HasSpanInfo Import where+  getSpanInfo (Import sp _)           = sp+  getSpanInfo (ImportTypeWith sp _ _) = sp+  getSpanInfo (ImportTypeAll sp _)    = sp++  setSpanInfo sp (Import _ qid)            = Import sp qid+  setSpanInfo sp (ImportTypeWith _ qid cs) = ImportTypeWith sp qid cs+  setSpanInfo sp (ImportTypeAll _ qid)     = ImportTypeAll sp qid++  updateEndPos i@(Import _ idt) =+    setEndPosition (incr (getPosition idt) (identLength idt - 1)) i+  updateEndPos i@(ImportTypeWith (SpanInfo _ ss) _ _) =+    setEndPosition (end (last ss)) i+  updateEndPos i@(ImportTypeWith _ _ _) = i+  updateEndPos i@(ImportTypeAll (SpanInfo _ ss) _) =+    setEndPosition (end (last ss)) i+  updateEndPos i@(ImportTypeAll _ _) = i++instance HasSpanInfo ConstrDecl where+  getSpanInfo (ConstrDecl sp _ _ _ _)   = sp+  getSpanInfo (ConOpDecl  sp _ _ _ _ _) = sp+  getSpanInfo (RecordDecl sp _ _ _ _)   = sp++  setSpanInfo sp (ConstrDecl _ tvar ctx idt ty) = ConstrDecl sp tvar ctx idt ty+  setSpanInfo sp (ConOpDecl  _ tvar ctx ty1 idt ty2) = ConOpDecl sp tvar ctx ty1 idt ty2+  setSpanInfo sp (RecordDecl _ tvar ctx idt fd) = RecordDecl sp tvar ctx idt fd++  updateEndPos c@(ConstrDecl _ _ _ _ (t:ts)) =+    setEndPosition (getSrcSpanEnd (last (t:ts))) c+  updateEndPos c@(ConstrDecl _ _ _ idt _) =+    setEndPosition (incr (getPosition idt) (identLength idt - 1)) c+  updateEndPos c@(ConOpDecl _ _ _ _ _ ty) =+    setEndPosition (getSrcSpanEnd ty) c+  updateEndPos c@(RecordDecl (SpanInfo _ ss) _ _ _ _) =+    setEndPosition (end (last ss)) c+  updateEndPos c@(RecordDecl _ _ _ _ _) = c++instance HasSpanInfo NewConstrDecl where+  getSpanInfo (NewConstrDecl sp _ _)   = sp+  getSpanInfo (NewRecordDecl sp _ _)   = sp++  setSpanInfo sp (NewConstrDecl _ idt ty)  = NewConstrDecl sp idt ty+  setSpanInfo sp (NewRecordDecl _ idt fty) = NewRecordDecl sp idt fty++  updateEndPos c@(NewConstrDecl _ _ ty) =+    setEndPosition (getSrcSpanEnd ty) c+  updateEndPos c@(NewRecordDecl (SpanInfo _ ss) _ _) =+    setEndPosition (end (last ss)) c+  updateEndPos c@(NewRecordDecl _ _ _) = c++instance HasSpanInfo FieldDecl where+    getSpanInfo (FieldDecl sp _ _) = sp+    setSpanInfo sp (FieldDecl _ idt ty) = FieldDecl sp idt ty+    updateEndPos d@(FieldDecl _ _ ty) =+      setEndPosition (getSrcSpanEnd ty) d++instance HasSpanInfo TypeExpr where+  getSpanInfo (ConstructorType sp _) = sp+  getSpanInfo (ApplyType sp _ _)     = sp+  getSpanInfo (VariableType sp _)    = sp+  getSpanInfo (TupleType sp _)       = sp+  getSpanInfo (ListType sp _)        = sp+  getSpanInfo (ArrowType sp _ _)     = sp+  getSpanInfo (ParenType sp _)       = sp+  getSpanInfo (ForallType sp _ _)    = sp++  setSpanInfo sp (ConstructorType _ qid) = ConstructorType sp qid+  setSpanInfo sp (ApplyType _ ty1 ty2)   = ApplyType sp ty1 ty2+  setSpanInfo sp (VariableType _ idt)    = VariableType sp idt+  setSpanInfo sp (TupleType _ tys)       = TupleType sp tys+  setSpanInfo sp (ListType _ ty)         = ListType sp ty+  setSpanInfo sp (ArrowType _ ty1 ty2)   = ArrowType sp ty1 ty2+  setSpanInfo sp (ParenType _ ty)        = ParenType sp ty+  setSpanInfo sp (ForallType _ idt ty)   = ForallType sp idt ty++  updateEndPos t@(ConstructorType _ qid) =+    setEndPosition (incr (getPosition qid) (qIdentLength qid - 1)) t+  updateEndPos t@(ApplyType _ _ t2) =+    setEndPosition (getSrcSpanEnd t2) t+  updateEndPos t@(VariableType _ idt) =+    setEndPosition (incr (getPosition idt) (identLength idt - 1)) t+  updateEndPos t@(ListType (SpanInfo _ (s:ss)) _) =+    setEndPosition (end (last (s:ss))) t+  updateEndPos t@(ListType _ _) = t+  updateEndPos t@(TupleType _ tys) =+    setEndPosition (getSrcSpanEnd (last tys)) t+  updateEndPos t@(ArrowType _ _ t2) =+    setEndPosition (getSrcSpanEnd t2) t+  updateEndPos t@(ParenType (SpanInfo _ (s:ss)) _) =+    setEndPosition (end (last (s:ss))) t+  updateEndPos t@(ParenType _ _) = t+  updateEndPos t@(ForallType _ _ _) = t -- not a parseable type++instance HasSpanInfo QualTypeExpr where+  getSpanInfo (QualTypeExpr sp _ _) = sp+  setSpanInfo sp (QualTypeExpr _ cx ty) = QualTypeExpr sp cx ty+  updateEndPos t@(QualTypeExpr _ _ ty) =+    setEndPosition (getSrcSpanEnd ty) t++instance HasSpanInfo Constraint where+  getSpanInfo (Constraint sp _ _) = sp+  setSpanInfo sp (Constraint _ qid ty) = Constraint sp qid ty+  updateEndPos c@(Constraint (SpanInfo _ (s:ss)) _ _) =+    setEndPosition (end (last (s:ss))) c+  updateEndPos c@(Constraint _ _ ty) =+    setEndPosition (getSrcSpanEnd ty) c++instance HasSpanInfo (Lhs a) where+  getSpanInfo (FunLhs sp _ _)   = sp+  getSpanInfo (OpLhs  sp _ _ _) = sp+  getSpanInfo (ApLhs  sp _ _)   = sp++  setSpanInfo sp (FunLhs _ idt ps)    = FunLhs sp idt ps+  setSpanInfo sp (OpLhs  _ p1 idt p2) = OpLhs sp p1 idt p2+  setSpanInfo sp (ApLhs  _ lhs ps)    = ApLhs sp lhs ps++  updateEndPos l@(FunLhs _ _ (p:ps)) =+    setEndPosition (getSrcSpanEnd (last (p:ps))) l+  updateEndPos l@(FunLhs _ idt _) =+    setEndPosition (incr (getPosition idt) (identLength idt - 1)) l+  updateEndPos l@(OpLhs _ _ _ p) =+    setEndPosition (getSrcSpanEnd p) l+  updateEndPos l@(ApLhs _ _ (p:ps)) =+    setEndPosition (getSrcSpanEnd (last (p:ps))) l+  updateEndPos l@(ApLhs (SpanInfo _ [_,s]) _ _) =+    setEndPosition (end s) l+  updateEndPos l@(ApLhs _ _ _) = l+++instance HasSpanInfo (Rhs a) where+  getSpanInfo (SimpleRhs sp _ _)  = sp+  getSpanInfo (GuardedRhs sp _ _) = sp++  setSpanInfo sp (SimpleRhs _ ex ds)  = SimpleRhs sp ex ds+  setSpanInfo sp (GuardedRhs _ cs ds) = GuardedRhs sp cs ds++  updateEndPos r@(SimpleRhs (SpanInfo _ [_,_]) _ (d:ds)) =+    setEndPosition (getSrcSpanEnd (last (d:ds))) r+  updateEndPos r@(SimpleRhs (SpanInfo _ [_,s]) _ _) =+    setEndPosition (end s) r+  updateEndPos r@(SimpleRhs _ e _) =+    setEndPosition (getSrcSpanEnd e) r+  updateEndPos r@(GuardedRhs (SpanInfo _ [_,_]) _ (d:ds)) =+    setEndPosition (getSrcSpanEnd (last (d:ds))) r+  updateEndPos r@(GuardedRhs (SpanInfo _ [_,s]) _ _) =+    setEndPosition (end s) r+  updateEndPos r@(GuardedRhs _ cs _) =+    setEndPosition (getSrcSpanEnd (last cs)) r++instance HasSpanInfo (CondExpr a) where+  getSpanInfo (CondExpr sp _ _) = sp+  setSpanInfo sp (CondExpr _ e1 e2) = CondExpr sp e1 e2+  updateEndPos ce@(CondExpr _ _ e) =+    setEndPosition (getSrcSpanEnd e) ce++instance HasSpanInfo (Pattern a) where+  getSpanInfo (LiteralPattern  sp _ _)      = sp+  getSpanInfo (NegativePattern sp _ _)      = sp+  getSpanInfo (VariablePattern sp _ _)      = sp+  getSpanInfo (ConstructorPattern sp _ _ _) = sp+  getSpanInfo (InfixPattern sp _ _ _ _)     = sp+  getSpanInfo (ParenPattern sp _)           = sp+  getSpanInfo (RecordPattern sp _ _ _)      = sp+  getSpanInfo (TuplePattern sp _)           = sp+  getSpanInfo (ListPattern sp _ _)          = sp+  getSpanInfo (AsPattern sp _ _)            = sp+  getSpanInfo (LazyPattern sp _)            = sp+  getSpanInfo (FunctionPattern sp _ _ _)    = sp+  getSpanInfo (InfixFuncPattern sp _ _ _ _) = sp++  setSpanInfo sp (LiteralPattern _ a l) = LiteralPattern sp a l+  setSpanInfo sp (NegativePattern _ a l) = NegativePattern sp a l+  setSpanInfo sp (VariablePattern _ a v) = VariablePattern sp a v+  setSpanInfo sp (ConstructorPattern _ a c ts) = ConstructorPattern sp a c ts+  setSpanInfo sp (InfixPattern _ a t1 op t2) = InfixPattern sp a t1 op t2+  setSpanInfo sp (ParenPattern _ t) = ParenPattern sp t+  setSpanInfo sp (RecordPattern _ a c fs) = RecordPattern sp a c fs+  setSpanInfo sp (TuplePattern _ ts) = TuplePattern sp ts+  setSpanInfo sp (ListPattern _ a ts) = ListPattern sp a ts+  setSpanInfo sp (AsPattern _ v t) = AsPattern sp v t+  setSpanInfo sp (LazyPattern _ t) = LazyPattern sp t+  setSpanInfo sp (FunctionPattern _ a f' ts) = FunctionPattern sp a f' ts+  setSpanInfo sp (InfixFuncPattern _ a t1 op t2) = InfixFuncPattern sp a t1 op t2++  updateEndPos p@(LiteralPattern  _ _ _) = p+  updateEndPos p@(NegativePattern _ _ _) = p+  updateEndPos p@(VariablePattern _ _ v) =+    setEndPosition (incr (getPosition v) (identLength v - 1)) p+  updateEndPos p@(ConstructorPattern _ _ _ (t:ts)) =+    setEndPosition (getSrcSpanEnd (last (t:ts))) p+  updateEndPos p@(ConstructorPattern _ _ c _) =+    setEndPosition (incr (getPosition c) (qIdentLength c - 1)) p+  updateEndPos p@(InfixPattern _ _ _ _ t2) =+    setEndPosition (getSrcSpanEnd t2) p+  updateEndPos p@(ParenPattern (SpanInfo _ (s:ss)) _) =+    setEndPosition (end (last (s:ss))) p+  updateEndPos p@(ParenPattern _ _) = p+  updateEndPos p@(RecordPattern (SpanInfo _ (s:ss)) _ _ _) =+    setEndPosition (end (last (s:ss))) p+  updateEndPos p@(RecordPattern _ _ _ _) = p+  updateEndPos p@(TuplePattern (SpanInfo _ (s:ss)) _) =+    setEndPosition (end (last (s:ss))) p+  updateEndPos p@(TuplePattern _ _) = p+  updateEndPos p@(ListPattern (SpanInfo _ (s:ss)) _ _) =+    setEndPosition (end (last (s:ss))) p+  updateEndPos p@(ListPattern _ _ _) = p+  updateEndPos p@(AsPattern _ _ t) =+    setEndPosition (getSrcSpanEnd t) p+  updateEndPos p@(LazyPattern _ t) =+    setEndPosition (getSrcSpanEnd t) p+  updateEndPos p@(FunctionPattern _ _ _ _) = p+  updateEndPos p@(InfixFuncPattern _ _ _ _ _) = p++instance HasSpanInfo (Expression a) where+  getSpanInfo (Literal sp _ _) = sp+  getSpanInfo (Variable sp _ _) = sp+  getSpanInfo (Constructor sp _ _) = sp+  getSpanInfo (Paren sp _) = sp+  getSpanInfo (Typed sp _ _) = sp+  getSpanInfo (Record sp _ _ _) = sp+  getSpanInfo (RecordUpdate sp _ _) = sp+  getSpanInfo (Tuple sp _) = sp+  getSpanInfo (List sp _ _) = sp+  getSpanInfo (ListCompr sp _ _) = sp+  getSpanInfo (EnumFrom sp _) = sp+  getSpanInfo (EnumFromThen sp _ _) = sp+  getSpanInfo (EnumFromTo sp _ _) = sp+  getSpanInfo (EnumFromThenTo sp _ _ _) = sp+  getSpanInfo (UnaryMinus sp _) = sp+  getSpanInfo (Apply sp _ _) = sp+  getSpanInfo (InfixApply sp _ _ _) = sp+  getSpanInfo (LeftSection sp _ _) = sp+  getSpanInfo (RightSection sp _ _) = sp+  getSpanInfo (Lambda sp _ _) = sp+  getSpanInfo (Let sp _ _) = sp+  getSpanInfo (Do sp _ _) = sp+  getSpanInfo (IfThenElse sp _ _ _) = sp+  getSpanInfo (Case sp _ _ _) = sp++  setSpanInfo sp (Literal _ a l) = Literal sp a l+  setSpanInfo sp (Variable _ a v) = Variable sp a v+  setSpanInfo sp (Constructor _ a c) = Constructor sp a c+  setSpanInfo sp (Paren _ e) = Paren sp e+  setSpanInfo sp (Typed _ e qty) = Typed sp e qty+  setSpanInfo sp (Record _ a c fs) = Record sp a c fs+  setSpanInfo sp (RecordUpdate _ e fs) = RecordUpdate sp e fs+  setSpanInfo sp (Tuple _ es) = Tuple sp es+  setSpanInfo sp (List _ a es) = List sp a es+  setSpanInfo sp (ListCompr _ e stms) = ListCompr sp e stms+  setSpanInfo sp (EnumFrom _ e) = EnumFrom sp e+  setSpanInfo sp (EnumFromThen _ e1 e2) = EnumFromThen sp e1 e2+  setSpanInfo sp (EnumFromTo _ e1 e2) = EnumFromTo sp e1 e2+  setSpanInfo sp (EnumFromThenTo _ e1 e2 e3) = EnumFromThenTo sp e1 e2 e3+  setSpanInfo sp (UnaryMinus _ e) = UnaryMinus sp e+  setSpanInfo sp (Apply _ e1 e2) = Apply sp e1 e2+  setSpanInfo sp (InfixApply _ e1 op e2) = InfixApply sp e1 op e2+  setSpanInfo sp (LeftSection _ e op) = LeftSection sp e op+  setSpanInfo sp (RightSection _ op e) = RightSection sp op e+  setSpanInfo sp (Lambda _ ts e) = Lambda sp ts e+  setSpanInfo sp (Let _ ds e) = Let sp ds e+  setSpanInfo sp (Do _ stms e) = Do sp stms e+  setSpanInfo sp (IfThenElse _ e1 e2 e3) = IfThenElse sp e1 e2 e3+  setSpanInfo sp (Case _ ct e as) = Case sp ct e as++  updateEndPos e@(Literal _ _ _) = e+  updateEndPos e@(Variable _ _ v) =+    setEndPosition (incr (getPosition v) (qIdentLength v - 1)) e+  updateEndPos e@(Constructor _ _ c) =+    setEndPosition (incr (getPosition c) (qIdentLength c - 1)) e+  updateEndPos e@(Paren (SpanInfo _ [_,s]) _) =+    setEndPosition (end s) e+  updateEndPos e@(Paren _ _) = e+  updateEndPos e@(Typed _ _ qty) =+    setEndPosition (getSrcSpanEnd qty) e+  updateEndPos e@(Record (SpanInfo _ (s:ss)) _ _ _) =+    setEndPosition (end (last (s:ss))) e+  updateEndPos e@(Record _ _ _ _) = e+  updateEndPos e@(RecordUpdate (SpanInfo _ (s:ss)) _ _) =+    setEndPosition (end (last (s:ss))) e+  updateEndPos e@(RecordUpdate _ _ _) = e+  updateEndPos e@(Tuple (SpanInfo _ [_,s]) _) =+    setEndPosition (end s) e+  updateEndPos e@(Tuple _ _) = e+  updateEndPos e@(List (SpanInfo _ (s:ss)) _ _) =+    setEndPosition (end (last (s:ss))) e+  updateEndPos e@(List _ _ _) = e+  updateEndPos e@(ListCompr (SpanInfo _ (s:ss)) _ _) =+    setEndPosition (end (last (s:ss))) e+  updateEndPos e@(ListCompr _ _ _) = e+  updateEndPos e@(EnumFrom (SpanInfo _ [_,_,s]) _) =+    setEndPosition (end s) e+  updateEndPos e@(EnumFrom _ _) = e+  updateEndPos e@(EnumFromTo (SpanInfo _ [_,_,s]) _ _) =+    setEndPosition (end s) e+  updateEndPos e@(EnumFromTo _ _ _) = e+  updateEndPos e@(EnumFromThen (SpanInfo _ [_,_,_,s]) _ _) =+    setEndPosition (end s) e+  updateEndPos e@(EnumFromThen _ _ _) = e+  updateEndPos e@(EnumFromThenTo (SpanInfo _ [_,_,_,s]) _ _ _) =+    setEndPosition (end s) e+  updateEndPos e@(EnumFromThenTo _ _ _ _) = e+  updateEndPos e@(UnaryMinus _ e') =+    setEndPosition (getSrcSpanEnd e') e+  updateEndPos e@(Apply _ _ e') =+    setEndPosition (getSrcSpanEnd e') e+  updateEndPos e@(InfixApply _ _ _ e') =+    setEndPosition (getSrcSpanEnd e') e+  updateEndPos e@(LeftSection (SpanInfo _ [_,s]) _ _) =+    setEndPosition (end s) e+  updateEndPos e@(LeftSection _ _ _) = e+  updateEndPos e@(RightSection (SpanInfo _ [_,s]) _ _) =+    setEndPosition (end s) e+  updateEndPos e@(RightSection _ _ _) = e+  updateEndPos e@(Lambda _ _ e') =+    setEndPosition (getSrcSpanEnd e') e+  updateEndPos e@(Let _ _ e') =+    setEndPosition (getSrcSpanEnd e') e+  updateEndPos e@(Do _ _ e') =+    setEndPosition (getSrcSpanEnd e') e+  updateEndPos e@(IfThenElse _ _ _ e') =+    setEndPosition (getSrcSpanEnd e') e+  updateEndPos e@(Case _ _ _ (a:as)) =+    setEndPosition (getSrcSpanEnd (last (a:as))) e+  updateEndPos e@(Case (SpanInfo _ (s:ss)) _ _ _) =+    setEndPosition (end (last (s:ss))) e+  updateEndPos e@(Case _ _ _ _) = e++instance HasSpanInfo (Statement a) where+  getSpanInfo (StmtExpr sp _)   = sp+  getSpanInfo (StmtDecl sp _)   = sp+  getSpanInfo (StmtBind sp _ _) = sp++  setSpanInfo sp (StmtExpr _ ex)   = StmtExpr sp ex+  setSpanInfo sp (StmtDecl _ ds)   = StmtDecl sp ds+  setSpanInfo sp (StmtBind _ p ex) = StmtBind sp p ex++  updateEndPos s@(StmtExpr _ e) =+    setEndPosition (getSrcSpanEnd e) s+  updateEndPos s@(StmtBind _ _ e) =+    setEndPosition (getSrcSpanEnd e) s+  updateEndPos s@(StmtDecl _ (d:ds)) =+    setEndPosition (getSrcSpanEnd (last (d:ds))) s+  updateEndPos s@(StmtDecl (SpanInfo _ [s']) _) = -- empty let+    setEndPosition (end s') s+  updateEndPos s@(StmtDecl _ _) = s++instance HasSpanInfo (Alt a) where+  getSpanInfo (Alt sp _ _) = sp+  setSpanInfo sp (Alt _ p rhs) = Alt sp p rhs+  updateEndPos a@(Alt _ _ rhs) =+    setEndPosition (getSrcSpanEnd rhs) a++instance HasSpanInfo (Field a) where+  getSpanInfo (Field sp _ _) = sp+  setSpanInfo sp (Field _ qid a) = Field sp qid a+  updateEndPos f@(Field (SpanInfo _ ss) _ _) =+    setEndPosition (end (last ss)) f+  updateEndPos f@ (Field _ _ _) = f++instance HasSpanInfo (Goal a) where+  getSpanInfo (Goal sp _ _) = sp+  setSpanInfo sp (Goal _ e ds) = Goal sp e ds++  updateEndPos g@(Goal (SpanInfo _ [_]) _ (d:ds)) =+    setEndPosition (getSrcSpanEnd (last (d:ds))) g+  updateEndPos g@(Goal (SpanInfo _ [s]) _ _) =+    setEndPosition (end s) g+  updateEndPos g@(Goal _ _ _) = g++instance HasPosition (Module a) where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition (Decl a) where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition (Equation a) where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition ModulePragma where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition ExportSpec where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition ImportDecl where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition ImportSpec where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition Export where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition Import where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition ConstrDecl where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition TypeExpr where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition QualTypeExpr where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition NewConstrDecl where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition Constraint where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition FieldDecl where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition (Lhs a) where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition (Rhs a) where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition (CondExpr a) where+  getPosition = getStartPosition++instance HasPosition (Pattern a) where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition (Expression a) where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition (Alt a) where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition (Goal a) where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition (Field a) where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition (Statement a) where+  getPosition = getStartPosition+  setPosition = setStartPosition++instance HasPosition (InfixOp a) where+  getPosition (InfixOp     _ q) = getPosition q+  getPosition (InfixConstr _ q) = getPosition q++  setPosition p (InfixOp     a q) = InfixOp     a (setPosition p q)+  setPosition p (InfixConstr a q) = InfixConstr a (setPosition p q)
src/Curry/Syntax/Utils.hs view
@@ -33,12 +33,14 @@   , nconstrType   , recordLabels, nrecordLabels   , methods, impls, imethod, imethodArity+  , shortenModuleAST   ) where  import Control.Monad.State  import Curry.Base.Ident import Curry.Base.Position+import Curry.Base.SpanInfo import Curry.Files.Filenames (takeBaseName) import Curry.Syntax.Extension import Curry.Syntax.Type@@ -49,14 +51,14 @@  -- |Extract all known extensions from a 'Module' knownExtensions :: Module a -> [KnownExtension]-knownExtensions (Module ps _ _ _ _) =+knownExtensions (Module _ ps _ _ _ _) =   [ e | LanguagePragma _ exts <- ps, KnownExtension _ e <- exts]  -- |Replace the generic module name @main@ with the module name derived -- from the 'FilePath' of the module. patchModuleId :: FilePath -> Module a -> Module a-patchModuleId fn m@(Module ps mid es is ds)-  | mid == mainMIdent = Module ps (mkMIdent [takeBaseName fn]) es is ds+patchModuleId fn m@(Module spi ps mid es is ds)+  | mid == mainMIdent = Module spi ps (mkMIdent [takeBaseName fn]) es is ds   | otherwise         = m  -- |Is the declaration a top declaration?@@ -124,52 +126,52 @@  -- |Is the pattern semantically equivalent to a variable pattern? isVariablePattern :: Pattern a -> Bool-isVariablePattern (VariablePattern _ _) = True-isVariablePattern (ParenPattern      t) = isVariablePattern t-isVariablePattern (AsPattern       _ t) = isVariablePattern t-isVariablePattern (LazyPattern       _) = True-isVariablePattern _                     = False+isVariablePattern (VariablePattern _ _ _) = True+isVariablePattern (ParenPattern    _   t) = isVariablePattern t+isVariablePattern (AsPattern       _ _ t) = isVariablePattern t+isVariablePattern (LazyPattern     _   _) = True+isVariablePattern _                       = False  -- |Is a type expression a type variable? isVariableType :: TypeExpr -> Bool-isVariableType (VariableType _) = True-isVariableType _                = False+isVariableType (VariableType _ _) = True+isVariableType _                  = False  -- |Is a type expression simple, i.e., is it of the form T u_1 ... u_n, -- where T is a type constructor and u_1 ... u_n are type variables? isSimpleType :: TypeExpr -> Bool-isSimpleType (ConstructorType _) = True-isSimpleType (ApplyType ty1 ty2) = isSimpleType ty1 && isVariableType ty2-isSimpleType (VariableType    _) = False-isSimpleType (TupleType     tys) = all isVariableType tys-isSimpleType (ListType       ty) = isVariableType ty-isSimpleType (ArrowType ty1 ty2) = isVariableType ty1 && isVariableType ty2-isSimpleType (ParenType      ty) = isSimpleType ty-isSimpleType (ForallType    _ _) = False+isSimpleType (ConstructorType _ _) = True+isSimpleType (ApplyType _ ty1 ty2) = isSimpleType ty1 && isVariableType ty2+isSimpleType (VariableType   _  _) = False+isSimpleType (TupleType    _  tys) = all isVariableType tys+isSimpleType (ListType      _  ty) = isVariableType ty+isSimpleType (ArrowType _ ty1 ty2) = isVariableType ty1 && isVariableType ty2+isSimpleType (ParenType     _  ty) = isSimpleType ty+isSimpleType (ForallType    _ _ _) = False  -- |Return the qualified type constructor of a type expression. typeConstr :: TypeExpr -> QualIdent-typeConstr (ConstructorType   tc) = tc-typeConstr (ApplyType       ty _) = typeConstr ty-typeConstr (TupleType        tys) = qTupleId (length tys)-typeConstr (ListType           _) = qListId-typeConstr (ArrowType        _ _) = qArrowId-typeConstr (ParenType         ty) = typeConstr ty-typeConstr (VariableType       _) =+typeConstr (ConstructorType   _ tc) = tc+typeConstr (ApplyType       _ ty _) = typeConstr ty+typeConstr (TupleType        _ tys) = qTupleId (length tys)+typeConstr (ListType           _ _) = qListId+typeConstr (ArrowType        _ _ _) = qArrowId+typeConstr (ParenType         _ ty) = typeConstr ty+typeConstr (VariableType       _ _) =   error "Curry.Syntax.Utils.typeConstr: variable type"-typeConstr (ForallType       _ _) =+typeConstr (ForallType       _ _ _) =   error "Curry.Syntax.Utils.typeConstr: forall type"  -- |Return the list of variables occuring in a type expression. typeVariables :: TypeExpr -> [Ident]-typeVariables (ConstructorType       _) = []-typeVariables (ApplyType       ty1 ty2) = typeVariables ty1 ++ typeVariables ty2-typeVariables (VariableType         tv) = [tv]-typeVariables (TupleType           tys) = concatMap typeVariables tys-typeVariables (ListType             ty) = typeVariables ty-typeVariables (ArrowType       ty1 ty2) = typeVariables ty1 ++ typeVariables ty2-typeVariables (ParenType            ty) = typeVariables ty-typeVariables (ForallType        vs ty) = vs ++ typeVariables ty+typeVariables (ConstructorType       _ _) = []+typeVariables (ApplyType       _ ty1 ty2) = typeVariables ty1 ++ typeVariables ty2+typeVariables (VariableType         _ tv) = [tv]+typeVariables (TupleType           _ tys) = concatMap typeVariables tys+typeVariables (ListType             _ ty) = typeVariables ty+typeVariables (ArrowType       _ ty1 ty2) = typeVariables ty1 ++ typeVariables ty2+typeVariables (ParenType            _ ty) = typeVariables ty+typeVariables (ForallType        _ vs ty) = vs ++ typeVariables ty  -- |Return the identifier of a variable. varIdent :: Var a -> Ident@@ -177,15 +179,15 @@  -- |Convert an infix operator into an expression infixOp :: InfixOp a -> Expression a-infixOp (InfixOp     a op) = Variable a op-infixOp (InfixConstr a op) = Constructor a op+infixOp (InfixOp     a op) = Variable NoSpanInfo a op+infixOp (InfixConstr a op) = Constructor NoSpanInfo a op  -- |flatten the left-hand-side to the identifier and all constructor terms flatLhs :: Lhs a -> (Ident, [Pattern a]) flatLhs lhs = flat lhs []-  where flat (FunLhs    f ts) ts' = (f, ts ++ ts')-        flat (OpLhs t1 op t2) ts' = (op, t1 : t2 : ts')-        flat (ApLhs  lhs' ts) ts' = flat lhs' (ts ++ ts')+  where flat (FunLhs    _ f ts) ts' = (f, ts ++ ts')+        flat (OpLhs _ t1 op t2) ts' = (op, t1 : t2 : ts')+        flat (ApLhs  _ lhs' ts) ts' = flat lhs' (ts ++ ts')  -- |Return the arity of an equation. eqnArity :: Equation a -> Int@@ -257,36 +259,62 @@ -- constructing elements of the abstract syntax tree -------------------------------------------------------- -funDecl :: Position -> a -> Ident -> [Pattern a] -> Expression a -> Decl a-funDecl p a f ts e = FunctionDecl p a f [mkEquation p f ts e]+funDecl :: SpanInfo -> a -> Ident -> [Pattern a] -> Expression a -> Decl a+funDecl spi a f ts e = FunctionDecl spi a f [mkEquation spi f ts e] -mkEquation :: Position -> Ident -> [Pattern a] -> Expression a -> Equation a-mkEquation p f ts e = Equation p (FunLhs f ts) (simpleRhs p e)+mkEquation :: SpanInfo -> Ident -> [Pattern a] -> Expression a -> Equation a+mkEquation spi f ts e = Equation spi (FunLhs NoSpanInfo f ts) (simpleRhs NoSpanInfo e) -simpleRhs :: Position -> Expression a -> Rhs a-simpleRhs p e = SimpleRhs p e []+simpleRhs :: SpanInfo -> Expression a -> Rhs a+simpleRhs spi e = SimpleRhs spi e [] -patDecl :: Position -> Pattern a -> Expression a -> Decl a-patDecl p t e = PatternDecl p t (SimpleRhs p e [])+patDecl :: SpanInfo -> Pattern a -> Expression a -> Decl a+patDecl spi t e = PatternDecl spi t (SimpleRhs spi e []) -varDecl :: Position -> a -> Ident -> Expression a -> Decl a-varDecl p ty = patDecl p . VariablePattern ty+varDecl :: SpanInfo -> a -> Ident -> Expression a -> Decl a+varDecl p ty = patDecl p . VariablePattern NoSpanInfo ty  constrPattern :: a -> QualIdent -> [(a, Ident)] -> Pattern a-constrPattern ty c = ConstructorPattern ty c . map (uncurry VariablePattern)+constrPattern ty c = ConstructorPattern NoSpanInfo ty c+                   . map (uncurry (VariablePattern NoSpanInfo)) -caseAlt :: Position -> Pattern a -> Expression a -> Alt a-caseAlt p t e = Alt p t (SimpleRhs p e [])+caseAlt :: SpanInfo -> Pattern a -> Expression a -> Alt a+caseAlt spi t e = Alt spi t (SimpleRhs spi e [])  mkLet :: [Decl a] -> Expression a -> Expression a-mkLet ds e = if null ds then e else Let ds e+mkLet ds e = if null ds then e else Let NoSpanInfo ds e  mkVar :: a -> Ident -> Expression a-mkVar ty = Variable ty . qualify+mkVar ty = Variable NoSpanInfo ty . qualify  apply :: Expression a -> [Expression a] -> Expression a-apply = foldl Apply+apply = foldl (Apply NoSpanInfo)  unapply :: Expression a -> [Expression a] -> (Expression a, [Expression a])-unapply (Apply e1 e2) es = unapply e1 (e2 : es)-unapply e             es = (e, es)+unapply (Apply _ e1 e2) es = unapply e1 (e2 : es)+unapply e               es = (e, es)+++--------------------------------------------------------+-- Shorten Module+-- Module Pragmas and Equations will be removed+--------------------------------------------------------++shortenModuleAST :: Module () -> Module ()+shortenModuleAST = shortenAST++class ShortenAST a where+  shortenAST :: a -> a++instance ShortenAST (Module a) where+  shortenAST (Module spi _ mid ex im ds) =+    Module spi [] mid ex im (map shortenAST ds)++instance ShortenAST (Decl a) where+  shortenAST (FunctionDecl spi a idt _) =+    FunctionDecl spi a idt []+  shortenAST (ClassDecl spi cx cls tyv ds) =+    ClassDecl spi cx cls tyv (map shortenAST ds)+  shortenAST (InstanceDecl spi cx cls tyv ds) =+    InstanceDecl spi cx cls tyv (map shortenAST ds)+  shortenAST d = d