Skip to content

Commit

Permalink
feat: allow users to use initialize registerBuiltinDerivingHandler ...
Browse files Browse the repository at this point in the history
  • Loading branch information
leodemoura committed Jan 11, 2022
1 parent 93f3773 commit d953ac8
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 2 deletions.
3 changes: 1 addition & 2 deletions src/Lean/Elab/Deriving/Basic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ def DerivingHandlerNoArgs := (typeNames : Array Name) → CommandElabM Bool
builtin_initialize derivingHandlersRef : IO.Ref (NameMap DerivingHandler) ← IO.mkRef {}

def registerBuiltinDerivingHandlerWithArgs (className : Name) (handler : DerivingHandler) : IO Unit := do
let initializing ← IO.initializing
unless initializing do
unless (← initializing) do
throw (IO.userError "failed to register deriving handler, it can only be registered during initialization")
if (← derivingHandlersRef.get).contains className then
throw (IO.userError s!"failed to register deriving handler, a handler has already been registered for '{className}'")
Expand Down
8 changes: 8 additions & 0 deletions src/shell/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,14 @@ add_test(NAME leanpkgtest_user_attr
find . -name '*.olean' -delete
leanmake")

add_test(NAME leanpkgtest_user_deriving
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/leanpkg/deriving"
COMMAND bash -c "
set -eu
export ${TEST_VARS}
find . -name '*.olean' -delete
leanmake")

add_test(NAME leanpkgtest_user_opt
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/leanpkg/user_opt"
COMMAND bash -c "
Expand Down
1 change: 1 addition & 0 deletions tests/leanpkg/deriving/UserDeriving.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import UserDeriving.Tst
15 changes: 15 additions & 0 deletions tests/leanpkg/deriving/UserDeriving/Simple.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import Lean

class Simple (α : Type u) where
val : α

open Lean
open Lean.Elab
open Lean.Elab.Command
def mkSimpleHandler (declNames : Array Name) : CommandElabM Bool := do
dbg_trace ">> mkSimpleHandler {declNames}"
-- TODO: see examples at src/Lean/Elab/Deriving
return true

initialize
registerBuiltinDerivingHandler ``Simple mkSimpleHandler
6 changes: 6 additions & 0 deletions tests/leanpkg/deriving/UserDeriving/Tst.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import UserDeriving.Simple

inductive Foo where
| mk₁
| mk₂
deriving Simple
3 changes: 3 additions & 0 deletions tests/leanpkg/deriving/leanpkg.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[package]
name = "UserDeriving"
version = "0.1"

0 comments on commit d953ac8

Please sign in to comment.