From 51c369db5e6f0f1aea0b2cb149fdf9113d76792a Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 5 Nov 2012 13:56:05 +0400 Subject: [PATCH] Refactor: group methods for creating *PsiDeclarationProvider --- .../data/PsiDeclarationProviderFactory.java | 83 +++++++++++++++++++ .../resolve/java/data/ResolverClassData.java | 13 --- .../java/data/ResolverNamespaceData.java | 27 ------ .../resolver/JavaClassObjectResolver.java | 7 +- .../java/resolver/JavaClassResolver.java | 3 +- .../java/resolver/JavaNamespaceResolver.java | 4 +- 6 files changed, 91 insertions(+), 46 deletions(-) create mode 100644 compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/PsiDeclarationProviderFactory.java diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/PsiDeclarationProviderFactory.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/PsiDeclarationProviderFactory.java new file mode 100644 index 00000000000..2f4d1b701f2 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/PsiDeclarationProviderFactory.java @@ -0,0 +1,83 @@ +/* + * 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.data; + +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiPackage; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.resolve.java.JvmAbi; +import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lang.resolve.name.Name; + +public final class PsiDeclarationProviderFactory { + private PsiDeclarationProviderFactory() { + } + + @NotNull + public static ClassPsiDeclarationProvider createSyntheticClassObjectClassData( + @NotNull PsiClass psiClass + ) { + return createDeclarationProviderForClassStaticMembers(psiClass); + } + + public static ResolverClassData createBinaryClassData( + @NotNull PsiClass psiClass + ) { + return new ResolverClassData(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( + @NotNull PsiPackage psiPackage, + @NotNull PsiClass psiClass, + @Nullable FqName fqName + ) { + KotlinNamespacePsiDeclarationProvider result = new KotlinNamespacePsiDeclarationProvider(psiPackage, psiClass); + if (fqName != null && fqName.lastSegmentIs(Name.identifier(JvmAbi.PACKAGE_CLASS))) { + throw new IllegalStateException("Kotlin namespace cannot have last segment " + JvmAbi.PACKAGE_CLASS + ": " + fqName); + } + return result; + } + + @NotNull + private static PsiDeclarationProvider createDeclarationProviderForNamespaceWithoutMembers(@NotNull PsiPackage psiPackage) { + return new ResolverNamespaceData(psiPackage); + } + + @NotNull + private static ClassPsiDeclarationProvider createDeclarationProviderForClassStaticMembers(@NotNull PsiClass psiClass) { + return new ResolverClassData(psiClass, true); + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ResolverClassData.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ResolverClassData.java index ecb563425b1..f2b31d7e975 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ResolverClassData.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ResolverClassData.java @@ -30,17 +30,4 @@ public class ResolverClassData extends ClassPsiDeclarationProviderBase { ) { super(staticMembers, psiClass); } - - @NotNull - public static ResolverClassData createSyntheticClassObjectClassData( - @NotNull PsiClass psiClass - ) { - return new ResolverClassData(psiClass, true); - } - - public static ResolverClassData createBinaryClassData( - @NotNull PsiClass psiClass - ) { - return new ResolverClassData(psiClass, false); - } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ResolverNamespaceData.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ResolverNamespaceData.java index 48d9a8b9818..e444856750c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ResolverNamespaceData.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ResolverNamespaceData.java @@ -16,41 +16,14 @@ package org.jetbrains.jet.lang.resolve.java.data; -import com.intellij.psi.PsiClass; import com.intellij.psi.PsiPackage; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.MembersCache; -import org.jetbrains.jet.lang.resolve.name.FqName; -import org.jetbrains.jet.lang.resolve.name.Name; import static org.jetbrains.jet.lang.resolve.java.data.Origin.JAVA; public class ResolverNamespaceData extends PsiDeclarationProviderBase implements PackagePsiDeclarationProvider { - @NotNull - public static PsiDeclarationProvider createDeclarationProviderForPackage( - @Nullable PsiPackage psiPackage, - @Nullable PsiClass psiClass, - //TODO: - @Nullable FqName fqName - ) { - if (psiClass == null) { - - assert psiPackage != null; - return new ResolverNamespaceData(psiPackage); - } - if (psiPackage == null) { - return new ResolverClassData(psiClass, true); - } - KotlinNamespacePsiDeclarationProvider result = new KotlinNamespacePsiDeclarationProvider(psiPackage, psiClass); - if (fqName != null && fqName.lastSegmentIs(Name.identifier(JvmAbi.PACKAGE_CLASS))) { - throw new IllegalStateException("Kotlin namespace cannot have last segment " + JvmAbi.PACKAGE_CLASS + ": " + fqName); - } - return result; - } - @NotNull private final PsiPackage psiPackage; 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 52f01a0b624..a61bb471c00 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 @@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices; import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.data.ClassPsiDeclarationProvider; +import org.jetbrains.jet.lang.resolve.java.data.PsiDeclarationProviderFactory; import org.jetbrains.jet.lang.resolve.java.data.ResolverClassData; import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode; import org.jetbrains.jet.lang.resolve.java.scope.JavaClassMembersScope; @@ -111,7 +112,7 @@ public final class JavaClassObjectResolver { String qualifiedName = classObjectPsiClass.getQualifiedName(); assert qualifiedName != null; FqName fqName = new FqName(qualifiedName); - ResolverClassData classObjectData = ResolverClassData.createBinaryClassData(classObjectPsiClass); + ResolverClassData classObjectData = PsiDeclarationProviderFactory.createBinaryClassData(classObjectPsiClass); ClassDescriptorFromJvmBytecode classObjectDescriptor = new ClassDescriptorFromJvmBytecode(containing, ClassKind.CLASS_OBJECT, javaDescriptorResolver, classObjectData); classObjectDescriptor.setSupertypes(supertypesResolver.getSupertypes(classObjectDescriptor, new PsiClassWrapper(classObjectPsiClass), classObjectData, @@ -151,11 +152,11 @@ public final class JavaClassObjectResolver { ) { FqNameUnsafe fqName = DescriptorResolverUtils.getFqNameForClassObject(psiClass); - ResolverClassData classData = ResolverClassData.createBinaryClassData(psiClass); + ResolverClassData classData = PsiDeclarationProviderFactory.createBinaryClassData(psiClass); ClassDescriptorFromJvmBytecode classObjectDescriptor = new ClassDescriptorFromJvmBytecode( containing, ClassKind.CLASS_OBJECT, javaDescriptorResolver, classData); - ResolverClassData data = ResolverClassData.createSyntheticClassObjectClassData(psiClass); + ClassPsiDeclarationProvider data = PsiDeclarationProviderFactory.createSyntheticClassObjectClassData(psiClass); setUpClassObjectDescriptor(classObjectDescriptor, containing, fqName, data, getClassObjectName(containing.getName().getName())); return classObjectDescriptor; 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 cd45abacc91..fce1fbaad98 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 @@ -30,6 +30,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext; 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.data.PsiDeclarationProviderFactory; import org.jetbrains.jet.lang.resolve.java.data.ResolverClassData; import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode; import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation; @@ -224,7 +225,7 @@ public final class JavaClassResolver { ) { JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass); ClassKind kind = getClassKind(psiClass, jetClassAnnotation); - ResolverClassData classData = ResolverClassData.createBinaryClassData(psiClass); + ResolverClassData classData = PsiDeclarationProviderFactory.createBinaryClassData(psiClass); ClassDescriptorFromJvmBytecode classDescriptor = new ClassDescriptorFromJvmBytecode(containingDeclaration, kind, javaDescriptorResolver, classData); 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 cbafa9799fc..25293de35ac 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,7 +31,7 @@ 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.data.PsiDeclarationProvider; -import org.jetbrains.jet.lang.resolve.java.data.ResolverNamespaceData; +import org.jetbrains.jet.lang.resolve.java.data.PsiDeclarationProviderFactory; import org.jetbrains.jet.lang.resolve.java.descriptor.JavaNamespaceDescriptor; import org.jetbrains.jet.lang.resolve.java.scope.JavaPackageScope; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -171,7 +171,7 @@ public final class JavaNamespaceResolver { } return null; } - return ResolverNamespaceData.createDeclarationProviderForPackage(psiPackage, psiClass, fqName); + return PsiDeclarationProviderFactory.createDeclarationProviderForPackage(psiPackage, psiClass, fqName); } private void cache(@NotNull FqName fqName, @Nullable JavaPackageScope packageScope) {