From 09f228b307d4ad5d7f769aca2c6484d2a027a5b9 Mon Sep 17 00:00:00 2001
From: Rahul Muttineni <rahulmutt@gmail.com>
Date: Thu, 23 Feb 2017 18:27:02 +0530
Subject: [PATCH 1/2] Added support for java calling covention

---
 src/Language/Haskell/Exts/ExactPrint.hs     | 1 +
 src/Language/Haskell/Exts/InternalLexer.hs  | 3 +++
 src/Language/Haskell/Exts/InternalParser.ly | 2 ++
 src/Language/Haskell/Exts/Pretty.hs         | 1 +
 src/Language/Haskell/Exts/Syntax.hs         | 2 ++
 5 files changed, 9 insertions(+)

diff --git a/src/Language/Haskell/Exts/ExactPrint.hs b/src/Language/Haskell/Exts/ExactPrint.hs
index d3d7b380..6a028579 100644
--- a/src/Language/Haskell/Exts/ExactPrint.hs
+++ b/src/Language/Haskell/Exts/ExactPrint.hs
@@ -2078,6 +2078,7 @@ instance ExactP CallConv where
   exactP (CPlusPlus  _) = printString "cplusplus"
   exactP (DotNet     _) = printString "dotnet"
   exactP (Jvm        _) = printString "jvm"
+  exactP (Java       _) = printString "java"
   exactP (Js         _) = printString "js"
   exactP (JavaScript _) = printString "javascript"
   exactP (CApi       _) = printString "capi"
diff --git a/src/Language/Haskell/Exts/InternalLexer.hs b/src/Language/Haskell/Exts/InternalLexer.hs
index f7d45286..4d2528f9 100644
--- a/src/Language/Haskell/Exts/InternalLexer.hs
+++ b/src/Language/Haskell/Exts/InternalLexer.hs
@@ -204,6 +204,7 @@ data Token
         | KW_CPlusPlus
         | KW_DotNet
         | KW_Jvm
+        | KW_Java
         | KW_Js
         | KW_JavaScript
         | KW_CApi
@@ -312,6 +313,7 @@ special_varids = [
  ( "cplusplus",     (KW_CPlusPlus,     Just (Any [ForeignFunctionInterface])) ),
  ( "dotnet",        (KW_DotNet,        Just (Any [ForeignFunctionInterface])) ),
  ( "jvm",           (KW_Jvm,           Just (Any [ForeignFunctionInterface])) ),
+ ( "java",          (KW_Java,          Just (Any [ForeignFunctionInterface])) ),
  ( "js",            (KW_Js,            Just (Any [ForeignFunctionInterface])) ),
  ( "javascript",    (KW_JavaScript,    Just (Any [ForeignFunctionInterface])) ),
  ( "capi",          (KW_CApi,          Just (Any [CApiFFI])) )
@@ -1420,6 +1422,7 @@ showToken t = case t of
   KW_CPlusPlus  -> "cplusplus"
   KW_DotNet     -> "dotnet"
   KW_Jvm        -> "jvm"
+  KW_Java       -> "java"
   KW_Js         -> "js"
   KW_JavaScript -> "javascript"
   KW_CApi       -> "capi"
diff --git a/src/Language/Haskell/Exts/InternalParser.ly b/src/Language/Haskell/Exts/InternalParser.ly
index 3b5808b9..4c446719 100644
--- a/src/Language/Haskell/Exts/InternalParser.ly
+++ b/src/Language/Haskell/Exts/InternalParser.ly
@@ -214,6 +214,7 @@ FFI
 >       'cplusplus'     { Loc $$ KW_CPlusPlus }
 >       'dotnet'        { Loc $$ KW_DotNet }
 >       'jvm'           { Loc $$ KW_Jvm }
+>       'java'          { Loc $$ KW_Java }
 >       'js'            { Loc $$ KW_Js }          -- 90
 >       'javascript'    { Loc $$ KW_JavaScript }
 >       'capi'          { Loc $$ KW_CApi }
@@ -845,6 +846,7 @@ so no need to check for extensions.
 >          | 'cplusplus'                { CPlusPlus  (nIS $1) }
 >          | 'dotnet'                   { DotNet     (nIS $1) }
 >          | 'jvm'                      { Jvm        (nIS $1) }
+>          | 'java'                     { Java       (nIS $1) }
 >          | 'js'                       { Js         (nIS $1) }
 >          | 'javascript'               { JavaScript (nIS $1) }
 >          | 'capi'                     { CApi       (nIS $1) }
diff --git a/src/Language/Haskell/Exts/Pretty.hs b/src/Language/Haskell/Exts/Pretty.hs
index c5be1594..86c93057 100644
--- a/src/Language/Haskell/Exts/Pretty.hs
+++ b/src/Language/Haskell/Exts/Pretty.hs
@@ -695,6 +695,7 @@ instance  Pretty (CallConv l) where
         pretty CPlusPlus {}  = text "cplusplus"
         pretty DotNet {}     = text "dotnet"
         pretty Jvm {}        = text "jvm"
+        pretty Java {}       = text "java"
         pretty Js {}         = text "js"
         pretty JavaScript {} = text "javascript"
         pretty CApi {}       = text "capi"
diff --git a/src/Language/Haskell/Exts/Syntax.hs b/src/Language/Haskell/Exts/Syntax.hs
index 06695486..ce9e7775 100644
--- a/src/Language/Haskell/Exts/Syntax.hs
+++ b/src/Language/Haskell/Exts/Syntax.hs
@@ -833,6 +833,7 @@ data CallConv l
     | CPlusPlus l
     | DotNet l
     | Jvm l
+    | Java l
     | Js l
     | JavaScript l
     | CApi l
@@ -1724,6 +1725,7 @@ instance Annotated CallConv where
     ann (CPlusPlus l) = l
     ann (DotNet l) = l
     ann (Jvm l) = l
+    ann (Java l) = l
     ann (Js l) = l
     ann (JavaScript l) = l
     ann (CApi l) = l

From 01d6f391835c4ca6f63f73e55e92a3568a0a958c Mon Sep 17 00:00:00 2001
From: Rahul Muttineni <rahulmutt@gmail.com>
Date: Thu, 23 Feb 2017 19:59:05 +0530
Subject: [PATCH 2/2] Allow constraints in FFI type sigs

---
 src/Language/Haskell/Exts/InternalParser.ly | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/Language/Haskell/Exts/InternalParser.ly b/src/Language/Haskell/Exts/InternalParser.ly
index 4c446719..69ebe2e2 100644
--- a/src/Language/Haskell/Exts/InternalParser.ly
+++ b/src/Language/Haskell/Exts/InternalParser.ly
@@ -860,8 +860,8 @@ so no need to check for extensions.
 >        | {- empty -}                  { Nothing }
 
 > fspec :: { (Maybe String, Name L, Type L, [S]) }
->       : STRING var_no_safety '::' truedtype               { let Loc l (StringTok (s,_)) = $1 in (Just s, $2, $4, [l,$3]) }
->       |        var_no_safety '::' truedtype               { (Nothing, $1, $3, [$2]) }
+>       : STRING var_no_safety '::' truectype               { let Loc l (StringTok (s,_)) = $1 in (Just s, $2, $4, [l,$3]) }
+>       |        var_no_safety '::' truectype               { (Nothing, $1, $3, [$2]) }
 
 -----------------------------------------------------------------------------
 Pragmas