From: David Kastrup <dak@gnu.org> Date: Sun, 11 Mar 2012 11:19:36 +0000 (+0100) Subject: Make context-defs-from-music operate on multiple contexts matched via aliases or... X-Git-Tag: release/2.15.34-1~13 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=2bdac3eb5b8303ca2a334cdc9b50323ae856c18b;p=lilypond.git Make context-defs-from-music operate on multiple contexts matched via aliases or Bottom --- diff --git a/scm/lily-library.scm b/scm/lily-library.scm index b109b81be6..2b87a2881e 100644 --- a/scm/lily-library.scm +++ b/scm/lily-library.scm @@ -302,15 +302,29 @@ bookoutput function" mods)) (define-public (context-defs-from-music parser output-def music) - (let ((bottom 'Voice) (warn #t)) - (define (get-bottom sym) - (or - (let ((def (ly:output-def-lookup output-def sym #f))) - (and def - (let ((def-child (ly:context-def-lookup def 'default-child #f))) - (and def-child - (get-bottom def-child))))) - sym)) + (define (get-defs name) + ;; Get all context definition symbols matching the given context + ;; name. Maybe this should be done in C++, or use + ;; ly:output-description (at some cost in consing). + (let ((defs '())) + (if (eq? name 'Bottom) + (module-for-each + (lambda (sym var) + (let ((cdef (variable-ref var))) + (if (and (ly:context-def? cdef) + (null? (ly:context-def-lookup cdef 'accepts))) + (set! defs (cons sym defs))))) + (ly:output-def-scope output-def)) + (module-for-each + (lambda (sym var) + (let ((cdef (variable-ref var))) + (if (and (ly:context-def? cdef) + (or (eq? name (ly:context-def-lookup cdef 'context-name)) + (memq name (ly:context-def-lookup cdef 'aliases)))) + (set! defs (cons sym defs))))) + (ly:output-def-scope output-def))) + defs)) + (let ((warn #t)) (let loop ((m music) (mods #f)) ;; The parser turns all sets, overrides etc into something ;; wrapped in ContextSpeccedMusic. If we ever get a set, @@ -345,21 +359,22 @@ bookoutput function" (list 'apply (ly:music-property m 'procedure)))) ((ContextSpeccedMusic) - (let ((sym (ly:music-property m 'context-type))) - (if (eq? sym 'Bottom) - (set! sym bottom) - (set! bottom (get-bottom sym))) - (let ((def (ly:output-def-lookup output-def sym))) - (if (ly:context-def? def) - (ly:output-def-set-variable! - output-def sym - (ly:context-def-modify - def - (loop (ly:music-property m 'element) - (ly:make-context-mod)))) - (ly:music-warning - music - (ly:format (_ "Cannot find context-def \\~a") sym)))))) + (let ((defs (get-defs (ly:music-property m 'context-type))) + (mods (loop (ly:music-property m 'element) + (ly:make-context-mod)))) + (if (null? defs) + (ly:music-warning + music + (ly:format (_ "Cannot find context-def \\~a") + (ly:music-property m 'context-type))) + (for-each + (lambda (sym) + (ly:output-def-set-variable! + output-def sym + (ly:context-def-modify + (ly:output-def-lookup output-def sym) + mods))) + defs)))) (else (let ((callback (ly:music-property m 'elements-callback))) (if (procedure? callback)