@@ -5,15 +5,16 @@ import qualified Data.List as List
5import qualified Data.Map as Map
5import qualified Data.Map as Map
6import qualified Data.Set as Set
6import qualified Data.Set as Set
7import qualified Data.Traversable as T
7import qualified Data.Traversable as T
8−import Text.Parsec ((<|>), choice, many, string)
8+import Text.Parsec ((<|>), choice, many, setPosition, string)
9+import Text.Parsec.Pos (newPos)
10import qualified AST.Variable as Var
11import qualified AST.Variable as Var
11import qualified Docs.AST as Docs
12import qualified Docs.AST as Docs
12import qualified Elm.Compiler.Type as Type
13import qualified Elm.Compiler.Type as Type
13import Elm.Utils ((|>))
14import Elm.Utils ((|>))
14import Parse.Helpers
15import Parse.Helpers
15− ( anyUntil, commaSep1, iParse, parens, simpleNewline, symOp, var
16+ ( addLocation, anyUntil, commaSep1, iParse, parens, simpleNewline, symOp
16− , whitespace
17+ , var, whitespace
18import qualified Reporting.Annotation as A
19import qualified Reporting.Annotation as A
19import qualified Reporting.Error.Docs as Error
20import qualified Reporting.Error.Docs as Error
@@ -40,11 +41,14 @@ checkHelp :: R.Region -> [Var.Value] -> Docs.Centralized -> Result w Docs.Checke
40checkHelp region exports (Docs.Docs comment aliases types values) =
41checkHelp region exports (Docs.Docs comment aliases types values) =
42 docNames =
43 docNames =
43− Set.fromList (commentedNames comment)
44+ commentedNames region comment
47+ Set.fromList (map A.drop docNames)
45 checkCategory checkValue dict =
49 checkCategory checkValue dict =
47− |> Map.filterWithKey (\key _ -> Set.member key docNames)
51+ |> Map.filterWithKey (\key _ -> Set.member key docSet)
48 |> Map.mapWithKey checkValue
52 |> Map.mapWithKey checkValue
49 |> T.traverse id
53 |> T.traverse id
@@ -77,15 +81,14 @@ checkUnion exportedUnions name value =
78filterUnionTags :: [(String, [String])] -> String -> A.Located Docs.Union -> Result w (A.Located Docs.Union)
82filterUnionTags :: [(String, [String])] -> String -> A.Located Docs.Union -> Result w (A.Located Docs.Union)
79filterUnionTags exportedUnions name (A.A region union@(Docs.Union _ _ ctors)) =
83filterUnionTags exportedUnions name (A.A region union@(Docs.Union _ _ ctors)) =
80− case List.lookup name exportedUnions of
86+ maybe [] id (List.lookup name exportedUnions)
82− R.throw region (Error.OnlyInExports name)
85− R.ok $ A.A region $ union
88+ R.ok $ A.A region $ union
86− { Docs.unionCases =
89+ { Docs.unionCases =
87− filter (\(tag, _) -> elem tag tags) ctors
90+ filter (\(tag, _) -> elem tag exportedTags) ctors
@@ -108,36 +111,53 @@ hasType name (A.A region value) =
109-- CHECK MODULE COMMENT
112-- CHECK MODULE COMMENT
111−checkModuleComment :: R.Region -> [Var.Value] -> Set.Set String -> Result w ()
114+checkModuleComment :: R.Region -> [Var.Value] -> [A.Located String] -> Result w ()
112−checkModuleComment region exports docNames =
115+checkModuleComment docRegion exports locatedDocNames =
114 exportNames =
117 exportNames =
115− Set.fromList (map valueName exports)
118+ Map.fromList (map (\v -> (valueName v, ())) exports)
118− Set.toList (Set.difference docNames exportNames)
120− onlyInExports =
120+ docNames =
121+ Map.fromList (map (\(A.A region name) -> (name, region)) locatedDocNames)
124+ Map.difference docNames exportNames
126+ |> T.traverse (\(name, region) -> R.throw region (Error.OnlyInDocs name))
128+ namesOnlyInExports =
121− Set.toList (Set.difference exportNames docNames)
129+ Map.difference exportNames docNames
134+ if null namesOnlyInExports then
137+ R.throw docRegion (Error.OnlyInExports namesOnlyInExports)
123 (\_ _ -> ())
139 (\_ _ -> ())
124− <$> T.traverse (R.throw region . Error.OnlyInDocs) onlyInDocs
140+ <$> docErrors
125− <*> T.traverse (R.throw region . Error.OnlyInExports) onlyInExports
141+ <*> exportErrors
128−commentedNames :: String -> [String]
144+commentedNames :: R.Region -> String -> [A.Located String]
129−commentedNames comment =
145+commentedNames (R.Region start _) comment =
131 nameParser =
147 nameParser =
133 [ do string "@docs"
149 [ do string "@docs"
134 whitespace
150 whitespace
135− commaSep1 (var <|> parens symOp)
151+ commaSep1 (addLocation (var <|> parens symOp))
136 , do anyUntil simpleNewline
152 , do anyUntil simpleNewline
137 return []
153 return []
157+ do setPosition (newPos "docs" (R.line start) (R.column start + 3))
158+ concat <$> many nameParser
140− case iParse (concat <$> many nameParser) comment of
160+ case iParse docCommentParser comment of
141 Left _ ->
161 Left _ ->