From da47c31a863556df63ed16c35d830e1cbe939bab Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 8 Nov 2012 19:13:55 +0400 Subject: [PATCH] Introduce JavaScopeForKotlinNamespace, JavaPackageScopeWithoutMembers, JavaClassStaticMembersScope, much clearer and more explicit logic in JavaNamespaceResolver#createNamespaceScope() These classes explicitly represent 3 types of scopes that are created for NamespaceDescriptor in JDR --- .../PsiDeclarationProviderFactory.java | 31 +++---------- .../resolver/JavaClassObjectResolver.java | 2 +- .../java/resolver/JavaClassResolver.java | 2 +- .../java/resolver/JavaNamespaceResolver.java | 45 ++++++++++--------- .../java/scope/JavaClassMembersScope.java | 9 ++-- .../scope/JavaClassStaticMembersScope.java | 34 ++++++++++++++ .../resolve/java/scope/JavaPackageScope.java | 12 ++--- .../scope/JavaPackageScopeWithoutMembers.java | 34 ++++++++++++++ .../scope/JavaScopeForKotlinNamespace.java | 34 ++++++++++++++ 9 files changed, 143 insertions(+), 60 deletions(-) create mode 100644 compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java create mode 100644 compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScopeWithoutMembers.java create mode 100644 compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaScopeForKotlinNamespace.java diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PsiDeclarationProviderFactory.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PsiDeclarationProviderFactory.java index 34a3c01ad45..9418f78f100 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PsiDeclarationProviderFactory.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/provider/PsiDeclarationProviderFactory.java @@ -29,38 +29,17 @@ public final class PsiDeclarationProviderFactory { } @NotNull - public static ClassPsiDeclarationProvider createSyntheticClassObjectClassData( - @NotNull PsiClass psiClass - ) { + public static ClassPsiDeclarationProvider createSyntheticClassObjectClassData(@NotNull PsiClass psiClass) { return createDeclarationProviderForClassStaticMembers(psiClass); } @NotNull - public static ClassPsiDeclarationProvider createBinaryClassData( - @NotNull PsiClass psiClass - ) { + public static ClassPsiDeclarationProvider createBinaryClassData(@NotNull PsiClass psiClass) { return new ClassPsiDeclarationProviderImpl(psiClass, false); } @NotNull - public static PsiDeclarationProvider createDeclarationProviderForPackage( - @Nullable PsiPackage psiPackage, - @Nullable PsiClass psiClass, - //TODO: remove this parameter - @Nullable FqName fqName - ) { - if (psiClass == null) { - assert psiPackage != null; - return createDeclarationProviderForNamespaceWithoutMembers(psiPackage); - } - if (psiPackage == null) { - return createDeclarationProviderForClassStaticMembers(psiClass); - } - return createDeclarationForKotlinNamespace(psiPackage, psiClass, fqName); - } - - @NotNull - private static KotlinNamespacePsiDeclarationProvider createDeclarationForKotlinNamespace( + public static KotlinNamespacePsiDeclarationProvider createDeclarationForKotlinNamespace( @NotNull PsiPackage psiPackage, @NotNull PsiClass psiClass, @Nullable FqName fqName @@ -73,12 +52,12 @@ public final class PsiDeclarationProviderFactory { } @NotNull - /*package private*/ static PackagePsiDeclarationProvider createDeclarationProviderForNamespaceWithoutMembers(@NotNull PsiPackage psiPackage) { + public static PackagePsiDeclarationProvider createDeclarationProviderForNamespaceWithoutMembers(@NotNull PsiPackage psiPackage) { return new PackagePsiDeclarationProviderImpl(psiPackage); } @NotNull - private static ClassPsiDeclarationProvider createDeclarationProviderForClassStaticMembers(@NotNull PsiClass psiClass) { + public static ClassPsiDeclarationProvider createDeclarationProviderForClassStaticMembers(@NotNull PsiClass psiClass) { return new ClassPsiDeclarationProviderImpl(psiClass, true); } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java index b0aacc73f77..4c2b717d4c3 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassObjectResolver.java @@ -173,7 +173,7 @@ public final class JavaClassObjectResolver { classObjectDescriptor.setVisibility(containing.getVisibility()); classObjectDescriptor.setTypeParameterDescriptors(Collections.emptyList()); classObjectDescriptor.createTypeConstructor(); - JavaClassMembersScope classMembersScope = new JavaClassMembersScope(classObjectDescriptor, semanticServices, data); + JavaClassMembersScope classMembersScope = new JavaClassMembersScope(classObjectDescriptor, data, semanticServices); WritableScopeImpl writableScope = new WritableScopeImpl(classMembersScope, classObjectDescriptor, RedeclarationHandler.THROW_EXCEPTION, fqName.toString()); writableScope.changeLockLevel(WritableScope.LockLevel.BOTH); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java index 30c393ff302..c0d7a6f4a77 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaClassResolver.java @@ -241,7 +241,7 @@ public final class JavaClassResolver { classDescriptor.setVisibility(DescriptorResolverUtils.resolveVisibility(psiClass, jetClassAnnotation)); classDescriptor.setModality(resolveModality(psiClass, classDescriptor)); classDescriptor.createTypeConstructor(); - classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classDescriptor, semanticServices, classData)); + classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classDescriptor, classData, semanticServices)); String context = "class " + psiClass.getQualifiedName(); signatureResolver.initializeTypeParameters(typeParameterDescriptorInitializations, classDescriptor, context); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java index ad3b4a7adb2..66f14cd1050 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaNamespaceResolver.java @@ -31,9 +31,10 @@ import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.java.*; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaNamespaceDescriptor; -import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProvider; -import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProviderFactory; +import org.jetbrains.jet.lang.resolve.java.scope.JavaClassStaticMembersScope; import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageScope; +import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageScopeWithoutMembers; +import org.jetbrains.jet.lang.resolve.java.scope.JavaScopeForKotlinNamespace; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; @@ -42,6 +43,8 @@ import java.util.Collections; import java.util.Map; import java.util.Set; +import static org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProviderFactory.*; + public final class JavaNamespaceResolver { @NotNull @@ -132,39 +135,37 @@ public final class JavaNamespaceResolver { @NotNull FqName fqName, @NotNull NamespaceDescriptor namespaceDescriptor ) { - PsiDeclarationProvider namespaceData = createDeclarationProvider(fqName, namespaceDescriptor); - JavaPackageScope javaPackageScope; - if (namespaceData == null) { - javaPackageScope = null; - } - else { - //TODO: - javaPackageScope = new JavaPackageScope(namespaceDescriptor, fqName, javaSemanticServices, namespaceData); - } - - cache(fqName, javaPackageScope); - - return javaPackageScope; + JavaPackageScope namespaceScope = doCreateNamespaceScope(fqName, namespaceDescriptor); + cache(fqName, namespaceScope); + return namespaceScope; } @Nullable - private PsiDeclarationProvider createDeclarationProvider( + private JavaPackageScope doCreateNamespaceScope( @NotNull FqName fqName, @NotNull NamespaceDescriptor namespaceDescriptor ) { - PsiClass psiClass = getPsiClassForJavaPackageScope(fqName); PsiPackage psiPackage = psiClassFinder.findPsiPackage(fqName); - if (psiClass != null || psiPackage != null) { + if (psiPackage != null) { + PsiClass psiClass = getPsiClassForJavaPackageScope(fqName); trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.PROPER); - return PsiDeclarationProviderFactory.createDeclarationProviderForPackage(psiPackage, psiClass, fqName); + if (psiClass == null) { + return new JavaPackageScopeWithoutMembers(namespaceDescriptor, + createDeclarationProviderForNamespaceWithoutMembers(psiPackage), + fqName, javaSemanticServices); + } + return new JavaScopeForKotlinNamespace(namespaceDescriptor, + createDeclarationForKotlinNamespace(psiPackage, psiClass, fqName), + fqName, javaSemanticServices); } - psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE); + PsiClass psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE); if (psiClass != null && !psiClass.isEnum()) { trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, namespaceDescriptor, JavaNamespaceKind.CLASS_STATICS); - return PsiDeclarationProviderFactory.createDeclarationProviderForPackage(psiPackage, psiClass, fqName); + return new JavaClassStaticMembersScope(namespaceDescriptor, + createDeclarationProviderForClassStaticMembers(psiClass), + fqName, javaSemanticServices); } - return null; } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassMembersScope.java index 917ba7afee8..50ee324a289 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassMembersScope.java @@ -47,10 +47,11 @@ public class JavaClassMembersScope extends JavaBaseScope { public JavaClassMembersScope( @NotNull ClassOrNamespaceDescriptor descriptor, - @NotNull JavaSemanticServices semanticServices, - @NotNull ClassPsiDeclarationProvider resolverScopeData) { - super(descriptor, semanticServices, resolverScopeData); - this.classPsiDeclarationProvider = resolverScopeData; + @NotNull ClassPsiDeclarationProvider declarationProvider, + @NotNull JavaSemanticServices semanticServices + ) { + super(descriptor, semanticServices, declarationProvider); + this.classPsiDeclarationProvider = declarationProvider; } @NotNull diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java new file mode 100644 index 00000000000..8a33e4e2155 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaClassStaticMembersScope.java @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.resolve.java.scope; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; +import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices; +import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider; +import org.jetbrains.jet.lang.resolve.name.FqName; + +public final class JavaClassStaticMembersScope extends JavaPackageScope { + public JavaClassStaticMembersScope( + @NotNull NamespaceDescriptor descriptor, + @NotNull ClassPsiDeclarationProvider declarationProvider, + @NotNull FqName packageFQN, + @NotNull JavaSemanticServices semanticServices + ) { + super(descriptor, declarationProvider, packageFQN, semanticServices); + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScope.java index db9880fd5ce..2ae0ac545a9 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScope.java @@ -19,7 +19,6 @@ package org.jetbrains.jet.lang.resolve.java.scope; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; -import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor; import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule; @@ -33,18 +32,19 @@ import org.jetbrains.jet.lang.resolve.name.Name; /** * @author abreslav */ -public class JavaPackageScope extends JavaBaseScope { +public abstract class JavaPackageScope extends JavaBaseScope { @NotNull private final FqName packageFQN; @NotNull private final PsiDeclarationProvider declarationProvider; - public JavaPackageScope( - @NotNull ClassOrNamespaceDescriptor descriptor, + protected JavaPackageScope( + @NotNull NamespaceDescriptor descriptor, + @NotNull PsiDeclarationProvider declarationProvider, @NotNull FqName packageFQN, - @NotNull JavaSemanticServices semanticServices, - @NotNull PsiDeclarationProvider declarationProvider) { + @NotNull JavaSemanticServices semanticServices + ) { super(descriptor, semanticServices, declarationProvider); this.declarationProvider = declarationProvider; this.packageFQN = packageFQN; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScopeWithoutMembers.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScopeWithoutMembers.java new file mode 100644 index 00000000000..d20f418df9a --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaPackageScopeWithoutMembers.java @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.resolve.java.scope; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; +import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices; +import org.jetbrains.jet.lang.resolve.java.provider.PsiDeclarationProvider; +import org.jetbrains.jet.lang.resolve.name.FqName; + +public final class JavaPackageScopeWithoutMembers extends JavaPackageScope { + public JavaPackageScopeWithoutMembers( + @NotNull NamespaceDescriptor descriptor, + @NotNull PsiDeclarationProvider declarationProvider, + @NotNull FqName packageFQN, + @NotNull JavaSemanticServices semanticServices + ) { + super(descriptor, declarationProvider, packageFQN, semanticServices); + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaScopeForKotlinNamespace.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaScopeForKotlinNamespace.java new file mode 100644 index 00000000000..7f58287ea27 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaScopeForKotlinNamespace.java @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.lang.resolve.java.scope; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; +import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices; +import org.jetbrains.jet.lang.resolve.java.provider.KotlinNamespacePsiDeclarationProvider; +import org.jetbrains.jet.lang.resolve.name.FqName; + +public final class JavaScopeForKotlinNamespace extends JavaPackageScope { + public JavaScopeForKotlinNamespace( + @NotNull NamespaceDescriptor descriptor, + @NotNull KotlinNamespacePsiDeclarationProvider declarationProvider, + @NotNull FqName packageFQN, + @NotNull JavaSemanticServices semanticServices + ) { + super(descriptor, declarationProvider, packageFQN, semanticServices); + } +}