@@ -15,12 +15,15 @@ import Data.Maybe (Maybe(..), fromMaybe)
1515import Data.Newtype (unwrap )
1616import Data.String as String
1717import Data.Traversable (traverse )
18+ import Data.Tuple (Tuple (..))
1819import Registry.Docgen.Docs (DataConstructorName (..), DocChildDeclaration (..), DocChildDeclarationInfo (..), DocConstraint (..), DocDeclaration (..), DocDeclarationInfo (..), DocModule (..), DocPackage (..), DocReexport (..), DocType (..), ForallBinding (..), FunDep (..), Ident (..), InfixAlias (..), IntLiteral (..), ModuleName (..), OperatorName (..), Qualified (..), RawRange (..), Readme , RowLabel (..), RowRep , SourceArtifact , SourceSpan (..), StringLiteral , TypeName (..), TypeVar (..), ValueName (..), isPrim , schemaVersion )
1920import Registry.Docgen.Legacy.Docs (InPackage (..))
2021import Registry.Docgen.Legacy.Docs as L
2122import Registry.LimitedString as LimitedString
2223import Registry.Manifest (Manifest (..))
24+ import Registry.PackageName (PackageName )
2325import Registry.PackageName as PackageName
26+ import Registry.Range (Range )
2427import Registry.Range as Range
2528import Registry.Version as Version
2629import Safe.Coerce (coerce )
@@ -35,13 +38,14 @@ fromLegacyPackage
3538 }
3639 -> L.DocPackage
3740 -> Either String DocPackage
38- fromLegacyPackage input (L.DocPackage pkg@{ packageMeta: L.DocPackageMeta meta }) = do
39- let Manifest manifest = input.manifest
41+ fromLegacyPackage input@{ manifest: Manifest manifest } (L.DocPackage pkg@{ packageMeta: L.DocPackageMeta meta }) = do
4042 if meta.name /= manifest.name then
4143 Left $ " Legacy documentation package " <> PackageName .print meta.name <> " does not match manifest package " <> PackageName .print manifest.name
4244 else if pkg.version /= manifest.version then
4345 Left $ " Legacy documentation version " <> Version .print pkg.version <> " does not match manifest version " <> Version .print manifest.version
4446 else do
47+ _ <- traverse validateDependency (Map .toUnfoldable manifest.dependencies :: Array (Tuple PackageName Range ))
48+ _ <- traverse validateModuleOwner (Map .toUnfoldable pkg.moduleMap :: Array (Tuple ModuleName PackageName ))
4549 compilerVersion <- Version .parse pkg.compilerVersion
4650 modules <- traverse convertModule pkg.modules
4751 pure $ DocPackage
@@ -61,6 +65,18 @@ fromLegacyPackage input (L.DocPackage pkg@{ packageMeta: L.DocPackageMeta meta }
6165 , version: manifest.version
6266 }
6367 where
68+ validateDependency (Tuple dependency range) = case Map .lookup dependency pkg.resolvedDependencies of
69+ Nothing ->
70+ Left $ " Legacy documentation is missing an exact resolution for manifest dependency " <> PackageName .print dependency
71+ Just resolved | not (Range .includes range resolved) ->
72+ Left $ " Legacy documentation resolves " <> PackageName .print dependency <> " @" <> Version .print resolved <> " outside manifest range " <> Range .print range
73+ Just _ ->
74+ Right unit
75+
76+ validateModuleOwner (Tuple moduleName owner)
77+ | owner == manifest.name || Map .member owner pkg.resolvedDependencies = Right unit
78+ | otherwise = Left $ " Legacy documentation attributes module " <> unwrap moduleName <> " to unresolved package " <> PackageName .print owner
79+
6480 convertModule legacy@(L.DocModule { name })
6581 | isPrim name = Right $ fromLegacyModule sourcePaths legacy
6682 | otherwise = case Map .lookup name sourcePaths of
0 commit comments