summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authormihaylov <mihaylov@epfl.ch>2004-04-27 09:54:37 +0000
committermihaylov <mihaylov@epfl.ch>2004-04-27 09:54:37 +0000
commit91a1d60c0d93d1c49d45388fca6345803c9c3a77 (patch)
treee18d5f50dc4ae0559e02ba236ba47ff205bc8aee /sources
parent7ff8b2396fa0dc440e68f50be55bd4c2881ad217 (diff)
downloadscala-91a1d60c0d93d1c49d45388fca6345803c9c3a77.tar.gz
scala-91a1d60c0d93d1c49d45388fca6345803c9c3a77.tar.bz2
scala-91a1d60c0d93d1c49d45388fca6345803c9c3a77.zip
- Added support for separate compilation, i.e.
symbol table from Scala classes compiled to .NET assembly
Diffstat (limited to 'sources')
-rw-r--r--sources/scalac/symtab/classfile/CLRPackageParser.java31
1 files changed, 27 insertions, 4 deletions
diff --git a/sources/scalac/symtab/classfile/CLRPackageParser.java b/sources/scalac/symtab/classfile/CLRPackageParser.java
index 90fd0fcc47..557201df16 100644
--- a/sources/scalac/symtab/classfile/CLRPackageParser.java
+++ b/sources/scalac/symtab/classfile/CLRPackageParser.java
@@ -17,6 +17,8 @@ import java.util.Set;
import java.util.LinkedHashSet;
import java.io.File;
+import scala.tools.util.AbstractFile;
+import scala.tools.util.ByteArrayFile;
import ch.epfl.lamp.compiler.msil.*;
import scalac.symtab.Symbol;
@@ -52,6 +54,8 @@ public class CLRPackageParser extends SymbolLoader {
public Type STRING;
public Type STRING_ARRAY;
+ public Type SCALA_SYMTAB_ATTR;
+
protected CLRClassParser completer;
private CLRPackageParser(Global global) {
@@ -101,6 +105,9 @@ public class CLRPackageParser extends SymbolLoader {
findAssembly("vjslib.dll");
findAssembly("scala.dll");
+
+ SCALA_SYMTAB_ATTR = Type.GetType("scala.support.SymtabAttribute");
+
//findAssembly("scalalib.dll");
findAllAssemblies();
@@ -251,16 +258,32 @@ public class CLRPackageParser extends SymbolLoader {
return;
}
for (int i = 0; i < types.length; i++) {
- String fullname = types[i].FullName;
- if (!fullname.startsWith(n1))
+ final Type type = types[i];
+ final String fullname = type.FullName;
+ if (!fullname.startsWith(n1) /*|| fullname.endsWith("$class")*/)
continue;
int j = n1.length();
int k = fullname.indexOf('.', j);
String name = fullname.substring(j, k < 0 ? fullname.length() : k);
- Name n = Name.fromString(name);
+ Name n = Name.fromString(name).toTypeName();
if (k < 0) {
// it's a class
- Symbol clazz = p.newLoadedClass(JAVA, n.toTypeName(), completer, members);
+ Object[] symtab_attr =
+ type.GetCustomAttributes(SCALA_SYMTAB_ATTR, false);
+ AbstractFile symtab = null;
+ for (int l = 0; l < symtab_attr.length; l++) {
+ MemberInfo.Attribute a = (MemberInfo.Attribute)symtab_attr[l];
+ if (a.GetType() == SCALA_SYMTAB_ATTR) {
+ symtab = new ByteArrayFile
+ (fullname, type.Assembly.GetName().toString(),
+ a.getValue());
+ break;
+ }
+ }
+ SymbolLoader loader = symtab == null ? this.completer
+ : new SymblParser(global, symtab);
+
+ Symbol clazz = p.newLoadedClass(JAVA, n, loader, members);
map(clazz, types[i]);
} else {
importCLRNamespace(name, p, members);