@@ -18,17 +18,20 @@ import CheckRealizable._
18
18
import ErrorReporting .errorTree
19
19
20
20
import util .SourcePosition
21
+ import util .Spans .Span
22
+ import rewrites .Rewrites .patch
21
23
import transform .SymUtils ._
24
+ import transform .ValueClasses ._
22
25
import Decorators ._
23
26
import ErrorReporting .{err , errorType }
24
27
import config .Printers .typr
25
28
import NameKinds .DefaultGetterName
29
+ import SymDenotations .{NoCompleter , NoDenotation }
26
30
27
31
import collection .mutable
28
- import SymDenotations .{NoCompleter , NoDenotation }
29
- import dotty .tools .dotc .reporting .diagnostic .Message
30
- import dotty .tools .dotc .reporting .diagnostic .messages ._
31
- import dotty .tools .dotc .transform .ValueClasses ._
32
+ import reporting .diagnostic .Message
33
+ import reporting .diagnostic .messages ._
34
+ import scala .tasty .util .Chars .isOperatorPart
32
35
33
36
object Checking {
34
37
import tpd ._
@@ -657,6 +660,24 @@ trait Checking {
657
660
i " Use of implicit conversion ${conv.showLocated}" , NoSymbol , posd.sourcePos)
658
661
}
659
662
663
+ /** Check that `tree` is a valid infix operation. That is, if the
664
+ * operator is alphanumeric, it must be declared `@infix`.
665
+ */
666
+ def checkValidInfix (tree : untpd.InfixOp , app : Tree )(implicit ctx : Context ): Unit =
667
+ tree.op match {
668
+ case Ident (name : SimpleName )
669
+ if ! name.exists(isOperatorPart) && ! app.symbol.hasAnnotation(defn.InfixAnnot ) && false =>
670
+ ctx.deprecationWarning(
671
+ i """ alphanumeric method $name is not declared @infix; should not be used as infix operator.
672
+ |The operation can be rewritten automatically under -migration -rewrite """ ,
673
+ tree.op.sourcePos)
674
+ if (ctx.scala2Mode) {
675
+ patch(Span (tree.op.span.start, tree.op.span.start), " `" )
676
+ patch(Span (tree.op.span.end, tree.op.span.end), " `" )
677
+ }
678
+ case _ =>
679
+ }
680
+
660
681
/** Issue a feature warning if feature is not enabled */
661
682
def checkFeature (base : ClassSymbol ,
662
683
name : TermName ,
@@ -1034,5 +1055,6 @@ trait NoChecking extends ReChecking {
1034
1055
override def checkNoForwardDependencies (vparams : List [ValDef ])(implicit ctx : Context ): Unit = ()
1035
1056
override def checkMembersOK (tp : Type , pos : SourcePosition )(implicit ctx : Context ): Type = tp
1036
1057
override def checkInInlineContext (what : String , posd : Positioned )(implicit ctx : Context ): Unit = ()
1058
+ override def checkValidInfix (tree : untpd.InfixOp , app : Tree )(implicit ctx : Context ): Unit = ()
1037
1059
override def checkFeature (base : ClassSymbol , name : TermName , description : => String , featureUseSite : Symbol , pos : SourcePosition )(implicit ctx : Context ): Unit = ()
1038
1060
}
0 commit comments