packages feed

flatbuffers-0.4.0.0: src/FlatBuffers/Internal/Compiler/NamingConventions.hs

module FlatBuffers.Internal.Compiler.NamingConventions where

import Data.Set qualified as Set
import Data.Text (Text)
import Data.Text qualified as T
import Data.Text.Manipulate qualified as TM

import FlatBuffers.Internal.Compiler.ValidSyntaxTree
  (EnumDecl, EnumVal, HasIdent(..), Ident(..), Namespace(..), UnionDecl, UnionVal)

-- Style guide: https://google.github.io/flatbuffers/flatbuffers_guide_writing_schema.html

dataTypeConstructor :: HasIdent a => a -> Text
dataTypeConstructor = replaceKeyword . TM.toCamel . unIdent . getIdent

arg :: HasIdent a => a -> Text
arg = TM.toCamel . unIdent . getIdent

dataTypeName :: HasIdent a => a -> Text
dataTypeName = TM.toPascal . unIdent . getIdent

namespace :: Namespace -> Text
namespace (Namespace fragments) = T.intercalate "." (TM.toPascal <$> fragments)

getter :: (HasIdent parent, HasIdent field) => parent -> field -> Text
getter (getIdent -> Ident parent) (getIdent -> Ident field) =
  TM.toCamel parent <> TM.toPascal field

toEnumFun :: EnumDecl -> Text
toEnumFun enum =
  "to" <> TM.toPascal (unIdent (getIdent enum))

fromEnumFun :: EnumDecl -> Text
fromEnumFun enum =
  "from" <> TM.toPascal (unIdent (getIdent enum))

enumUnionMember :: (HasIdent parent, HasIdent val) => parent -> val -> Text
enumUnionMember (getIdent -> Ident parentIdent) (getIdent -> Ident valIdent) =
  TM.toPascal parentIdent <> TM.toPascal valIdent

enumBitFlagsConstant :: EnumDecl -> EnumVal -> Text
enumBitFlagsConstant (getIdent -> Ident enumIdent) (getIdent -> Ident enumValIdent) =
  TM.toCamel enumIdent <> TM.toPascal enumValIdent

enumBitFlagsAllFun :: EnumDecl -> Text
enumBitFlagsAllFun (getIdent -> Ident enumIdent) =
  "all" <> TM.toPascal enumIdent

enumBitFlagsNamesFun :: EnumDecl -> Text
enumBitFlagsNamesFun (getIdent -> Ident enumIdent) =
  TM.toCamel enumIdent <> "Names"

enumNameFun :: EnumDecl -> Text
enumNameFun (getIdent -> Ident enumIdent) =
  TM.toCamel enumIdent <> "Name"

unionConstructor :: UnionDecl -> UnionVal -> Text
unionConstructor (getIdent -> Ident unionIdent) (getIdent -> Ident unionValIdent) =
  TM.toCamel unionIdent <> TM.toPascal unionValIdent

readUnionFun :: HasIdent union => union -> Text
readUnionFun (getIdent -> Ident unionIdent) =
  "read" <> TM.toPascal unionIdent

withModulePrefix :: Namespace -> Text -> Text
withModulePrefix ns text =
  if ns == ""
    then text
    else namespace ns <> "." <> text

keywords :: Set.Set Text
keywords = Set.fromList
  [ "as" , "case", "class", "data", "default", "deriving", "do"
  , "else", "hiding", "if", "import", "in", "infix", "infixl"
  , "infixr", "instance", "let", "module", "newtype", "of", "qualified"
  , "then", "type", "where", "forall", "mdo", "family", "role"
  , "pattern", "static", "stock", "anyclass", "via", "group", "by"
  , "using", "foreign", "export", "label", "dynamic", "safe"
  , "interruptible", "unsafe", "stdcall", "ccall", "capi", "prim"
  , "javascript", "unit", "dependency", "signature", "rec", "proc"
  ]

replaceKeyword :: Text -> Text
replaceKeyword x
  | x `Set.member` keywords = x <> "_"
  | otherwise = x