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) }