From 7c36dbb1834c7c68e4b94777241de3ea02971aca Mon Sep 17 00:00:00 2001
From: David Kastrup <dak@gnu.org>
Date: Sun, 5 Jun 2016 21:10:00 +0200
Subject: [PATCH] Issue 4885/2: Let ADD_ACKNOWLEDGER state actual classes

Declaring the correct containing classes for acknowledgers
allows dropping a bunch of black magic.
---
 lily/auto-beam-engraver.cc                  | 11 +++++-----
 lily/beam-engraver.cc                       |  4 ++--
 lily/include/gregorian-ligature-engraver.hh |  2 +-
 lily/include/ligature-engraver.hh           |  6 +++---
 lily/include/slur-proto-engraver.hh         | 24 +++++++++++----------
 lily/kievan-ligature-engraver.cc            |  4 ++--
 lily/mensural-ligature-engraver.cc          |  4 ++--
 lily/phrasing-slur-engraver.cc              | 16 +++++++-------
 lily/slur-engraver.cc                       | 16 +++++++-------
 lily/vaticana-ligature-engraver.cc          |  4 ++--
 10 files changed, 47 insertions(+), 44 deletions(-)

diff --git a/lily/auto-beam-engraver.cc b/lily/auto-beam-engraver.cc
index 148ed44c77..9e4a1ac28c 100644
--- a/lily/auto-beam-engraver.cc
+++ b/lily/auto-beam-engraver.cc
@@ -45,6 +45,7 @@ protected:
   virtual void finalize ();
   virtual void derived_mark () const;
 
+public:
   void acknowledge_rest (Grob_info);
   void acknowledge_beam (Grob_info);
   void acknowledge_bar_line (Grob_info);
