hydra-0.1.0: src/main/haskell/Hydra/Ext/Scala/Utils.hs
module Hydra.Ext.Scala.Utils where
import Hydra.All
import qualified Hydra.Ext.Scala.Meta as Scala
import qualified Hydra.Lib.Strings as Strings
import Hydra.Ext.Scala.Language
import qualified Data.List as L
import qualified Data.Set as S
import qualified Data.Maybe as Y
nameOfType :: Context m -> Type m -> Y.Maybe Name
nameOfType cx t = case stripType t of
TypeNominal name -> Just name
TypeLambda (LambdaType _ body) -> nameOfType cx body
_ -> Nothing
qualifyUnionFieldName :: String -> Y.Maybe Name -> FieldName -> String
qualifyUnionFieldName dlft sname (FieldName fname) = (Y.maybe dlft (\n -> scalaTypeName True n ++ ".") sname) ++ fname
scalaTypeName :: Bool -> Name -> String
scalaTypeName qualify name@(Name n) = if qualify || S.member local reservedWords
then L.intercalate "." $ Strings.splitOn "/" n
else local
where
(_, local) = toQnameLazy name
sapply :: Scala.Data -> [Scala.Data] -> Scala.Data
sapply fun args = Scala.DataApply $ Scala.Data_Apply fun args
sassign :: Scala.Data -> Scala.Data -> Scala.Data
sassign lhs rhs = Scala.DataAssign $ Scala.Data_Assign lhs rhs
slambda :: String -> Scala.Data -> Y.Maybe Scala.Type -> Scala.Data
slambda v body sdom = Scala.DataFunctionData $ Scala.Data_FunctionDataFunction
$ Scala.Data_Function [Scala.Data_Param mods name sdom def] body
where
mods = []
name = Scala.NameValue v
def = Nothing
sname :: String -> Scala.Data
sname = Scala.DataRef . Scala.Data_RefName . Scala.Data_Name . Scala.PredefString
sprim :: Name -> Scala.Data
sprim name = sname $ prefix ++ "." ++ local
where
(Namespace ns, local) = toQnameLazy name
prefix = L.last $ Strings.splitOn "/" ns
stapply :: Scala.Type -> [Scala.Type] -> Scala.Type
stapply t args = Scala.TypeApply $ Scala.Type_Apply t args
stapply1 :: Scala.Type -> Scala.Type -> Scala.Type
stapply1 t1 t2 = stapply t1 [t2]
stapply2 :: Scala.Type -> Scala.Type -> Scala.Type -> Scala.Type
stapply2 t1 t2 t3 = stapply t1 [t2, t3]
stparam :: VariableType -> Scala.Type_Param
stparam (VariableType v) = Scala.Type_Param [] (Scala.NameValue v) [] [] [] []
stref :: String -> Scala.Type
stref = Scala.TypeRef . Scala.Type_RefName . Scala.Type_Name
svar :: Variable -> Scala.Pat
svar (Variable v) = (Scala.PatVar . Scala.Pat_Var . Scala.Data_Name . Scala.PredefString) v