@@ -19,31 +19,44 @@ main = do
19 Left err -> putStrLn err >> exitFailure
19 Left err -> putStrLn err >> exitFailure
20 Right ms -> putStrLn (toModules ms)
20 Right ms -> putStrLn (toModules ms)
22−toModules ms =
22+toModules ms = wrap (intercalate ",\n " (map toModule ms))
23− "{ \"modules\" : [\n " ++ intercalate ",\n " (map toModule ms) ++ "\n ]\n}"
23+ where wrap s = "{ \"modules\" : [\n " ++ s ++ "\n ]\n}"
25toModule (name, values) =
25toModule (name, values) =
26− "{ \"name\" : " ++ show name ++ ",\n \"values\" : [\n " ++ vs ++ "\n ]\n }"
26+ "{ \"name\" : " ++ show name ++ ",\n " ++
27+ "\"values\" : [\n " ++ vs ++ "\n ]\n }"
27− where vs = intercalate ",\n " (map toValue values)
28+ where vs = intercalate ",\n " (map toValue values)
29−toValue (name, tipe) =
30+toValue (name, tipe, desc) =
31+ "{ \"name\" : " ++ show name ++
30− "{ \"name\" : " ++ show name ++ ",\n \"type\" : \"" ++ show tipe ++ "\"\n }"
32+ ",\n \"type\" : \"" ++ show tipe ++
33+ ",\n \"desc\" : " ++ show desc ++ "\n }"
33−docParse :: String -> Either String (String, [(String, Type)])
35+docParse :: String -> Either String (String, [(String, Type, String)])
34docParse = setupParser $ do
36docParse = setupParser $ do
35 optional freshLine
37 optional freshLine
36 (,) <$> option "Main" moduleName <*> types
38 (,) <$> option "Main" moduleName <*> types
38 skip = manyTill anyChar simpleNewline >> return []
40 skip = manyTill anyChar simpleNewline >> return []
39 end = many1 anyChar >> return []
41 end = many1 anyChar >> return []
40− tipe = get <$> try typeAnnotation
41− get stmt = case stmt of { TypeAnnotation n t -> [(n,t)] ; _ -> [] }
42− types = concat <$> many (tipe <|> try skip <|> end)
42+ types = concat <$> many (docs <|> try skip <|> end)
43 getName = intercalate "." . fst
43 getName = intercalate "." . fst
44 moduleName = do optional freshLine
44 moduleName = do optional freshLine
45 getName <$> moduleDef `followedBy` freshLine
45 getName <$> moduleDef `followedBy` freshLine
47+docs :: IParser [(String, Type, String)]
48+docs = (tipe <$> try typeAnnotation) <|> commentTipe
50+ clip str = case str of { ' ':rest -> rest ; _ -> str }
51+ tipe stmt = case stmt of { TypeAnnotation n t -> [(n,t,"")] ; _ -> [] }
53+ cs <- map clip <$> many1 lineComment
54+ typ <- optionMaybe (try typeAnnotation)
56+ Just (TypeAnnotation n t) -> [(n, t, intercalate "\n" cs)]
47setupParser p source =
60setupParser p source =
48 case iParse p "" source of
61 case iParse p "" source of
49 Right result -> Right result
62 Right result -> Right result