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 @Override
public void extendNamespaceScope(@NotNull BindingTrace trace, @NotNull NamespaceDescriptor namespaceDescriptor, @NotNull WritableScope namespaceMemberScope) { 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) { if (javaPackageScope != null) {
namespaceMemberScope.importScope(javaPackageScope); namespaceMemberScope.importScope(javaPackageScope);
} }
@@ -184,7 +184,8 @@ public class JavaDescriptorResolver {
/** Either package or class with static members */ /** Either package or class with static members */
private static class ResolverNamespaceData extends ResolverScopeData { private static class ResolverNamespaceData extends ResolverScopeData {
private JavaNamespaceDescriptor namespaceDescriptor; private NamespaceDescriptor namespaceDescriptor;
private JavaPackageScope memberScope;
@NotNull @NotNull
public NamespaceDescriptor getNamespaceDescriptor() { public NamespaceDescriptor getNamespaceDescriptor() {
@@ -805,8 +806,7 @@ public class JavaDescriptorResolver {
FqName fqName = new FqName(psiPackage.getQualifiedName()); FqName fqName = new FqName(psiPackage.getQualifiedName());
ResolverNamespaceData namespaceData = namespaceDescriptorCacheByFqn.get(fqName); ResolverNamespaceData namespaceData = namespaceDescriptorCacheByFqn.get(fqName);
if (namespaceData == null) { if (namespaceData == null) {
namespaceData = createJavaNamespaceDescriptor(psiPackage); return createJavaNamespaceDescriptor(psiPackage);
namespaceDescriptorCacheByFqn.put(fqName, namespaceData);
} }
return namespaceData.namespaceDescriptor; return namespaceData.namespaceDescriptor;
} }
@@ -821,33 +821,66 @@ public class JavaDescriptorResolver {
return namespaceData.namespaceDescriptor; return namespaceData.namespaceDescriptor;
} }
private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull PsiPackage psiPackage) { private JavaNamespaceDescriptor createJavaNamespaceDescriptor(@NotNull PsiPackage psiPackage) {
ResolverNamespaceData namespaceData = new ResolverNamespaceData(); FqName fqName = new FqName(psiPackage.getQualifiedName());
String name = psiPackage.getName(); String name = psiPackage.getName();
namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor( JavaNamespaceDescriptor namespaceDescriptor = new JavaNamespaceDescriptor(
(NamespaceDescriptorParent) resolveParentDescriptor(psiPackage), (NamespaceDescriptorParent) resolveParentDescriptor(psiPackage),
Collections.<AnnotationDescriptor>emptyList(), // TODO Collections.<AnnotationDescriptor>emptyList(), // TODO
name == null ? JAVA_ROOT : name, name == null ? JAVA_ROOT : name,
name == null ? FqName.ROOT : new FqName(psiPackage.getQualifiedName()), fqName,
true 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)); ResolverNamespaceData scopeData = createNamespaceResolverScopeData(fqName, namespaceDescriptor);
trace.record(BindingContext.NAMESPACE, psiPackage, namespaceData.namespaceDescriptor); namespaceDescriptor.setMemberScope(scopeData.memberScope);
// TODO: hack return namespaceDescriptor;
namespaceData.kotlin = true;
return namespaceData;
} }
@Nullable @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); PsiPackage psiPackage = semanticServices.getPsiClassFinder().findPsiPackage(fqName);
PsiClass psiClass = getPsiClassForJavaPackageScope(fqName); PsiClass psiClass = getPsiClassForJavaPackageScope(fqName);
if (psiClass == null && psiPackage == null) { if (psiClass == null && psiPackage == null) {
return 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) { private PsiClass getPsiClassForJavaPackageScope(@NotNull FqName packageFQN) {
@@ -881,16 +914,17 @@ public class JavaDescriptorResolver {
checkPsiClassIsNotJet(psiClass); checkPsiClassIsNotJet(psiClass);
ResolverNamespaceData namespaceData = new ResolverNamespaceData(); ResolverNamespaceData namespaceData = new ResolverNamespaceData();
namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor( JavaNamespaceDescriptor ns = new JavaNamespaceDescriptor(
(NamespaceDescriptorParent) resolveParentDescriptor(psiClass), (NamespaceDescriptorParent) resolveParentDescriptor(psiClass),
Collections.<AnnotationDescriptor>emptyList(), // TODO Collections.<AnnotationDescriptor>emptyList(), // TODO
psiClass.getName(), psiClass.getName(),
new FqName(psiClass.getQualifiedName()), new FqName(psiClass.getQualifiedName()),
false false
); );
namespaceData.namespaceDescriptor = ns;
trace.record(JavaBindingContext.NAMESPACE_IS_CLASS_STATICS, namespaceData.namespaceDescriptor, true); 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); trace.record(BindingContext.NAMESPACE, psiClass, namespaceData.namespaceDescriptor);
return namespaceData; return namespaceData;
} }