@@ -298,7 +298,7 @@ extension (tps: Seq[TCoPattern])
298
298
ctx.globalDefs.get(name) match
299
299
// skip existing data type and value constructors
300
300
case Some (_ : (GData | GDataValue )) =>
301
- case _ => names.addOne(name)
301
+ case _ => names.addOne(name)
302
302
case TpXConstructor (_, _, args) =>
303
303
args.foreach(processPattern)
304
304
case _ =>
@@ -312,41 +312,69 @@ extension (td: TDeclaration)
312
312
def toPreDeclaration (using ctx : TranslationContext ): PreDeclaration =
313
313
td match
314
314
case TData (name, tParamTys, ty, constructors) =>
315
- val tParamTysCTerm = tParamTys.map:
316
- case (TBinding (name, ty, usage), variance) =>
317
- (Binding (ty.toCTerm, usage.toCTerm)(Name .Normal (name)), variance)
318
- val tyCTerm = ty.toCTerm
319
- val constructorCTerms = constructors.map(_.toPreConstructor)
320
- PreDeclaration .PreData (
321
- ctx.moduleQn / name,
322
- tParamTysCTerm.toList,
323
- tyCTerm,
324
- constructorCTerms.toList,
325
- )
315
+ val tParamTysCTerm = translateTParamTysWithVariance(tParamTys.toList)
316
+ {
317
+ given TranslationContext = ctx.bindLocal(tParamTys.map(_._1.name)* )
318
+ val tyCTerm = ty.toCTerm
319
+ val constructorCTerms = constructors.map(_.toPreConstructor)
320
+ PreDeclaration .PreData (
321
+ ctx.moduleQn / name,
322
+ tParamTysCTerm,
323
+ tyCTerm,
324
+ constructorCTerms.toList,
325
+ )
326
+ }
326
327
case TRecord (selfName, name, tParamTys, ty, fields) =>
327
- val tParamTysCTerm = tParamTys.map:
328
- case (TBinding (name, ty, usage), variance) =>
329
- (Binding (ty.toCTerm, usage.toCTerm)(Name .Normal (name)), variance)
330
- val tyCTerm = ty.toCTerm
331
- val fieldCTerms = fields.map(_.toPreField)
332
- PreDeclaration .PreRecord (
333
- ctx.moduleQn / name,
334
- tParamTysCTerm.toList,
335
- tyCTerm,
336
- fieldCTerms.toList,
337
- )
328
+ val tParamTysCTerm = translateTParamTysWithVariance(tParamTys.toList)
329
+ {
330
+ given TranslationContext = ctx.bindLocal(tParamTys.map(_._1.name)* )
331
+ val tyCTerm = ty.toCTerm
332
+ val fieldCTerms = fields.map(_.toPreField)
333
+ PreDeclaration .PreRecord (
334
+ ctx.moduleQn / name,
335
+ tParamTysCTerm,
336
+ tyCTerm,
337
+ fieldCTerms.toList,
338
+ )
339
+ }
338
340
case TDefinition (name, tParamTys, ty, clauses) =>
339
- val tParamTysCTerm = tParamTys.map:
340
- case TBinding (name, ty, usage) =>
341
- Binding (ty.toCTerm, usage.toCTerm)(Name .Normal (name))
342
- val tyCTerm = ty.toCTerm
343
- val clauseCTerms = clauses.map(_.toPreClause)
344
- PreDeclaration .PreDefinition (
345
- ctx.moduleQn / name,
346
- tParamTysCTerm.toList,
347
- tyCTerm,
348
- clauseCTerms.toList,
349
- )
341
+ val tParamTysCTerm = translateTParamTys(tParamTys.toList)
342
+ {
343
+ given TranslationContext = ctx.bindLocal(tParamTys.map(_.name)* )
344
+ val tyCTerm = ty.toCTerm
345
+ val clauseCTerms = clauses.map(_.toPreClause)
346
+ PreDeclaration .PreDefinition (
347
+ ctx.moduleQn / name,
348
+ tParamTysCTerm,
349
+ tyCTerm,
350
+ clauseCTerms.toList,
351
+ )
352
+ }
353
+
354
+ private def translateTParamTys
355
+ (bindings : List [TBinding ])
356
+ (using ctx : TranslationContext )
357
+ : List [Binding [CTerm ]] =
358
+ bindings match
359
+ case Nil => Nil
360
+ case TBinding (name, ty, usage) :: rest =>
361
+ Binding (ty.toCTerm, usage.toCTerm)(Name .Normal (name)) :: translateTParamTys(rest)(using
362
+ ctx.bindLocal(name),
363
+ )
364
+
365
+ private def translateTParamTysWithVariance
366
+ (bindings : List [(TBinding , Variance )])
367
+ (using ctx : TranslationContext )
368
+ : List [(Binding [CTerm ], Variance )] =
369
+ bindings match
370
+ case Nil => Nil
371
+ case (TBinding (name, ty, usage), variance) :: rest =>
372
+ (
373
+ Binding (ty.toCTerm, usage.toCTerm)(Name .Normal (name)),
374
+ variance,
375
+ ) :: translateTParamTysWithVariance(rest)(using
376
+ ctx.bindLocal(name),
377
+ )
350
378
351
379
extension (tc : TConstructor )
352
380
def toPreConstructor (using ctx : TranslationContext ): PreConstructor =
0 commit comments