Не удалось найти прокси для... в макросе

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

В моем тестовом случае точная ошибка выглядит следующим образом:

java.lang.IllegalArgumentException: Не удалось найти прокси для пользователя val: specs.BasicSpeC# Пользователь в списке (значение user, метод applyOrElse, метод $anonfun$new$97, значение fiveLetterNames, метод $anonfun$new$90, метод $ anonfun $ новый $20, значение, класс BasicSpec, спецификации пакета, пакет) (currentOwner= значение fiveLetterNames)

Тест можно найти здесь:

https://github.com/outr/reactify/blob/master/shared/src/test/scala/specs/BasicSpec.scala

Это оскорбительный макрос:

https://github.com/outr/reactify/blob/master/shared/src/main/scala/com/outr/reactify/Macros.scala

Без дополнительной информации об ошибке я затрудняюсь решить эту проблему. Любая помощь очень ценится.

2 ответа

Решение

У меня была такая же проблема в моем проекте. Решение состоит в том, чтобы не использовать одну и ту же "лямбду"* в макросах более одного раза.

"лямбда" - это следующее:

def macroSample[A, B](c: blackbox.Context)
                     (lambda: c.Expr[A => B] /* <- lambda */) = { ... }

PS на самом деле я не могу увидеть ваш оригинальный код прямо сейчас. Это решение работает в моем случае

Чтобы немного подробнее остановиться на приведенном выше ответе и моем опыте, я столкнулся с этой проблемой, используя quill.

Базовый код выглядел примерно так

      case class Foo(id: FooID, bar: String, value Int)
case class FooState(FooId: FooId, state: String, stateCount: Int)
case class FooCurrentState(FooId: FooId, state: String)
def alsoUpdate(f: FooState) = {
  Quote { 
    query[FooCurrentState].insert(
       ...
    ).onConflictUpdate(_.fooId)(...)
  }

def doInsert(foo: Foo, state: String, stateCount) = {
  val newFooState = 
  transaction {
    run {
        query[Foo].insert(lift(foo))
        query[FooState].insert(lift(newFooState))
        alsoUpdate(newFooState))
    }
  }
}

я получил

java.lang.IllegalArgumentException: не удалось найти прокси для newFooState

Основываясь на принятом ответе, я реорганизовал свой код, чтобы он был таким

      case class Foo(id: FooID, bar: String, value Int)
case class FooState(FooId: FooId, state: String, stateCount: Int)
case class FooCurrentState(FooId: FooId, state: String)
def alsoUpdate(f: FooState) = {
  Quote { 
    query[FooCurrentState].insert(
       ...
    ).onConflictUpdate(_.fooId)(...)
  }

def doInsert(foo: Foo, state: String, stateCount) = {
  val newFooState = 
  transaction {
    run { query[Foo].insert(lift(foo)) }
    run { query[FooState].insert(lift(newFooState)) }
    run { alsoUpdate(newFooState)) }
    }
  }
}

Который скомпилировался без сбоя компилятора.

Другие вопросы по тегам