diff options
author | Ludovic Courtès <ludo@gnu.org> | 2012-01-26 00:35:46 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2012-01-26 00:35:46 +0100 |
commit | 60273407f92fdfe36c3ec09decfd92746bbb4f5e (patch) | |
tree | 413bd76e3638c8e942125e7b1fe72e2821dab2af /module/language | |
parent | 40fb4e317b2a03a2b6ee0c7b7d0f1c37bed25d05 (diff) | |
download | guile-60273407f92fdfe36c3ec09decfd92746bbb4f5e.tar.gz |
Add warnings for unsupported `simple-format' options.
* module/language/tree-il/analyze.scm
(format-analysis)[check-simple-format-args]: New procedure. Use it.
Add support for applications of <module-ref>.
* module/system/base/message.scm (%warning-types): Handle the `format
simple-format' warning.
* module/language/scheme/spec.scm (scheme)[make-default-environment]:
Use `simple-format' as the default `format'.
* test-suite/tests/tree-il.test ("warnings")["format"]: Explicitly use
(@ (ice-9 format) format) where needed.
("simple-format"): New test prefix.
Diffstat (limited to 'module/language')
-rw-r--r-- | module/language/scheme/spec.scm | 9 | ||||
-rw-r--r-- | module/language/tree-il/analyze.scm | 47 |
2 files changed, 52 insertions, 4 deletions
diff --git a/module/language/scheme/spec.scm b/module/language/scheme/spec.scm index 0df4171ff..e4cf55c4c 100644 --- a/module/language/scheme/spec.scm +++ b/module/language/scheme/spec.scm @@ -1,6 +1,6 @@ ;;; Guile Scheme specification -;; Copyright (C) 2001, 2009, 2010, 2011 Free Software Foundation, Inc. +;; Copyright (C) 2001, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. ;;;; This library is free software; you can redistribute it and/or ;;;; modify it under the terms of the GNU Lesser General Public @@ -53,4 +53,11 @@ ;; compile-time changes to `current-reader' are ;; limited to the current compilation unit. (module-define! m 'current-reader (make-fluid)) + + ;; Default to `simple-format', as is the case until + ;; (ice-9 format) is loaded. This allows + ;; compile-time warnings to be emitted when using + ;; unsupported options. + (module-set! m 'format simple-format) + m))) diff --git a/module/language/tree-il/analyze.scm b/module/language/tree-il/analyze.scm index 047019049..efe03789f 100644 --- a/module/language/tree-il/analyze.scm +++ b/module/language/tree-il/analyze.scm @@ -22,6 +22,7 @@ #:use-module (srfi srfi-1) #:use-module (srfi srfi-9) #:use-module (srfi srfi-11) + #:use-module (srfi srfi-26) #:use-module (ice-9 vlist) #:use-module (ice-9 match) #:use-module (system base syntax) @@ -1397,6 +1398,36 @@ accurate information is missing from a given `tree-il' element." (else (warning 'format loc 'wrong-num-args (length args))))) + (define (check-simple-format-args args loc) + ;; Check the arguments to the `simple-format' procedure, which is + ;; less capable than that of (ice-9 format). + + (define allowed-chars + '(#\A #\S #\a #\s #\~ #\%)) + + (define (format-chars fmt) + (let loop ((chars (string->list fmt)) + (result '())) + (match chars + (() + (reverse result)) + ((#\~ opt rest ...) + (loop rest (cons opt result))) + ((_ rest ...) + (loop rest result))))) + + (match args + ((port ($ <const> _ (? string? fmt)) _ ...) + (let ((opts (format-chars fmt))) + (or (every (cut memq <> allowed-chars) opts) + (begin + (warning 'format loc 'simple-format fmt + (find (negate (cut memq <> allowed-chars)) opts)) + #f)))) + ((port (($ <const> _ '_) fmt) args ...) + (check-simple-format-args `(,port ,fmt ,args) loc)) + (_ #t))) + (define (resolve-toplevel name) (and (module? env) (false-if-exception (module-ref env name)))) @@ -1404,9 +1435,19 @@ accurate information is missing from a given `tree-il' element." (match x (($ <application> src ($ <toplevel-ref> _ name) args) (let ((proc (resolve-toplevel name))) - (and (or (eq? proc format) - (eq? proc (@ (ice-9 format) format))) - (check-format-args args (or src (find pair? locs)))))) + (if (or (and (eq? proc (@ (guile) simple-format)) + (check-simple-format-args args + (or src (find pair? locs)))) + (eq? proc (@ (ice-9 format) format))) + (check-format-args args (or src (find pair? locs)))))) + (($ <application> src ($ <module-ref> _ '(ice-9 format) 'format) args) + (check-format-args args (or src (find pair? locs)))) + (($ <application> src ($ <module-ref> _ '(guile) + (or 'format 'simple-format)) + args) + (and (check-simple-format-args args + (or src (find pair? locs))) + (check-format-args args (or src (find pair? locs))))) (_ #t)) #t) |