|
214 | 214 | (refactor-visited-forms |
215 | 215 | #:analysis analysis #:suite effective-suite #:comments comments #:lines lines))) |
216 | 216 |
|
217 | | - (refactoring-result-set #:base-source source #:results results)) |
| 217 | + (define result-set (refactoring-result-set #:base-source source #:results results)) |
| 218 | + |
| 219 | + ;; Filter out result sets that produce non-compiling code |
| 220 | + (cond |
| 221 | + [(and (not (empty? results)) |
| 222 | + (not (refactoring-result-set-compiles? result-set))) |
| 223 | + (log-resyntax-warning |
| 224 | + "dropping ~a refactoring suggestion~a for ~a because the modified code does not compile" |
| 225 | + (length results) |
| 226 | + (if (equal? (length results) 1) "" "s") |
| 227 | + (or (source-path source) "string source")) |
| 228 | + (refactoring-result-set #:base-source source #:results '())] |
| 229 | + [else result-set])) |
218 | 230 |
|
219 | 231 |
|
220 | 232 | (define/guard (reysntax-analyze-for-properties-only source #:suite [suite default-recommendations]) |
|
335 | 347 | (grouping into-list) |
336 | 348 | (mapping |
337 | 349 | (λ (e) (refactoring-result-set #:base-source (entry-key e) #:results (entry-value e)))) |
| 350 | + (filtering |
| 351 | + (λ (result-set) |
| 352 | + (define compiles? (refactoring-result-set-compiles? result-set)) |
| 353 | + (unless compiles? |
| 354 | + (define source (refactoring-result-set-base-source result-set)) |
| 355 | + (define num-results (length (refactoring-result-set-results result-set))) |
| 356 | + (log-resyntax-warning |
| 357 | + "dropping ~a refactoring suggestion~a for ~a because the modified code does not compile" |
| 358 | + num-results |
| 359 | + (if (equal? num-results 1) "" "s") |
| 360 | + (or (source-path source) "string source"))) |
| 361 | + compiles?)) |
338 | 362 | (indexing refactoring-result-set-base-source) |
339 | 363 | #:into into-hash)) |
340 | 364 |
|
|
478 | 502 | (check-false (set-empty? (refactoring-suite-analyzers test-suite))) |
479 | 503 | ;; Verify that all analyzers in the suite are expansion-analyzer? |
480 | 504 | (check-true (for/and ([analyzer (in-set (refactoring-suite-analyzers test-suite))]) |
481 | | - (expansion-analyzer? analyzer))))) |
| 505 | + (expansion-analyzer? analyzer)))) |
| 506 | + |
| 507 | + (test-case "broken refactoring rules are filtered out" |
| 508 | + ;; Define a refactoring rule that produces code that doesn't compile |
| 509 | + (define-refactoring-rule breaking-rule |
| 510 | + #:description "Breaking refactoring rule" |
| 511 | + #:datum-literals (foo) |
| 512 | + #:literals (define) |
| 513 | + (define foo 42) |
| 514 | + (if)) |
| 515 | + |
| 516 | + (define breaking-suite (refactoring-suite #:rules (list breaking-rule))) |
| 517 | + (define test-source (string-source "#lang racket/base\n\n(define foo 42)\n")) |
| 518 | + |
| 519 | + ;; Test with direct analyze |
| 520 | + (define result-set (resyntax-analyze test-source #:suite breaking-suite)) |
| 521 | + (check-equal? (length (refactoring-result-set-results result-set)) 0 |
| 522 | + "Breaking suggestions should be filtered from resyntax-analyze") |
| 523 | + |
| 524 | + ;; Test with multipass analyze |
| 525 | + (define analysis |
| 526 | + (resyntax-analyze-all (hash test-source (range-set (unbounded-range #:comparator natural<=>))) |
| 527 | + #:suite breaking-suite)) |
| 528 | + (check-equal? (resyntax-analysis-total-fixes analysis) 0 |
| 529 | + "Breaking suggestions should be filtered from resyntax-analyze-all"))) |
0 commit comments