remove empty dir
[ghc-hetmet.git] / ghc / compiler / main / ParsePkgConf.y
index f83dd58..901a5bc 100644 (file)
@@ -3,10 +3,12 @@ module ParsePkgConf( loadPackageConfig ) where
 
 #include "HsVersions.h"
 
-import Packages  ( PackageConfig(..), defaultPackageConfig )
-import Lex
+import PackageConfig
+import Lexer
+import DynFlags
 import FastString
 import StringBuffer
+import ErrUtils  ( mkLocMessage )
 import SrcLoc
 import Outputable
 import Panic     ( GhcException(..) )
@@ -15,20 +17,21 @@ import EXCEPTION ( throwDyn )
 }
 
 %token
- '{'           { ITocurly }
- '}'           { ITccurly }
- '['           { ITobrack }
- ']'           { ITcbrack }
- ','           { ITcomma }
- '='           { ITequal }
- VARID         { ITvarid    $$ }
- CONID         { ITconid    $$ }
- STRING                { ITstring   $$ }
-
-%monad { P } { thenP } { returnP }
-%lexer { lexer } { ITeof }
+ '{'           { L _ ITocurly }
+ '}'           { L _ ITccurly }
+ '['           { L _ ITobrack }
+ ']'           { L _ ITcbrack }
+ ','           { L _ ITcomma }
+ '='           { L _ ITequal }
+ VARID         { L _ (ITvarid    $$) }
+ CONID         { L _ (ITconid    $$) }
+ STRING                { L _ (ITstring   $$) }
+ INT           { L _ (ITinteger  $$) }
+
+%monad { P } { >>= } { return }
+%lexer { lexer } { L _ ITeof }
 %name parse
-%tokentype { Token }
+%tokentype { Located Token }
 %%
 
 pkgconf :: { [ PackageConfig ] }
@@ -47,66 +50,104 @@ fields  :: { PackageConfig -> PackageConfig }
        | fields ',' field              { \p -> $1 ($3 p) }
 
 field  :: { PackageConfig -> PackageConfig }
-       : VARID '=' STRING              
-                 {% case unpackFS $1 of { 
-                  "name" -> returnP (\ p -> p{name = unpackFS $3});
-                  _      -> happyError } }
+       : VARID '=' pkgid
+               {% case unpackFS $1 of
+                       "package"     -> return (\p -> p{package = $3})
+                       _other        -> happyError
+               }
+
+       | VARID '=' STRING              { id }
+               -- we aren't interested in the string fields, they're all
+               -- boring (copyright, maintainer etc.)
                        
-        | VARID '=' bool
-               {\p -> case unpackFS $1 of {
-                       "auto" -> p{auto = $3};
-                       _      -> p } }
+        | VARID '=' CONID
+               {% case unpackFS $1 of {
+                       "exposed" -> 
+                          case unpackFS $3 of {
+                               "True"  -> return (\p -> p{exposed=True});
+                               "False" -> return (\p -> p{exposed=False});
+                               _       -> happyError };
+                       "license" -> return id; -- not interested
+                       _         -> happyError }
+               }
+
+       | VARID '=' CONID STRING        { id }
+               -- another case of license
 
        | VARID '=' strlist             
                {\p -> case unpackFS $1 of
-                       "import_dirs"     -> p{import_dirs     = $3}
-                       "library_dirs"    -> p{library_dirs    = $3}
-                       "hs_libraries"    -> p{hs_libraries    = $3}
-                       "extra_libraries" -> p{extra_libraries = $3}
-                       "include_dirs"    -> p{include_dirs    = $3}
-                       "c_includes"      -> p{c_includes      = $3}
-                       "package_deps"    -> p{package_deps    = $3}
-                       "extra_ghc_opts"  -> p{extra_ghc_opts  = $3}
-                       "extra_cc_opts"   -> p{extra_cc_opts   = $3}
-                       "extra_ld_opts"   -> p{extra_ld_opts   = $3}
-                       "framework_dirs"  -> p{framework_dirs  = $3}
-                       "extra_frameworks"-> p{extra_frameworks= $3}
-                       _other            -> p
+                       "exposedModules"    -> p{exposedModules    = $3}
+                       "hiddenModules"     -> p{hiddenModules     = $3}
+                       "importDirs"        -> p{importDirs        = $3}
+                       "libraryDirs"       -> p{libraryDirs       = $3}
+                       "hsLibraries"       -> p{hsLibraries       = $3}
+                       "extraLibraries"    -> p{extraLibraries    = $3}
+                       "extraGHCiLibraries"-> p{extraGHCiLibraries= $3}
+                       "includeDirs"       -> p{includeDirs       = $3}
+                       "includes"          -> p{includes          = $3}
+                       "hugsOptions"       -> p{hugsOptions       = $3}
+                       "ccOptions"         -> p{ccOptions         = $3}
+                       "ldOptions"         -> p{ldOptions         = $3}
+                       "frameworkDirs"     -> p{frameworkDirs     = $3}
+                       "frameworks"        -> p{frameworks        = $3}
+                       "haddockInterfaces" -> p{haddockInterfaces = $3}
+                       "haddockHTMLs"      -> p{haddockHTMLs      = $3}
+                       "depends"           -> p{depends = []}
+                               -- empty list only, non-empty handled below
+                       other -> p
                }
 
