Use module to resolve annotation classes in AnnotationDescriptorLoader

This commit is contained in:
Pavel V. Talanov
2014-06-16 15:00:57 +04:00
parent d961d17cd4
commit 245919d691
20 changed files with 209 additions and 68 deletions
@@ -18,6 +18,11 @@ package org.jetbrains.jet.lang.resolve.java;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class JvmClassName {
@NotNull
@@ -76,6 +81,28 @@ public class JvmClassName {
return internalName;
}
@NotNull
public FqName getPackageFqName() {
int packageNameEnd = internalName.lastIndexOf("/");
if (packageNameEnd == -1) {
return FqName.ROOT;
}
return FqName.fromSegments(Arrays.asList(internalName.substring(0, packageNameEnd).split("/")));
}
@NotNull
public FqName getHeuristicClassFqName() {
String name = internalName.substring(internalName.lastIndexOf("/") + 1);
char[] chars = name.toCharArray();
//treat all 'stand-alone' dollars as dots, except for last and first char of class name
for (int i = 1; i < chars.length - 1; ++i) {
if (name.charAt(i) == '$' && name.charAt(i - 1) != '$' && name.charAt(i + 1) != '$') {
chars[i] = '.';
}
}
return new FqName(new String(chars));
}
@Override
public String toString() {
return internalName;
@@ -18,9 +18,8 @@ package org.jetbrains.jet.lang.resolve.kotlin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.JavaProtoBuf;
import org.jetbrains.jet.descriptors.serialization.NameResolver;
import org.jetbrains.jet.descriptors.serialization.ProtoBuf;
import org.jetbrains.jet.descriptors.serialization.*;
import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotatedCallableKind;
import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationLoader;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
@@ -35,8 +34,9 @@ import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils;
import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter;
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 org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolver;
import org.jetbrains.jet.lang.types.ErrorUtils;
import javax.inject.Inject;
@@ -46,20 +46,22 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotatedCallableKind;
import static org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage.MemberSignature;
import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.javaFqNameToKotlinFqName;
public class AnnotationDescriptorLoader extends BaseDescriptorLoader implements AnnotationLoader {
private ModuleDescriptor module;
@Inject
@Override
public void setStorage(@NotNull DescriptorDeserializersStorage storage) {
this.storage = storage;
public void setModule(ModuleDescriptor module) {
this.module = module;
}
@Inject
@Override
public void setClassResolver(@NotNull DependencyClassByQualifiedNameResolver classResolver) {
this.classResolver = classResolver;
public void setStorage(@NotNull DescriptorDeserializersStorage storage) {
this.storage = storage;
}
@Inject
@@ -101,7 +103,7 @@ public class AnnotationDescriptorLoader extends BaseDescriptorLoader implements
@Nullable
@Override
public KotlinJvmBinaryClass.AnnotationArgumentVisitor visitAnnotation(@NotNull JvmClassName className) {
return resolveAnnotation(className, result, classResolver);
return resolveAnnotation(className, result, module);
}
@Override
@@ -116,11 +118,11 @@ public class AnnotationDescriptorLoader extends BaseDescriptorLoader implements
public static KotlinJvmBinaryClass.AnnotationArgumentVisitor resolveAnnotation(
@NotNull JvmClassName className,
@NotNull final List<AnnotationDescriptor> result,
@NotNull final DependencyClassByQualifiedNameResolver classResolver
@NotNull final ModuleDescriptor moduleDescriptor
) {
if (JvmAnnotationNames.isSpecialAnnotation(className)) return null;
final ClassDescriptor annotationClass = resolveClass(className, classResolver);
final ClassDescriptor annotationClass = resolveClass(className, moduleDescriptor);
return new KotlinJvmBinaryClass.AnnotationArgumentVisitor() {
private final Map<ValueParameterDescriptor, CompileTimeConstant<?>> arguments = new HashMap<ValueParameterDescriptor, CompileTimeConstant<?>>();
@@ -147,7 +149,7 @@ public class AnnotationDescriptorLoader extends BaseDescriptorLoader implements
@NotNull
private CompileTimeConstant<?> enumEntryValue(@NotNull JvmClassName enumClassName, @NotNull Name name) {
ClassDescriptor enumClass = resolveClass(enumClassName, classResolver);
ClassDescriptor enumClass = resolveClass(enumClassName, moduleDescriptor);
if (enumClass.getKind() == ClassKind.ENUM_CLASS) {
ClassifierDescriptor classifier = enumClass.getUnsubstitutedInnerClassesScope().getClassifier(name);
if (classifier instanceof ClassDescriptor) {
@@ -175,8 +177,11 @@ public class AnnotationDescriptorLoader extends BaseDescriptorLoader implements
}
@NotNull
private static ClassDescriptor resolveClass(@NotNull JvmClassName className, DependencyClassByQualifiedNameResolver classResolver) {
ClassDescriptor annotationClass = classResolver.resolveClass(className.getFqNameForClassNameWithoutDollars());
private static ClassDescriptor resolveClass(@NotNull JvmClassName className, @NotNull ModuleDescriptor moduleDescriptor) {
FqName packageFqName = className.getPackageFqName();
FqNameUnsafe relativeClassName = javaFqNameToKotlinFqName(className.getHeuristicClassFqName());
ClassId classId = new ClassId(packageFqName, relativeClassName);
ClassDescriptor annotationClass = SerializationPackage.findClassAcrossModuleDependencies(moduleDescriptor, classId);
return annotationClass != null ? annotationClass : ErrorUtils.createErrorClass(className.getInternalName());
}
@@ -21,6 +21,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.JavaProtoBuf;
import org.jetbrains.jet.descriptors.serialization.NameResolver;
import org.jetbrains.jet.descriptors.serialization.ProtoBuf;
import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotatedCallableKind;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedCallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassOrPackageFragmentDescriptor;
@@ -29,9 +30,7 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolver;
import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotatedCallableKind;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isClassObject;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isTrait;
import static org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage.MemberSignature;
@@ -39,14 +38,11 @@ import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.ko
import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.naiveKotlinFqName;
public abstract class BaseDescriptorLoader {
protected DependencyClassByQualifiedNameResolver classResolver;
protected KotlinClassFinder kotlinClassFinder;
protected ErrorReporter errorReporter;
protected DescriptorDeserializersStorage storage;
public abstract void setClassResolver(@NotNull DependencyClassByQualifiedNameResolver classResolver);
public abstract void setKotlinClassFinder(@NotNull KotlinClassFinder kotlinClassFinder);
public abstract void setErrorReporter(@NotNull ErrorReporter errorReporter);
@@ -20,15 +20,14 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.NameResolver;
import org.jetbrains.jet.descriptors.serialization.ProtoBuf;
import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotatedCallableKind;
import org.jetbrains.jet.descriptors.serialization.descriptors.ConstantLoader;
import org.jetbrains.jet.lang.descriptors.ClassOrPackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter;
import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolver;
import javax.inject.Inject;
import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotatedCallableKind;
import static org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage.MemberSignature;
public class ConstantDescriptorLoader extends BaseDescriptorLoader implements ConstantLoader {
@@ -38,12 +37,6 @@ public class ConstantDescriptorLoader extends BaseDescriptorLoader implements Co
this.storage = storage;
}
@Inject
@Override
public void setClassResolver(@NotNull DependencyClassByQualifiedNameResolver classResolver) {
this.classResolver = classResolver;
}
@Inject
@Override
public void setKotlinClassFinder(@NotNull KotlinClassFinder kotlinClassFinder) {
@@ -19,13 +19,13 @@ package org.jetbrains.jet.lang.resolve.kotlin;
import kotlin.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.constants.ConstantsPackage;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolver;
import org.jetbrains.jet.storage.MemoizedFunctionToNotNull;
import org.jetbrains.jet.storage.StorageManager;
@@ -34,8 +34,8 @@ import java.io.IOException;
import java.util.*;
public class DescriptorDeserializersStorage {
private DependencyClassByQualifiedNameResolver classResolver;
private ErrorReporter errorReporter;
private ModuleDescriptor module;
private final MemoizedFunctionToNotNull<KotlinJvmBinaryClass, Storage> storage;
@@ -57,8 +57,8 @@ public class DescriptorDeserializersStorage {
}
@Inject
public void setClassResolver(DependencyClassByQualifiedNameResolver classResolver) {
this.classResolver = classResolver;
public void setModule(ModuleDescriptor module) {
this.module = module;
}
@Inject
@@ -137,7 +137,7 @@ public class DescriptorDeserializersStorage {
result = new ArrayList<AnnotationDescriptor>();
memberAnnotations.put(paramSignature, result);
}
return AnnotationDescriptorLoader.resolveAnnotation(className, result, classResolver);
return AnnotationDescriptorLoader.resolveAnnotation(className, result, module);
}
}
@@ -152,7 +152,7 @@ public class DescriptorDeserializersStorage {
@Nullable
@Override
public KotlinJvmBinaryClass.AnnotationArgumentVisitor visitAnnotation(@NotNull JvmClassName className) {
return AnnotationDescriptorLoader.resolveAnnotation(className, result, classResolver);
return AnnotationDescriptorLoader.resolveAnnotation(className, result, module);
}
@Override
@@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.resolve.java.JvmAbi;
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 org.jetbrains.jet.lang.resolve.name.SpecialNames;
import java.util.ArrayList;
import java.util.List;
@@ -44,6 +45,23 @@ public class DeserializedResolverUtils {
return FqName.fromSegments(correctedSegments);
}
@NotNull
public static FqNameUnsafe javaFqNameToKotlinFqName(@NotNull FqName javaFqName) {
if (javaFqName.isRoot()) {
return javaFqName.toUnsafe();
}
List<Name> segments = javaFqName.pathSegments();
List<Name> correctedSegments = new ArrayList<Name>(segments.size());
correctedSegments.add(segments.get(0));
for (int i = 1; i < segments.size(); i++) {
Name segment = segments.get(i);
boolean isClassObjectName = segment.asString().equals(JvmAbi.CLASS_OBJECT_CLASS_NAME);
Name correctedSegment = isClassObjectName ? SpecialNames.getClassObjectName(segments.get(i - 1)) : segment;
correctedSegments.add(correctedSegment);
}
return FqNameUnsafe.fromSegments(correctedSegments);
}
@NotNull
public static FqNameUnsafe naiveKotlinFqName(@NotNull ClassDescriptor descriptor) {
DeclarationDescriptor containing = descriptor.getContainingDeclaration();