diff options
author | Lars-Dominik Braun <lars@6xq.net> | 2022-04-30 15:39:34 +0200 |
---|---|---|
committer | Lars-Dominik Braun <lars@6xq.net> | 2022-06-06 13:26:45 +0200 |
commit | 0972feaff1f766c1759d0b89876132ae473725ce (patch) | |
tree | ab6161f8ed2c2445836bf0a0b933589e0201ca73 /guix/import | |
parent | 2c5d18e421e6c06f4a969f98585ec41aae8eb2e4 (diff) |
import: cabal: Allow curly brackets in more positions.
* guix/import/cabal.scm (is-layout-property): Do not expect end of line.
(lex-layout-property): Check for newline.
(lex-property): Stop reading on closing curly bracket.
* tests/hackage.scm (test-read-cabal-2): New variable.
("read-cabal test: if brackets on the same line"): New test.
Diffstat (limited to 'guix/import')
-rw-r--r-- | guix/import/cabal.scm | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/guix/import/cabal.scm b/guix/import/cabal.scm index e1a082a31a..364fcc3176 100644 --- a/guix/import/cabal.scm +++ b/guix/import/cabal.scm @@ -354,7 +354,7 @@ matching a string against the created regexp." (make-regexp pat)))) (cut regexp-exec rx <>))) -(define is-layout-property (make-rx-matcher "([a-z0-9-]+)[ \t]*:[ \t]*(\\w?[^{}]*)$" +(define is-layout-property (make-rx-matcher "([a-z0-9-]+)[ \t]*:[ \t]*(\\w?[^{}]*)" regexp/icase)) (define is-braced-property (make-rx-matcher "([a-z0-9-]+)[ \t]*:[ \t]*\\{[ \t]*$" @@ -465,7 +465,10 @@ string with the read characters." (value (match:substring k-v-rx-res 2))) (make-lexical-token 'PROPERTY loc - (list key `(,(read-value port value (current-indentation))))))) + (list key `(,(if (eqv? (peek-char port) #\newline) ; The next character + ; is not necessarily a newline if a bracket follows the property. + (read-value port value (current-indentation)) + value)))))) (define (lex-braced-property k-rx-res loc port) (let ((key (string-downcase (match:substring k-rx-res 1)))) @@ -600,7 +603,9 @@ the current port location." (else (unread-string s port) #f)))) (define (lex-property port loc) - (let* ((s (read-delimited "\n" port 'peek))) + ;; Stop reading on a }, so closing brackets (for example during + ;; if-clauses) work properly. + (let* ((s (read-delimited "\n}" port 'peek))) (cond ((is-braced-property s) => (cut lex-braced-property <> loc port)) ((is-layout-property s) => (cut lex-layout-property <> loc port)) |