|
374 | 374 | (define (refactoring-rules-refactor rules syntax #:comments comments #:analysis analysis) |
375 | 375 |
|
376 | 376 | (define (refactor rule) |
377 | | - (with-handlers |
378 | | - ([exn:fail? |
379 | | - (λ (e) |
380 | | - (log-resyntax-error "~a: refactoring attempt failed\n syntax:\n ~a\n cause:\n~a" |
381 | | - (object-name rule) |
382 | | - syntax |
383 | | - (string-indent (exn-message e) #:amount 3)) |
384 | | - absent)]) |
385 | | - (guarded-block |
386 | | - (guard-match (present replacement) |
387 | | - (parameterize ([current-namespace (source-code-analysis-namespace analysis)]) |
388 | | - (refactoring-rule-refactor rule syntax (source-code-analysis-code analysis))) |
389 | | - #:else absent) |
390 | | - (guard (syntax-replacement-introduces-incorrect-bindings? replacement) #:else |
391 | | - (define bad-ids (syntax-replacement-introduced-incorrect-identifiers replacement)) |
392 | | - (define orig-stx (syntax-replacement-original-syntax replacement)) |
393 | | - (define intro (syntax-replacement-introduction-scope replacement)) |
394 | | - (log-resyntax-warning |
395 | | - (string-append |
396 | | - "~a: suggestion discarded because it introduces identifiers with incorrect bindings\n" |
397 | | - " incorrect identifiers: ~a\n" |
398 | | - " bindings in original context: ~a\n" |
399 | | - " bindings in syntax replacement: ~a\n" |
400 | | - " replaced syntax: ~a") |
401 | | - (object-name rule) |
402 | | - bad-ids |
403 | | - (for/list ([id (in-list bad-ids)]) |
404 | | - (identifier-binding (datum->syntax orig-stx (syntax->datum id)))) |
405 | | - (for/list ([id (in-list bad-ids)]) |
406 | | - (identifier-binding (intro id 'remove))) |
407 | | - orig-stx) |
408 | | - absent) |
409 | | - (guard (syntax-replacement-preserves-comments? replacement comments) #:else |
410 | | - (log-resyntax-warning |
411 | | - (string-append "~a: suggestion discarded because it does not preserve all comments\n" |
412 | | - " dropped comment locations: ~v\n" |
413 | | - " original syntax:\n" |
414 | | - " ~v\n" |
415 | | - " replacement syntax:\n" |
416 | | - " ~v") |
417 | | - (object-name rule) |
418 | | - (syntax-replacement-dropped-comment-locations replacement comments) |
419 | | - (syntax-replacement-original-syntax replacement) |
420 | | - (syntax-replacement-new-syntax replacement)) |
421 | | - absent) |
422 | | - (present |
423 | | - (refactoring-result |
424 | | - #:rule-name (object-name rule) |
425 | | - #:message (refactoring-rule-description rule) |
426 | | - #:syntax-replacement replacement))))) |
| 377 | + (define rule-name (object-name rule)) |
| 378 | + ;; Check if this rule is suppressed for this syntax |
| 379 | + (if (syntax-suppresses-rule? syntax rule-name) |
| 380 | + absent |
| 381 | + (with-handlers |
| 382 | + ([exn:fail? |
| 383 | + (λ (e) |
| 384 | + (log-resyntax-error "~a: refactoring attempt failed\n syntax:\n ~a\n cause:\n~a" |
| 385 | + rule-name |
| 386 | + syntax |
| 387 | + (string-indent (exn-message e) #:amount 3)) |
| 388 | + absent)]) |
| 389 | + (guarded-block |
| 390 | + (guard-match (present replacement) |
| 391 | + (parameterize ([current-namespace (source-code-analysis-namespace analysis)]) |
| 392 | + (refactoring-rule-refactor rule syntax (source-code-analysis-code analysis))) |
| 393 | + #:else absent) |
| 394 | + (guard (syntax-replacement-introduces-incorrect-bindings? replacement) #:else |
| 395 | + (define bad-ids (syntax-replacement-introduced-incorrect-identifiers replacement)) |
| 396 | + (define orig-stx (syntax-replacement-original-syntax replacement)) |
| 397 | + (define intro (syntax-replacement-introduction-scope replacement)) |
| 398 | + (log-resyntax-warning |
| 399 | + (string-append |
| 400 | + "~a: suggestion discarded because it introduces identifiers with incorrect bindings\n" |
| 401 | + " incorrect identifiers: ~a\n" |
| 402 | + " bindings in original context: ~a\n" |
| 403 | + " bindings in syntax replacement: ~a\n" |
| 404 | + " replaced syntax: ~a") |
| 405 | + rule-name |
| 406 | + bad-ids |
| 407 | + (for/list ([id (in-list bad-ids)]) |
| 408 | + (identifier-binding (datum->syntax orig-stx (syntax->datum id)))) |
| 409 | + (for/list ([id (in-list bad-ids)]) |
| 410 | + (identifier-binding (intro id 'remove))) |
| 411 | + orig-stx) |
| 412 | + absent) |
| 413 | + (guard (syntax-replacement-preserves-comments? replacement comments) #:else |
| 414 | + (log-resyntax-warning |
| 415 | + (string-append "~a: suggestion discarded because it does not preserve all comments\n" |
| 416 | + " dropped comment locations: ~v\n" |
| 417 | + " original syntax:\n" |
| 418 | + " ~v\n" |
| 419 | + " replacement syntax:\n" |
| 420 | + " ~v") |
| 421 | + rule-name |
| 422 | + (syntax-replacement-dropped-comment-locations replacement comments) |
| 423 | + (syntax-replacement-original-syntax replacement) |
| 424 | + (syntax-replacement-new-syntax replacement)) |
| 425 | + absent) |
| 426 | + (present |
| 427 | + (refactoring-result |
| 428 | + #:rule-name rule-name |
| 429 | + #:message (refactoring-rule-description rule) |
| 430 | + #:syntax-replacement replacement)))))) |
427 | 431 |
|
428 | 432 | (falsey->option |
429 | 433 | (for*/first ([rule (in-list rules)] |
|
0 commit comments