Skip to content

Commit

Permalink
Add scalafix for contramap (#1937)
Browse files Browse the repository at this point in the history
* Add scalafix for contramap

* Remove redundancies

* Try to build scalafix with travis

* Working travis tests

* Publish snapshot before running scalafix

* Simplify denotation lookup
  • Loading branch information
LukaJCB authored Oct 10, 2017
1 parent b84015a commit b3244a8
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 5 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ sudo: required

dist: trusty

group: edge
group: edge

git:
depth: 9999
Expand Down
4 changes: 2 additions & 2 deletions scalafix/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ lazy val input = project.settings(

lazy val output = project.settings(
libraryDependencies ++= Seq(
"org.typelevel" %% "cats-core" % "1.0.0-MF",
"org.typelevel" %% "cats-free" % "1.0.0-MF"
"org.typelevel" %% "cats-core" % "1.0.0-SNAPSHOT",
"org.typelevel" %% "cats-free" % "1.0.0-SNAPSHOT"
),
scalacOptions += "-language:higherKinds"
)
Expand Down
31 changes: 31 additions & 0 deletions scalafix/input/src/main/scala/fix/v1_0_0/ContraMapToLMap.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
rule = "scala:fix.v1_0_0.ContraMapToLMap"
*/
package fix
package to1_0_0



object ContraMapToLMapTests {
import cats.Show
import cats.syntax.all._
import cats.instances.all._

val f: Int => String = _.toString

val g: Int => String = f.contramap(_ + 1)

object Foo
object Bar
object Baz

implicit val showFoo: Show[Foo.type] = Show.fromToString

val showBar: Show[Bar.type] = showFoo.contramap(_ => Foo)

val showBaz: Show[Baz.type] = Show[Foo.type].contramap(_ => Foo)

def getShowBar(): Show[Bar.type] = showBar

getShowBar().contramap((_: Int) => Bar)
}
28 changes: 28 additions & 0 deletions scalafix/output/src/main/scala/fix/v1_0_0/ContraMapToLMap.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package fix
package to1_0_0



object ContraMapToLMapTests {
import cats.Show
import cats.syntax.all._
import cats.instances.all._

val f: Int => String = _.toString

val g: Int => String = f.lmap(_ + 1)

object Foo
object Bar
object Baz

implicit val showFoo: Show[Foo.type] = Show.fromToString

val showBar: Show[Bar.type] = showFoo.contramap(_ => Foo)

val showBaz: Show[Baz.type] = Show[Foo.type].contramap(_ => Foo)

def getShowBar(): Show[Bar.type] = showBar

getShowBar().contramap((_: Int) => Bar)
}
18 changes: 18 additions & 0 deletions scalafix/rules/src/main/scala/fix/Cats_v1_0_0.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package fix
package v1_0_0

import scalafix._
import scalafix.syntax._
import scalafix.util.SymbolMatcher
import scala.meta._
import scala.meta.contrib._
Expand Down Expand Up @@ -73,6 +74,23 @@ case class RemoveCartesianBuilder(index: SemanticdbIndex)
}
}

// ref: https://github.com/typelevel/cats/issues/1850
case class ContraMapToLMap(index: SemanticdbIndex)
extends SemanticRule(index, "UseLMapInsteadOfContraMap") {

override def fix(ctx: RuleCtx): Patch = {

val contraMatcher = SymbolMatcher.normalized(Symbol("_root_.cats.functor.Contravariant.Ops.`contramap`."))

val unApplyName = "catsUnapply2left"

ctx.tree.collect {
case Term.Apply(Term.Select(f, contraMatcher(contramap)), _) if f.denotation.exists(_.name == unApplyName) =>
ctx.replaceTree(contramap, "lmap")
}.asPatch
}
}

// ref: https://github.com/typelevel/cats/pull/1583
case class RemoveUnapply(index: SemanticdbIndex)
extends SemanticRule(index, "RemoveUnapply") {
Expand Down
10 changes: 8 additions & 2 deletions scripts/travis-publish.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
# b. Builds and tests for the JVM using the validateJVM target, and then
# c. Produces the coverage report, and then
# d. Clean is run (as part of coverageReport), to clear down the built artifacts
# 2. The scala js build is executed, compiling the application and testing it for scala js.
# 3. The validateJVM target is executed again, due to the fact that producing coverage with the
# 2. The scalafix subdirectory is run, executing the tests inside.
# 3. The scala js build is executed, compiling the application and testing it for scala js.
# 4. The validateJVM target is executed again, due to the fact that producing coverage with the
# code coverage tool causes the byte code to be instrumented/modified to record the coverage
# metrics when the tests are executing. This causes the full JVM build to be run a second time.

Expand All @@ -34,6 +35,11 @@ free_js="$sbt_cmd validateFreeJS"
js="$core_js && $free_js && $kernel_js"
jvm="$sbt_cmd coverage validateJVM coverageReport && codecov"

sbt ;coreJVM/publishLocal;freeJVM/publishLocal
cd scalafix
sbt tests/test
cd ..

if [[ $JS_BUILD == "true" ]]; then
run_cmd="$js"
else
Expand Down

0 comments on commit b3244a8

Please sign in to comment.