From 175dbd292ec1649be82e701f5eef0a5b8fa675a4 Mon Sep 17 00:00:00 2001 From: Quentin Bernet Date: Thu, 20 Apr 2023 13:09:54 +0200 Subject: [PATCH 1/2] Add test for #12460 --- tests/neg/i12460.scala | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 tests/neg/i12460.scala diff --git a/tests/neg/i12460.scala b/tests/neg/i12460.scala new file mode 100644 index 000000000000..450bac7aa2d0 --- /dev/null +++ b/tests/neg/i12460.scala @@ -0,0 +1,7 @@ + +extension (x: String = "123") // error + def f2 = x.reverse + + +extension (x: => String) // error + def f2 = x.reverse From b4c7a8b468687471ee9ec78a9581773f33ee9b1a Mon Sep 17 00:00:00 2001 From: Quentin Bernet Date: Thu, 20 Apr 2023 13:13:33 +0200 Subject: [PATCH 2/2] Add WIP checkExtensionParameters Does not compile ! --- .../dotty/tools/dotc/typer/RefChecks.scala | 24 +++++++++++++++++++ tests/neg/i12460.scala | 4 ++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala index 4ca00ce6366f..d470b65bc1d8 100644 --- a/compiler/src/dotty/tools/dotc/typer/RefChecks.scala +++ b/compiler/src/dotty/tools/dotc/typer/RefChecks.scala @@ -1147,10 +1147,34 @@ class RefChecks extends MiniPhase { thisPhase => tree } + // TODO: Refactor with the one in checkUnaryMethods + def checkExtensionParameters(sym: Symbol)(using Context): Unit = + if sym.is(Extension) || sym.name.is(ExtMethName) then + println(s"checkExtensionParameters: ${tpe.show}") + sym.info match + case tpe: MethodType => + assert(tpe.paramNames.length == 1) + if tpe.isContextualMethod then checkExtensionParameters(tpe.resType) + else + val param: Type = tpe.paramInfos.head + val paramSymbol: Symbol = tpe.paramNames.head + // TODO: Add test of default argument here + param match + case ExprType(_) => + report.error(em"$param is bad", paramSymbol.srcPos) // TODO: Find correct way to get position + + println(param.show) + println(param) + assert(true) + println("Done") + case tpe: PolyType => + checkExtensionParameters(tpe.resType) + override def transformDefDef(tree: DefDef)(using Context): DefDef = { checkNoPrivateOverrides(tree) checkImplicitNotFoundAnnotation.defDef(tree.symbol.denot) checkUnaryMethods(tree.symbol) + checkExtensionParameters(tree.symbol) tree } diff --git a/tests/neg/i12460.scala b/tests/neg/i12460.scala index 450bac7aa2d0..2f40f9107fef 100644 --- a/tests/neg/i12460.scala +++ b/tests/neg/i12460.scala @@ -1,7 +1,7 @@ - +/* extension (x: String = "123") // error def f2 = x.reverse - +*/ extension (x: => String) // error def f2 = x.reverse