@@ -293,14 +293,49 @@ object desugar {
293293 vparam => toDefParam(vparam, keepAnnotations = true , keepDefault = false )
294294 }
295295
296+ def ignoreErrorsAndRun [R ](op : => R ): R =
297+ val savedState = ctx.typerState.snapshot()
298+ val savedReporter = ctx.reporter
299+ ctx.typerState.setReporter(Reporter .NoReporter )
300+ val ret = op
301+ ctx.typerState.setReporter(savedReporter)
302+ ctx.typerState.resetTo(savedState)
303+ ret
304+
305+ // gets arguments should be considered precise
306+ val paramPrecises : List [Boolean ] =
307+ // indication for the type parameters preciseness
308+ val preciseMap : Map [TypeName , Boolean ] = {
309+ meth.leadingTypeParams.map(t =>
310+ (t.name, t.mods.annotations.exists {
311+ // TODO: this is a hack. Typing causes problems
312+ case Apply (Select (New (Ident (p)), _), _) => p.toString == " precise"
313+ case _ => false
314+ })
315+ ).toMap
316+ }
317+ // mapping type parameters preciseness onto term parameter preciseness
318+ meth.termParamss.view.flatten.map(p => p.tpt).map {
319+ case Ident (n) => preciseMap.getOrElse(n.asTypeName, false )
320+ case _ => false
321+ }.toList
322+
296323 def defaultGetters (paramss : List [ParamClause ], n : Int ): List [DefDef ] = paramss match
297324 case ValDefs (vparam :: vparams) :: paramss1 =>
298325 def defaultGetter : DefDef =
326+ val (rhs, tpt) =
327+ // if the parameter is precise, then we add explicit return type for the
328+ // definition to keep the precise type after precise typing.
329+ if paramPrecises(n) then
330+ val rhsTyped = withMode(Mode .Precise ){ctx.typer.typedExpr(vparam.rhs)}
331+ (TypedSplice (rhsTyped), TypeTree (rhsTyped.tpe))
332+ // otherwise, the desugaring is unchanged from the status quo
333+ else (vparam.rhs, TypeTree ())
299334 DefDef (
300335 name = DefaultGetterName (meth.name, n),
301336 paramss = getterParamss(n),
302- tpt = TypeTree () ,
303- rhs = vparam. rhs
337+ tpt = tpt ,
338+ rhs = rhs
304339 )
305340 .withMods(Modifiers (
306341 meth.mods.flags & (AccessFlags | Synthetic ) | (vparam.mods.flags & Inline ),
0 commit comments