{-# LANGUAGE OverloadedStrings #-}

module Hydra.Sources.Tier4.Langs.Java.Language where

import Hydra.Sources.Tier3.All
import Hydra.Dsl.Base as Base
import Hydra.Dsl.Lib.Equality as Equality
import Hydra.Dsl.Lib.Flows as Flows
import Hydra.Dsl.Lib.Lists as Lists
import Hydra.Dsl.Lib.Logic as Logic
import Hydra.Dsl.Lib.Maps as Maps
import Hydra.Dsl.Lib.Sets as Sets
import Hydra.Dsl.Lib.Strings as Strings
import qualified Hydra.Dsl.Terms as Terms
import qualified Hydra.Dsl.Types as Types

import qualified Data.Set as S


javaLanguageDefinition :: String -> Datum a -> Definition a
javaLanguageDefinition :: forall a. String -> Datum a -> Definition a
javaLanguageDefinition = Module -> String -> Datum a -> Definition a
forall a. Module -> String -> Datum a -> Definition a
definitionInModule Module
javaLanguageModule

javaLanguageModule :: Module
javaLanguageModule :: Module
javaLanguageModule = Namespace
-> [Element] -> [Module] -> [Module] -> Maybe String -> Module
Module Namespace
ns [Element]
elements [Module
hydraCodersModule, Module
hydraBasicsModule] [Module]
tier0Modules (Maybe String -> Module) -> Maybe String -> Module
forall a b. (a -> b) -> a -> b
$
    String -> Maybe String
forall a. a -> Maybe a
Just String
"Language constraints for Java"
  where
    ns :: Namespace
ns = String -> Namespace
Namespace String
"hydra/langs/java/language"
    elements :: [Element]
elements = [
      Definition Int -> Element
forall a. Definition a -> Element
el Definition Int
javaMaxTupleLengthDef,
      Definition Language -> Element
forall a. Definition a -> Element
el Definition Language
javaLanguageDef,
      Definition (Set String) -> Element
forall a. Definition a -> Element
el Definition (Set String)
reservedWordsDef
      ]

javaMaxTupleLengthDef :: Definition Int
javaMaxTupleLengthDef :: Definition Int
javaMaxTupleLengthDef = String -> Datum Int -> Definition Int
forall a. String -> Datum a -> Definition a
javaLanguageDefinition String
"javaMaxTupleLength" (Datum Int -> Definition Int) -> Datum Int -> Definition Int
forall a b. (a -> b) -> a -> b
$
  String -> Datum Int -> Datum Int
forall a. String -> Datum a -> Datum a
doc (String
"The maximum supported length of a tuple in Hydra-Java. "
    String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"Note: if this constant is changed, also change Tuples.java correspondingly") (Datum Int -> Datum Int) -> Datum Int -> Datum Int
forall a b. (a -> b) -> a -> b
$
  Int -> Datum Int
int32 Int
9

javaLanguageDef :: Definition (Language)
javaLanguageDef :: Definition Language
javaLanguageDef = String -> Datum Language -> Definition Language
forall a. String -> Datum a -> Definition a
javaLanguageDefinition String
"javaLanguage" (Datum Language -> Definition Language)
-> Datum Language -> Definition Language
forall a b. (a -> b) -> a -> b
$
  String -> Datum Language -> Datum Language
forall a. String -> Datum a -> Datum a
doc String
"Language constraints for Java" (Datum Language -> Datum Language)
-> Datum Language -> Datum Language
forall a b. (a -> b) -> a -> b
$
  Type -> Datum Language -> Datum Language
forall a. Type -> Datum a -> Datum a
typed Type
languageT (Datum Language -> Datum Language)
-> Datum Language -> Datum Language
forall a b. (a -> b) -> a -> b
$
  Name -> [Field] -> Datum Language
forall a. Name -> [Field] -> Datum a
record Name
_Language [
    Name
_Language_nameName -> Datum Any -> Field
forall a. Name -> Datum a -> Field
>>: Name -> Datum Any -> Datum Any
forall a b. Name -> Datum a -> Datum b
wrap Name
_LanguageName Datum Any
"hydra/langs/java",
    Name
_Language_constraintsName -> Datum Any -> Field
forall a. Name -> Datum a -> Field
>>: Name -> [Field] -> Datum Any
forall a. Name -> [Field] -> Datum a
record Name
_LanguageConstraints [
      Name
_LanguageConstraints_eliminationVariantsName -> Datum (Set EliminationVariant) -> Field
forall a. Name -> Datum a -> Field
>>: Datum ([EliminationVariant] -> Set EliminationVariant)
forall a. Datum ([a] -> Set a)
Sets.fromList Datum ([EliminationVariant] -> Set EliminationVariant)
-> Datum [EliminationVariant] -> Datum (Set EliminationVariant)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ Definition [EliminationVariant] -> Datum [EliminationVariant]
forall a. Definition a -> Datum a
ref Definition [EliminationVariant]
eliminationVariantsDef,
      Name
_LanguageConstraints_literalVariantsName -> Datum (Set Any) -> Field
forall a. Name -> Datum a -> Field
>>: Datum ([Any] -> Set Any)
forall a. Datum ([a] -> Set a)
Sets.fromList Datum ([Any] -> Set Any) -> Datum [Any] -> Datum (Set Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ [Datum Any] -> Datum [Any]
forall a. [Datum a] -> Datum [a]
list (Name -> Name -> Datum Any
forall a. Name -> Name -> Datum a
unitVariant Name
_LiteralVariant (Name -> Datum Any) -> [Name] -> [Datum Any]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [
        Name
_LiteralVariant_boolean, -- boolean
        Name
_LiteralVariant_float, -- (see float types)
        Name
_LiteralVariant_integer, -- (see integer types)
        Name
_LiteralVariant_string]), -- string
      Name
_LanguageConstraints_floatTypesName -> Datum (Set Any) -> Field
forall a. Name -> Datum a -> Field
>>: Datum ([Any] -> Set Any)
forall a. Datum ([a] -> Set a)
Sets.fromList Datum ([Any] -> Set Any) -> Datum [Any] -> Datum (Set Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ [Datum Any] -> Datum [Any]
forall a. [Datum a] -> Datum [a]
list (Name -> Name -> Datum Any
forall a. Name -> Name -> Datum a
unitVariant Name
_FloatType (Name -> Datum Any) -> [Name] -> [Datum Any]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [
         -- Bigfloat (e.g. as Java's BigDecimal) is excluded for now
        Name
_FloatType_float32, -- float
        Name
_FloatType_float64]), -- double
      Name
_LanguageConstraints_functionVariantsName -> Datum (Set FunctionVariant) -> Field
forall a. Name -> Datum a -> Field
>>: Datum ([FunctionVariant] -> Set FunctionVariant)
forall a. Datum ([a] -> Set a)
Sets.fromList Datum ([FunctionVariant] -> Set FunctionVariant)
-> Datum [FunctionVariant] -> Datum (Set FunctionVariant)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ Definition [FunctionVariant] -> Datum [FunctionVariant]
forall a. Definition a -> Datum a
ref Definition [FunctionVariant]
functionVariantsDef,
      Name
_LanguageConstraints_integerTypesName -> Datum (Set Any) -> Field
forall a. Name -> Datum a -> Field
>>: Datum ([Any] -> Set Any)
forall a. Datum ([a] -> Set a)
Sets.fromList Datum ([Any] -> Set Any) -> Datum [Any] -> Datum (Set Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ [Datum Any] -> Datum [Any]
forall a. [Datum a] -> Datum [a]
list (Name -> Name -> Datum Any
forall a. Name -> Name -> Datum a
unitVariant Name
_IntegerType (Name -> Datum Any) -> [Name] -> [Datum Any]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [
        Name
_IntegerType_bigint, -- BigInteger
        Name
_IntegerType_int16, -- short
        Name
_IntegerType_int32, -- int
        Name
_IntegerType_int64, -- long
        Name
_IntegerType_uint8, -- byte
        Name
_IntegerType_uint16]), -- char
      Name
_LanguageConstraints_termVariantsName -> Datum (Set Any) -> Field
forall a. Name -> Datum a -> Field
>>: Datum ([Any] -> Set Any)
forall a. Datum ([a] -> Set a)
Sets.fromList Datum ([Any] -> Set Any) -> Datum [Any] -> Datum (Set Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ [Datum Any] -> Datum [Any]
forall a. [Datum a] -> Datum [a]
list (Name -> Name -> Datum Any
forall a. Name -> Name -> Datum a
unitVariant Name
_TermVariant (Name -> Datum Any) -> [Name] -> [Datum Any]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [
        Name
_TermVariant_application,
        Name
_TermVariant_function,
        Name
_TermVariant_let,
        Name
_TermVariant_list,
        Name
_TermVariant_literal,
        Name
_TermVariant_map,
        Name
_TermVariant_optional,
        Name
_TermVariant_product,
        Name
_TermVariant_record,
        Name
_TermVariant_set,
        Name
_TermVariant_union,
        Name
_TermVariant_variable,
        Name
_TermVariant_wrap]),
      Name
_LanguageConstraints_typeVariantsName -> Datum (Set Any) -> Field
forall a. Name -> Datum a -> Field
>>: Datum ([Any] -> Set Any)
forall a. Datum ([a] -> Set a)
Sets.fromList Datum ([Any] -> Set Any) -> Datum [Any] -> Datum (Set Any)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ [Datum Any] -> Datum [Any]
forall a. [Datum a] -> Datum [a]
list (Name -> Name -> Datum Any
forall a. Name -> Name -> Datum a
unitVariant Name
_TypeVariant (Name -> Datum Any) -> [Name] -> [Datum Any]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [
        Name
_TypeVariant_annotated,
        Name
_TypeVariant_application,
        Name
_TypeVariant_function,
        Name
_TypeVariant_lambda,
        Name
_TypeVariant_list,
        Name
_TypeVariant_literal,
        Name
_TypeVariant_map,
        Name
_TypeVariant_optional,
        Name
_TypeVariant_product,
        Name
_TypeVariant_record,
        Name
_TypeVariant_set,
        Name
_TypeVariant_union,
        Name
_TypeVariant_variable,
        Name
_TypeVariant_wrap]),
      Name
_LanguageConstraints_typesName -> Datum (Any -> Bool) -> Field
forall a. Name -> Datum a -> Field
>>: Name -> Maybe (Datum Bool) -> [Field] -> Datum (Any -> Bool)
forall b u. Name -> Maybe (Datum b) -> [Field] -> Datum (u -> b)
match Name
_Type (Datum Bool -> Maybe (Datum Bool)
forall a. a -> Maybe a
Just Datum Bool
true) [
        Name
_Type_productName -> Datum (Any -> Any) -> Field
forall a. Name -> Datum a -> Field
>>: String -> Datum Bool -> Datum (Any -> Any)
forall x a b. String -> Datum x -> Datum (a -> b)
lambda String
"types" (Datum Bool -> Datum (Any -> Any))
-> Datum Bool -> Datum (Any -> Any)
forall a b. (a -> b) -> a -> b
$ Datum (Int -> Int -> Bool)
Equality.ltInt32 Datum (Int -> Int -> Bool) -> Datum Int -> Datum (Int -> Bool)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ (Datum ([Any] -> Int)
forall a. Datum ([a] -> Int)
Lists.length Datum ([Any] -> Int) -> Datum [Any] -> Datum Int
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ String -> Datum [Any]
forall a. String -> Datum a
var String
"types") Datum (Int -> Bool) -> Datum Int -> Datum Bool
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ (Definition Int -> Datum Int
forall a. Definition a -> Datum a
ref Definition Int
javaMaxTupleLengthDef)
      ]]]

reservedWordsDef :: Definition (S.Set String)
reservedWordsDef :: Definition (Set String)
reservedWordsDef = String -> Datum (Set String) -> Definition (Set String)
forall a. String -> Datum a -> Definition a
javaLanguageDefinition String
"reservedWords" (Datum (Set String) -> Definition (Set String))
-> Datum (Set String) -> Definition (Set String)
forall a b. (a -> b) -> a -> b
$
  String -> Datum (Set String) -> Datum (Set String)
forall a. String -> Datum a -> Datum a
doc String
"A set of reserved words in Java" (Datum (Set String) -> Datum (Set String))
-> Datum (Set String) -> Datum (Set String)
forall a b. (a -> b) -> a -> b
$
  Type -> Datum (Set String) -> Datum (Set String)
forall a. Type -> Datum a -> Datum a
typed (Type -> Type
setT Type
stringT) (Datum (Set String) -> Datum (Set String))
-> Datum (Set String) -> Datum (Set String)
forall a b. (a -> b) -> a -> b
$
  (Datum ([String] -> Set String)
forall a. Datum ([a] -> Set a)
Sets.fromList Datum ([String] -> Set String)
-> Datum [String] -> Datum (Set String)
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ (Datum ([[String]] -> [String])
forall a. Datum ([[a]] -> [a])
Lists.concat Datum ([[String]] -> [String])
-> Datum [[String]] -> Datum [String]
forall a b. Datum (a -> b) -> Datum a -> Datum b
@@ [Datum [String]] -> Datum [[String]]
forall a. [Datum a] -> Datum [a]
list [String -> Datum [String]
forall a. String -> Datum a
var String
"specialNames", String -> Datum [String]
forall a. String -> Datum a
var String
"classNames", String -> Datum [String]
forall a. String -> Datum a
var String
"keywords", String -> Datum [String]
forall a. String -> Datum a
var String
"literals"]))
  Datum (Set String) -> [Field] -> Datum (Set String)
forall a. Datum a -> [Field] -> Datum a
`with` [
    String
"specialNames"String -> Datum [Any] -> Field
forall a. String -> Datum a -> Field
>:
      String -> Datum [Any] -> Datum [Any]
forall a. String -> Datum a -> Datum a
doc String
"Special names reserved for use by Hydra" (Datum [Any] -> Datum [Any]) -> Datum [Any] -> Datum [Any]
forall a b. (a -> b) -> a -> b
$
      [Datum Any] -> Datum [Any]
forall a. [Datum a] -> Datum [a]
list [Datum Any
"Elements"],

    String
"classNames"String -> Datum [Any] -> Field
forall a. String -> Datum a -> Field
>:
      String -> Datum [Any] -> Datum [Any]
forall a. String -> Datum a -> Datum a
doc (String
"java.lang classes as of JDK 7\n"
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"See: https://docs.oracle.com/javase/7/docs/api/java/lang/package-summary.html") (Datum [Any] -> Datum [Any]) -> Datum [Any] -> Datum [Any]
forall a b. (a -> b) -> a -> b
$
      [Datum Any] -> Datum [Any]
forall a. [Datum a] -> Datum [a]
list [
        Datum Any
"AbstractMethodError", Datum Any
"Appendable", Datum Any
"ArithmeticException", Datum Any
"ArrayIndexOutOfBoundsException",
        Datum Any
"ArrayStoreException", Datum Any
"AssertionError", Datum Any
"AutoCloseable", Datum Any
"Boolean", Datum Any
"BootstrapMethodError", Datum Any
"Byte",
        Datum Any
"CharSequence", Datum Any
"Character", Datum Any
"Class", Datum Any
"ClassCastException", Datum Any
"ClassCircularityError", Datum Any
"ClassFormatError",
        Datum Any
"ClassLoader", Datum Any
"ClassNotFoundException", Datum Any
"ClassValue", Datum Any
"CloneNotSupportedException", Datum Any
"Cloneable", Datum Any
"Comparable",
        Datum Any
"Compiler", Datum Any
"Deprecated", Datum Any
"Double", Datum Any
"Enum", Datum Any
"EnumConstantNotPresentException", Datum Any
"Error", Datum Any
"Exception",
        Datum Any
"ExceptionInInitializerError", Datum Any
"Float", Datum Any
"IllegalAccessError", Datum Any
"IllegalAccessException",
        Datum Any
"IllegalArgumentException", Datum Any
"IllegalMonitorStateException", Datum Any
"IllegalStateException",
        Datum Any
"IllegalThreadStateException", Datum Any
"IncompatibleClassChangeError", Datum Any
"IndexOutOfBoundsException",
        Datum Any
"InheritableThreadLocal", Datum Any
"InstantiationError", Datum Any
"InstantiationException", Datum Any
"Integer", Datum Any
"InternalError",
        Datum Any
"InterruptedException", Datum Any
"Iterable", Datum Any
"LinkageError", Datum Any
"Long", Datum Any
"Math", Datum Any
"NegativeArraySizeException",
        Datum Any
"NoClassDefFoundError", Datum Any
"NoSuchFieldError", Datum Any
"NoSuchFieldException", Datum Any
"NoSuchMethodError", Datum Any
"NoSuchMethodException",
        Datum Any
"NullPointerException", Datum Any
"Number", Datum Any
"NumberFormatException", Datum Any
"Object", Datum Any
"OutOfMemoryError", Datum Any
"Override", Datum Any
"Package",
        Datum Any
"Process", Datum Any
"ProcessBuilder", Datum Any
"Readable", Datum Any
"ReflectiveOperationException", Datum Any
"Runnable", Datum Any
"Runtime",
        Datum Any
"RuntimeException", Datum Any
"RuntimePermission", Datum Any
"SafeVarargs", Datum Any
"SecurityException", Datum Any
"SecurityManager", Datum Any
"Short",
        Datum Any
"StackOverflowError", Datum Any
"StackTraceElement", Datum Any
"StrictMath", Datum Any
"String", Datum Any
"StringBuffer", Datum Any
"StringBuilder",
        Datum Any
"StringIndexOutOfBoundsException", Datum Any
"SuppressWarnings", Datum Any
"System", Datum Any
"Thread", Datum Any
"ThreadDeath",
        Datum Any
"ThreadGroup", Datum Any
"ThreadLocal", Datum Any
"Throwable", Datum Any
"TypeNotPresentException",
        Datum Any
"UnknownError", Datum Any
"UnsatisfiedLinkError", Datum Any
"UnsupportedClassVersionError",
        Datum Any
"UnsupportedOperationException", Datum Any
"VerifyError", Datum Any
"VirtualMachineError", Datum Any
"Void"],

    String
"keywords"String -> Datum [Any] -> Field
forall a. String -> Datum a -> Field
>:
      String -> Datum [Any] -> Datum [Any]
forall a. String -> Datum a -> Datum a
doc (String
"Keywords and literals are taken from Oracle's Java Tutorials on 2022-05-27; said to be complete for Java 1.8 only\n"
          String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"See: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html") (Datum [Any] -> Datum [Any]) -> Datum [Any] -> Datum [Any]
forall a b. (a -> b) -> a -> b
$
      [Datum Any] -> Datum [Any]
forall a. [Datum a] -> Datum [a]
list [
        Datum Any
"abstract", Datum Any
"assert", Datum Any
"boolean", Datum Any
"break", Datum Any
"byte", Datum Any
"case", Datum Any
"catch", Datum Any
"char", Datum Any
"class", Datum Any
"const", Datum Any
"continue",
        Datum Any
"default", Datum Any
"do", Datum Any
"double", Datum Any
"else", Datum Any
"enum", Datum Any
"extends", Datum Any
"final", Datum Any
"finally", Datum Any
"float", Datum Any
"for", Datum Any
"goto", Datum Any
"if",
        Datum Any
"implements", Datum Any
"import", Datum Any
"instanceof", Datum Any
"int", Datum Any
"interface", Datum Any
"long", Datum Any
"native", Datum Any
"new", Datum Any
"package", Datum Any
"private",
        Datum Any
"protected", Datum Any
"public", Datum Any
"return", Datum Any
"short", Datum Any
"static", Datum Any
"strictfp", Datum Any
"super", Datum Any
"switch", Datum Any
"synchronized", Datum Any
"this",
        Datum Any
"throw", Datum Any
"throws", Datum Any
"transient", Datum Any
"try", Datum Any
"void", Datum Any
"volatile", Datum Any
"while"],

    String
"literals"String -> Datum [Any] -> Field
forall a. String -> Datum a -> Field
>:
      [Datum Any] -> Datum [Any]
forall a. [Datum a] -> Datum [a]
list [Datum Any
"false", Datum Any
"null", Datum Any
"true"]]