in scalafix/rules/src/main/scala/rsc/rules/RscCompat.scala [266:355]
private def ascribeInferredType(ctx: RuleCtx, target: RewriteTarget): Patch = {
try {
val typeString = config.hardcoded
.get(target.symbol)
.orElse {
val symbol = target match {
case target: RewriteDefn if target.varDefnPat =>
s"${target.symbol.init}()."
case _ =>
target.symbol
}
symbols
.info(symbol)
.flatMap { info =>
target match {
case target: RewriteWithBody =>
target.body match {
case Term.ApplyType(Term.Name("implicitly"), _) if info.isImplicit =>
None
case Term.ApplyType(
Term.Select(Term.Name("Bijection"), Term.Name("connect")),
_) if info.isImplicit =>
None
case _ =>
val returnTypeOpt = info.signature match {
case s.MethodSignature(_, _, _: s.ConstantType) =>
None
case s.MethodSignature(_, _, returnType) =>
Some(returnType)
case s.ValueSignature(tpe) =>
// FIXME: https://github.com/scalameta/scalameta/issues/1725
Some(tpe)
case other =>
val details = other.asMessage.toProtoString
sys.error(s"unsupported outline: $details")
}
returnTypeOpt.map { returnType =>
val printer =
new SemanticdbPrinter(target.env, addedImportsScope, symbols, config)
printer.pprint(returnType)
printer.toString
}
}
case target: RewriteInit =>
info.signature match {
case s.ClassSignature(_, (parent: s.TypeRef) +: _, _, _) =>
val printer =
new SemanticdbPrinter(target.env, addedImportsScope, symbols, config)
printer.rep("[", parent.typeArguments, ", ", "]")(printer.pprint)
Some(printer.toString)
}
}
}
}
.getOrElse("")
if (typeString.nonEmpty) {
target match {
case target: RewriteDefn =>
val before = {
val lparenOpt = if (target.parens) "(" else ""
ctx.addLeft(target.before, lparenOpt)
}
val after = {
val whitespaceOpt = {
if (TokenOps.needsLeadingSpaceBeforeColon(target.after)) " "
else ""
}
val ascription = s": $typeString"
val rparenOpt = if (target.parens) ")" else ""
ctx.addRight(target.after, whitespaceOpt + ascription + rparenOpt)
}
before + after
case target: RewriteDefault =>
ctx.addRight(target.after, s": $typeString")
case target: RewriteInit =>
ctx.addRight(target.parentCtor, typeString)
}
} else {
Patch.empty
}
} catch {
case ex: Throwable =>
val sw = new java.io.StringWriter()
ex.printStackTrace(new PrintWriter(sw))
Patch.lint(Diagnostic("RscCompat", sw.toString, target.pos))
}
}