2014-05-07 29 views
2

假設我有兩個宏觀註解類,後擴張期間他們的字段定義,一個依賴於其它:如何指定多個類的宏註解擴展的順序?

@Annotation case class A(i: Int) @Annotation case class B(a: A)

我需要AB之前張開,但順序他們的定義並不能確保。

例如,在一個不相關的編譯單元到B的引用作爲一個類型參數的一個對象,如:

在一個文件中,而在另一個class Y{Z[B]}class X{val b = B(A(1))}

導致B被擴展首先,因此我的彙編失敗。

什麼決定了這種情況下宏擴展的順序?有沒有辦法強制執行所需的命令?

感謝您的輸入,

朱利安

+0

你能解釋一下你的用例? 'Annotation'宏是做什麼的?也許有一些你可以分享的代碼? –

+0

感謝您的回覆,並對我的延誤表示歉意。該代碼使案例類Avro-serializable成爲可能,部分原因是將其轉換爲Schema對象並將其存儲以防再次需要。如果某個字段的類型是另一個案例類別,則該其他案例類別需要已經存儲。 –

+0

[此分支](https://github.com/julianpeeters/avro-scala-macro-annotations/tree/expansion_order)是一個最小化的示例,顯示擴展的順序不僅取決於給定文件中的第一個引用,還取決於引用它的文件名的詞彙順序。也就是說,將'A.scala'重命名爲'Z.scala',以便它遵循'Test.scala'的詞法,編譯將會成功。 –

回答

1

typecheck是我的解決方案。

如果A型(A的tree.tpe)在編譯時使用反射宏觀已擴大之前,可以儘快,因爲它是偶然發現擴展:

import c.universe._ 
import Flag._ 

def expandType(typeTree: Tree) = { 
    c.typecheck(q"type T = $typeTree") match { 
    case x @ TypeDef(mods, name, tparams, rhs) => rhs.tpe 
    } 
}