Skip to content

Commit ed8de0b

Browse files
committed
Give special precedence to & and | type operators
Unlike others (which here follow Scala 2 precedence), they should follow the term-level precedence.
1 parent 0725449 commit ed8de0b

File tree

2 files changed

+16
-11
lines changed

2 files changed

+16
-11
lines changed

compiler/src/dotty/tools/dotc/parsing/package.scala

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package dotty.tools.dotc
22

33
import util.Chars._
44
import core.Names.Name
5-
import core.StdNames.nme
5+
import core.StdNames.{nme,tpnme}
66
import core.NameOps._
77

88
package object parsing {
@@ -11,7 +11,12 @@ package object parsing {
1111
if (operator eq nme.ERROR) -1
1212
/* SLS 3.2.10 (https://www.scala-lang.org/files/archive/spec/2.13/03-types.html#infix-types):
1313
* all infix types have the same precedence */
14-
else if (isType) minInfixPrec
14+
else if (isType) {
15+
if (operator == tpnme.raw.AMP || operator == tpnme.raw.BAR)
16+
precedence(operator, false)
17+
else
18+
minInfixPrec
19+
}
1520
else {
1621
val firstCh = operator.firstPart.head
1722
if (isScalaLetter(firstCh)) 1

compiler/test-resources/type-printer/infix

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@ def foo: (Int &: String) && Boolean
2121
scala> def foo: Int &: (Boolean && String) = ???
2222
def foo: Int &: (Boolean && String)
2323
scala> def foo: (Int & String) &: Boolean = ???
24-
def foo: (Int & String) &: Boolean
24+
def foo: Int & String &: Boolean
2525
scala> def foo: Int & (Boolean &: String) = ???
2626
def foo: Int & (Boolean &: String)
2727
scala> def foo: (Int &: String) & Boolean = ???
2828
def foo: (Int &: String) & Boolean
2929
scala> def foo: Int &: (Boolean & String) = ???
30-
def foo: Int &: (Boolean & String)
30+
def foo: Int &: Boolean & String
3131
scala> import scala.annotation.showAsInfix
3232
scala> @scala.annotation.showAsInfix class Mappy[T,U]
3333
// defined class Mappy
@@ -44,18 +44,18 @@ def foo: ||[Int, Boolean]
4444
scala> def foo: Int && Boolean & String = ???
4545
def foo: Int && Boolean & String
4646
scala> def foo: (Int && Boolean) & String = ???
47-
def foo: Int && Boolean & String
47+
def foo: (Int && Boolean) & String
4848
scala> def foo: Int && (Boolean & String) = ???
49-
def foo: Int && (Boolean & String)
49+
def foo: Int && Boolean & String
5050
scala> def foo: Int && (Boolean with String) = ???
51-
def foo: Int && (Boolean & String)
52-
scala> def foo: (Int && Boolean) with String = ???
5351
def foo: Int && Boolean & String
52+
scala> def foo: (Int && Boolean) with String = ???
53+
def foo: (Int && Boolean) & String
5454
scala> def foo: Int && Boolean with String = ???
55-
def foo: Int && (Boolean & String)
55+
def foo: Int && Boolean & String
5656
scala> def foo: Int && Boolean | String = ???
5757
def foo: Int && Boolean | String
5858
scala> def foo: Int && (Boolean | String) = ???
59-
def foo: Int && (Boolean | String)
60-
scala> def foo: (Int && Boolean) | String = ???
6159
def foo: Int && Boolean | String
60+
scala> def foo: (Int && Boolean) | String = ???
61+
def foo: (Int && Boolean) | String

0 commit comments

Comments
 (0)