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.JAVA;
import static org.jetbrains.jet.lang.resolve.java.data.Origin.KOTLIN; 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; private MembersCache membersCache = null;
@Nullable
private final PsiClass psiClass; private final PsiClass psiClass;
@Nullable @Nullable
@@ -84,6 +83,7 @@ public abstract class ResolverScopeData {
return psiClass; return psiClass;
} }
} }
@Override
@NotNull @NotNull
public MembersCache getMembersCache() { public MembersCache getMembersCache() {
if (membersCache == null) { if (membersCache == null) {
@@ -92,16 +92,23 @@ public abstract class ResolverScopeData {
return membersCache; return membersCache;
} }
@Nullable @Override
@NotNull
public PsiClass getPsiClass() { public PsiClass getPsiClass() {
return psiClass; return psiClass;
} }
@Override
public boolean isEmpty() {
return psiClass == null;
}
@Nullable @Nullable
public PsiPackage getPsiPackage() { public PsiPackage getPsiPackage() {
return psiPackage; return psiPackage;
} }
@Override
@NotNull @NotNull
public Origin getOrigin() { public Origin getOrigin() {
return origin; return origin;
@@ -26,7 +26,8 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.*;
import org.jetbrains.jet.lang.resolve.java.*; 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.kotlinSignature.AlternativeMethodSignatureData;
import org.jetbrains.jet.lang.resolve.java.kt.DescriptorKindUtils; import org.jetbrains.jet.lang.resolve.java.kt.DescriptorKindUtils;
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper; import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper;
@@ -84,7 +85,7 @@ public final class JavaFunctionResolver {
@Nullable @Nullable
private SimpleFunctionDescriptor resolveMethodToFunctionDescriptor( private SimpleFunctionDescriptor resolveMethodToFunctionDescriptor(
@NotNull final PsiClass psiClass, final PsiMethodWrapper method, @NotNull final PsiClass psiClass, final PsiMethodWrapper method,
@NotNull ResolverScopeData scopeData, @NotNull ClassOrNamespaceDescriptor ownerDescriptor @NotNull PsiDeclarationProvider scopeData, @NotNull ClassOrNamespaceDescriptor ownerDescriptor
) { ) {
PsiType returnPsiType = method.getReturnType(); PsiType returnPsiType = method.getReturnType();
if (returnPsiType == null) { if (returnPsiType == null) {
@@ -174,7 +175,7 @@ public final class JavaFunctionResolver {
@NotNull @NotNull
private Set<FunctionDescriptor> resolveNamedGroupFunctions( private Set<FunctionDescriptor> resolveNamedGroupFunctions(
@NotNull ClassOrNamespaceDescriptor owner, @NotNull PsiClass psiClass, @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>(); final Set<FunctionDescriptor> functions = new HashSet<FunctionDescriptor>();
@@ -225,17 +226,15 @@ public final class JavaFunctionResolver {
@NotNull @NotNull
public Set<FunctionDescriptor> resolveFunctionGroup( public Set<FunctionDescriptor> resolveFunctionGroup(
@NotNull Name methodName, @NotNull Name methodName,
@NotNull ResolverScopeData scopeData, @NotNull ClassPsiDeclarationProvider scopeData,
@NotNull ClassOrNamespaceDescriptor ownerDescriptor @NotNull ClassOrNamespaceDescriptor ownerDescriptor
) { ) {
MembersCache namedMembersMap = scopeData.getMembersCache();
NamedMembers namedMembers = namedMembersMap.get(methodName); NamedMembers namedMembers = scopeData.getMembersCache().get(methodName);
if (namedMembers == null) { if (namedMembers == null) {
return Collections.emptySet(); return Collections.emptySet();
} }
PsiClass psiClass = scopeData.getPsiClass(); PsiClass psiClass = scopeData.getPsiClass();
assert psiClass != null;
return resolveNamedGroupFunctions(ownerDescriptor, psiClass, namedMembers, methodName, scopeData); 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.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.OverrideResolver; import org.jetbrains.jet.lang.resolve.OverrideResolver;
import org.jetbrains.jet.lang.resolve.java.*; 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.data.ResolverScopeData;
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeFieldSignatureData; import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeFieldSignatureData;
import org.jetbrains.jet.lang.resolve.java.kt.DescriptorKindUtils; import org.jetbrains.jet.lang.resolve.java.kt.DescriptorKindUtils;
@@ -85,7 +86,7 @@ public final class JavaPropertyResolver {
@NotNull @NotNull
public Set<VariableDescriptor> resolveFieldGroupByName( public Set<VariableDescriptor> resolveFieldGroupByName(
@NotNull Name fieldName, @NotNull Name fieldName,
@NotNull ResolverScopeData scopeData, @NotNull PsiDeclarationProvider scopeData,
@NotNull ClassOrNamespaceDescriptor ownerDescriptor @NotNull ClassOrNamespaceDescriptor ownerDescriptor
) { ) {
NamedMembers namedMembers = scopeData.getMembersCache().get(fieldName); NamedMembers namedMembers = scopeData.getMembersCache().get(fieldName);
@@ -100,7 +101,7 @@ public final class JavaPropertyResolver {
@NotNull @NotNull
private Set<VariableDescriptor> resolveNamedGroupProperties( private Set<VariableDescriptor> resolveNamedGroupProperties(
@NotNull ClassOrNamespaceDescriptor ownerDescriptor, @NotNull ClassOrNamespaceDescriptor ownerDescriptor,
@NotNull ResolverScopeData scopeData, @NotNull PsiDeclarationProvider scopeData,
@NotNull NamedMembers namedMembers, @NotNull NamedMembers namedMembers,
@NotNull Name propertyName, @NotNull Name propertyName,
@NotNull String context @NotNull String context
@@ -167,7 +168,7 @@ public final class JavaPropertyResolver {
@NotNull @NotNull
private PropertyDescriptor resolveProperty( private PropertyDescriptor resolveProperty(
@NotNull ClassOrNamespaceDescriptor owner, @NotNull ClassOrNamespaceDescriptor owner,
@NotNull ResolverScopeData scopeData, @NotNull PsiDeclarationProvider scopeData,
@NotNull Name propertyName, @NotNull Name propertyName,
@NotNull String context, @NotNull String context,
@NotNull PropertyPsiData psiData @NotNull PropertyPsiData psiData
@@ -420,7 +421,7 @@ public final class JavaPropertyResolver {
return regularPropertiesCount; return regularPropertiesCount;
} }
private static boolean isPropertyFinal(ResolverScopeData scopeData, PropertyPsiData psiData) { private static boolean isPropertyFinal(PsiDeclarationProvider scopeData, PropertyPsiData psiData) {
if (scopeData.getOrigin() == JAVA) { if (scopeData.getOrigin() == JAVA) {
return true; return true;
} }
@@ -443,11 +444,16 @@ public final class JavaPropertyResolver {
@NotNull @NotNull
private ClassOrNamespaceDescriptor getRealOwner( private ClassOrNamespaceDescriptor getRealOwner(
@NotNull ClassOrNamespaceDescriptor owner, @NotNull ClassOrNamespaceDescriptor owner,
@NotNull ResolverScopeData scopeData, @NotNull PsiDeclarationProvider scopeData,
boolean isStatic boolean isStatic
) { ) {
PsiClass psiClass = scopeData.getPsiClass(); //TODO: hack!
if (psiClass == null || !psiClass.isEnum() || !isStatic) { ResolverScopeData resolverScopeData = (ResolverScopeData) scopeData;
if (resolverScopeData.isEmpty()) {
return owner;
}
PsiClass psiClass = resolverScopeData.getPsiClass();
if (!psiClass.isEnum() || !isStatic) {
return owner; return owner;
} }
final String qualifiedName = psiClass.getQualifiedName(); final String qualifiedName = psiClass.getQualifiedName();
@@ -132,8 +132,8 @@ public abstract class JavaBaseScope extends JetScopeImpl {
@NotNull @NotNull
private Collection<DeclarationDescriptor> computeAllDescriptors() { private Collection<DeclarationDescriptor> computeAllDescriptors() {
Collection<DeclarationDescriptor> result = Sets.newHashSet(); Collection<DeclarationDescriptor> result = Sets.newHashSet();
PsiClass psiClass = resolverScopeData.getPsiClass(); if (!resolverScopeData.isEmpty()) {
if (psiClass != null) { PsiClass psiClass = resolverScopeData.getPsiClass();
computeFieldAndFunctionDescriptors(result); computeFieldAndFunctionDescriptors(result);
computeInnerClasses(psiClass, result); computeInnerClasses(psiClass, result);
} }