From 811a65826b54e50b1c2d3dd3aa098cbee373e9cf Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Sun, 4 Nov 2012 23:57:34 +0400 Subject: [PATCH] Refactor: introduce ClassPsiDeclarationProvider and PsiDeclarationProvider interfaces, use them in JavaFunctionResolver and JavaPropertyResolver --- .../data/ClassPsiDeclarationProvider.java | 26 +++++++++++++++ .../java/data/PsiDeclarationProvider.java | 32 +++++++++++++++++++ .../resolve/java/data/ResolverScopeData.java | 13 ++++++-- .../java/resolver/JavaFunctionResolver.java | 13 ++++---- .../java/resolver/JavaPropertyResolver.java | 20 ++++++++---- .../resolve/java/scope/JavaBaseScope.java | 4 +-- 6 files changed, 89 insertions(+), 19 deletions(-) create mode 100644 compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ClassPsiDeclarationProvider.java create mode 100644 compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/PsiDeclarationProvider.java diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ClassPsiDeclarationProvider.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ClassPsiDeclarationProvider.java new file mode 100644 index 00000000000..00a5c678a63 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ClassPsiDeclarationProvider.java @@ -0,0 +1,26 @@ +/* + * 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 org.jetbrains.annotations.NotNull; + +public interface ClassPsiDeclarationProvider extends PsiDeclarationProvider { + + @NotNull + PsiClass getPsiClass(); +} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/PsiDeclarationProvider.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/PsiDeclarationProvider.java new file mode 100644 index 00000000000..16f9f302e2e --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/PsiDeclarationProvider.java @@ -0,0 +1,32 @@ +/* + * 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 org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.java.MembersCache; + +public interface PsiDeclarationProvider { + + @NotNull + MembersCache getMembersCache(); + + @NotNull + Origin getOrigin(); + + //TODO: remove this method + boolean isEmpty(); +} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ResolverScopeData.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ResolverScopeData.java index 9186575694e..c36d31bc81c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ResolverScopeData.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/data/ResolverScopeData.java @@ -30,11 +30,10 @@ import org.jetbrains.jet.lang.resolve.name.Name; import static org.jetbrains.jet.lang.resolve.java.data.Origin.JAVA; import static org.jetbrains.jet.lang.resolve.java.data.Origin.KOTLIN; -public abstract class ResolverScopeData { +public abstract class ResolverScopeData implements ClassPsiDeclarationProvider { private MembersCache membersCache = null; - @Nullable private final PsiClass psiClass; @Nullable @@ -84,6 +83,7 @@ public abstract class ResolverScopeData { return psiClass; } } + @Override @NotNull public MembersCache getMembersCache() { if (membersCache == null) { @@ -92,16 +92,23 @@ public abstract class ResolverScopeData { return membersCache; } - @Nullable + @Override + @NotNull public PsiClass getPsiClass() { return psiClass; } + @Override + public boolean isEmpty() { + return psiClass == null; + } + @Nullable public PsiPackage getPsiPackage() { return psiPackage; } + @Override @NotNull public Origin getOrigin() { return origin; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java index 0a220d0d63a..bf5f0c966e3 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java @@ -26,7 +26,8 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.java.*; -import org.jetbrains.jet.lang.resolve.java.data.ResolverScopeData; +import org.jetbrains.jet.lang.resolve.java.data.ClassPsiDeclarationProvider; +import org.jetbrains.jet.lang.resolve.java.data.PsiDeclarationProvider; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData; import org.jetbrains.jet.lang.resolve.java.kt.DescriptorKindUtils; import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper; @@ -84,7 +85,7 @@ public final class JavaFunctionResolver { @Nullable private SimpleFunctionDescriptor resolveMethodToFunctionDescriptor( @NotNull final PsiClass psiClass, final PsiMethodWrapper method, - @NotNull ResolverScopeData scopeData, @NotNull ClassOrNamespaceDescriptor ownerDescriptor + @NotNull PsiDeclarationProvider scopeData, @NotNull ClassOrNamespaceDescriptor ownerDescriptor ) { PsiType returnPsiType = method.getReturnType(); if (returnPsiType == null) { @@ -174,7 +175,7 @@ public final class JavaFunctionResolver { @NotNull private Set resolveNamedGroupFunctions( @NotNull ClassOrNamespaceDescriptor owner, @NotNull PsiClass psiClass, - NamedMembers namedMembers, Name methodName, ResolverScopeData scopeData + NamedMembers namedMembers, Name methodName, PsiDeclarationProvider scopeData ) { final Set functions = new HashSet(); @@ -225,17 +226,15 @@ public final class JavaFunctionResolver { @NotNull public Set resolveFunctionGroup( @NotNull Name methodName, - @NotNull ResolverScopeData scopeData, + @NotNull ClassPsiDeclarationProvider scopeData, @NotNull ClassOrNamespaceDescriptor ownerDescriptor ) { - MembersCache namedMembersMap = scopeData.getMembersCache(); - NamedMembers namedMembers = namedMembersMap.get(methodName); + NamedMembers namedMembers = scopeData.getMembersCache().get(methodName); if (namedMembers == null) { return Collections.emptySet(); } PsiClass psiClass = scopeData.getPsiClass(); - assert psiClass != null; return resolveNamedGroupFunctions(ownerDescriptor, psiClass, namedMembers, methodName, scopeData); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java index e0d292f913f..cfbd6986f3a 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java @@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.resolve.BindingTrace; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.java.*; +import org.jetbrains.jet.lang.resolve.java.data.PsiDeclarationProvider; import org.jetbrains.jet.lang.resolve.java.data.ResolverScopeData; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeFieldSignatureData; import org.jetbrains.jet.lang.resolve.java.kt.DescriptorKindUtils; @@ -85,7 +86,7 @@ public final class JavaPropertyResolver { @NotNull public Set resolveFieldGroupByName( @NotNull Name fieldName, - @NotNull ResolverScopeData scopeData, + @NotNull PsiDeclarationProvider scopeData, @NotNull ClassOrNamespaceDescriptor ownerDescriptor ) { NamedMembers namedMembers = scopeData.getMembersCache().get(fieldName); @@ -100,7 +101,7 @@ public final class JavaPropertyResolver { @NotNull private Set resolveNamedGroupProperties( @NotNull ClassOrNamespaceDescriptor ownerDescriptor, - @NotNull ResolverScopeData scopeData, + @NotNull PsiDeclarationProvider scopeData, @NotNull NamedMembers namedMembers, @NotNull Name propertyName, @NotNull String context @@ -167,7 +168,7 @@ public final class JavaPropertyResolver { @NotNull private PropertyDescriptor resolveProperty( @NotNull ClassOrNamespaceDescriptor owner, - @NotNull ResolverScopeData scopeData, + @NotNull PsiDeclarationProvider scopeData, @NotNull Name propertyName, @NotNull String context, @NotNull PropertyPsiData psiData @@ -420,7 +421,7 @@ public final class JavaPropertyResolver { return regularPropertiesCount; } - private static boolean isPropertyFinal(ResolverScopeData scopeData, PropertyPsiData psiData) { + private static boolean isPropertyFinal(PsiDeclarationProvider scopeData, PropertyPsiData psiData) { if (scopeData.getOrigin() == JAVA) { return true; } @@ -443,11 +444,16 @@ public final class JavaPropertyResolver { @NotNull private ClassOrNamespaceDescriptor getRealOwner( @NotNull ClassOrNamespaceDescriptor owner, - @NotNull ResolverScopeData scopeData, + @NotNull PsiDeclarationProvider scopeData, boolean isStatic ) { - PsiClass psiClass = scopeData.getPsiClass(); - if (psiClass == null || !psiClass.isEnum() || !isStatic) { + //TODO: hack! + ResolverScopeData resolverScopeData = (ResolverScopeData) scopeData; + if (resolverScopeData.isEmpty()) { + return owner; + } + PsiClass psiClass = resolverScopeData.getPsiClass(); + if (!psiClass.isEnum() || !isStatic) { return owner; } final String qualifiedName = psiClass.getQualifiedName(); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaBaseScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaBaseScope.java index bb76615a1a6..a823f05ebae 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaBaseScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/scope/JavaBaseScope.java @@ -132,8 +132,8 @@ public abstract class JavaBaseScope extends JetScopeImpl { @NotNull private Collection computeAllDescriptors() { Collection result = Sets.newHashSet(); - PsiClass psiClass = resolverScopeData.getPsiClass(); - if (psiClass != null) { + if (!resolverScopeData.isEmpty()) { + PsiClass psiClass = resolverScopeData.getPsiClass(); computeFieldAndFunctionDescriptors(result); computeInnerClasses(psiClass, result); }