diff --git a/extras/lbf-haskell.nix b/extras/lbf-haskell.nix new file mode 100644 index 00000000..35d1e37d --- /dev/null +++ b/extras/lbf-haskell.nix @@ -0,0 +1,58 @@ +{ pkgs, src, lbfFile, importPaths, lbf, lbg-haskell, cabalPackageName, deps ? [ ], cabalPackageVersion ? "0.1.0.0" }: +let + importPaths' = builtins.concatStringsSep " " (builtins.map (imp: "--import-path ${imp}") importPaths); + providedDeps = builtins.concatStringsSep " " (builtins.map (dep: dep.name) deps); + cabalTemplate = pkgs.writeTextFile { + name = "lambda-buffers-cabal-template"; + text = '' + cabal-version: 3.0 + name: ${cabalPackageName} + version: ${cabalPackageVersion} + synopsis: A Cabal project that contains LambdaBuffers generated Haskell modules + build-type: Simple + + library + exposed-modules: + autogen-modules: + + hs-source-dirs: autogen + + default-language: Haskell2010 + build-depends: + ''; + }; +in +pkgs.stdenv.mkDerivation { + inherit src; + name = cabalPackageName; + outputs = [ "out" "build" ]; + buildInputs = [ + pkgs.cabal-install + lbf + pkgs.jq + ]; + buildPhase = '' + mkdir autogen + mkdir .work + lbf build ${importPaths'} \ + --file ${src}/${lbfFile} \ + --work-dir .work \ + --gen ${lbg-haskell}/bin/lbg-haskell \ + --gen-dir autogen + + EXPOSED_MODULES=$(find autogen -name "*.hs" | while read f; do grep -Eo 'module\s+\S+\s+' $f | head -n 1 | sed -r 's/module\s+//' | sed -r 's/\s+//'; done | tr '\n' ' ') + echo "Found generated modules $EXPOSED_MODULES" + DEPS=$(echo ${providedDeps} $(cat autogen/build.json | jq -r ".[]") | tr ' ' ',' | sed 's/.$//') + + cat ${cabalTemplate} \ + | sed -r "s//$EXPOSED_MODULES/" \ + | sed -r "s//$DEPS/" > ${cabalPackageName}.cabal + ''; + + installPhase = '' + mkdir -p $out/autogen; + cp -r autogen $out + cp ${cabalPackageName}.cabal $out/${cabalPackageName}.cabal; + mv autogen/build.json $build; + ''; +} diff --git a/lambda-buffers-codegen/app/LambdaBuffers/Codegen/Cli/Gen.hs b/lambda-buffers-codegen/app/LambdaBuffers/Codegen/Cli/Gen.hs index e3806843..080edae0 100644 --- a/lambda-buffers-codegen/app/LambdaBuffers/Codegen/Cli/Gen.hs +++ b/lambda-buffers-codegen/app/LambdaBuffers/Codegen/Cli/Gen.hs @@ -4,17 +4,21 @@ import Control.Lens (makeLenses, (&), (.~), (^.)) import Control.Monad (when) import Data.Aeson (encodeFile) import Data.ByteString qualified as BS -import Data.Foldable (Foldable (fold), foldrM) +import Data.Foldable (Foldable (fold, toList), foldrM) +import Data.List.NonEmpty (NonEmpty) +import Data.List.NonEmpty qualified as NonEmpty import Data.Map (Map) import Data.Map qualified as Map import Data.ProtoLens (Message (defMessage)) import Data.ProtoLens qualified as Pb import Data.ProtoLens.TextFormat qualified as PbText import Data.Set (Set) +import Data.Set qualified as Set import Data.Text (Text) import Data.Text qualified as Text import Data.Text.IO qualified as Text import Data.Text.Lazy.IO qualified as LText +import LambdaBuffers.Codegen.Config qualified as Config import LambdaBuffers.ProtoCompat qualified as PC import Proto.Codegen qualified as P import Proto.Codegen_Fields qualified as P @@ -28,6 +32,7 @@ data GenOpts = GenOpts , _outputFile :: FilePath , _genDir :: FilePath , _debug :: Bool + , _requestedModules :: NonEmpty String } deriving stock (Eq, Show) @@ -39,34 +44,16 @@ logInfo msg = putStrLn $ "[lbg][INFO] " <> msg <> "." logError :: String -> IO () logError msg = putStrLn $ "[lbg][ERROR] " <> msg <> "." -gen :: GenOpts -> (PC.CodegenInput -> Map (PC.InfoLess PC.ModuleName) (Either P.Error (FilePath, Text, Set Text))) -> IO () +type Handler = (PC.CodegenInput -> Map (PC.InfoLess PC.ModuleName) (Either P.Error (FilePath, Text, Set Text))) + +gen :: GenOpts -> Handler -> IO () gen opts cont = do logInfo $ "Code generation Input at " <> opts ^. inputFile ci <- readCodegenInput (opts ^. inputFile) ci' <- runFromProto (opts ^. outputFile) ci initialisePrintDir (opts ^. genDir) let res = cont ci' - (allErrors, allDeps) <- - foldrM - ( \(mn, errOrPrint) (errs, deps) -> do - case errOrPrint of - Left err -> do - logInfo $ - "Code generation failed for module " - <> PC.withInfoLess mn (show . PC.prettyModuleName) - return (err : errs, deps) - Right (fp, printed, deps') -> do - logInfo $ - "Code generation succeeded for module " - <> PC.withInfoLess mn (show . PC.prettyModuleName) - <> " at file path " - <> (opts ^. genDir fp) - writeFileAndCreate (opts ^. genDir fp) printed - return (errs, deps <> deps') - ) - ([], mempty) - (Map.toList res) - + (allErrors, allDeps) <- collectErrorsAndDeps opts res if null allErrors then do writeCodegenResult (opts ^. outputFile) @@ -77,6 +64,35 @@ gen opts cont = do logError "Code generation reported errors" logInfo $ "Code generation Output at " <> opts ^. outputFile +restrictToRequestedModules :: forall {b} {a}. GenOpts -> Map (PC.InfoLess PC.ModuleName) (Either a (FilePath, Text, b)) -> IO (Map (PC.InfoLess PC.ModuleName) (Either a (FilePath, Text, b))) +restrictToRequestedModules opts res = do + let uniqMns = toList $ NonEmpty.nub $ opts ^. requestedModules + onlyModules <- (Config.moduleNameFromText . Text.pack) `traverse` uniqMns + return $ Map.restrictKeys res (Set.fromList onlyModules) + +collectErrorsAndDeps :: forall {b} {a}. Monoid b => GenOpts -> Map (PC.InfoLess PC.ModuleName) (Either a (FilePath, Text, b)) -> IO ([a], b) +collectErrorsAndDeps opts res = do + res' <- restrictToRequestedModules opts res + foldrM + ( \(mn, errOrPrint) (errs, deps) -> do + case errOrPrint of + Left err -> do + logInfo $ + "Code generation failed for module " + <> PC.withInfoLess mn (show . PC.prettyModuleName) + return (err : errs, deps) + Right (fp, printed, deps') -> do + logInfo $ + "Code generation succeeded for module " + <> PC.withInfoLess mn (show . PC.prettyModuleName) + <> " at file path " + <> (opts ^. genDir fp) + writeFileAndCreate (opts ^. genDir fp) printed + return (errs, deps <> deps') + ) + ([], mempty) + (Map.toList res') + runFromProto :: FilePath -> P.Input -> IO PC.CodegenInput runFromProto ofp ci = case PC.codegenInputFromProto ci of Left err -> do diff --git a/lambda-buffers-codegen/app/LambdaBuffers/Codegen/Cli/GenHaskell.hs b/lambda-buffers-codegen/app/LambdaBuffers/Codegen/Cli/GenHaskell.hs index c79a78b7..60da54c4 100644 --- a/lambda-buffers-codegen/app/LambdaBuffers/Codegen/Cli/GenHaskell.hs +++ b/lambda-buffers-codegen/app/LambdaBuffers/Codegen/Cli/GenHaskell.hs @@ -1,17 +1,19 @@ module LambdaBuffers.Codegen.Cli.GenHaskell (GenOpts (..), gen) where import Control.Lens (makeLenses, (^.)) -import Data.Aeson (decodeFileStrict) +import Control.Monad (unless) +import Data.Aeson (decodeFileStrict') import LambdaBuffers.Codegen.Cli.Gen (logError) import LambdaBuffers.Codegen.Cli.Gen qualified as Gen import LambdaBuffers.Codegen.Haskell (runPrint) import LambdaBuffers.Codegen.Haskell.Config qualified as H import Paths_lambda_buffers_codegen qualified as Paths +import System.Directory (doesFileExist) import System.Directory.Internal.Prelude (exitFailure) data GenOpts = MkGenOpts - { _common :: Gen.GenOpts - , _config :: Maybe FilePath + { _config :: Maybe FilePath + , _common :: Gen.GenOpts } makeLenses 'MkGenOpts @@ -27,7 +29,14 @@ gen opts = do readHaskellConfig :: FilePath -> IO H.Config readHaskellConfig f = do - mayCfg <- decodeFileStrict f + fExists <- doesFileExist f + unless + fExists + ( do + logError $ "Provided Haskell Codegen configuration file doesn't exists: " <> f + exitFailure + ) + mayCfg <- decodeFileStrict' f case mayCfg of Nothing -> do logError $ "Invalid Haskell configuration file " <> f diff --git a/lambda-buffers-codegen/app/LambdaBuffers/Codegen/Cli/GenPurescript.hs b/lambda-buffers-codegen/app/LambdaBuffers/Codegen/Cli/GenPurescript.hs index 91c4ddbf..21347adc 100644 --- a/lambda-buffers-codegen/app/LambdaBuffers/Codegen/Cli/GenPurescript.hs +++ b/lambda-buffers-codegen/app/LambdaBuffers/Codegen/Cli/GenPurescript.hs @@ -1,17 +1,19 @@ module LambdaBuffers.Codegen.Cli.GenPurescript (GenOpts (..), gen) where import Control.Lens (makeLenses, (^.)) +import Control.Monad (unless) import Data.Aeson (decodeFileStrict) import LambdaBuffers.Codegen.Cli.Gen (logError) import LambdaBuffers.Codegen.Cli.Gen qualified as Gen import LambdaBuffers.Codegen.Purescript (runPrint) import LambdaBuffers.Codegen.Purescript.Config qualified as H import Paths_lambda_buffers_codegen qualified as Paths +import System.Directory (doesFileExist) import System.Exit (exitFailure) data GenOpts = MkGenOpts - { _common :: Gen.GenOpts - , _config :: Maybe FilePath + { _config :: Maybe FilePath + , _common :: Gen.GenOpts } makeLenses 'MkGenOpts @@ -27,6 +29,13 @@ gen opts = do readPurescriptConfig :: FilePath -> IO H.Config readPurescriptConfig f = do + fExists <- doesFileExist f + unless + fExists + ( do + logError $ "Provided Purescript Codegen configuration file doesn't exists: " <> f + exitFailure + ) mayCfg <- decodeFileStrict f case mayCfg of Nothing -> do diff --git a/lambda-buffers-codegen/app/Main.hs b/lambda-buffers-codegen/app/Main.hs index 318c4a30..1f8e7dfb 100644 --- a/lambda-buffers-codegen/app/Main.hs +++ b/lambda-buffers-codegen/app/Main.hs @@ -22,10 +22,12 @@ import Options.Applicative ( showDefault, showHelpOnEmpty, showHelpOnError, + strArgument, strOption, subparser, value, ) +import Options.Applicative.NonEmpty (some1) data Command = GenHaskell Haskell.GenOpts @@ -61,12 +63,12 @@ genOptsP = <> help "Run in debug mode" <> showDefault ) + <*> some1 (strArgument (metavar "[module name]..." <> help "Modules to generate code for")) haskellGenOptsP :: Parser Haskell.GenOpts haskellGenOptsP = Haskell.MkGenOpts - <$> genOptsP - <*> optional + <$> optional ( strOption ( long "config" <> short 'c' @@ -74,12 +76,12 @@ haskellGenOptsP = <> help "Configuration file for the Haskell codegen module" ) ) + <*> genOptsP purescriptGenOptsP :: Parser Purescript.GenOpts purescriptGenOptsP = Purescript.MkGenOpts - <$> genOptsP - <*> optional + <$> optional ( strOption ( long "config" <> short 'c' @@ -87,9 +89,10 @@ purescriptGenOptsP = <> help "Configuration file for the Purescript codegen module" ) ) + <*> genOptsP -optionsP :: Parser Command -optionsP = +commandP :: Parser Command +commandP = subparser $ command "gen-haskell" @@ -99,7 +102,7 @@ optionsP = (info (GenPurescript <$> purescriptGenOptsP <* helper) (progDesc "Generate Purescript code from a compiled LambdaBuffers schema")) parserInfo :: ParserInfo Command -parserInfo = info (optionsP <**> helper) (fullDesc <> progDesc "LambdaBuffers Codegen command-line interface tool") +parserInfo = info (commandP <**> helper) (fullDesc <> progDesc "LambdaBuffers Codegen command-line interface tool") main :: IO () main = do diff --git a/lambda-buffers-codegen/data/goldens/run.sh b/lambda-buffers-codegen/data/goldens/run.sh index 07d00730..aca7127b 100755 --- a/lambda-buffers-codegen/data/goldens/run.sh +++ b/lambda-buffers-codegen/data/goldens/run.sh @@ -3,8 +3,8 @@ function lbg { cabal run lbg -- $@ } -lbg gen-haskell -i lambda-buffers.input.textproto -o lambda-buffers.output.textproto -g haskell-autogen +lbg gen-haskell -i lambda-buffers.input.textproto -o lambda-buffers.output.textproto -g haskell-autogen LambdaBuffers Prelude -lbg gen-purescript -i lambda-buffers.input.textproto -o lambda-buffers.output.textproto -g purescript-autogen +lbg gen-purescript -i lambda-buffers.input.textproto -o lambda-buffers.output.textproto -g purescript-autogen LambdaBuffers Prelude # ghci -hide-all-packages -Wmissing-home-modules -no-user-package-db -package-db /home/bladyjoker/.cabal/store/ghc-9.2.3/package.db -package-db /home/bladyjoker/Desktop/cardano-open-oracle-protocol/coop-plutus/dist-newstyle/packagedb/ghc-9.2.3 -package-db /home/bladyjoker/Desktop/cardano-open-oracle-protocol/coop-plutus/dist-newstyle/build/x86_64-linux/ghc-9.2.3/coop-plutus-0.1.0.0/package.conf.inplace -package-id base-4.16.2.0 -package-id bytestring-0.11.3.1 -package-id text-1.2.5.0 -package-id containers-0.6.5.1 -package-id plutus-ledger-api-1.0.0.0-5I44wBlQkJcAkvH0pssHIv -package-id plutus-tx-1.0.0.0-36ltsZtQ7xF5Mr0iGlXK1I -XHaskell2010 -i/home/bladyjoker/Desktop/lambda-buffers/lambda-buffers-codegen/data/goldens/autogen -i/home/bladyjoker/Desktop/lambda-buffers/lambda-buffers-codegen/data/goldens/runtime ../../lambda-buffers/lambda-buffers-codegen/data/goldens/autogen/LambdaBuffers/Coop.hs diff --git a/lambda-buffers-codegen/src/LambdaBuffers/Codegen/Config.hs b/lambda-buffers-codegen/src/LambdaBuffers/Codegen/Config.hs index a5353826..313cd674 100644 --- a/lambda-buffers-codegen/src/LambdaBuffers/Codegen/Config.hs +++ b/lambda-buffers-codegen/src/LambdaBuffers/Codegen/Config.hs @@ -1,4 +1,4 @@ -module LambdaBuffers.Codegen.Config (Config (..), cfgOpaques, cfgClasses) where +module LambdaBuffers.Codegen.Config (Config (..), cfgOpaques, cfgClasses, moduleNameFromText) where import Control.Lens (makeLenses, view) import Data.Aeson (FromJSON, ToJSON, parseJSON) @@ -32,6 +32,14 @@ data JsonConfig qtn qcn = JsonConfig moduleNameToText :: PC.InfoLess PC.ModuleName -> Text moduleNameToText = Text.pack . show . (`PC.withInfoLess` PC.prettyModuleName) +{- | `moduleNameFromText "Foo.Bar" = ["Foo", "Bar"]` + TODO(bladyjoker): Use ModuleNamePart parsers from the Compiler. +-} +moduleNameFromText :: MonadFail m => Text -> m (PC.InfoLess PC.ModuleName) +moduleNameFromText txt = case Text.split (== '.') txt of + [] -> fail "[LambdaBuffers.Codegen.Config] Got an empty text but wanted a LambdaBuffers module name" + parts -> return (PC.mkInfoLess $ PC.ModuleName [PC.ModuleNamePart p def | p <- parts] def) + -- | `qTyNameToText (["Foo", "Bar"], "Baz") = "Foo.Bar.Baz"` qTyNameToText :: PC.QTyName -> Text qTyNameToText (mn, tyn) = moduleNameToText mn <> "." <> PC.withInfoLess tyn (view #name) @@ -41,11 +49,11 @@ qClassNameToText :: PC.QClassName -> Text qClassNameToText (mn, cn) = moduleNameToText mn <> "." <> PC.withInfoLess cn (view #name) qNameFromText :: MonadFail m => Text -> m (PC.InfoLess PC.ModuleName, Text) -qNameFromText qn = - let xs = Text.split (== '.') qn +qNameFromText txt = + let xs = Text.split (== '.') txt in case List.reverse xs of - [] -> fail "Got an empty text but wanted a qualified LambdaBuffers name (.)" - [x] -> fail $ "Got a single text " <> show x <> " but wanted a qualified LambdaBuffers name (.)" + [] -> fail "[LambdaBuffers.Codegen.Config] Got an empty text but wanted a qualified LambdaBuffers name (.)" + [x] -> fail $ "[LambdaBuffers.Codegen.Config] Got a single text " <> show x <> " but wanted a qualified LambdaBuffers name (.)" (n : mn) -> return ( PC.mkInfoLess $ PC.ModuleName [PC.ModuleNamePart p def | p <- List.reverse mn] def diff --git a/lambda-buffers-compiler/src/LambdaBuffers/ProtoCompat/Utils.hs b/lambda-buffers-compiler/src/LambdaBuffers/ProtoCompat/Utils.hs index 7b162e0e..8274117c 100644 --- a/lambda-buffers-compiler/src/LambdaBuffers/ProtoCompat/Utils.hs +++ b/lambda-buffers-compiler/src/LambdaBuffers/ProtoCompat/Utils.hs @@ -10,6 +10,7 @@ import LambdaBuffers.ProtoCompat.IsCompat.Lang () import LambdaBuffers.ProtoCompat.Types qualified as PC import Prettyprinter (Doc, Pretty (pretty), dot, encloseSep) import Proto.Codegen qualified as Codegen +import Proto.Codegen_Fields qualified as Codegen import Proto.Compiler qualified as Compiler import Proto.Compiler_Fields qualified as Compiler import Proto.Lang qualified as Lang @@ -50,4 +51,6 @@ instance Monoid Codegen.Error where instance Semigroup Codegen.Error where l <> r = defMessage - & Compiler.internalErrors .~ l ^. Compiler.internalErrors <> r ^. Compiler.internalErrors + & Codegen.internalErrors .~ l ^. Codegen.internalErrors <> r ^. Codegen.internalErrors + & Codegen.unsupportedOpaqueErrors .~ l ^. Codegen.unsupportedOpaqueErrors <> r ^. Codegen.unsupportedOpaqueErrors + & Codegen.unsupportedClassErrors .~ l ^. Codegen.unsupportedClassErrors <> r ^. Codegen.unsupportedClassErrors diff --git a/lambda-buffers-frontend/app/LambdaBuffers/Frontend/Cli/Build.hs b/lambda-buffers-frontend/app/LambdaBuffers/Frontend/Cli/Build.hs index 3fb14898..f1ed4f2f 100644 --- a/lambda-buffers-frontend/app/LambdaBuffers/Frontend/Cli/Build.hs +++ b/lambda-buffers-frontend/app/LambdaBuffers/Frontend/Cli/Build.hs @@ -1,8 +1,10 @@ module LambdaBuffers.Frontend.Cli.Build (BuildOpts (..), build) where import Control.Lens (makeLenses, (&), (.~), (^.)) +import Control.Monad (unless) import Data.ByteString qualified as BS -import Data.Foldable (for_) +import Data.Foldable (Foldable (toList), for_, traverse_) +import Data.List.NonEmpty (NonEmpty) import Data.Maybe (fromMaybe) import Data.ProtoLens (Message (defMessage)) import Data.ProtoLens.Encoding qualified as Pb @@ -12,16 +14,19 @@ import Data.Text.Lazy.IO qualified as LText import Data.Text.Lazy.IO qualified as Text import LambdaBuffers.Frontend (runFrontend) import LambdaBuffers.Frontend.Cli.Env qualified as Env -import LambdaBuffers.Frontend.Cli.Utils (logCodegenError, logCompilerError, logError, logFrontendError, logInfo) +import LambdaBuffers.Frontend.Cli.Utils (logCodegenError, logCompilerError, logError, logFrontendError, logInfo, toCodegenCliModuleName) import LambdaBuffers.Frontend.Errors.Codegen qualified as CodegenErrors import LambdaBuffers.Frontend.Errors.Compiler qualified as CompilerErrors +import LambdaBuffers.Frontend.Monad qualified as Frontend import LambdaBuffers.Frontend.PPrint () +import LambdaBuffers.Frontend.Syntax qualified as Frontend import LambdaBuffers.Frontend.ToProto (toModules) import Proto.Codegen qualified as Codegen import Proto.Codegen_Fields qualified as Codegen import Proto.Compiler qualified as Compiler import Proto.Compiler_Fields qualified as Compiler -import System.Exit (exitFailure) +import System.Directory (doesDirectoryExist, doesFileExist) +import System.Exit (ExitCode (ExitFailure), exitFailure) import System.FilePath ((<.>), ()) import System.FilePath.Lens (extension) import System.IO.Temp (withSystemTempDirectory) @@ -29,11 +34,13 @@ import System.Process (readProcessWithExitCode, showCommandForUser) data BuildOpts = BuildOpts { _importPaths :: [FilePath] - , _moduleFilepath :: FilePath , _compilerCliFilepath :: Maybe FilePath , _codegenCliFilepath :: Maybe FilePath + , _codegenGenDir :: FilePath + , _codegenCliOpts :: [String] , _debug :: Bool , _workingDir :: Maybe FilePath + , _moduleFilepaths :: NonEmpty FilePath } deriving stock (Eq, Show) @@ -42,31 +49,61 @@ makeLenses ''BuildOpts -- | Build a filepath containing a LambdaBuffers module build :: BuildOpts -> IO () build opts = do - errOrMod <- runFrontend (opts ^. importPaths) (opts ^. moduleFilepath) + checkExists `traverse_` (opts ^. moduleFilepaths) + errOrMod <- runFrontend (opts ^. importPaths) (toList $ opts ^. moduleFilepaths) case errOrMod of - Left err -> logFrontendError err + Left err -> do + logFrontendError err + exitFailure Right res -> do - logInfo "OK" - mods <- either (\e -> error $ "Failed building Proto API modules: " <> show e) return (toModules res) + mods <- + either + ( \e -> do + logError $ "Failed building Proto API modules: " <> show e + exitFailure + ) + return + (toModules res) withSystemTempDirectory - "lambda-buffers-frontend" + "lbf" ( \tempDir -> do - _compRes <- callCompiler opts tempDir (defMessage & Compiler.modules .~ mods) + workDir <- getWorkDir opts tempDir + _compRes <- callCompiler opts workDir (defMessage & Compiler.modules .~ mods) logInfo "Compilation OK" - _cdgRes <- callCodegen opts tempDir (defMessage & Codegen.modules .~ mods) + _cdgRes <- callCodegen opts workDir (Frontend.fres'requested res) (defMessage & Codegen.modules .~ mods) logInfo "Codegen OK" ) +checkExists :: FilePath -> IO () +checkExists fp = do + exists <- doesFileExist fp + if exists + then return () + else do + logError $ "Couldn't find the provided file containing an .lbf schema " <> fp + exitFailure + +getWorkDir :: BuildOpts -> FilePath -> IO FilePath +getWorkDir opts tempDir = do + let workDir = fromMaybe tempDir (opts ^. workingDir) + exists <- doesDirectoryExist workDir + unless + exists + ( do + logError $ "Provided working directory " <> workDir <> " doesn't exist (did you forget to create it first?)" + exitFailure + ) + return workDir + callCompiler :: BuildOpts -> FilePath -> Compiler.Input -> IO Compiler.Result -callCompiler opts tempDir compInp = do +callCompiler opts workDir compInp = do let ext = if opts ^. debug then "textproto" else "pb" - workDir = fromMaybe tempDir (opts ^. workingDir) compInpFp = workDir "compiler-input" <.> ext compOutFp = workDir "compiler-output" <.> ext writeCompilerInput compInpFp compInp lbcFp <- maybe Env.getLbcFromEnvironment return (opts ^. compilerCliFilepath) let args = ["compile", "--input-file", compInpFp, "--output-file", compOutFp] - logInfo $ "Calling: " <> showCommandForUser lbcFp args + call lbcFp args _ <- readProcessWithExitCode lbcFp args "" compOut <- readCompilerOutput compOutFp if compOut ^. Compiler.error == defMessage @@ -104,18 +141,38 @@ readCompilerOutput fp = do logError $ "Unknown Compiler Output format (wanted .pb or .textproto) " <> ext exitFailure -callCodegen :: BuildOpts -> FilePath -> Codegen.Input -> IO Codegen.Result -callCodegen opts tempDir compInp = do +call :: FilePath -> [String] -> IO () +call cliFp cliArgs = do + logInfo $ "Calling: " <> showCommandForUser cliFp cliArgs + (exitCode, stdOut, stdErr) <- readProcessWithExitCode cliFp cliArgs "" + case exitCode of + (ExitFailure _) -> do + logError $ "Error from:" <> showCommandForUser cliFp cliArgs + logError stdErr + logError stdOut + exitFailure + _ -> do + logInfo $ "Success from: " <> showCommandForUser cliFp cliArgs + return () + +callCodegen :: BuildOpts -> FilePath -> [Frontend.ModuleName ()] -> Codegen.Input -> IO Codegen.Result +callCodegen opts workDir requestedModules compInp = do let ext = if opts ^. debug then "textproto" else "pb" - workDir = fromMaybe tempDir (opts ^. workingDir) compInpFp = workDir "codegen-input" <.> ext compOutFp = workDir "codegen-output" <.> ext - genDirFp = workDir "gen" writeCodegenInput compInpFp compInp lbgFp <- maybe Env.getLbgFromEnvironment return (opts ^. codegenCliFilepath) - let args = ["--input", compInpFp, "--output", compOutFp, "--gen-dir", genDirFp] - logInfo $ "Calling: " <> showCommandForUser lbgFp args - _ <- readProcessWithExitCode lbgFp args "" + let args = + [ "--input" + , compInpFp + , "--output" + , compOutFp + , "--gen-dir" + , opts ^. codegenGenDir + ] + <> (opts ^. codegenCliOpts) + <> (toCodegenCliModuleName <$> requestedModules) -- NOTE(bladyjoker): Consider using the proto to supply requested modules. + call lbgFp args compOut <- readCodegenOutput compOutFp if compOut ^. Codegen.error == defMessage then return $ compOut ^. Codegen.result diff --git a/lambda-buffers-frontend/app/LambdaBuffers/Frontend/Cli/Utils.hs b/lambda-buffers-frontend/app/LambdaBuffers/Frontend/Cli/Utils.hs index d867706a..e13fdb79 100644 --- a/lambda-buffers-frontend/app/LambdaBuffers/Frontend/Cli/Utils.hs +++ b/lambda-buffers-frontend/app/LambdaBuffers/Frontend/Cli/Utils.hs @@ -1,7 +1,10 @@ -module LambdaBuffers.Frontend.Cli.Utils (logInfo, logError, logFrontendError, logCompilerError, logCodegenError) where +module LambdaBuffers.Frontend.Cli.Utils (logInfo, logError, logFrontendError, logCompilerError, logCodegenError, toCodegenCliModuleName) where +import Data.List (intercalate) +import Data.Text qualified as Text import LambdaBuffers.Frontend (FrontendError) import LambdaBuffers.Frontend.PPrint () +import LambdaBuffers.Frontend.Syntax qualified as Frontend logInfo :: String -> IO () logInfo msg = putStrLn $ "[lbf][INFO] " <> msg @@ -17,3 +20,7 @@ logCompilerError msg = putStrLn $ "[lbf][ERROR][COMPILER]" <> msg logCodegenError :: String -> IO () logCodegenError msg = putStrLn $ "[lbf][ERROR][CODEGEN]" <> msg + +-- NOTE(bladyjoker): Consider using the proto to supply requested modules. +toCodegenCliModuleName :: Frontend.ModuleName () -> String +toCodegenCliModuleName (Frontend.ModuleName parts _) = intercalate "." ((\(Frontend.ModuleNamePart p _) -> Text.unpack p) <$> parts) diff --git a/lambda-buffers-frontend/app/Main.hs b/lambda-buffers-frontend/app/Main.hs index 7abebc1a..466f929a 100644 --- a/lambda-buffers-frontend/app/Main.hs +++ b/lambda-buffers-frontend/app/Main.hs @@ -22,9 +22,11 @@ import Options.Applicative ( showDefault, showHelpOnEmpty, showHelpOnError, + strArgument, strOption, subparser, ) +import Options.Applicative.NonEmpty (some1) data Command = Build BuildOpts @@ -43,12 +45,6 @@ buildOptsP :: Parser BuildOpts buildOptsP = BuildOpts <$> many importPathP - <*> strOption - ( long "file" - <> short 'f' - <> metavar "FILEPATH" - <> help "LambdaBuffers file (.lbf) to build" - ) <*> optional ( strOption ( long "compiler" @@ -65,6 +61,18 @@ buildOptsP = <> help ("LambdaBuffers Codegen location (if none is set the " <> Env.lbgVar <> " environment variable is used)") ) ) + <*> strOption + ( long "gen-dir" + <> metavar "FILEPATH" + <> help "Directory where the Codegen will store any output produced from the LambdaBuffers schema" + ) + <*> many + ( strOption + ( long "gen-opt" + <> metavar "ARGUMENT" + <> help "Additional options to provide to the Codegen module" + ) + ) <*> flag False True @@ -78,10 +86,11 @@ buildOptsP = ( long "work-dir" <> short 'w' <> metavar "FILEPATH" - <> help "Working directory used to communicate with the Compiler" + <> help "Working directory used to communicate with the Compiler and Codegen components" <> showDefault ) ) + <*> some1 (strArgument (metavar "[.lbf SCHEMA]..." <> help ".lbf schemas to build")) formatOptsP :: Parser FormatOpts formatOptsP = @@ -101,18 +110,18 @@ formatOptsP = <> showDefault ) -optionsP :: Parser Command -optionsP = +commandP :: Parser Command +commandP = subparser $ command "build" - (info (Build <$> buildOptsP <* helper) (progDesc "Build a LambdaBuffers Module (.lbf)")) + (info (Build <$> buildOptsP <* helper) (progDesc "Build LambdaBuffers .lbf schemas")) <> command "format" (info (Format <$> formatOptsP <* helper) (progDesc "Format a LambdaBuffers Module (.lbf)")) parserInfo :: ParserInfo Command -parserInfo = info (optionsP <**> helper) (fullDesc <> progDesc "LambdaBuffers Frontend command-line interface tool") +parserInfo = info (commandP <**> helper) (fullDesc <> progDesc "LambdaBuffers Frontend command-line interface tool") main :: IO () main = do diff --git a/lambda-buffers-frontend/data/goldens/good/work-dir/compiler-input.textproto b/lambda-buffers-frontend/data/goldens/good/work-dir/compiler-input.textproto deleted file mode 100644 index f9af7478..00000000 --- a/lambda-buffers-frontend/data/goldens/good/work-dir/compiler-input.textproto +++ /dev/null @@ -1,5211 +0,0 @@ -modules { - module_name { - parts { - name: "LambdaBuffers" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 1 } - pos_to { column: 21 row: 1 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 1 } - pos_to { column: 21 row: 1 } - } - } - type_defs { - ty_name { - name: "Kind" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 5 row: 5 } - pos_to { column: 9 row: 5 } - } - } - ty_abs { - ty_body { - sum { - constructors { - constr_name { - name: "Type" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 12 row: 5 } - pos_to { column: 16 row: 5 } - } - } - product { - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 17 row: 5 } - pos_to { column: 17 row: 5 } - } - } - } - constructors { - constr_name { - name: "Arrow" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 5 } - pos_to { column: 24 row: 5 } - } - } - product { - fields { - ty_ref { - local_ty_ref { - ty_name { - name: "Kind" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 25 row: 5 } - pos_to { column: 29 row: 5 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 25 row: 5 } - pos_to { column: 29 row: 5 } - } - } - } - } - fields { - ty_ref { - local_ty_ref { - ty_name { - name: "Kind" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 30 row: 5 } - pos_to { column: 34 row: 5 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 30 row: 5 } - pos_to { column: 34 row: 5 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 25 row: 5 } - pos_to { column: 34 row: 5 } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 12 row: 5 } - pos_to { column: 34 row: 5 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 5 } - pos_to { column: 34 row: 5 } - } - } - type_defs { - ty_name { - name: "Ty" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 5 row: 9 } - pos_to { column: 7 row: 9 } - } - } - ty_abs { - ty_body { - sum { - constructors { - constr_name { - name: "App" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 10 row: 9 } - pos_to { column: 13 row: 9 } - } - } - product { - fields { - ty_ref { - local_ty_ref { - ty_name { - name: "Ty" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 14 row: 9 } - pos_to { column: 16 row: 9 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 14 row: 9 } - pos_to { column: 16 row: 9 } - } - } - } - } - fields { - ty_ref { - local_ty_ref { - ty_name { - name: "Ty" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 17 row: 9 } - pos_to { column: 19 row: 9 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 17 row: 9 } - pos_to { column: 19 row: 9 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 14 row: 9 } - pos_to { column: 20 row: 9 } - } - } - } - constructors { - constr_name { - name: "Var" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 22 row: 9 } - pos_to { column: 25 row: 9 } - } - } - product { - fields { - ty_ref { - local_ty_ref { - ty_name { - name: "VarName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 26 row: 9 } - pos_to { column: 33 row: 9 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 26 row: 9 } - pos_to { column: 33 row: 9 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 26 row: 9 } - pos_to { column: 34 row: 9 } - } - } - } - constructors { - constr_name { - name: "Ref" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 36 row: 9 } - pos_to { column: 39 row: 9 } - } - } - product { - fields { - ty_ref { - local_ty_ref { - ty_name { - name: "TyRef" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 40 row: 9 } - pos_to { column: 45 row: 9 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 40 row: 9 } - pos_to { column: 45 row: 9 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 40 row: 9 } - pos_to { column: 45 row: 9 } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 10 row: 9 } - pos_to { column: 45 row: 9 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 9 } - pos_to { column: 45 row: 9 } - } - } - type_defs { - ty_name { - name: "TyAbs" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 13 } - pos_to { column: 13 row: 13 } - } - } - ty_abs { - ty_body { - record { - fields { - field_name { - name: "args" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 18 row: 13 } - pos_to { column: 22 row: 13 } - } - } - field_ty { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "List" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 25 row: 13 } - pos_to { column: 29 row: 13 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 25 row: 13 } - pos_to { column: 29 row: 13 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "TyArg" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 30 row: 13 } - pos_to { column: 35 row: 13 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 30 row: 13 } - pos_to { column: 35 row: 13 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 35 row: 13 } - pos_to { column: 35 row: 13 } - } - } - } - } - fields { - field_name { - name: "body" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 37 row: 13 } - pos_to { column: 41 row: 13 } - } - } - field_ty { - ty_ref { - local_ty_ref { - ty_name { - name: "TyBody" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 44 row: 13 } - pos_to { column: 50 row: 13 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 44 row: 13 } - pos_to { column: 50 row: 13 } - } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 16 row: 13 } - pos_to { column: 52 row: 13 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 13 } - pos_to { column: 52 row: 13 } - } - } - type_defs { - ty_name { - name: "TyArg" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 17 } - pos_to { column: 13 row: 17 } - } - } - ty_abs { - ty_body { - record { - fields { - field_name { - name: "name" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 18 row: 17 } - pos_to { column: 22 row: 17 } - } - } - field_ty { - ty_ref { - local_ty_ref { - ty_name { - name: "VarName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 25 row: 17 } - pos_to { column: 32 row: 17 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 25 row: 17 } - pos_to { column: 32 row: 17 } - } - } - } - } - } - fields { - field_name { - name: "kind" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 34 row: 17 } - pos_to { column: 38 row: 17 } - } - } - field_ty { - ty_ref { - local_ty_ref { - ty_name { - name: "Kind" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 41 row: 17 } - pos_to { column: 45 row: 17 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 41 row: 17 } - pos_to { column: 45 row: 17 } - } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 16 row: 17 } - pos_to { column: 47 row: 17 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 17 } - pos_to { column: 47 row: 17 } - } - } - type_defs { - ty_name { - name: "TyDef" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 21 } - pos_to { column: 13 row: 21 } - } - } - ty_abs { - ty_body { - record { - fields { - field_name { - name: "name" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 18 row: 21 } - pos_to { column: 22 row: 21 } - } - } - field_ty { - ty_ref { - local_ty_ref { - ty_name { - name: "TyName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 25 row: 21 } - pos_to { column: 31 row: 21 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 25 row: 21 } - pos_to { column: 31 row: 21 } - } - } - } - } - } - fields { - field_name { - name: "abs" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 33 row: 21 } - pos_to { column: 36 row: 21 } - } - } - field_ty { - ty_ref { - local_ty_ref { - ty_name { - name: "TyAbs" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 39 row: 21 } - pos_to { column: 44 row: 21 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 39 row: 21 } - pos_to { column: 44 row: 21 } - } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 16 row: 21 } - pos_to { column: 46 row: 21 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 21 } - pos_to { column: 46 row: 21 } - } - } - type_defs { - ty_name { - name: "TyBody" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 5 row: 25 } - pos_to { column: 11 row: 25 } - } - } - ty_abs { - ty_body { - sum { - constructors { - constr_name { - name: "Opaque" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 14 row: 25 } - pos_to { column: 20 row: 25 } - } - } - product { - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 21 row: 25 } - pos_to { column: 21 row: 25 } - } - } - } - constructors { - constr_name { - name: "Sum" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 23 row: 25 } - pos_to { column: 26 row: 25 } - } - } - product { - fields { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "Map" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 28 row: 25 } - pos_to { column: 31 row: 25 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 28 row: 25 } - pos_to { column: 31 row: 25 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "ConstrName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 32 row: 25 } - pos_to { column: 42 row: 25 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 32 row: 25 } - pos_to { column: 42 row: 25 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "Constructor" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 43 row: 25 } - pos_to { column: 54 row: 25 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 43 row: 25 } - pos_to { column: 54 row: 25 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 54 row: 25 } - pos_to { column: 54 row: 25 } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 27 row: 25 } - pos_to { column: 55 row: 25 } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 14 row: 25 } - pos_to { column: 55 row: 25 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 25 } - pos_to { column: 55 row: 25 } - } - } - type_defs { - ty_name { - name: "Constructor" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 29 } - pos_to { column: 19 row: 29 } - } - } - ty_abs { - ty_body { - record { - fields { - field_name { - name: "name" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 24 row: 29 } - pos_to { column: 28 row: 29 } - } - } - field_ty { - ty_ref { - local_ty_ref { - ty_name { - name: "ConstrName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 31 row: 29 } - pos_to { column: 41 row: 29 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 31 row: 29 } - pos_to { column: 41 row: 29 } - } - } - } - } - } - fields { - field_name { - name: "product" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 43 row: 29 } - pos_to { column: 50 row: 29 } - } - } - field_ty { - ty_ref { - local_ty_ref { - ty_name { - name: "Product" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 53 row: 29 } - pos_to { column: 60 row: 29 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 53 row: 29 } - pos_to { column: 60 row: 29 } - } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 22 row: 29 } - pos_to { column: 62 row: 29 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 29 } - pos_to { column: 62 row: 29 } - } - } - type_defs { - ty_name { - name: "Product" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 6 row: 33 } - pos_to { column: 13 row: 33 } - } - } - ty_abs { - ty_body { - product { - fields { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "List" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 17 row: 33 } - pos_to { column: 21 row: 33 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 17 row: 33 } - pos_to { column: 21 row: 33 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "Ty" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 22 row: 33 } - pos_to { column: 24 row: 33 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 22 row: 33 } - pos_to { column: 24 row: 33 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 24 row: 33 } - pos_to { column: 24 row: 33 } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 16 row: 33 } - pos_to { column: 25 row: 33 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 33 } - pos_to { column: 25 row: 33 } - } - } - type_defs { - ty_name { - name: "Record" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 6 row: 37 } - pos_to { column: 12 row: 37 } - } - } - ty_abs { - ty_body { - product { - fields { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "Map" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 16 row: 37 } - pos_to { column: 19 row: 37 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 16 row: 37 } - pos_to { column: 19 row: 37 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "FieldName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 20 row: 37 } - pos_to { column: 29 row: 37 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 20 row: 37 } - pos_to { column: 29 row: 37 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "Field" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 30 row: 37 } - pos_to { column: 35 row: 37 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 30 row: 37 } - pos_to { column: 35 row: 37 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 35 row: 37 } - pos_to { column: 35 row: 37 } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 15 row: 37 } - pos_to { column: 36 row: 37 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 37 } - pos_to { column: 36 row: 37 } - } - } - type_defs { - ty_name { - name: "Field" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 41 } - pos_to { column: 13 row: 41 } - } - } - ty_abs { - ty_body { - record { - fields { - field_name { - name: "name" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 18 row: 41 } - pos_to { column: 22 row: 41 } - } - } - field_ty { - ty_ref { - local_ty_ref { - ty_name { - name: "FieldName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 25 row: 41 } - pos_to { column: 34 row: 41 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 25 row: 41 } - pos_to { column: 34 row: 41 } - } - } - } - } - } - fields { - field_name { - name: "ty" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 36 row: 41 } - pos_to { column: 38 row: 41 } - } - } - field_ty { - ty_ref { - local_ty_ref { - ty_name { - name: "Ty" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 41 row: 41 } - pos_to { column: 43 row: 41 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 41 row: 41 } - pos_to { column: 43 row: 41 } - } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 16 row: 41 } - pos_to { column: 45 row: 41 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 41 } - pos_to { column: 45 row: 41 } - } - } - type_defs { - ty_name { - name: "TyRef" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 5 row: 45 } - pos_to { column: 10 row: 45 } - } - } - ty_abs { - ty_body { - sum { - constructors { - constr_name { - name: "Local" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 13 row: 45 } - pos_to { column: 18 row: 45 } - } - } - product { - fields { - ty_ref { - local_ty_ref { - ty_name { - name: "TyName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 45 } - pos_to { column: 25 row: 45 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 45 } - pos_to { column: 25 row: 45 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 45 } - pos_to { column: 26 row: 45 } - } - } - } - constructors { - constr_name { - name: "Foreign" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 28 row: 45 } - pos_to { column: 35 row: 45 } - } - } - product { - fields { - ty_ref { - local_ty_ref { - ty_name { - name: "ModuleName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 36 row: 45 } - pos_to { column: 46 row: 45 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 36 row: 45 } - pos_to { column: 46 row: 45 } - } - } - } - } - fields { - ty_ref { - local_ty_ref { - ty_name { - name: "TyName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 47 row: 45 } - pos_to { column: 53 row: 45 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 47 row: 45 } - pos_to { column: 53 row: 45 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 36 row: 45 } - pos_to { column: 53 row: 45 } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 13 row: 45 } - pos_to { column: 53 row: 45 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 45 } - pos_to { column: 53 row: 45 } - } - } - type_defs { - ty_name { - name: "ClassDef" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 49 } - pos_to { column: 16 row: 49 } - } - } - ty_abs { - ty_body { - record { - fields { - field_name { - name: "name" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 21 row: 49 } - pos_to { column: 25 row: 49 } - } - } - field_ty { - ty_ref { - local_ty_ref { - ty_name { - name: "ClassName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 28 row: 49 } - pos_to { column: 37 row: 49 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 28 row: 49 } - pos_to { column: 37 row: 49 } - } - } - } - } - } - fields { - field_name { - name: "args" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 21 row: 50 } - pos_to { column: 25 row: 50 } - } - } - field_ty { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "List" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 28 row: 50 } - pos_to { column: 32 row: 50 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 28 row: 50 } - pos_to { column: 32 row: 50 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "TyArg" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 33 row: 50 } - pos_to { column: 38 row: 50 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 33 row: 50 } - pos_to { column: 38 row: 50 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 51 } - pos_to { column: 19 row: 51 } - } - } - } - } - fields { - field_name { - name: "supers" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 21 row: 51 } - pos_to { column: 27 row: 51 } - } - } - field_ty { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "List" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 30 row: 51 } - pos_to { column: 34 row: 51 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 30 row: 51 } - pos_to { column: 34 row: 51 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "ClassConstraint" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 35 row: 51 } - pos_to { column: 50 row: 51 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 35 row: 51 } - pos_to { column: 50 row: 51 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 51 row: 51 } - pos_to { column: 51 row: 51 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 49 } - pos_to { column: 52 row: 51 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 49 } - pos_to { column: 52 row: 51 } - } - } - type_defs { - ty_name { - name: "ClassConstraint" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 55 } - pos_to { column: 23 row: 55 } - } - } - ty_abs { - ty_body { - record { - fields { - field_name { - name: "class" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 28 row: 55 } - pos_to { column: 33 row: 55 } - } - } - field_ty { - ty_ref { - local_ty_ref { - ty_name { - name: "ClassRef" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 36 row: 55 } - pos_to { column: 44 row: 55 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 36 row: 55 } - pos_to { column: 44 row: 55 } - } - } - } - } - } - fields { - field_name { - name: "args" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 46 row: 55 } - pos_to { column: 50 row: 55 } - } - } - field_ty { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "List" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 53 row: 55 } - pos_to { column: 57 row: 55 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 53 row: 55 } - pos_to { column: 57 row: 55 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "TyArg" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 58 row: 55 } - pos_to { column: 63 row: 55 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 58 row: 55 } - pos_to { column: 63 row: 55 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 64 row: 55 } - pos_to { column: 64 row: 55 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 26 row: 55 } - pos_to { column: 65 row: 55 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 55 } - pos_to { column: 65 row: 55 } - } - } - type_defs { - ty_name { - name: "InstanceClause" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 59 } - pos_to { column: 22 row: 59 } - } - } - ty_abs { - ty_body { - record { - fields { - field_name { - name: "head" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 27 row: 59 } - pos_to { column: 31 row: 59 } - } - } - field_ty { - ty_ref { - local_ty_ref { - ty_name { - name: "Constraint" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 34 row: 59 } - pos_to { column: 44 row: 59 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 34 row: 59 } - pos_to { column: 44 row: 59 } - } - } - } - } - } - fields { - field_name { - name: "body" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 46 row: 59 } - pos_to { column: 50 row: 59 } - } - } - field_ty { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "List" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 53 row: 59 } - pos_to { column: 57 row: 59 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 53 row: 59 } - pos_to { column: 57 row: 59 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "Constraint" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 58 row: 59 } - pos_to { column: 68 row: 59 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 58 row: 59 } - pos_to { column: 68 row: 59 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 69 row: 59 } - pos_to { column: 69 row: 59 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 25 row: 59 } - pos_to { column: 70 row: 59 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 59 } - pos_to { column: 70 row: 59 } - } - } - type_defs { - ty_name { - name: "Derive" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 6 row: 63 } - pos_to { column: 12 row: 63 } - } - } - ty_abs { - ty_body { - product { - fields { - ty_ref { - local_ty_ref { - ty_name { - name: "Constraint" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 15 row: 63 } - pos_to { column: 25 row: 63 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 15 row: 63 } - pos_to { column: 25 row: 63 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 15 row: 63 } - pos_to { column: 25 row: 63 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 63 } - pos_to { column: 25 row: 63 } - } - } - type_defs { - ty_name { - name: "Constraint" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 67 } - pos_to { column: 18 row: 67 } - } - } - ty_abs { - ty_body { - record { - fields { - field_name { - name: "class" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 23 row: 67 } - pos_to { column: 28 row: 67 } - } - } - field_ty { - ty_ref { - local_ty_ref { - ty_name { - name: "ClassRef" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 31 row: 67 } - pos_to { column: 39 row: 67 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 31 row: 67 } - pos_to { column: 39 row: 67 } - } - } - } - } - } - fields { - field_name { - name: "args" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 41 row: 67 } - pos_to { column: 45 row: 67 } - } - } - field_ty { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "List" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 48 row: 67 } - pos_to { column: 52 row: 67 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 48 row: 67 } - pos_to { column: 52 row: 67 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "Ty" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 53 row: 67 } - pos_to { column: 55 row: 67 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 53 row: 67 } - pos_to { column: 55 row: 67 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 56 row: 67 } - pos_to { column: 56 row: 67 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 21 row: 67 } - pos_to { column: 57 row: 67 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 67 } - pos_to { column: 57 row: 67 } - } - } - type_defs { - ty_name { - name: "ClassRef" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 5 row: 71 } - pos_to { column: 13 row: 71 } - } - } - ty_abs { - ty_body { - sum { - constructors { - constr_name { - name: "Local" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 16 row: 71 } - pos_to { column: 21 row: 71 } - } - } - product { - fields { - ty_ref { - local_ty_ref { - ty_name { - name: "ClassName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 22 row: 71 } - pos_to { column: 31 row: 71 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 22 row: 71 } - pos_to { column: 31 row: 71 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 22 row: 71 } - pos_to { column: 32 row: 71 } - } - } - } - constructors { - constr_name { - name: "Foreign" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 34 row: 71 } - pos_to { column: 41 row: 71 } - } - } - product { - fields { - ty_ref { - local_ty_ref { - ty_name { - name: "ModuleName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 42 row: 71 } - pos_to { column: 52 row: 71 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 42 row: 71 } - pos_to { column: 52 row: 71 } - } - } - } - } - fields { - ty_ref { - local_ty_ref { - ty_name { - name: "ClassName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 53 row: 71 } - pos_to { column: 62 row: 71 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 53 row: 71 } - pos_to { column: 62 row: 71 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 42 row: 71 } - pos_to { column: 62 row: 71 } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 16 row: 71 } - pos_to { column: 62 row: 71 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 71 } - pos_to { column: 62 row: 71 } - } - } - type_defs { - ty_name { - name: "Module" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 75 } - pos_to { column: 14 row: 75 } - } - } - ty_abs { - ty_body { - record { - fields { - field_name { - name: "name" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 75 } - pos_to { column: 23 row: 75 } - } - } - field_ty { - ty_ref { - local_ty_ref { - ty_name { - name: "ModuleName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 26 row: 75 } - pos_to { column: 36 row: 75 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 26 row: 75 } - pos_to { column: 36 row: 75 } - } - } - } - } - } - fields { - field_name { - name: "tyDefs" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 76 } - pos_to { column: 25 row: 76 } - } - } - field_ty { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "Map" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 28 row: 76 } - pos_to { column: 31 row: 76 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 28 row: 76 } - pos_to { column: 31 row: 76 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "TyName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 32 row: 76 } - pos_to { column: 38 row: 76 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 32 row: 76 } - pos_to { column: 38 row: 76 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "TyDef" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 39 row: 76 } - pos_to { column: 44 row: 76 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 39 row: 76 } - pos_to { column: 44 row: 76 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 17 row: 77 } - pos_to { column: 17 row: 77 } - } - } - } - } - fields { - field_name { - name: "classDefs" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 77 } - pos_to { column: 28 row: 77 } - } - } - field_ty { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "Map" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 31 row: 77 } - pos_to { column: 34 row: 77 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 31 row: 77 } - pos_to { column: 34 row: 77 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "ClassName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 35 row: 77 } - pos_to { column: 44 row: 77 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 35 row: 77 } - pos_to { column: 44 row: 77 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "ClassDef" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 45 row: 77 } - pos_to { column: 53 row: 77 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 45 row: 77 } - pos_to { column: 53 row: 77 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 17 row: 78 } - pos_to { column: 17 row: 78 } - } - } - } - } - fields { - field_name { - name: "ruleImports" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 78 } - pos_to { column: 30 row: 78 } - } - } - field_ty { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "Set" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 33 row: 78 } - pos_to { column: 36 row: 78 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 33 row: 78 } - pos_to { column: 36 row: 78 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "ModuleName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 37 row: 78 } - pos_to { column: 47 row: 78 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 37 row: 78 } - pos_to { column: 47 row: 78 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 17 row: 79 } - pos_to { column: 17 row: 79 } - } - } - } - } - fields { - field_name { - name: "instanceClauses" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 79 } - pos_to { column: 34 row: 79 } - } - } - field_ty { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "List" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 37 row: 79 } - pos_to { column: 41 row: 79 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 37 row: 79 } - pos_to { column: 41 row: 79 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "InstanceClause" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 42 row: 79 } - pos_to { column: 56 row: 79 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 42 row: 79 } - pos_to { column: 56 row: 79 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 17 row: 80 } - pos_to { column: 17 row: 80 } - } - } - } - } - fields { - field_name { - name: "derives" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 80 } - pos_to { column: 26 row: 80 } - } - } - field_ty { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "List" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 29 row: 80 } - pos_to { column: 33 row: 80 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 29 row: 80 } - pos_to { column: 33 row: 80 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "Derive" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 34 row: 80 } - pos_to { column: 40 row: 80 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 34 row: 80 } - pos_to { column: 40 row: 80 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 41 row: 80 } - pos_to { column: 41 row: 80 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 17 row: 75 } - pos_to { column: 42 row: 80 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 75 } - pos_to { column: 42 row: 80 } - } - } - type_defs { - ty_name { - name: "CompilerInput" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 84 } - pos_to { column: 21 row: 84 } - } - } - ty_abs { - ty_body { - record { - fields { - field_name { - name: "modules" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 26 row: 84 } - pos_to { column: 33 row: 84 } - } - } - field_ty { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "Map" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 36 row: 84 } - pos_to { column: 39 row: 84 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 36 row: 84 } - pos_to { column: 39 row: 84 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "ModuleName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 40 row: 84 } - pos_to { column: 50 row: 84 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 40 row: 84 } - pos_to { column: 50 row: 84 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "Module" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 51 row: 84 } - pos_to { column: 57 row: 84 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 51 row: 84 } - pos_to { column: 57 row: 84 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 58 row: 84 } - pos_to { column: 58 row: 84 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 24 row: 84 } - pos_to { column: 59 row: 84 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 84 } - pos_to { column: 59 row: 84 } - } - } - type_defs { - ty_name { - name: "TyName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 6 row: 88 } - pos_to { column: 12 row: 88 } - } - } - ty_abs { - ty_body { - product { - fields { - ty_ref { - foreign_ty_ref { - ty_name { - name: "Text" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 15 row: 88 } - pos_to { column: 19 row: 88 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 15 row: 88 } - pos_to { column: 19 row: 88 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 15 row: 88 } - pos_to { column: 19 row: 88 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 88 } - pos_to { column: 19 row: 88 } - } - } - type_defs { - ty_name { - name: "VarName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 6 row: 92 } - pos_to { column: 13 row: 92 } - } - } - ty_abs { - ty_body { - product { - fields { - ty_ref { - foreign_ty_ref { - ty_name { - name: "Text" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 16 row: 92 } - pos_to { column: 20 row: 92 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 16 row: 92 } - pos_to { column: 20 row: 92 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 16 row: 92 } - pos_to { column: 20 row: 92 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 92 } - pos_to { column: 20 row: 92 } - } - } - type_defs { - ty_name { - name: "ConstrName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 6 row: 96 } - pos_to { column: 16 row: 96 } - } - } - ty_abs { - ty_body { - product { - fields { - ty_ref { - foreign_ty_ref { - ty_name { - name: "Text" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 96 } - pos_to { column: 23 row: 96 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 96 } - pos_to { column: 23 row: 96 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 96 } - pos_to { column: 23 row: 96 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 96 } - pos_to { column: 23 row: 96 } - } - } - type_defs { - ty_name { - name: "FieldName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 6 row: 100 } - pos_to { column: 15 row: 100 } - } - } - ty_abs { - ty_body { - product { - fields { - ty_ref { - foreign_ty_ref { - ty_name { - name: "Text" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 18 row: 100 } - pos_to { column: 22 row: 100 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 18 row: 100 } - pos_to { column: 22 row: 100 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 18 row: 100 } - pos_to { column: 22 row: 100 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 100 } - pos_to { column: 22 row: 100 } - } - } - type_defs { - ty_name { - name: "ModuleName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 6 row: 104 } - pos_to { column: 16 row: 104 } - } - } - ty_abs { - ty_body { - product { - fields { - ty_app { - ty_func { - ty_ref { - foreign_ty_ref { - ty_name { - name: "List" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 20 row: 104 } - pos_to { column: 24 row: 104 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 20 row: 104 } - pos_to { column: 24 row: 104 } - } - } - } - } - ty_args { - ty_ref { - local_ty_ref { - ty_name { - name: "ModuleNamePart" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 25 row: 104 } - pos_to { column: 39 row: 104 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 25 row: 104 } - pos_to { column: 39 row: 104 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 39 row: 104 } - pos_to { column: 39 row: 104 } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 19 row: 104 } - pos_to { column: 40 row: 104 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 104 } - pos_to { column: 40 row: 104 } - } - } - type_defs { - ty_name { - name: "ModuleNamePart" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 6 row: 108 } - pos_to { column: 20 row: 108 } - } - } - ty_abs { - ty_body { - product { - fields { - ty_ref { - foreign_ty_ref { - ty_name { - name: "Text" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 23 row: 108 } - pos_to { column: 27 row: 108 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 23 row: 108 } - pos_to { column: 27 row: 108 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 23 row: 108 } - pos_to { column: 27 row: 108 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 108 } - pos_to { column: 27 row: 108 } - } - } - type_defs { - ty_name { - name: "ClassName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 6 row: 112 } - pos_to { column: 15 row: 112 } - } - } - ty_abs { - ty_body { - product { - fields { - ty_ref { - foreign_ty_ref { - ty_name { - name: "Text" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 18 row: 112 } - pos_to { column: 22 row: 112 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 18 row: 112 } - pos_to { column: 22 row: 112 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 18 row: 112 } - pos_to { column: 22 row: 112 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 112 } - pos_to { column: 22 row: 112 } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 7 } - pos_to { column: 10 row: 7 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 7 } - pos_to { column: 10 row: 7 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "Kind" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 7 } - pos_to { column: 15 row: 7 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 7 } - pos_to { column: 15 row: 7 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 7 } - pos_to { column: 15 row: 7 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 11 } - pos_to { column: 10 row: 11 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 11 } - pos_to { column: 10 row: 11 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "Ty" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 11 } - pos_to { column: 13 row: 11 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 11 } - pos_to { column: 13 row: 11 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 11 } - pos_to { column: 13 row: 11 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 15 } - pos_to { column: 10 row: 15 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 15 } - pos_to { column: 10 row: 15 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "TyAbs" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 15 } - pos_to { column: 16 row: 15 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 15 } - pos_to { column: 16 row: 15 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 15 } - pos_to { column: 16 row: 15 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 19 } - pos_to { column: 10 row: 19 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 19 } - pos_to { column: 10 row: 19 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "TyArg" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 19 } - pos_to { column: 16 row: 19 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 19 } - pos_to { column: 16 row: 19 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 19 } - pos_to { column: 16 row: 19 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 23 } - pos_to { column: 10 row: 23 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 23 } - pos_to { column: 10 row: 23 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "TyDef" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 23 } - pos_to { column: 16 row: 23 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 23 } - pos_to { column: 16 row: 23 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 23 } - pos_to { column: 16 row: 23 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 27 } - pos_to { column: 10 row: 27 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 27 } - pos_to { column: 10 row: 27 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "TyBody" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 27 } - pos_to { column: 17 row: 27 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 27 } - pos_to { column: 17 row: 27 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 27 } - pos_to { column: 17 row: 27 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 31 } - pos_to { column: 10 row: 31 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 31 } - pos_to { column: 10 row: 31 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "Constructor" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 31 } - pos_to { column: 22 row: 31 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 31 } - pos_to { column: 22 row: 31 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 31 } - pos_to { column: 22 row: 31 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 35 } - pos_to { column: 10 row: 35 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 35 } - pos_to { column: 10 row: 35 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "Product" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 35 } - pos_to { column: 18 row: 35 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 35 } - pos_to { column: 18 row: 35 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 35 } - pos_to { column: 18 row: 35 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 39 } - pos_to { column: 10 row: 39 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 39 } - pos_to { column: 10 row: 39 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "Record" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 39 } - pos_to { column: 17 row: 39 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 39 } - pos_to { column: 17 row: 39 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 39 } - pos_to { column: 17 row: 39 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 43 } - pos_to { column: 10 row: 43 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 43 } - pos_to { column: 10 row: 43 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "Field" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 43 } - pos_to { column: 16 row: 43 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 43 } - pos_to { column: 16 row: 43 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 43 } - pos_to { column: 16 row: 43 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 47 } - pos_to { column: 10 row: 47 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 47 } - pos_to { column: 10 row: 47 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "TyRef" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 47 } - pos_to { column: 16 row: 47 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 47 } - pos_to { column: 16 row: 47 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 47 } - pos_to { column: 16 row: 47 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 53 } - pos_to { column: 10 row: 53 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 53 } - pos_to { column: 10 row: 53 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "ClassDef" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 53 } - pos_to { column: 19 row: 53 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 53 } - pos_to { column: 19 row: 53 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 53 } - pos_to { column: 19 row: 53 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 57 } - pos_to { column: 10 row: 57 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 57 } - pos_to { column: 10 row: 57 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "ClassConstraint" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 57 } - pos_to { column: 26 row: 57 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 57 } - pos_to { column: 26 row: 57 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 57 } - pos_to { column: 26 row: 57 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 61 } - pos_to { column: 10 row: 61 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 61 } - pos_to { column: 10 row: 61 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "InstanceClause" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 61 } - pos_to { column: 25 row: 61 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 61 } - pos_to { column: 25 row: 61 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 61 } - pos_to { column: 25 row: 61 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 65 } - pos_to { column: 10 row: 65 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 65 } - pos_to { column: 10 row: 65 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "Derive" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 65 } - pos_to { column: 17 row: 65 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 65 } - pos_to { column: 17 row: 65 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 65 } - pos_to { column: 17 row: 65 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 69 } - pos_to { column: 10 row: 69 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 69 } - pos_to { column: 10 row: 69 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "Constraint" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 69 } - pos_to { column: 21 row: 69 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 69 } - pos_to { column: 21 row: 69 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 69 } - pos_to { column: 21 row: 69 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 73 } - pos_to { column: 10 row: 73 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 73 } - pos_to { column: 10 row: 73 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "ClassRef" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 73 } - pos_to { column: 19 row: 73 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 73 } - pos_to { column: 19 row: 73 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 73 } - pos_to { column: 19 row: 73 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 82 } - pos_to { column: 10 row: 82 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 82 } - pos_to { column: 10 row: 82 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "Module" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 82 } - pos_to { column: 17 row: 82 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 82 } - pos_to { column: 17 row: 82 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 82 } - pos_to { column: 17 row: 82 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 86 } - pos_to { column: 10 row: 86 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 86 } - pos_to { column: 10 row: 86 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "CompilerInput" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 86 } - pos_to { column: 24 row: 86 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 86 } - pos_to { column: 24 row: 86 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 86 } - pos_to { column: 24 row: 86 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 90 } - pos_to { column: 10 row: 90 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 90 } - pos_to { column: 10 row: 90 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "TyName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 90 } - pos_to { column: 17 row: 90 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 90 } - pos_to { column: 17 row: 90 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 90 } - pos_to { column: 17 row: 90 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 94 } - pos_to { column: 10 row: 94 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 94 } - pos_to { column: 10 row: 94 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "VarName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 94 } - pos_to { column: 18 row: 94 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 94 } - pos_to { column: 18 row: 94 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 94 } - pos_to { column: 18 row: 94 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 98 } - pos_to { column: 10 row: 98 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 98 } - pos_to { column: 10 row: 98 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "ConstrName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 98 } - pos_to { column: 21 row: 98 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 98 } - pos_to { column: 21 row: 98 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 98 } - pos_to { column: 21 row: 98 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 102 } - pos_to { column: 10 row: 102 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 102 } - pos_to { column: 10 row: 102 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "FieldName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 102 } - pos_to { column: 20 row: 102 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 102 } - pos_to { column: 20 row: 102 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 102 } - pos_to { column: 20 row: 102 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 106 } - pos_to { column: 10 row: 106 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 106 } - pos_to { column: 10 row: 106 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "ModuleName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 106 } - pos_to { column: 21 row: 106 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 106 } - pos_to { column: 21 row: 106 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 106 } - pos_to { column: 21 row: 106 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 110 } - pos_to { column: 10 row: 110 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 110 } - pos_to { column: 10 row: 110 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "ModuleNamePart" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 110 } - pos_to { column: 25 row: 110 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 110 } - pos_to { column: 25 row: 110 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 110 } - pos_to { column: 25 row: 110 } - } - } - } - derives { - constraint { - class_ref { - foreign_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 114 } - pos_to { column: 10 row: 114 } - } - } - module_name { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 114 } - pos_to { column: 10 row: 114 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "ClassName" - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 114 } - pos_to { column: 20 row: 114 } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 11 row: 114 } - pos_to { column: 20 row: 114 } - } - } - } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 8 row: 114 } - pos_to { column: 20 row: 114 } - } - } - } - imports { - parts { name: "Prelude" source_info { pos_from { } pos_to { } } } - source_info { pos_from { } pos_to { } } - } - source_info { - file: "goldens/good/LambdaBuffers.lbf" - pos_from { column: 1 row: 1 } - pos_to { column: 20 row: 114 } - } -} -modules { - module_name { - parts { - name: "Prelude" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 8 row: 1 } - pos_to { column: 15 row: 1 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 8 row: 1 } - pos_to { column: 15 row: 1 } - } - } - type_defs { - ty_name { - name: "Bool" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 8 row: 5 } - pos_to { column: 12 row: 5 } - } - } - ty_abs { ty_body { opaque { } } } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 5 } - pos_to { column: 12 row: 5 } - } - } - type_defs { - ty_name { - name: "Integer" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 8 row: 9 } - pos_to { column: 15 row: 9 } - } - } - ty_abs { ty_body { opaque { } } } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 9 } - pos_to { column: 15 row: 9 } - } - } - type_defs { - ty_name { - name: "Int32" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 8 row: 13 } - pos_to { column: 13 row: 13 } - } - } - ty_abs { ty_body { opaque { } } } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 13 } - pos_to { column: 13 row: 13 } - } - } - type_defs { - ty_name { - name: "Bytes" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 8 row: 17 } - pos_to { column: 13 row: 17 } - } - } - ty_abs { ty_body { opaque { } } } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 17 } - pos_to { column: 13 row: 17 } - } - } - type_defs { - ty_name { - name: "Char" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 8 row: 21 } - pos_to { column: 12 row: 21 } - } - } - ty_abs { ty_body { opaque { } } } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 21 } - pos_to { column: 12 row: 21 } - } - } - type_defs { - ty_name { - name: "Text" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 8 row: 25 } - pos_to { column: 12 row: 25 } - } - } - ty_abs { ty_body { opaque { } } } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 25 } - pos_to { column: 12 row: 25 } - } - } - type_defs { - ty_name { - name: "Maybe" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 8 row: 29 } - pos_to { column: 13 row: 29 } - } - } - ty_abs { - ty_args { - arg_name { name: "a" } - arg_kind { kind_ref: KIND_REF_TYPE } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 14 row: 29 } - pos_to { column: 15 row: 29 } - } - } - ty_body { opaque { } } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 29 } - pos_to { column: 15 row: 29 } - } - } - type_defs { - ty_name { - name: "Either" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 8 row: 33 } - pos_to { column: 14 row: 33 } - } - } - ty_abs { - ty_args { - arg_name { name: "a" } - arg_kind { kind_ref: KIND_REF_TYPE } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 15 row: 33 } - pos_to { column: 16 row: 33 } - } - } - ty_args { - arg_name { name: "b" } - arg_kind { kind_ref: KIND_REF_TYPE } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 17 row: 33 } - pos_to { column: 18 row: 33 } - } - } - ty_body { opaque { } } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 33 } - pos_to { column: 18 row: 33 } - } - } - type_defs { - ty_name { - name: "List" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 8 row: 37 } - pos_to { column: 12 row: 37 } - } - } - ty_abs { - ty_args { - arg_name { name: "a" } - arg_kind { kind_ref: KIND_REF_TYPE } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 13 row: 37 } - pos_to { column: 14 row: 37 } - } - } - ty_body { opaque { } } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 37 } - pos_to { column: 14 row: 37 } - } - } - type_defs { - ty_name { - name: "Map" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 8 row: 41 } - pos_to { column: 11 row: 41 } - } - } - ty_abs { - ty_args { - arg_name { name: "a" } - arg_kind { kind_ref: KIND_REF_TYPE } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 12 row: 41 } - pos_to { column: 13 row: 41 } - } - } - ty_args { - arg_name { name: "b" } - arg_kind { kind_ref: KIND_REF_TYPE } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 14 row: 41 } - pos_to { column: 15 row: 41 } - } - } - ty_body { opaque { } } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 41 } - pos_to { column: 15 row: 41 } - } - } - type_defs { - ty_name { - name: "Set" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 8 row: 45 } - pos_to { column: 11 row: 45 } - } - } - ty_abs { - ty_args { - arg_name { name: "a" } - arg_kind { kind_ref: KIND_REF_TYPE } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 12 row: 45 } - pos_to { column: 13 row: 45 } - } - } - ty_body { opaque { } } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 45 } - pos_to { column: 13 row: 45 } - } - } - class_defs { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 7 row: 3 } - pos_to { column: 9 row: 3 } - } - } - class_args { - arg_name { name: "a" } - arg_kind { kind_ref: KIND_REF_TYPE } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 3 } - pos_to { column: 11 row: 3 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 3 } - pos_to { column: 11 row: 3 } - } - } - instances { - head { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 7 } - pos_to { column: 12 row: 7 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 7 } - pos_to { column: 12 row: 7 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "Bool" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 13 row: 7 } - pos_to { column: 17 row: 7 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 13 row: 7 } - pos_to { column: 17 row: 7 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 7 } - pos_to { column: 17 row: 7 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 7 } - pos_to { column: 17 row: 7 } - } - } - instances { - head { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 11 } - pos_to { column: 12 row: 11 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 11 } - pos_to { column: 12 row: 11 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "Integer" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 13 row: 11 } - pos_to { column: 20 row: 11 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 13 row: 11 } - pos_to { column: 20 row: 11 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 11 } - pos_to { column: 20 row: 11 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 11 } - pos_to { column: 20 row: 11 } - } - } - instances { - head { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 15 } - pos_to { column: 12 row: 15 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 15 } - pos_to { column: 12 row: 15 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "Int32" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 13 row: 15 } - pos_to { column: 18 row: 15 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 13 row: 15 } - pos_to { column: 18 row: 15 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 15 } - pos_to { column: 18 row: 15 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 15 } - pos_to { column: 18 row: 15 } - } - } - instances { - head { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 19 } - pos_to { column: 12 row: 19 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 19 } - pos_to { column: 12 row: 19 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "Bytes" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 13 row: 19 } - pos_to { column: 18 row: 19 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 13 row: 19 } - pos_to { column: 18 row: 19 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 19 } - pos_to { column: 18 row: 19 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 19 } - pos_to { column: 18 row: 19 } - } - } - instances { - head { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 23 } - pos_to { column: 12 row: 23 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 23 } - pos_to { column: 12 row: 23 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "Char" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 13 row: 23 } - pos_to { column: 17 row: 23 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 13 row: 23 } - pos_to { column: 17 row: 23 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 23 } - pos_to { column: 17 row: 23 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 23 } - pos_to { column: 17 row: 23 } - } - } - instances { - head { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 27 } - pos_to { column: 12 row: 27 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 27 } - pos_to { column: 12 row: 27 } - } - } - } - args { - ty_ref { - local_ty_ref { - ty_name { - name: "Text" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 13 row: 27 } - pos_to { column: 17 row: 27 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 13 row: 27 } - pos_to { column: 17 row: 27 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 27 } - pos_to { column: 17 row: 27 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 27 } - pos_to { column: 17 row: 27 } - } - } - instances { - head { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 31 } - pos_to { column: 12 row: 31 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 31 } - pos_to { column: 12 row: 31 } - } - } - } - args { - ty_app { - ty_func { - ty_ref { - local_ty_ref { - ty_name { - name: "Maybe" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 14 row: 31 } - pos_to { column: 19 row: 31 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 14 row: 31 } - pos_to { column: 19 row: 31 } - } - } - } - } - ty_args { - ty_var { - var_name { - name: "a" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 20 row: 31 } - pos_to { column: 21 row: 31 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 21 row: 31 } - pos_to { column: 21 row: 31 } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 31 } - pos_to { column: 23 row: 31 } - } - } - constraints { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 26 row: 31 } - pos_to { column: 28 row: 31 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 26 row: 31 } - pos_to { column: 28 row: 31 } - } - } - } - args { - ty_var { - var_name { - name: "a" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 29 row: 31 } - pos_to { column: 30 row: 31 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 26 row: 31 } - pos_to { column: 30 row: 31 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 31 } - pos_to { column: 30 row: 31 } - } - } - instances { - head { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 35 } - pos_to { column: 12 row: 35 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 35 } - pos_to { column: 12 row: 35 } - } - } - } - args { - ty_app { - ty_func { - ty_ref { - local_ty_ref { - ty_name { - name: "Either" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 14 row: 35 } - pos_to { column: 20 row: 35 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 14 row: 35 } - pos_to { column: 20 row: 35 } - } - } - } - } - ty_args { - ty_var { - var_name { - name: "a" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 21 row: 35 } - pos_to { column: 22 row: 35 } - } - } - } - } - ty_args { - ty_var { - var_name { - name: "b" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 23 row: 35 } - pos_to { column: 24 row: 35 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 24 row: 35 } - pos_to { column: 24 row: 35 } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 35 } - pos_to { column: 26 row: 35 } - } - } - constraints { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 29 row: 35 } - pos_to { column: 31 row: 35 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 29 row: 35 } - pos_to { column: 31 row: 35 } - } - } - } - args { - ty_var { - var_name { - name: "a" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 32 row: 35 } - pos_to { column: 33 row: 35 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 29 row: 35 } - pos_to { column: 33 row: 35 } - } - } - constraints { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 34 row: 35 } - pos_to { column: 36 row: 35 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 34 row: 35 } - pos_to { column: 36 row: 35 } - } - } - } - args { - ty_var { - var_name { - name: "b" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 37 row: 35 } - pos_to { column: 38 row: 35 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 34 row: 35 } - pos_to { column: 38 row: 35 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 35 } - pos_to { column: 38 row: 35 } - } - } - instances { - head { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 39 } - pos_to { column: 12 row: 39 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 39 } - pos_to { column: 12 row: 39 } - } - } - } - args { - ty_app { - ty_func { - ty_ref { - local_ty_ref { - ty_name { - name: "List" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 14 row: 39 } - pos_to { column: 18 row: 39 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 14 row: 39 } - pos_to { column: 18 row: 39 } - } - } - } - } - ty_args { - ty_var { - var_name { - name: "a" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 19 row: 39 } - pos_to { column: 20 row: 39 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 20 row: 39 } - pos_to { column: 20 row: 39 } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 39 } - pos_to { column: 22 row: 39 } - } - } - constraints { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 25 row: 39 } - pos_to { column: 27 row: 39 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 25 row: 39 } - pos_to { column: 27 row: 39 } - } - } - } - args { - ty_var { - var_name { - name: "a" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 28 row: 39 } - pos_to { column: 29 row: 39 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 25 row: 39 } - pos_to { column: 29 row: 39 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 39 } - pos_to { column: 29 row: 39 } - } - } - instances { - head { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 43 } - pos_to { column: 12 row: 43 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 43 } - pos_to { column: 12 row: 43 } - } - } - } - args { - ty_app { - ty_func { - ty_ref { - local_ty_ref { - ty_name { - name: "Map" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 14 row: 43 } - pos_to { column: 17 row: 43 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 14 row: 43 } - pos_to { column: 17 row: 43 } - } - } - } - } - ty_args { - ty_var { - var_name { - name: "a" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 18 row: 43 } - pos_to { column: 19 row: 43 } - } - } - } - } - ty_args { - ty_var { - var_name { - name: "b" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 20 row: 43 } - pos_to { column: 21 row: 43 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 21 row: 43 } - pos_to { column: 21 row: 43 } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 43 } - pos_to { column: 23 row: 43 } - } - } - constraints { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 26 row: 43 } - pos_to { column: 28 row: 43 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 26 row: 43 } - pos_to { column: 28 row: 43 } - } - } - } - args { - ty_var { - var_name { - name: "a" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 29 row: 43 } - pos_to { column: 30 row: 43 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 26 row: 43 } - pos_to { column: 30 row: 43 } - } - } - constraints { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 31 row: 43 } - pos_to { column: 33 row: 43 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 31 row: 43 } - pos_to { column: 33 row: 43 } - } - } - } - args { - ty_var { - var_name { - name: "b" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 34 row: 43 } - pos_to { column: 35 row: 43 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 31 row: 43 } - pos_to { column: 35 row: 43 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 43 } - pos_to { column: 35 row: 43 } - } - } - instances { - head { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 47 } - pos_to { column: 12 row: 47 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 47 } - pos_to { column: 12 row: 47 } - } - } - } - args { - ty_app { - ty_func { - ty_ref { - local_ty_ref { - ty_name { - name: "Set" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 14 row: 47 } - pos_to { column: 17 row: 47 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 14 row: 47 } - pos_to { column: 17 row: 47 } - } - } - } - } - ty_args { - ty_var { - var_name { - name: "a" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 18 row: 47 } - pos_to { column: 19 row: 47 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 19 row: 47 } - pos_to { column: 19 row: 47 } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 10 row: 47 } - pos_to { column: 21 row: 47 } - } - } - constraints { - class_ref { - local_class_ref { - class_name { - name: "Eq" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 24 row: 47 } - pos_to { column: 26 row: 47 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 24 row: 47 } - pos_to { column: 26 row: 47 } - } - } - } - args { - ty_var { - var_name { - name: "a" - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 27 row: 47 } - pos_to { column: 28 row: 47 } - } - } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 24 row: 47 } - pos_to { column: 28 row: 47 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 47 } - pos_to { column: 28 row: 47 } - } - } - source_info { - file: "goldens/good/Prelude.lbf" - pos_from { column: 1 row: 1 } - pos_to { column: 28 row: 47 } - } -} \ No newline at end of file diff --git a/lambda-buffers-frontend/data/goldens/good/work-dir/compiler-output.textproto b/lambda-buffers-frontend/data/goldens/good/work-dir/compiler-output.textproto deleted file mode 100644 index 1b92f1cb..00000000 --- a/lambda-buffers-frontend/data/goldens/good/work-dir/compiler-output.textproto +++ /dev/null @@ -1 +0,0 @@ -result { } \ No newline at end of file diff --git a/lambda-buffers-frontend/data/good/work-dir/compiler-input.textproto b/lambda-buffers-frontend/data/good/work-dir/compiler-input.textproto deleted file mode 100644 index c5d2054b..00000000 --- a/lambda-buffers-frontend/data/good/work-dir/compiler-input.textproto +++ /dev/null @@ -1,858 +0,0 @@ -modules { - module_name { - parts { - name: "A" - source_info { - file: "good/A.lbf" - pos_from { column: 8 row: 1 } - pos_to { column: 9 row: 1 } - } - } - source_info { - file: "good/A.lbf" - pos_from { column: 8 row: 1 } - pos_to { column: 9 row: 1 } - } - } - type_defs { - ty_name { - name: "A" - source_info { - file: "good/A.lbf" - pos_from { column: 5 row: 3 } - pos_to { column: 6 row: 3 } - } - } - ty_abs { - ty_body { - sum { - constructors { - constr_name { - name: "MkA" - source_info { - file: "good/A.lbf" - pos_from { column: 9 row: 3 } - pos_to { column: 12 row: 3 } - } - } - product { - source_info { - file: "good/A.lbf" - pos_from { column: 12 row: 3 } - pos_to { column: 12 row: 3 } - } - } - } - source_info { - file: "good/A.lbf" - pos_from { column: 9 row: 3 } - pos_to { column: 12 row: 3 } - } - } - } - } - source_info { - file: "good/A.lbf" - pos_from { column: 1 row: 3 } - pos_to { column: 12 row: 3 } - } - } - source_info { - file: "good/A.lbf" - pos_from { column: 1 row: 1 } - pos_to { column: 12 row: 3 } - } -} -modules { - module_name { - parts { - name: "A" - source_info { - file: "good/A/B.lbf" - pos_from { column: 8 row: 1 } - pos_to { column: 9 row: 1 } - } - } - parts { - name: "B" - source_info { - file: "good/A/B.lbf" - pos_from { column: 10 row: 1 } - pos_to { column: 11 row: 1 } - } - } - source_info { - file: "good/A/B.lbf" - pos_from { column: 8 row: 1 } - pos_to { column: 11 row: 1 } - } - } - type_defs { - ty_name { - name: "A" - source_info { - file: "good/A/B.lbf" - pos_from { column: 5 row: 3 } - pos_to { column: 6 row: 3 } - } - } - ty_abs { - ty_body { - sum { - constructors { - constr_name { - name: "MkA" - source_info { - file: "good/A/B.lbf" - pos_from { column: 9 row: 3 } - pos_to { column: 12 row: 3 } - } - } - product { - source_info { - file: "good/A/B.lbf" - pos_from { column: 12 row: 3 } - pos_to { column: 12 row: 3 } - } - } - } - source_info { - file: "good/A/B.lbf" - pos_from { column: 9 row: 3 } - pos_to { column: 12 row: 3 } - } - } - } - } - source_info { - file: "good/A/B.lbf" - pos_from { column: 1 row: 3 } - pos_to { column: 12 row: 3 } - } - } - source_info { - file: "good/A/B.lbf" - pos_from { column: 1 row: 1 } - pos_to { column: 12 row: 3 } - } -} -modules { - module_name { - parts { - name: "B" - source_info { - file: "good/B.lbf" - pos_from { column: 8 row: 1 } - pos_to { column: 9 row: 1 } - } - } - source_info { - file: "good/B.lbf" - pos_from { column: 8 row: 1 } - pos_to { column: 9 row: 1 } - } - } - type_defs { - ty_name { - name: "A" - source_info { - file: "good/B.lbf" - pos_from { column: 5 row: 3 } - pos_to { column: 6 row: 3 } - } - } - ty_abs { - ty_body { - sum { - constructors { - constr_name { - name: "MkA" - source_info { - file: "good/B.lbf" - pos_from { column: 9 row: 3 } - pos_to { column: 12 row: 3 } - } - } - product { - source_info { - file: "good/B.lbf" - pos_from { column: 12 row: 3 } - pos_to { column: 12 row: 3 } - } - } - } - source_info { - file: "good/B.lbf" - pos_from { column: 9 row: 3 } - pos_to { column: 12 row: 3 } - } - } - } - } - source_info { - file: "good/B.lbf" - pos_from { column: 1 row: 3 } - pos_to { column: 12 row: 3 } - } - } - source_info { - file: "good/B.lbf" - pos_from { column: 1 row: 1 } - pos_to { column: 12 row: 3 } - } -} -modules { - module_name { - parts { - name: "C" - source_info { - file: "good/C.lbf" - pos_from { column: 8 row: 1 } - pos_to { column: 9 row: 1 } - } - } - source_info { - file: "good/C.lbf" - pos_from { column: 8 row: 1 } - pos_to { column: 9 row: 1 } - } - } - type_defs { - ty_name { - name: "A" - source_info { - file: "good/C.lbf" - pos_from { column: 5 row: 3 } - pos_to { column: 6 row: 3 } - } - } - ty_abs { - ty_body { - sum { - constructors { - constr_name { - name: "MkA" - source_info { - file: "good/C.lbf" - pos_from { column: 9 row: 3 } - pos_to { column: 12 row: 3 } - } - } - product { - source_info { - file: "good/C.lbf" - pos_from { column: 12 row: 3 } - pos_to { column: 12 row: 3 } - } - } - } - source_info { - file: "good/C.lbf" - pos_from { column: 9 row: 3 } - pos_to { column: 12 row: 3 } - } - } - } - } - source_info { - file: "good/C.lbf" - pos_from { column: 1 row: 3 } - pos_to { column: 12 row: 3 } - } - } - source_info { - file: "good/C.lbf" - pos_from { column: 1 row: 1 } - pos_to { column: 12 row: 3 } - } -} -modules { - module_name { - parts { - name: "Test" - source_info { - file: "good/Test.lbf" - pos_from { column: 8 row: 1 } - pos_to { column: 12 row: 1 } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 8 row: 1 } - pos_to { column: 12 row: 1 } - } - } - type_defs { - ty_name { - name: "Maybe" - source_info { - file: "good/Test.lbf" - pos_from { column: 5 row: 11 } - pos_to { column: 10 row: 11 } - } - } - ty_abs { - ty_args { - arg_name { name: "a" } - arg_kind { kind_ref: KIND_REF_TYPE } - source_info { - file: "good/Test.lbf" - pos_from { column: 11 row: 11 } - pos_to { column: 12 row: 11 } - } - } - ty_body { - sum { - constructors { - constr_name { - name: "Just" - source_info { - file: "good/Test.lbf" - pos_from { column: 15 row: 11 } - pos_to { column: 19 row: 11 } - } - } - product { - fields { - ty_var { - var_name { - name: "a" - source_info { - file: "good/Test.lbf" - pos_from { column: 20 row: 11 } - pos_to { column: 21 row: 11 } - } - } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 20 row: 11 } - pos_to { column: 22 row: 11 } - } - } - } - constructors { - constr_name { - name: "Nothing" - source_info { - file: "good/Test.lbf" - pos_from { column: 24 row: 11 } - pos_to { column: 31 row: 11 } - } - } - product { - source_info { - file: "good/Test.lbf" - pos_from { column: 31 row: 11 } - pos_to { column: 31 row: 11 } - } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 15 row: 11 } - pos_to { column: 31 row: 11 } - } - } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 1 row: 11 } - pos_to { column: 31 row: 11 } - } - } - type_defs { - ty_name { - name: "Either" - source_info { - file: "good/Test.lbf" - pos_from { column: 5 row: 13 } - pos_to { column: 11 row: 13 } - } - } - ty_abs { - ty_args { - arg_name { name: "a" } - arg_kind { kind_ref: KIND_REF_TYPE } - source_info { - file: "good/Test.lbf" - pos_from { column: 12 row: 13 } - pos_to { column: 13 row: 13 } - } - } - ty_args { - arg_name { name: "b" } - arg_kind { kind_ref: KIND_REF_TYPE } - source_info { - file: "good/Test.lbf" - pos_from { column: 14 row: 13 } - pos_to { column: 15 row: 13 } - } - } - ty_body { - sum { - constructors { - constr_name { - name: "Left" - source_info { - file: "good/Test.lbf" - pos_from { column: 18 row: 13 } - pos_to { column: 22 row: 13 } - } - } - product { - fields { - ty_var { - var_name { - name: "a" - source_info { - file: "good/Test.lbf" - pos_from { column: 23 row: 13 } - pos_to { column: 24 row: 13 } - } - } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 23 row: 13 } - pos_to { column: 25 row: 13 } - } - } - } - constructors { - constr_name { - name: "Right" - source_info { - file: "good/Test.lbf" - pos_from { column: 27 row: 13 } - pos_to { column: 32 row: 13 } - } - } - product { - fields { - ty_var { - var_name { - name: "b" - source_info { - file: "good/Test.lbf" - pos_from { column: 33 row: 13 } - pos_to { column: 34 row: 13 } - } - } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 33 row: 13 } - pos_to { column: 34 row: 13 } - } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 18 row: 13 } - pos_to { column: 34 row: 13 } - } - } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 1 row: 13 } - pos_to { column: 34 row: 13 } - } - } - type_defs { - ty_name { - name: "List" - source_info { - file: "good/Test.lbf" - pos_from { column: 5 row: 15 } - pos_to { column: 9 row: 15 } - } - } - ty_abs { - ty_args { - arg_name { name: "a" } - arg_kind { kind_ref: KIND_REF_TYPE } - source_info { - file: "good/Test.lbf" - pos_from { column: 10 row: 15 } - pos_to { column: 11 row: 15 } - } - } - ty_body { - sum { - constructors { - constr_name { - name: "Nil" - source_info { - file: "good/Test.lbf" - pos_from { column: 14 row: 15 } - pos_to { column: 17 row: 15 } - } - } - product { - source_info { - file: "good/Test.lbf" - pos_from { column: 18 row: 15 } - pos_to { column: 18 row: 15 } - } - } - } - constructors { - constr_name { - name: "List" - source_info { - file: "good/Test.lbf" - pos_from { column: 20 row: 15 } - pos_to { column: 24 row: 15 } - } - } - product { - fields { - ty_var { - var_name { - name: "a" - source_info { - file: "good/Test.lbf" - pos_from { column: 25 row: 15 } - pos_to { column: 26 row: 15 } - } - } - } - } - fields { - ty_app { - ty_func { - ty_ref { - local_ty_ref { - ty_name { - name: "List" - source_info { - file: "good/Test.lbf" - pos_from { column: 28 row: 15 } - pos_to { column: 32 row: 15 } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 28 row: 15 } - pos_to { column: 32 row: 15 } - } - } - } - } - ty_args { - ty_var { - var_name { - name: "a" - source_info { - file: "good/Test.lbf" - pos_from { column: 33 row: 15 } - pos_to { column: 34 row: 15 } - } - } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 34 row: 15 } - pos_to { column: 34 row: 15 } - } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 25 row: 15 } - pos_to { column: 35 row: 15 } - } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 14 row: 15 } - pos_to { column: 35 row: 15 } - } - } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 1 row: 15 } - pos_to { column: 35 row: 15 } - } - } - type_defs { - ty_name { - name: "Int" - source_info { - file: "good/Test.lbf" - pos_from { column: 8 row: 17 } - pos_to { column: 11 row: 17 } - } - } - ty_abs { ty_body { opaque {} } } - source_info { - file: "good/Test.lbf" - pos_from { column: 1 row: 17 } - pos_to { column: 11 row: 17 } - } - } - type_defs { - ty_name { - name: "Bytes" - source_info { - file: "good/Test.lbf" - pos_from { column: 8 row: 19 } - pos_to { column: 13 row: 19 } - } - } - ty_abs { ty_body { opaque {} } } - source_info { - file: "good/Test.lbf" - pos_from { column: 1 row: 19 } - pos_to { column: 13 row: 19 } - } - } - type_defs { - ty_name { - name: "Foo" - source_info { - file: "good/Test.lbf" - pos_from { column: 5 row: 21 } - pos_to { column: 8 row: 21 } - } - } - ty_abs { - ty_args { - arg_name { name: "a" } - arg_kind { kind_ref: KIND_REF_TYPE } - source_info { - file: "good/Test.lbf" - pos_from { column: 9 row: 21 } - pos_to { column: 10 row: 21 } - } - } - ty_body { - sum { - constructors { - constr_name { - name: "MkFoo" - source_info { - file: "good/Test.lbf" - pos_from { column: 13 row: 21 } - pos_to { column: 18 row: 21 } - } - } - product { - fields { - ty_ref { - foreign_ty_ref { - ty_name { - name: "A" - source_info { - file: "good/Test.lbf" - pos_from { column: 19 row: 21 } - pos_to { column: 20 row: 21 } - } - } - module_name { - parts { name: "A" source_info { pos_from {} pos_to {} } } - source_info { pos_from {} pos_to {} } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 19 row: 21 } - pos_to { column: 20 row: 21 } - } - } - } - } - fields { - ty_ref { - foreign_ty_ref { - ty_name { - name: "A" - source_info { - file: "good/Test.lbf" - pos_from { column: 23 row: 21 } - pos_to { column: 24 row: 21 } - } - } - module_name { - parts { name: "A" source_info { pos_from {} pos_to {} } } - source_info { pos_from {} pos_to {} } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 21 row: 21 } - pos_to { column: 24 row: 21 } - } - } - } - } - fields { - ty_ref { - foreign_ty_ref { - ty_name { - name: "A" - source_info { - file: "good/Test.lbf" - pos_from { column: 27 row: 21 } - pos_to { column: 28 row: 21 } - } - } - module_name { - parts { name: "B" source_info { pos_from {} pos_to {} } } - source_info { pos_from {} pos_to {} } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 25 row: 21 } - pos_to { column: 28 row: 21 } - } - } - } - } - fields { - ty_ref { - foreign_ty_ref { - ty_name { - name: "A" - source_info { - file: "good/Test.lbf" - pos_from { column: 33 row: 21 } - pos_to { column: 34 row: 21 } - } - } - module_name { - parts { name: "A" source_info { pos_from {} pos_to {} } } - parts { name: "B" source_info { pos_from {} pos_to {} } } - source_info { pos_from {} pos_to {} } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 29 row: 21 } - pos_to { column: 34 row: 21 } - } - } - } - } - fields { - ty_ref { - foreign_ty_ref { - ty_name { - name: "A" - source_info { - file: "good/Test.lbf" - pos_from { column: 38 row: 21 } - pos_to { column: 39 row: 21 } - } - } - module_name { - parts { name: "A" source_info { pos_from {} pos_to {} } } - parts { name: "B" source_info { pos_from {} pos_to {} } } - source_info { pos_from {} pos_to {} } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 35 row: 21 } - pos_to { column: 39 row: 21 } - } - } - } - } - fields { - ty_ref { - foreign_ty_ref { - ty_name { - name: "A" - source_info { - file: "good/Test.lbf" - pos_from { column: 42 row: 21 } - pos_to { column: 43 row: 21 } - } - } - module_name { - parts { name: "C" source_info { pos_from {} pos_to {} } } - source_info { pos_from {} pos_to {} } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 40 row: 21 } - pos_to { column: 43 row: 21 } - } - } - } - } - fields { - ty_ref { - foreign_ty_ref { - ty_name { - name: "A" - source_info { - file: "good/Test.lbf" - pos_from { column: 46 row: 21 } - pos_to { column: 47 row: 21 } - } - } - module_name { - parts { name: "C" source_info { pos_from {} pos_to {} } } - source_info { pos_from {} pos_to {} } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 44 row: 21 } - pos_to { column: 47 row: 21 } - } - } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 19 row: 21 } - pos_to { column: 47 row: 21 } - } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 13 row: 21 } - pos_to { column: 47 row: 21 } - } - } - } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 1 row: 21 } - pos_to { column: 47 row: 21 } - } - } - imports { - parts { name: "A" source_info { pos_from {} pos_to {} } } - source_info { pos_from {} pos_to {} } - } - imports { - parts { name: "A" source_info { pos_from {} pos_to {} } } - parts { name: "B" source_info { pos_from {} pos_to {} } } - source_info { pos_from {} pos_to {} } - } - imports { - parts { name: "B" source_info { pos_from {} pos_to {} } } - source_info { pos_from {} pos_to {} } - } - imports { - parts { name: "C" source_info { pos_from {} pos_to {} } } - source_info { pos_from {} pos_to {} } - } - source_info { - file: "good/Test.lbf" - pos_from { column: 1 row: 1 } - pos_to { column: 47 row: 21 } - } -} diff --git a/lambda-buffers-frontend/data/good/work-dir/compiler-output.textproto b/lambda-buffers-frontend/data/good/work-dir/compiler-output.textproto deleted file mode 100644 index bd114145..00000000 --- a/lambda-buffers-frontend/data/good/work-dir/compiler-output.textproto +++ /dev/null @@ -1 +0,0 @@ -result {} diff --git a/lambda-buffers-frontend/data/run.sh b/lambda-buffers-frontend/data/run.sh index 1e3d26f8..02e3ad02 100755 --- a/lambda-buffers-frontend/data/run.sh +++ b/lambda-buffers-frontend/data/run.sh @@ -4,58 +4,68 @@ function lbf { } function lbf-build { - lbf build --compiler `which lbc` --debug $@ + DIR=$1 + lbf build --compiler `which lbc` --gen `which lbg-haskell` --debug --import-path $1 --gen-dir "$1/autogen" "$1/$2" +} + +function lbf-build2 { + DIR=$1 + lbf build --compiler `which lbc` --gen `which lbg-haskell` --debug --import-path $1 --gen-dir "$1/autogen" "$1/$2" } function lbf-form { lbf format -i -f $@ } -lbf-build -i duplicate_tydef -f duplicate_tydef/A.lbf -lbf-build -i import_cycle_found -f import_cycle_found/A.lbf -lbf-build -i imported_not_found -f imported_not_found/A.lbf -lbf-build -i invalid_module_filepath -f invalid_module_filepath/A.lbf -lbf-build -i module_not_found -f module_not_found/A.lbf -lbf-build -i module_parse_error -f module_parse_error/A.lbf -lbf-build -i multiple_modules_found -i multiple_modules_found/another_import_path -f multiple_modules_found/A.lbf -lbf-build -i symbol_already_imported -f symbol_already_imported/A.lbf -lbf-build -i tydef_name_conflict -f tydef_name_conflict/A.lbf -lbf-build -i tyref_not_found -f tyref_not_found/A.lbf - -lbf-build -w good/work-dir -i good -f good/Test.lbf +lbf-build duplicate_tydef A.lbf +lbf-build import_cycle_found A.lbf +lbf-build imported_not_found A.lbf +lbf-build invalid_module_filepath A.lbf +lbf-build module_not_found A.lbf +lbf-build module_parse_error A.lbf +lbf build --compiler `which lbc` --gen `which lbg-haskell` --debug \ + --import-path multiple_modules_found \ + --import-path multiple_modules_found/another_import_path \ + --gen-dir multiple_modules_found/autogen \ + multiple_modules_found/A.lbf +lbf-build symbol_already_imported A.lbf +lbf-build tydef_name_conflict A.lbf +lbf-build tyref_not_found A.lbf + +lbf-build good Test.lbf lbf-form good/Test.lbf -lbf-build -w good/work-dir -i good -f good/Test.lbf +lbf-build good Test.lbf echo "goldens/good/Prelude.lbf" -lbf-build -w goldens/good/work-dir -i goldens/good -f goldens/good/Prelude.lbf +lbf-build goldens/good Prelude.lbf lbf-form goldens/good/Prelude.lbf -lbf-build -w goldens/good/work-dir -i goldens/good -f goldens/good/Prelude.lbf +lbf-build goldens/good Prelude.lbf echo "goldens/good/PreludeT.lbf" -lbf-build -w goldens/good/work-dir -i goldens/good -f goldens/good/PreludeT.lbf +lbf-build goldens/good PreludeT.lbf lbf-form goldens/good/PreludeT.lbf -lbf-build -w goldens/good/work-dir -i goldens/good -f goldens/good/PreludeT.lbf +lbf-build goldens/good PreludeT.lbf echo "goldens/good/Plutus.lbf" -lbf-build -w goldens/good/work-dir -i goldens/good -f goldens/good/Plutus.lbf +lbf-build goldens/good Plutus.lbf echo "goldens/good/Plutus/V1.lbf" -lbf-build -w goldens/good/work-dir -i goldens/good -f goldens/good/Plutus/V1.lbf +lbf-build goldens/good Plutus/V1.lbf echo "goldens/good/Plutus/V2.lbf" -lbf-build -w goldens/good/work-dir -i goldens/good -f goldens/good/Plutus/V2.lbf +lbf-build goldens/good Plutus/V2.lbf echo "goldens/good/Coop.lbf" -lbf-build -w goldens/good/work-dir -i goldens/good -f goldens/good/Coop.lbf +lbf-build goldens/good Coop.lbf echo "goldens/good/Rules.lbf" -lbf-build -w goldens/good/work-dir -i goldens/good -f goldens/good/Rules.lbf +lbf-build goldens/good Rules.lbf lbf-form goldens/good/Rules.lbf -lbf-build -w goldens/good/work-dir -i goldens/good -f goldens/good/Rules.lbf +lbf-build goldens/good Rules.lbf echo "goldens/good/LambdaBuffers.lbf" -lbf-build -w goldens/good/work-dir -i goldens/good -f goldens/good/LambdaBuffers.lbf +lbf-build goldens/good LambdaBuffers.lbf lbf-form goldens/good/LambdaBuffers.lbf -lbf-build -w goldens/good/work-dir -i goldens/good -f goldens/good/LambdaBuffers.lbf +lbf-build goldens/good LambdaBuffers.lbf -# find goldens/ -name "*.lbf" | entr -p cabal run lbf -- compile --compiler `which lbc` --debug -w goldens/good/work-dir -i goldens/good -f /_ +# find goldens/ -name "*.lbf" | entr -p cabal run lbf -- compile --compiler `which lbc` --debug goldens/good /_ diff --git a/lambda-buffers-frontend/lambda-buffers-frontend.cabal b/lambda-buffers-frontend/lambda-buffers-frontend.cabal index 0373e871..56e48556 100644 --- a/lambda-buffers-frontend/lambda-buffers-frontend.cabal +++ b/lambda-buffers-frontend/lambda-buffers-frontend.cabal @@ -119,6 +119,7 @@ executable lbf build-depends: , base >=4.16 , bytestring >=0.11 + , directory , filepath >=1.4 , lambda-buffers-codegen-pb >=0.1 , lambda-buffers-compiler-pb >=0.1 diff --git a/lambda-buffers-frontend/src/LambdaBuffers/Frontend.hs b/lambda-buffers-frontend/src/LambdaBuffers/Frontend.hs index be2ba3b8..8eeb2b66 100644 --- a/lambda-buffers-frontend/src/LambdaBuffers/Frontend.hs +++ b/lambda-buffers-frontend/src/LambdaBuffers/Frontend.hs @@ -11,7 +11,7 @@ import Data.Text.IO qualified as Text import LambdaBuffers.Frontend.CheckReferences (checkReferences) import LambdaBuffers.Frontend.Errors (FrontendError) import LambdaBuffers.Frontend.Errors qualified as Errors -import LambdaBuffers.Frontend.Monad (FrontRead (FrontRead, current, importPaths, visited), FrontState (FrontState, importedModules), FrontendResult (FrontendResult), FrontendT, throwE') +import LambdaBuffers.Frontend.Monad (FrontRead (FrontRead, current, importPaths, visited), FrontState (FrontState, fstate'modules), FrontendResult (FrontendResult), FrontendT, throwE') import LambdaBuffers.Frontend.PPrint () import LambdaBuffers.Frontend.Parsec qualified as Parsec import LambdaBuffers.Frontend.Scope (addToClassScope, addToTyScope, collectImportedScope, collectLocalScope) @@ -20,24 +20,68 @@ import LambdaBuffers.Frontend.Utils (ClassScope, TyScope, strip) import System.Directory (findFiles) import System.FilePath (joinPath, (<.>)) --- | Run a Frontend compilation action on a "lbf" file, return the entire compilation closure or a frontend error. -runFrontend :: MonadIO m => [FilePath] -> FilePath -> m (Either FrontendError FrontendResult) -runFrontend importPaths modFp = do - let stM = runReaderT (processFile modFp) (FrontRead (ModuleName [] defSourceInfo) [] importPaths) +-- | `runFrontend importPaths modFps` processes all .lbf schemas specified in `modFps` files with `importPaths` directories. Returns modules that represent the entire compilation closure or a Frontend error. +runFrontend :: MonadIO m => [FilePath] -> [FilePath] -> m (Either FrontendError FrontendResult) +runFrontend importPaths modFps = do + let stM = runReaderT (processSchemas modFps) (FrontRead (ModuleName [] defSourceInfo) [] importPaths) exM = runStateT stM (FrontState mempty) - ioM = runExceptT exM - fmap (FrontendResult . importedModules . snd) <$> ioM + ioM <- runExceptT exM + case ioM of + Left err -> return $ Left err + Right (mods, fstate) -> return $ Right $ FrontendResult (fstate'modules fstate) (fmap (strip . moduleName) mods) +-- | `processSchemas modFps` traverses all .lbf schema filepaths in `modFps` and returns modules if successful. +processSchemas :: [FilePath] -> FrontendT m [Module SourceInfo] +processSchemas modFps = processSchema `traverse` modFps + +-- | `processSchema modFp` takes a single .lbf schema in `modFp`, parses it, validates it, and collects its type and class scope. If the module has already been processed it returns it from the cache. +processSchema :: FilePath -> FrontendT m (Module SourceInfo) +processSchema modFp = do + modContent <- liftIO $ Text.readFile modFp + m <- parseModule modFp modContent + checkModuleName modFp (moduleName m) + ims <- gets fstate'modules + case Map.lookup (strip $ moduleName m) ims of + Nothing -> processModule m + Just (m', _) -> return m' + +-- | 'checkModuleName modFp modName' checks whether the module filepath in `modFp` 'a/b/c/X/Y/Z.lbf' has the module name 'X.Y.Z' suffix (eq. ''X/Y/Z.lbf') +checkModuleName :: FilePath -> ModuleName SourceInfo -> FrontendT m () +checkModuleName fp mn = + let suffix = moduleNameToFilepath mn + in if suffix `isSuffixOf` fp + then return () + else throwE' $ Errors.InvalidModuleFilepath mn fp suffix + +-- | `processModule m` does heavy lifting as it processes imports which checks cycles and collects the scope. It also checks that all the references in the file are accounted for, whether by local or imported (foreign) class or type defs. +processModule :: Module SourceInfo -> FrontendT m (Module SourceInfo) +processModule m = local + ( \ir -> + ir + { current = moduleName m + , visited = (strip . current $ ir) : visited ir + } + ) + $ do + importedScope <- processImports m + localScope <- collectLocalScope m importedScope + let modScope = localScope <> importedScope + checkReferences m modScope + _ <- lift $ modify (FrontState . Map.insert (strip . moduleName $ m) (m, modScope) . fstate'modules) + return m + +-- | `moduleNameToFilepath m` makes a filepath for the module in `m` (eq. 'X.Y.Z' -> 'X/Y/Z.lbf'). moduleNameToFilepath :: ModuleName info -> FilePath moduleNameToFilepath (ModuleName parts _) = joinPath [unpack p | ModuleNamePart p _ <- parts] <.> "lbf" +-- | `checkCycle imp` checks whether the import in `imp` is a module that was already visited. checkCycle :: Import SourceInfo -> FrontendT m () checkCycle imp = do ms <- asks visited cm <- asks current when ((strip . importModuleName $ imp) `elem` ms) $ throwE' $ Errors.ImportCycleFound cm imp ms --- | `parseModule fp txt` parses a LambdaBuffers module with a specified filename `fp` (for reporting) and content in `txt`. +-- | `parseModule fp txt` parses a .lbf schema with a specified filename `fp` (for reporting) and content in `txt`. parseModule :: FilePath -> Text -> FrontendT m (Module SourceInfo) parseModule modFp modContent = do modOrErr <- liftIO $ Parsec.runParser Parsec.parseModule modFp modContent @@ -45,10 +89,11 @@ parseModule modFp modContent = do Left err -> throwE' $ Errors.ModuleParseError modFp err Right m -> return m +-- | `importModule imp` imports a module specified by the import statement in `imp`. It it already imported the module it takes it from the 'cache'. importModule :: Import SourceInfo -> FrontendT m (Module SourceInfo) importModule imp = do let modName = importModuleName imp - ims <- gets importedModules + ims <- gets fstate'modules case Map.lookup (strip modName) ims of Nothing -> do ips <- asks importPaths @@ -68,36 +113,7 @@ importModule imp = do throwE' $ Errors.MultipleModulesFound cm imp modFps Just (m, _) -> return m -processFile :: FilePath -> FrontendT m (Module SourceInfo) -processFile modFp = do - modContent <- liftIO $ Text.readFile modFp - m <- parseModule modFp modContent - checkModuleName modFp (moduleName m) - processModule m - -processModule :: Module SourceInfo -> FrontendT m (Module SourceInfo) -processModule m = local - ( \ir -> - ir - { current = moduleName m - , visited = (strip . current $ ir) : visited ir - } - ) - $ do - importedScope <- processImports m - localScope <- collectLocalScope m importedScope - let modScope = localScope <> importedScope - checkReferences m modScope - _ <- lift $ modify (FrontState . Map.insert (strip . moduleName $ m) (m, modScope) . importedModules) - return m - -checkModuleName :: FilePath -> ModuleName SourceInfo -> FrontendT m () -checkModuleName fp mn = - let suffix = moduleNameToFilepath mn - in if suffix `isSuffixOf` fp - then return () - else throwE' $ Errors.InvalidModuleFilepath mn fp suffix - +-- | `processImports m` process all import statements in module `m` and return the collected imported scope of types and classes. processImports :: Module SourceInfo -> FrontendT m (TyScope, ClassScope) processImports m = do (totalTyScope, totalClassScope) <- @@ -113,6 +129,7 @@ processImports m = do (moduleImports m) return (totalTyScope, totalClassScope) +-- | `processImport imp` process an import statements in `imp` and return the collected imported scope of types and classes. Checks for the cycle! processImport :: Import SourceInfo -> FrontendT m (TyScope, ClassScope) processImport imp = do checkCycle imp diff --git a/lambda-buffers-frontend/src/LambdaBuffers/Frontend/Errors/Frontend.hs b/lambda-buffers-frontend/src/LambdaBuffers/Frontend/Errors/Frontend.hs index faf99364..7e078739 100644 --- a/lambda-buffers-frontend/src/LambdaBuffers/Frontend/Errors/Frontend.hs +++ b/lambda-buffers-frontend/src/LambdaBuffers/Frontend/Errors/Frontend.hs @@ -39,11 +39,11 @@ data FrontendError deriving stock (Eq) instance Show FrontendError where - show (ModuleNotFound _cm imp impPaths) = showOneLine $ pretty (importInfo imp) <+> "Module" <+> pretty (importModuleName imp) <+> "not found in available import paths" <+> pretty impPaths - show (MultipleModulesFound _cm imp conflictingPaths) = showOneLine $ pretty (importInfo imp) <+> "Module" <+> pretty (importModuleName imp) <+> "found in multiple files" <+> pretty conflictingPaths - show (ImportCycleFound _cm imp visited) = showOneLine $ pretty (importInfo imp) <+> "Tried to load module" <+> pretty (importModuleName imp) <+> "which constitutes a cycle" <+> pretty visited + show (ModuleNotFound cm imp impPaths) = showOneLine $ prettyContext cm (importInfo imp) <+> "Module" <+> pretty (importModuleName imp) <+> "not found in available import paths" <+> pretty impPaths + show (MultipleModulesFound cm imp conflictingPaths) = showOneLine $ prettyContext cm (importInfo imp) <+> "Module" <+> pretty (importModuleName imp) <+> "found in multiple files" <+> pretty conflictingPaths + show (ImportCycleFound cm imp visited) = showOneLine $ prettyContext cm (importInfo imp) <+> "Tried to load module" <+> pretty (importModuleName imp) <+> "which constitutes a cycle" <+> pretty visited show (ModuleParseError _fp err) = showOneLine $ pretty err - show (InvalidModuleFilepath mn@(ModuleName _ info) gotModFp wantedFpSuffix) = showOneLine $ pretty info <+> "File name" <+> pretty gotModFp <+> "doesn't match module name" <+> pretty mn <+> "expected" <+> pretty wantedFpSuffix + show (InvalidModuleFilepath mn@(ModuleName _ info) gotModFp wantedFpSuffix) = showOneLine $ prettyContext mn info <+> "File name" <+> pretty gotModFp <+> "doesn't match module name" <+> pretty mn <+> "expected" <+> pretty wantedFpSuffix show (TyRefNotFound err) = showOneLine $ prettyTyRefNotFound err show (ClassRefNotFound err) = showOneLine $ prettyClassRefNotFound err show (ImportedNotFound err) = showOneLine $ prettyImportedNotFound err @@ -58,7 +58,7 @@ showOneLine :: Doc a -> String showOneLine d = (renderShowS . layoutPretty (defaultLayoutOptions {layoutPageWidth = Unbounded}) $ d) "" prettyContext :: ModuleName SourceInfo -> SourceInfo -> Doc ann -prettyContext currentModuleName sourceInfo = pretty sourceInfo <+> brackets (pretty currentModuleName) +prettyContext currentModuleName sourceInfo = brackets (pretty sourceInfo) <> brackets ("module" <+> pretty currentModuleName) data ImportedNotFound = MkImportedNotFound diff --git a/lambda-buffers-frontend/src/LambdaBuffers/Frontend/Errors/Utils.hs b/lambda-buffers-frontend/src/LambdaBuffers/Frontend/Errors/Utils.hs index 5a866d3a..466206a6 100644 --- a/lambda-buffers-frontend/src/LambdaBuffers/Frontend/Errors/Utils.hs +++ b/lambda-buffers-frontend/src/LambdaBuffers/Frontend/Errors/Utils.hs @@ -1,4 +1,4 @@ -module LambdaBuffers.Frontend.Errors.Utils (prettyClassRef, prettyTyRef, prettyKind, toSyntaxSourceInfo, prettyConstraint, prettyModuleName', prettyName', prettySourceInfo) where +module LambdaBuffers.Frontend.Errors.Utils (prettyClassRef, prettyTyRef, prettyKind, toSyntaxSourceInfo, prettyConstraint, prettyModuleName, prettyModuleName', prettyName', prettySourceInfo) where import Control.Lens ((^.)) import Data.ProtoLens.Field (HasField) diff --git a/lambda-buffers-frontend/src/LambdaBuffers/Frontend/Monad.hs b/lambda-buffers-frontend/src/LambdaBuffers/Frontend/Monad.hs index b8c87da9..44615988 100644 --- a/lambda-buffers-frontend/src/LambdaBuffers/Frontend/Monad.hs +++ b/lambda-buffers-frontend/src/LambdaBuffers/Frontend/Monad.hs @@ -18,12 +18,13 @@ data FrontRead = FrontRead deriving stock (Eq, Show) newtype FrontState = FrontState - { importedModules :: Map (ModuleName ()) (Module SourceInfo, (TyScope, ClassScope)) + { fstate'modules :: Map (ModuleName ()) (Module SourceInfo, (TyScope, ClassScope)) } deriving stock (Eq, Show) -newtype FrontendResult = FrontendResult - { processedModules :: Map (ModuleName ()) (Module SourceInfo, (TyScope, ClassScope)) +data FrontendResult = FrontendResult + { fres'modules :: Map (ModuleName ()) (Module SourceInfo, (TyScope, ClassScope)) + , fres'requested :: [ModuleName ()] } deriving stock (Eq, Show) diff --git a/lambda-buffers-frontend/src/LambdaBuffers/Frontend/PPrint.hs b/lambda-buffers-frontend/src/LambdaBuffers/Frontend/PPrint.hs index d380ae07..507e2234 100644 --- a/lambda-buffers-frontend/src/LambdaBuffers/Frontend/PPrint.hs +++ b/lambda-buffers-frontend/src/LambdaBuffers/Frontend/PPrint.hs @@ -9,7 +9,7 @@ module LambdaBuffers.Frontend.PPrint (prettyTyInner, prettyTyTopLevel) where import Data.List (sort) import Data.Text qualified as Text import LambdaBuffers.Frontend.Syntax (ClassConstraint (ClassConstraint), ClassDef (ClassDef), ClassName (ClassName), ClassRef (ClassRef), ConstrName (ConstrName), Constraint (Constraint), Constructor (Constructor), Derive (Derive), Field (Field), FieldName (FieldName), Import (Import), InstanceClause (InstanceClause), Module (Module), ModuleAlias (ModuleAlias), ModuleName (ModuleName), ModuleNamePart (ModuleNamePart), Name (Name), Product (Product), Record (Record), SourceInfo (SourceInfo), SourcePos (SourcePos), Statement (StClassDef, StDerive, StInstanceClause, StTyDef), Sum (Sum), Ty (TyApp, TyRef', TyVar), TyArg (TyArg), TyBody (Opaque, ProductBody, RecordBody, SumBody), TyDef (TyDef), TyName (TyName), TyRef (TyRef), VarName (VarName), kwClassDef, kwDerive, kwInstance, kwTyDefOpaque, tyBodyToTyDefKw) -import Prettyprinter (Doc, Pretty (pretty), align, colon, comma, concatWith, encloseSep, equals, group, hsep, lbrace, line, lparen, pipe, rbrace, rparen, sep, space, (<+>)) +import Prettyprinter (Doc, Pretty (pretty), align, brackets, colon, comma, concatWith, encloseSep, equals, group, hsep, lbrace, line, lparen, parens, pipe, rbrace, rparen, sep, space, (<+>)) import Text.Parsec qualified as Parsec import Text.Parsec.Error qualified as Parsec @@ -167,7 +167,7 @@ instance Pretty SourcePos where pretty (SourcePos r c) = pretty r <> ":" <> pretty c instance Pretty Parsec.ParseError where - pretty pe = pretty (Parsec.errorPos pe) <> ":" <> pretty (Parsec.showErrorMessages "or" "unknown parse error" "expecting" "unexpected" "end of input" $ Parsec.errorMessages pe) + pretty pe = brackets (pretty (Parsec.errorPos pe)) <+> pretty (Parsec.showErrorMessages "or" "unknown parse error" "expecting" "unexpected" "end of input" $ Parsec.errorMessages pe) instance Pretty Parsec.SourcePos where - pretty sp = pretty (Parsec.sourceName sp) <> ":" <> "(" <> pretty (Parsec.sourceLine sp) <> ":" <> pretty (Parsec.sourceColumn sp) <> ")" + pretty sp = pretty (Parsec.sourceName sp) <> ":" <> parens (pretty (Parsec.sourceLine sp) <> ":" <> pretty (Parsec.sourceColumn sp)) diff --git a/lambda-buffers-frontend/src/LambdaBuffers/Frontend/ToProto.hs b/lambda-buffers-frontend/src/LambdaBuffers/Frontend/ToProto.hs index b3589853..fb9c0618 100644 --- a/lambda-buffers-frontend/src/LambdaBuffers/Frontend/ToProto.hs +++ b/lambda-buffers-frontend/src/LambdaBuffers/Frontend/ToProto.hs @@ -50,7 +50,7 @@ data ToProtoError = MissingTyRef (TyRef SourceInfo) | MissingClassRef (ClassRef deriving stock (Show, Eq) toModules :: FrontendResult -> Either ToProtoError [Lang.Module] -toModules (FrontendResult modsWithScope) = +toModules (FrontendResult modsWithScope _requestedModuleNames) = for (Map.toList modsWithScope) ( \(modName, (m, scope)) -> do diff --git a/lambda-buffers-frontend/test/Test/LambdaBuffers/Frontend.hs b/lambda-buffers-frontend/test/Test/LambdaBuffers/Frontend.hs index cadca29c..4ab20342 100644 --- a/lambda-buffers-frontend/test/Test/LambdaBuffers/Frontend.hs +++ b/lambda-buffers-frontend/test/Test/LambdaBuffers/Frontend.hs @@ -28,62 +28,62 @@ frontendErrorTests dataDir = let workDir = dataDir "duplicate_tydef" fileIn = workDir "A.lbf" fileErr = fileIn - errOrMod <- runFrontend [workDir] fileIn - assertError (fileErr <> ":(5:1)-(5:12) [A] Duplicate type definition with the name A") errOrMod + errOrMod <- runFrontend [workDir] [fileIn] + assertError ("[" <> fileErr <> ":(5:1)-(5:12)][module A] Duplicate type definition with the name A") errOrMod , testCase "Import cycle found" $ do let workDir = dataDir "import_cycle_found" fileIn = workDir "A.lbf" fileErr = workDir "C.lbf" - errOrMod <- runFrontend [workDir] fileIn - assertError (fileErr <> ":(3:1)-(3:9) Tried to load module A which constitutes a cycle [B, A, ]") errOrMod + errOrMod <- runFrontend [workDir] [fileIn] + assertError ("[" <> fileErr <> ":(3:1)-(3:9)][module C] Tried to load module A which constitutes a cycle [B, A, ]") errOrMod , testCase "Imported symbol not found" $ do let workDir = dataDir "imported_not_found" fileIn = workDir "A.lbf" fileErr = fileIn - errOrMod <- runFrontend [workDir] fileIn - assertError (fileErr <> ":(3:17)-(3:18) [A] Name C not found in module B, did you mean one of the types: A B. Or did you mean one of the classes: ") errOrMod + errOrMod <- runFrontend [workDir] [fileIn] + assertError ("[" <> fileErr <> ":(3:17)-(3:18)][module A] Name C not found in module B, did you mean one of the types: A B. Or did you mean one of the classes: ") errOrMod , testCase "Invalid module filepath" $ do let workDir = dataDir "invalid_module_filepath" fileIn = workDir "A.lbf" fileErr = fileIn - errOrMod <- runFrontend [workDir] fileIn - assertError (fileErr <> ":(1:8)-(1:13) File name " <> dataDir <> "/invalid_module_filepath/A.lbf doesn't match module name A.B.C expected A/B/C.lbf") errOrMod + errOrMod <- runFrontend [workDir] [fileIn] + assertError ("[" <> fileErr <> ":(1:8)-(1:13)][module A.B.C] File name " <> dataDir <> "/invalid_module_filepath/A.lbf doesn't match module name A.B.C expected A/B/C.lbf") errOrMod , testCase "Module not found" $ do let workDir = dataDir "module_not_found" fileIn = workDir "A.lbf" fileErr = fileIn - errOrMod <- runFrontend [workDir] fileIn - assertError (fileErr <> ":(3:1)-(3:9) Module B not found in available import paths [" <> dataDir <> "/module_not_found]") errOrMod + errOrMod <- runFrontend [workDir] [fileIn] + assertError ("[" <> fileErr <> ":(3:1)-(3:9)][module A] Module B not found in available import paths [" <> dataDir <> "/module_not_found]") errOrMod , testCase "Module parse error" $ do let workDir = dataDir "module_parse_error" fileIn = workDir "A.lbf" fileErr = fileIn - errOrMod <- runFrontend [workDir] fileIn - assertError (fileErr <> ":(3:1):\nunexpected 't'\nexpecting lb new line, import statement, type definition, class definition, instance clause, derive statement, space or end of input") errOrMod + errOrMod <- runFrontend [workDir] [fileIn] + assertError ("[" <> fileErr <> ":(3:1)] \nunexpected 't'\nexpecting lb new line, import statement, type definition, class definition, instance clause, derive statement, space or end of input") errOrMod , testCase "Multiple modules found" $ do let workDir = dataDir "multiple_modules_found" fileIn = workDir "A.lbf" fileErr = fileIn - errOrMod <- runFrontend [workDir, workDir "another_import_path"] fileIn - assertError (fileErr <> ":(3:1)-(3:9) Module B found in multiple files [" <> dataDir <> "/multiple_modules_found/B.lbf, " <> dataDir <> "/multiple_modules_found/another_import_path/B.lbf]") errOrMod + errOrMod <- runFrontend [workDir, workDir "another_import_path"] [fileIn] + assertError ("[" <> fileErr <> ":(3:1)-(3:9)][module A] Module B found in multiple files [" <> dataDir <> "/multiple_modules_found/B.lbf, " <> dataDir <> "/multiple_modules_found/another_import_path/B.lbf]") errOrMod , testCase "Symbol already imported" $ do let workDir = dataDir "symbol_already_imported" fileIn = workDir "A.lbf" fileErr = fileIn - errOrMod <- runFrontend [workDir] fileIn - assertError (fileErr <> ":(4:1)-(4:9) [A] Type name A already imported from module B") errOrMod + errOrMod <- runFrontend [workDir] [fileIn] + assertError ("[" <> fileErr <> ":(4:1)-(4:9)][module A] Type name A already imported from module B") errOrMod , testCase "Type definition name conflict" $ do let workDir = dataDir "tydef_name_conflict" fileIn = workDir "A.lbf" fileErr = fileIn - errOrMod <- runFrontend [workDir] fileIn - assertError (fileErr <> ":(5:5)-(5:6) [A] Type name A conflicts with an imported type name from module B") errOrMod + errOrMod <- runFrontend [workDir] [fileIn] + assertError ("[" <> fileErr <> ":(5:5)-(5:6)][module A] Type name A conflicts with an imported type name from module B") errOrMod , testCase "Type reference not found" $ do let workDir = dataDir "tyref_not_found" fileIn = workDir "A.lbf" fileErr = fileIn - errOrMod <- runFrontend [workDir] fileIn - assertError (fileErr <> ":(6:13)-(6:28) [A] Type WhereIsThisType not found in the module's scope A B C B.B C.C") errOrMod + errOrMod <- runFrontend [workDir] [fileIn] + assertError ("[" <> fileErr <> ":(6:13)-(6:28)][module A] Type WhereIsThisType not found in the module's scope A B C B.B C.C") errOrMod ] assertError :: String -> Either FrontendError FrontendResult -> Assertion @@ -92,7 +92,7 @@ assertError _ (Right _) = assertFailure "Expected to fail but succeeded" assertSuccess :: [String] -> Either FrontendError FrontendResult -> Assertion assertSuccess _ (Left err) = assertFailure $ "Expected to succeed but failed with: " <> show err -assertSuccess expected (Right (FrontendResult mods)) = Set.fromList expected @?= Set.fromList (show . pretty <$> Map.keys mods) +assertSuccess expected (Right (FrontendResult mods _)) = Set.fromList expected @?= Set.fromList (show . pretty <$> Map.keys mods) frontendSuccessTests :: FilePath -> TestTree frontendSuccessTests dataDir = @@ -101,19 +101,19 @@ frontendSuccessTests dataDir = [ testCase "Good" $ do let workDir = dataDir "good" fileIn = workDir "Test.lbf" - errOrMod <- runFrontend [workDir] fileIn + errOrMod <- runFrontend [workDir] [fileIn] assertSuccess ["A", "A.B", "B", "C", "Test"] errOrMod , testGroup "Formatting" -- TODO(bladyjoker): Add Equality check on compiled inputs (Set semantics on imports, ty defs etc) [ testCase "BadFormat.lbf compiles" $ do let workDir = dataDir "formatting" fileIn = workDir "BadFormat.lbf" - errOrMod <- runFrontend [workDir] fileIn + errOrMod <- runFrontend [workDir] [fileIn] assertSuccess ["A", "BadFormat"] errOrMod , testCase "good/BadFormat.lbf also compiles" $ do let workDir = dataDir "formatting" "good" fileIn = workDir "BadFormat.lbf" - errOrMod' <- runFrontend [workDir] fileIn + errOrMod' <- runFrontend [workDir] [fileIn] assertSuccess ["A", "BadFormat"] errOrMod' ] ] @@ -125,6 +125,6 @@ goldenTests dataDir = [ testCase "Goldens" $ do let workDir = dataDir "goldens" "good" fileIn = workDir "LambdaBuffers.lbf" - errOrMod <- runFrontend [workDir] fileIn + errOrMod <- runFrontend [workDir] [fileIn] assertSuccess ["LambdaBuffers", "Prelude"] errOrMod ]