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