@@ -18,17 +18,20 @@ import CheckRealizable._
1818import ErrorReporting .errorTree
1919
2020import util .SourcePosition
21+ import util .Spans .Span
22+ import rewrites .Rewrites .patch
2123import transform .SymUtils ._
24+ import transform .ValueClasses ._
2225import Decorators ._
2326import ErrorReporting .{err , errorType }
2427import config .Printers .typr
2528import NameKinds .DefaultGetterName
29+ import SymDenotations .{NoCompleter , NoDenotation }
2630
2731import 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
3235
3336object Checking {
3437 import tpd ._
@@ -657,6 +660,24 @@ trait Checking {
657660 i " Use of implicit conversion ${conv.showLocated}" , NoSymbol , posd.sourcePos)
658661 }
659662
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+
660681 /** Issue a feature warning if feature is not enabled */
661682 def checkFeature (base : ClassSymbol ,
662683 name : TermName ,
@@ -1034,5 +1055,6 @@ trait NoChecking extends ReChecking {
10341055 override def checkNoForwardDependencies (vparams : List [ValDef ])(implicit ctx : Context ): Unit = ()
10351056 override def checkMembersOK (tp : Type , pos : SourcePosition )(implicit ctx : Context ): Type = tp
10361057 override def checkInInlineContext (what : String , posd : Positioned )(implicit ctx : Context ): Unit = ()
1058+ override def checkValidInfix (tree : untpd.InfixOp , app : Tree )(implicit ctx : Context ): Unit = ()
10371059 override def checkFeature (base : ClassSymbol , name : TermName , description : => String , featureUseSite : Symbol , pos : SourcePosition )(implicit ctx : Context ): Unit = ()
10381060}
0 commit comments