paragon 0.1.7 → 0.1.8
raw patch · 2 files changed
+56/−1 lines, 2 files
Files
paragon.cabal view
@@ -1,5 +1,5 @@ Name: paragon-Version: 0.1.7+Version: 0.1.8 License: BSD3 License-File: LICENSE Author: Niklas Broberg@@ -50,6 +50,7 @@ Language.Java.Paragon.TypeCheck.Uniq, Language.Java.Paragon.QuasiQuoter, Language.Java.Paragon.Compile,+ Language.Java.Paragon.PiGeneration, Language.Java.Paragon.Verbosity Hs-source-dirs: src@@ -82,6 +83,7 @@ Language.Java.Paragon.TypeCheck.Uniq, Language.Java.Paragon.QuasiQuoter, Language.Java.Paragon.Compile,+ Language.Java.Paragon.PiGeneration, Language.Java.Paragon.Verbosity
+ src/Language/Java/Paragon/PiGeneration.hs view
@@ -0,0 +1,53 @@+{-# LANGUAGE QuasiQuotes #-}+module Language.Java.Paragon.PiGeneration where++import Language.Java.Paragon.Syntax+import Control.Applicative+import Language.Java.Paragon.QuasiQuoter++piTransform :: CompilationUnit -> CompilationUnit +piTransform = transformCompilationUnit+--for generating Pi there should be a package name+-- no imports+-- one type for each compilationUnit since the execution is for one class but we can transform without considering that condition+transformCompilationUnit :: CompilationUnit -> CompilationUnit+transformCompilationUnit (CompilationUnit mpDecl _ tdecls)+ = CompilationUnit mpDecl [] (transformTypeDecl<$>tdecls)+----------------+transformTypeDecl :: TypeDecl -> TypeDecl+transformTypeDecl (InterfaceTypeDecl (InterfaceDecl mods iden tparams refts ib))+ = ClassTypeDecl (ClassDecl mods iden tparams Nothing refts (transformInterfaceBody ib)) -- Maybe typeDecl+transformTypeDecl (ClassTypeDecl (ClassDecl mods iden tparams mt refts (ClassBody dcls))) + = ClassTypeDecl (ClassDecl mods iden tparams mt refts (ClassBody $ transformDecl<$>dcls))+---------------- +transformDecl :: Decl -> Decl +transformDecl (MemberDecl md) = MemberDecl $ transformMemberDecl md +----------------+transformInterfaceBody :: InterfaceBody -> ClassBody+transformInterfaceBody (InterfaceBody mds) = ClassBody $ (\md->MemberDecl (transformMemberDecl md))<$>mds+-------------+transformMemberDecl :: MemberDecl -> MemberDecl +transformMemberDecl f@(FieldDecl fmods [typeQQ|actor|] vdecs) = f+transformMemberDecl (FieldDecl fmods ft vdecs) = (FieldDecl fmods ft (transformVarDecls vdecs))+transformMemberDecl m@(MethodDecl mmods mtparams mmaybet mident mformparams mexceptionspecs mb) + | Typemethod `elem` mmods = m+ | otherwise = MethodDecl mmods mtparams mmaybet mident mformparams mexceptionspecs (transformMethodBody mb)+transformMemberDecl (ConstructorDecl cmods ctparams cident cformparams cexceptionspecs cb) + = ConstructorDecl cmods ctparams cident cformparams cexceptionspecs (transformConstructorBody cb)+transformMemberDecl x = x+-- I assumed the LockDecl and PolicyDecl should not be touch +-- Also I didnt write code for inner classes/interfaces +------+transformVarDecls :: [VarDecl] -> [VarDecl]+transformVarDecls vds = [ VarDecl varDeclId Nothing | (VarDecl varDeclId _) <- vds]+-------+transformMethodBody :: MethodBody -> MethodBody+transformMethodBody = const $MethodBody Nothing -- [methodBodyQQ|{}|] +-- maybe we have to add nothing instead of "just emptyMethodBody" +-------+transformConstructorBody :: ConstructorBody -> ConstructorBody+transformConstructorBody (ConstructorBody explConstrInvm bs) = ConstructorBody Nothing [] -- second argument nothing ?++++