41 lines
1.7 KiB
Text
41 lines
1.7 KiB
Text
/-
|
|
Copyright (c) 2021 Microsoft Corporation. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
Authors: Gabriel Ebner
|
|
-/
|
|
module
|
|
|
|
prelude
|
|
public import Lean.Elab.Command
|
|
meta import Lean.Parser.Term
|
|
|
|
public section
|
|
|
|
namespace Lean.Elab.Command
|
|
open Lean.Parser.Command
|
|
open Lean.Parser.Term
|
|
|
|
/--
|
|
Declares an auxiliary definition with an automatically generated name.
|
|
For example, `aux_def foo : Nat := 42` creates a definition
|
|
with an internal, unused name based on the suggestion `foo`.
|
|
-/
|
|
scoped syntax (name := aux_def) docComment ? attributes ? "aux_def" ident+ ":" term ":=" term : command
|
|
|
|
@[builtin_command_elab «aux_def»]
|
|
def elabAuxDef : CommandElab
|
|
| `($[$doc?:docComment]? $[$attrs?:attributes]? aux_def $suggestion* : $ty := $body) => do
|
|
let id := suggestion.map (·.getId.eraseMacroScopes) |>.foldl (· ++ ·) Name.anonymous
|
|
let id := `_aux ++ (← getMainModule) ++ `_ ++ id
|
|
let id := String.intercalate "_" <| id.components.map (·.toString (escape := false))
|
|
let ns ← getCurrNamespace
|
|
-- We use a new generator here because we want more control over the name; the default would
|
|
-- create a private name that then breaks the macro below. We assume that `aux_def` is not used
|
|
-- with the same arguments in parallel contexts.
|
|
let env := (← getEnv).setExporting true
|
|
let (id, _) := DeclNameGenerator.ofPrefix ns |>.mkUniqueName env («infix» := Name.mkSimple id)
|
|
let id := id.replacePrefix ns Name.anonymous -- TODO: replace with def _root_.id
|
|
elabCommand <|
|
|
← `($[$doc?:docComment]? $[$attrs?:attributes]?
|
|
meta def $(mkIdentFrom (mkNullNode suggestion) id (canonical := true)):ident : $ty := $body)
|
|
| _ => throwUnsupportedSyntax
|