Skip to content

Commit fe65187

Browse files
julttyjultty
jultty
authored and
jultty
committed
Copy over wart-AnyOps files
1 parent 7df9ff2 commit fe65187

File tree

8 files changed

+300
-6
lines changed

8 files changed

+300
-6
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package customWarts
2+
3+
import org.wartremover.{ WartTraverser, WartUniverse }
4+
import scala.quoted.Expr
5+
6+
object CharDividedByAny extends WartTraverser {
7+
def apply(u: WartUniverse): u.Traverser = {
8+
new u.Traverser(this) {
9+
import q.reflect.*
10+
11+
object PrimitiveDividedByChar {
12+
def unapply[A](t: Expr[A]): Boolean = t match {
13+
case '{ ($x1: Char) / ($x2: Char) } => true
14+
case '{ ($x1: Byte) / ($x2: Char) } => true
15+
case '{ ($x1: Short) / ($x2: Char) } => true
16+
case '{ ($x1: Int) / ($x2: Char) } => true
17+
case '{ ($x1: Long) / ($x2: Char) } => true
18+
case '{ ($x1: Float) / ($x2: Char) } => true
19+
case '{ ($x1: Double) / ($x2: Char) } => true
20+
case _ => false
21+
}
22+
}
23+
24+
override def traverseTree(tree: Tree)(owner: Symbol): Unit = {
25+
val error_message = "Implicit char conversion"
26+
tree match {
27+
case t if hasWartAnnotation(tree) =>
28+
case Apply(Select(lhs, "/"), List(rhs))
29+
if lhs.tpe <:< TypeRepr.of[Char] && !(rhs.tpe <:< TypeRepr.of[Char]) =>
30+
error(tree.pos, error_message)
31+
case t if t.isExpr =>
32+
t.asExpr match {
33+
case PrimitiveDividedByChar() =>
34+
error(tree.pos, error_message)
35+
case _ =>
36+
super.traverseTree(tree)(owner)
37+
}
38+
case _ =>
39+
super.traverseTree(tree)(owner)
40+
}
41+
}
42+
}
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package customWarts
2+
3+
import org.wartremover.{ WartTraverser, WartUniverse }
4+
import scala.quoted.Expr
5+
6+
object CharEqualsAny extends WartTraverser {
7+
def apply(u: WartUniverse): u.Traverser = {
8+
new u.Traverser(this) {
9+
import q.reflect.*
10+
11+
object PrimitiveEqualsChar {
12+
def unapply[A](t: Expr[A]): Boolean = t match {
13+
case '{ ($x1: Byte) == ($x2: Char) } => true
14+
case '{ ($x1: Short) == ($x2: Char) } => true
15+
case '{ ($x1: Int) == ($x2: Char) } => true
16+
case '{ ($x1: Long) == ($x2: Char) } => true
17+
case '{ ($x1: Float) == ($x2: Char) } => true
18+
case '{ ($x1: Double) == ($x2: Char) } => true
19+
case _ => false
20+
}
21+
}
22+
23+
override def traverseTree(tree: Tree)(owner: Symbol): Unit = {
24+
val error_message = "Implicit char conversion"
25+
tree match {
26+
case t if hasWartAnnotation(tree) =>
27+
case Apply(Select(lhs, "=="), List(rhs))
28+
if lhs.tpe <:< TypeRepr.of[Char] && !(rhs.tpe <:< TypeRepr.of[Char]) =>
29+
error(tree.pos, error_message)
30+
case t if t.isExpr =>
31+
t.asExpr match {
32+
case PrimitiveEqualsChar() =>
33+
error(tree.pos, error_message)
34+
case _ =>
35+
super.traverseTree(tree)(owner)
36+
}
37+
case _ =>
38+
super.traverseTree(tree)(owner)
39+
}
40+
}
41+
}
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package customWarts
2+
3+
import org.wartremover.{ WartTraverser, WartUniverse }
4+
import scala.quoted.Expr
5+
6+
object CharMinusAny extends WartTraverser {
7+
def apply(u: WartUniverse): u.Traverser = {
8+
new u.Traverser(this) {
9+
import q.reflect.*
10+
11+
object PrimitiveMinusChar {
12+
def unapply[A](t: Expr[A]): Boolean = t match {
13+
case '{ ($x1: Char) - ($x2: Char) } => true
14+
case '{ ($x1: Byte) - ($x2: Char) } => true
15+
case '{ ($x1: Short) - ($x2: Char) } => true
16+
case '{ ($x1: Int) - ($x2: Char) } => true
17+
case '{ ($x1: Long) - ($x2: Char) } => true
18+
case '{ ($x1: Float) - ($x2: Char) } => true
19+
case '{ ($x1: Double) - ($x2: Char) } => true
20+
case _ => false
21+
}
22+
}
23+
24+
override def traverseTree(tree: Tree)(owner: Symbol): Unit = {
25+
val error_message = "Implicit char conversion"
26+
tree match {
27+
case t if hasWartAnnotation(tree) =>
28+
case Apply(Select(lhs, "-"), List(rhs))
29+
if lhs.tpe <:< TypeRepr.of[Char] && !(rhs.tpe <:< TypeRepr.of[Char]) =>
30+
error(tree.pos, error_message)
31+
case t if t.isExpr =>
32+
t.asExpr match {
33+
case PrimitiveMinusChar() =>
34+
error(tree.pos, error_message)
35+
case _ =>
36+
super.traverseTree(tree)(owner)
37+
}
38+
case _ =>
39+
super.traverseTree(tree)(owner)
40+
}
41+
}
42+
}
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package customWarts
2+
3+
import org.wartremover.{ WartTraverser, WartUniverse }
4+
import scala.quoted.Expr
5+
6+
object CharPlusAny extends WartTraverser {
7+
def apply(u: WartUniverse): u.Traverser = {
8+
new u.Traverser(this) {
9+
import q.reflect.*
10+
11+
object PrimitivePlusChar {
12+
def unapply[A](t: Expr[A]): Boolean = t match {
13+
case '{ ($x1: Char) + ($x2: Char) } => true
14+
case '{ ($x1: Byte) + ($x2: Char) } => true
15+
case '{ ($x1: Short) + ($x2: Char) } => true
16+
case '{ ($x1: Int) + ($x2: Char) } => true
17+
case '{ ($x1: Long) + ($x2: Char) } => true
18+
case '{ ($x1: Float) + ($x2: Char) } => true
19+
case '{ ($x1: Double) + ($x2: Char) } => true
20+
case _ => false
21+
}
22+
}
23+
24+
override def traverseTree(tree: Tree)(owner: Symbol): Unit = {
25+
val error_message = "Implicit char conversion"
26+
tree match {
27+
case t if hasWartAnnotation(tree) =>
28+
case Apply(Select(lhs, "+"), List(rhs))
29+
if lhs.tpe <:< TypeRepr.of[Char] && !(rhs.tpe <:< TypeRepr.of[Char]) =>
30+
error(tree.pos, error_message)
31+
case t if t.isExpr =>
32+
t.asExpr match {
33+
case PrimitivePlusChar() =>
34+
error(tree.pos, error_message)
35+
case _ =>
36+
super.traverseTree(tree)(owner)
37+
}
38+
case _ =>
39+
super.traverseTree(tree)(owner)
40+
}
41+
}
42+
}
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package customWarts
2+
3+
import org.wartremover.{ WartTraverser, WartUniverse }
4+
import scala.quoted.Expr
5+
6+
object CharTimesAny extends WartTraverser {
7+
def apply(u: WartUniverse): u.Traverser = {
8+
new u.Traverser(this) {
9+
import q.reflect.*
10+
11+
object PrimitiveTimesChar {
12+
def unapply[A](t: Expr[A]): Boolean = t match {
13+
case '{ ($x1: Char) * ($x2: Char) } => true
14+
case '{ ($x1: Byte) * ($x2: Char) } => true
15+
case '{ ($x1: Short) * ($x2: Char) } => true
16+
case '{ ($x1: Int) * ($x2: Char) } => true
17+
case '{ ($x1: Long) * ($x2: Char) } => true
18+
case '{ ($x1: Float) * ($x2: Char) } => true
19+
case '{ ($x1: Double) * ($x2: Char) } => true
20+
case _ => false
21+
}
22+
}
23+
24+
override def traverseTree(tree: Tree)(owner: Symbol): Unit = {
25+
val error_message = "Implicit char conversion"
26+
tree match {
27+
case t if hasWartAnnotation(tree) =>
28+
case Apply(Select(lhs, "*"), List(rhs))
29+
if lhs.tpe <:< TypeRepr.of[Char] && !(rhs.tpe <:< TypeRepr.of[Char]) =>
30+
error(tree.pos, error_message)
31+
case t if t.isExpr =>
32+
t.asExpr match {
33+
case PrimitiveTimesChar() =>
34+
error(tree.pos, error_message)
35+
case _ =>
36+
super.traverseTree(tree)(owner)
37+
}
38+
case _ =>
39+
super.traverseTree(tree)(owner)
40+
}
41+
}
42+
}
43+
}
44+
}

build.sbt

+34-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,40 @@ lazy val root = project
44
.in(file("."))
55
.settings(
66
name := "scala-notes",
7-
version := "0.1.0-SNAPSHOT",
8-
7+
version := "0.1.0",
98
scalaVersion := scala3Version,
109

11-
libraryDependencies += "org.scalameta" %% "munit" % "0.7.29" % Test
10+
logLevel := Level.Warn,
11+
run / watchLogLevel := Level.Warn,
12+
Global / onChangedBuildSource := ReloadOnSourceChanges,
13+
14+
libraryDependencies += "org.scalameta" %% "munit" % "0.7.29" % Test,
15+
16+
wartremoverErrors ++= Warts.unsafe,
17+
wartremoverErrors ++= Seq(
18+
Wart.ArrayEquals, Wart.AnyVal, Wart.Equals, Wart.ExplicitImplicitTypes,
19+
Wart.FinalCaseClass, Wart.ImplicitConversion,
20+
Wart.JavaConversions, Wart.JavaSerializable, Wart.LeakingSealed,
21+
Wart.Nothing, Wart.Option2Iterable, Wart.PublicInference,
22+
),
23+
wartremoverErrors ++= Seq(
24+
ContribWart.OldTime, ContribWart.UnsafeInheritance,
25+
ContribWart.MissingOverride, ContribWart.NoNeedForMonad,
26+
ContribWart.UnintendedLaziness, ContribWart.DiscardedFuture,
27+
),
28+
29+
wartremover.WartRemover.dependsOnLocalProjectWarts(customWarts),
30+
wartremoverErrors ++= Seq(
31+
Wart.custom("customWarts.CharPlusAny"), Wart.custom("customWarts.CharMinusAny"),
32+
Wart.custom("customWarts.CharTimesAny"), Wart.custom("customWarts.CharDividedByAny"),
33+
Wart.custom("customWarts.CharEqualsAny"),
34+
),
35+
1236
)
37+
38+
lazy val customWarts = project.in(file(".warts")).settings(
39+
scalaVersion := scala3Version,
40+
libraryDependencies ++= Seq(
41+
"org.wartremover" % "wartremover" % wartremover.Wart.PluginVersion cross CrossVersion.full
42+
),
43+
)

project/plugins.sbt

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
addSbtPlugin("org.wartremover" % "sbt-wartremover" % "3.1.5")
2+
addSbtPlugin("org.wartremover" % "sbt-wartremover-contrib" % "2.1.0")

src/main/scala/Main.scala

+45-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,47 @@
11
@main def hello: Unit =
2-
println("Hello world!")
3-
println(msg)
2+
println("Hello, Scala")
43

5-
def msg = "I was compiled by Scala 3. :)"
4+
// ??? // throws unimplemented
5+
6+
// imperative
7+
import scala.collection.mutable.ListBuffer
8+
9+
def double(ints: List[Int]): List[Int] =
10+
val buffer = new ListBuffer[Int]()
11+
for i <- ints do
12+
buffer += i * 2
13+
buffer.toList
14+
15+
val old_numbers = List(1, 2, 3)
16+
val numbers = double(old_numbers)
17+
18+
// functional
19+
val f_numbers = old_numbers.map(_ * 2)
20+
21+
// case class
22+
final case class Person(
23+
name: String,
24+
surname: String,
25+
)
26+
27+
def p(name: String, surname: String): Person =
28+
Person(name, surname)
29+
30+
val jane = p("Jane", "Doe")
31+
32+
// pattern matching
33+
def isTruthy(a: Matchable) = a match
34+
case 0 | "" => false
35+
case _ => true
36+
37+
def morePatternMatching =
38+
val i = 3
39+
val numAsString = i match
40+
case 1 | 3 | 5 | 7 | 9 => "odd"
41+
case 2 | 4 | 6 | 8 | 10 => "even"
42+
case _ => "too big"
43+
44+
45+
// implicit value
46+
implicit val reverseOrdering: Ordering[Int] = Ordering.Int.reverse
47+
// List(1, 2, 3).sorted // List(3, 2, 1)

0 commit comments

Comments
 (0)