This PR uses `isRecursiveDefinition` when validating `macro_inline`, instead of rummaging in the internals of the definition.
33 lines
913 B
Text
33 lines
913 B
Text
/-
|
|
Copyright (c) 2021 Microsoft Corporation. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
Authors: Leonardo de Moura
|
|
-/
|
|
module
|
|
|
|
prelude
|
|
public import Lean.Attributes
|
|
|
|
public section
|
|
|
|
namespace Lean.Meta
|
|
|
|
/--
|
|
Environment extension for storing which declarations are recursive.
|
|
This information is populated by the `PreDefinition` module, but the simplifier
|
|
uses when unfolding declarations.
|
|
-/
|
|
builtin_initialize recExt : TagDeclarationExtension ←
|
|
mkTagDeclarationExtension `recExt (asyncMode := .async .asyncEnv)
|
|
|
|
/--
|
|
Marks the given declaration as recursive.
|
|
-/
|
|
def markAsRecursive (declName : Name) : CoreM Unit :=
|
|
modifyEnv (recExt.tag · declName)
|
|
|
|
/--
|
|
Returns `true` if `declName` was defined using well-founded recursion, or structural recursion.
|
|
-/
|
|
def isRecursiveDefinition (declName : Name) : CoreM Bool :=
|
|
return recExt.isTagged (← getEnv) declName
|