Made scope in JavaPackageFragmentDescriptor final.
This commit is contained in:
+16
-7
@@ -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() {
|
||||
|
||||
+20
-20
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user