Skip to content

Commit 41429b3

Browse files
committed
Fix case and add test
1 parent 3a1062f commit 41429b3

File tree

2 files changed

+60
-5
lines changed

2 files changed

+60
-5
lines changed

scalafix-rules/src/main/scala/scalafix/internal/rule/DisableSyntax.scala

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,31 @@ final class DisableSyntax(config: DisableSyntaxConfig)
113113
Diagnostic("noXml", "xml literals should be avoided", token.pos)
114114
case token: Token.Ident
115115
if token.value == "asInstanceOf" && config.noAsInstanceOf =>
116-
Diagnostic(
117-
"asInstanceOf",
118-
"asInstanceOf casts are disabled, use pattern matching instead",
119-
token.pos
120-
)
116+
val isMatchableCast = {
117+
val tokenIndex = doc.tree.tokens.indexOf(token)
118+
if (tokenIndex >= 0) {
119+
val tokens = doc.tree.tokens.slice(tokenIndex + 1, tokenIndex + 4)
120+
tokens.size >= 3 &&
121+
tokens(0).is[Token.LeftBracket] &&
122+
tokens(1).is[Token.Ident] && tokens(1).asInstanceOf[Token.Ident].value == "Matchable" &&
123+
tokens(2).is[Token.RightBracket]
124+
} else false
125+
}
126+
127+
if (isMatchableCast) {
128+
Diagnostic(
129+
"asInstanceOfMatchable",
130+
"asInstanceOf[Matchable] is used here to enable pattern matching on Any. " +
131+
"Consider using the .asMatchable extension method instead for better readability.",
132+
token.pos
133+
)
134+
} else {
135+
Diagnostic(
136+
"asInstanceOf",
137+
"asInstanceOf casts are disabled, use pattern matching instead",
138+
token.pos
139+
)
140+
}
121141
case token: Token.Ident
122142
if token.value == "isInstanceOf" && config.noIsInstanceOf =>
123143
Diagnostic(
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
rules = DisableSyntax
3+
DisableSyntax.noAsInstanceOf = true
4+
*/
5+
package test.disableSyntax
6+
7+
object MatchableAsInstanceOf {
8+
class Example {
9+
override def equals(obj: Any): Boolean =
10+
obj.asInstanceOf[Matchable] match { /* assert: DisableSyntax.asInstanceOfMatchable
11+
^^^^^^^^^^^^^
12+
asInstanceOf[Matchable] is used here to enable pattern matching on Any. Consider using the .asMatchable extension method instead for better readability.
13+
*/
14+
case that: Example => true
15+
case _ => false
16+
}
17+
}
18+
19+
def regularCast(x: Any): String =
20+
x.asInstanceOf[String] /* assert: DisableSyntax.asInstanceOf
21+
^^^^^^^^^^^^^
22+
asInstanceOf casts are disabled, use pattern matching instead
23+
*/
24+
25+
// whitespace between tokens
26+
class AnotherExample {
27+
override def equals(obj: Any): Boolean =
28+
obj.asInstanceOf [ Matchable ] match { /* assert: DisableSyntax.asInstanceOfMatchable
29+
^^^^^^^^^^^^^
30+
asInstanceOf[Matchable] is used here to enable pattern matching on Any. Consider using the .asMatchable extension method instead for better readability.
31+
*/
32+
case _ => true
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)