Skip to content
This repository was archived by the owner on Jan 30, 2023. It is now read-only.

Commit 6dc457a

Browse files
author
Albert Meltzer
committed
Method checkers: report method position, not class
1 parent 2a98b4f commit 6dc457a

10 files changed

+38
-37
lines changed

src/main/scala/org/scalastyle/scalariform/AbstractMethodChecker.scala

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,18 +101,18 @@ abstract class AbstractMethodChecker extends ScalariformChecker {
101101
val it = for {
102102
t <- localvisit(ast.immediateChildren.head)
103103
f <- traverse(t)
104-
if matches(f)
105-
} yield PositionError(f.position.get, params(f))
104+
p <- matches(f)
105+
} yield PositionError(p, params(f))
106106

107-
it.toList
107+
it
108108
}
109109

110110
private def traverse(t: BaseClazz[AstNode]): ListType = {
111111
val l = t.subs.flatMap(traverse)
112-
if (matches(t)) t :: l else l
112+
if (matches(t).isDefined) t :: l else l
113113
}
114114

115-
def matches(t: BaseClazz[AstNode]): Boolean
115+
def matches(t: BaseClazz[AstNode]): Option[Int]
116116

117117
protected def getParams(p: ParamClauses): List[Param] =
118118
p.paramClausesAndNewlines
@@ -132,10 +132,8 @@ abstract class AbstractMethodChecker extends ScalariformChecker {
132132
protected def getParamTypes(pc: ParamClauses): List[String] =
133133
getParams(pc).map(p => typename(p.paramTypeOpt.get._2))
134134

135-
protected def matchFunDefOrDcl(t: BaseClazz[AstNode], fn: FunDefOrDcl => Boolean): Boolean =
136-
t match {
137-
case f: FunDefOrDclClazz => fn(f.t); case _ => false
138-
}
135+
protected def matchFunDefOrDcl(t: BaseClazz[AstNode], fn: FunDefOrDcl => Boolean): Option[Int] =
136+
t.subs.collectFirst { case f: FunDefOrDclClazz if fn(f.t) => f.t.nameToken.offset }
139137

140138
protected def methodMatch(name: String, paramTypesMatch: List[String] => Boolean)(t: FunDefOrDcl): Boolean =
141139
t.nameToken.text == name && paramTypesMatch(getParamTypes(t.paramClauses))

src/main/scala/org/scalastyle/scalariform/CovariantEqualsChecker.scala

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,16 @@
1717
package org.scalastyle.scalariform
1818

1919
import org.scalastyle.Checker
20+
2021
import scalariform.parser.AstNode
2122
import scalariform.parser.FunDefOrDcl
2223

2324
class CovariantEqualsChecker extends AbstractMethodChecker {
2425
val errorKey = "covariant.equals"
2526

26-
def matches(t: BaseClazz[AstNode]): Boolean = {
27-
val equalsObject = t.subs.exists(matchFunDefOrDcl(_, isEqualsObject))
28-
val equalsOther = t.subs.exists(matchFunDefOrDcl(_, isEqualsOther))
29-
30-
!equalsObject && equalsOther
27+
def matches(t: BaseClazz[AstNode]): Option[Int] = {
28+
val equalsObject = matchFunDefOrDcl(t, isEqualsObject).isEmpty
29+
if (equalsObject) matchFunDefOrDcl(t, isEqualsOther) else None
3130
}
3231

3332
private def isEqualsOther(t: FunDefOrDcl): Boolean =

src/main/scala/org/scalastyle/scalariform/EqualsHashCodeChecker.scala

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,15 @@ import scalariform.parser.FunDefOrDcl
2222
class EqualsHashCodeChecker extends AbstractMethodChecker {
2323
val errorKey = "equals.hash.code"
2424

25-
def matches(t: BaseClazz[AstNode]): Boolean = {
26-
val hc = t.subs.exists(matchFunDefOrDcl(_, isHashCode))
27-
val eq = t.subs.exists(matchFunDefOrDcl(_, isEqualsObject))
25+
def matches(t: BaseClazz[AstNode]): Option[Int] = {
26+
val hc = matchFunDefOrDcl(t, isHashCode)
27+
val eq = matchFunDefOrDcl(t, isEqualsObject)
2828

29-
(hc && !eq) || (!hc && eq)
29+
if (hc.isDefined) {
30+
if (eq.isDefined) None else hc
31+
} else {
32+
if (eq.isDefined) eq else None
33+
}
3034
}
3135

3236
private def isHashCode(t: FunDefOrDcl): Boolean = methodMatch("hashCode", noParameter() _)(t)

src/main/scala/org/scalastyle/scalariform/NoCloneChecker.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ import scalariform.parser.FunDefOrDcl
2222
class NoCloneChecker extends AbstractMethodChecker {
2323
val errorKey = "no.clone"
2424

25-
def matches(t: BaseClazz[AstNode]): Boolean =
26-
t.subs.exists(matchFunDefOrDcl(_, isClone))
25+
def matches(t: BaseClazz[AstNode]): Option[Int] =
26+
matchFunDefOrDcl(t, isClone)
2727

2828
private def isClone(t: FunDefOrDcl): Boolean = methodMatch("clone", noParameter() _)(t)
2929
}

src/main/scala/org/scalastyle/scalariform/NoFinalizeChecker.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ import scalariform.parser.FunDefOrDcl
2222
class NoFinalizeChecker extends AbstractMethodChecker {
2323
val errorKey = "no.finalize"
2424

25-
def matches(t: BaseClazz[AstNode]): Boolean =
26-
t.subs.exists(matchFunDefOrDcl(_, isFinalize))
25+
def matches(t: BaseClazz[AstNode]): Option[Int] =
26+
matchFunDefOrDcl(t, isFinalize)
2727

2828
private def isFinalize(t: FunDefOrDcl): Boolean = methodMatch("finalize", noParameter() _)(t)
2929
}

src/main/scala/org/scalastyle/scalariform/NumberOfMethodsInTypeChecker.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ class NumberOfMethodsInTypeChecker extends AbstractMethodChecker {
2525
override def params(t: BaseClazz[AstNode]): List[String] =
2626
List("" + getInt("maxMethods", DefaultMaxMethods))
2727

28-
def matches(t: BaseClazz[AstNode]): Boolean = {
28+
def matches(t: BaseClazz[AstNode]): Option[Int] = {
2929
val maxMethods = getInt("maxMethods", DefaultMaxMethods)
30-
t.subs.size > maxMethods
30+
if (t.subs.size > maxMethods) t.position else None
3131
}
3232
}

src/test/scala/org/scalastyle/scalariform/CovariantEqualsCheckerTest.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class CovariantEqualsNoObjectKO {
4848
}
4949
"""
5050

51-
assertErrors(List(columnError(4, 6)), source)
51+
assertErrors(List(columnError(5, 6)), source)
5252
}
5353

5454
@Test def testObjectOK(): Unit = {
@@ -73,6 +73,6 @@ object CovariantEqualsNoObjectKO {
7373
}
7474
"""
7575

76-
assertErrors(List(columnError(4, 7)), source)
76+
assertErrors(List(columnError(5, 6)), source)
7777
}
7878
}

src/test/scala/org/scalastyle/scalariform/EqualsHashCodeCheckerTest.scala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class HashCodeOnlyKO {
4848
}
4949
"""
5050

51-
assertErrors(List(columnError(4, 6)), source)
51+
assertErrors(List(columnError(5, 6)), source)
5252
}
5353

5454
@Test def testEqualsOnlyKO(): Unit = {
@@ -60,7 +60,7 @@ class EqualsOnlyKO {
6060
}
6161
"""
6262

63-
assertErrors(List(columnError(4, 6)), source)
63+
assertErrors(List(columnError(5, 6)), source)
6464
}
6565

6666
@Test def testEqualsOnlyAnyKO(): Unit = {
@@ -72,7 +72,7 @@ class EqualsOnlyKO {
7272
}
7373
"""
7474

75-
assertErrors(List(columnError(4, 6)), source)
75+
assertErrors(List(columnError(5, 6)), source)
7676
}
7777

7878
@Test def testEqualsWrongSignatureOK(): Unit = {
@@ -112,7 +112,7 @@ class OuterKO {
112112
}
113113
"""
114114

115-
assertErrors(List(columnError(4, 6), columnError(6, 8)), source)
115+
assertErrors(List(columnError(5, 6), columnError(7, 8)), source)
116116
}
117117

118118
@Test def testOuterOKInnerKO(): Unit = {
@@ -128,7 +128,7 @@ class OuterOK {
128128
}
129129
"""
130130

131-
assertErrors(List(columnError(6, 8)), source)
131+
assertErrors(List(columnError(7, 8)), source)
132132
}
133133

134134
@Test def testObjectInnerKO(): Unit = {
@@ -142,7 +142,7 @@ object Object {
142142
}
143143
"""
144144

145-
assertErrors(List(columnError(5, 8)), source)
145+
assertErrors(List(columnError(6, 8)), source)
146146
}
147147

148148
@Test def testMultipleClasses(): Unit = {
@@ -158,6 +158,6 @@ class Class2 {
158158
}
159159
"""
160160

161-
assertErrors(List(columnError(4, 6), columnError(8, 6)), source)
161+
assertErrors(List(columnError(5, 6), columnError(9, 6)), source)
162162
}
163163
}

src/test/scala/org/scalastyle/scalariform/NoCloneCheckerTest.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class CloneKO {
4747
}
4848
"""
4949

50-
assertErrors(List(columnError(4, 6)), source)
50+
assertErrors(List(columnError(5, 6)), source)
5151
}
5252

5353
@Test def testObjectOK(): Unit = {
@@ -71,6 +71,6 @@ object CloneKO {
7171
}
7272
"""
7373

74-
assertErrors(List(columnError(4, 7)), source)
74+
assertErrors(List(columnError(5, 6)), source)
7575
}
7676
}

src/test/scala/org/scalastyle/scalariform/NoFinalizeCheckerTest.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class CloneKO {
4747
}
4848
"""
4949

50-
assertErrors(List(columnError(4, 6)), source)
50+
assertErrors(List(columnError(5, 6)), source)
5151
}
5252

5353
@Test def testObjectOK(): Unit = {
@@ -71,6 +71,6 @@ object CloneKO {
7171
}
7272
"""
7373

74-
assertErrors(List(columnError(4, 7)), source)
74+
assertErrors(List(columnError(5, 6)), source)
7575
}
7676
}

0 commit comments

Comments
 (0)