Initial version of deserialization of compiled kotlin classes
Annotations are not supported
This commit is contained in:
committed by
Alexander Udalov
parent
83501c3722
commit
04e9e953c3
+17
-1
@@ -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);
|
||||
|
||||
|
||||
+30
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user