Made scope in JavaPackageFragmentDescriptor final.

This commit is contained in:
Evgeny Gerashchenko
2013-11-13 04:46:51 +04:00
parent 601cd4ce46
commit e18173cbac
2 changed files with 36 additions and 27 deletions
@@ -16,6 +16,7 @@
package org.jetbrains.jet.lang.resolve.java.descriptor; package org.jetbrains.jet.lang.resolve.java.descriptor;
import com.intellij.util.NullableFunction;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
@@ -34,15 +35,27 @@ import java.util.Collections;
public class JavaPackageFragmentDescriptor extends DeclarationDescriptorImpl implements PackageFragmentDescriptor { public class JavaPackageFragmentDescriptor extends DeclarationDescriptorImpl implements PackageFragmentDescriptor {
private final JavaPackageFragmentProvider provider; private final JavaPackageFragmentProvider provider;
private final FqName fqName; private final FqName fqName;
private JetScope memberScope; private final JetScope memberScope;
public JavaPackageFragmentDescriptor( private JavaPackageFragmentDescriptor(
@NotNull JavaPackageFragmentProvider provider, @NotNull JavaPackageFragmentProvider provider,
@NotNull FqName fqName @NotNull FqName fqName,
@NotNull NullableFunction<JavaPackageFragmentDescriptor, JetScope> scopeFactory
) { ) {
super(Collections.<AnnotationDescriptor>emptyList(), fqName.shortNameOrSpecial()); super(Collections.<AnnotationDescriptor>emptyList(), fqName.shortNameOrSpecial());
this.provider = provider; this.provider = provider;
this.fqName = fqName; this.fqName = fqName;
this.memberScope = scopeFactory.fun(this);
}
@Nullable
public static JavaPackageFragmentDescriptor create(
@NotNull JavaPackageFragmentProvider provider,
@NotNull FqName fqName,
@NotNull NullableFunction<JavaPackageFragmentDescriptor, JetScope> scopeFactory
) {
JavaPackageFragmentDescriptor descriptor = new JavaPackageFragmentDescriptor(provider, fqName, scopeFactory);
return descriptor.memberScope == null ? null : descriptor;
} }
@NotNull @NotNull
@@ -62,10 +75,6 @@ public class JavaPackageFragmentDescriptor extends DeclarationDescriptorImpl imp
return visitor.visitPackageFragmentDescriptor(this, data); return visitor.visitPackageFragmentDescriptor(this, data);
} }
public void setMemberScope(@NotNull JetScope memberScope) {
this.memberScope = memberScope;
}
@NotNull @NotNull
@Override @Override
public JetScope getMemberScope() { public JetScope getMemberScope() {
@@ -16,6 +16,8 @@
package org.jetbrains.jet.lang.resolve.java.resolver; 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 com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -45,7 +47,7 @@ import java.util.*;
public final class JavaPackageFragmentProvider implements PackageFragmentProvider { public final class JavaPackageFragmentProvider implements PackageFragmentProvider {
@NotNull @NotNull
private final Map<FqName, JetScope> packageFragments = new HashMap<FqName, JetScope>(); private final Map<FqName, JavaPackageFragmentDescriptor> packageFragments = Maps.newHashMap();
@NotNull @NotNull
private final Set<FqName> unresolvedCache = new HashSet<FqName>(); private final Set<FqName> unresolvedCache = new HashSet<FqName>();
@@ -116,34 +118,32 @@ public final class JavaPackageFragmentProvider implements PackageFragmentProvide
} }
@Nullable @Nullable
public JavaPackageFragmentDescriptor getOrCreatePackage(@NotNull FqName qualifiedName) { public JavaPackageFragmentDescriptor getOrCreatePackage(@NotNull final FqName fqName) {
// TODO 1 use one cache // TODO 1 use one cache
if (unresolvedCache.contains(qualifiedName)) { if (unresolvedCache.contains(fqName)) {
return null; return null;
} }
JetScope scope = packageFragments.get(qualifiedName); JavaPackageFragmentDescriptor packageFragment = packageFragments.get(fqName);
if (scope != null) { if (packageFragment != null) {
return (JavaPackageFragmentDescriptor) scope.getContainingDeclaration(); return packageFragment;
} }
JavaPackageFragmentDescriptor packageFragment = new JavaPackageFragmentDescriptor(this, qualifiedName); packageFragment = JavaPackageFragmentDescriptor.create(this, fqName, new NullableFunction<JavaPackageFragmentDescriptor, JetScope>() {
@Override
JetScope namespaceScope = createPackageScope(qualifiedName, packageFragment, true); @Nullable
cache(qualifiedName, namespaceScope); public JetScope fun(JavaPackageFragmentDescriptor packageFragment) {
if (namespaceScope == null) { return createPackageScope(fqName, packageFragment);
return null; }
} });
packageFragment.setMemberScope(namespaceScope);
cache(fqName, packageFragment);
return packageFragment; return packageFragment;
} }
@Nullable @Nullable
private JetScope createPackageScope( private JetScope createPackageScope(
@NotNull FqName fqName, @NotNull FqName fqName,
@NotNull PackageFragmentDescriptor packageFragment, @NotNull PackageFragmentDescriptor packageFragment
boolean record
) { ) {
JavaPackage javaPackage = javaClassFinder.findPackage(fqName); JavaPackage javaPackage = javaClassFinder.findPackage(fqName);
if (javaPackage != null) { if (javaPackage != null) {
@@ -175,12 +175,12 @@ public final class JavaPackageFragmentProvider implements PackageFragmentProvide
return !DescriptorResolverUtils.isCompiledKotlinClassOrPackageClass(javaClass) && hasStaticMembers(javaClass); return !DescriptorResolverUtils.isCompiledKotlinClassOrPackageClass(javaClass) && hasStaticMembers(javaClass);
} }
private void cache(@NotNull FqName fqName, @Nullable JetScope packageScope) { private void cache(@NotNull FqName fqName, @Nullable JavaPackageFragmentDescriptor packageFragment) {
if (packageScope == null) { if (packageFragment == null) {
unresolvedCache.add(fqName); unresolvedCache.add(fqName);
return; return;
} }
JetScope oldValue = packageFragments.put(fqName, packageScope); JavaPackageFragmentDescriptor oldValue = packageFragments.put(fqName, packageFragment);
if (oldValue != null) { if (oldValue != null) {
throw new IllegalStateException("rewrite at " + fqName); throw new IllegalStateException("rewrite at " + fqName);
} }