summaryrefslogtreecommitdiff
path: root/src-3.0/GF/Compile/MkResource.hs
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2008-05-21 09:26:44 +0000
committeraarne <aarne@cs.chalmers.se>2008-05-21 09:26:44 +0000
commit055c0d0d5a5bb0dc75904fe53df7f2e4f5732a8f (patch)
tree0e63fb68c69c8f6ad0f78893c63420f0a3600e1c /src-3.0/GF/Compile/MkResource.hs
parent915a1de71783ab8446b1af9e72c7ba7dfbc12d3f (diff)
GF/src is now for 2.9, and the new sources are in src-3.0 - keep it this way until the release of GF 3
Diffstat (limited to 'src-3.0/GF/Compile/MkResource.hs')
-rw-r--r--src-3.0/GF/Compile/MkResource.hs128
1 files changed, 128 insertions, 0 deletions
diff --git a/src-3.0/GF/Compile/MkResource.hs b/src-3.0/GF/Compile/MkResource.hs
new file mode 100644
index 000000000..10831b5c6
--- /dev/null
+++ b/src-3.0/GF/Compile/MkResource.hs
@@ -0,0 +1,128 @@
+----------------------------------------------------------------------
+-- |
+-- Module : MkResource
+-- Maintainer : AR
+-- Stability : (stable)
+-- Portability : (portable)
+--
+-- > CVS $Date: 2005/05/30 21:08:14 $
+-- > CVS $Author: aarne $
+-- > CVS $Revision: 1.14 $
+--
+-- Compile a gfc module into a "reuse" gfr resource, interface, or instance.
+-----------------------------------------------------------------------------
+
+module GF.Compile.MkResource (makeReuse) where
+
+import GF.Grammar.Grammar
+import GF.Infra.Ident
+import GF.Infra.Modules
+import GF.Grammar.Macros
+import GF.Grammar.Lockfield
+import GF.Grammar.PrGrammar
+
+import GF.Data.Operations
+
+import Control.Monad
+
+-- | extracting resource r from abstract + concrete syntax.
+-- AR 21\/8\/2002 -- 22\/6\/2003 for GF with modules
+makeReuse :: SourceGrammar -> Ident -> [(Ident,MInclude Ident)] ->
+ MReuseType Ident -> Err SourceRes
+makeReuse gr r me mrc = do
+ flags <- return [] --- no flags are passed: they would not make sense
+ case mrc of
+ MRResource c -> do
+ (ops,jms) <- mkFull True c
+ return $ Module MTResource MSComplete flags me ops jms
+
+ MRInstance c a -> do
+ (ops,jms) <- mkFull False c
+ return $ Module (MTInstance a) MSComplete flags me ops jms
+
+ MRInterface c -> do
+ mc <- lookupModule gr c
+
+ (ops,jms) <- case mc of
+ ModMod m -> case mtype m of
+ MTAbstract -> liftM ((,) (opens m)) $
+ mkResDefs True False gr r c me
+ (extend m) (jments m) emptyBinTree
+ _ -> prtBad "expected abstract to be the type of" c
+ _ -> prtBad "expected abstract to be the type of" c
+
+ return $ Module MTInterface MSIncomplete flags me ops jms
+
+ where
+ mkFull hasT c = do
+ mc <- lookupModule gr c
+
+ case mc of
+ ModMod m -> case mtype m of
+ MTConcrete a -> do
+ ma <- lookupModule gr a
+ jmsA <- case ma of
+ ModMod m' -> return $ jments m'
+ _ -> prtBad "expected abstract to be the type of" a
+ liftM ((,) (opens m)) $
+ mkResDefs hasT True gr r a me (extend m) jmsA (jments m)
+ _ -> prtBad "expected concrete to be the type of" c
+ _ -> prtBad "expected concrete to be the type of" c
+
+
+-- | the first Boolean indicates if the type needs be given
+-- the second Boolean indicates if the definition needs be given
+mkResDefs :: Bool -> Bool ->
+ SourceGrammar -> Ident -> Ident ->
+ [(Ident,MInclude Ident)] -> [(Ident,MInclude Ident)] ->
+ BinTree Ident Info -> BinTree Ident Info ->
+ Err (BinTree Ident Info)
+mkResDefs hasT isC gr r a mext maext abs cnc = mapMTree (mkOne a maext) abs where
+
+ ifTyped = yes --- if hasT then yes else const nope --- needed for TC
+ ifCompl = if isC then yes else const nope
+ doIf b t = if b then t else return typeType -- latter value not used
+
+ mkOne a mae (f,info) = case info of
+ AbsCat _ _ -> do
+ typ <- doIf isC $ err (const (return defLinType)) return $ look cnc f
+ typ' <- doIf isC $ lockRecType f typ
+ return (f, ResOper (ifTyped typeType) (ifCompl typ'))
+ AbsFun (Yes typ0) _ -> do
+ trm <- doIf isC $ look cnc f
+ testErr (not (isHardType typ0))
+ ("cannot build reuse for function" +++ prt f +++ ":" +++ prt typ0)
+ typ <- redirTyp True a mae typ0
+ cat <- valCat typ
+ trm' <- doIf isC $ unlockRecord (snd cat) trm
+ return (f, ResOper (ifTyped typ) (ifCompl trm'))
+ AnyInd b n -> do
+ mo <- lookupModMod gr n
+ info' <- lookupInfo mo f
+ mkOne n (extend mo) (f,info')
+
+ look cnc f = do
+ info <- lookupTree prt f cnc
+ case info of
+ CncCat (Yes ty) _ _ -> return ty
+ CncCat _ _ _ -> return defLinType
+ CncFun _ (Yes tr) _ -> return tr
+ AnyInd _ n -> do
+ mo <- lookupModMod gr n
+ t <- look (jments mo) f
+ redirTyp False n (extend mo) t
+ _ -> prtBad "not enough information to reuse" f
+
+ -- type constant qualifications changed from abstract to resource
+ redirTyp always a mae ty = case ty of
+ Q _ c | always -> return $ Q r c
+ Q n c | n == a || [n] == map fst mae -> return $ Q r c ---- FIX for non-singleton exts
+ _ -> composOp (redirTyp always a mae) ty
+
+-- | no reuse for functions of HO\/dep types
+isHardType t = case t of
+ Prod x a b -> not (isWild x) || isHardType a || isHardType b
+ App _ _ -> True
+ _ -> False
+ where
+ isWild x = isWildIdent x || prt x == "h_" --- produced by transl from canon