module Helium.StaticAnalysis.Miscellaneous.UHA_Source where
import Helium.Utils.OneLiner
import Helium.Syntax.UHA_Range
import Helium.Syntax.UHA_Syntax
import Helium.Syntax.UHA_Utils
import qualified Helium.Syntax.UHA_OneLine as PP
data UHA_Source =
UHA_Expr Expression
| UHA_Pat Pattern
| UHA_Stat Statement
| UHA_Qual Qualifier
| UHA_FB FunctionBinding
| UHA_RHS RightHandSide
| UHA_Decl Declaration
| UHA_Decls Declarations
| UHA_Def Name
instance Show UHA_Source where
show = showOneLine 80 . oneLinerSource
rangeOfSource :: UHA_Source -> Range
rangeOfSource source =
case source of
UHA_Expr expr -> getExprRange expr
UHA_Pat pat -> getPatRange pat
UHA_Stat stat -> getStatementRange stat
UHA_Qual qual -> getQualifierRange qual
UHA_FB fb -> getFBRange fb
UHA_RHS rhs -> getRHSRange rhs
UHA_Decl decl -> getDeclarationRange decl
UHA_Decls decls -> if null decls then noRange else foldr1 mergeRanges (map getDeclarationRange decls)
UHA_Def name -> getNameRange name
oneLinerSource :: UHA_Source -> OneLineTree
oneLinerSource source =
case source of
UHA_Expr expr -> PP.oneLineTree_Syn_Expression (PP.wrap_Expression (PP.sem_Expression expr) PP.Inh_Expression)
UHA_Pat pat -> PP.oneLineTree_Syn_Pattern (PP.wrap_Pattern (PP.sem_Pattern pat) PP.Inh_Pattern)
UHA_Stat stat -> PP.oneLineTree_Syn_Statement (PP.wrap_Statement (PP.sem_Statement stat) PP.Inh_Statement)
UHA_Qual qual -> PP.oneLineTree_Syn_Qualifier (PP.wrap_Qualifier (PP.sem_Qualifier qual) PP.Inh_Qualifier)
UHA_FB fb -> PP.oneLineTree_Syn_FunctionBinding (PP.wrap_FunctionBinding (PP.sem_FunctionBinding fb) PP.Inh_FunctionBinding)
UHA_RHS rhs -> PP.oneLineTree_Syn_RightHandSide (PP.wrap_RightHandSide (PP.sem_RightHandSide rhs) PP.Inh_RightHandSide) ""
UHA_Decl decl -> PP.oneLineTree_Syn_Declaration (PP.wrap_Declaration (PP.sem_Declaration decl) PP.Inh_Declaration)
UHA_Decls decls -> PP.encloseSep "{" "; " "}" (PP.oneLineTree_Syn_Declarations (PP.wrap_Declarations (PP.sem_Declarations decls) PP.Inh_Declarations))
UHA_Def name -> OneLineText (show name)
descriptionOfSource :: UHA_Source -> String
descriptionOfSource source =
case source of
UHA_Expr _ -> "expression"
UHA_Pat _ -> "pattern"
UHA_Stat _ -> "statement"
UHA_Qual _ -> "qualifier"
UHA_FB _ -> "function binding"
UHA_RHS _ -> "right-hand side"
UHA_Decl _ -> "declaration"
UHA_Decls _ -> "declarations"
UHA_Def _ -> "definition"
nameToUHA_Expr :: Name -> UHA_Source
nameToUHA_Expr name = UHA_Expr (Expression_Variable (getNameRange name) name)
nameToUHA_Pat :: Name -> UHA_Source
nameToUHA_Pat name = UHA_Pat (Pattern_Variable (getNameRange name) name)
nameToUHA_Def :: Name -> UHA_Source
nameToUHA_Def = UHA_Def
convertSources :: (UHA_Source, Maybe UHA_Source) -> [(String, UHA_Source)]
convertSources (source, maybeSource) =
(descriptionOfSource source, source) : maybe [] (\s -> [(f s, s)]) maybeSource
where
f (UHA_Expr (Expression_Variable _ name))
| isConstructor name = "constructor"
| isOperatorName name = "operator"
f (UHA_Expr (Expression_Constructor _ name))
| isConstructor name = "constructor"
f (UHA_Pat (Pattern_Variable _ name))
| isConstructor name = "constructor"
f _ = "term"