]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 4674: Disallow "Scheme_engraver" as an engraver class of its own
authorDavid Kastrup <dak@gnu.org>
Sun, 14 Jun 2015 15:43:13 +0000 (17:43 +0200)
committerDavid Kastrup <dak@gnu.org>
Fri, 4 Dec 2015 15:09:31 +0000 (16:09 +0100)
It should not be registered as "Scheme_engraver", and no instances of it
should be allowed to exist without a definition of their own.

Also, instead of TRANSLATOR_DECLARATIONS_NO_LISTENER we use
TRANSLATOR_FAMILY_DECLARATIONS for anything not pertaining to an
individually documented translator.

lily/include/scheme-engraver.hh
lily/include/translator.hh
lily/include/translator.icc
lily/scheme-engraver.cc
lily/translator-group.cc

index c7d16d76e9c10145d090472de46688384279f6dd..e22e572c7fe6ec15c07d2728b55970e25b19096a 100644 (file)
 
 class Scheme_engraver : public Engraver
 {
-public:
   void init_from_scheme (SCM definition);
-  TRANSLATOR_DECLARATIONS_NO_LISTENER (Scheme_engraver);
+public:
+  TRANSLATOR_FAMILY_DECLARATIONS (Scheme_engraver);
+  Scheme_engraver (SCM definition);
 
 protected:
   ~Scheme_engraver ();
@@ -68,8 +69,6 @@ private:
   // Alist of listened-symbol . scheme-function
   SCM listeners_alist_;
 
-  // We dont use this, but need it for the documentation boilerplate.
-  static Protected_scm listener_list_;
   SCM per_instance_listeners_;
 };
 
index 8154409efced3e763e13a6bd5862a371d8f7ae81..a4cf192ffffa47c9787b66d5cdd6cb3f38329811 100644 (file)
 #include "std-vector.hh"
 #include "protected-scm.hh"
 
-#define TRANSLATOR_DECLARATIONS_NO_LISTENER(NAME)                       \
+#define TRANSLATOR_FAMILY_DECLARATIONS(NAME)                            \
   public:                                                               \
-  NAME ();                                                              \
   VIRTUAL_COPY_CONSTRUCTOR (Translator, NAME);                          \
-  static SCM static_description_;                                       \
   static Drul_array<vector<Acknowledge_information> > acknowledge_static_array_drul_; \
-  virtual void fetch_precomputable_methods (Callback methods[]); \
-  virtual SCM static_translator_description () const;                   \
-  virtual SCM translator_description () const;                          \
+  virtual void fetch_precomputable_methods (Callback methods[]);        \
   static Grob_info_callback static_get_acknowledger (SCM sym);          \
   static Grob_info_callback static_get_end_acknowledger(SCM);           \
   virtual Grob_info_callback get_acknowledger (SCM sym)                 \
@@ -46,7 +42,7 @@
   virtual Grob_info_callback get_end_acknowledger (SCM sym)             \
   {                                                                     \
     return static_get_end_acknowledger (sym);                           \
-  } \
+  }                                                                     \
   /* end #define */
 
 /*
 */
 
 #define TRANSLATOR_DECLARATIONS(NAME)                                   \
-  TRANSLATOR_DECLARATIONS_NO_LISTENER(NAME)                             \
-private:                                                                \
+  TRANSLATOR_FAMILY_DECLARATIONS(NAME)                                  \
+  static SCM static_description_;                                       \
   static Protected_scm listener_list_;                                  \
 public:                                                                 \
+  NAME ();                                                              \
+  virtual SCM static_translator_description () const;                   \
+  virtual SCM translator_description () const;                          \
   virtual SCM get_listener_list () const                                \
   {                                                                     \
     return listener_list_;                                              \
index 7fc128fe72f68d732fa448f9a42d4755fc17e7c3..d5057021362c398b4418c2c4d1b5e9e3ecc2d9ea 100644 (file)
     return Translator::static_translator_description (grobs, desc, listener_list_, read, write); \
   }
 
-#define ADD_TRANSLATOR(classname, desc, grobs, read, write)             \
+#define ADD_TRANSLATOR_FAMILY(classname)                                \
   IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS (classname);                    \
+  DEFINE_ACKNOWLEDGERS(classname)                                       \
+
+#define ADD_TRANSLATOR(classname, desc, grobs, read, write)             \
+  ADD_TRANSLATOR_FAMILY (classname)                                     \
   ADD_THIS_TRANSLATOR (classname);                                      \
   DEFINE_TRANSLATOR_DOC(classname, desc, grobs, read, write)            \
-  DEFINE_ACKNOWLEDGERS(classname) \
-  DEFINE_TRANSLATOR_LISTENER_LIST(classname) \
+  DEFINE_TRANSLATOR_LISTENER_LIST(classname)                            \
 
 #define IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(T)                        \
   void                                                                  \
index 7e601f8db7563014ad81b18a02981f6bf811780e..ec4197641bfcba78386ee3b11c9becd6e24cf762 100644 (file)
@@ -25,7 +25,7 @@
 
 #include "translator.icc"
 
-Scheme_engraver::Scheme_engraver ()
+Scheme_engraver::Scheme_engraver (SCM definition)
 {
   stop_translation_timestep_function_ = SCM_EOL;
   start_translation_timestep_function_ = SCM_EOL;
@@ -39,6 +39,8 @@ Scheme_engraver::Scheme_engraver ()
 
   must_be_last_ = false;
   per_instance_listeners_ = SCM_EOL;
+
+  init_from_scheme (definition);
 }
 
 Scheme_engraver::~Scheme_engraver ()
@@ -194,17 +196,4 @@ Scheme_engraver::derived_mark () const
 ADD_ACKNOWLEDGER (Scheme_engraver, grob);
 ADD_END_ACKNOWLEDGER (Scheme_engraver, grob);
 
-ADD_TRANSLATOR (Scheme_engraver,
-                /* doc */
-                "Implement engravers in Scheme.  Interprets arguments to"
-                " @code{\\consists} as callbacks.",
-
-                /* create */
-                "",
-
-                /* read */
-                "",
-
-                /* write */
-                ""
-               );
+ADD_TRANSLATOR_FAMILY (Scheme_engraver);
index 831a4790b08da67363a9106c7c4ff24ebe7aa4e1..e3f8cba3e8c7393b6a0ed493164c231842fb2541 100644 (file)
@@ -170,7 +170,6 @@ Translator_group::create_child_translator (SCM sev)
         type = get_translator (definition);
       else if (ly_is_pair (definition))
         {
-          type = get_translator (ly_symbol2scm ("Scheme_engraver"));
           is_scheme = true;
         }
       else if (ly_is_procedure (definition))
@@ -179,17 +178,15 @@ Translator_group::create_child_translator (SCM sev)
           // an argument and evaluates to an a-list scheme engraver
           // definition.
           definition = scm_call_1 (definition, cs);
-          type = get_translator (ly_symbol2scm ("Scheme_engraver"));
           is_scheme = true;
         }
 
-      if (!type)
+      if (!is_scheme && !type)
         warning (_f ("cannot find: `%s'", ly_symbol2string (scm_car (s)).c_str ()));
       else
         {
-          Translator *instance = type->clone ();
-          if (is_scheme)
-            dynamic_cast<Scheme_engraver *> (instance)->init_from_scheme (definition);
+          Translator *instance = is_scheme ? new Scheme_engraver (definition)
+            : type->clone ();
 
           SCM str = instance->self_scm ();