@@ -1099,8 +1099,8 @@ object desugar {
1099
1099
paramss match
1100
1100
case rightParam :: paramss1 => // `rightParam` must have a single parameter and without `given` flag
1101
1101
1102
- def badRightAssoc (problem : String ) =
1103
- report.error(em " right-associative extension method $problem" , mdef.srcPos )
1102
+ def badRightAssoc (problem : String , pos : SrcPos ) =
1103
+ report.error(em " right-associative extension method $problem" , pos )
1104
1104
extParamss ++ mdef.paramss
1105
1105
1106
1106
rightParam match
@@ -1116,11 +1116,23 @@ object desugar {
1116
1116
//
1117
1117
// If you change the names of the clauses below, also change them in right-associative-extension-methods.md
1118
1118
val (leftTyParamsAndLeadingUsing, leftParamAndTrailingUsing) = extParamss.span(isUsingOrTypeParamClause)
1119
+
1120
+ val names = (for ps <- mdef.paramss; p <- ps yield p.name).toSet[Name ]
1121
+
1122
+ val tt = new untpd.UntypedTreeTraverser :
1123
+ def traverse (tree : Tree )(using Context ): Unit = tree match
1124
+ case tree : Ident if names.contains(tree.name) =>
1125
+ badRightAssoc(s " cannot have a forward reference to ${tree.name}" , tree.srcPos)
1126
+ case _ => traverseChildren(tree)
1127
+
1128
+ for ts <- leftParamAndTrailingUsing; t <- ts do
1129
+ tt.traverse(t)
1130
+
1119
1131
leftTyParamsAndLeadingUsing ::: rightTyParams ::: rightParam :: leftParamAndTrailingUsing ::: paramss1
1120
1132
else
1121
- badRightAssoc(" cannot start with using clause" )
1133
+ badRightAssoc(" cannot start with using clause" , mdef.srcPos )
1122
1134
case _ =>
1123
- badRightAssoc(" must start with a single parameter" )
1135
+ badRightAssoc(" must start with a single parameter" , mdef.srcPos )
1124
1136
case _ =>
1125
1137
// no value parameters, so not an infix operator.
1126
1138
extParamss ++ mdef.paramss
0 commit comments