@@ -1258,10 +1258,10 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
12581258 pt)
12591259 case _ =>
12601260 var tpt1 = typedType(tree.tpt)
1261- val tsym = tpt1.tpe.underlyingClassRef(refinementOK = false ).typeSymbol
12621261 if ctx.mode.isQuotedPattern && tpt1.tpe.typeSymbol.isAllOf(Synthetic | Case ) then
12631262 val errorTp = errorType(CannotInstantiateQuotedTypeVar (tpt1.tpe.typeSymbol), tpt1.srcPos)
12641263 return cpy.New (tree)(tpt1).withType(errorTp)
1264+ val tsym = tpt1.tpe.underlyingClassRef(refinementOK = false ).typeSymbol
12651265 if tsym.is(Package ) then
12661266 report.error(em " $tsym cannot be instantiated " , tpt1.srcPos)
12671267 tpt1 = tpt1.withType(ensureAccessible(tpt1.tpe, superAccess = false , tpt1.srcPos))
@@ -1271,7 +1271,6 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
12711271 report.error(WildcardOnTypeArgumentNotAllowedOnNew (), targ.srcPos)
12721272 case _ =>
12731273 }
1274-
12751274 assignType(cpy.New (tree)(tpt1), tpt1)
12761275 }
12771276
@@ -5025,7 +5024,8 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
50255024 case _ =>
50265025 }
50275026
5028- /** If `tree` is a constructor proxy reference, convert it to a `new` expression,
5027+ /** If `tree` is a constructor proxy reference, convert it to a `new` expression;
5028+ * check if it is a reference to an exported type/companion pair;
50295029 * otherwise return EmptyTree.
50305030 */
50315031 def newExpr (tree : Tree ): Tree =
@@ -5041,13 +5041,19 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
50415041 cpy.Ident (qual)(qual.symbol.name.sourceModuleName.toTypeName)
50425042 case _ =>
50435043 errorTree(tree, em " cannot convert from $tree to an instance creation expression " )
5044- val tycon = ctorResultType.underlyingClassRef(refinementOK = Feature .enabled(modularity))
5044+ val tycon =
5045+ val exported =
5046+ if qual.symbol.isAllOf(SyntheticMethod | Exported ) then
5047+ qual.symbol.owner.info.memberBasedOnFlags(qual.symbol.name.toTypeName, required = Exported )
5048+ else NoDenotation
5049+ if exported.exists then exported.symbol.typeRef
5050+ else ctorResultType.underlyingClassRef(refinementOK = Feature .enabled(modularity))
50455051 typed(
50465052 untpd.Select (
50475053 untpd.New (untpd.TypedSplice (tpt.withType(tycon))),
50485054 nme.CONSTRUCTOR ),
5049- pt)
5050- .showing(i " convert creator $tree -> $result" , typr)
5055+ pt
5056+ ) .showing(i " convert creator $tree -> $result" , typr)
50515057
50525058 /** If `tree` is a constructor proxy reference, return the type it constructs,
50535059 * otherwise return NoType.
@@ -5066,7 +5072,8 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
50665072 // begin adapt1
50675073 tree match {
50685074 case _ : MemberDef | _ : PackageDef | _ : Import | _ : WithoutTypeOrPos [? ] | _ : Closure => tree
5069- case _ => tree.tpe.widen match {
5075+ case _ =>
5076+ tree.tpe.widen match
50705077 case tp : FlexType =>
50715078 ensureReported(tp)
50725079 tree
@@ -5128,7 +5135,6 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
51285135 if (ctx.mode is Mode .Type ) adaptType(tree.tpe)
51295136 else adaptNoArgs(wtp)
51305137 }
5131- }
51325138 }
51335139 }
51345140
0 commit comments