packages feed

hydra-0.8.0: src/main/haskell/Hydra/Ext/Scala/Utils.hs

module Hydra.Ext.Scala.Utils where

import Hydra.Kernel
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 :: Graph -> Type -> Y.Maybe Name
nameOfType cx t = case stripType t of
  TypeVariable name -> Just name
  TypeLambda (LambdaType _ body) -> nameOfType cx body
  _ -> Nothing

qualifyUnionFieldName :: String -> Y.Maybe Name -> Name -> String
qualifyUnionFieldName dlft sname (Name 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 = localNameOfLazy 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 ++ "." ++ qualifiedNameLocal qname
  where
    qname = qualifyNameLazy name
    prefix = L.last $ Strings.splitOn "/" $ unNamespace $ Y.fromJust $ qualifiedNameNamespace qname

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 :: Name -> Scala.Type_Param
stparam (Name v) = Scala.Type_Param [] (Scala.NameValue v) [] [] [] []

stref :: String -> Scala.Type
stref = Scala.TypeRef . Scala.Type_RefName . Scala.Type_Name

svar :: Name -> Scala.Pat
svar (Name v) = (Scala.PatVar . Scala.Pat_Var . Scala.Data_Name . Scala.PredefString) v