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;
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<JavaPackageFragmentDescriptor, JetScope> scopeFactory
) {
super(Collections.<AnnotationDescriptor>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<JavaPackageFragmentDescriptor, JetScope> 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() {
@@ -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<FqName, JetScope> packageFragments = new HashMap<FqName, JetScope>();
private final Map<FqName, JavaPackageFragmentDescriptor> packageFragments = Maps.newHashMap();
@NotNull
private final Set<FqName> unresolvedCache = new HashSet<FqName>();
@@ -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<JavaPackageFragmentDescriptor, JetScope>() {
@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);
}