From e8847c033921578ffdbcef014f01355ea4059960 Mon Sep 17 00:00:00 2001 From: Neil Puttock Date: Sun, 6 Sep 2009 23:35:33 +0100 Subject: [PATCH] Fix #743: Reinstate warnings for unterminated span dynamics. --- .../warn-unterminated-span-dynamic.ly | 20 +++++++ lily/new-dynamic-engraver.cc | 54 +++++++++++++------ 2 files changed, 58 insertions(+), 16 deletions(-) create mode 100644 input/regression/warn-unterminated-span-dynamic.ly diff --git a/input/regression/warn-unterminated-span-dynamic.ly b/input/regression/warn-unterminated-span-dynamic.ly new file mode 100644 index 0000000000..ca5a66ac8f --- /dev/null +++ b/input/regression/warn-unterminated-span-dynamic.ly @@ -0,0 +1,20 @@ +\version "2.13.4" + +#(ly:set-option 'warning-as-error #f) + +\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 54aa8a8c6d..235dc178d9 100644 --- a/lily/new-dynamic-engraver.cc +++ b/lily/new-dynamic-engraver.cc @@ -32,8 +32,11 @@ class New_dynamic_engraver : public Engraver protected: virtual void process_music (); virtual void stop_translation_timestep (); + virtual void finalize (); + private: SCM get_property_setting (Stream_event *evt, char const *evprop, char const *ctxprop); + string get_spanner_type (Stream_event *ev); Drul_array accepted_spanevents_drul_; Spanner *current_spanner_; @@ -85,7 +88,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_; @@ -101,20 +104,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_setting (current_span_event_, "span-type", (start_type + "Spanner").c_str ()); @@ -135,7 +126,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())); @@ -197,6 +187,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) { -- 2.39.5