Documentation

Lean.Elab.InfoTrees

/-- ... -/ #guard_msgs in cmd captures the messages generated by the command cmd and checks that they match the contents of the docstring.

Basic example:

/--
error: unknown identifier 'x'
-/
#guard_msgs in
example : α := x

This checks that there is such an error and then consumes the message.

By default, the command captures all messages, but the filter condition can be adjusted. For example, we can select only warnings:

/--
warning: declaration uses 'sorry'
-/
#guard_msgs(warning) in
example : α := sorry

or only errors

#guard_msgs(error) in
example : α := sorry

In the previous example, since warnings are not captured there is a warning on sorry. We can drop the warning completely with

#guard_msgs(error, drop warning) in
example : α := sorry

In general, #guard_msgs accepts a comma-separated list of configuration clauses in parentheses:

#guard_msgs (configElt,*) in cmd

By default, the configuration list is (all, whitespace := normalized, ordering := exact).

Message filters (processed in left-to-right order):

  • info, warning, error: capture messages with the given severity level.
  • all: capture all messages (the default).
  • drop info, drop warning, drop error: drop messages with the given severity level.
  • drop all: drop every message.

Whitespace handling (after trimming leading and trailing whitespace):

  • whitespace := exact requires an exact whitespace match.
  • whitespace := normalized converts all newline characters to a space before matching (the default). This allows breaking long lines.
  • whitespace := lax collapses whitespace to a single space before matching.

Message ordering:

  • ordering := exact uses the exact ordering of the messages (the default).
  • ordering := sorted sorts the messages in lexicographic order. This helps with testing commands that are non-deterministic in their ordering.

For example, #guard_msgs (error, drop all) in cmd means to check warnings and drop everything else.

The command elaborator has special support for #guard_msgs for linting. The #guard_msgs itself wants to capture linter warnings, so it elaborates the command it is attached to as if it were a top-level command. However, the command elaborator runs linters for all top-level commands, which would include #guard_msgs itself, and would cause duplicate and/or uncaptured linter warnings. The top-level command elaborator only runs the linters if #guard_msgs is not present.

Equations
  • One or more equations did not get rendered due to their size.
Instances For