2013-03-12 16 views
5

Zum Beispiel, um alle Werte und deren Typen auf der Aufrufseite des Makros zugänglich zu machen? Oder zumindest nur die Werte aus der aktuellen Klasse? Zum Beispiel:Kann auf die Symboltabelle in einem Makro zugegriffen werden?

class A { 
    val v1 = 10 
    var v2 = "2" 

    def m { 
    val m3 = true 

    // Here I would like to get information that v1: Int, v2: String and 
    // v3: Boolean are available 
    macroInvocation() 
    } 
} 

Ich schaute in den Kontext und das Universum, konnte aber keine guten Methoden finden.

Einzige Lösung, die ich bis jetzt gefunden habe, ist, die umschließende Klasse/Methode des Makros (über den Kontext) zu erhalten und den Baum zu durchsuchen.

Antwort

2

Nur Lösung, die ich bisher gefunden ist die Makros umschließenden Klasse/Methode, um (über den Kontext), und suchen Sie den Baum

Ich habe das Gefühl, dass Sie, dass Sie meinen inspizieren tatsächlich die AST selbst, um die deklarierten Felder zu extrahieren. Du musst das nicht tun. Wenn c ist Ihr Context Wert, kann man einfach tun:

c.enclosingClass.symbol.typeSignature.members 
+0

Nun, ja, aber dann muss ich Werte und Variablen der Methode des inspizieren erklärt, die Felder der Klasse, die Klasse verschachtelt werden kann, dann kann die Klasse erben einige Felder von anderen Klassen/Eigenschaften etc. Alles in allem ziemlich viele Orte zu suchen. Ich fragte mich, ob die Informationen vielleicht bereits verfügbar sind (der Compiler muss es irgendwo haben, Frage ist, ist es öffentlich). – adamw

+0

Ich habe nicht genug Erfahrung mit Makros, um eine definitive Antwort zu geben, aber ich würde sagen, dass Sie nichts besseres finden werden (außer vielleicht ein paar Helfer in anderen Makros ausleihen, die Sie auf Github finden könnten). Ich glaube nicht, dass Sie auf die Symboltabelle zugreifen können. Zum einen ist die Symboltabelle veränderbar und wird sicherlich nicht wie sie ist zugänglich sein. Es müsste zumindest als eine begrenzte Read-Noly-Version verfügbar gemacht werden (wie zum Beispiel "SymbolTableApi" für die Konsistenz mit dem Rest der Reflektion/Makro-API). Aber es scheint nicht so, als ob solch eine Klasse/Eigenschaft existiert. –

+0

Ein kleiner Nitpick: Ich glaube nicht, dass "Symboltabelle" das Wort ist, nach dem wir hier suchen. Vielleicht würde "Scope" besser funktionieren? @adamw möchte in der Lage sein zu sehen, was sich in dem Bereich befindet, in dem sein Makro ausgeführt wird. Die Symboltabelle ist (meiner Erfahrung nach) eher eine statische, flache Liste von Symbolen, die dazu neigen, verstümmelte Namen zu sein (und im Fall der JVM eine vergessliche Manglung, die Typinformationen verliert) für den externen Konsum. Vielleicht macht Scala die Dinge anders. –

Verwandte Themen