Skip to content

Commit 5b5b87c

Browse files
committed
Fix parameter unpickling
Parameter names always come in as term names, ahve to be explicitly converted to type names. The previous implementation used a cast instead of a conversion, which caused a ClassCastException. For symmetry we model readParamNames such that it returns a List[Name] which has to be explicitly converted to a List[TermName] or a List[TypeName], using a map.
1 parent 7adc6c8 commit 5b5b87c

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,9 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table) {
197197
// ------ Reading types -----------------------------------------------------
198198

199199
/** Read names in an interleaved sequence of (parameter) names and types/bounds */
200-
def readParamNames[N <: Name](end: Addr): List[N] =
200+
def readParamNames(end: Addr): List[Name] =
201201
until(end) {
202-
val name = readName().asInstanceOf[N]
202+
val name = readName()
203203
skipTree()
204204
name
205205
}
@@ -244,11 +244,11 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table) {
244244
def readLengthType(): Type = {
245245
val end = readEnd()
246246

247-
def readNamesSkipParams[N <: Name]: (List[N], TreeReader) = {
247+
def readNamesSkipParams: (List[Name], TreeReader) = {
248248
val nameReader = fork
249249
nameReader.skipTree() // skip result
250250
val paramReader = nameReader.fork
251-
(nameReader.readParamNames[N](end), paramReader)
251+
(nameReader.readParamNames(end), paramReader)
252252
}
253253

254254
val result =
@@ -288,24 +288,24 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table) {
288288
registerSym(start, sym)
289289
TypeRef.withFixedSym(NoPrefix, sym.name, sym)
290290
case LAMBDAtype =>
291-
val (rawNames, paramReader) = readNamesSkipParams[TypeName]
291+
val (rawNames, paramReader) = readNamesSkipParams
292292
val (variances, paramNames) = rawNames
293-
.map(name => (prefixToVariance(name.head), name.tail.asTypeName)).unzip
293+
.map(name => (prefixToVariance(name.head), name.tail.toTypeName)).unzip
294294
val result = TypeLambda(paramNames, variances)(
295295
pt => registeringType(pt, paramReader.readParamTypes[TypeBounds](end)),
296296
pt => readType())
297297
goto(end)
298298
result
299299
case POLYtype =>
300-
val (names, paramReader) = readNamesSkipParams[TypeName]
301-
val result = PolyType(names)(
300+
val (names, paramReader) = readNamesSkipParams
301+
val result = PolyType(names.map(_.toTypeName))(
302302
pt => registeringType(pt, paramReader.readParamTypes[TypeBounds](end)),
303303
pt => readType())
304304
goto(end)
305305
result
306306
case METHODtype =>
307-
val (names, paramReader) = readNamesSkipParams[TermName]
308-
val result = MethodType(names, paramReader.readParamTypes[Type](end))(
307+
val (names, paramReader) = readNamesSkipParams
308+
val result = MethodType(names.map(_.toTermName), paramReader.readParamTypes[Type](end))(
309309
mt => registeringType(mt, readType()))
310310
goto(end)
311311
result

0 commit comments

Comments
 (0)