A position range inside a string. This type is mostly in combination with syntax trees,
as there might not be a single underlying string in this case that could be used for a Substring
.
- start : String.Pos
- stop : String.Pos
Instances For
Equations
- String.instInhabitedRange = { default := { start := default, stop := default } }
Equations
- String.instReprRange = { reprPrec := String.reprRange✝ }
Equations
- String.instBEqRange = { beq := String.beqRange✝ }
Equations
- String.instHashableRange = { hash := String.hashRange✝ }
Instances For
Equations
- Lean.SourceInfo.updateTrailing trailing (Lean.SourceInfo.original leading pos trailing_1 endPos) = Lean.SourceInfo.original leading pos trailing endPos
- Lean.SourceInfo.updateTrailing trailing x = x
Instances For
Equations
- Lean.SourceInfo.getRange? canonicalOnly info = do let __do_lift ← info.getPos? canonicalOnly let __do_lift_1 ← info.getTailPos? canonicalOnly pure { start := __do_lift, stop := __do_lift_1 }
Instances For
Equations
- Lean.instBEqSourceInfo_lean = { beq := Lean.beqSourceInfo✝ }
Syntax AST #
- mk: ∀ (info : Lean.SourceInfo) (kind : Lean.SyntaxNodeKind) (args : Array Lean.Syntax), Lean.IsNode (Lean.Syntax.node info kind args)
Instances For
Equations
- Lean.SyntaxNode = { s : Lean.Syntax // Lean.IsNode s }
Instances For
Equations
Instances For
Equations
Instances For
Equations
Instances For
Equations
Instances For
Equations
- Lean.SyntaxNode.getKind ⟨Lean.Syntax.node info k args, property⟩ = k
- Lean.SyntaxNode.getKind ⟨Lean.Syntax.missing, h⟩ = Lean.unreachIsNodeMissing h
- Lean.SyntaxNode.getKind ⟨Lean.Syntax.atom info val, h⟩ = Lean.unreachIsNodeAtom h
- Lean.SyntaxNode.getKind ⟨Lean.Syntax.ident info rawVal val preresolved, h⟩ = Lean.unreachIsNodeIdent h
Instances For
Equations
- Lean.SyntaxNode.withArgs ⟨Lean.Syntax.node info k args, property⟩ fn = fn args
- Lean.SyntaxNode.withArgs ⟨Lean.Syntax.missing, h⟩ fn = Lean.unreachIsNodeMissing h
- Lean.SyntaxNode.withArgs ⟨Lean.Syntax.atom info val, h⟩ fn = Lean.unreachIsNodeAtom h
- Lean.SyntaxNode.withArgs ⟨Lean.Syntax.ident info rawVal val preresolved, h⟩ fn = Lean.unreachIsNodeIdent h
Instances For
Equations
- n.getNumArgs = n.withArgs fun (args : Array Lean.Syntax) => args.size
Instances For
Equations
- n.getArg i = n.withArgs fun (args : Array Lean.Syntax) => args.get! i
Instances For
Equations
- Lean.SyntaxNode.modifyArgs ⟨Lean.Syntax.node info k args, property⟩ fn = Lean.Syntax.node info k (fn args)
- Lean.SyntaxNode.modifyArgs ⟨Lean.Syntax.missing, h⟩ fn = Lean.unreachIsNodeMissing h
- Lean.SyntaxNode.modifyArgs ⟨Lean.Syntax.atom info val, h⟩ fn = Lean.unreachIsNodeAtom h
- Lean.SyntaxNode.modifyArgs ⟨Lean.Syntax.ident info rawVal val preresolved, h⟩ fn = Lean.unreachIsNodeIdent h
Instances For
Compares syntax structures and position ranges, but not whitespace. We generally assume that if
syntax trees equal in this way generate the same elaboration output, including positions contained
in e.g. diagnostics and the info tree. However, as we have a few request handlers such as goalsAt?
that are sensitive to whitespace information in the info tree, we currently use eqWithInfo
instead
for reuse checks.
Like structRangeEq
but prints trace on failure if trace.Elab.reuse
is activated.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Full comparison of syntax structures and source infos.
Like eqWithInfo
but prints trace on failure if trace.Elab.reuse
is activated.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- (Lean.Syntax.atom info val).getAtomVal = val
- x.getAtomVal = ""
Instances For
Equations
- (Lean.Syntax.atom info val).setAtomVal x = Lean.Syntax.atom info x
- x✝.setAtomVal x = x✝
Instances For
Equations
- (Lean.Syntax.node i k args).ifNode hyes hno = hyes ⟨Lean.Syntax.node i k args, ⋯⟩
- stx.ifNode hyes hno = hno ()
Instances For
Equations
- (Lean.Syntax.node i k args).ifNodeKind kind hyes hno = if (k == kind) = true then hyes ⟨Lean.Syntax.node i k args, ⋯⟩ else hno ()
- stx.ifNodeKind kind hyes hno = hno ()
Instances For
Equations
- (Lean.Syntax.node i k args).asNode = ⟨Lean.Syntax.node i k args, ⋯⟩
- x.asNode = ⟨Lean.mkNullNode, Lean.Syntax.asNode.proof_1⟩
Instances For
Equations
- stx.getIdAt i = (stx.getArg i).getId
Instances For
Check for a Syntax.ident
of the given name anywhere in the tree.
This is usually a bad idea since it does not check for shadowing bindings,
but in the delaborator we assume that bindings are never shadowed.
Equations
- (Lean.Syntax.node i k args).modifyArgs fn = Lean.Syntax.node i k (fn args)
- stx.modifyArgs fn = stx
Instances For
Equations
- (Lean.Syntax.node i_1 k args).modifyArg i fn = Lean.Syntax.node i_1 k (args.modify i fn)
- stx.modifyArg i fn = stx
Instances For
Equations
- Lean.Syntax.rewriteBottomUp fn stx = (Lean.Syntax.rewriteBottomUpM fn stx).run
Instances For
Set SourceInfo.leading
according to the trailing stop of the preceding token.
The result is a round-tripping syntax tree IF, in the input syntax tree,
- all leading stops, atom contents, and trailing starts are correct
- trailing stops are between the trailing start and the next leading stop.
Remark: after parsing, all SourceInfo.leading
fields are empty.
The Syntax
argument is the output produced by the parser for source
.
This function "fixes" the source.leading
field.
Additionally, we try to choose "nicer" splits between leading and trailing stops according to some heuristics so that e.g. comments are associated to the (intuitively) correct token.
Note that the SourceInfo.trailing
fields must be correct.
The implementation of this Function relies on this property.
Equations
- stx.updateLeading = StateT.run' (Lean.Syntax.replaceM Lean.Syntax.updateLeadingAux stx) 0
Instances For
Split an ident
into its dot-separated components while preserving source info.
Macro scopes are first erased. For example, `foo.bla.boo._@._hyg.4
↦ [`foo, `bla, `boo]
.
If nFields
is set, we take that many fields from the end and keep the remaining components
as one name. For example, `foo.bla.boo
with (nFields := 1)
↦ [`foo.bla, `boo]
.
Equations
- One or more equations did not get rendered due to their size.
- stx.identComponents nFields? = panicWithPosWithDecl "Lean.Syntax" "Lean.Syntax.identComponents" 295 9 "unreachable code has been reached"
Instances For
Equations
- One or more equations did not get rendered due to their size.
- Lean.Syntax.identComponents.nameComps n nFields? = n.components
Instances For
for _ in stx.topDown
iterates through each node and leaf in stx
top-down, left-to-right.
If firstChoiceOnly
is true
, only visit the first argument of each choice node.
Equations
- stx.topDown firstChoiceOnly = { firstChoiceOnly := firstChoiceOnly, stx := stx }
Instances For
Equations
- One or more equations did not get rendered due to their size.
Equations
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
Instances For
Returns a synthetic Syntax which has the specified String.Range
.
Equations
- Lean.Syntax.ofRange range canonical = Lean.Syntax.atom (Lean.SourceInfo.synthetic range.start range.stop canonical) ""
Instances For
Represents a cursor into a syntax tree that can be read, written, and advanced down/up/left/right.
Indices are allowed to be out-of-bound, in which case cur
is Syntax.missing
.
If the Traverser
is used linearly, updates are linear in the Syntax
object as well.
- cur : Lean.Syntax
- parents : Array Lean.Syntax
Instances For
Equations
- Lean.Syntax.Traverser.fromSyntax stx = { cur := stx, parents := #[], idxs := #[] }
Instances For
Equations
- t.setCur stx = { cur := stx, parents := t.parents, idxs := t.idxs }
Instances For
Advance to the idx
-th child of the current node.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Advance to the parent of the current node, if any.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Advance to the left sibling of the current node, if any.
Instances For
Advance to the right sibling of the current node, if any.
Instances For
Monad class that gives read/write access to a Traverser
.
- st : MonadState Lean.Syntax.Traverser m
Instances
Equations
- Lean.Syntax.MonadTraverser.getCur = Lean.Syntax.Traverser.cur <$> get
Instances For
Equations
- Lean.Syntax.MonadTraverser.setCur stx = modify fun (t : Lean.Syntax.Traverser) => t.setCur stx
Instances For
Equations
- Lean.Syntax.MonadTraverser.goDown idx = modify fun (t : Lean.Syntax.Traverser) => t.down idx
Instances For
Equations
- Lean.Syntax.MonadTraverser.goUp = modify fun (t : Lean.Syntax.Traverser) => t.up
Instances For
Equations
- Lean.Syntax.MonadTraverser.goLeft = modify fun (t : Lean.Syntax.Traverser) => t.left
Instances For
Equations
- Lean.Syntax.MonadTraverser.goRight = modify fun (t : Lean.Syntax.Traverser) => t.right
Instances For
Instances For
Equations
- Lean.mkListNode args = Lean.mkNullNode args
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- (Lean.Syntax.node info (pre.str "antiquot") args).isAntiquot = true
- x.isAntiquot = false
Instances For
Equations
- stx.isAntiquots = (stx.isAntiquot || stx.isOfKind Lean.choiceKind && decide (stx.getNumArgs > 0) && stx.getArgs.all Lean.Syntax.isAntiquot)
Instances For
Equations
- stx.getCanonicalAntiquot = if stx.isOfKind Lean.choiceKind = true then stx[0] else stx
Instances For
Instances For
Equations
- stx.unescapeAntiquot = if stx.isAntiquot = true then stx.setArg 1 (Lean.mkNullNode stx[1].getArgs.pop) else stx
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Return kind of parser expected at this antiquotation, and whether it is a "pseudo" kind (see mkAntiquot
).
Equations
- (Lean.Syntax.node info ((k.str "pseudo").str "antiquot") args).antiquotKind? = some (k, true)
- (Lean.Syntax.node info (k.str "antiquot") args).antiquotKind? = some (k, false)
- x.antiquotKind? = none
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- (Lean.Syntax.node info (k.str "antiquot_scope") args).antiquotSpliceKind? = some k
- x.antiquotSpliceKind? = none
Instances For
Equations
- stx.isAntiquotSplice = stx.antiquotSpliceKind?.isSome
Instances For
Equations
- stx.getAntiquotSpliceContents = stx[3].getArgs
Instances For
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- (Lean.Syntax.node info (k.str "antiquot_suffix_splice") args).antiquotSuffixSplice? = some k
- x.antiquotSuffixSplice? = none
Instances For
Equations
- stx.isAntiquotSuffixSplice = stx.antiquotSuffixSplice?.isSome
Instances For
Equations
- stx.getAntiquotSuffixSpliceInner = stx[0]
Instances For
Equations
- Lean.Syntax.mkAntiquotSuffixSpliceNode kind inner suffix = (Lean.mkNode (kind ++ `antiquot_suffix_splice) #[inner, Lean.mkAtom suffix]).raw
Instances For
Equations
- stx.isTokenAntiquot = stx.isOfKind `token_antiquot
Instances For
Equations
Instances For
List of Syntax
nodes in which each succeeding element is the parent of
the current. The associated index is the index of the preceding element in the
list of children of the current element.
Equations
Instances For
Return stack of syntax nodes satisfying visit
, starting with such a node that also fulfills accept
(default "is leaf"), and ending with the root.
Equations
- root.findStack? visit accept = if visit root = true then Lean.Syntax.findStack?.go visit accept [] root else none
Instances For
Compare the SyntaxNodeKind
s in pattern
to those of the Syntax
elements in stack
. Return false
if stack
is shorter than pattern
.
Equations
- One or more equations did not get rendered due to their size.