2013-03-26 15 views
7

Mam listę symboli reprezentujących pakiety, obiekty i klasy i chcę je importować w kontekście makro.Import i symbole wieloznaczne w Symbole w Scala

Dla pakietów i obiektów oznaczałoby to import symboli wieloznacznych, a dla klas oznaczałoby to "standardowy" import.

Biorąc pod uwagę List[Symbol] składający some.package, some.Class i some.Object, jak bym właściwie importować te i jak mogę zdecydować, czy „standard” lub import wieloznaczny musi być używany?

Moje obecne podejście jest takie:

def importPackageOrModuleOrClass(sym: Symbol): Import = 
    if (sym.isPackage || sym.isModule) // e. g. import scala._, scala.Predef 
    gen.mkWildcardImport(sym) 
    else        // e. g. import java.lang.String 
    gen.mkImport(sym.enclosingPackage, sym.name, sym.name) // <--- ????? 

Prace pakiet import/modułu, ale import klasa nie choć wygląda poprawne.

+1

nie mam zrobić to z rzeczami 'TreeGen', ale jeśli pisałeś to w zwykłym starym makrze, musiałbyś zmienić' sym.name' (który jest obecnie 'TypeName') na' TermName'. –

+0

Jak to zrobić? Myślę, że próbowałem 'asTerm', ale to nie działało. – soc

+1

Oto [szybki przykład] (https://gist.github.com/travisbrown/5948460), który łączy Twój kod z eksperymentem, nad którym pracowałem jakiś czas temu. To samo zostanie wydrukowane bez względu na to, czy konwertujesz 'TypeName' na' TermName', czy też nie, ale działa tylko wersja 'TermName'. –

Odpowiedz

1

Musisz dostać „TermName” takiego ...

def importPackageOrModuleOrClass(sym: Symbol): Import = 
if (sym.isPackage || sym.isModule) 
    gen.mkWildcardImport(sym) 
else 
    gen.mkImport(sym.enclosingPackage, sym.name.toTermName, sym.name.toTermName) 

Można złapać więcej wskazówek dotyczących przywozu, odzwierciedlające, itd. Za pośrednictwem kodu źródłowego w http://xuwei-k.github.io/scala-compiler-sxr/scala-compiler-2.10.0/scala/reflect/internal/Importers.scala.html

Powiązane problemy