Use module to resolve annotation classes in AnnotationDescriptorLoader
This commit is contained in:
@@ -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;
|
||||
|
||||
+21
-16
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
+1
-5
@@ -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);
|
||||
|
||||
+1
-8
@@ -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) {
|
||||
|
||||
+6
-6
@@ -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
|
||||
|
||||
+18
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user