properly cache JavaPackageScope

This commit is contained in:
Stepan Koltsov
2012-04-07 23:16:48 +04:00
parent 92ae9698e3
commit b9d0363d57
2 changed files with 52 additions and 18 deletions
@@ -85,7 +85,7 @@ public class JavaBridgeConfiguration implements ModuleConfiguration {
@Override
public void extendNamespaceScope(@NotNull BindingTrace trace, @NotNull NamespaceDescriptor namespaceDescriptor, @NotNull WritableScope namespaceMemberScope) {
JetScope javaPackageScope = javaSemanticServices.getDescriptorResolver().createJavaPackageScope(DescriptorUtils.getFQName(namespaceDescriptor).toSafe(), namespaceDescriptor);
JetScope javaPackageScope = javaSemanticServices.getDescriptorResolver().getJavaPackageScope(DescriptorUtils.getFQName(namespaceDescriptor).toSafe(), namespaceDescriptor);
if (javaPackageScope != null) {
namespaceMemberScope.importScope(javaPackageScope);
}
@@ -184,7 +184,8 @@ public class JavaDescriptorResolver {
/** Either package or class with static members */
private static class ResolverNamespaceData extends ResolverScopeData {
private JavaNamespaceDescriptor namespaceDescriptor;
private NamespaceDescriptor namespaceDescriptor;
private JavaPackageScope memberScope;
@NotNull
public NamespaceDescriptor getNamespaceDescriptor() {
@@ -805,8 +806,7 @@ public class JavaDescriptorResolver {
FqName fqName = new FqName(psiPackage.getQualifiedName());
ResolverNamespaceData namespaceData = namespaceDescriptorCacheByFqn.get(fqName);
if (namespaceData == null) {
namespaceData = createJavaNamespaceDescriptor(psiPackage);
namespaceDescriptorCacheByFqn.put(fqName, namespaceData);
return createJavaNamespaceDescriptor(psiPackage);
}
return namespaceData.namespaceDescriptor;
}
@@ -821,33 +821,66 @@ public class JavaDescriptorResolver {
return namespaceData.namespaceDescriptor;
}
private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull PsiPackage psiPackage) {
ResolverNamespaceData namespaceData = new ResolverNamespaceData();
private JavaNamespaceDescriptor createJavaNamespaceDescriptor(@NotNull PsiPackage psiPackage) {
FqName fqName = new FqName(psiPackage.getQualifiedName());
String name = psiPackage.getName();
namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor(
JavaNamespaceDescriptor namespaceDescriptor = new JavaNamespaceDescriptor(
(NamespaceDescriptorParent) resolveParentDescriptor(psiPackage),
Collections.<AnnotationDescriptor>emptyList(), // TODO
name == null ? JAVA_ROOT : name,
name == null ? FqName.ROOT : new FqName(psiPackage.getQualifiedName()),
fqName,
true
);
trace.record(JavaBindingContext.NAMESPACE_IS_CLASS_STATICS, namespaceData.namespaceDescriptor, false);
trace.record(BindingContext.NAMESPACE, psiPackage, namespaceDescriptor);
namespaceData.namespaceDescriptor.setMemberScope(createJavaPackageScope(new FqName(psiPackage.getQualifiedName()), namespaceData.namespaceDescriptor));
trace.record(BindingContext.NAMESPACE, psiPackage, namespaceData.namespaceDescriptor);
// TODO: hack
namespaceData.kotlin = true;
return namespaceData;
ResolverNamespaceData scopeData = createNamespaceResolverScopeData(fqName, namespaceDescriptor);
namespaceDescriptor.setMemberScope(scopeData.memberScope);
return namespaceDescriptor;
}
@Nullable
public JavaPackageScope createJavaPackageScope(@NotNull FqName fqName, @NotNull NamespaceDescriptor ns) {
private ResolverNamespaceData createNamespaceResolverScopeData(@NotNull FqName fqName, @NotNull NamespaceDescriptor ns) {
PsiPackage psiPackage = semanticServices.getPsiClassFinder().findPsiPackage(fqName);
PsiClass psiClass = getPsiClassForJavaPackageScope(fqName);
if (psiClass == null && psiPackage == null) {
return null;
}
return new JavaPackageScope(fqName, ns, semanticServices, psiPackage, psiClass);
if (psiPackage != null) {
trace.record(JavaBindingContext.NAMESPACE_IS_CLASS_STATICS, ns, false);
}
JavaPackageScope scope = new JavaPackageScope(fqName, ns, semanticServices, psiPackage, psiClass);
ResolverNamespaceData namespaceData = new ResolverNamespaceData();
namespaceData.namespaceDescriptor = ns;
// TODO: hack
namespaceData.kotlin = true;
namespaceData.memberScope = scope;
ResolverNamespaceData oldValue = namespaceDescriptorCacheByFqn.put(fqName, namespaceData);
if (oldValue != null) {
throw new IllegalStateException("rewrite at " + fqName);
}
return namespaceData;
}
@Nullable
public JavaPackageScope getJavaPackageScope(@NotNull FqName fqName, @NotNull NamespaceDescriptor ns) {
ResolverNamespaceData resolverNamespaceData = namespaceDescriptorCacheByFqn.get(fqName);
if (resolverNamespaceData == null) {
resolverNamespaceData = createNamespaceResolverScopeData(fqName, ns);
}
if (resolverNamespaceData == null) {
return null;
}
JavaPackageScope scope = resolverNamespaceData.memberScope;
if (scope == null) {
throw new IllegalStateException("fqn: " + fqName);
}
return scope;
}
private PsiClass getPsiClassForJavaPackageScope(@NotNull FqName packageFQN) {
@@ -881,16 +914,17 @@ public class JavaDescriptorResolver {
checkPsiClassIsNotJet(psiClass);
ResolverNamespaceData namespaceData = new ResolverNamespaceData();
namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor(
JavaNamespaceDescriptor ns = new JavaNamespaceDescriptor(
(NamespaceDescriptorParent) resolveParentDescriptor(psiClass),
Collections.<AnnotationDescriptor>emptyList(), // TODO
psiClass.getName(),
new FqName(psiClass.getQualifiedName()),
false
);
namespaceData.namespaceDescriptor = ns;
trace.record(JavaBindingContext.NAMESPACE_IS_CLASS_STATICS, namespaceData.namespaceDescriptor, true);
namespaceData.namespaceDescriptor.setMemberScope(new JavaClassMembersScope(namespaceData.namespaceDescriptor, psiClass, semanticServices, true));
ns.setMemberScope(new JavaClassMembersScope(namespaceData.namespaceDescriptor, psiClass, semanticServices, true));
trace.record(BindingContext.NAMESPACE, psiClass, namespaceData.namespaceDescriptor);
return namespaceData;
}