From cd6a71ef819e69ceacf146149ff5de1678735afc Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Fri, 7 Feb 2014 20:01:28 +0400 Subject: [PATCH] Refactor JDR: add explicit binding between java classes and packages for their statics Get rid of Kind in JavaPackageFragmentDescriptor and create subclass which exposes additional function Add method in JavaClassDescriptor to get correponding package fragment Remove JavaDescriptorResolver from context --- .../jet/codegen/state/JetTypeMapper.java | 15 +++------ .../di/InjectorForJavaDescriptorResolver.java | 9 ++--- .../di/InjectorForTopDownAnalyzerForJvm.java | 19 +++++------ .../resolve/java/JavaDescriptorResolver.java | 21 ++++-------- .../lang/resolve/java/JavaVisibilities.java | 19 ++++------- .../java/descriptor/JavaClassDescriptor.java | 3 ++ ....java => JavaPackageFragmentDescriptor.kt} | 30 +++++------------ .../lazy/LazyJavaPackageFragmentProvider.kt | 3 +- .../jet/lang/resolve/java/lazy/context.kt | 18 +++------- .../descriptors/LazyJavaClassDescriptor.kt | 4 +++ .../descriptors/LazyJavaPackageFragment.kt | 33 +++++++++++-------- .../resolver/DescriptorResolverUtils.java | 10 ------ .../jet/plugin/completion/SmartCompletion.kt | 2 +- 13 files changed, 71 insertions(+), 115 deletions(-) rename core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/{JavaPackageFragmentDescriptor.java => JavaPackageFragmentDescriptor.kt} (50%) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java index 43c6ea03348..03099cf067f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -40,7 +40,8 @@ import org.jetbrains.jet.lang.resolve.calls.util.ExpressionAsFunctionDescriptor; import org.jetbrains.jet.lang.resolve.java.AsmTypeConstants; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; -import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor; +import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor; +import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassStaticsPackageFragmentDescriptor; import org.jetbrains.jet.lang.resolve.java.mapping.KotlinToJavaTypesMap; import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe; import org.jetbrains.jet.lang.types.*; @@ -58,7 +59,6 @@ import static org.jetbrains.jet.codegen.binding.CodegenBinding.*; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isAnnotationClass; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isAnonymousObject; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE; -import static org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor.Kind.CLASS_STATICS; public class JetTypeMapper extends BindingTraceAware { @@ -122,14 +122,9 @@ public class JetTypeMapper extends BindingTraceAware { @NotNull DeclarationDescriptor descriptor, boolean insideModule ) { - if (packageFragment instanceof JavaPackageFragmentDescriptor) { - JavaPackageFragmentDescriptor javaPackageFragment = (JavaPackageFragmentDescriptor) packageFragment; - if (javaPackageFragment.getKind() == CLASS_STATICS) { - ClassDescriptor classDescriptor = - javaPackageFragment.getJavaDescriptorResolver().resolveClass(javaPackageFragment.getFqName()); - assert classDescriptor != null : "Class not found while a package fragment exists: " + packageFragment; - return mapType(classDescriptor.getDefaultType()).getInternalName(); - } + if (packageFragment instanceof JavaClassStaticsPackageFragmentDescriptor) { + JavaClassStaticsPackageFragmentDescriptor javaPackageFragment = (JavaClassStaticsPackageFragmentDescriptor) packageFragment; + return mapClass(javaPackageFragment.getCorrespondingClass()).getInternalName(); } // It's not a package created for Java class statics diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java index ab5de499dd5..16373ee0a97 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java @@ -72,12 +72,12 @@ public class InjectorForJavaDescriptorResolver { this.traceBasedErrorReporter = new TraceBasedErrorReporter(); this.psiBasedMethodSignatureChecker = new PsiBasedMethodSignatureChecker(); this.psiBasedExternalAnnotationResolver = new PsiBasedExternalAnnotationResolver(); - this.javaDescriptorResolver = new JavaDescriptorResolver(); this.virtualFileFinder = org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder.SERVICE.getInstance(project); - this.module = org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM.createJavaModule(""); this.deserializedDescriptorResolver = new DeserializedDescriptorResolver(); - this.globalJavaResolverContext = new GlobalJavaResolverContext(storageManager, getJavaClassFinder(), virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, traceBasedJavaResolverCache, getJavaDescriptorResolver()); + this.globalJavaResolverContext = new GlobalJavaResolverContext(storageManager, getJavaClassFinder(), virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, traceBasedJavaResolverCache); + this.module = org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM.createJavaModule(""); this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModule()); + this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModule()); this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(storageManager); this.javaClassFinder.setProject(project); @@ -92,9 +92,6 @@ public class InjectorForJavaDescriptorResolver { psiBasedMethodSignatureChecker.setExternalAnnotationResolver(psiBasedExternalAnnotationResolver); psiBasedMethodSignatureChecker.setExternalSignatureResolver(traceBasedExternalSignatureResolver); - this.javaDescriptorResolver.setLazyJavaPackageFragmentProvider(lazyJavaPackageFragmentProvider); - this.javaDescriptorResolver.setModule(module); - deserializedDescriptorResolver.setAnnotationDeserializer(annotationDescriptorDeserializer); deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter); deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java index 236440d6c35..34ea169d436 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java @@ -130,16 +130,19 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.topDownAnalysisParameters = topDownAnalysisParameters; this.bindingTrace = bindingTrace; this.moduleDescriptor = moduleDescriptor; - this.javaDescriptorResolver = new JavaDescriptorResolver(); - this.javaToKotlinClassMap = org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap.getInstance(); this.javaClassFinder = new JavaClassFinderImpl(); + this.virtualFileFinder = org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder.SERVICE.getInstance(project); + this.deserializedDescriptorResolver = new DeserializedDescriptorResolver(); + this.psiBasedExternalAnnotationResolver = new PsiBasedExternalAnnotationResolver(); this.traceBasedExternalSignatureResolver = new TraceBasedExternalSignatureResolver(); - this.traceBasedJavaResolverCache = new TraceBasedJavaResolverCache(); this.traceBasedErrorReporter = new TraceBasedErrorReporter(); this.psiBasedMethodSignatureChecker = new PsiBasedMethodSignatureChecker(); - this.psiBasedExternalAnnotationResolver = new PsiBasedExternalAnnotationResolver(); + this.traceBasedJavaResolverCache = new TraceBasedJavaResolverCache(); + this.globalJavaResolverContext = new GlobalJavaResolverContext(storageManager, javaClassFinder, virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, traceBasedJavaResolverCache); + this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModuleDescriptor()); + this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModuleDescriptor()); + this.javaToKotlinClassMap = org.jetbrains.jet.lang.resolve.java.mapping.JavaToKotlinClassMap.getInstance(); this.mutablePackageFragmentProvider = new MutablePackageFragmentProvider(getModuleDescriptor()); - this.virtualFileFinder = org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder.SERVICE.getInstance(project); this.declarationResolver = new DeclarationResolver(); this.annotationResolver = new AnnotationResolver(); this.callResolver = new CallResolver(); @@ -158,9 +161,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.delegatedPropertyResolver = new DelegatedPropertyResolver(); this.functionAnalyzerExtension = new FunctionAnalyzerExtension(); this.scriptBodyResolver = new ScriptBodyResolver(); - this.deserializedDescriptorResolver = new DeserializedDescriptorResolver(); - this.globalJavaResolverContext = new GlobalJavaResolverContext(storageManager, javaClassFinder, virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, traceBasedJavaResolverCache, getJavaDescriptorResolver()); - this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModuleDescriptor()); this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(storageManager); this.topDownAnalyzer.setBodyResolver(bodyResolver); @@ -199,9 +199,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.descriptorResolver.setStorageManager(storageManager); this.descriptorResolver.setTypeResolver(typeResolver); - this.javaDescriptorResolver.setLazyJavaPackageFragmentProvider(lazyJavaPackageFragmentProvider); - this.javaDescriptorResolver.setModule(moduleDescriptor); - javaClassFinder.setProject(project); traceBasedExternalSignatureResolver.setExternalAnnotationResolver(psiBasedExternalAnnotationResolver); diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 174cd6efe30..9d44efda178 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -27,14 +27,17 @@ import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolver; -import javax.inject.Inject; - public class JavaDescriptorResolver implements DependencyClassByQualifiedNameResolver { public static final Name JAVA_ROOT = Name.special(""); - private ModuleDescriptor module; + private final ModuleDescriptor module; - private LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider; + private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider; + + public JavaDescriptorResolver(@NotNull LazyJavaPackageFragmentProvider provider, @NotNull ModuleDescriptor module) { + lazyJavaPackageFragmentProvider = provider; + this.module = module; + } @NotNull public ModuleDescriptor getModule() { @@ -56,14 +59,4 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes public PackageFragmentDescriptor getPackageFragment(@NotNull FqName fqName) { return lazyJavaPackageFragmentProvider.getPackageFragment(fqName); } - - @Inject - public void setModule(@NotNull ModuleDescriptor module) { - this.module = module; - } - - @Inject - public void setLazyJavaPackageFragmentProvider(@NotNull LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider) { - this.lazyJavaPackageFragmentProvider = lazyJavaPackageFragmentProvider; - } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaVisibilities.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaVisibilities.java index 235bbe47c47..05ccf6de960 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaVisibilities.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaVisibilities.java @@ -20,7 +20,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.DescriptorUtils; -import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor; +import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassStaticsPackageFragmentDescriptor; public class JavaVisibilities { private JavaVisibilities() { @@ -67,16 +67,11 @@ public class JavaVisibilities { // protected static function or property else { DeclarationDescriptor whatDeclarationDescriptor = what.getContainingDeclaration(); - - assert whatDeclarationDescriptor instanceof JavaPackageFragmentDescriptor : "Only static declarations can have protected_static visibility"; - JavaPackageFragmentDescriptor javaPackageFragmentDescriptor = (JavaPackageFragmentDescriptor) whatDeclarationDescriptor; - - whatClass = javaPackageFragmentDescriptor.getJavaDescriptorResolver().resolveClass( - javaPackageFragmentDescriptor.getFqName()); + assert whatDeclarationDescriptor instanceof JavaClassStaticsPackageFragmentDescriptor + : "Only static declarations can have protected_static visibility"; + whatClass = ((JavaClassStaticsPackageFragmentDescriptor) whatDeclarationDescriptor).getCorrespondingClass(); } - assert whatClass != null : "Couldn't find ClassDescriptor for protected static member " + what; - if (DescriptorUtils.isSubclass(fromClass, whatClass)) { return true; } @@ -143,10 +138,8 @@ public class JavaVisibilities { @Nullable private static PackageFragmentDescriptor getPackageStaticsAware(@NotNull DeclarationDescriptor member) { PackageFragmentDescriptor packageFragment = DescriptorUtils.getParentOfType(member, PackageFragmentDescriptor.class, false); - if (packageFragment instanceof JavaPackageFragmentDescriptor - && ((JavaPackageFragmentDescriptor) packageFragment).getKind() == JavaPackageFragmentDescriptor.Kind.CLASS_STATICS) { - ClassDescriptor classForPackage = - ((JavaPackageFragmentDescriptor) packageFragment).getJavaDescriptorResolver().resolveClass(packageFragment.getFqName()); + if (packageFragment instanceof JavaClassStaticsPackageFragmentDescriptor) { + ClassDescriptor classForPackage = ((JavaClassStaticsPackageFragmentDescriptor) packageFragment).getCorrespondingClass(); return DescriptorUtils.getParentOfType(classForPackage, PackageFragmentDescriptor.class, false); } return packageFragment; diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaClassDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaClassDescriptor.java index 4b3392965ff..80a7d70d12d 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaClassDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaClassDescriptor.java @@ -23,4 +23,7 @@ import org.jetbrains.jet.lang.types.JetType; public interface JavaClassDescriptor extends ClassDescriptor { @Nullable JetType getFunctionTypeForSamInterface(); + + @Nullable + JavaClassStaticsPackageFragmentDescriptor getCorrespondingPackageFragment(); } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaPackageFragmentDescriptor.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaPackageFragmentDescriptor.kt similarity index 50% rename from core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaPackageFragmentDescriptor.java rename to core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaPackageFragmentDescriptor.kt index 10d20ed7794..ba60fca9fea 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaPackageFragmentDescriptor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/descriptor/JavaPackageFragmentDescriptor.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2013 JetBrains s.r.o. + * Copyright 2010-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,26 +14,14 @@ * limitations under the License. */ -package org.jetbrains.jet.lang.resolve.java.descriptor; +package org.jetbrains.jet.lang.resolve.java.descriptor -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor; -import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; -import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider; +import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor -public interface JavaPackageFragmentDescriptor extends PackageFragmentDescriptor { - @NotNull - @Override - JavaPackageFragmentProvider getProvider(); - - @NotNull - JavaDescriptorResolver getJavaDescriptorResolver(); - - enum Kind { - PROPER, - CLASS_STATICS, - } - - @NotNull - Kind getKind(); +public trait JavaPackageFragmentDescriptor : PackageFragmentDescriptor { + override fun getProvider(): JavaPackageFragmentProvider +} + +public trait JavaClassStaticsPackageFragmentDescriptor : JavaPackageFragmentDescriptor { + public fun getCorrespondingClass(): JavaClassDescriptor } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt index 1711e9ab2e9..e642aacad54 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/LazyJavaPackageFragmentProvider.kt @@ -29,8 +29,7 @@ public class LazyJavaPackageFragmentProvider( outerContext.externalSignatureResolver, outerContext.errorReporter, outerContext.methodSignatureChecker, - outerContext.javaResolverCache, - outerContext.javaDescriptorResolver + outerContext.javaResolverCache ) override fun getModule() = _module diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/context.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/context.kt index 868e0410780..c4cb3341eb3 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/context.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/context.kt @@ -26,12 +26,8 @@ import org.jetbrains.jet.lang.resolve.java.resolver.ExternalSignatureResolver import org.jetbrains.jet.lang.resolve.java.resolver.MethodSignatureChecker import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter import org.jetbrains.jet.lang.resolve.java.resolver.JavaResolverCache -import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver import org.jetbrains.jet.lang.resolve.kotlin.KotlinClassFinder -import org.jetbrains.jet.lang.resolve.name.FqName -import org.jetbrains.jet.lang.resolve.java.structure.JavaClass -import org.jetbrains.jet.lang.descriptors.ClassDescriptor open class GlobalJavaResolverContext( val storageManager: StorageManager, @@ -42,8 +38,7 @@ open class GlobalJavaResolverContext( val externalSignatureResolver: ExternalSignatureResolver, val errorReporter: ErrorReporter, val methodSignatureChecker: MethodSignatureChecker, - val javaResolverCache: JavaResolverCache, - val javaDescriptorResolver: JavaDescriptorResolver + val javaResolverCache: JavaResolverCache ) open class LazyJavaResolverContext( @@ -57,12 +52,10 @@ open class LazyJavaResolverContext( externalSignatureResolver: ExternalSignatureResolver, errorReporter: ErrorReporter, methodSignatureChecker: MethodSignatureChecker, - javaResolverCache: JavaResolverCache, - javaDescriptorResolver: JavaDescriptorResolver + javaResolverCache: JavaResolverCache ) : GlobalJavaResolverContext(storageManager, finder, kotlinClassFinder, deserializedDescriptorResolver, externalAnnotationResolver, externalSignatureResolver, - errorReporter, methodSignatureChecker, javaResolverCache, - javaDescriptorResolver) + errorReporter, methodSignatureChecker, javaResolverCache) fun LazyJavaResolverContext.withTypes( typeParameterResolver: TypeParameterResolver = TypeParameterResolver.EMPTY @@ -78,7 +71,6 @@ fun LazyJavaResolverContext.withTypes( errorReporter, methodSignatureChecker, javaResolverCache, - javaDescriptorResolver, LazyJavaTypeResolver(this, typeParameterResolver), typeParameterResolver) @@ -94,14 +86,12 @@ class LazyJavaResolverContextWithTypes( errorReporter: ErrorReporter, methodSignatureChecker: MethodSignatureChecker, javaResolverCache: JavaResolverCache, - javaDescriptorResolver: JavaDescriptorResolver, val typeResolver: LazyJavaTypeResolver, val typeParameterResolver: TypeParameterResolver ) : LazyJavaResolverContext(packageFragmentProvider, javaClassResolver, storageManager, finder, kotlinClassFinder, deserializedDescriptorResolver, externalAnnotationResolver, externalSignatureResolver, - errorReporter, methodSignatureChecker, javaResolverCache, - javaDescriptorResolver) + errorReporter, methodSignatureChecker, javaResolverCache) fun LazyJavaResolverContextWithTypes.child( containingDeclaration: DeclarationDescriptor, diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassDescriptor.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassDescriptor.kt index 3ef92d8309a..af874d317e1 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassDescriptor.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaClassDescriptor.kt @@ -35,6 +35,7 @@ import org.jetbrains.jet.lang.resolve.DescriptorFactory import java.util.ArrayList import org.jetbrains.jet.lang.types.checker.JetTypeChecker import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils +import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassStaticsPackageFragmentDescriptor class LazyJavaClassDescriptor( private val outerC: LazyJavaResolverContextWithTypes, @@ -110,6 +111,9 @@ class LazyJavaClassDescriptor( classObject.getBuilder().addFunctionDescriptor(valueOfMethod) } + override fun getCorrespondingPackageFragment() = + c.packageFragmentProvider.getPackageFragment(fqName) as? JavaClassStaticsPackageFragmentDescriptor + override fun getClassObjectDescriptor(): ClassDescriptor? = _classObjectDescriptor() override fun getClassObjectType(): JetType? = getClassObjectDescriptor()?.let { d -> d.getDefaultType() } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragment.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragment.kt index 885276d2e17..bf360134eb6 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragment.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/LazyJavaPackageFragment.kt @@ -13,30 +13,39 @@ import org.jetbrains.jet.lang.descriptors.impl.DeclarationDescriptorNonRootImpl import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor import org.jetbrains.jet.lang.types.TypeSubstitutor import org.jetbrains.jet.lang.resolve.java.descriptor.JavaPackageFragmentDescriptor -import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver import org.jetbrains.jet.lang.descriptors.PackageFragmentProvider import org.jetbrains.jet.lang.descriptors.annotations.Annotations +import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassStaticsPackageFragmentDescriptor +import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor -fun LazyPackageFragmentForJavaPackage( +class LazyPackageFragmentForJavaPackage( c: LazyJavaResolverContext, containingDeclaration: ModuleDescriptor, jPackage: JavaPackage -) = LazyJavaPackageFragment(c, containingDeclaration, JavaPackageFragmentDescriptor.Kind.PROPER, jPackage.getFqName(), +) : LazyJavaPackageFragment(c, containingDeclaration, jPackage.getFqName(), { LazyPackageFragmentScopeForJavaPackage(c, jPackage, this) }) -fun LazyPackageFragmentForJavaClass( +class LazyPackageFragmentForJavaClass( c: LazyJavaResolverContext, containingDeclaration: ModuleDescriptor, - jClass: JavaClass -) = LazyJavaPackageFragment(c, containingDeclaration, JavaPackageFragmentDescriptor.Kind.CLASS_STATICS, + private val jClass: JavaClass +) : JavaClassStaticsPackageFragmentDescriptor, + LazyJavaPackageFragment(c, containingDeclaration, jClass.getFqName().sure("Attempt to build a package of an anonymous/local class: $jClass"), - { LazyPackageFragmentScopeForJavaClass(c, jClass, this) }) + { LazyPackageFragmentScopeForJavaClass(c, jClass, this) }) { + override fun getCorrespondingClass(): JavaClassDescriptor { + val classDescriptor = c.javaClassResolver.resolveClass(jClass) + if (classDescriptor !is JavaClassDescriptor) { + throw AssertionError("Corresponding class not found for package with static members: $this") + } + return classDescriptor + } +} -class LazyJavaPackageFragment( - private val c: LazyJavaResolverContext, +abstract class LazyJavaPackageFragment( + protected val c: LazyJavaResolverContext, containingDeclaration: ModuleDescriptor, - val _kind: JavaPackageFragmentDescriptor.Kind, - val _fqName: FqName, + private val _fqName: FqName, createMemberScope: LazyJavaPackageFragment.() -> LazyJavaPackageFragmentScope ) : DeclarationDescriptorNonRootImpl(containingDeclaration, Annotations.EMPTY, _fqName.shortNameOrSpecial()), JavaPackageFragmentDescriptor, LazyJavaDescriptor @@ -44,9 +53,7 @@ class LazyJavaPackageFragment( private val _memberScope = createMemberScope() override fun getMemberScope(): LazyJavaPackageFragmentScope = _memberScope - override fun getKind() = _kind override fun getFqName() = _fqName - override fun getJavaDescriptorResolver() = c.javaDescriptorResolver override fun getProvider() = c.packageFragmentProvider override fun accept(visitor: DeclarationDescriptorVisitor, data: D) = visitor.visitPackageFragmentDescriptor(this, data) as R diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java index 867c8ecb7bd..6a4e8186855 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/DescriptorResolverUtils.java @@ -267,16 +267,6 @@ public final class DescriptorResolverUtils { return TypeSubstitutor.create(typeSubstitutionContext); } - @Nullable - public static JavaPackageFragmentDescriptor getPackageForCorrespondingJavaClass(@NotNull JavaClassDescriptor javaClass) { - PackageFragmentDescriptor packageFragment = DescriptorUtils.getParentOfType(javaClass, PackageFragmentDescriptor.class); - assert packageFragment instanceof JavaPackageFragmentDescriptor : - "java class " + javaClass + " is under non-java fragment: " + packageFragment; - - JavaPackageFragmentProvider provider = ((JavaPackageFragmentDescriptor) packageFragment).getProvider(); - return provider.getPackageFragment(getFqNameSafe(javaClass)); - } - public static boolean isJavaClassVisibleAsPackage(@NotNull JavaClass javaClass) { return !isCompiledKotlinClassOrPackageClass(javaClass) && hasStaticMembers(javaClass); } diff --git a/idea/src/org/jetbrains/jet/plugin/completion/SmartCompletion.kt b/idea/src/org/jetbrains/jet/plugin/completion/SmartCompletion.kt index bce2df51b4d..0c0c58a7cc4 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/SmartCompletion.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/SmartCompletion.kt @@ -313,7 +313,7 @@ private fun staticMembers(context: JetExpression, expectedType: JetType, resolve } if (classDescriptor is JavaClassDescriptor) { - val pseudoPackage = DescriptorResolverUtils.getPackageForCorrespondingJavaClass(classDescriptor) + val pseudoPackage = classDescriptor.getCorrespondingPackageFragment() if (pseudoPackage != null) { pseudoPackage.getMemberScope().getAllDescriptors().filterTo(descriptors, isSuitableCallable) }