Initial version of deserialization of compiled kotlin classes

Annotations are not supported
This commit is contained in:
Pavel V. Talanov
2013-06-28 21:07:22 +04:00
committed by Alexander Udalov
parent 83501c3722
commit 04e9e953c3
9 changed files with 377 additions and 42 deletions
@@ -69,7 +69,7 @@ public abstract class AbstractClassResolver implements ClassResolver {
AbstractClassResolver _this = AbstractClassResolver.this;
ClassDescriptor classDescriptor = new DeserializedClassDescriptor(
storageManager, owner, classData.getNameResolver(), _this.annotationDeserializer,
storageManager, owner, classData.getNameResolver(), _this.annotationDeserializer,
_this, nestedClassResolver, classProto, null
);
classDescriptorCreated(classDescriptor);
@@ -81,6 +81,16 @@ public abstract class AbstractClassResolver implements ClassResolver {
@Nullable
@Override
public ClassDescriptor findClass(@NotNull ClassId classId) {
ClassDescriptor externalClassDescriptor = resolveClassExternally(classId);
if (externalClassDescriptor != null) {
return externalClassDescriptor;
}
return findClassInternally(classId);
}
//do not call resolveClassExternally
@Nullable
public ClassDescriptor findClassInternally(@NotNull ClassId classId) {
return findClass.fun(classId);
}
@@ -93,6 +103,12 @@ public abstract class AbstractClassResolver implements ClassResolver {
@NotNull
protected abstract ClassId getClassId(@NotNull ClassDescriptor classDescriptor);
@Nullable
protected ClassDescriptor resolveClassExternally(@NotNull ClassId classId) {
//TODO: decide whether it is ok to provide default implementation
return null;
}
@NotNull
protected abstract Name getClassObjectName(@NotNull ClassDescriptor outerClass);
@@ -1,14 +1,44 @@
package org.jetbrains.jet.descriptors.serialization;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.List;
public final class ClassId {
private final FqName packageFqName;
private final FqNameUnsafe relativeClassName;
@NotNull
public static ClassId fromFqNameAndContainingDeclaration(
@NotNull FqName fqName,
@NotNull ClassOrNamespaceDescriptor containingDeclaration
) {
NamespaceDescriptor containingNamespace = DescriptorUtils.getParentOfType(containingDeclaration, NamespaceDescriptor.class, false);
assert containingNamespace != null;
List<Name> fullNameSegments = fqName.pathSegments();
FqName namespaceFqName = DescriptorUtils.getFQName(containingNamespace).toSafe();
List<Name> namespaceNameSegments = namespaceFqName.pathSegments();
for (int i = 0; i < namespaceNameSegments.size(); ++i) {
assert fullNameSegments.get(i).equals(namespaceNameSegments.get(i));
}
List<Name> relativeNameSegments = fullNameSegments.subList(namespaceNameSegments.size(), fullNameSegments.size());
FqName relativeFqName = FqName.fromSegments(ContainerUtil.map2List(relativeNameSegments, new Function<Name, String>() {
@Override
public String fun(Name name) {
return name.asString();
}
}));
return new ClassId(namespaceFqName, relativeFqName.toUnsafe());
}
public ClassId(@NotNull FqName packageFqName, @NotNull FqNameUnsafe relativeClassName) {
this.packageFqName = packageFqName;
assert !relativeClassName.isRoot() : "Class name must not be root. " + packageFqName;