@@ -97,26 +97,25 @@ trait QuotesAndSplices {
9797 ctx.warning(" Canceled quote directly inside a splice. ${ '[ XYZ ] } is equivalent to XYZ." , tree.sourcePos)
9898 case _ =>
9999 }
100+
100101 if (ctx.mode.is(Mode .QuotedPattern ) && level == 1 )
101- if (isFullyDefined(pt, ForceDegree .all)) {
102- ctx.error(i " Spliced type pattern must not be fully defined. Consider using $pt directly " , tree.expr.sourcePos)
103- tree.withType(UnspecifiedErrorType )
104- }
105- else {
106- def spliceOwner (ctx : Context ): Symbol =
107- if (ctx.mode.is(Mode .QuotedPattern )) spliceOwner(ctx.outer) else ctx.owner
108- val name = tree.expr match {
109- case Ident (name) => (" $" + name).toTypeName
110- case expr =>
111- ctx.error(" expected a name binding" , expr.sourcePos)
112- " $error" .toTypeName
113- }
114- val typeSym = ctx.newSymbol(spliceOwner(ctx), name, EmptyFlags , TypeBounds .empty, NoSymbol , tree.expr.span)
115- typeSym.addAnnotation(Annotation (New (ref(defn.InternalQuoted_patternBindHoleAnnot .typeRef)).withSpan(tree.expr.span)))
116- val pat = typedPattern(tree.expr, defn.QuotedTypeClass .typeRef.appliedTo(typeSym.typeRef))(
117- spliceContext.retractMode(Mode .QuotedPattern ).withOwner(spliceOwner(ctx)))
118- pat.select(tpnme.splice)
102+ def spliceOwner (ctx : Context ): Symbol =
103+ if (ctx.mode.is(Mode .QuotedPattern )) spliceOwner(ctx.outer) else ctx.owner
104+ val name = tree.expr match {
105+ case Ident (name) => (" $" + name).toTypeName
106+ case expr =>
107+ ctx.error(" expected a name binding" , expr.sourcePos)
108+ " $error" .toTypeName
119109 }
110+
111+ val typeSymInfo = pt match
112+ case pt : TypeBounds => pt
113+ case _ => TypeBounds .empty
114+ val typeSym = ctx.newSymbol(spliceOwner(ctx), name, EmptyFlags , typeSymInfo, NoSymbol , tree.expr.span)
115+ typeSym.addAnnotation(Annotation (New (ref(defn.InternalQuoted_patternBindHoleAnnot .typeRef)).withSpan(tree.expr.span)))
116+ val pat = typedPattern(tree.expr, defn.QuotedTypeClass .typeRef.appliedTo(typeSym.typeRef))(
117+ spliceContext.retractMode(Mode .QuotedPattern ).withOwner(spliceOwner(ctx)))
118+ pat.select(tpnme.splice)
120119 else
121120 typedSelect(untpd.Select (tree.expr, tpnme.splice), pt)(spliceContext).withSpan(tree.span)
122121 }
@@ -191,11 +190,13 @@ trait QuotesAndSplices {
191190 patBuf += pat1
192191 }
193192 case Select (pat, _) if tree.symbol == defn.QuotedType_splice =>
194- val sym = tree.tpe.dealias.typeSymbol.asType
195- val tdef = TypeDef (sym).withSpan(sym.span)
196- freshTypeBindingsBuff += transformTypeBindingTypeDef(tdef, freshTypePatBuf)
197- TypeTree (tree.tpe.dealias).withSpan(tree.span)
198-
193+ val sym = tree.tpe.dealias.typeSymbol
194+ if sym.exists then
195+ val tdef = TypeDef (sym.asType).withSpan(sym.span)
196+ freshTypeBindingsBuff += transformTypeBindingTypeDef(tdef, freshTypePatBuf)
197+ TypeTree (tree.tpe.dealias).withSpan(tree.span)
198+ else
199+ tree
199200 case ddef : ValOrDefDef =>
200201 if (ddef.symbol.hasAnnotation(defn.InternalQuoted_patternBindHoleAnnot )) {
201202 val bindingType = ddef.symbol.info match {
@@ -317,13 +318,16 @@ trait QuotesAndSplices {
317318 ctx.error(missingArgMsg(qctx, defn.QuoteContextClass .typeRef, " " ), ctx.source.atSpan(tree.span))
318319
319320 val quoted = tree.quoted
320- val exprPt = pt.baseType(defn.QuotedExprClass )
321+ val exprPt = pt.baseType(if quoted.isType then defn. QuotedTypeClass else defn.QuotedExprClass )
321322 val quotedPt = exprPt.argInfos.headOption match {
322323 case Some (argPt : ValueType ) => argPt // excludes TypeBounds
323324 case _ => defn.AnyType
324325 }
325326 val quoted0 = desugar.quotedPattern(quoted, untpd.TypedSplice (TypeTree (quotedPt)))
326- val quoted1 = typedExpr(quoted0, WildcardType )(quoteContext.addMode(Mode .QuotedPattern ))
327+ val quoteCtx = quoteContext.addMode(Mode .QuotedPattern )
328+ val quoted1 =
329+ if quoted.isType then typedType(quoted0, WildcardType )(quoteCtx)
330+ else typedExpr(quoted0, WildcardType )(quoteCtx)
327331
328332 val (typeBindings, shape, splices) = splitQuotePattern(quoted1)
329333
0 commit comments