Skip to content

Commit 9b1724b

Browse files
Copilotjackfirth
andcommitted
Add analyzers field to refactoring-rule and refactoring-suite types
Co-authored-by: jackfirth <[email protected]>
1 parent 58136ae commit 9b1724b

File tree

2 files changed

+82
-14
lines changed

2 files changed

+82
-14
lines changed

base.rkt

Lines changed: 71 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? (listof 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? (listof expansion-analyzer?))]))
2325

2426

2527
(module+ private
@@ -33,12 +35,17 @@
3335
racket/list
3436
racket/syntax
3537
resyntax/private/more-syntax-parse-classes)
38+
racket/list
3639
racket/sequence
3740
rebellion/base/immutable-string
3841
rebellion/base/option
3942
rebellion/base/symbol
4043
rebellion/type/object
44+
resyntax/default-recommendations/analyzers/identifier-usage
45+
resyntax/default-recommendations/analyzers/ignored-result-values
46+
resyntax/default-recommendations/analyzers/variable-mutability
4147
resyntax/default-recommendations/private/definition-context
48+
resyntax/private/analyzer
4249
resyntax/private/logger
4350
resyntax/private/source
4451
resyntax/private/syntax-neighbors
@@ -98,7 +105,7 @@
98105
[(_ new-stx) (syntax-property #'new-stx 'focus-replacement-on #true)]))
99106

100107

101-
(define-object-type refactoring-rule (transformer description uses-universal-tagged-syntax?)
108+
(define-object-type refactoring-rule (transformer description uses-universal-tagged-syntax? analyzers)
102109
#:omit-root-binding
103110
#:constructor-name constructor:refactoring-rule)
104111

@@ -149,6 +156,9 @@
149156
#:name 'id
150157
#:description (string->immutable-string description.c)
151158
#:uses-universal-tagged-syntax? (~? uses-universal-tagged-syntax? #false)
159+
#:analyzers (list identifier-usage-analyzer
160+
ignored-result-values-analyzer
161+
variable-mutability-analyzer)
152162
#:transformer
153163
(λ (stx)
154164
(syntax-parse stx
@@ -218,13 +228,17 @@
218228
expression.refactored)))
219229

220230

221-
(define-object-type refactoring-suite (rules)
231+
(define-object-type refactoring-suite (rules analyzers)
222232
#:constructor-name constructor:refactoring-suite
223233
#:omit-root-binding)
224234

225235

226236
(define (refactoring-suite #:rules [rules '()] #:name [name #false])
227-
(constructor:refactoring-suite #:rules (sequence->list rules) #:name name))
237+
(define rule-list (sequence->list rules))
238+
(define combined-analyzers
239+
(remove-duplicates
240+
(append-map refactoring-rule-analyzers rule-list)))
241+
(constructor:refactoring-suite #:rules rule-list #:analyzers combined-analyzers #:name name))
228242

229243

230244
(begin-for-syntax
@@ -249,3 +263,56 @@
249263
(refactoring-suite
250264
#:name 'id
251265
#:rules (append rules.as-list-expr suites.as-list-expr))))
266+
267+
268+
(module+ test
269+
(require rackunit
270+
resyntax/private/analyzer)
271+
272+
(test-case "refactoring-rule stores analyzers"
273+
(define-refactoring-rule test-rule
274+
#:description "test rule"
275+
pattern
276+
replacement)
277+
278+
(check-true (refactoring-rule? test-rule))
279+
(check-equal? (length (refactoring-rule-analyzers test-rule)) 3)
280+
(check-true (andmap expansion-analyzer? (refactoring-rule-analyzers test-rule))))
281+
282+
(test-case "refactoring-suite combines analyzers from rules"
283+
(define-refactoring-rule rule1
284+
#:description "rule 1"
285+
pattern1
286+
replacement1)
287+
288+
(define-refactoring-rule rule2
289+
#:description "rule 2"
290+
pattern2
291+
replacement2)
292+
293+
(define suite (refactoring-suite #:rules (list rule1 rule2)))
294+
295+
(check-true (refactoring-suite? suite))
296+
(check-equal? (length (refactoring-suite-rules suite)) 2)
297+
;; All rules have the same analyzers, so the combined list should have 3 unique analyzers
298+
(check-equal? (length (refactoring-suite-analyzers suite)) 3)
299+
(check-true (andmap expansion-analyzer? (refactoring-suite-analyzers suite))))
300+
301+
(test-case "nested suites combine analyzers correctly"
302+
(define-refactoring-rule inner-rule
303+
#:description "inner rule"
304+
inner-pattern
305+
inner-replacement)
306+
307+
(define inner-suite (refactoring-suite #:rules (list inner-rule)))
308+
309+
(define-refactoring-rule outer-rule
310+
#:description "outer rule"
311+
outer-pattern
312+
outer-replacement)
313+
314+
(define outer-suite (refactoring-suite #:rules (list outer-rule inner-rule)))
315+
316+
(check-equal? (length (refactoring-suite-analyzers inner-suite)) 3)
317+
;; Both rules have the same analyzers, so deduplicated should still be 3
318+
(check-equal? (length (refactoring-suite-analyzers outer-suite)) 3)))

main.rkt

Lines changed: 11 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,11 @@
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 (list? (refactoring-suite-analyzers test-suite)))
477+
(check-false (empty? (refactoring-suite-analyzers test-suite)))
478+
;; Verify that all analyzers in the suite are expansion-analyzer?
479+
(check-true (andmap expansion-analyzer? (refactoring-suite-analyzers test-suite)))))

0 commit comments

Comments
 (0)