@@ -97,26 +97,25 @@ trait QuotesAndSplices {
97
97
ctx.warning(" Canceled quote directly inside a splice. ${ '[ XYZ ] } is equivalent to XYZ." , tree.sourcePos)
98
98
case _ =>
99
99
}
100
+
100
101
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
119
109
}
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)
120
119
else
121
120
typedSelect(untpd.Select (tree.expr, tpnme.splice), pt)(spliceContext).withSpan(tree.span)
122
121
}
@@ -191,11 +190,13 @@ trait QuotesAndSplices {
191
190
patBuf += pat1
192
191
}
193
192
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
199
200
case ddef : ValOrDefDef =>
200
201
if (ddef.symbol.hasAnnotation(defn.InternalQuoted_patternBindHoleAnnot )) {
201
202
val bindingType = ddef.symbol.info match {
@@ -317,13 +318,16 @@ trait QuotesAndSplices {
317
318
ctx.error(missingArgMsg(qctx, defn.QuoteContextClass .typeRef, " " ), ctx.source.atSpan(tree.span))
318
319
319
320
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 )
321
322
val quotedPt = exprPt.argInfos.headOption match {
322
323
case Some (argPt : ValueType ) => argPt // excludes TypeBounds
323
324
case _ => defn.AnyType
324
325
}
325
326
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)
327
331
328
332
val (typeBindings, shape, splices) = splitQuotePattern(quoted1)
329
333
0 commit comments