diff options
author | Den Shabalin <den.shabalin@gmail.com> | 2013-10-31 11:47:51 +0100 |
---|---|---|
committer | Den Shabalin <den.shabalin@gmail.com> | 2013-11-12 14:04:42 +0100 |
commit | c6fe22f5479458a688a819f92f2af43c5867ea81 (patch) | |
tree | cf51804be7b997336d2b2e4f93a082500f1bbaa2 /src/reflect/scala/reflect/internal/Importers.scala | |
parent | ee1e81aa39ccbb44a4176eaf0dde5bc2e2ad5ddd (diff) | |
download | scala-c6fe22f5479458a688a819f92f2af43c5867ea81.tar.gz scala-c6fe22f5479458a688a819f92f2af43c5867ea81.tar.bz2 scala-c6fe22f5479458a688a819f92f2af43c5867ea81.zip |
add support for importable attachments
Previously attachments weren't imported by importTree. Now a new marker
trait has been added that lets attachments to import themselves to the
new universe together with all their innards. Additionally a simpler
subtrait is defined to mark attachments that can be imported as-is.
Diffstat (limited to 'src/reflect/scala/reflect/internal/Importers.scala')
-rw-r--r-- | src/reflect/scala/reflect/internal/Importers.scala | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/internal/Importers.scala b/src/reflect/scala/reflect/internal/Importers.scala index 72c8ccfa62..cc6e55192f 100644 --- a/src/reflect/scala/reflect/internal/Importers.scala +++ b/src/reflect/scala/reflect/internal/Importers.scala @@ -8,6 +8,16 @@ import scala.ref.WeakReference // SI-6241: move importers to a mirror trait Importers extends api.Importers { to: SymbolTable => + /** Attachment that knows how to import itself into another universe. */ + trait ImportableAttachment { + def importAttachment(importer: Importer): this.type + } + + /** Attachment that doesn't contain any reflection artificats and can be imported as-is. */ + trait PlainAttachment extends ImportableAttachment { + def importAttachment(importer: Importer): this.type = this + } + def mkImporter(from0: api.Universe): Importer { val from: from0.type } = ( if (to eq from0) { new Importer { @@ -417,11 +427,15 @@ trait Importers extends api.Importers { to: SymbolTable => my.setPos(importPosition(their.pos)) } } + importAttachments(their.attachments.all).foreach { my.updateAttachment(_) } my } // ============== MISCELLANEOUS ============== + def importAttachments(attachments: Set[Any]): Set[Any] = + attachments.collect { case ia: ImportableAttachment => ia.importAttachment(this) } + def importAnnotationInfo(ann: from.AnnotationInfo): AnnotationInfo = { val atp1 = importType(ann.atp) val args1 = ann.args map importTree |