/-
Copyright (c) 2018 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Sebastian Ullrich

Macro expander for the Lean language
-/
prelude
import init.lean.parser.module

namespace lean
namespace expander
open parser
open parser.term
open parser.command
open parser.command.notation_spec

def mixfix.transform (stx : tysyntax mixfix.view) : option (tysyntax notation.view) :=
do v ← view stx,
   -- TODO: reserved token case
   notation_symbol.view.quoted quoted ← view v.symbol,
   quoted ← view quoted,
   prec ← view quoted.prec,
   -- `notation` allows more syntax after `:` than mixfix commands, so we have to do a small conversion
   let prec_to_action : precedence.view → action.view :=
     λ prec, {action := review $ action_kind.view.prec prec.prec, ..prec},
   k ← view v.kind,
   let (spec, term) := match k : _ → (notation_spec.view × syntax) with
     | mixfix.kind.view.prefix _ :=
       let b : tysyntax parser.ident.view := review {part := review $ ident_part.view.default "b", suffix := review none} in
       (notation_spec.view.rules $ review {
          id := review none,
          rules := review [review {
            symbol := v.symbol,
            transition := review $ some $ review $ transition.view.arg $ review {
              id := b,
              action := review $ do prec ← prec, prec ← view prec, pure $ review $ prec_to_action prec}}]},
        review {lambda.view . op := review lambda_op.view.«λ», binders := review [review $
            binder.view.unbracketed $ review {
              ids := review [review $ binder_id.view.id $ review {id := b, univ := review none}],
              type := review none, default := review none}
          ],
          body := review_as app.view {fn := v.term, arg := b}})
     | _ := sorry,
   pure $ review {spec := review spec, term := term}

end expander
end lean
