From af1bee7b821f89eca687f50f66e44ccb2bd7c6f1 Mon Sep 17 00:00:00 2001 From: Robin Krom Date: Tue, 9 Nov 2021 12:43:46 +0100 Subject: [PATCH] precondition lf conversion (#11538) * interfaces: lf conversion of preconditions This adds the LF conversion of preconditions from the desugared GHC code to Daml LF for preconditions. This depends on the corresponding patch of the GHC fork. CHANGELOG_BEGIN CHANGELOG_END * pin linux stackage snapshot * added a test CHANGELOG_BEGIN CHANGELOG_END * pinned linux stackage snapshot CHANGELOG_BEGIN CHANGELOG_END * additional InterfacePrecondition test this checks that that conjunction of all preconditions of intererfaces and templates is checked. CHANGELOG_BEGIN CHANGELOG_END * pin stackage snapshot * pin windows stackage snapshot * update compile.yml (again) * pin linux stack snapshot * fix InterfacePrecondition test * pin windows stackage --- ci/da-ghc-lib/compile.yml | 2 +- .../src/DA/Daml/LFConversion.hs | 19 ++- .../tests/daml-test-files/Interface.daml | 7 ++ .../daml-test-files/InterfaceDesugared.daml | 8 +- .../InterfacePrecondition.daml | 111 ++++++++++++++++++ stack-snapshot.yaml | 8 +- stackage_snapshot.json | 8 +- stackage_snapshot_windows.json | 8 +- 8 files changed, 156 insertions(+), 15 deletions(-) create mode 100644 compiler/damlc/tests/daml-test-files/InterfacePrecondition.daml diff --git a/ci/da-ghc-lib/compile.yml b/ci/da-ghc-lib/compile.yml index a089c1e73f3..033fda93ac4 100644 --- a/ci/da-ghc-lib/compile.yml +++ b/ci/da-ghc-lib/compile.yml @@ -12,7 +12,7 @@ jobs: variables: ghc-lib-sha: '42e5c306dcfbc84b83336fdd531023e93bfcc5b2' base-sha: '9c787d4d24f2b515934c8503ee2bbd7cfac4da20' - patches: 'e9abc24560f623c9c575d96a7a1a234927e042b2 833ca63be2ab14871874ccb6974921e8952802e9' + patches: 'a4a78867205bc453416f58f1d6dce470a0e39d61 833ca63be2ab14871874ccb6974921e8952802e9' flavor: 'ghc-8.8.1' steps: - checkout: self diff --git a/compiler/damlc/daml-lf-conversion/src/DA/Daml/LFConversion.hs b/compiler/damlc/daml-lf-conversion/src/DA/Daml/LFConversion.hs index 3f63096c3b1..17648ebb83e 100644 --- a/compiler/damlc/daml-lf-conversion/src/DA/Daml/LFConversion.hs +++ b/compiler/damlc/daml-lf-conversion/src/DA/Daml/LFConversion.hs @@ -173,6 +173,7 @@ data Env = Env -- packages does not cause performance issues. ,envLfVersion :: LF.Version ,envTemplateBinds :: MS.Map TypeConName TemplateBinds + ,envInterfaceBinds :: MS.Map TypeConName InterfaceBinds ,envExceptionBinds :: MS.Map TypeConName ExceptionBinds ,envChoiceData :: MS.Map TypeConName [ChoiceData] ,envImplements :: MS.Map TypeConName [GHC.TyCon] @@ -394,6 +395,18 @@ scrapeTemplateBinds binds = MS.filter (isJust . tbTyCon) $ MS.map ($ emptyTempla , hasDamlTemplateCtx tpl ] +data InterfaceBinds = InterfaceBinds + { ibEnsure :: Maybe (GHC.Expr Var) + } + +scrapeInterfaceBinds :: [(Var, GHC.Expr Var)] -> MS.Map TypeConName InterfaceBinds +scrapeInterfaceBinds binds = MS.fromList + [ ( mkTypeCon [getOccText (GHC.tyConName iface)] + , InterfaceBinds { ibEnsure = Just expr} ) + | (HasEnsureDFunId iface, expr) <- binds + , hasDamlInterfaceCtx iface + ] + data ExceptionBinds = ExceptionBinds { ebTyCon :: GHC.TyCon , ebMessage :: GHC.Expr Var @@ -439,10 +452,12 @@ convertInterfaces env tyThings = interfaceClasses convertInterface intName tyCon cls = do let intLocation = convNameLoc (GHC.tyConName tyCon) let intParam = this + let precond = fromMaybe (error $ "Missing precondition for interface " <> show intName) + $ (MS.lookup intName $ envInterfaceBinds env) >>= ibEnsure withRange intLocation $ do intMethods <- NM.fromList <$> mapM convertMethod (drop 4 $ classMethods cls) intFixedChoices <- convertChoices env intName emptyTemplateBinds - let intPrecondition = ETrue -- TODO (drsk) #11397 Implement interface preconditions + intPrecondition <- useSingleMethodDict env precond (`ETmApp` EVar intParam) pure DefInterface {..} convertMethod :: Var -> ConvertM InterfaceMethod @@ -537,6 +552,7 @@ convertModule lfVersion pkgMap stablePackages isGenerated file x depOrphanModule , ty@(TypeCon _ [_, TypeCon _ [TypeCon tplTy _]]) <- [varType name] ] templateBinds = scrapeTemplateBinds binds + interfaceBinds = scrapeInterfaceBinds binds exceptionBinds | lfVersion `supports` featureExceptions = scrapeExceptionBinds binds @@ -554,6 +570,7 @@ convertModule lfVersion pkgMap stablePackages isGenerated file x depOrphanModule , envInterfaces = interfaceCons , envInterfaceChoiceData = ifChoiceData , envTemplateBinds = templateBinds + , envInterfaceBinds = interfaceBinds , envExceptionBinds = exceptionBinds , envImplements = tplImplements , envInterfaceInstances = tplInterfaceInstances diff --git a/compiler/damlc/tests/daml-test-files/Interface.daml b/compiler/damlc/tests/daml-test-files/Interface.daml index 313bf347d9e..410db22e0a1 100644 --- a/compiler/damlc/tests/daml-test-files/Interface.daml +++ b/compiler/damlc/tests/daml-test-files/Interface.daml @@ -16,6 +16,8 @@ interface Token where transferImpl : Party -> Update (ContractId Token) noopImpl : () -> Update () + ensure (getAmount this >= 0) + choice Split : (ContractId Token, ContractId Token) with splitAmount : Int @@ -74,6 +76,11 @@ template Asset main = scenario do p <- getParty "Alice" + p `submitMustFail` do + create Asset with + issuer = p + owner = p + amount = -1 p `submit` do cidAsset1 <- create Asset with issuer = p diff --git a/compiler/damlc/tests/daml-test-files/InterfaceDesugared.daml b/compiler/damlc/tests/daml-test-files/InterfaceDesugared.daml index d2db392eba7..7d98b43ba49 100644 --- a/compiler/damlc/tests/daml-test-files/InterfaceDesugared.daml +++ b/compiler/damlc/tests/daml-test-files/InterfaceDesugared.daml @@ -37,6 +37,12 @@ instance HasSignatory Token where instance HasFetch Token where fetch = GHC.Types.primitive @"UFetchInterface" +instance DA.Internal.Desugar.HasEnsure Token where + ensure this + = DA.Internal.Desugar.True + where + _ = this + instance IsToken Token where toToken = GHC.Types.primitive @"EToInterface" fromToken = GHC.Types.primitive @"EFromInterface" @@ -184,7 +190,7 @@ instance HasSignatory Asset where signatory Asset{..} = [issuer, owner] instance HasEnsure Asset where - ensure _ = True + ensure this = getAmount this >= 0 instance HasAgreement Asset where agreement _ = "" diff --git a/compiler/damlc/tests/daml-test-files/InterfacePrecondition.daml b/compiler/damlc/tests/daml-test-files/InterfacePrecondition.daml new file mode 100644 index 00000000000..d9de7a8affe --- /dev/null +++ b/compiler/damlc/tests/daml-test-files/InterfacePrecondition.daml @@ -0,0 +1,111 @@ +-- Copyright (c) 2021 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 + +-- @SINCE-LF-FEATURE DAML_INTERFACE + +module InterfacePrecondition where + +interface Token1 where + getOwner1 : Party + getAmount1 : Int + splitImpl : Int -> Update (ContractId Token1, ContractId Token1) + transferImpl : Party -> Update (ContractId Token1) + + ensure (getAmount1 this >= 0 && getAmount1 this <= 7) + + choice Split : (ContractId Token1, ContractId Token1) + with + splitAmount : Int + controller getOwner1 this + do + splitImpl this splitAmount + + choice Transfer : ContractId Token1 + with + newOwner : Party + controller getOwner1 this, newOwner + do + transferImpl this newOwner + + +interface Token2 where + getOwner2 : Party + getAmount2 : Int + noopImpl : () -> Update () + + ensure (getAmount2 this >= 3 && getAmount2 this <= 10) + + nonconsuming choice Noop : () + with + nothing : () + controller getOwner2 this + do + noopImpl this nothing + +template Asset + with + issuer : Party + owner : Party + amount : Int + where + signatory issuer, owner + + ensure (amount >= 5 && amount <= 6) + + implements Token1 where + let getOwner1 = owner + let getAmount1 = amount + let splitImpl = \splitAmount -> do + assert (splitAmount < amount) + cid1 <- create this with amount = splitAmount + cid2 <- create this with amount = amount - splitAmount + pure (toToken1ContractId cid1, toToken1ContractId cid2) + let transferImpl = \newOwner -> do + cid <- create this with owner = newOwner + pure (toToken1ContractId cid) + + + implements Token2 where + let getOwner2 = owner + let getAmount2 = amount + let noopImpl = \nothing -> do + pure () + +main = scenario do + p <- getParty "Alice" + p `submitMustFail` do + create Asset with + issuer = p + owner = p + amount = -1 -- violates ensure of Token1 & Token2 & Asset + + p `submitMustFail` do + create Asset with + issuer = p + owner = p + amount = 1 -- violates ensure of Token2 && Asset + + p `submitMustFail` do + create Asset with + issuer = p + owner = p + amount = 3 -- violates ensure of Asset + + p `submitMustFail` do + create Asset with + issuer = p + owner = p + amount = 7 -- violates ensure of Asset + + p `submitMustFail` do + create Asset with + issuer = p + owner = p + amount = 8 -- violates ensure of Asset & Token2 + + p `submit` do + create Asset with + issuer = p + owner = p + amount = 5 -- works for Token1 & Token2 & Asset + pure () diff --git a/stack-snapshot.yaml b/stack-snapshot.yaml index e61de270b19..ee81c3390b7 100644 --- a/stack-snapshot.yaml +++ b/stack-snapshot.yaml @@ -3,10 +3,10 @@ resolver: lts-18.0 packages: - - archive: https://daml-binaries.da-ext.net/da-ghc-lib/ghc-lib-be4506a37225265fc1e0dab696b43c04.tar.gz - sha256: "4e0d25b83c965eb51386c62f59157bc064aa556497068ab2fde2a09d40137403" - - archive: https://daml-binaries.da-ext.net/da-ghc-lib/ghc-lib-parser-be4506a37225265fc1e0dab696b43c04.tar.gz - sha256: "ae2d9ace0d92346f3c25bfb4b47329e1d23a05ccfc72855002052fffe518fe3b" + - archive: https://daml-binaries.da-ext.net/da-ghc-lib/ghc-lib-f1468b856c4a52a7826bfc0c29dee4f4.tar.gz + sha256: "f939726fdc6dbe67db4aeac86b3f6bcd88997dcb5648dc0d7e7f221760074165" + - archive: https://daml-binaries.da-ext.net/da-ghc-lib/ghc-lib-parser-f1468b856c4a52a7826bfc0c29dee4f4.tar.gz + sha256: "fbbca516fc2f8fab9d3095cde1edb98d3f05af9ea2dfb927275ed745b394685c" - github: digital-asset/hlint commit: "c8246c1feb932858ff2b5d7e9e900068a974bf57" sha256: "3da24baf789c5f00211a92e24153e6b88102befaa946ada1f707935554500fe2" diff --git a/stackage_snapshot.json b/stackage_snapshot.json index c5082fe62b9..57d276bdb15 100644 --- a/stackage_snapshot.json +++ b/stackage_snapshot.json @@ -1,6 +1,6 @@ { - "__GENERATED_FILE_DO_NOT_MODIFY_MANUALLY": 1569617722, - "all-cabal-hashes": "https://raw.githubusercontent.com/commercialhaskell/all-cabal-hashes/a2d6c3907baf35bf093800454aad34fba00eb10c", + "__GENERATED_FILE_DO_NOT_MODIFY_MANUALLY": 952753112, + "all-cabal-hashes": "https://raw.githubusercontent.com/commercialhaskell/all-cabal-hashes/f54ac27a85d067a4f438deb45a321159713452c7", "resolved": { "Cabal": {"dependencies":[],"location":{"type":"core"},"name":"Cabal","version":"3.2.1.0"}, "Decimal": {"dependencies":["base","deepseq"],"location":{"type":"hackage","url":"https://hackage.haskell.org/package/Decimal-0.5.2/Decimal-0.5.2.tar.gz"},"name":"Decimal","pinned":{"url":["https://hackage.haskell.org/package/Decimal-0.5.2/Decimal-0.5.2.tar.gz","https://s3.amazonaws.com/hackage.fpcomplete.com/package/Decimal-0.5.2.tar.gz"],"sha256":"a37a0220424e4bcb8cae1d38844c7027ee314449758d0d14ff3e2e0a5c8a87a7","cabal-sha256":"83dd16a1c0737fd35fdb1088af36e1a53034e75090e3f0d4ad32296f1a35a13b"},"version":"0.5.2"}, @@ -100,8 +100,8 @@ "generic-deriving": {"dependencies":["base","containers","ghc-prim","template-haskell","th-abstraction"],"location":{"type":"hackage","url":"https://hackage.haskell.org/package/generic-deriving-1.14/generic-deriving-1.14.tar.gz"},"name":"generic-deriving","pinned":{"url":["https://hackage.haskell.org/package/generic-deriving-1.14/generic-deriving-1.14.tar.gz","https://s3.amazonaws.com/hackage.fpcomplete.com/package/generic-deriving-1.14.tar.gz"],"sha256":"d0abd5e423960b66867c6149c20b221b1351e3805d1bf787fc4efa3e7bb7cb02","cabal-sha256":"c9c6782a3cdce2f2bcaf891e0ffbf06df871e68498574b73a565771dc084273c"},"version":"1.14"}, "generics-sop": {"dependencies":["base","ghc-prim","sop-core","template-haskell","th-abstraction"],"location":{"type":"hackage","url":"https://hackage.haskell.org/package/generics-sop-0.5.1.1/generics-sop-0.5.1.1.tar.gz"},"name":"generics-sop","pinned":{"url":["https://hackage.haskell.org/package/generics-sop-0.5.1.1/generics-sop-0.5.1.1.tar.gz","https://s3.amazonaws.com/hackage.fpcomplete.com/package/generics-sop-0.5.1.1.tar.gz"],"sha256":"81b7c38b5c2a1ae3c790b1707a0e2a2031430e33b3683f88e2daa5b59ae4c5d8","cabal-sha256":"522a1a1da05d5acc03da448fa603c038cc15b991272846a591e26e7505d2b73a"},"version":"0.5.1.1"}, "ghc-byteorder": {"dependencies":["base"],"location":{"type":"hackage","url":"https://hackage.haskell.org/package/ghc-byteorder-4.11.0.0.10/ghc-byteorder-4.11.0.0.10.tar.gz"},"name":"ghc-byteorder","pinned":{"url":["https://hackage.haskell.org/package/ghc-byteorder-4.11.0.0.10/ghc-byteorder-4.11.0.0.10.tar.gz","https://s3.amazonaws.com/hackage.fpcomplete.com/package/ghc-byteorder-4.11.0.0.10.tar.gz"],"sha256":"86e50a89798181db4f44ec3848fc52940c73098e88549a351ceb54fefc691fb6","cabal-sha256":"e345720de7b28ba1bf434775d34d3b94da8e8dd5dc24469f008e1f82717c0352"},"version":"4.11.0.0.10"}, - "ghc-lib": {"dependencies":["alex","array","base","binary","bytestring","containers","deepseq","directory","filepath","ghc-lib-parser","ghc-prim","happy","hpc","pretty","process","rts","time","transformers","unix"],"location":{"type":"archive","url":"https://daml-binaries.da-ext.net/da-ghc-lib/ghc-lib-be4506a37225265fc1e0dab696b43c04.tar.gz"},"name":"ghc-lib","pinned":{"sha256":"4e0d25b83c965eb51386c62f59157bc064aa556497068ab2fde2a09d40137403","strip-prefix":"ghc-lib-8.8.1.20211103"},"version":"8.8.1.20211103"}, - "ghc-lib-parser": {"dependencies":["alex","array","base","binary","bytestring","containers","deepseq","directory","filepath","ghc-prim","happy","hpc","pretty","process","time","transformers","unix"],"location":{"type":"archive","url":"https://daml-binaries.da-ext.net/da-ghc-lib/ghc-lib-parser-be4506a37225265fc1e0dab696b43c04.tar.gz"},"name":"ghc-lib-parser","pinned":{"sha256":"ae2d9ace0d92346f3c25bfb4b47329e1d23a05ccfc72855002052fffe518fe3b","strip-prefix":"ghc-lib-parser-8.8.1.20211103"},"version":"8.8.1.20211103"}, + "ghc-lib": {"dependencies":["alex","array","base","binary","bytestring","containers","deepseq","directory","filepath","ghc-lib-parser","ghc-prim","happy","hpc","pretty","process","rts","time","transformers","unix"],"location":{"type":"archive","url":"https://daml-binaries.da-ext.net/da-ghc-lib/ghc-lib-f1468b856c4a52a7826bfc0c29dee4f4.tar.gz"},"name":"ghc-lib","pinned":{"sha256":"f939726fdc6dbe67db4aeac86b3f6bcd88997dcb5648dc0d7e7f221760074165","strip-prefix":"ghc-lib-8.8.1.20211108"},"version":"8.8.1.20211108"}, + "ghc-lib-parser": {"dependencies":["alex","array","base","binary","bytestring","containers","deepseq","directory","filepath","ghc-prim","happy","hpc","pretty","process","time","transformers","unix"],"location":{"type":"archive","url":"https://daml-binaries.da-ext.net/da-ghc-lib/ghc-lib-parser-f1468b856c4a52a7826bfc0c29dee4f4.tar.gz"},"name":"ghc-lib-parser","pinned":{"sha256":"fbbca516fc2f8fab9d3095cde1edb98d3f05af9ea2dfb927275ed745b394685c","strip-prefix":"ghc-lib-parser-8.8.1.20211108"},"version":"8.8.1.20211108"}, "ghc-lib-parser-ex": {"dependencies":["base","bytestring","containers","extra","ghc-lib-parser","uniplate"],"location":{"type":"hackage","url":"https://hackage.haskell.org/package/ghc-lib-parser-ex-8.8.5.8/ghc-lib-parser-ex-8.8.5.8.tar.gz"},"name":"ghc-lib-parser-ex","pinned":{"url":["https://hackage.haskell.org/package/ghc-lib-parser-ex-8.8.5.8/ghc-lib-parser-ex-8.8.5.8.tar.gz","https://s3.amazonaws.com/hackage.fpcomplete.com/package/ghc-lib-parser-ex-8.8.5.8.tar.gz"],"sha256":"b36ef8b49da4e8c78b00dca9b9546b7d4db0b09b10da5e313d3f0dbb4af581d7","cabal-sha256":"04f164fd6a4a5b0c5627cf7fadd79174c3b1d4c696dc481a9909266bd6a2a6aa"},"version":"8.8.5.8"}, "ghc-prim": {"dependencies":[],"location":{"type":"core"},"name":"ghc-prim","version":"0.6.1"}, "ghcide": {"dependencies":["aeson","async","base","binary","bytestring","containers","data-default","deepseq","dependent-map","dependent-sum","directory","extra","filepath","fuzzy","ghc-lib","ghc-lib-parser","haddock-library","hashable","hslogger","lsp","lsp-types","mtl","network-uri","prettyprinter","prettyprinter-ansi-terminal","regex-tdfa","rope-utf16-splay","safe-exceptions","shake","some","sorted-list","stm","syb","text","time","transformers","unix","unliftio","unordered-containers","utf8-string"],"location":{"type":"vendored"},"name":"ghcide","version":"0.1.0"}, diff --git a/stackage_snapshot_windows.json b/stackage_snapshot_windows.json index 03924efde52..e6fe628f88a 100644 --- a/stackage_snapshot_windows.json +++ b/stackage_snapshot_windows.json @@ -1,6 +1,6 @@ { - "__GENERATED_FILE_DO_NOT_MODIFY_MANUALLY": 1083519712, - "all-cabal-hashes": "https://raw.githubusercontent.com/commercialhaskell/all-cabal-hashes/a2d6c3907baf35bf093800454aad34fba00eb10c", + "__GENERATED_FILE_DO_NOT_MODIFY_MANUALLY": 2089110967, + "all-cabal-hashes": "https://raw.githubusercontent.com/commercialhaskell/all-cabal-hashes/97c141eb8342cb70c3944be892cc8cd98ef4886c", "resolved": { "Cabal": {"dependencies":[],"location":{"type":"core"},"name":"Cabal","version":"3.2.1.0"}, "Decimal": {"dependencies":["base","deepseq"],"location":{"type":"hackage","url":"https://hackage.haskell.org/package/Decimal-0.5.2/Decimal-0.5.2.tar.gz"},"name":"Decimal","pinned":{"url":["https://hackage.haskell.org/package/Decimal-0.5.2/Decimal-0.5.2.tar.gz","https://s3.amazonaws.com/hackage.fpcomplete.com/package/Decimal-0.5.2.tar.gz"],"sha256":"a37a0220424e4bcb8cae1d38844c7027ee314449758d0d14ff3e2e0a5c8a87a7","cabal-sha256":"83dd16a1c0737fd35fdb1088af36e1a53034e75090e3f0d4ad32296f1a35a13b"},"version":"0.5.2"}, @@ -101,8 +101,8 @@ "generic-deriving": {"dependencies":["base","containers","ghc-prim","template-haskell","th-abstraction"],"location":{"type":"hackage","url":"https://hackage.haskell.org/package/generic-deriving-1.14/generic-deriving-1.14.tar.gz"},"name":"generic-deriving","pinned":{"url":["https://hackage.haskell.org/package/generic-deriving-1.14/generic-deriving-1.14.tar.gz","https://s3.amazonaws.com/hackage.fpcomplete.com/package/generic-deriving-1.14.tar.gz"],"sha256":"d0abd5e423960b66867c6149c20b221b1351e3805d1bf787fc4efa3e7bb7cb02","cabal-sha256":"c9c6782a3cdce2f2bcaf891e0ffbf06df871e68498574b73a565771dc084273c"},"version":"1.14"}, "generics-sop": {"dependencies":["base","ghc-prim","sop-core","template-haskell","th-abstraction"],"location":{"type":"hackage","url":"https://hackage.haskell.org/package/generics-sop-0.5.1.1/generics-sop-0.5.1.1.tar.gz"},"name":"generics-sop","pinned":{"url":["https://hackage.haskell.org/package/generics-sop-0.5.1.1/generics-sop-0.5.1.1.tar.gz","https://s3.amazonaws.com/hackage.fpcomplete.com/package/generics-sop-0.5.1.1.tar.gz"],"sha256":"81b7c38b5c2a1ae3c790b1707a0e2a2031430e33b3683f88e2daa5b59ae4c5d8","cabal-sha256":"522a1a1da05d5acc03da448fa603c038cc15b991272846a591e26e7505d2b73a"},"version":"0.5.1.1"}, "ghc-byteorder": {"dependencies":["base"],"location":{"type":"hackage","url":"https://hackage.haskell.org/package/ghc-byteorder-4.11.0.0.10/ghc-byteorder-4.11.0.0.10.tar.gz"},"name":"ghc-byteorder","pinned":{"url":["https://hackage.haskell.org/package/ghc-byteorder-4.11.0.0.10/ghc-byteorder-4.11.0.0.10.tar.gz","https://s3.amazonaws.com/hackage.fpcomplete.com/package/ghc-byteorder-4.11.0.0.10.tar.gz"],"sha256":"86e50a89798181db4f44ec3848fc52940c73098e88549a351ceb54fefc691fb6","cabal-sha256":"e345720de7b28ba1bf434775d34d3b94da8e8dd5dc24469f008e1f82717c0352"},"version":"4.11.0.0.10"}, - "ghc-lib": {"dependencies":["Win32","alex","array","base","binary","bytestring","containers","deepseq","directory","filepath","ghc-lib-parser","ghc-prim","happy","hpc","pretty","process","rts","time","transformers"],"location":{"type":"archive","url":"https://daml-binaries.da-ext.net/da-ghc-lib/ghc-lib-be4506a37225265fc1e0dab696b43c04.tar.gz"},"name":"ghc-lib","pinned":{"sha256":"4e0d25b83c965eb51386c62f59157bc064aa556497068ab2fde2a09d40137403","strip-prefix":"ghc-lib-8.8.1.20211103"},"version":"8.8.1.20211103"}, - "ghc-lib-parser": {"dependencies":["Win32","alex","array","base","binary","bytestring","containers","deepseq","directory","filepath","ghc-prim","happy","hpc","pretty","process","time","transformers"],"location":{"type":"archive","url":"https://daml-binaries.da-ext.net/da-ghc-lib/ghc-lib-parser-be4506a37225265fc1e0dab696b43c04.tar.gz"},"name":"ghc-lib-parser","pinned":{"sha256":"ae2d9ace0d92346f3c25bfb4b47329e1d23a05ccfc72855002052fffe518fe3b","strip-prefix":"ghc-lib-parser-8.8.1.20211103"},"version":"8.8.1.20211103"}, + "ghc-lib": {"dependencies":["Win32","alex","array","base","binary","bytestring","containers","deepseq","directory","filepath","ghc-lib-parser","ghc-prim","happy","hpc","pretty","process","rts","time","transformers"],"location":{"type":"archive","url":"https://daml-binaries.da-ext.net/da-ghc-lib/ghc-lib-f1468b856c4a52a7826bfc0c29dee4f4.tar.gz"},"name":"ghc-lib","pinned":{"sha256":"f939726fdc6dbe67db4aeac86b3f6bcd88997dcb5648dc0d7e7f221760074165","strip-prefix":"ghc-lib-8.8.1.20211108"},"version":"8.8.1.20211108"}, + "ghc-lib-parser": {"dependencies":["Win32","alex","array","base","binary","bytestring","containers","deepseq","directory","filepath","ghc-prim","happy","hpc","pretty","process","time","transformers"],"location":{"type":"archive","url":"https://daml-binaries.da-ext.net/da-ghc-lib/ghc-lib-parser-f1468b856c4a52a7826bfc0c29dee4f4.tar.gz"},"name":"ghc-lib-parser","pinned":{"sha256":"fbbca516fc2f8fab9d3095cde1edb98d3f05af9ea2dfb927275ed745b394685c","strip-prefix":"ghc-lib-parser-8.8.1.20211108"},"version":"8.8.1.20211108"}, "ghc-lib-parser-ex": {"dependencies":["base","bytestring","containers","extra","ghc-lib-parser","uniplate"],"location":{"type":"hackage","url":"https://hackage.haskell.org/package/ghc-lib-parser-ex-8.8.5.8/ghc-lib-parser-ex-8.8.5.8.tar.gz"},"name":"ghc-lib-parser-ex","pinned":{"url":["https://hackage.haskell.org/package/ghc-lib-parser-ex-8.8.5.8/ghc-lib-parser-ex-8.8.5.8.tar.gz","https://s3.amazonaws.com/hackage.fpcomplete.com/package/ghc-lib-parser-ex-8.8.5.8.tar.gz"],"sha256":"b36ef8b49da4e8c78b00dca9b9546b7d4db0b09b10da5e313d3f0dbb4af581d7","cabal-sha256":"04f164fd6a4a5b0c5627cf7fadd79174c3b1d4c696dc481a9909266bd6a2a6aa"},"version":"8.8.5.8"}, "ghc-prim": {"dependencies":[],"location":{"type":"core"},"name":"ghc-prim","version":"0.6.1"}, "ghcide": {"dependencies":["aeson","async","base","binary","bytestring","containers","data-default","deepseq","dependent-map","dependent-sum","directory","extra","filepath","fuzzy","ghc-lib","ghc-lib-parser","haddock-library","hashable","hslogger","lsp","lsp-types","mtl","network-uri","prettyprinter","prettyprinter-ansi-terminal","regex-tdfa","rope-utf16-splay","safe-exceptions","shake","some","sorted-list","stm","syb","text","time","transformers","unliftio","unordered-containers","utf8-string"],"location":{"type":"vendored"},"name":"ghcide","version":"0.1.0"},