@@ -58,31 +58,68 @@ trait Stable212Base extends CrossCompatibility { self: SemanticRule =>
58
58
val breakOut = SymbolMatcher .exact(Symbol (" _root_.scala.collection.package.breakOut(Lscala/collection/generic/CanBuildFrom;)Lscala/collection/generic/CanBuildFrom;." ))
59
59
60
60
// infix operators
61
+
62
+ val `TraversableLike ++` = Symbol (" _root_.scala.collection.TraversableLike#`++`(Lscala/collection/GenTraversableOnce;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
63
+ val `Vector ++` = Symbol (" _root_.scala.collection.immutable.Vector#`++`(Lscala/collection/GenTraversableOnce;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
61
64
val `List ++` = Symbol (" _root_.scala.collection.immutable.List#`++`(Lscala/collection/GenTraversableOnce;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
65
+
66
+ val `SeqLike +:` = Symbol (" _root_.scala.collection.SeqLike#`+:`(Ljava/lang/Object;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
67
+ val `Vector +:` = Symbol (" _root_.scala.collection.immutable.Vector#`+:`(Ljava/lang/Object;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
62
68
val `List +:` = Symbol (" _root_.scala.collection.immutable.List#`+:`(Ljava/lang/Object;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
69
+
63
70
val `SeqLike :+` = Symbol (" _root_.scala.collection.SeqLike#`:+`(Ljava/lang/Object;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
71
+ val `Vector :+` = Symbol (" _root_.scala.collection.immutable.Vector#`:+`(Ljava/lang/Object;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
72
+
64
73
val `TraversableLike ++:` = Symbol (" _root_.scala.collection.TraversableLike#`++:`(Lscala/collection/Traversable;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
65
74
66
- val operatorsIteratorSymbols = List (`List ++`)
67
- val operatorsViewSymbols = List (`List +:`, `SeqLike :+`, `TraversableLike ++:`)
75
+ val operatorsIteratorSymbols = List (`TraversableLike ++`, `List ++`, `Vector ++`)
76
+ val operatorsViewSymbols = List (
77
+ `SeqLike +:`, `Vector +:`, `List +:`,
78
+ `SeqLike :+`, `Vector :+`,
79
+ `TraversableLike ++:`
80
+ )
81
+
68
82
val operatorsSymbols = operatorsViewSymbols ++ operatorsIteratorSymbols
69
83
70
84
val operatorsIterator = SymbolMatcher .exact(operatorsIteratorSymbols : _* )
71
85
val operatorsView = SymbolMatcher .exact(operatorsViewSymbols : _* )
72
86
val operators = SymbolMatcher .exact(operatorsSymbols : _* )
73
87
74
88
// select
75
- val `List.collect` = Symbol (" _root_.scala.collection.immutable.List#collect(Lscala/PartialFunction;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
76
- val `List.flatMap` = Symbol (" _root_.scala.collection.immutable.List#flatMap(Lscala/Function1;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
77
- val `List.map` = Symbol (" _root_.scala.collection.immutable.List#map(Lscala/Function1;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
78
- val `IterableLike.zip` = Symbol (" _root_.scala.collection.IterableLike#zip(Lscala/collection/GenIterable;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
79
- 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;." )
80
- val `SeqLike.union` = Symbol (" _root_.scala.collection.SeqLike#union(Lscala/collection/GenSeq;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
81
- val `SeqLike.updated` = Symbol (" _root_.scala.collection.SeqLike#updated(ILjava/lang/Object;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
82
- val `SeqLike.reverseMap` = Symbol (" _root_.scala.collection.SeqLike#reverseMap(Lscala/Function1;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
83
-
84
- val functionsIteratorSymbols = List (`List.collect`, `List.flatMap`, `List.map`, `IterableLike.zip`, `IterableLike.zipAll`, `SeqLike.union`)
85
- val functionsViewSymbols = List (`SeqLike.updated`)
89
+ val `List.collect` = Symbol (" _root_.scala.collection.immutable.List#collect(Lscala/PartialFunction;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
90
+ val `TraversableLike.collect` = Symbol (" _root_.scala.collection.TraversableLike#collect(Lscala/PartialFunction;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
91
+
92
+ val `List.flatMap` = Symbol (" _root_.scala.collection.immutable.List#flatMap(Lscala/Function1;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
93
+ val `TraversableLike.flatMap` = Symbol (" _root_.scala.collection.TraversableLike#flatMap(Lscala/Function1;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
94
+
95
+ val `List.map` = Symbol (" _root_.scala.collection.immutable.List#map(Lscala/Function1;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
96
+ val `SetLike.map` = Symbol (" _root_.scala.collection.SetLike#map(Lscala/Function1;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
97
+ val `TraversableLike.map` = Symbol (" _root_.scala.collection.TraversableLike#map(Lscala/Function1;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
98
+
99
+ val `IterableLike.zip` = Symbol (" _root_.scala.collection.IterableLike#zip(Lscala/collection/GenIterable;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
100
+
101
+ val `IndexedSeqOptimized.zip` = Symbol (" _root_.scala.collection.IndexedSeqOptimized#zip(Lscala/collection/GenIterable;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
102
+
103
+ 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;." )
104
+
105
+ val `SeqLike.union` = Symbol (" _root_.scala.collection.SeqLike#union(Lscala/collection/GenSeq;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
106
+
107
+ val `SeqLike.updated` = Symbol (" _root_.scala.collection.SeqLike#updated(ILjava/lang/Object;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
108
+ val `Vector.updated` = Symbol (" _root_.scala.collection.immutable.Vector#updated(ILjava/lang/Object;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
109
+ val `SeqLike.reverseMap` = Symbol (" _root_.scala.collection.SeqLike#reverseMap(Lscala/Function1;Lscala/collection/generic/CanBuildFrom;)Ljava/lang/Object;." )
110
+
111
+ val functionsZipSymbols = List (
112
+ `IterableLike.zip`,
113
+ `IndexedSeqOptimized.zip`,
114
+ `IterableLike.zipAll`
115
+ )
116
+ val functionsIteratorSymbols = List (
117
+ `List.collect`, `TraversableLike.collect`,
118
+ `List.flatMap`, `TraversableLike.flatMap`,
119
+ `List.map`, `SetLike.map`, `TraversableLike.map`,
120
+ `SeqLike.union`
121
+ ) ++ functionsZipSymbols
122
+ val functionsViewSymbols = List (`SeqLike.updated`, `Vector.updated`)
86
123
val functionsReverseIteratorSymbols = List (`SeqLike.reverseMap`)
87
124
val functionsSymbols = functionsIteratorSymbols ++ functionsViewSymbols ++ functionsReverseIteratorSymbols
88
125
@@ -91,7 +128,7 @@ trait Stable212Base extends CrossCompatibility { self: SemanticRule =>
91
128
val functionsView = SymbolMatcher .exact(functionsViewSymbols : _* )
92
129
val functions = SymbolMatcher .exact(functionsSymbols : _* )
93
130
94
- val functionsZip = SymbolMatcher .exact(`IterableLike.zip`, `IterableLike.zipAll` )
131
+ val functionsZip = SymbolMatcher .exact(functionsZipSymbols : _* )
95
132
96
133
// special select
97
134
@@ -176,11 +213,10 @@ trait Stable212Base extends CrossCompatibility { self: SemanticRule =>
176
213
}
177
214
}
178
215
216
+ val breakOutImports = List .newBuilder[Importee ]
217
+
179
218
val rewriteBreakout =
180
219
ctx.tree.collect {
181
- case i : Importee if breakOut.matches(i) =>
182
- ctx.removeImportee(i)
183
-
184
220
case ap0 @ Term .Apply (ap @ Term .ApplyInfix (lhs, operators(op), _, List (rhs)), List (breakOut(bo))) =>
185
221
val subject =
186
222
if (isLeftAssociative(op)) lhs
@@ -197,7 +233,6 @@ trait Stable212Base extends CrossCompatibility { self: SemanticRule =>
197
233
fixIt(intermediate, subject, ap, bo, ap0)
198
234
199
235
case ap0 @ Term .Apply (ap @ Term .Apply (Term .Select (lhs, functions(op)), rhs :: _), List (breakOut(bo))) =>
200
-
201
236
val intermediateLhs =
202
237
op match {
203
238
case functionsIterator(_) => " iterator"
@@ -226,10 +261,20 @@ trait Stable212Base extends CrossCompatibility { self: SemanticRule =>
226
261
227
262
case ap0 @ Term .Apply (ap @ Term .Apply (Term .Apply (Term .Select (lhs, `TraversableLike.scanLeft`(op)), _), _), List (breakOut(bo))) =>
228
263
fixIt(" iterator" , lhs, ap, bo, ap0)
264
+
265
+ case i : Importee if breakOut.matches(i) =>
266
+ breakOutImports += i
267
+ Patch .empty
268
+
229
269
}.asPatch
230
270
231
271
val compatImport =
232
- if (rewriteBreakout.nonEmpty) addCompatImport(ctx)
272
+ if (rewriteBreakout.nonEmpty) {
273
+ val removeImports = breakOutImports.result().map(i => ctx.removeImportee(i)).asPatch
274
+
275
+ removeImports +
276
+ addCompatImport(ctx)
277
+ }
233
278
else Patch .empty
234
279
235
280
rewriteBreakout + compatImport
@@ -387,6 +432,22 @@ trait Stable212Base extends CrossCompatibility { self: SemanticRule =>
387
432
else Patch .empty
388
433
}
389
434
435
+ var lastPath : Option [String ] = None
436
+ def trace (in : Any , ctx : RuleCtx ): Unit = {
437
+ val path =
438
+ ctx.input match {
439
+ case Input .File (path, _) => path.toString
440
+ case Input .VirtualFile (path, _) => path.toString
441
+ case _ => " ???"
442
+ }
443
+
444
+ if (lastPath != Some (path)) {
445
+ println(s " --- $path --- " )
446
+ lastPath = Some (path)
447
+ }
448
+ println(in)
449
+ }
450
+
390
451
override def fix (ctx : RuleCtx ): Patch = {
391
452
replaceSymbols0(ctx) +
392
453
replaceCanBuildFrom(ctx) +
0 commit comments