{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}

{-# OPTIONS_GHC -Wno-redundant-constraints #-}

module Language.Java.Inline.Internal.QQMarker where

import Data.Proxy
import GHC.Stack (HasCallStack, withFrozenCallStack)
import GHC.TypeLits (Nat, Symbol)
import Language.Java

-- | A function to indicate to the plugin the occurrence
-- of java quasiquotations
qqMarker
  :: forall
     k
     (args_tys :: k)     -- JType's of arguments
     tyres               -- JType of result
     (input :: Symbol)   -- input string of the quasiquoter
     (mname :: Symbol)   -- name of the method to generate
     (antiqs :: Symbol)  -- antiquoted variables as a comma-separated list
     (line :: Nat)       -- line number of the quasiquotation
     args_tuple          -- uncoerced argument types
     b                   -- uncoerced result type
     m.
     ( tyres ~ Ty b
     , Coercibles args_tuple args_tys
     , Coercible b
     , HasCallStack
     )
  => Proxy input
  -> Proxy mname
  -> Proxy antiqs
  -> Proxy line
  -> args_tuple
  -> Proxy args_tys
  -> (args_tuple -> m b)
  -> m b
qqMarker :: Proxy input
-> Proxy mname
-> Proxy antiqs
-> Proxy line
-> args_tuple
-> Proxy args_tys
-> (args_tuple -> m b)
-> m b
qqMarker = (HasCallStack =>
 Proxy input
 -> Proxy mname
 -> Proxy antiqs
 -> Proxy line
 -> args_tuple
 -> Proxy args_tys
 -> (args_tuple -> m b)
 -> m b)
-> Proxy input
-> Proxy mname
-> Proxy antiqs
-> Proxy line
-> args_tuple
-> Proxy args_tys
-> (args_tuple -> m b)
-> m b
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack =>
  Proxy input
  -> Proxy mname
  -> Proxy antiqs
  -> Proxy line
  -> args_tuple
  -> Proxy args_tys
  -> (args_tuple -> m b)
  -> m b)
 -> Proxy input
 -> Proxy mname
 -> Proxy antiqs
 -> Proxy line
 -> args_tuple
 -> Proxy args_tys
 -> (args_tuple -> m b)
 -> m b)
-> (HasCallStack =>
    Proxy input
    -> Proxy mname
    -> Proxy antiqs
    -> Proxy line
    -> args_tuple
    -> Proxy args_tys
    -> (args_tuple -> m b)
    -> m b)
-> Proxy input
-> Proxy mname
-> Proxy antiqs
-> Proxy line
-> args_tuple
-> Proxy args_tys
-> (args_tuple -> m b)
-> m b
forall a b. (a -> b) -> a -> b
$
    [Char]
-> Proxy input
-> Proxy mname
-> Proxy antiqs
-> Proxy line
-> args_tuple
-> Proxy args_tys
-> (args_tuple -> m b)
-> m b
forall a. HasCallStack => [Char] -> a
error
      [Char]
"A quasiquotation marker was not removed. Please, report this as a bug."

class Coercibles xs (tys :: k) | xs -> tys
instance Coercibles () ()
instance (ty ~ Ty x, Coercible x, Coercibles xs tys)
    => Coercibles (x, xs) '(ty, tys)