Skip to content
Snippets Groups Projects
Commit 4019d172 authored by Matthew Pickering's avatar Matthew Pickering
Browse files

Only munge internal dependencies when printing when there is no explicit syntax

* In `postProcessInternalDeps` the shadowing logic which existed prior
  to cabal format 3.4 is implemented in a post processing step.

  The algorithm there replaces any references to internal sublibraries
  with an explicit qualifier. For example if you write..

  ```
  library
    build-depends: foo

  library foo
    ...
  ```

  this is reinterpreted as

  ```
  library
    build-depends: mylib:foo

  library foo
    ...
  ```

* In `preProcessInternalDeps` the inverse transformation takes place,
  the goal is to replace `mylib:foo` with just `foo`.

* Things go wrong if you are using version 3.0 for your cabal file
  because
  - In 3.0 the qualifier syntax is introduced so you can be expliciit
    about sublibrary dependencies
  - The shadowing semantics of non-qualified dependencies still exists.

  So the situation is that the user is explicit about the sublibrary

  ```
  library

  library qux
    build-depends: mylib:{mylib, foo}

  library foo
  ```

  1. Post-process leaves this alone, the user is already explicit about
     depending on a sublibrary.
  2. Pre-processing then rewrites `mylib:{mylib, foo}` into two
     dependencies, `mylib` and `foo` (no qualifier).
  3. When parsed these are two separate dependencies rather than treated
     as one dependency, roundtrip test fails.

Solution: Only perform the reverse transformation when the cabal library
version is <= 3.0 and doesn't support the explicit syntax.

Now what happens in these two situations:

1. ```
   library
     build-depends: foo

   library foo
     ...
   ```

  this is reinterpreted as

  ```
  library
    build-depends: mylib:foo

  library foo
    ...
  ```

  then printed and parsed exactly the same way.

2. Explicit syntax is parsed and printed without being munged (when
   supported)

Note: Mixins only supported sublibrary qualifiers from 3.4 whilst
dependencies supported this from 3.0, hence the lack of guard on the
mixins case.

Fixes #10283
parent 54b48386
No related branches found
No related tags found
No related merge requests found
...@@ -271,7 +271,7 @@ preProcessInternalDeps specVer gpd ...@@ -271,7 +271,7 @@ preProcessInternalDeps specVer gpd
transformD :: Dependency -> [Dependency] transformD :: Dependency -> [Dependency]
transformD (Dependency pn vr ln) transformD (Dependency pn vr ln)
| pn == thisPn = | pn == thisPn && specVer < CabalSpecV3_0 =
if LMainLibName `NES.member` ln if LMainLibName `NES.member` ln
then Dependency thisPn vr mainLibSet : sublibs then Dependency thisPn vr mainLibSet : sublibs
else sublibs else sublibs
...@@ -282,9 +282,12 @@ preProcessInternalDeps specVer gpd ...@@ -282,9 +282,12 @@ preProcessInternalDeps specVer gpd
] ]
transformD d = [d] transformD d = [d]
-- Always perform transformation for mixins as syntax was only introduced in 3.4
-- This guard is uncessary as no transformations take place when cabalSpec >= CabalSpecV3_4 but
-- it more clearly signifies the intent. (See the specVer >= CabalSpecV3_4 line above).
transformM :: Mixin -> Mixin transformM :: Mixin -> Mixin
transformM (Mixin pn (LSubLibName uqn) inc) transformM (Mixin pn (LSubLibName uqn) inc)
| pn == thisPn = | pn == thisPn && specVer < CabalSpecV3_4 =
mkMixin (unqualComponentNameToPackageName uqn) LMainLibName inc mkMixin (unqualComponentNameToPackageName uqn) LMainLibName inc
transformM m = m transformM m = m
......
...@@ -6,7 +6,7 @@ library ...@@ -6,7 +6,7 @@ library
default-language: Haskell2010 default-language: Haskell2010
build-depends: build-depends:
base, base,
sublib issue:sublib
library sublib library sublib
default-language: Haskell2010 default-language: Haskell2010
...@@ -15,10 +15,10 @@ executable demo-a ...@@ -15,10 +15,10 @@ executable demo-a
main-is: Main.hs main-is: Main.hs
build-depends: build-depends:
issue, issue,
sublib issue:sublib
executable demo-b executable demo-b
main-is: Main.hs main-is: Main.hs
build-depends: build-depends:
issue, issue,
sublib issue:sublib
...@@ -290,7 +290,7 @@ runHackageTests opts ...@@ -290,7 +290,7 @@ runHackageTests opts
let let
-- See #10284 for why this value is pinned. -- See #10284 for why this value is pinned.
hackageTestsIndexState = "--index-state=2024-08-25" hackageTestsIndexState = "--index-state=2025-01-12"
hackageTest args = hackageTest args =
timedWithCwd timedWithCwd
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment