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
@@ -111,15 +111,14 @@ public class InjectorForJavaDescriptorResolver {
deserializedDescriptorResolver.setContext(deserializationGlobalContextForJava);
deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter);
annotationDescriptorLoader.setClassResolver(javaDescriptorResolver);
annotationDescriptorLoader.setErrorReporter(traceBasedErrorReporter);
annotationDescriptorLoader.setKotlinClassFinder(virtualFileFinder);
annotationDescriptorLoader.setModule(module);
annotationDescriptorLoader.setStorage(descriptorDeserializersStorage);
descriptorDeserializersStorage.setClassResolver(javaDescriptorResolver);
descriptorDeserializersStorage.setErrorReporter(traceBasedErrorReporter);
descriptorDeserializersStorage.setModule(module);
constantDescriptorLoader.setClassResolver(javaDescriptorResolver);
constantDescriptorLoader.setErrorReporter(traceBasedErrorReporter);
constantDescriptorLoader.setKotlinClassFinder(virtualFileFinder);
constantDescriptorLoader.setStorage(descriptorDeserializersStorage);
@@ -241,15 +241,14 @@ public class InjectorForLazyResolveWithJava {
deserializedDescriptorResolver.setContext(deserializationGlobalContextForJava);
deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter);
annotationDescriptorLoader.setClassResolver(javaDescriptorResolver);
annotationDescriptorLoader.setErrorReporter(traceBasedErrorReporter);
annotationDescriptorLoader.setKotlinClassFinder(virtualFileFinder);
annotationDescriptorLoader.setModule(module);
annotationDescriptorLoader.setStorage(descriptorDeserializersStorage);
descriptorDeserializersStorage.setClassResolver(javaDescriptorResolver);
descriptorDeserializersStorage.setErrorReporter(traceBasedErrorReporter);
descriptorDeserializersStorage.setModule(module);
constantDescriptorLoader.setClassResolver(javaDescriptorResolver);
constantDescriptorLoader.setErrorReporter(traceBasedErrorReporter);
constantDescriptorLoader.setKotlinClassFinder(virtualFileFinder);
constantDescriptorLoader.setStorage(descriptorDeserializersStorage);
@@ -321,15 +321,14 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
deserializedDescriptorResolver.setContext(deserializationGlobalContextForJava);
deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter);
annotationDescriptorLoader.setClassResolver(javaDescriptorResolver);
annotationDescriptorLoader.setErrorReporter(traceBasedErrorReporter);
annotationDescriptorLoader.setKotlinClassFinder(virtualFileFinder);
annotationDescriptorLoader.setModule(moduleDescriptor);
annotationDescriptorLoader.setStorage(descriptorDeserializersStorage);
descriptorDeserializersStorage.setClassResolver(javaDescriptorResolver);
descriptorDeserializersStorage.setErrorReporter(traceBasedErrorReporter);
descriptorDeserializersStorage.setModule(moduleDescriptor);
constantDescriptorLoader.setClassResolver(javaDescriptorResolver);
constantDescriptorLoader.setErrorReporter(traceBasedErrorReporter);
constantDescriptorLoader.setKotlinClassFinder(virtualFileFinder);
constantDescriptorLoader.setStorage(descriptorDeserializersStorage);
@@ -0,0 +1,13 @@
package test
class A {
class object {
annotation class Anno1
class B {
annotation class Anno2
}
}
}
A.Anno1 A.B.Anno2 class C
@@ -0,0 +1,25 @@
package test
internal final class A {
/*primary*/ public constructor A()
internal class object <class-object-for-A> {
/*primary*/ private constructor <class-object-for-A>()
internal final annotation class Anno1 : kotlin.Annotation {
/*primary*/ public constructor Anno1()
}
internal final class B {
/*primary*/ public constructor B()
internal final annotation class Anno2 : kotlin.Annotation {
/*primary*/ public constructor Anno2()
}
}
}
}
test.A.Anno1() test.A.B.Anno2() internal final class C {
/*primary*/ public constructor C()
}
@@ -0,0 +1,6 @@
package test
//this test relies on particular heuristic implemntation, can become irrelevant should implementation change
annotation class `$$$$$$`
`$$$$$$`class A
@@ -0,0 +1,9 @@
package test
internal final annotation class $$$$$$ : kotlin.Annotation {
/*primary*/ public constructor $$$$$$()
}
test.$$$$$$() internal final class A {
/*primary*/ public constructor A()
}
@@ -0,0 +1,9 @@
package test
class A {
annotation class Anno
}
A.Anno class B {
A.Anno fun f() {}
}
@@ -0,0 +1,14 @@
package test
internal final class A {
/*primary*/ public constructor A()
internal final annotation class Anno : kotlin.Annotation {
/*primary*/ public constructor Anno()
}
}
test.A.Anno() internal final class B {
/*primary*/ public constructor B()
test.A.Anno() internal final fun f(): kotlin.Unit
}
@@ -1627,6 +1627,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/loadJava/compiledKotlin/annotations/classes"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("AnnotationInClassObject.kt")
public void testAnnotationInClassObject() throws Exception {
doTestCompiledKotlin("compiler/testData/loadJava/compiledKotlin/annotations/classes/AnnotationInClassObject.kt");
}
@TestMetadata("ClassInClassObject.kt")
public void testClassInClassObject() throws Exception {
doTestCompiledKotlin("compiler/testData/loadJava/compiledKotlin/annotations/classes/ClassInClassObject.kt");
@@ -1647,6 +1652,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest {
doTestCompiledKotlin("compiler/testData/loadJava/compiledKotlin/annotations/classes/Deprecated.kt");
}
@TestMetadata("DollarsInAnnotationName.kt")
public void testDollarsInAnnotationName() throws Exception {
doTestCompiledKotlin("compiler/testData/loadJava/compiledKotlin/annotations/classes/DollarsInAnnotationName.kt");
}
@TestMetadata("EnumArgument.kt")
public void testEnumArgument() throws Exception {
doTestCompiledKotlin("compiler/testData/loadJava/compiledKotlin/annotations/classes/EnumArgument.kt");
@@ -1657,6 +1667,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest {
doTestCompiledKotlin("compiler/testData/loadJava/compiledKotlin/annotations/classes/MultipleAnnotations.kt");
}
@TestMetadata("NestedAnnotation.kt")
public void testNestedAnnotation() throws Exception {
doTestCompiledKotlin("compiler/testData/loadJava/compiledKotlin/annotations/classes/NestedAnnotation.kt");
}
@TestMetadata("NestedClass.kt")
public void testNestedClass() throws Exception {
doTestCompiledKotlin("compiler/testData/loadJava/compiledKotlin/annotations/classes/NestedClass.kt");
@@ -95,6 +95,11 @@ public class LazyResolveRecursiveComparingTestGenerated extends AbstractLazyReso
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/loadJava/compiledKotlin/annotations/classes"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("AnnotationInClassObject.kt")
public void testAnnotationInClassObject() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/AnnotationInClassObject.kt");
}
@TestMetadata("ClassInClassObject.kt")
public void testClassInClassObject() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/ClassInClassObject.kt");
@@ -115,6 +120,11 @@ public class LazyResolveRecursiveComparingTestGenerated extends AbstractLazyReso
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/Deprecated.kt");
}
@TestMetadata("DollarsInAnnotationName.kt")
public void testDollarsInAnnotationName() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/DollarsInAnnotationName.kt");
}
@TestMetadata("EnumArgument.kt")
public void testEnumArgument() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/EnumArgument.kt");
@@ -125,6 +135,11 @@ public class LazyResolveRecursiveComparingTestGenerated extends AbstractLazyReso
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/MultipleAnnotations.kt");
}
@TestMetadata("NestedAnnotation.kt")
public void testNestedAnnotation() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/NestedAnnotation.kt");
}
@TestMetadata("NestedClass.kt")
public void testNestedClass() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/NestedClass.kt");
@@ -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();
@@ -30,7 +30,7 @@ private fun findInnerClass(classDescriptor: ClassDescriptor, name: Name): ClassD
}
}
fun ModuleDescriptor.findClassAcrossModuleDependencies(classId: ClassId): ClassDescriptor? {
public fun ModuleDescriptor.findClassAcrossModuleDependencies(classId: ClassId): ClassDescriptor? {
val packageViewDescriptor = getPackage(classId.getPackageFqName()) ?: return null
val segments = classId.getRelativeClassName().pathSegments()
val topLevelClass = packageViewDescriptor.getMemberScope().getClassifier(segments.first!!) as? ClassDescriptor ?: return null
@@ -27,7 +27,6 @@ import org.jetbrains.jet.lang.resolve.name.FqName
import org.jetbrains.jet.lang.resolve.name.Name
import org.jetbrains.jet.storage.LockBasedStorageManager
import java.util.Collections
import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.jet.lang.resolve.kotlin.KotlinBinaryClassCache
import org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils
@@ -56,6 +55,9 @@ public fun DeserializerForDecompiler(classFile: VirtualFile): DeserializerForDec
public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val directoryPackageFqName: FqName) : ResolverForDecompiler {
private val moduleDescriptor =
ModuleDescriptorImpl(Name.special("<module for building decompiled sources>"), listOf(), PlatformToKotlinClassMap.EMPTY)
override fun resolveTopLevelClass(classFqName: FqName) = classes(classFqName.toClassId())
override fun resolveDeclarationsInPackage(packageFqName: FqName): Collection<DeclarationDescriptor> {
@@ -100,19 +102,13 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
private val deserializerStorage = DescriptorDeserializersStorage(storageManager);
{
deserializerStorage.setClassResolver {
fqName ->
classes(fqName.toClassId())
}
deserializerStorage.setModule(moduleDescriptor)
deserializerStorage.setErrorReporter(LOGGING_REPORTER)
}
private val annotationLoader = AnnotationDescriptorLoader();
{
annotationLoader.setClassResolver {
fqName ->
classes(fqName.toClassId())
}
annotationLoader.setModule(moduleDescriptor)
annotationLoader.setKotlinClassFinder(localClassFinder)
annotationLoader.setErrorReporter(LOGGING_REPORTER)
annotationLoader.setStorage(deserializerStorage)
@@ -120,10 +116,6 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
private val constantLoader = ConstantDescriptorLoader();
{
constantLoader.setClassResolver {
fqName ->
classes(fqName.toClassId())
}
constantLoader.setKotlinClassFinder(localClassFinder)
constantLoader.setErrorReporter(LOGGING_REPORTER)
constantLoader.setStorage(deserializerStorage)
@@ -149,9 +141,6 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
}
}
private val moduleDescriptor =
ModuleDescriptorImpl(Name.special("<module for building decompiled sources>"), listOf(), PlatformToKotlinClassMap.EMPTY);
{
moduleDescriptor.addFragmentProvider(DependencyKind.BUILT_INS,
KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider())
@@ -166,13 +155,8 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
}
private fun resolveClassByClassId(classId: ClassId): ClassDescriptor? {
val binaryClass = localClassFinder.findKotlinClass(classId)
if (binaryClass != null) {
return deserializeBinaryClass(binaryClass)
}
val fullFqName = classId.asSingleFqName()
assert(fullFqName.isSafe(), "Safe fq name expected here, got $fullFqName instead")
return MissingDependencyErrorClassDescriptor(ErrorUtils.getErrorModule(), fullFqName.toSafe())
val binaryClass = localClassFinder.findKotlinClass(classId) ?: return null
return deserializeBinaryClass(binaryClass)
}
private fun deserializeBinaryClass(kotlinClass: KotlinJvmBinaryClass): ClassDescriptor {
@@ -95,6 +95,11 @@ public class LazyResolveByStubTestGenerated extends AbstractLazyResolveByStubTes
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/loadJava/compiledKotlin/annotations/classes"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("AnnotationInClassObject.kt")
public void testAnnotationInClassObject() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/AnnotationInClassObject.kt");
}
@TestMetadata("ClassInClassObject.kt")
public void testClassInClassObject() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/ClassInClassObject.kt");
@@ -115,6 +120,11 @@ public class LazyResolveByStubTestGenerated extends AbstractLazyResolveByStubTes
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/Deprecated.kt");
}
@TestMetadata("DollarsInAnnotationName.kt")
public void testDollarsInAnnotationName() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/DollarsInAnnotationName.kt");
}
@TestMetadata("EnumArgument.kt")
public void testEnumArgument() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/EnumArgument.kt");
@@ -125,6 +135,11 @@ public class LazyResolveByStubTestGenerated extends AbstractLazyResolveByStubTes
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/MultipleAnnotations.kt");
}
@TestMetadata("NestedAnnotation.kt")
public void testNestedAnnotation() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/NestedAnnotation.kt");
}
@TestMetadata("NestedClass.kt")
public void testNestedClass() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/annotations/classes/NestedClass.kt");