Как локально расширенная функция расширения представлена ​​в JVM? - PullRequest
0 голосов
/ 15 апреля 2019

Я понимаю, что функции расширения компилируются в статические методы, которые получают экземпляр расширенного класса в качестве первого аргумента. Однако ни в одной из прочитанных мной документов не говорится о случае, когда функция расширения имеет локальную область действия.

Для функции расширения с локальной областью действия, как она представлена ​​в JVM? Если это все еще статическая функция, что мешает использовать ее за пределами определенной области?

Например, если я определю этот код:

fun Int.plusOne(): Int = plus(1)

fun three(): Int {
    fun Int.plusTwo(): Int = plus(2)
    return 0.plusOne() + 0.plusTwo()
}

fun main(): Unit {
    println(0.plusOne())
//  println(0.plusTwo()) // not available, because Int.plusTwo() is scoped to three()
    println(three())
}

И, используя IntelliJ для декомпиляции его на Java, я получаю:

@Metadata(...)
public final class ExampleKt {
   public static final int plusOne(int $receiver) {
      return $receiver + 1;
   }

   public static final int three() {
      <undefinedtype> plusTwo$ = null.INSTANCE;
      return plusOne(0) + plusTwo$.invoke(0);
   }

   public static final void main() {
      int var0 = plusOne(0);
      System.out.println(var0);
      var0 = three();
      System.out.println(var0);
   }
}

То, что <undefinedtype> plusTwo$ = null.INSTANCE; не кажется мне действительной Java, но очевидно, что, хотя plusOne действительно стал статической функцией, plusTwo не стал. Что здесь происходит?

...