{- |
Module                  : Language.Jsonnet.Syntax.Annotated
Copyright               : (c) 2020-2021 Alexandre Moreno
SPDX-License-Identifier : BSD-3-Clause OR Apache-2.0
Maintainer              : Alexandre Moreno <alexmorenocano@gmail.com>
Stability               : experimental
Portability             : non-portable
-}
module Language.Jsonnet.Syntax.Annotated where

import Data.Fix
import Data.Functor.Sum
import Data.List.NonEmpty
import Data.Semigroup.Foldable
import Language.Jsonnet.Annotate
import Language.Jsonnet.Common
import Language.Jsonnet.Parser.SrcSpan
import Language.Jsonnet.Syntax

-- | annotated syntax tree with resolved imports
type Expr = Ann ExprF SrcSpan

-- | annotated syntax tree with unresolved imports
type Expr' = Ann ExprF' SrcSpan

mkApply :: Expr' -> Args Expr' -> Expr'
mkApply :: Expr' -> Args Expr' -> Expr'
mkApply a :: Expr'
a@(Fix (AnnF ExprF' Expr'
_ SrcSpan
ann)) Args Expr'
args =
  Product (Const SrcSpan) ExprF' Expr' -> Expr'
forall (f :: * -> *). f (Fix f) -> Fix f
Fix (Product (Const SrcSpan) ExprF' Expr' -> Expr')
-> Product (Const SrcSpan) ExprF' Expr' -> Expr'
forall a b. (a -> b) -> a -> b
$ ExprF' Expr' -> SrcSpan -> Product (Const SrcSpan) ExprF' Expr'
forall {a1} {g :: * -> *} {a2}.
g a2 -> a1 -> Product (Const a1) g a2
AnnF (ExprF Expr' -> ExprF' Expr'
forall {k} (f :: k -> *) (g :: k -> *) (a :: k). f a -> Sum f g a
InL (ExprF Expr' -> ExprF' Expr') -> ExprF Expr' -> ExprF' Expr'
forall a b. (a -> b) -> a -> b
$ Expr' -> Args Expr' -> ExprF Expr'
forall a. a -> Args a -> ExprF a
EApply Expr'
a Args Expr'
args) SrcSpan
ann

--mkApply a@(Fix (AnnF _ ann)) b =
--  Fix $ AnnF (InL $ EApply a b) (fold1 (ann <| fmap attrib (fromList b)))

mkLookup :: Expr' -> Expr' -> Expr'
mkLookup :: Expr' -> Expr' -> Expr'
mkLookup a :: Expr'
a@(Fix (AnnF ExprF' Expr'
_ SrcSpan
ann1)) b :: Expr'
b@(Fix (AnnF ExprF' Expr'
_ SrcSpan
ann2)) =
  Product (Const SrcSpan) ExprF' Expr' -> Expr'
forall (f :: * -> *). f (Fix f) -> Fix f
Fix (Product (Const SrcSpan) ExprF' Expr' -> Expr')
-> Product (Const SrcSpan) ExprF' Expr' -> Expr'
forall a b. (a -> b) -> a -> b
$ ExprF' Expr' -> SrcSpan -> Product (Const SrcSpan) ExprF' Expr'
forall {a1} {g :: * -> *} {a2}.
g a2 -> a1 -> Product (Const a1) g a2
AnnF (ExprF Expr' -> ExprF' Expr'
forall {k} (f :: k -> *) (g :: k -> *) (a :: k). f a -> Sum f g a
InL (ExprF Expr' -> ExprF' Expr') -> ExprF Expr' -> ExprF' Expr'
forall a b. (a -> b) -> a -> b
$ Expr' -> Expr' -> ExprF Expr'
forall a. a -> a -> ExprF a
ELookup Expr'
a Expr'
b) (SrcSpan
ann1 SrcSpan -> SrcSpan -> SrcSpan
forall a. Semigroup a => a -> a -> a
<> SrcSpan
ann2)

mkIndex :: Expr' -> Expr' -> Expr'
mkIndex :: Expr' -> Expr' -> Expr'
mkIndex a :: Expr'
a@(Fix (AnnF ExprF' Expr'
_ SrcSpan
ann1)) b :: Expr'
b@(Fix (AnnF ExprF' Expr'
_ SrcSpan
ann2)) =
  Product (Const SrcSpan) ExprF' Expr' -> Expr'
forall (f :: * -> *). f (Fix f) -> Fix f
Fix (Product (Const SrcSpan) ExprF' Expr' -> Expr')
-> Product (Const SrcSpan) ExprF' Expr' -> Expr'
forall a b. (a -> b) -> a -> b
$ ExprF' Expr' -> SrcSpan -> Product (Const SrcSpan) ExprF' Expr'
forall {a1} {g :: * -> *} {a2}.
g a2 -> a1 -> Product (Const a1) g a2
AnnF (ExprF Expr' -> ExprF' Expr'
forall {k} (f :: k -> *) (g :: k -> *) (a :: k). f a -> Sum f g a
InL (ExprF Expr' -> ExprF' Expr') -> ExprF Expr' -> ExprF' Expr'
forall a b. (a -> b) -> a -> b
$ Expr' -> Expr' -> ExprF Expr'
forall a. a -> a -> ExprF a
EIndex Expr'
a Expr'
b) (SrcSpan
ann1 SrcSpan -> SrcSpan -> SrcSpan
forall a. Semigroup a => a -> a -> a
<> SrcSpan
ann2)

mkSlice :: Maybe Expr' -> Maybe Expr' -> Maybe Expr' -> Expr' -> Expr'
mkSlice :: Maybe Expr' -> Maybe Expr' -> Maybe Expr' -> Expr' -> Expr'
mkSlice Maybe Expr'
i Maybe Expr'
n Maybe Expr'
s e :: Expr'
e@(Fix (AnnF ExprF' Expr'
_ SrcSpan
ann1)) =
  Product (Const SrcSpan) ExprF' Expr' -> Expr'
forall (f :: * -> *). f (Fix f) -> Fix f
Fix (Product (Const SrcSpan) ExprF' Expr' -> Expr')
-> Product (Const SrcSpan) ExprF' Expr' -> Expr'
forall a b. (a -> b) -> a -> b
$ ExprF' Expr' -> SrcSpan -> Product (Const SrcSpan) ExprF' Expr'
forall {a1} {g :: * -> *} {a2}.
g a2 -> a1 -> Product (Const a1) g a2
AnnF (ExprF Expr' -> ExprF' Expr'
forall {k} (f :: k -> *) (g :: k -> *) (a :: k). f a -> Sum f g a
InL (ExprF Expr' -> ExprF' Expr') -> ExprF Expr' -> ExprF' Expr'
forall a b. (a -> b) -> a -> b
$ Expr' -> Maybe Expr' -> Maybe Expr' -> Maybe Expr' -> ExprF Expr'
forall a. a -> Maybe a -> Maybe a -> Maybe a -> ExprF a
ESlice Expr'
e Maybe Expr'
i Maybe Expr'
n Maybe Expr'
s) SrcSpan
ann1

mkBinOp :: BinOp -> Expr' -> Expr' -> Expr'
mkBinOp :: BinOp -> Expr' -> Expr' -> Expr'
mkBinOp BinOp
op a :: Expr'
a@(Fix (AnnF ExprF' Expr'
_ SrcSpan
ann1)) b :: Expr'
b@(Fix (AnnF ExprF' Expr'
_ SrcSpan
ann2)) =
  Product (Const SrcSpan) ExprF' Expr' -> Expr'
forall (f :: * -> *). f (Fix f) -> Fix f
Fix (Product (Const SrcSpan) ExprF' Expr' -> Expr')
-> Product (Const SrcSpan) ExprF' Expr' -> Expr'
forall a b. (a -> b) -> a -> b
$ ExprF' Expr' -> SrcSpan -> Product (Const SrcSpan) ExprF' Expr'
forall {a1} {g :: * -> *} {a2}.
g a2 -> a1 -> Product (Const a1) g a2
AnnF (ExprF Expr' -> ExprF' Expr'
forall {k} (f :: k -> *) (g :: k -> *) (a :: k). f a -> Sum f g a
InL (ExprF Expr' -> ExprF' Expr') -> ExprF Expr' -> ExprF' Expr'
forall a b. (a -> b) -> a -> b
$ BinOp -> Expr' -> Expr' -> ExprF Expr'
forall a. BinOp -> a -> a -> ExprF a
EBinOp BinOp
op Expr'
a Expr'
b) (SrcSpan
ann1 SrcSpan -> SrcSpan -> SrcSpan
forall a. Semigroup a => a -> a -> a
<> SrcSpan
ann2)

-- FIXME we are manually here updating the span
mkUnyOp :: UnyOp -> Expr' -> Expr'
mkUnyOp :: UnyOp -> Expr' -> Expr'
mkUnyOp UnyOp
op a :: Expr'
a@(Fix (AnnF ExprF' Expr'
_ SrcSpan
ann)) =
  Product (Const SrcSpan) ExprF' Expr' -> Expr'
forall (f :: * -> *). f (Fix f) -> Fix f
Fix (Product (Const SrcSpan) ExprF' Expr' -> Expr')
-> Product (Const SrcSpan) ExprF' Expr' -> Expr'
forall a b. (a -> b) -> a -> b
$ ExprF' Expr' -> SrcSpan -> Product (Const SrcSpan) ExprF' Expr'
forall {a1} {g :: * -> *} {a2}.
g a2 -> a1 -> Product (Const a1) g a2
AnnF (ExprF Expr' -> ExprF' Expr'
forall {k} (f :: k -> *) (g :: k -> *) (a :: k). f a -> Sum f g a
InL (ExprF Expr' -> ExprF' Expr') -> ExprF Expr' -> ExprF' Expr'
forall a b. (a -> b) -> a -> b
$ UnyOp -> Expr' -> ExprF Expr'
forall a. UnyOp -> a -> ExprF a
EUnyOp UnyOp
op Expr'
a) SrcSpan
ann