properly cache JavaPackageScope
This commit is contained in:
+1
-1
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
+51
-17
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user