@@ -1254,10 +1254,10 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
12541254 typed(cpy.Block (tree)(clsDef :: Nil , New (Ident (anon), Nil )), pt)
12551255 case _ =>
12561256 var tpt1 = typedType(tree.tpt)
1257- val tsym = tpt1.tpe.underlyingClassRef(refinementOK = false ).typeSymbol
12581257 if ctx.mode.isQuotedPattern && tpt1.tpe.typeSymbol.isAllOf(Synthetic | Case ) then
12591258 val errorTp = errorType(CannotInstantiateQuotedTypeVar (tpt1.tpe.typeSymbol), tpt1.srcPos)
12601259 return cpy.New (tree)(tpt1).withType(errorTp)
1260+ val tsym = tpt1.tpe.underlyingClassRef(refinementOK = false ).typeSymbol
12611261 if tsym.is(Package ) then
12621262 report.error(em " $tsym cannot be instantiated " , tpt1.srcPos)
12631263 tpt1 = tpt1.withType(ensureAccessible(tpt1.tpe, superAccess = false , tpt1.srcPos))
@@ -1267,7 +1267,6 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
12671267 report.error(WildcardOnTypeArgumentNotAllowedOnNew (), targ.srcPos)
12681268 case _ =>
12691269 }
1270-
12711270 assignType(cpy.New (tree)(tpt1), tpt1)
12721271 }
12731272
@@ -5009,7 +5008,8 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
50095008 case _ =>
50105009 }
50115010
5012- /** If `tree` is a constructor proxy reference, convert it to a `new` expression,
5011+ /** If `tree` is a constructor proxy reference, convert it to a `new` expression;
5012+ * check if it is a reference to an exported type/companion pair;
50135013 * otherwise return EmptyTree.
50145014 */
50155015 def newExpr (tree : Tree ): Tree =
@@ -5025,13 +5025,19 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
50255025 cpy.Ident (qual)(qual.symbol.name.sourceModuleName.toTypeName)
50265026 case _ =>
50275027 errorTree(tree, em " cannot convert from $tree to an instance creation expression " )
5028- val tycon = ctorResultType.underlyingClassRef(refinementOK = Feature .enabled(modularity))
5028+ val tycon =
5029+ val exported =
5030+ if qual.symbol.isAllOf(SyntheticMethod | Exported ) then
5031+ qual.symbol.owner.info.memberBasedOnFlags(qual.symbol.name.toTypeName, required = Exported )
5032+ else NoDenotation
5033+ if exported.exists then exported.symbol.typeRef
5034+ else ctorResultType.underlyingClassRef(refinementOK = Feature .enabled(modularity))
50295035 typed(
50305036 untpd.Select (
50315037 untpd.New (untpd.TypedSplice (tpt.withType(tycon))),
50325038 nme.CONSTRUCTOR ),
5033- pt)
5034- .showing(i " convert creator $tree -> $result" , typr)
5039+ pt
5040+ ) .showing(i " convert creator $tree -> $result" , typr)
50355041
50365042 /** If `tree` is a constructor proxy reference, return the type it constructs,
50375043 * otherwise return NoType.
@@ -5050,7 +5056,8 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
50505056 // begin adapt1
50515057 tree match {
50525058 case _ : MemberDef | _ : PackageDef | _ : Import | _ : WithoutTypeOrPos [? ] | _ : Closure => tree
5053- case _ => tree.tpe.widen match {
5059+ case _ =>
5060+ tree.tpe.widen match
50545061 case tp : FlexType =>
50555062 ensureReported(tp)
50565063 tree
@@ -5112,7 +5119,6 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
51125119 if (ctx.mode is Mode .Type ) adaptType(tree.tpe)
51135120 else adaptNoArgs(wtp)
51145121 }
5115- }
51165122 }
51175123 }
51185124
0 commit comments