Scala Compiler Plugin:如何在子类中访问override方法的特定类型信息?

时间:2016-09-01 08:23:59

标签: scala scala-compiler

我正在开发一个Scala编译器插件,尝试转换每个函数调用,如

myfuncall(1)

进入

val newvalue = myfuncall(1)
newvalue

但是,当函数调用是另一个函数的返回值时,我遇到了麻烦。这是我要转换的代码

class A[C]
class B[C] extends A[C]

trait MyTrait[C] {
    def func1: A[C]
}

object MyObject extends MyTrait[Int] {
    def func1 = new B
}

在上面的示例中,编译器可以成功推断出new B的结果应该转换为A[Int],因为func1中的MyObject应该具有相同的返回类型在func1中为MyTrait[Int]

但是,当我使用编译器插件进行转换时会出现问题。

class A[C]
class B[C] extends A[C]

trait MyTrait[C] {
    def func1: A[C]
}

object MyObject extends MyTrait[Int] {
    def func1 = { 
        val newvalue = new B
        newvalue
    }
}

现在,newvalue没有提供任何额外的类型信息,而是编译器必须推断它。 newvalue的结果类型是B[Nothing],这是编译器可以推断的最具体的类型。

当我尝试将newvalue作为func1的返回值时,会出现问题。 func1需要A[Int]newvalue类型为B[Nothing],无法匹配。

如果我能在高级中知道func1所需的返回类型,则可以解决问题,因为我可以使用此返回类型指定newvalue,如下所示

class A[C]
class B[C] extends A[C]

trait MyTrait[C] {
    def func1: A[C]
}

object MyObject extends MyTrait[Int] {
    def func1 = { 
        val newvalue: A[Int] = new B
        newvalue
    }
}

上面的代码可以成功编译。

我的问题是,在编写Scala编译器插件时,如何知道func1MyObject的返回类型为A[Int],因为func1的签名没有&# 39;告诉它的返回类型。

我想从A[Int]func1的签名中了解编译器如何将MyObject作为func1的{​​{1}}的返回类型也是有帮助的。

在两个不同的源文件中定义MyTrait[Int]MyTrait时,此问题变得更加困难。

0 个答案:

没有答案