Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add source file to project parse errors and warnings #10644

Draft
wants to merge 32 commits into
base: master
Choose a base branch
from

Conversation

philderbeast
Copy link
Collaborator

@philderbeast philderbeast commented Dec 16, 2024

Fixes #10635. Improves warning and error messages shown when parsing project files and their imports.

Warning Messages

To trigger these warning messages, the examples use badly formed comments that have a single dash instead of two as is required of a line comment in .cabal and .project files (and imported .config files).

  • Before the fix:

    The cabal.project file name is repeated. Warnings are misattributed to having been in the project rather than from a configuration file imported by the project. Warnings are shown in reverse line number order.

    $ ~/.ghcup/bin/cabal-3.12.1.0 build all --dry-run
    ...
    Warning:
    /.../ParseWarningProvenance/cabal.project,
    cabal.project, cabal.project, cabal.project, cabal.project: Unrecognized
    section '-' on line 123
    /.../ParseWarningProvenance/cabal.project,
    cabal.project, cabal.project, cabal.project, cabal.project: Unrecognized
    section '-' on line 3
    /.../ParseWarningProvenance/cabal.project,
    cabal.project, cabal.project, cabal.project, cabal.project: Unrecognized
    section '-' on line 2
    /.../ParseWarningProvenance/cabal.project,
    cabal.project, cabal.project, cabal.project, cabal.project: Unrecognized
    section '-' on line 1
    /.../ParseWarningProvenance/cabal.project,
    cabal.project, cabal.project, cabal.project, cabal.project: Unrecognized
    section '-' on line 123
    /.../ParseWarningProvenance/cabal.project,
    cabal.project, cabal.project, cabal.project, cabal.project: Unrecognized
    section '-' on line 3
    /.../ParseWarningProvenance/cabal.project,
    cabal.project, cabal.project, cabal.project, cabal.project: Unrecognized
    section '-' on line 2
    /.../ParseWarningProvenance/cabal.project,
    cabal.project, cabal.project, cabal.project, cabal.project: Unrecognized
    section '-' on line 1
    
  • After the fix:

    The warnings are shown in a list. For warnings within the same .project or imported .config file, warnings are sorted by line number. The file that is the source of the warning is shown.

    The warnings associated with configuration files are shown in the order these files were imported by the project:

    $ cat cabal.project
    packages: no-pkg-dir
    import: dir-x/a.config
    import: dir-y/a.config
    import: x.config
    import: y.config
    
    $ cabal build all --dry-run
    ...
    Warnings found while parsing the project file, cabal.project:
    - dir-x/a.config: Unrecognized section '-' on line 1
    - dir-x/a.config: Unrecognized section '-' on line 2
    - dir-x/a.config: Unrecognized section '-' on line 3
    - dir-y/a.config: Unrecognized section '-' on line 123
    - x.config: Unrecognized section '-' on line 1
    - x.config: Unrecognized section '-' on line 2
    - x.config: Unrecognized section '-' on line 3
    - y.config: Unrecognized section '-' on line 123
    

Error Messages from Project

To trigger these error messages, the examples use badly formed conditions:

$ cat cabal.project
-- The following failing condition is not on the first line so we can check the
-- line number:
if _
  • Before the fix:

    The parse error is shown with hard line breaks.

    $ ~/.ghcup/bin/cabal-3.12.1.0 build all --dry-run
    ...
    Error: [Cabal-7090]
    Error parsing project file /.../ParseErrorProvenance/cabal.project:3:
    "<condition>" (line 1, column 1):
    unexpected SecArgName (Position 1 4) "_"
    
  • After the fix:

    The snippet that failed to parse may be shown and the parse error is shown as one line, with no hard line breaks.

    $ cabal build all --dry-run
    ...
    Error: [Cabal-7090]
    Error parsing project file cabal.project:3:
    - Failed to parse 'if(_)' with error:
        "<condition>" (line 1, column 1): unexpected SecArgName (Position 1 4) "_"
    

Error Messages from Imported Config

With the same setup but now with the error in an imported file:

$ cat elif.project 
import: dir-elif/elif.config

$ cat dir-elif/elif.config 
-- The following failing condition is not on the first line so we can check the
-- line number:
if false
elif _
  • Before the fix:

    The project rather than the imported configuration file is shown as the source file.

    $ ~/.ghcup/bin/cabal-3.12.1.0 build all --dry-run
    ...
    Error: [Cabal-7090]
    Error parsing project file /.../ParseErrorProvenance/elif.project:4:
    "<condition>" (line 1, column 1):
    unexpected SecArgName (Position 1 6) "_"
    
  • After the fix:

    The imported configuration file is shown as the source with a snippet of the error.

    $ cabal build all --dry-run
    ...
    Error: [Cabal-7090]
    Error parsing project file dir-elif/elif.config:4:
      - dir-elif/elif.config
          imported by: elif.project
      - Failed to parse 'elif(_)' with error:
        "<condition>" (line 1, column 1): unexpected SecArgName (Position 1 6) "_"
    

@philderbeast philderbeast force-pushed the fix/import-parse-error-location branch from eef5654 to ea7d2d3 Compare December 16, 2024 18:54
@philderbeast philderbeast force-pushed the fix/import-parse-error-location branch 2 times, most recently from 7c990c9 to a74ddc3 Compare December 16, 2024 19:09
@philderbeast
Copy link
Collaborator Author

@gbaz what are your concerns with the following comment and is there a test for this?

-- we rewrap as as a section so the readFields lexer of the conditional parser doesn't get confused
adaptParseError l (parseConditionConfVarFromClause . BS.pack $ "if(" <> p <> ")") <*>

Comment on lines 310 to 325
<$> adaptParseError l (parseConditionConfVarFromClause . BS.pack $ "else(" <> p <> ")")
<$> ( let s = "elif(" <> p <> ")"
in projectParse (Just s) source (adaptParseError l (parseConditionConfVarFromClause $ BS.pack s))
)
Copy link
Collaborator Author

@philderbeast philderbeast Dec 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gbaz was this a typo, using "else(" instead of "elif("?

@philderbeast philderbeast force-pushed the fix/import-parse-error-location branch 2 times, most recently from deec1f5 to 6f5239b Compare December 16, 2024 19:33
@philderbeast philderbeast force-pushed the fix/import-parse-error-location branch from 6f5239b to 9f05ce2 Compare December 16, 2024 20:05
@philderbeast philderbeast marked this pull request as draft December 17, 2024 15:33
@philderbeast
Copy link
Collaborator Author

philderbeast commented Dec 17, 2024

Reverting to draft while I settle some Windows versus POSIX file path issues.

@philderbeast philderbeast force-pushed the fix/import-parse-error-location branch from d013e12 to dfd6625 Compare December 17, 2024 15:36
- Manually replace path separators before anything else
@philderbeast philderbeast force-pushed the fix/import-parse-error-location branch from 3981374 to d45311c Compare December 17, 2024 16:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Warning source repeatedly wrong with unrecognized section
2 participants