Skip to content

Commit 63241b2

Browse files
Copilotjackfirth
andauthored
Add analyzers field to refactoring-rule and refactoring-suite types (#699)
Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: jackfirth <[email protected]>
1 parent 313cb8c commit 63241b2

File tree

3 files changed

+115
-15
lines changed

3 files changed

+115
-15
lines changed

base.rkt

Lines changed: 102 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@
1414
(contract-out
1515
[refactoring-rule? (-> any/c boolean?)]
1616
[refactoring-rule-description (-> refactoring-rule? immutable-string?)]
17+
[refactoring-rule-analyzers (-> refactoring-rule? (set/c expansion-analyzer?))]
1718
[refactoring-suite? (-> any/c boolean?)]
1819
[refactoring-suite
1920
(->* ()
2021
(#:rules (sequence/c refactoring-rule?) #:name (or/c interned-symbol? #false))
2122
refactoring-suite?)]
22-
[refactoring-suite-rules (-> refactoring-suite? (listof refactoring-rule?))]))
23+
[refactoring-suite-rules (-> refactoring-suite? (listof refactoring-rule?))]
24+
[refactoring-suite-analyzers (-> refactoring-suite? (set/c expansion-analyzer?))]))
2325

2426

2527
(module+ private
@@ -33,12 +35,18 @@
3335
racket/list
3436
racket/syntax
3537
resyntax/private/more-syntax-parse-classes)
38+
racket/list
3639
racket/sequence
40+
racket/set
3741
rebellion/base/immutable-string
3842
rebellion/base/option
3943
rebellion/base/symbol
4044
rebellion/type/object
45+
resyntax/default-recommendations/analyzers/identifier-usage
46+
resyntax/default-recommendations/analyzers/ignored-result-values
47+
resyntax/default-recommendations/analyzers/variable-mutability
4148
resyntax/default-recommendations/private/definition-context
49+
resyntax/private/analyzer
4250
resyntax/private/logger
4351
resyntax/private/source
4452
resyntax/private/syntax-neighbors
@@ -98,7 +106,7 @@
98106
[(_ new-stx) (syntax-property #'new-stx 'focus-replacement-on #true)]))
99107

100108

101-
(define-object-type refactoring-rule (transformer description uses-universal-tagged-syntax?)
109+
(define-object-type refactoring-rule (transformer description uses-universal-tagged-syntax? analyzers)
102110
#:omit-root-binding
103111
#:constructor-name constructor:refactoring-rule)
104112

@@ -149,6 +157,9 @@
149157
#:name 'id
150158
#:description (string->immutable-string description.c)
151159
#:uses-universal-tagged-syntax? (~? uses-universal-tagged-syntax? #false)
160+
#:analyzers (set identifier-usage-analyzer
161+
ignored-result-values-analyzer
162+
variable-mutability-analyzer)
152163
#:transformer
153164
(λ (stx)
154165
(syntax-parse stx
@@ -218,13 +229,18 @@
218229
expression.refactored)))
219230

220231

221-
(define-object-type refactoring-suite (rules)
232+
(define-object-type refactoring-suite (rules analyzers)
222233
#:constructor-name constructor:refactoring-suite
223234
#:omit-root-binding)
224235

225236

226237
(define (refactoring-suite #:rules [rules '()] #:name [name #false])
227-
(constructor:refactoring-suite #:rules (sequence->list rules) #:name name))
238+
(define rule-list (sequence->list rules))
239+
(define combined-analyzers
240+
(for*/set ([rule (in-list rule-list)]
241+
[analyzer (in-set (refactoring-rule-analyzers rule))])
242+
analyzer))
243+
(constructor:refactoring-suite #:rules rule-list #:analyzers combined-analyzers #:name name))
228244

229245

230246
(begin-for-syntax
@@ -249,3 +265,85 @@
249265
(refactoring-suite
250266
#:name 'id
251267
#:rules (append rules.as-list-expr suites.as-list-expr))))
268+
269+
270+
(module+ test
271+
(require rackunit
272+
resyntax/private/analyzer)
273+
274+
(test-case "refactoring-rule stores analyzers"
275+
(define-refactoring-rule test-rule
276+
#:description "test rule"
277+
pattern
278+
replacement)
279+
280+
(check-true (refactoring-rule? test-rule))
281+
(check-true (set? (refactoring-rule-analyzers test-rule)))
282+
(check-equal? (set-count (refactoring-rule-analyzers test-rule)) 3)
283+
(check-true (for/and ([analyzer (in-set (refactoring-rule-analyzers test-rule))])
284+
(expansion-analyzer? analyzer))))
285+
286+
(test-case "refactoring-suite combines analyzers from rules"
287+
(define-refactoring-rule rule1
288+
#:description "rule 1"
289+
pattern1
290+
replacement1)
291+
292+
(define-refactoring-rule rule2
293+
#:description "rule 2"
294+
pattern2
295+
replacement2)
296+
297+
(define suite (refactoring-suite #:rules (list rule1 rule2)))
298+
299+
(check-true (refactoring-suite? suite))
300+
(check-equal? (length (refactoring-suite-rules suite)) 2)
301+
(check-true (set? (refactoring-suite-analyzers suite)))
302+
;; All rules have the same analyzers, so the combined set should have 3 unique analyzers
303+
(check-equal? (set-count (refactoring-suite-analyzers suite)) 3)
304+
(check-true (for/and ([analyzer (in-set (refactoring-suite-analyzers suite))])
305+
(expansion-analyzer? analyzer))))
306+
307+
(test-case "nested suites combine analyzers correctly"
308+
(define-refactoring-rule inner-rule
309+
#:description "inner rule"
310+
inner-pattern
311+
inner-replacement)
312+
313+
(define inner-suite (refactoring-suite #:rules (list inner-rule)))
314+
315+
(define-refactoring-rule outer-rule
316+
#:description "outer rule"
317+
outer-pattern
318+
outer-replacement)
319+
320+
(define outer-suite (refactoring-suite #:rules (list outer-rule inner-rule)))
321+
322+
(check-equal? (set-count (refactoring-suite-analyzers inner-suite)) 3)
323+
;; Both rules have the same analyzers, so deduplicated should still be 3
324+
(check-equal? (set-count (refactoring-suite-analyzers outer-suite)) 3))
325+
326+
(test-case "define-refactoring-suite with nested suites preserves analyzers"
327+
(define-refactoring-rule rule-a
328+
#:description "Rule A"
329+
pattern-a
330+
replacement-a)
331+
332+
(define-refactoring-suite suite-a
333+
#:rules (rule-a))
334+
335+
(define-refactoring-rule rule-b
336+
#:description "Rule B"
337+
pattern-b
338+
replacement-b)
339+
340+
(define-refactoring-suite suite-b
341+
#:rules (rule-b)
342+
#:suites (suite-a))
343+
344+
;; Suite B should have both rules
345+
(check-equal? (length (refactoring-suite-rules suite-b)) 2)
346+
;; And should have 3 analyzers (deduplicated from both rules)
347+
(check-equal? (set-count (refactoring-suite-analyzers suite-b)) 3)
348+
(check-true (for/and ([analyzer (in-set (refactoring-suite-analyzers suite-b))])
349+
(expansion-analyzer? analyzer)))))

main.rkt

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,6 @@
5252
rebellion/type/record
5353
resyntax/base
5454
resyntax/default-recommendations
55-
resyntax/default-recommendations/analyzers/identifier-usage
56-
resyntax/default-recommendations/analyzers/ignored-result-values
57-
resyntax/default-recommendations/analyzers/variable-mutability
5855
resyntax/private/analysis
5956
resyntax/private/comment-reader
6057
resyntax/private/git
@@ -75,6 +72,7 @@
7572
(module+ test
7673
(require racket/list
7774
rackunit
75+
resyntax/private/analyzer
7876
(submod "..")))
7977

8078

@@ -211,9 +209,7 @@
211209
(with-handlers ([exn:fail? skip])
212210
(define analysis (source-analyze source
213211
#:lines lines
214-
#:analyzers (list identifier-usage-analyzer
215-
ignored-result-values-analyzer
216-
variable-mutability-analyzer)))
212+
#:analyzers (refactoring-suite-analyzers effective-suite)))
217213
(refactor-visited-forms
218214
#:analysis analysis #:suite effective-suite #:comments comments #:lines lines)))
219215

@@ -242,9 +238,7 @@
242238
[exn:fail:filesystem:missing-module? skip]
243239
[exn:fail:contract:variable? skip])
244240
(define analysis (source-analyze source
245-
#:analyzers (list identifier-usage-analyzer
246-
ignored-result-values-analyzer
247-
variable-mutability-analyzer)))
241+
#:analyzers (refactoring-suite-analyzers suite)))
248242
(source-code-analysis-added-syntax-properties analysis)))
249243

250244

@@ -475,4 +469,12 @@
475469
(check-equal? (refactoring-result-string-replacement (first results))
476470
(string-replacement #:start 13
477471
#:end 28
478-
#:contents (list (inserted-string "(or 1 2 3)"))))))
472+
#:contents (list (inserted-string "(or 1 2 3)")))))
473+
474+
(test-case "resyntax-analyze uses suite analyzers"
475+
(define test-suite default-recommendations)
476+
(check-true (set? (refactoring-suite-analyzers test-suite)))
477+
(check-false (set-empty? (refactoring-suite-analyzers test-suite)))
478+
;; Verify that all analyzers in the suite are expansion-analyzer?
479+
(check-true (for/and ([analyzer (in-set (refactoring-suite-analyzers test-suite))])
480+
(expansion-analyzer? analyzer)))))

private/analysis.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
(provide
88
(contract-out
9-
[source-analyze (->* (source? #:analyzers (listof expansion-analyzer?))
9+
[source-analyze (->* (source? #:analyzers (sequence/c expansion-analyzer?))
1010
(#:lines range-set?)
1111
source-code-analysis?)]
1212
[source-code-analysis? (-> any/c boolean?)]

0 commit comments

Comments
 (0)