packages feed

hydra-0.1.1: src/main/haskell/Hydra/Ext/Java/Language.hs

module Hydra.Ext.Java.Language where

import Hydra.Kernel

import qualified Data.Set as S


javaLanguage :: Language m
javaLanguage = Language (LanguageName "hydra/ext/java") $ LanguageConstraints {
  languageConstraintsEliminationVariants = S.fromList eliminationVariants,

  languageConstraintsLiteralVariants = S.fromList [
    LiteralVariantBoolean, -- boolean
    LiteralVariantFloat, -- (see float types)
    LiteralVariantInteger, -- (see integer types)
    LiteralVariantString], -- string
  languageConstraintsFloatTypes = S.fromList [
    -- Bigfloat (e.g. as Java's BigDecimal) is excluded for now
    FloatTypeFloat32, -- float
    FloatTypeFloat64], -- double
  languageConstraintsFunctionVariants = S.fromList functionVariants,
  languageConstraintsIntegerTypes = S.fromList [
    IntegerTypeBigint, -- BigInteger
    IntegerTypeInt16, -- short
    IntegerTypeInt32, -- int
    IntegerTypeInt64, -- long
    IntegerTypeUint8, -- byte
    IntegerTypeUint16], -- char
  languageConstraintsTermVariants = S.fromList [
    TermVariantApplication,
    TermVariantElement,
    TermVariantFunction,
    -- Note: "let" is excluded for now
    TermVariantList,
    TermVariantLiteral,
    TermVariantMap,
    TermVariantNominal,
    TermVariantOptional,
    TermVariantRecord,
    TermVariantSet,
    TermVariantUnion,
    TermVariantVariable],
  languageConstraintsTypeVariants = S.fromList [
    TypeVariantAnnotated,
    TypeVariantApplication,
    TypeVariantElement,
    TypeVariantFunction,
    TypeVariantLambda,
    TypeVariantList,
    TypeVariantLiteral,
    TypeVariantMap,
    TypeVariantNominal,
    TypeVariantOptional,
    TypeVariantRecord,
    TypeVariantSet,
    TypeVariantUnion,
    TypeVariantVariable],
  languageConstraintsTypes = const True }

reservedWords :: S.Set String
reservedWords = S.fromList $ specialNames ++ classNames ++ keywords ++ literals
  where
    -- Special names reserved for use by Hydra
    specialNames = ["Elements"]

    -- java.lang classes as of JDK 7
    -- See: https://docs.oracle.com/javase/7/docs/api/java/lang/package-summary.html
    classNames = [
      "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 and literals are taken from Oracle's Java Tutorials on 2022-05-27; said to be complete for Java 1.8 only
    -- See: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
    keywords = [
      "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 = ["false", "null", "true"]