@@ -21,60 +21,6 @@ case class NewCollections(index: SemanticdbIndex)
21
21
val retainMap = normalized(" _root_.scala.collection.mutable.MapLike.retain." )
22
22
val retainSet = normalized(" _root_.scala.collection.mutable.SetLike.retain." )
23
23
24
- object Breakout {
25
- implicit class RichSymbol (val symbol : Symbol ) {
26
- def exact (tree : Tree )(implicit index : SemanticdbIndex ): Boolean =
27
- index.symbol(tree).fold(false )(_ == symbol)
28
- }
29
-
30
- val breakOut = SymbolMatcher .exact(Symbol (" _root_.scala.collection.package.breakOut(Lscala/collection/generic/CanBuildFrom;)Lscala/collection/generic/CanBuildFrom;." ))
31
-
32
- // infix operators
33
- val `List ++` = Symbol (" _root_.scala.collection.immutable.List#`++`(Lscala/collection/GenTraversableOnce;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
34
- val `List +:` = Symbol (" _root_.scala.collection.immutable.List#`+:`(Ljava/lang/Object;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
35
- val `SeqLike :+` = Symbol (" _root_.scala.collection.SeqLike#`:+`(Ljava/lang/Object;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
36
- val `TraversableLike ++:` = Symbol (" _root_.scala.collection.TraversableLike#`++:`(Lscala/collection/Traversable;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
37
-
38
- val operatorsIteratorSymbols = List (`List ++`)
39
- val operatorsViewSymbols = List (`List +:`, `SeqLike :+`, `TraversableLike ++:`)
40
- val operatorsSymbols = operatorsViewSymbols ++ operatorsIteratorSymbols
41
-
42
- val operatorsIterator = SymbolMatcher .exact(operatorsIteratorSymbols : _* )
43
- val operatorsView = SymbolMatcher .exact(operatorsViewSymbols : _* )
44
- val operators = SymbolMatcher .exact(operatorsSymbols : _* )
45
-
46
- // select
47
- val `List.collect` = Symbol (" _root_.scala.collection.immutable.List#collect(Lscala/PartialFunction;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
48
- val `List.flatMap` = Symbol (" _root_.scala.collection.immutable.List#flatMap(Lscala/Function1;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
49
- val `List.map` = Symbol (" _root_.scala.collection.immutable.List#map(Lscala/Function1;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
50
- val `IterableLike.zip` = Symbol (" _root_.scala.collection.IterableLike#zip(Lscala/collection/GenIterable;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
51
- val `IterableLike.zipAll` = Symbol (" _root_.scala.collection.IterableLike#zipAll(Lscala/collection/GenIterable;Ljava/lang/Object;Ljava/lang/Object;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
52
- val `SeqLike.union` = Symbol (" _root_.scala.collection.SeqLike#union(Lscala/collection/GenSeq;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
53
- val `SeqLike.updated` = Symbol (" _root_.scala.collection.SeqLike#updated(ILjava/lang/Object;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
54
- val `SeqLike.reverseMap` = Symbol (" _root_.scala.collection.SeqLike#reverseMap(Lscala/Function1;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
55
-
56
- val functionsIteratorSymbols = List (`List.collect`, `List.flatMap`, `List.map`, `IterableLike.zip`, `IterableLike.zipAll`, `SeqLike.union`)
57
- val functionsViewSymbols = List (`SeqLike.updated`)
58
- val functionsReverseIteratorSymbols = List (`SeqLike.reverseMap`)
59
- val functionsSymbols = functionsIteratorSymbols ++ functionsViewSymbols ++ functionsReverseIteratorSymbols
60
-
61
- val functionsIterator = SymbolMatcher .exact(functionsIteratorSymbols : _* )
62
- val functionsReverseIterator = SymbolMatcher .exact(functionsReverseIteratorSymbols : _* )
63
- val functionsView = SymbolMatcher .exact(functionsViewSymbols : _* )
64
- val functions = SymbolMatcher .exact(functionsSymbols : _* )
65
-
66
- // special select
67
-
68
- // iterator
69
- val `TraversableLike.scanLeft` = SymbolMatcher .exact(Symbol (" _root_.scala.collection.TraversableLike#scanLeft(Ljava/lang/Object;Lscala/Function2;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." ))
70
-
71
- def isLeftAssociative (tree : Tree ): Boolean =
72
- tree match {
73
- case Term .Name (value) => value.last != ':'
74
- case _ => false
75
- }
76
- }
77
-
78
24
// == Rules ==
79
25
80
26
def replaceSymbols (ctx : RuleCtx ): Patch = {
@@ -146,66 +92,13 @@ case class NewCollections(index: SemanticdbIndex)
146
92
}.asPatch
147
93
}
148
94
149
- def replaceBreakout (ctx : RuleCtx ): Patch = {
150
- import Breakout ._
151
-
152
- def fixIt (intermediate : String , lhs : Term , ap : Term , breakout : Tree ): Patch = {
153
- ctx.addRight(lhs, " ." + intermediate) +
154
- ctx.addRight(ap, " .to" ) +
155
- ctx.replaceTree(breakout, " implicitly" )
156
- }
157
-
158
- ctx.tree.collect {
159
- case i : Importee if breakOut.matches(i) =>
160
- ctx.removeImportee(i)
161
-
162
- case Term .Apply (ap @ Term .ApplyInfix (lhs, operators(op), _, List (rhs)), List (breakOut(bo))) =>
163
- val subject =
164
- if (isLeftAssociative(op)) lhs
165
- else rhs
166
-
167
- val intermediate =
168
- op match {
169
- case operatorsIterator(_) => " iterator"
170
- case operatorsView(_) => " view"
171
- // since operators(op) matches iterator and view
172
- case _ => throw new Exception (" impossible" )
173
- }
174
-
175
- fixIt(intermediate, subject, ap, bo)
176
-
177
- case Term .Apply (ap @ Term .Apply (Term .Select (lhs, functions(op)), _), List (breakOut(bo))) =>
178
- val intermediate =
179
- op match {
180
- case functionsIterator(_) => " iterator"
181
- case functionsView(_) => " view"
182
- case functionsReverseIterator(_) => " reverseIterator"
183
- // since functions(op) matches iterator, view and reverseIterator
184
- case _ => throw new Exception (" impossible" )
185
- }
186
-
187
- val replaceUnion =
188
- if (`SeqLike.union`.exact(op)) ctx.replaceTree(op, " concat" )
189
- else Patch .empty
190
-
191
- val isReversed = `SeqLike.reverseMap`.exact(op)
192
- val replaceReverseMap =
193
- if (isReversed) ctx.replaceTree(op, " map" )
194
- else Patch .empty
195
-
196
- fixIt(intermediate, lhs, ap, bo) + replaceUnion + replaceReverseMap
197
-
198
- case Term .Apply (ap @ Term .Apply (Term .Apply (Term .Select (lhs, `TraversableLike.scanLeft`(op)), _), _), List (breakOut(bo))) =>
199
- fixIt(" iterator" , lhs, ap, bo)
200
- }.asPatch
201
- }
95
+
202
96
203
97
override def fix (ctx : RuleCtx ): Patch = {
204
98
super .fix(ctx) +
205
99
replaceSymbols(ctx) +
206
100
replaceTupleZipped(ctx) +
207
101
replaceMutableMap(ctx) +
208
- replaceMutableSet(ctx) +
209
- replaceBreakout(ctx)
102
+ replaceMutableSet(ctx)
210
103
}
211
104
}
0 commit comments