@@ -646,11 +647,11 @@ void
 Grace_auto_beam_engraver::boot ()
 {
   ADD_LISTENER (Grace_auto_beam_engraver, beam_forbid);
-  ADD_ACKNOWLEDGER (Grace_auto_beam_engraver, stem);
-  ADD_ACKNOWLEDGER (Grace_auto_beam_engraver, bar_line);
-  ADD_ACKNOWLEDGER (Grace_auto_beam_engraver, beam);
-  ADD_ACKNOWLEDGER (Grace_auto_beam_engraver, breathing_sign);
-  ADD_ACKNOWLEDGER (Grace_auto_beam_engraver, rest);
+  ADD_ACKNOWLEDGER (Auto_beam_engraver, stem);
+  ADD_ACKNOWLEDGER (Auto_beam_engraver, bar_line);
+  ADD_ACKNOWLEDGER (Auto_beam_engraver, beam);
+  ADD_ACKNOWLEDGER (Auto_beam_engraver, breathing_sign);
+  ADD_ACKNOWLEDGER (Auto_beam_engraver, rest);
 }
 
 ADD_TRANSLATOR (Grace_auto_beam_engraver,
diff --git a/lily/beam-engraver.cc b/lily/beam-engraver.cc
index c9e9a12d49..277d1b0a0e 100644
--- a/lily/beam-engraver.cc
+++ b/lily/beam-engraver.cc
@@ -387,8 +387,8 @@ void
 Grace_beam_engraver::boot ()
 {
   ADD_LISTENER (Grace_beam_engraver, beam);
-  ADD_ACKNOWLEDGER (Grace_beam_engraver, stem);
-  ADD_ACKNOWLEDGER (Grace_beam_engraver, rest);
+  ADD_ACKNOWLEDGER (Beam_engraver, stem);
+  ADD_ACKNOWLEDGER (Beam_engraver, rest);
 }
 
 ADD_TRANSLATOR (Grace_beam_engraver,
diff --git a/lily/include/gregorian-ligature-engraver.hh b/lily/include/gregorian-ligature-engraver.hh
index a29b9d64e8..3fea29c26c 100644
--- a/lily/include/gregorian-ligature-engraver.hh
+++ b/lily/include/gregorian-ligature-engraver.hh
@@ -26,6 +26,7 @@ class Gregorian_ligature_engraver : public Coherent_ligature_engraver
   Stream_event *pes_or_flexa_req_;
 
 public:
+  void listen_pes_or_flexa (Stream_event *ev);
   // no TRANSLATOR_DECLARATIONS (Gregorian_ligature_engraver) needed
   // since this class is abstract
 
@@ -34,7 +35,6 @@ public:
 protected:
   Gregorian_ligature_engraver ();
 
-  virtual void listen_pes_or_flexa (Stream_event *ev);
   virtual void build_ligature (Spanner *ligature,
                                vector<Grob_info> const &primitives);
   virtual void transform_heads (Spanner *ligature,
diff --git a/lily/include/ligature-engraver.hh b/lily/include/ligature-engraver.hh
index 726496e91f..1f8fd8b85f 100644
--- a/lily/include/ligature-engraver.hh
+++ b/lily/include/ligature-engraver.hh
@@ -30,9 +30,6 @@ protected:
   void stop_translation_timestep ();
   virtual void finalize ();
 
-  void acknowledge_rest (Grob_info);
-  void acknowledge_ligature_head (Grob_info);
-  virtual void listen_ligature (Stream_event *ev);
   void process_music ();
   virtual Spanner *create_ligature_spanner () = 0;
   virtual void typeset_ligature (Spanner *ligature,
@@ -41,6 +38,9 @@ protected:
   SCM brew_ligature_primitive_proc;
 
 public:
+  void acknowledge_rest (Grob_info);
+  void acknowledge_ligature_head (Grob_info);
+  void listen_ligature (Stream_event *ev);
   // no TRANSLATOR_DECLARATIONS (Ligature_engraver) needed since this
   // class is abstract
   DECLARE_TRANSLATOR_CALLBACKS (Ligature_engraver);
diff --git a/lily/include/slur-proto-engraver.hh b/lily/include/slur-proto-engraver.hh
index 22d773de41..97ed1a6637 100644
--- a/lily/include/slur-proto-engraver.hh
+++ b/lily/include/slur-proto-engraver.hh
@@ -54,17 +54,6 @@ protected:
   const char* event_name_;
   virtual SCM event_symbol () = 0;
 
-  void acknowledge_inline_accidental (Grob_info);
-  void acknowledge_fingering (Grob_info);
-  void acknowledge_note_column (Grob_info);
-  void acknowledge_script (Grob_info);
-  void acknowledge_dots (Grob_info);
-  void acknowledge_text_script (Grob_info);
-  void acknowledge_end_tie (Grob_info);
-  void acknowledge_tuplet_number (Grob_info);
-
-  void listen_note (Stream_event *ev);
-  void listen_slur (Stream_event *ev, Stream_event *note = 0);
   void acknowledge_extra_object (Grob_info);
   void stop_translation_timestep ();
   void process_music ();
@@ -78,6 +67,19 @@ protected:
   virtual void derived_mark () const;
 
 public:
+  void acknowledge_inline_accidental (Grob_info);
+  void acknowledge_fingering (Grob_info);
+  void acknowledge_note_column (Grob_info);
+  void acknowledge_script (Grob_info);
+  void acknowledge_dots (Grob_info);
+  void acknowledge_text_script (Grob_info);
+  void acknowledge_end_tie (Grob_info);
+  void acknowledge_tuplet_number (Grob_info);
+  void listen_note (Stream_event *ev);
+  void listen_slur (Stream_event *ev, Stream_event *note);
+  // You'd think the following is the same as defaulting `note' to 0,
+  // but template resolution for trampolines disagrees.  Huh.
+  void listen_slur (Stream_event *ev) { listen_slur (ev, 0); }
   // no TRANSLATOR_DECLARATIONS (Slur_proto_engraver) needed since this
   // class is abstract
   DECLARE_TRANSLATOR_CALLBACKS (Slur_proto_engraver);
diff --git a/lily/kievan-ligature-engraver.cc b/lily/kievan-ligature-engraver.cc
index 8934800cdf..f5de30f9b9 100644
--- a/lily/kievan-ligature-engraver.cc
+++ b/lily/kievan-ligature-engraver.cc
@@ -140,8 +140,8 @@ void
 Kievan_ligature_engraver::boot ()
 {
   ADD_LISTENER (Kievan_ligature_engraver, ligature);
-  ADD_ACKNOWLEDGER (Kievan_ligature_engraver, rest);
-  ADD_ACKNOWLEDGER (Kievan_ligature_engraver, ligature_head);
+  ADD_ACKNOWLEDGER (Ligature_engraver, rest);
+  ADD_ACKNOWLEDGER (Ligature_engraver, ligature_head);
 }
 
 ADD_TRANSLATOR (Kievan_ligature_engraver,
diff --git a/lily/mensural-ligature-engraver.cc b/lily/mensural-ligature-engraver.cc
index b66a3ea381..adff282c1b 100644
--- a/lily/mensural-ligature-engraver.cc
+++ b/lily/mensural-ligature-engraver.cc
@@ -500,8 +500,8 @@ void
 Mensural_ligature_engraver::boot ()
 {
   ADD_LISTENER (Mensural_ligature_engraver, ligature);
-  ADD_ACKNOWLEDGER (Mensural_ligature_engraver, rest);
-  ADD_ACKNOWLEDGER (Mensural_ligature_engraver, ligature_head);
+  ADD_ACKNOWLEDGER (Ligature_engraver, rest);
+  ADD_ACKNOWLEDGER (Ligature_engraver, ligature_head);
 }
 
 ADD_TRANSLATOR (Mensural_ligature_engraver,
diff --git a/lily/phrasing-slur-engraver.cc b/lily/phrasing-slur-engraver.cc
index a4e1214928..c53d242c8c 100644
--- a/lily/phrasing-slur-engraver.cc
+++ b/lily/phrasing-slur-engraver.cc
@@ -80,15 +80,15 @@ Phrasing_slur_engraver::boot ()
 {
   ADD_LISTENER (Phrasing_slur_engraver, phrasing_slur);
   ADD_LISTENER (Phrasing_slur_engraver, note);
-  ADD_ACKNOWLEDGER (Phrasing_slur_engraver, inline_accidental);
-  ADD_ACKNOWLEDGER (Phrasing_slur_engraver, fingering);
-  ADD_ACKNOWLEDGER (Phrasing_slur_engraver, note_column);
+  ADD_ACKNOWLEDGER (Slur_proto_engraver, inline_accidental);
+  ADD_ACKNOWLEDGER (Slur_proto_engraver, fingering)
+  ADD_ACKNOWLEDGER (Slur_proto_engraver, note_column);
   ADD_ACKNOWLEDGER (Phrasing_slur_engraver, slur);
-  ADD_ACKNOWLEDGER (Phrasing_slur_engraver, script);
-  ADD_ACKNOWLEDGER (Phrasing_slur_engraver, dots);
-  ADD_ACKNOWLEDGER (Phrasing_slur_engraver, text_script);
-  ADD_END_ACKNOWLEDGER (Phrasing_slur_engraver, tie);
-  ADD_ACKNOWLEDGER (Phrasing_slur_engraver, tuplet_number);
+  ADD_ACKNOWLEDGER (Slur_proto_engraver, script);
+  ADD_ACKNOWLEDGER (Slur_proto_engraver, dots);
+  ADD_ACKNOWLEDGER (Slur_proto_engraver, text_script);
+  ADD_END_ACKNOWLEDGER (Slur_proto_engraver, tie);
+  ADD_ACKNOWLEDGER (Slur_proto_engraver, tuplet_number);
 }
 
 ADD_TRANSLATOR (Phrasing_slur_engraver,
diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc
index 1e7b6b3e1e..f8b0465885 100644
--- a/lily/slur-engraver.cc
+++ b/lily/slur-engraver.cc
@@ -80,14 +80,14 @@ Slur_engraver::boot ()
 {
   ADD_LISTENER (Slur_engraver, slur);
   ADD_LISTENER (Slur_engraver, note);
-  ADD_ACKNOWLEDGER (Slur_engraver, inline_accidental);
-  ADD_ACKNOWLEDGER (Slur_engraver, fingering);
-  ADD_ACKNOWLEDGER (Slur_engraver, note_column);
-  ADD_ACKNOWLEDGER (Slur_engraver, script);
-  ADD_ACKNOWLEDGER (Slur_engraver, text_script);
-  ADD_ACKNOWLEDGER (Slur_engraver, dots);
-  ADD_END_ACKNOWLEDGER (Slur_engraver, tie);
-  ADD_ACKNOWLEDGER (Slur_engraver, tuplet_number);
+  ADD_ACKNOWLEDGER (Slur_proto_engraver, inline_accidental);
+  ADD_ACKNOWLEDGER (Slur_proto_engraver, fingering);
+  ADD_ACKNOWLEDGER (Slur_proto_engraver, note_column);
+  ADD_ACKNOWLEDGER (Slur_proto_engraver, script);
+  ADD_ACKNOWLEDGER (Slur_proto_engraver, text_script);
+  ADD_ACKNOWLEDGER (Slur_proto_engraver, dots);
+  ADD_END_ACKNOWLEDGER (Slur_proto_engraver, tie);
+  ADD_ACKNOWLEDGER (Slur_proto_engraver, tuplet_number);
 }
 
 ADD_TRANSLATOR (Slur_engraver,
diff --git a/lily/vaticana-ligature-engraver.cc b/lily/vaticana-ligature-engraver.cc
index 3d5e6dfa9c..ce3929d9f9 100644
--- a/lily/vaticana-ligature-engraver.cc
+++ b/lily/vaticana-ligature-engraver.cc
@@ -744,8 +744,8 @@ Vaticana_ligature_engraver::boot ()
 {
   ADD_LISTENER (Vaticana_ligature_engraver, pes_or_flexa);
   ADD_LISTENER (Vaticana_ligature_engraver, ligature);
-  ADD_ACKNOWLEDGER (Vaticana_ligature_engraver, rest);
-  ADD_ACKNOWLEDGER (Vaticana_ligature_engraver, ligature_head);
+  ADD_ACKNOWLEDGER (Ligature_engraver, rest);
+  ADD_ACKNOWLEDGER (Ligature_engraver, ligature_head);
 }
 
 ADD_TRANSLATOR (Vaticana_ligature_engraver,
-- 
2.39.5