Refactor: introduce ClassPsiDeclarationProvider and PsiDeclarationProvider interfaces, use them in JavaFunctionResolver and JavaPropertyResolver

This commit is contained in:
Pavel V. Talanov
2012-11-04 23:57:34 +04:00
parent 1c70daa499
commit 811a65826b
6 changed files with 89 additions and 19 deletions
@@ -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();
}
@@ -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();
}
@@ -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;
@@ -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<FunctionDescriptor> resolveNamedGroupFunctions(
@NotNull ClassOrNamespaceDescriptor owner, @NotNull PsiClass psiClass,
NamedMembers namedMembers, Name methodName, ResolverScopeData scopeData
NamedMembers namedMembers, Name methodName, PsiDeclarationProvider scopeData
) {
final Set<FunctionDescriptor> functions = new HashSet<FunctionDescriptor>();
@@ -225,17 +226,15 @@ public final class JavaFunctionResolver {
@NotNull
public Set<FunctionDescriptor> 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);
}
@@ -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<VariableDescriptor> 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<VariableDescriptor> 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();
@@ -132,8 +132,8 @@ public abstract class JavaBaseScope extends JetScopeImpl {
@NotNull
private Collection<DeclarationDescriptor> computeAllDescriptors() {
Collection<DeclarationDescriptor> result = Sets.newHashSet();
PsiClass psiClass = resolverScopeData.getPsiClass();
if (psiClass != null) {
if (!resolverScopeData.isEmpty()) {
PsiClass psiClass = resolverScopeData.getPsiClass();
computeFieldAndFunctionDescriptors(result);
computeInnerClasses(psiClass, result);
}