Skip to content

Commit 4c39bbc

Browse files
committed
Disable named type arguments by default
Named type arguments are now available only under language import import scala.language.experimental.namedTypeArguments
1 parent b22331e commit 4c39bbc

24 files changed

+39
-9
lines changed

compiler/src/dotty/tools/dotc/config/Feature.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ object Feature:
6060
def dependentEnabled(using Context) =
6161
enabled(nme.dependent, defn.LanguageExperimentalModule.moduleClass)
6262

63+
def namedTypeArgsEnabled(using Context) =
64+
enabled(nme.namedTypeArguments, defn.LanguageExperimentalModule.moduleClass)
65+
6366
def scala2ExperimentalMacroEnabled(using Context) =
6467
enabled("macros".toTermName, defn.LanguageExperimentalModule.moduleClass)
6568

compiler/src/dotty/tools/dotc/core/StdNames.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,7 @@ object StdNames {
528528
val moduleClass : N = "moduleClass"
529529
val name: N = "name"
530530
val nameDollar: N = "$name"
531+
val namedTypeArguments: N = "namedTypeArguments"
531532
val ne: N = "ne"
532533
val newFreeTerm: N = "newFreeTerm"
533534
val newFreeType: N = "newFreeType"

compiler/src/dotty/tools/dotc/typer/Applications.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,6 +1057,11 @@ trait Applications extends Compatibility {
10571057

10581058
def typedNamedArgs(args: List[untpd.Tree])(using Context): List[NamedArg] =
10591059
for (arg @ NamedArg(id, argtpt) <- args) yield {
1060+
if !Feature.namedTypeArgsEnabled then
1061+
report.error(
1062+
i"""Named type arguments are experimental,
1063+
|they must be enabled with a `experimental.namedTypeArguments` language import or setting""",
1064+
arg.srcPos)
10601065
val argtpt1 = typedType(argtpt)
10611066
cpy.NamedArg(arg)(id, argtpt1).withType(argtpt1.tpe)
10621067
}

docs/docs/internals/syntax.md

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ SimpleType ::= SimpleLiteral
161161
SimpleType1 ::= id Ident(name)
162162
| Singleton ‘.’ id Select(t, name)
163163
| Singleton ‘.’ ‘type’ SingletonTypeTree(p)
164-
| ‘(’ ArgTypes ‘)’ Tuple(ts)
164+
| ‘(’ Types ‘)’ Tuple(ts)
165165
| Refinement RefinedTypeTree(EmptyTree, refinement)
166166
| ‘$’ ‘{’ Block ‘}’
167167
| SimpleType1 TypeArgs AppliedTypeTree(t, args)
@@ -170,16 +170,13 @@ Singleton ::= SimpleRef
170170
| SimpleLiteral
171171
| Singleton ‘.’ id
172172
-- not yet | Singleton ‘(’ Singletons ‘)’
173-
-- not yet | Singleton ‘[’ ArgTypes ‘]’
173+
-- not yet | Singleton ‘[’ Types ‘]’
174174
Singletons ::= Singleton { ‘,’ Singleton }
175-
ArgTypes ::= Types
176175
FunArgType ::= Type
177176
| ‘=>’ Type PrefixOp(=>, t)
178177
ParamType ::= [‘=>’] ParamValueType
179178
ParamValueType ::= Type [‘*’] PostfixOp(t, "*")
180-
TypeArgs ::= ‘[’ ArgTypes ‘]’ ts
181-
NamedTypeArg ::= id ‘=’ Type NamedArg(id, t)
182-
NamedTypeArgs ::= ‘[’ NamedTypeArg {‘,’ NamedTypeArg} ‘]’ nts
179+
TypeArgs ::= ‘[’ Types ‘]’ ts
183180
Refinement ::= ‘{’ [RefineDcl] {semi [RefineDcl]} ‘}’ ds
184181
TypeBounds ::= [‘>:’ Type] [‘<:’ Type] TypeBoundsTree(lo, hi)
185182
TypeParamBounds ::= TypeBounds {‘:’ Type} ContextBounds(typeBounds, tps)

library/src/scalaShadowing/language.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,9 @@ object language {
213213

214214
/** Experimental support for richer dependent types */
215215
object dependent
216+
217+
/** Experimental support for named type arguments */
218+
object namedTypeArguments
216219
}
217220

218221
/** Where imported, a backwards compatibility mode for Scala2 is enabled */
@@ -242,9 +245,6 @@ object language {
242245
*/
243246
object adhocExtensions
244247

245-
/** Experimental support for richer dependent types */
246-
object dependent
247-
248248
/** Source version */
249249
object `3.0-migration`
250250
object `3.0`

tests/neg/i2771.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import language.experimental.namedTypeArguments
12
trait A { type L[X] }
23
trait B { type L }
34
trait C { type M <: A }

tests/neg/i5328.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import language.experimental.namedTypeArguments
12
class C[X, Y] { def apply[Z](x: X, y: Y, z: Z) = (x, y, z) }
23

34
object Test {

tests/neg/namedTypeParams.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
class C[T]
22
class D[type T] // error: identifier expected, but `type` found
33

4+
object Test0:
5+
def f[X, Y](x: X, y: Y): Int = ???
6+
f[X = Int, Y = Int](1, 2) // error: experimental // error: experimental
7+
48
object Test {
9+
import language.experimental.namedTypeArguments
510

611
val x: C[T = Int] = // error: ']' expected, but `=` found // error
712
new C[T = Int] // error: ']' expected, but `=` found // error

tests/pos-custom-args/erased/i7868.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import language.experimental.namedTypeArguments
12
import scala.compiletime._
23

34
final case class Coproduct[+Set, +Value, Index <: Int](value: Value & Set, index: Index)

tests/pos/gadt-GadtStlc.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import language.experimental.namedTypeArguments
12
object GadtStlc {
23
// creates type-level "strings" like M[M[M[W]]]
34
object W

0 commit comments

Comments
 (0)