"Try this" support #
This implements a mechanism for tactics to print a message saying Try this: <suggestion>,
where <suggestion> is a link to a replacement tactic. Users can either click on the link
in the suggestion (provided by a widget), or use a code action which applies the suggestion.
Raw widgets and code actions #
This is a widget which is placed by TryThis.addSuggestion and TryThis.addSuggestions.
When placed by addSuggestion, it says Try this: <replacement>
where <replacement> is a link which will perform the replacement.
When placed by addSuggestions, it says:
Try these:
<replacement1><replacement2><replacement3>- ...
where <replacement*> is a link which will perform the replacement.
Equations
- One or more equations did not get rendered due to their size.
Instances For
This is a code action provider that looks for TryThisInfo nodes and supplies a code action to
apply the replacement.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Formatting #
Yields (indent, column) given a FileMap and a String.Range, where indent is the number
of spaces by which the line that first includes range is initially indented, and column is the
column range starts at in that line.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Replace subexpressions like ?m.1234 with ?_ so it can be copy-pasted.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Delaborate e into syntax suitable for use by refine.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The default maximum width of an ideal line in source code, 100 is the current convention.
Equations
Instances For
An option allowing the user to customize the ideal input width, this controls output format when the output is intended to be copied back into a lean file
Get the input width specified in the options
Equations
Instances For
Suggestion data #
Text to be used as a suggested replacement in the infoview. This can be either a TSyntax kind
for a single kind : SyntaxNodeKind or a raw String.
Instead of using constructors directly, there are coercions available from these types to
SuggestionText.
- tsyntax: {kind : Lean.SyntaxNodeKind} → Lean.TSyntax kind → Std.Tactic.TryThis.SuggestionText
TSyntax kindused as suggested replacement text in the infoview. Note that whileTSyntaxis in general parameterized by a list ofSyntaxNodeKinds, we only allow one here; this unambiguously guides pretty-printing. - string: String → Std.Tactic.TryThis.SuggestionText
A raw string to be used as suggested replacement text in the infoview.
Instances For
Equations
- Std.Tactic.TryThis.instInhabitedSuggestionText = { default := Std.Tactic.TryThis.SuggestionText.tsyntax default }
Equations
- One or more equations did not get rendered due to their size.
Equations
- Std.Tactic.TryThis.instCoeHeadTSyntaxConsSyntaxNodeKindNilSuggestionText = { coe := Std.Tactic.TryThis.SuggestionText.tsyntax }
Pretty-prints a SuggestionText as a Format. If the SuggestionText is some TSyntax kind,
we use the appropriate pretty-printer; strings are coerced to Formats as-is.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Pretty-prints a SuggestionText as a String and wraps with respect to the pane width,
indentation, and column, via Format.prettyExtra. If w := none, then
w := getInputWidth (← getOptions) is used. Raw Strings are returned as-is.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Style hooks for Suggestions. See SuggestionStyle.error, .warning, .success, .value,
and other definitions here for style presets. This is an arbitrary Json object, with the following
interesting fields:
title: the hover text in the suggestion linkclassName: the CSS classes applied to the linkstyle: AJsonobject with additional inline CSS styles such ascolorortextDecoration.
Equations
Instances For
Style as an error. By default, decorates the text with an undersquiggle; providing the argument
decorated := false turns this off.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Style as a warning. By default, decorates the text with an undersquiggle; providing the
argument decorated := false turns this off.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Style as a success.
Equations
- Std.Tactic.TryThis.SuggestionStyle.success = Lean.Json.mkObj [("className", Lean.Json.str "information pointer dim")]
Instances For
Style the same way as a hypothesis appearing in the infoview.
Equations
- Std.Tactic.TryThis.SuggestionStyle.asHypothesis = Lean.Json.mkObj [("className", Lean.Json.str "goal-hyp pointer dim")]
Instances For
Style the same way as an inaccessible hypothesis appearing in the infoview.
Equations
- Std.Tactic.TryThis.SuggestionStyle.asInaccessible = Lean.Json.mkObj [("className", Lean.Json.str "goal-inaccessible pointer dim")]
Instances For
Draws the color from a red-yellow-green color gradient with red at 0.0, yellow at 0.5, and
green at 1.0. Values outside the range [0.0, 1.0] are clipped to lie within this range.
With showValueInHoverText := true (the default), the value t will be included in the title of
the HTML element (which appears on hover).
Equations
- One or more equations did not get rendered due to their size.
Instances For
Holds a suggestion for replacement, along with preInfo and postInfo strings to be printed
immediately before and after that suggestion, respectively. It also includes an optional
MessageData to represent the suggestion in logs; by default, this is none, and suggestion is
used.
- suggestion : Std.Tactic.TryThis.SuggestionText
Text to be used as a replacement via a code action.
Optional info to be printed immediately before replacement text in a widget.
Optional info to be printed immediately after replacement text in a widget.
- style? : Option Std.Tactic.TryThis.SuggestionStyle
Optional style specification for the suggestion. If
none(the default), the suggestion is styled as a text link. Otherwise, the suggestion can be styled as:- a status:
.error,.warning,.success - a hypothesis name:
.asHypothesis,.asInaccessible - a variable color:
.value (t : Float), which draws from a red-yellow-green gradient, with red at0.0and green at1.0.
See
SuggestionStylefor details. - a status:
- messageData? : Option Lean.MessageData
How to represent the suggestion as
MessageData. This is used only in the info diagnostic. Ifnone, we usesuggestion. UsetoMessageDatato render aSuggestionin this manner.
Instances For
Equations
- Std.Tactic.TryThis.instInhabitedSuggestion = { default := { suggestion := default, preInfo? := default, postInfo? := default, style? := default, messageData? := default } }
Converts a Suggestion to Json in CoreM. We need CoreM in order to pretty-print syntax.
If w := none, then w := getInputWidth (← getOptions) is used.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- Std.Tactic.TryThis.instToMessageDataSuggestion = { toMessageData := fun (s : Std.Tactic.TryThis.Suggestion) => Option.getD s.messageData? (Lean.toMessageData s.suggestion) }
Equations
- One or more equations did not get rendered due to their size.
Delaborate e into a suggestion suitable for use by refine.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Widget hooks #
Add a "try this" suggestion. This has three effects:
- An info diagnostic is displayed saying
Try this: <suggestion> - A widget is registered, saying
Try this: <suggestion>with a link on<suggestion>to apply the suggestion - A code action is added, which will apply the suggestion.
The parameters are:
ref: the span of the info diagnostics: aSuggestion, which containssuggestion: the replacement text;preInfo?: an optional string shown immediately after the replacement text in the widget message (only)postInfo?: an optional string shown immediately after the replacement text in the widget message (only)style?: an optionalJsonobject used as the value of thestyleattribute of the suggestion text's element (not the whole suggestion element).messageData?: an optional message to display in place ofsuggestionin the info diagnostic (only). The widget message uses onlysuggestion. IfmessageData?isnone, we simply usesuggestioninstead.
origSpan?: a syntax object whose span is the actual text to be replaced bysuggestion. If not provided it defaults toref.header: a string that begins the display. By default, it is"Try this: ".
Equations
- One or more equations did not get rendered due to their size.
Instances For
Add a list of "try this" suggestions as a single "try these" suggestion. This has three effects:
- An info diagnostic is displayed saying
Try these: <list of suggestions> - A widget is registered, saying
Try these: <list of suggestions>with a link on each<suggestion>to apply the suggestion - A code action for each suggestion is added, which will apply the suggestion.
The parameters are:
ref: the span of the info diagnosticsuggestions: an array ofSuggestions, which each containsuggestion: the replacement text;preInfo?: an optional string shown immediately after the replacement text in the widget message (only)postInfo?: an optional string shown immediately after the replacement text in the widget message (only)style?: an optionalJsonobject used as the value of thestyleattribute of the suggestion text's element (not the whole suggestion element).messageData?: an optional message to display in place ofsuggestionin the info diagnostic (only). The widget message uses onlysuggestion. IfmessageData?isnone, we simply usesuggestioninstead.
origSpan?: a syntax object whose span is the actual text to be replaced bysuggestion. If not provided it defaults toref.header: a string that precedes the list. By default, it is"Try these:".style?: a default style for all suggestions which do not have a customstyle?set.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Add an exact e or refine e suggestion.
The parameters are:
ref: the span of the info diagnostice: the replacement expressionorigSpan?: a syntax object whose span is the actual text to be replaced bysuggestion. If not provided it defaults toref.addSubgoalsMsg: if true (default false), any remaining subgoals will be shown afterRemaining subgoals:
Equations
- One or more equations did not get rendered due to their size.
Instances For
Add exact e or refine e suggestions.
The parameters are:
ref: the span of the info diagnostices: the array of replacement expressionsorigSpan?: a syntax object whose span is the actual text to be replaced bysuggestion. If not provided it defaults toref.addSubgoalsMsg: if true (default false), any remaining subgoals will be shown afterRemaining subgoals:
Equations
- One or more equations did not get rendered due to their size.
Instances For
Add a term suggestion.
The parameters are:
ref: the span of the info diagnostice: the replacement expressionorigSpan?: a syntax object whose span is the actual text to be replaced bysuggestion. If not provided it defaults toref.header: a string which precedes the suggestion. By default, it's"Try this: ".
Equations
- Std.Tactic.TryThis.addTermSuggestion ref e origSpan? header = do let __do_lift ← Std.Tactic.TryThis.delabToRefinableSuggestion e Std.Tactic.TryThis.addSuggestion ref __do_lift origSpan? header
Instances For
Add term suggestions.
The parameters are:
ref: the span of the info diagnostices: an array of the replacement expressionsorigSpan?: a syntax object whose span is the actual text to be replaced bysuggestion. If not provided it defaults toref.header: a string which precedes the list of suggestions. By default, it's"Try these:".
Equations
- One or more equations did not get rendered due to their size.