복붙노트

[SCALA] 액세스 부모의 회원 매크로 주석을 처리 할 수는 없지만

SCALA

액세스 부모의 회원 매크로 주석을 처리 할 수는 없지만

나는 종류 다음 (매크로 주석)과 차단의 생각 상태. 내가 주석이라고 @Factory이 있다고 가정하는 목적은 동반자는 대응 객체에 대한 주석 형질 방법을 적용 생성한다. 예를 들어, 특성 A를 주어진 :

@factory
trait A {
  val a1: Int
}

생성 될 것으로 예상 코드는 다음 중 하나입니다 :

object A extends Factory[A] {
  def apply(_a1: Int) = new A {
    val a1 = _a1
  }
}

이제 우리는에서 어떤 상속 형질 B가 있다고 가정합니다 :

@factory
trait B extends A {
  val b1: String
}

어떤이 생성 해 :

object B extends Factory[B] {
  def apply(_a1: Int, _b1: String) = new B {
    val a1 = _a1
    val b1 = _b1
  }
}

후자의 경우, 나는에 존재하는 속성입니다 알아야합니다,하지만 난 그들에 대한 정보를 얻을하는 방법을 모르겠어요. 매크로 주석을 다루는 동안 나는의 (a ClassDef 등) B의 형질 AST 만 액세스 할 수 있습니다. 그 템플릿 (TypeTrees 등) 부모에 대한 참조를 포함하고 있지만, 두 필드는 TPE와 기호는 비어 있습니다.

나이 (가)의 AST에 접근하는 것이 좋은 것입니다. 그러나, 나는 그것이 가능하지 생각합니다. 따라서, 어떤 기호 나 유형 (포인팅 중 부모 또는 현재 유형은) 충분히 좋은 것입니다.

당신이 더 많은 구현 세부 정보를보고 싶은 경우에, 나는 https://github.com/jesuslopez-gonzalez/cool-factory에 프로젝트를 업로드했습니다. 그것은 로컬 값을 적용 생성 할 수 있습니다.

해결법

  1. ==============================

    1.매크로 주석 인수에 가서 나무는 의도적으로 지정되지 않은 있습니다. 그러나 ( "??? (<부모를 대표하는 나무>)"Q) c.typeCheck를 실행 TPE는 누락 된 정보를 제공 할 것입니다.. , 유형 검사 전에 나무를 복제하는 것을 잊지 마세요 때문에 c.typeCheck 변이 바람직하지 않은 수 있습니다 장소에 나무.

    매크로 주석 인수에 가서 나무는 의도적으로 지정되지 않은 있습니다. 그러나 ( "??? (<부모를 대표하는 나무>)"Q) c.typeCheck를 실행 TPE는 누락 된 정보를 제공 할 것입니다.. , 유형 검사 전에 나무를 복제하는 것을 잊지 마세요 때문에 c.typeCheck 변이 바람직하지 않은 수 있습니다 장소에 나무.

    부모와 자식이 모두 같은 비 최상위 범위에 선언 된 경우, 주석을하지 않습니다 그래서, 부모 어휘 범위에서 수행되는 유형 체킹이 c.typeCheck의 매크로 주석에서와 같이 부모를보고하지 않는 문제가있을 것입니다 반 구축 범위를 볼 수 있습니다. 비슷한 여기에보고되었습니다 https://github.com/aztek/scala-workflow/issues/2#issuecomment-23947943.

    유형 검사에서 현재 범위를 제외하는 결정은 최종적인 것이 아니다. 이번 주 내가 매크로 주석을 둘러싸는 범위와 상호 작용하는 방법에 대한 자세한 조금 생각하고있을 것이고, 아마 당신이 할 싶은 일을하기 위해 변경됩니다. 지금은 변화를 할 거라고,하지만 난 확실히 그 변화에서 발생하는 미친 행동이되지 않습니다 확인해야합니다.

  2. from https://stackoverflow.com/questions/19379436/cant-access-parents-members-while-dealing-with-macro-annotations by cc-by-sa and MIT license