hydra-0.5.0: src/main/haskell/Hydra/Sources/Tier4/Langs/Java/Language.hs
{-# 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 = definitionInModule javaLanguageModule
javaLanguageModule :: Module
javaLanguageModule = Module ns elements [hydraCodersModule, hydraBasicsModule] tier0Modules $
Just "Language constraints for Java"
where
ns = Namespace "hydra/langs/java/language"
elements = [
el javaMaxTupleLengthDef,
el javaLanguageDef,
el reservedWordsDef
]
javaMaxTupleLengthDef :: Definition Int
javaMaxTupleLengthDef = javaLanguageDefinition "javaMaxTupleLength" $
doc ("The maximum supported length of a tuple in Hydra-Java. "
<> "Note: if this constant is changed, also change Tuples.java correspondingly") $
int32 9
javaLanguageDef :: Definition (Language)
javaLanguageDef = javaLanguageDefinition "javaLanguage" $
doc "Language constraints for Java" $
typed languageT $
record _Language [
_Language_name>>: wrap _LanguageName "hydra/langs/java",
_Language_constraints>>: record _LanguageConstraints [
_LanguageConstraints_eliminationVariants>>: Sets.fromList @@ ref eliminationVariantsDef,
_LanguageConstraints_literalVariants>>: Sets.fromList @@ list (unitVariant _LiteralVariant <$> [
_LiteralVariant_boolean, -- boolean
_LiteralVariant_float, -- (see float types)
_LiteralVariant_integer, -- (see integer types)
_LiteralVariant_string]), -- string
_LanguageConstraints_floatTypes>>: Sets.fromList @@ list (unitVariant _FloatType <$> [
-- Bigfloat (e.g. as Java's BigDecimal) is excluded for now
_FloatType_float32, -- float
_FloatType_float64]), -- double
_LanguageConstraints_functionVariants>>: Sets.fromList @@ ref functionVariantsDef,
_LanguageConstraints_integerTypes>>: Sets.fromList @@ list (unitVariant _IntegerType <$> [
_IntegerType_bigint, -- BigInteger
_IntegerType_int16, -- short
_IntegerType_int32, -- int
_IntegerType_int64, -- long
_IntegerType_uint8, -- byte
_IntegerType_uint16]), -- char
_LanguageConstraints_termVariants>>: Sets.fromList @@ list (unitVariant _TermVariant <$> [
_TermVariant_application,
_TermVariant_function,
_TermVariant_let,
_TermVariant_list,
_TermVariant_literal,
_TermVariant_map,
_TermVariant_optional,
_TermVariant_product,
_TermVariant_record,
_TermVariant_set,
_TermVariant_union,
_TermVariant_variable,
_TermVariant_wrap]),
_LanguageConstraints_typeVariants>>: Sets.fromList @@ list (unitVariant _TypeVariant <$> [
_TypeVariant_annotated,
_TypeVariant_application,
_TypeVariant_function,
_TypeVariant_lambda,
_TypeVariant_list,
_TypeVariant_literal,
_TypeVariant_map,
_TypeVariant_optional,
_TypeVariant_product,
_TypeVariant_record,
_TypeVariant_set,
_TypeVariant_union,
_TypeVariant_variable,
_TypeVariant_wrap]),
_LanguageConstraints_types>>: match _Type (Just true) [
_Type_product>>: lambda "types" $ Equality.ltInt32 @@ (Lists.length @@ var "types") @@ (ref javaMaxTupleLengthDef)
]]]
reservedWordsDef :: Definition (S.Set String)
reservedWordsDef = javaLanguageDefinition "reservedWords" $
doc "A set of reserved words in Java" $
typed (setT stringT) $
(Sets.fromList @@ (Lists.concat @@ list [var "specialNames", var "classNames", var "keywords", var "literals"]))
`with` [
"specialNames">:
doc "Special names reserved for use by Hydra" $
list ["Elements"],
"classNames">:
doc ("java.lang classes as of JDK 7\n"
<> "See: https://docs.oracle.com/javase/7/docs/api/java/lang/package-summary.html") $
list [
"AbstractMethodError", "Appendable", "ArithmeticException", "ArrayIndexOutOfBoundsException",
"ArrayStoreException", "AssertionError", "AutoCloseable", "Boolean", "BootstrapMethodError", "Byte",
"CharSequence", "Character", "Class", "ClassCastException", "ClassCircularityError", "ClassFormatError",
"ClassLoader", "ClassNotFoundException", "ClassValue", "CloneNotSupportedException", "Cloneable", "Comparable",
"Compiler", "Deprecated", "Double", "Enum", "EnumConstantNotPresentException", "Error", "Exception",
"ExceptionInInitializerError", "Float", "IllegalAccessError", "IllegalAccessException",
"IllegalArgumentException", "IllegalMonitorStateException", "IllegalStateException",
"IllegalThreadStateException", "IncompatibleClassChangeError", "IndexOutOfBoundsException",
"InheritableThreadLocal", "InstantiationError", "InstantiationException", "Integer", "InternalError",
"InterruptedException", "Iterable", "LinkageError", "Long", "Math", "NegativeArraySizeException",
"NoClassDefFoundError", "NoSuchFieldError", "NoSuchFieldException", "NoSuchMethodError", "NoSuchMethodException",
"NullPointerException", "Number", "NumberFormatException", "Object", "OutOfMemoryError", "Override", "Package",
"Process", "ProcessBuilder", "Readable", "ReflectiveOperationException", "Runnable", "Runtime",
"RuntimeException", "RuntimePermission", "SafeVarargs", "SecurityException", "SecurityManager", "Short",
"StackOverflowError", "StackTraceElement", "StrictMath", "String", "StringBuffer", "StringBuilder",
"StringIndexOutOfBoundsException", "SuppressWarnings", "System", "Thread", "ThreadDeath",
"ThreadGroup", "ThreadLocal", "Throwable", "TypeNotPresentException",
"UnknownError", "UnsatisfiedLinkError", "UnsupportedClassVersionError",
"UnsupportedOperationException", "VerifyError", "VirtualMachineError", "Void"],
"keywords">:
doc ("Keywords and literals are taken from Oracle's Java Tutorials on 2022-05-27; said to be complete for Java 1.8 only\n"
<> "See: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html") $
list [
"abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue",
"default", "do", "double", "else", "enum", "extends", "final", "finally", "float", "for", "goto", "if",
"implements", "import", "instanceof", "int", "interface", "long", "native", "new", "package", "private",
"protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", "this",
"throw", "throws", "transient", "try", "void", "volatile", "while"],
"literals">:
list ["false", "null", "true"]]