From e18173cbaca8d27c9ce052f60dd77e3a09a8d365 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 13 Nov 2013 04:46:51 +0400 Subject: [PATCH] Made scope in JavaPackageFragmentDescriptor final. --- .../JavaPackageFragmentDescriptor.java | 23 +++++++---- .../resolver/JavaPackageFragmentProvider.java | 40 +++++++++---------- 2 files changed, 36 insertions(+), 27 deletions(-) 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.java index 3b151f27ec6..b96a28b25fd 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.java @@ -16,6 +16,7 @@ package org.jetbrains.jet.lang.resolve.java.descriptor; +import com.intellij.util.NullableFunction; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; @@ -34,15 +35,27 @@ import java.util.Collections; public class JavaPackageFragmentDescriptor extends DeclarationDescriptorImpl implements PackageFragmentDescriptor { private final JavaPackageFragmentProvider provider; private final FqName fqName; - private JetScope memberScope; + private final JetScope memberScope; - public JavaPackageFragmentDescriptor( + private JavaPackageFragmentDescriptor( @NotNull JavaPackageFragmentProvider provider, - @NotNull FqName fqName + @NotNull FqName fqName, + @NotNull NullableFunction scopeFactory ) { super(Collections.emptyList(), fqName.shortNameOrSpecial()); this.provider = provider; this.fqName = fqName; + this.memberScope = scopeFactory.fun(this); + } + + @Nullable + public static JavaPackageFragmentDescriptor create( + @NotNull JavaPackageFragmentProvider provider, + @NotNull FqName fqName, + @NotNull NullableFunction scopeFactory + ) { + JavaPackageFragmentDescriptor descriptor = new JavaPackageFragmentDescriptor(provider, fqName, scopeFactory); + return descriptor.memberScope == null ? null : descriptor; } @NotNull @@ -62,10 +75,6 @@ public class JavaPackageFragmentDescriptor extends DeclarationDescriptorImpl imp return visitor.visitPackageFragmentDescriptor(this, data); } - public void setMemberScope(@NotNull JetScope memberScope) { - this.memberScope = memberScope; - } - @NotNull @Override public JetScope getMemberScope() { 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 ec9757c5d05..9f79de14b0d 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,6 +16,8 @@ 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; @@ -45,7 +47,7 @@ import java.util.*; public final class JavaPackageFragmentProvider implements PackageFragmentProvider { @NotNull - private final Map packageFragments = new HashMap(); + private final Map packageFragments = Maps.newHashMap(); @NotNull private final Set unresolvedCache = new HashSet(); @@ -116,34 +118,32 @@ public final class JavaPackageFragmentProvider implements PackageFragmentProvide } @Nullable - public JavaPackageFragmentDescriptor getOrCreatePackage(@NotNull FqName qualifiedName) { + public JavaPackageFragmentDescriptor getOrCreatePackage(@NotNull final FqName fqName) { // TODO 1 use one cache - if (unresolvedCache.contains(qualifiedName)) { + if (unresolvedCache.contains(fqName)) { return null; } - JetScope scope = packageFragments.get(qualifiedName); - if (scope != null) { - return (JavaPackageFragmentDescriptor) scope.getContainingDeclaration(); + JavaPackageFragmentDescriptor packageFragment = packageFragments.get(fqName); + if (packageFragment != null) { + return packageFragment; } - JavaPackageFragmentDescriptor packageFragment = new JavaPackageFragmentDescriptor(this, qualifiedName); - - JetScope namespaceScope = createPackageScope(qualifiedName, packageFragment, true); - cache(qualifiedName, namespaceScope); - if (namespaceScope == null) { - return null; - } - - packageFragment.setMemberScope(namespaceScope); + packageFragment = JavaPackageFragmentDescriptor.create(this, fqName, new NullableFunction() { + @Override + @Nullable + public JetScope fun(JavaPackageFragmentDescriptor packageFragment) { + return createPackageScope(fqName, packageFragment); + } + }); + cache(fqName, packageFragment); return packageFragment; } @Nullable private JetScope createPackageScope( @NotNull FqName fqName, - @NotNull PackageFragmentDescriptor packageFragment, - boolean record + @NotNull PackageFragmentDescriptor packageFragment ) { JavaPackage javaPackage = javaClassFinder.findPackage(fqName); if (javaPackage != null) { @@ -175,12 +175,12 @@ public final class JavaPackageFragmentProvider implements PackageFragmentProvide return !DescriptorResolverUtils.isCompiledKotlinClassOrPackageClass(javaClass) && hasStaticMembers(javaClass); } - private void cache(@NotNull FqName fqName, @Nullable JetScope packageScope) { - if (packageScope == null) { + private void cache(@NotNull FqName fqName, @Nullable JavaPackageFragmentDescriptor packageFragment) { + if (packageFragment == null) { unresolvedCache.add(fqName); return; } - JetScope oldValue = packageFragments.put(fqName, packageScope); + JavaPackageFragmentDescriptor oldValue = packageFragments.put(fqName, packageFragment); if (oldValue != null) { throw new IllegalStateException("rewrite at " + fqName); }