Description
In #3256 I introduced the --caret-diagnostic
flag in order to report the diagnostic message as it is done by modern compilers.
The name of the flag is derived from https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-fcaret-diagnostics (though I missed the ending s
).
@peternewman suggested to add a --format
flag, instead, in order to be future proof.
Since this requires more changes to the current code, I would like to open a discussion about the best strategy.
The main problem is how the context (-C
/-A
/-B
) is applied. Here is an example:
: with fp:
: # GH-87235: On macOS all file descriptors for /dev/fd/N share the same
> # file offset, reset the file offset after scanning the zipfile diretory
: # to not cause problems when some runs 'python3 /dev/fd/9 9<some_script'
: start_offset = fp.tell()
Lib/zipimport.py:355: diretory ==> directory
This works only when there is one line.
--format flag
Introducing the --format
flag has the advantage that we know how many context source lines are printed by a format, so with -C
/-A
/-B
the code only needs to print additional lines around the lines printed by the format.
Possible formats:
plain (default)
if filename != "-":
f"{cfilename}:{cline}: {cwrongword} "
f"==> {crightword}{creason}"
else:
f"{cline}: {cwrongword} ==> {crightword}{creason}"
Not sure if ccolumn
can be added.
diagnostic / caret-diagnostics / develop/ ?
if filename != "-":
f"{cfilename}:{cline}:{ccolumn}: {cwrongword} "
f"==> {crightword}{creason}\n"
f"{line}"
f"{ccaret}\n"
else:
f"{cfilename}:{cline}:{ccolumn}: {cwrongword} "
f"==> {crightword}{creason}\n"
f"{line}"
f"{ccaret}\n"
TODO
Not sure if the code in interactive mode should also be modified. Example:
: env['LC_ALL'] = 'C'
> # Empty strings will be quoted by popen so we should just ommit it
: if args != ('',):
# Empty strings will be quoted by popen so we should just ommit it
ommit ==> omit (Y/n)
The same line is printed twice; not sure if it is a good user experience.
Another issue I found is:
elif options.stdin_single_line:
print(f"{cline}: {cwrongword} ==> {crightword}{creason}")
else:
print(
f"{cline}: {line.strip()}\n\t{cwrongword} "
f"==> {crightword}{creason}"
)
Should we have the second template be an alternative format?
Should the --stdin_single_line
flag be removed before the next release?
Thanks.