+       | VARID '=' pkgidlist
+               {% case unpackFS $1 of
+                       "depends"     -> return (\p -> p{depends = $3})
+                       _other        -> happyError
+               }
+
+pkgid  :: { PackageIdentifier }
+       : CONID '{' VARID '=' STRING ',' VARID '=' version '}'
+                       { PackageIdentifier{ pkgName = unpackFS $5, 
+                                            pkgVersion = $9 } }
+
+version :: { Version }
+       : CONID '{' VARID '=' intlist ',' VARID '=' strlist '}'
+                       { Version{ versionBranch=$5, versionTags=$9 } }
+
+pkgidlist :: { [PackageIdentifier] }
+       : '[' pkgids ']'                { $2 }
+       -- empty list case is covered by strlist, to avoid conflicts
+
+pkgids :: { [PackageIdentifier] }
+       : pkgid                         { [ $1 ] }
+       | pkgid ',' pkgids              { $1 : $3 }
+
+intlist :: { [Int] }
+        : '[' ']'                      { [] }
+       | '[' ints ']'                  { $2 }
+
+ints   :: { [Int] }
+       : INT                           { [ fromIntegral $1 ] }
+       | INT ',' ints                  { fromIntegral $1 : $3 }
+
 strlist :: { [String] }
         : '[' ']'                      { [] }
-       | '[' strs ']'                  { reverse $2 }
+       | '[' strs ']'                  { $2 }
 
 strs   :: { [String] }
        : STRING                        { [ unpackFS $1 ] }
-       | strs ',' STRING               { unpackFS $3 : $1 }
-
-bool    :: { Bool }
-       : CONID                         {% case unpackFS $1 of {
-                                           "True"  -> returnP True;
-                                           "False" -> returnP False;
-                                           _       -> happyError } }
+       | STRING ',' strs               { unpackFS $1 : $3 }
 
 {
 happyError :: P a
-happyError buf PState{ loc = loc } = PFailed (srcParseErr buf loc)
+happyError = srcParseFail
 
 loadPackageConfig :: FilePath -> IO [PackageConfig]
 loadPackageConfig conf_filename = do
    buf <- hGetStringBuffer conf_filename
-   let loc  = mkSrcLoc (mkFastString conf_filename) 1
-       exts = ExtFlags {glasgowExtsEF = False,
-                       ffiEF         = False,
-                       arrowsEF      = False,
-                       withEF        = False,
-                       parrEF        = False}
-   case parse buf (mkPState loc exts) of
-       PFailed err -> do
-           freeStringBuffer buf
-            throwDyn (InstallationError (showSDoc err))
+   let loc  = mkSrcLoc (mkFastString conf_filename) 1 0
+   case unP parse (mkPState buf loc defaultDynFlags) of
+       PFailed span err -> 
+           throwDyn (InstallationError (showSDoc (mkLocMessage span err)))
 
        POk _ pkg_details -> do
-           freeStringBuffer buf
            return pkg_details
 }