imp: at --debug 5, log account declarations info while parsing (#1909)
This commit is contained in:
parent
3d6e363461
commit
07e3dca735
@ -185,9 +185,11 @@ reader = Reader
|
|||||||
-- | Parse and post-process a "Journal" from hledger's journal file
|
-- | Parse and post-process a "Journal" from hledger's journal file
|
||||||
-- format, or give an error.
|
-- format, or give an error.
|
||||||
parse :: InputOpts -> FilePath -> Text -> ExceptT String IO Journal
|
parse :: InputOpts -> FilePath -> Text -> ExceptT String IO Journal
|
||||||
parse iopts = parseAndFinaliseJournal journalp' iopts
|
parse iopts f = parseAndFinaliseJournal journalp' iopts f
|
||||||
where
|
where
|
||||||
journalp' = do
|
journalp' =
|
||||||
|
-- debug logging for account display order
|
||||||
|
dbgJournalAcctDeclOrder (takeFileName f <> " acct decls: ") <$> do
|
||||||
-- reverse parsed aliases to ensure that they are applied in order given on commandline
|
-- reverse parsed aliases to ensure that they are applied in order given on commandline
|
||||||
mapM_ addAccountAlias (reverse $ aliasesFromOpts iopts)
|
mapM_ addAccountAlias (reverse $ aliasesFromOpts iopts)
|
||||||
journalp
|
journalp
|
||||||
@ -302,20 +304,40 @@ includedirectivep = do
|
|||||||
`orRethrowIOError` (show parentpos ++ " reading " ++ filepath)
|
`orRethrowIOError` (show parentpos ++ " reading " ++ filepath)
|
||||||
let initChildj = newJournalWithParseStateFrom filepath parentj
|
let initChildj = newJournalWithParseStateFrom filepath parentj
|
||||||
|
|
||||||
-- Choose a reader/format based on the file path, or fall back
|
-- Choose a reader/parser based on the file path prefix or file extension,
|
||||||
-- on journal. Duplicating readJournal a bit here.
|
-- defaulting to JournalReader. Duplicating readJournal a bit here.
|
||||||
let r = fromMaybe reader $ findReader Nothing (Just prefixedpath)
|
let r = fromMaybe reader $ findReader Nothing (Just prefixedpath)
|
||||||
parser = rParser r
|
parser = rParser r
|
||||||
dbg6IO "trying reader" (rFormat r)
|
dbg6IO "trying reader" (rFormat r)
|
||||||
-- Included files's lists are still reversed, because not yet journalFinalise'd,
|
|
||||||
-- which confuses the calculation of account declaration order across multiple files (#1909).
|
-- Parse the file (of whichever format) to a Journal, with file path and source text attached.
|
||||||
-- Unreverse just the acct declarations to fix that without disturbing anything else.
|
updatedChildj <- (journalAddFile (filepath, childInput)) <$>
|
||||||
let reversedecls j = j{jdeclaredaccounts = reverse $ jdeclaredaccounts j}
|
|
||||||
updatedChildj <- (journalAddFile (filepath, childInput) . reversedecls) <$>
|
|
||||||
parseIncludeFile parser initChildj filepath childInput
|
parseIncludeFile parser initChildj filepath childInput
|
||||||
|
|
||||||
-- discard child's parse info, combine other fields
|
-- Merge this child journal into the parent journal using Journal's Semigroup instance
|
||||||
put $ updatedChildj <> parentj
|
-- (with lots of debug logging for troubleshooting account display order).
|
||||||
|
let
|
||||||
|
parentj' =
|
||||||
|
dbgJournalAcctDeclOrder (" " <> parentfilename <> " acct decls now : ")
|
||||||
|
$
|
||||||
|
(
|
||||||
|
-- The child journal has not yet been finalises and its lists are still reversed.
|
||||||
|
-- To help calculate account declaration order across files (#1909),
|
||||||
|
-- unreverse just the acct declarations without disturbing anything else.
|
||||||
|
-- XXX still shows wrong order in some cases
|
||||||
|
reverseAcctDecls $
|
||||||
|
dbgJournalAcctDeclOrder (childfilename <> " include file acct decls: ") updatedChildj
|
||||||
|
)
|
||||||
|
<>
|
||||||
|
dbgJournalAcctDeclOrder (" " <> parentfilename <> " acct decls were: ") parentj
|
||||||
|
|
||||||
|
where
|
||||||
|
reverseAcctDecls j = j{jdeclaredaccounts = reverse $ jdeclaredaccounts j}
|
||||||
|
childfilename = takeFileName filepath
|
||||||
|
parentfilename = maybe "" takeFileName $ headMay $ jincludefilestack parentj -- more accurate than journalFilePath parentj somehow
|
||||||
|
|
||||||
|
-- Update the parse state.
|
||||||
|
put parentj'
|
||||||
|
|
||||||
newJournalWithParseStateFrom :: FilePath -> Journal -> Journal
|
newJournalWithParseStateFrom :: FilePath -> Journal -> Journal
|
||||||
newJournalWithParseStateFrom filepath j = nulljournal{
|
newJournalWithParseStateFrom filepath j = nulljournal{
|
||||||
@ -330,6 +352,22 @@ includedirectivep = do
|
|||||||
,jincludefilestack = filepath : jincludefilestack j
|
,jincludefilestack = filepath : jincludefilestack j
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dbgJournalAcctDeclOrder :: String -> Journal -> Journal
|
||||||
|
dbgJournalAcctDeclOrder prefix
|
||||||
|
| debugLevel >= 5 = traceWith ((prefix++) . showAcctDeclsSummary . jdeclaredaccounts)
|
||||||
|
| otherwise = id
|
||||||
|
where
|
||||||
|
showAcctDeclsSummary :: [(AccountName,AccountDeclarationInfo)] -> String
|
||||||
|
showAcctDeclsSummary adis
|
||||||
|
| length adis < (2*num+2) = "[" <> showadis adis <> "]"
|
||||||
|
| otherwise =
|
||||||
|
"[" <> showadis (take num adis) <> " ... " <> showadis (takelast num adis) <> "]"
|
||||||
|
where
|
||||||
|
num = 3
|
||||||
|
showadis = intercalate ", " . map showadi
|
||||||
|
showadi (a,adi) = "("<>show (adideclarationorder adi)<>","<>T.unpack a<>")"
|
||||||
|
takelast n = reverse . take n . reverse
|
||||||
|
|
||||||
-- | Lift an IO action into the exception monad, rethrowing any IO
|
-- | Lift an IO action into the exception monad, rethrowing any IO
|
||||||
-- error with the given message prepended.
|
-- error with the given message prepended.
|
||||||
orRethrowIOError :: MonadIO m => IO a -> String -> TextParser m a
|
orRethrowIOError :: MonadIO m => IO a -> String -> TextParser m a
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user