From: Neil Puttock <n.puttock@gmail.com>
Date: Sat, 12 Sep 2009 21:07:54 +0000 (+0100)
Subject: Fix #743: Reinstate warnings for unterminated span dynamics.
X-Git-Tag: release/2.12.3-1~10
X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=2459c66ea8366f6541be25728973975ee0bc4d62;p=lilypond.git

Fix #743: Reinstate warnings for unterminated span dynamics.
(cherry picked from commit 4f00600ac4a7ab1e268cd04014001c01a4df3985)
---

diff --git a/input/regression/warn-unterminated-span-dynamic.ly b/input/regression/warn-unterminated-span-dynamic.ly
new file mode 100644
index 0000000000..88c35b2840
--- /dev/null
+++ b/input/regression/warn-unterminated-span-dynamic.ly
@@ -0,0 +1,18 @@
+\version "2.12.3"
+
+\header {
+  texidoc = "A warning is printed if a dynamic spanner is
+unterminated."
+}
+
+<<
+  \new Staff {
+    % warning expected: unterminated crescendo
+    c'1\<
+  }
+  \new Staff {
+    % warning expected: unterminated decrescendo
+    c'1\>
+  }
+>>
+
diff --git a/lily/new-dynamic-engraver.cc b/lily/new-dynamic-engraver.cc
index 8c8fce9800..ac652216f7 100644
--- a/lily/new-dynamic-engraver.cc
+++ b/lily/new-dynamic-engraver.cc
@@ -32,7 +32,11 @@ class New_dynamic_engraver : public Engraver
 protected:
   virtual void process_music ();
   virtual void stop_translation_timestep ();
+  virtual void finalize ();
+
 private:
+  string get_spanner_type (Stream_event *ev);
+
   Drul_array<Stream_event *> accepted_spanevents_drul_;
   Spanner *current_spanner_;
   Spanner *finished_spanner_;
@@ -75,7 +79,7 @@ New_dynamic_engraver::process_music ()
   if (current_spanner_
       && (accepted_spanevents_drul_[STOP] || script_event_ || accepted_spanevents_drul_[START]))
     {
-      Stream_event* ender = accepted_spanevents_drul_[STOP];
+      Stream_event *ender = accepted_spanevents_drul_[STOP];
       if (!ender)
 	ender = script_event_;
 
@@ -91,20 +95,8 @@ New_dynamic_engraver::process_music ()
   if (accepted_spanevents_drul_[START])
     {
       current_span_event_ = accepted_spanevents_drul_[START];
-      
-      SCM start_sym = current_span_event_->get_property ("class");
-      string start_type;
-	  
-      if (start_sym == ly_symbol2scm ("decrescendo-event"))
-	start_type = "decrescendo";
-      else if (start_sym == ly_symbol2scm ("crescendo-event"))
-	start_type = "crescendo";
-      else
-	{
-	  programming_error ("unknown dynamic spanner type");
-	  return;
-	}
-      
+
+      string start_type = get_spanner_type (current_span_event_);
       SCM cresc_type = get_property ((start_type + "Spanner").c_str ());
 
       if (cresc_type == ly_symbol2scm ("text"))
@@ -123,7 +115,6 @@ New_dynamic_engraver::process_music ()
 	{
 	  if (cresc_type != ly_symbol2scm ("hairpin"))
 	    {
-	      // Fixme: should put value in error message.
 	      string as_string = ly_scm_write_string (cresc_type);
 	      current_span_event_
 		->origin()->warning (_f ("unknown crescendo style: %s\ndefaulting to hairpin.", as_string.c_str()));
@@ -185,6 +176,38 @@ New_dynamic_engraver::stop_translation_timestep ()
   finished_spanner_ = 0;
 }
 
+void
+New_dynamic_engraver::finalize ()
+{
+  if (current_spanner_
+      && !current_spanner_->is_live ())
+    current_spanner_ = 0;
+  if (current_spanner_)
+    {
+      current_span_event_
+	->origin ()->warning (_f ("unterminated %s",
+				  get_spanner_type (current_span_event_)
+				  .c_str ()));
+      current_spanner_->suicide ();
+      current_spanner_ = 0;
+    }
+}
+
+string
+New_dynamic_engraver::get_spanner_type (Stream_event *ev)
+{
+  string type;
+  SCM start_sym = ev->get_property ("class");
+
+  if (start_sym == ly_symbol2scm ("decrescendo-event"))
+    type = "decrescendo";
+  else if (start_sym == ly_symbol2scm ("crescendo-event"))
+    type = "crescendo";
+  else
+    programming_error ("unknown dynamic spanner type");
+  return type;
+}
+
 void
 New_dynamic_engraver::acknowledge_note_column (Grob_info info)
 {