score:1

let's define test compiler plugin.

core/src/main/scala/main.scala

abstract class genericcontroller[t] {
  def getpath():string
  def save(entity:t):string = "parent"
}

class statuscontroller extends genericcontroller[string] {
  override def getpath():string = "/statuses"
  override def save(entity:string):string = "child"
}

plugin/src/main/resources/scalac-plugin.xml

<plugin>
    <name>mycompilerplugin</name>
    <classname>compilerplugin.mycompilerplugin</classname>
</plugin>

plugin/src/main/scala/compilerplugin/mycompilerplugin.scala

package compilerplugin

import scala.tools.nsc.{global, phase}
import scala.tools.nsc.plugins.{plugin, plugincomponent}

class mycompilerplugin(val global: global) extends plugin {
  import global._

  val name = "mycompilerplugin"
  val description = "my compiler plugin"
  val components: list[plugincomponent] = list[plugincomponent](mycomponent)

  private object mycomponent extends plugincomponent {
    val global: mycompilerplugin.this.global.type = mycompilerplugin.this.global
    val runsafter: list[string] = list[string](/*"typer"*/"jvm")
    val phasename: string = mycompilerplugin.this.name
    def newphase(_prev: phase) = new myphase(_prev)

    class myphase(prev: phase) extends stdphase(prev) {
      override def name: string = mycompilerplugin.this.name

      def apply(unit: compilationunit): unit = {
        for (tree@q"$mods def $tname[..$tparams](...$paramss): $tpt = $expr" <- unit.body) {
          println(s"tree=$tree, symbol=${tree.symbol.fullname}, symbol.overrides=${tree.symbol.overrides.map(_.fullname)}")
        }
      }
    }
  }
}

build.sbt

thisbuild / name := "compiler-plugin-demo"

lazy val commonsettings = seq(
  scalaversion := "2.13.3",
  version := "1.0",
)

lazy val plugin = project
  .settings(
    commonsettings,
    librarydependencies ++= seq(
      scalaorganization.value % "scala-reflect" % scalaversion.value,
      scalaorganization.value % "scala-compiler" % scalaversion.value,
    )
  )

lazy val core = project
  .settings(
    commonsettings,
    scalacoptions ++= seq(
      "-xplugin:plugin/target/scala-2.13/plugin_2.13-1.0.jar",
      "-xplugin-require:mycompilerplugin"
    )
  )

if you run (sbt reload; clean; plugin/package; core/compile) this compiler plugin after typer phase it prints

tree=def <init>(): genericcontroller[t] = {
  genericcontroller.super.<init>();
  ()
}, symbol=genericcontroller.<init>, symbol.overrides=list()
tree=def getpath(): string, symbol=genericcontroller.getpath, symbol.overrides=list()
tree=def save(entity: t): string = "parent", symbol=genericcontroller.save, symbol.overrides=list()
tree=def <init>(): statuscontroller = {
  statuscontroller.super.<init>();
  ()
}, symbol=statuscontroller.<init>, symbol.overrides=list()
tree=override def getpath(): string = "/statuses", symbol=statuscontroller.getpath, symbol.overrides=list(genericcontroller.getpath)
tree=override def save(entity: string): string = "child", symbol=statuscontroller.save, symbol.overrides=list(genericcontroller.save)

but if you run it after jvm phase it prints

tree=def getpath(): string, symbol=genericcontroller.getpath, symbol.overrides=list()
tree=def save(entity: object): string = "parent", symbol=genericcontroller.save, symbol.overrides=list()
tree=def <init>(): genericcontroller = {
  genericcontroller.super.<init>();
  ()
}, symbol=genericcontroller.<init>, symbol.overrides=list()
tree=override def getpath(): string = "/statuses", symbol=statuscontroller.getpath, symbol.overrides=list(genericcontroller.getpath)
tree=override def save(entity: string): string = "child", symbol=statuscontroller.save, symbol.overrides=list()
tree=override <bridge> <artifact> def save(entity: object): string = statuscontroller.this.save(entity.$asinstanceof[string]()), symbol=statuscontroller.save, symbol.overrides=list(genericcontroller.save)
tree=def <init>(): statuscontroller = {
  statuscontroller.super.<init>();
  ()
}, symbol=statuscontroller.<init>, symbol.overrides=list()

so as you can see, after typer phase, method symbol statuscontroller.getpath overrides method symbol genericcontroller.getpath and statuscontroller.save overrides genericcontroller.save. and after jvm phase statuscontroller.getpath again overrides genericcontroller.getpath but it's bridge statuscontroller.save instead of ordinary statuscontroller.save that overrides genericcontroller.save. so i guess you confused symbol of bridge method with symbol of ordinary method.


Related Query

More Query from same tag