packages feed

polyglot-0.1.1.0: src/SyntaxTrees/Scala/PackageDef.hs

module SyntaxTrees.Scala.PackageDef where

import Data.List                 (intercalate)
import SyntaxTrees.Scala.Common  (Package, Var, VarOp)
import SyntaxTrees.Scala.DataDef (InternalDef)
import SyntaxTrees.Scala.Type    (TypeVar)
import Utils.String


data PackageDef
  = PackageDef
      { name    :: Package
      , imports :: [PackageImport]
      , defs    :: [InternalDef]
      }

data PackageImport
  = PackageImport
      { package   :: Package
      , alias     :: Maybe Package
      , importDef :: Maybe PackageImportDef
      }

data PackageImportDef
  = FullImport
  | MembersImport [PackageMember]
  | FullObjectImport TypeVar
  | FilteredObjectImport TypeVar [PackageMember]

data PackageMember
  = VarMember Var
  | VarOpMember VarOp
  | DataMember TypeVar


instance Show PackageDef where
  show (PackageDef x y z) =
    joinLines ["package" +++ show x,
               intercalate "\n" (show <$> y),
               joinLines (show <$> z)]

instance Show PackageImport where
  show (PackageImport x y z) =
    joinWords ["import",
               show x,
               "as" `joinMaybe` y]
    ++ "." `joinMaybe` z

instance Show PackageImportDef where
  show FullImport                   = "_"
  show (MembersImport [x])          = show x
  show (MembersImport x)            = wrapCurlyCsv x
  show (FullObjectImport x)         = show x ++ "." ++ "_"
  show (FilteredObjectImport x [y]) = show x ++ "." ++ show y
  show (FilteredObjectImport x y)   = show x ++ "." ++ wrapCurlyCsv y

instance Show PackageMember where
  show (VarMember x)   = show x
  show (VarOpMember x) = show x
  show (DataMember x)  = show x