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 0ad64750421..f35fc7255c5 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java @@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedMethodSignatureCheck import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedExternalAnnotationResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileKotlinClassFinder; +import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProviderImpl; import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder; import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl; import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationResolver; @@ -33,13 +34,12 @@ import org.jetbrains.jet.lang.resolve.java.resolver.JavaAnnotationArgumentResolv import org.jetbrains.jet.lang.resolve.java.resolver.JavaClassResolver; import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver; import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorDeserializer; -import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider; -import org.jetbrains.jet.lang.resolve.java.resolver.JavaMemberResolver; -import org.jetbrains.jet.lang.resolve.java.resolver.JavaConstructorResolver; -import org.jetbrains.jet.lang.resolve.java.resolver.JavaTypeTransformer; -import org.jetbrains.jet.lang.resolve.java.resolver.JavaValueParameterResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaFunctionResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaTypeParameterResolver; +import org.jetbrains.jet.lang.resolve.java.resolver.JavaTypeTransformer; +import org.jetbrains.jet.lang.resolve.java.resolver.JavaValueParameterResolver; +import org.jetbrains.jet.lang.resolve.java.resolver.JavaMemberResolver; +import org.jetbrains.jet.lang.resolve.java.resolver.JavaConstructorResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaPropertyResolver; import org.jetbrains.jet.lang.resolve.java.resolver.JavaSupertypeResolver; import org.jetbrains.annotations.NotNull; @@ -58,6 +58,7 @@ public class InjectorForJavaDescriptorResolver { private final PsiBasedExternalAnnotationResolver psiBasedExternalAnnotationResolver; private final JavaDescriptorResolver javaDescriptorResolver; private final VirtualFileKotlinClassFinder virtualFileKotlinClassFinder; + private final JavaPackageFragmentProviderImpl javaPackageFragmentProvider; private final VirtualFileFinder virtualFileFinder; private final ModuleDescriptorImpl module; private final JavaAnnotationResolver javaAnnotationResolver; @@ -65,13 +66,12 @@ public class InjectorForJavaDescriptorResolver { private final JavaClassResolver javaClassResolver; private final DeserializedDescriptorResolver deserializedDescriptorResolver; private final AnnotationDescriptorDeserializer annotationDescriptorDeserializer; - private final JavaPackageFragmentProvider javaPackageFragmentProvider; - private final JavaMemberResolver javaMemberResolver; - private final JavaConstructorResolver javaConstructorResolver; - private final JavaTypeTransformer javaTypeTransformer; - private final JavaValueParameterResolver javaValueParameterResolver; private final JavaFunctionResolver javaFunctionResolver; private final JavaTypeParameterResolver javaTypeParameterResolver; + private final JavaTypeTransformer javaTypeTransformer; + private final JavaValueParameterResolver javaValueParameterResolver; + private final JavaMemberResolver javaMemberResolver; + private final JavaConstructorResolver javaConstructorResolver; private final JavaPropertyResolver javaPropertyResolver; private final JavaSupertypeResolver javaSupertypeResolver; @@ -89,6 +89,7 @@ public class InjectorForJavaDescriptorResolver { this.psiBasedExternalAnnotationResolver = new PsiBasedExternalAnnotationResolver(); this.javaDescriptorResolver = new JavaDescriptorResolver(); this.virtualFileKotlinClassFinder = new VirtualFileKotlinClassFinder(); + this.javaPackageFragmentProvider = new JavaPackageFragmentProviderImpl(); this.virtualFileFinder = com.intellij.openapi.components.ServiceManager.getService(project, VirtualFileFinder.class); this.module = org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM.createJavaModule(""); this.javaAnnotationResolver = new JavaAnnotationResolver(); @@ -96,13 +97,12 @@ public class InjectorForJavaDescriptorResolver { this.javaClassResolver = new JavaClassResolver(); this.deserializedDescriptorResolver = new DeserializedDescriptorResolver(); this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(); - this.javaPackageFragmentProvider = new JavaPackageFragmentProvider(); - this.javaMemberResolver = new JavaMemberResolver(); - this.javaConstructorResolver = new JavaConstructorResolver(); - this.javaTypeTransformer = new JavaTypeTransformer(); - this.javaValueParameterResolver = new JavaValueParameterResolver(); this.javaFunctionResolver = new JavaFunctionResolver(); this.javaTypeParameterResolver = new JavaTypeParameterResolver(); + this.javaTypeTransformer = new JavaTypeTransformer(); + this.javaValueParameterResolver = new JavaValueParameterResolver(); + this.javaMemberResolver = new JavaMemberResolver(); + this.javaConstructorResolver = new JavaConstructorResolver(); this.javaPropertyResolver = new JavaPropertyResolver(); this.javaSupertypeResolver = new JavaSupertypeResolver(); @@ -123,6 +123,14 @@ public class InjectorForJavaDescriptorResolver { virtualFileKotlinClassFinder.setVirtualFileFinder(virtualFileFinder); + javaPackageFragmentProvider.setCache(traceBasedJavaResolverCache); + javaPackageFragmentProvider.setDeserializedDescriptorResolver(deserializedDescriptorResolver); + javaPackageFragmentProvider.setJavaClassFinder(javaClassFinder); + javaPackageFragmentProvider.setJavaDescriptorResolver(javaDescriptorResolver); + javaPackageFragmentProvider.setKotlinClassFinder(virtualFileKotlinClassFinder); + javaPackageFragmentProvider.setMemberResolver(javaMemberResolver); + javaPackageFragmentProvider.setModule(module); + javaAnnotationResolver.setArgumentResolver(javaAnnotationArgumentResolver); javaAnnotationResolver.setClassResolver(javaClassResolver); javaAnnotationResolver.setExternalAnnotationResolver(psiBasedExternalAnnotationResolver); @@ -151,29 +159,6 @@ public class InjectorForJavaDescriptorResolver { annotationDescriptorDeserializer.setJavaClassResolver(javaClassResolver); annotationDescriptorDeserializer.setKotlinClassFinder(virtualFileKotlinClassFinder); - javaPackageFragmentProvider.setCache(traceBasedJavaResolverCache); - javaPackageFragmentProvider.setDeserializedDescriptorResolver(deserializedDescriptorResolver); - javaPackageFragmentProvider.setJavaClassFinder(javaClassFinder); - javaPackageFragmentProvider.setJavaDescriptorResolver(javaDescriptorResolver); - javaPackageFragmentProvider.setKotlinClassFinder(virtualFileKotlinClassFinder); - javaPackageFragmentProvider.setMemberResolver(javaMemberResolver); - javaPackageFragmentProvider.setModule(module); - - javaMemberResolver.setClassResolver(javaClassResolver); - javaMemberResolver.setConstructorResolver(javaConstructorResolver); - javaMemberResolver.setFunctionResolver(javaFunctionResolver); - javaMemberResolver.setPropertyResolver(javaPropertyResolver); - - javaConstructorResolver.setCache(traceBasedJavaResolverCache); - javaConstructorResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver); - javaConstructorResolver.setTypeTransformer(javaTypeTransformer); - javaConstructorResolver.setValueParameterResolver(javaValueParameterResolver); - - javaTypeTransformer.setClassResolver(javaClassResolver); - - javaValueParameterResolver.setAnnotationResolver(javaAnnotationResolver); - javaValueParameterResolver.setTypeTransformer(javaTypeTransformer); - javaFunctionResolver.setAnnotationResolver(javaAnnotationResolver); javaFunctionResolver.setCache(traceBasedJavaResolverCache); javaFunctionResolver.setErrorReporter(traceBasedErrorReporter); @@ -185,6 +170,21 @@ public class InjectorForJavaDescriptorResolver { javaTypeParameterResolver.setTypeTransformer(javaTypeTransformer); + javaTypeTransformer.setClassResolver(javaClassResolver); + + javaValueParameterResolver.setAnnotationResolver(javaAnnotationResolver); + javaValueParameterResolver.setTypeTransformer(javaTypeTransformer); + + javaMemberResolver.setClassResolver(javaClassResolver); + javaMemberResolver.setConstructorResolver(javaConstructorResolver); + javaMemberResolver.setFunctionResolver(javaFunctionResolver); + javaMemberResolver.setPropertyResolver(javaPropertyResolver); + + javaConstructorResolver.setCache(traceBasedJavaResolverCache); + javaConstructorResolver.setExternalSignatureResolver(traceBasedExternalSignatureResolver); + javaConstructorResolver.setTypeTransformer(javaTypeTransformer); + javaConstructorResolver.setValueParameterResolver(javaValueParameterResolver); + javaPropertyResolver.setAnnotationResolver(javaAnnotationResolver); javaPropertyResolver.setCache(traceBasedJavaResolverCache); javaPropertyResolver.setErrorReporter(traceBasedErrorReporter); 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 c52758bad11..cc513ea2cd3 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java @@ -38,7 +38,7 @@ import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedExternalAnnotationRe import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileKotlinClassFinder; import org.jetbrains.jet.lang.resolve.MutablePackageFragmentProvider; import org.jetbrains.jet.lang.resolve.NamespaceFactoryImpl; -import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider; +import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProviderImpl; import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder; import org.jetbrains.jet.lang.resolve.DeclarationResolver; import org.jetbrains.jet.lang.resolve.AnnotationResolver; @@ -99,7 +99,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly private final VirtualFileKotlinClassFinder virtualFileKotlinClassFinder; private final MutablePackageFragmentProvider mutablePackageFragmentProvider; private final NamespaceFactoryImpl namespaceFactory; - private final JavaPackageFragmentProvider javaPackageFragmentProvider; + private final JavaPackageFragmentProviderImpl javaPackageFragmentProvider; private final VirtualFileFinder virtualFileFinder; private final DeclarationResolver declarationResolver; private final AnnotationResolver annotationResolver; @@ -161,7 +161,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly this.virtualFileKotlinClassFinder = new VirtualFileKotlinClassFinder(); this.mutablePackageFragmentProvider = new MutablePackageFragmentProvider(getModuleDescriptor()); this.namespaceFactory = new NamespaceFactoryImpl(); - this.javaPackageFragmentProvider = new JavaPackageFragmentProvider(); + this.javaPackageFragmentProvider = new JavaPackageFragmentProviderImpl(); this.virtualFileFinder = com.intellij.openapi.components.ServiceManager.getService(project, VirtualFileFinder.class); this.declarationResolver = new DeclarationResolver(); this.annotationResolver = new AnnotationResolver(); @@ -441,7 +441,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly return this.moduleDescriptor; } - public JavaPackageFragmentProvider getJavaPackageFragmentProvider() { + public JavaPackageFragmentProviderImpl getJavaPackageFragmentProvider() { return this.javaPackageFragmentProvider; } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPackageFragmentProvider.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPackageFragmentProvider.java index 0a1ea8e30c3..d24176441bf 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPackageFragmentProvider.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPackageFragmentProvider.java @@ -16,176 +16,27 @@ package org.jetbrains.jet.lang.resolve.java.resolver; -import com.google.common.collect.Maps; -import com.intellij.util.NullableFunction; -import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; -import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor; import org.jetbrains.jet.lang.descriptors.PackageFragmentProvider; -import org.jetbrains.jet.lang.resolve.java.JavaClassFinder; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; -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.JavaPackageFragmentDescriptorImpl; -import org.jetbrains.jet.lang.resolve.java.scope.JavaClassStaticMembersScope; -import org.jetbrains.jet.lang.resolve.java.scope.JavaFullPackageScope; -import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageFragmentScope; -import org.jetbrains.jet.lang.resolve.java.scope.JavaPurePackageScope; -import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; -import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage; -import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver; -import org.jetbrains.jet.lang.resolve.kotlin.KotlinClassFinder; -import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.lang.resolve.scopes.JetScope; -import javax.inject.Inject; -import java.util.*; +import java.util.Collection; -public final class JavaPackageFragmentProvider implements PackageFragmentProvider { +public interface JavaPackageFragmentProvider extends PackageFragmentProvider { @NotNull - private final Map packageFragments = Maps.newHashMap(); - - private JavaDescriptorResolver javaDescriptorResolver; - private JavaClassFinder javaClassFinder; - private JavaResolverCache cache; - private JavaMemberResolver memberResolver; - - private DeserializedDescriptorResolver deserializedDescriptorResolver; - private KotlinClassFinder kotlinClassFinder; - - private ModuleDescriptor module; - - @Inject - public void setJavaDescriptorResolver(@NotNull JavaDescriptorResolver javaDescriptorResolver) { - this.javaDescriptorResolver = javaDescriptorResolver; - } - - @Inject - public void setKotlinClassFinder(KotlinClassFinder kotlinClassFinder) { - this.kotlinClassFinder = kotlinClassFinder; - } - - @Inject - public void setJavaClassFinder(JavaClassFinder javaClassFinder) { - this.javaClassFinder = javaClassFinder; - } - - @Inject - public void setCache(JavaResolverCache cache) { - this.cache = cache; - } - - @Inject - public void setMemberResolver(@NotNull JavaMemberResolver memberResolver) { - this.memberResolver = memberResolver; - } - - @Inject - public void setDeserializedDescriptorResolver(DeserializedDescriptorResolver deserializedDescriptorResolver) { - this.deserializedDescriptorResolver = deserializedDescriptorResolver; - } - - @Inject - public void setModule(ModuleDescriptor module) { - this.module = module; - } - - @NotNull - public JavaDescriptorResolver getJavaDescriptorResolver() { - return javaDescriptorResolver; - } - - @NotNull - @Override - public List getPackageFragments(@NotNull FqName fqName) { - return ContainerUtil.createMaybeSingletonList(getOrCreatePackage(fqName)); - } - - @NotNull - @Override - public Collection getSubPackagesOf(@NotNull FqName fqName) { - JavaPackageFragmentDescriptorImpl packageFragment = getOrCreatePackage(fqName); - if (packageFragment == null) { - return Collections.emptyList(); - } - - return packageFragment.getMemberScope().getSubPackages(); - } + JavaDescriptorResolver getJavaDescriptorResolver(); @Nullable - public JavaPackageFragmentDescriptorImpl getOrCreatePackage(@NotNull final FqName fqName) { - if (packageFragments.containsKey(fqName)) { - return packageFragments.get(fqName); - } - - JavaPackageFragmentDescriptorImpl packageFragment = JavaPackageFragmentDescriptorImpl.create( - this, fqName, new NullableFunction() { - @Override - @Nullable - public JavaPackageFragmentScope fun(JavaPackageFragmentDescriptor packageFragment) { - return createPackageScope(fqName, packageFragment); - } - }); - - packageFragments.put(fqName, packageFragment); - return packageFragment; - } - - @Nullable - private JavaPackageFragmentScope createPackageScope( - @NotNull FqName fqName, - @NotNull PackageFragmentDescriptor packageFragment - ) { - JavaPackage javaPackage = javaClassFinder.findPackage(fqName); - if (javaPackage != null) { - FqName packageClassFqName = PackageClassUtils.getPackageClassFqName(fqName); - KotlinJvmBinaryClass kotlinClass = kotlinClassFinder.find(packageClassFqName); - - cache.recordProperPackage(packageFragment); - - if (kotlinClass != null) { - JetScope kotlinPackageScope = deserializedDescriptorResolver.createKotlinPackageScope(packageFragment, kotlinClass); - if (kotlinPackageScope != null) { - return new JavaFullPackageScope(packageFragment, kotlinPackageScope, - new JavaPurePackageScope(packageFragment, javaPackage, fqName, memberResolver, - /* includeCompiledKotlinClasses = */ false)); - } - } - - return new JavaPurePackageScope(packageFragment, javaPackage, fqName, memberResolver, - /* includeCompiledKotlinClasses = */ true); - } - - JavaClass javaClass = javaClassFinder.findClass(fqName); - if (javaClass != null && DescriptorResolverUtils.isJavaClassVisibleAsPackage(javaClass)) { - cache.recordClassStaticMembersNamespace(packageFragment); - return new JavaClassStaticMembersScope(packageFragment, javaClass, memberResolver); - } - return null; - } + JavaPackageFragmentDescriptorImpl getOrCreatePackage(@NotNull FqName fqName); @NotNull - public Collection getClassNamesInPackage(@NotNull FqName packageName) { - JavaPackage javaPackage = javaClassFinder.findPackage(packageName); - if (javaPackage == null) return Collections.emptyList(); - - Collection classes = DescriptorResolverUtils.getClassesInPackage(javaPackage); - List result = new ArrayList(classes.size()); - for (JavaClass javaClass : classes) { - if (!DescriptorResolverUtils.isCompiledKotlinPackageClass(javaClass)) { - result.add(javaClass.getName()); - } - } - - return result; - } + Collection getClassNamesInPackage(@NotNull FqName packageName); @NotNull - public ModuleDescriptor getModule() { - return module; - } + ModuleDescriptor getModule(); } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPackageFragmentProviderImpl.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPackageFragmentProviderImpl.java new file mode 100644 index 00000000000..cc95141503f --- /dev/null +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPackageFragmentProviderImpl.java @@ -0,0 +1,194 @@ +/* + * Copyright 2010-2013 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.resolve.java.resolver; + +import com.google.common.collect.Maps; +import com.intellij.util.NullableFunction; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; +import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor; +import org.jetbrains.jet.lang.resolve.java.JavaClassFinder; +import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; +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.JavaPackageFragmentDescriptorImpl; +import org.jetbrains.jet.lang.resolve.java.scope.JavaClassStaticMembersScope; +import org.jetbrains.jet.lang.resolve.java.scope.JavaFullPackageScope; +import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageFragmentScope; +import org.jetbrains.jet.lang.resolve.java.scope.JavaPurePackageScope; +import org.jetbrains.jet.lang.resolve.java.structure.JavaClass; +import org.jetbrains.jet.lang.resolve.java.structure.JavaPackage; +import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver; +import org.jetbrains.jet.lang.resolve.kotlin.KotlinClassFinder; +import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass; +import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lang.resolve.name.Name; +import org.jetbrains.jet.lang.resolve.scopes.JetScope; + +import javax.inject.Inject; +import java.util.*; + +public final class JavaPackageFragmentProviderImpl implements JavaPackageFragmentProvider { + @NotNull + private final Map packageFragments = Maps.newHashMap(); + + private JavaDescriptorResolver javaDescriptorResolver; + private JavaClassFinder javaClassFinder; + private JavaResolverCache cache; + private JavaMemberResolver memberResolver; + + private DeserializedDescriptorResolver deserializedDescriptorResolver; + private KotlinClassFinder kotlinClassFinder; + + private ModuleDescriptor module; + + @Inject + public void setJavaDescriptorResolver(@NotNull JavaDescriptorResolver javaDescriptorResolver) { + this.javaDescriptorResolver = javaDescriptorResolver; + } + + @Inject + public void setKotlinClassFinder(KotlinClassFinder kotlinClassFinder) { + this.kotlinClassFinder = kotlinClassFinder; + } + + @Inject + public void setJavaClassFinder(JavaClassFinder javaClassFinder) { + this.javaClassFinder = javaClassFinder; + } + + @Inject + public void setCache(JavaResolverCache cache) { + this.cache = cache; + } + + @Inject + public void setMemberResolver(@NotNull JavaMemberResolver memberResolver) { + this.memberResolver = memberResolver; + } + + @Inject + public void setDeserializedDescriptorResolver(DeserializedDescriptorResolver deserializedDescriptorResolver) { + this.deserializedDescriptorResolver = deserializedDescriptorResolver; + } + + @Inject + public void setModule(ModuleDescriptor module) { + this.module = module; + } + + @Override + @NotNull + public JavaDescriptorResolver getJavaDescriptorResolver() { + return javaDescriptorResolver; + } + + @NotNull + @Override + public List getPackageFragments(@NotNull FqName fqName) { + return ContainerUtil.createMaybeSingletonList(getOrCreatePackage(fqName)); + } + + @NotNull + @Override + public Collection getSubPackagesOf(@NotNull FqName fqName) { + JavaPackageFragmentDescriptorImpl packageFragment = getOrCreatePackage(fqName); + if (packageFragment == null) { + return Collections.emptyList(); + } + + return packageFragment.getMemberScope().getSubPackages(); + } + + @Override + @Nullable + public JavaPackageFragmentDescriptorImpl getOrCreatePackage(@NotNull final FqName fqName) { + if (packageFragments.containsKey(fqName)) { + return packageFragments.get(fqName); + } + + JavaPackageFragmentDescriptorImpl packageFragment = JavaPackageFragmentDescriptorImpl.create( + this, fqName, new NullableFunction() { + @Override + @Nullable + public JavaPackageFragmentScope fun(JavaPackageFragmentDescriptor packageFragment) { + return createPackageScope(fqName, packageFragment); + } + }); + + packageFragments.put(fqName, packageFragment); + return packageFragment; + } + + @Nullable + private JavaPackageFragmentScope createPackageScope( + @NotNull FqName fqName, + @NotNull PackageFragmentDescriptor packageFragment + ) { + JavaPackage javaPackage = javaClassFinder.findPackage(fqName); + if (javaPackage != null) { + FqName packageClassFqName = PackageClassUtils.getPackageClassFqName(fqName); + KotlinJvmBinaryClass kotlinClass = kotlinClassFinder.find(packageClassFqName); + + cache.recordProperPackage(packageFragment); + + if (kotlinClass != null) { + JetScope kotlinPackageScope = deserializedDescriptorResolver.createKotlinPackageScope(packageFragment, kotlinClass); + if (kotlinPackageScope != null) { + return new JavaFullPackageScope(packageFragment, kotlinPackageScope, + new JavaPurePackageScope(packageFragment, javaPackage, fqName, memberResolver, + /* includeCompiledKotlinClasses = */ false)); + } + } + + return new JavaPurePackageScope(packageFragment, javaPackage, fqName, memberResolver, + /* includeCompiledKotlinClasses = */ true); + } + + JavaClass javaClass = javaClassFinder.findClass(fqName); + if (javaClass != null && DescriptorResolverUtils.isJavaClassVisibleAsPackage(javaClass)) { + cache.recordClassStaticMembersNamespace(packageFragment); + return new JavaClassStaticMembersScope(packageFragment, javaClass, memberResolver); + } + return null; + } + + @Override + @NotNull + public Collection getClassNamesInPackage(@NotNull FqName packageName) { + JavaPackage javaPackage = javaClassFinder.findPackage(packageName); + if (javaPackage == null) return Collections.emptyList(); + + Collection classes = DescriptorResolverUtils.getClassesInPackage(javaPackage); + List result = new ArrayList(classes.size()); + for (JavaClass javaClass : classes) { + if (!DescriptorResolverUtils.isCompiledKotlinPackageClass(javaClass)) { + result.add(javaClass.getName()); + } + } + + return result; + } + + @Override + @NotNull + public ModuleDescriptor getModule() { + return module; + } +} diff --git a/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.java b/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.java index fca25ef5df0..9aabbf10aa9 100644 --- a/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.java +++ b/generators/src/org/jetbrains/jet/generators/injectors/GenerateInjectors.java @@ -135,7 +135,7 @@ public class GenerateInjectors { generator.addField(VirtualFileKotlinClassFinder.class); generator.addField(MutablePackageFragmentProvider.class); generator.addField(NamespaceFactoryImpl.class); - generator.addPublicField(JavaPackageFragmentProvider.class); + generator.addPublicField(JavaPackageFragmentProviderImpl.class); generator.addField(false, VirtualFileFinder.class, "virtualFileFinder", new GivenExpression( "com.intellij.openapi.components.ServiceManager.getService(project, VirtualFileFinder.class)")); @@ -160,6 +160,7 @@ public class GenerateInjectors { generator.addField(PsiBasedExternalAnnotationResolver.class); generator.addPublicField(JavaDescriptorResolver.class); generator.addField(VirtualFileKotlinClassFinder.class); + generator.addField(JavaPackageFragmentProviderImpl.class); generator.addField(false, VirtualFileFinder.class, "virtualFileFinder", new GivenExpression("com.intellij.openapi.components.ServiceManager.getService(project, VirtualFileFinder.class)")); generator.addField(true, ModuleDescriptorImpl.class, "module",