Skip to content

Commit 0a23a4f

Browse files
committed
perf: no-duplicate-type-constituents: only build fixes when needed
1 parent 9af99fd commit 0a23a4f

File tree

1 file changed

+74
-70
lines changed

1 file changed

+74
-70
lines changed

internal/rules/no_duplicate_type_constituents/no_duplicate_type_constituents.go

Lines changed: 74 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -80,93 +80,97 @@ var NoDuplicateTypeConstituentsRule = rule.Rule{
8080
ctx.ReportNode(constituentNode, message)
8181
return
8282
}
83-
kind := ast.KindUnionType
84-
if unionOrIntersection == unionOrIntersection_Intersection {
85-
kind = ast.KindIntersectionType
86-
}
87-
88-
parent := unwindedParentType(constituentNode, kind)
89-
s := scanner.GetScannerForSourceFile(ctx.SourceFile, parent.Pos())
90-
foundBefore := false
91-
prevStart := 0
92-
bracketBeforeTokens := []core.TextRange{}
9383

94-
for {
95-
if s.TokenStart() >= constituentNode.Pos() {
96-
break
84+
ctx.ReportNodeWithFixes(constituentNode, message, func() []rule.RuleFix {
85+
kind := ast.KindUnionType
86+
if unionOrIntersection == unionOrIntersection_Intersection {
87+
kind = ast.KindIntersectionType
9788
}
98-
if s.Token() == ast.KindAmpersandToken || s.Token() == ast.KindBarToken {
99-
foundBefore = true
100-
prevStart = s.TokenStart()
101-
bracketBeforeTokens = bracketBeforeTokens[:0]
102-
} else if s.Token() == ast.KindOpenParenToken {
103-
bracketBeforeTokens = append(bracketBeforeTokens, s.TokenRange())
89+
90+
parent := unwindedParentType(constituentNode, kind)
91+
s := scanner.GetScannerForSourceFile(ctx.SourceFile, parent.Pos())
92+
foundBefore := false
93+
prevStart := 0
94+
bracketBeforeTokens := []core.TextRange{}
95+
96+
for {
97+
if s.TokenStart() >= constituentNode.Pos() {
98+
break
99+
}
100+
if s.Token() == ast.KindAmpersandToken || s.Token() == ast.KindBarToken {
101+
foundBefore = true
102+
prevStart = s.TokenStart()
103+
bracketBeforeTokens = bracketBeforeTokens[:0]
104+
} else if s.Token() == ast.KindOpenParenToken {
105+
bracketBeforeTokens = append(bracketBeforeTokens, s.TokenRange())
106+
}
107+
s.Scan()
104108
}
105-
s.Scan()
106-
}
107-
fixes := []rule.RuleFix{
108-
rule.RuleFixRemoveRange(utils.TrimNodeTextRange(ctx.SourceFile, constituentNode)),
109-
}
110-
if foundBefore {
111-
fixes = append(fixes, rule.RuleFixRemoveRange(core.NewTextRange(prevStart, prevStart+1)))
112-
for _, before := range bracketBeforeTokens {
113-
fixes = append(fixes, rule.RuleFixRemoveRange(before))
109+
fixes := []rule.RuleFix{
110+
rule.RuleFixRemoveRange(utils.TrimNodeTextRange(ctx.SourceFile, constituentNode)),
114111
}
115-
s.ResetPos(constituentNode.End())
116-
for range bracketBeforeTokens {
117-
s.Scan()
118-
if s.Token() != ast.KindCloseParenToken {
119-
panic(fmt.Sprintf("expected next scanned token to be ')', got '%v'", s.Token()))
112+
if foundBefore {
113+
fixes = append(fixes, rule.RuleFixRemoveRange(core.NewTextRange(prevStart, prevStart+1)))
114+
for _, before := range bracketBeforeTokens {
115+
fixes = append(fixes, rule.RuleFixRemoveRange(before))
120116
}
121-
fixes = append(fixes, rule.RuleFixRemoveRange(s.TokenRange()))
122-
}
123-
} else {
124-
s.ResetPos(constituentNode.End())
117+
s.ResetPos(constituentNode.End())
118+
for range bracketBeforeTokens {
119+
s.Scan()
120+
if s.Token() != ast.KindCloseParenToken {
121+
panic(fmt.Sprintf("expected next scanned token to be ')', got '%v'", s.Token()))
122+
}
123+
fixes = append(fixes, rule.RuleFixRemoveRange(s.TokenRange()))
124+
}
125+
} else {
126+
s.ResetPos(constituentNode.End())
125127

126-
closingParensCount := 0
127-
for {
128-
s.Scan()
128+
closingParensCount := 0
129+
for {
130+
s.Scan()
129131

130-
if s.TokenStart() >= parent.End() {
131-
panic("couldn't find '&' or '|' token")
132-
}
132+
if s.TokenStart() >= parent.End() {
133+
panic("couldn't find '&' or '|' token")
134+
}
133135

134-
if s.Token() == ast.KindAmpersandToken || s.Token() == ast.KindBarToken {
136+
if s.Token() == ast.KindAmpersandToken || s.Token() == ast.KindBarToken {
137+
fixes = append(fixes, rule.RuleFixRemoveRange(s.TokenRange()))
138+
break
139+
}
140+
if s.Token() != ast.KindCloseParenToken {
141+
panic(fmt.Sprintf("expected next scanned token to be ')', got '%v'", s.Token()))
142+
}
143+
closingParensCount++
135144
fixes = append(fixes, rule.RuleFixRemoveRange(s.TokenRange()))
136-
break
137145
}
138-
if s.Token() != ast.KindCloseParenToken {
139-
panic(fmt.Sprintf("expected next scanned token to be ')', got '%v'", s.Token()))
140-
}
141-
closingParensCount++
142-
fixes = append(fixes, rule.RuleFixRemoveRange(s.TokenRange()))
143-
}
144146

145-
openingParens := make([]core.TextRange, 0, closingParensCount)
146-
s.ResetPos(parent.Pos())
147-
for range closingParensCount {
148-
s.Scan()
149-
if s.Token() == ast.KindOpenParenToken {
150-
if len(openingParens) < closingParensCount {
151-
openingParens = append(openingParens, s.TokenRange())
147+
openingParens := make([]core.TextRange, 0, closingParensCount)
148+
s.ResetPos(parent.Pos())
149+
for range closingParensCount {
150+
s.Scan()
151+
if s.Token() == ast.KindOpenParenToken {
152+
if len(openingParens) < closingParensCount {
153+
openingParens = append(openingParens, s.TokenRange())
154+
}
155+
} else {
156+
openingParens = openingParens[:0]
152157
}
153-
} else {
154-
openingParens = openingParens[:0]
155-
}
156158

157-
if s.TokenStart() == constituentNode.Pos() {
158-
if len(openingParens) != closingParensCount {
159-
panic(fmt.Sprintf("expected to find %v opening parens, found only %v", closingParensCount, len(openingParens)))
159+
if s.TokenStart() == constituentNode.Pos() {
160+
if len(openingParens) != closingParensCount {
161+
panic(fmt.Sprintf("expected to find %v opening parens, found only %v", closingParensCount, len(openingParens)))
162+
}
163+
break
160164
}
161-
break
162-
}
163165

164-
for _, openingParenRange := range openingParens {
165-
fixes = append(fixes, rule.RuleFixRemoveRange(openingParenRange))
166+
for _, openingParenRange := range openingParens {
167+
fixes = append(fixes, rule.RuleFixRemoveRange(openingParenRange))
168+
}
166169
}
167170
}
168-
}
169-
ctx.ReportNodeWithFixes(constituentNode, message, func() []rule.RuleFix { return fixes })
171+
172+
return fixes
173+
})
170174
}
171175

172176
var checkDuplicateRecursively func(

0 commit comments

Comments
 (0)