Don't use DeclarationOrigin

This commit is contained in:
Pavel V. Talanov
2013-07-05 15:12:30 +04:00
committed by Alexander Udalov
parent 69295290eb
commit 1843b7bbbe
10 changed files with 27 additions and 125 deletions
@@ -18,16 +18,10 @@ package org.jetbrains.jet.lang.resolve.java.provider;
import com.intellij.psi.PsiClass;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.resolve.java.PsiClassFinder;
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.JAVA;
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN;
public class ClassPsiDeclarationProviderImpl extends PsiDeclarationProviderBase implements ClassPsiDeclarationProvider {
@NotNull
protected final DeclarationOrigin declarationOrigin;
@NotNull
protected final PsiClassFinder psiClassFinder;
@@ -40,14 +34,12 @@ public class ClassPsiDeclarationProviderImpl extends PsiDeclarationProviderBase
this.staticMembers = staticMembers;
this.psiClass = psiClass;
this.psiClassFinder = psiClassFinder;
this.declarationOrigin = determineOrigin(psiClass);
}
@Override
@NotNull
protected MembersCache buildMembersCache() {
return MembersCache.buildMembersByNameCache(new MembersCache(), psiClassFinder, psiClass, null, staticMembers,
getDeclarationOrigin() == KOTLIN);
return MembersCache.buildMembersByNameCache(new MembersCache(), psiClassFinder, psiClass, null, staticMembers);
}
@Override
@@ -56,17 +48,6 @@ public class ClassPsiDeclarationProviderImpl extends PsiDeclarationProviderBase
return psiClass;
}
@Override
@NotNull
public DeclarationOrigin getDeclarationOrigin() {
return declarationOrigin;
}
@NotNull
private static DeclarationOrigin determineOrigin(@Nullable PsiClass psiClass) {
return JAVA;
}
@Override
public boolean isStaticMembers() {
return staticMembers;
@@ -1,22 +0,0 @@
/*
* Copyright 2010-2013 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.provider;
public enum DeclarationOrigin {
JAVA,
KOTLIN
}
@@ -104,11 +104,10 @@ public final class MembersCache {
@NotNull PsiClassFinder finder,
@Nullable PsiClass psiClass,
@Nullable PsiPackage psiPackage,
boolean staticMembers,
boolean isKotlin
boolean staticMembers
) {
if (psiClass != null) {
membersCache.new ClassMemberProcessor(new PsiClassWrapper(psiClass), staticMembers, isKotlin).process();
membersCache.new ClassMemberProcessor(new PsiClassWrapper(psiClass), staticMembers).process();
}
//TODO:
@@ -145,12 +144,10 @@ public final class MembersCache {
@NotNull
private final PsiClassWrapper psiClass;
private final boolean staticMembers;
private final boolean kotlin;
private ClassMemberProcessor(@NotNull PsiClassWrapper psiClass, boolean staticMembers, boolean kotlin) {
private ClassMemberProcessor(@NotNull PsiClassWrapper psiClass, boolean staticMembers) {
this.psiClass = psiClass;
this.staticMembers = staticMembers;
this.kotlin = kotlin;
}
public void process() {
@@ -160,10 +157,6 @@ public final class MembersCache {
}
private void processFields() {
// Hack to load static members for enum class loaded from class file
if (kotlin && !psiClass.getPsiClass().isEnum()) {
return;
}
for (final PsiField field : psiClass.getPsiClass().getAllFields()) {
addTask(field, new RunOnce() {
@Override
@@ -20,9 +20,6 @@ import com.intellij.psi.PsiPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.java.PsiClassFinder;
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.JAVA;
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN;
public final class PackagePsiDeclarationProviderImpl extends PsiDeclarationProviderBase implements PackagePsiDeclarationProvider {
@NotNull
@@ -48,12 +45,6 @@ public final class PackagePsiDeclarationProviderImpl extends PsiDeclarationProvi
@NotNull
@Override
protected MembersCache buildMembersCache() {
return MembersCache.buildMembersByNameCache(new MembersCache(), psiClassFinder, null, getPsiPackage(), true, getDeclarationOrigin() == KOTLIN);
}
@NotNull
@Override
public DeclarationOrigin getDeclarationOrigin() {
return JAVA;
return MembersCache.buildMembersByNameCache(new MembersCache(), psiClassFinder, null, getPsiPackage(), true);
}
}
@@ -22,7 +22,4 @@ public interface PsiDeclarationProvider {
@NotNull
MembersCache getMembersCache();
@NotNull
DeclarationOrigin getDeclarationOrigin();
}
@@ -289,7 +289,7 @@ public final class JavaClassResolver {
// TODO: ugly hack: tests crash if initializeTypeParameters called with class containing proper supertypes
List<TypeParameterDescriptor> classTypeParameters = classDescriptor.getTypeConstructor().getParameters();
supertypes.addAll(supertypesResolver.getSupertypes(classDescriptor, new PsiClassWrapper(psiClass), classData, classTypeParameters));
supertypes.addAll(supertypesResolver.getSupertypes(classDescriptor, new PsiClassWrapper(psiClass), classTypeParameters));
if (psiClass.isEnum()) {
ClassDescriptorFromJvmBytecode classObjectDescriptor = createClassObjectDescriptorForEnum(classDescriptor, psiClass);
@@ -34,7 +34,9 @@ import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.resolve.java.descriptor.ClassDescriptorFromJvmBytecode;
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.AlternativeMethodSignatureData;
import org.jetbrains.jet.lang.resolve.java.kotlinSignature.SignaturesPropagationData;
import org.jetbrains.jet.lang.resolve.java.provider.*;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.provider.NamedMembers;
import org.jetbrains.jet.lang.resolve.java.provider.PackagePsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
@@ -49,8 +51,6 @@ import java.util.Set;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*;
import static org.jetbrains.jet.lang.resolve.OverridingUtil.*;
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.JAVA;
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN;
import static org.jetbrains.jet.lang.resolve.java.sam.SingleAbstractMethodUtils.*;
public final class JavaFunctionResolver {
@@ -97,13 +97,13 @@ public final class JavaFunctionResolver {
) {
PsiClass containingClass = method.getPsiMethod().getContainingClass();
assert containingClass != null : "containing class is null for " + method;
return resolveMethodToFunctionDescriptor(containingClass, method, DeclarationOrigin.JAVA, ownerDescriptor, false);
return resolveMethodToFunctionDescriptor(containingClass, method, ownerDescriptor, false);
}
@Nullable
private SimpleFunctionDescriptor resolveMethodToFunctionDescriptor(
@NotNull PsiClass psiClass, PsiMethodWrapper method,
@NotNull DeclarationOrigin declarationOrigin, @NotNull ClassOrNamespaceDescriptor ownerDescriptor, boolean record
@NotNull ClassOrNamespaceDescriptor ownerDescriptor, boolean record
) {
if (!DescriptorResolverUtils.isCorrectOwnerForEnumMember(ownerDescriptor, method.getPsiMember())) {
return null;
@@ -116,14 +116,6 @@ public final class JavaFunctionResolver {
PsiMethod psiMethod = method.getPsiMethod();
PsiClass containingClass = psiMethod.getContainingClass();
if (declarationOrigin == KOTLIN) {
// TODO: unless maybe class explicitly extends Object
assert containingClass != null;
String ownerClassName = containingClass.getQualifiedName();
if (DescriptorResolverUtils.OBJECT_FQ_NAME.asString().equals(ownerClassName)) {
return null;
}
}
if (trace.get(BindingContext.FUNCTION, psiMethod) != null) {
return trace.get(BindingContext.FUNCTION, psiMethod);
@@ -195,7 +187,7 @@ public final class JavaFunctionResolver {
BindingContextUtils.recordFunctionDeclarationToDescriptor(trace, psiMethod, functionDescriptorImpl);
}
if (declarationOrigin == JAVA && record) {
if (record) {
trace.record(JavaBindingContext.IS_DECLARED_IN_JAVA, functionDescriptorImpl);
}
@@ -260,7 +252,7 @@ public final class JavaFunctionResolver {
@NotNull
private Set<FunctionDescriptor> resolveNamedGroupFunctions(
@NotNull ClassOrNamespaceDescriptor owner, @NotNull PsiClass psiClass,
NamedMembers namedMembers, Name methodName, PsiDeclarationProvider scopeData
NamedMembers namedMembers, Name methodName
) {
Set<SimpleFunctionDescriptor> functionsFromSupertypes = null;
@@ -271,7 +263,7 @@ public final class JavaFunctionResolver {
Set<SimpleFunctionDescriptor> functionsFromCurrent = Sets.newHashSet();
for (PsiMethodWrapper method : namedMembers.getMethods()) {
SimpleFunctionDescriptor function =
resolveMethodToFunctionDescriptor(psiClass, method, scopeData.getDeclarationOrigin(), owner, true);
resolveMethodToFunctionDescriptor(psiClass, method, owner, true);
if (function != null) {
functionsFromCurrent.add(function);
ContainerUtil.addIfNotNull(functionsFromCurrent, resolveSamAdapter(function));
@@ -393,7 +385,7 @@ public final class JavaFunctionResolver {
return Collections.emptySet();
}
PsiClass psiClass = scopeData.getPsiClass();
return resolveNamedGroupFunctions(ownerDescriptor, psiClass, namedMembers, methodName, scopeData);
return resolveNamedGroupFunctions(ownerDescriptor, psiClass, namedMembers, methodName);
}
@NotNull
@@ -41,8 +41,6 @@ import org.jetbrains.jet.lang.types.TypeUtils;
import javax.inject.Inject;
import java.util.*;
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.JAVA;
//TODO: getters and setter are not working
public final class JavaPropertyResolver {
@@ -85,14 +83,13 @@ public final class JavaPropertyResolver {
return Collections.emptySet();
}
return resolveNamedGroupProperties(ownerDescriptor, scopeData, namedMembers, fieldName,
return resolveNamedGroupProperties(ownerDescriptor, namedMembers, fieldName,
"class or namespace " + DescriptorUtils.getFQName(ownerDescriptor));
}
@NotNull
private Set<VariableDescriptor> resolveNamedGroupProperties(
@NotNull ClassOrNamespaceDescriptor ownerDescriptor,
@NotNull PsiDeclarationProvider scopeData,
@NotNull NamedMembers namedMembers,
@NotNull Name propertyName,
@NotNull String context
@@ -116,7 +113,7 @@ public final class JavaPropertyResolver {
continue;
}
propertiesFromCurrent.add(resolveProperty(ownerDescriptor, scopeData, propertyName, context, propertyPsiData));
propertiesFromCurrent.add(resolveProperty(ownerDescriptor, propertyName, context, propertyPsiData));
}
Set<PropertyDescriptor> propertiesFromSupertypes = getPropertiesFromSupertypes(propertyName, ownerDescriptor);
@@ -163,12 +160,10 @@ public final class JavaPropertyResolver {
@NotNull
private PropertyDescriptor resolveProperty(
@NotNull ClassOrNamespaceDescriptor owner,
@NotNull PsiDeclarationProvider scopeData,
@NotNull Name propertyName,
@NotNull String context,
@NotNull PropertyPsiData psiData
) {
boolean isFinal = isPropertyFinal(scopeData, psiData);
boolean isVar = psiData.isVar();
PropertyPsiDataElement characteristicMember = psiData.getCharacteristicMember();
@@ -182,7 +177,7 @@ public final class JavaPropertyResolver {
}
PropertyDescriptorImpl propertyDescriptor =
createPropertyDescriptor(owner, propertyName, psiData, isFinal, isVar, visibility, kind);
createPropertyDescriptor(owner, propertyName, psiData, true, isVar, visibility, kind);
PropertyGetterDescriptorImpl getterDescriptor = resolveGetter(visibility, kind, getter, propertyDescriptor);
PropertySetterDescriptorImpl setterDescriptor = resolveSetter(psiData, kind, propertyDescriptor);
@@ -206,12 +201,9 @@ public final class JavaPropertyResolver {
receiverType
);
initializeSetterAndGetter(propertyDescriptor, getterDescriptor, setterDescriptor, propertyType, psiData);
trace.record(BindingContext.VARIABLE, psiData.getCharacteristicPsi(), propertyDescriptor);
if (scopeData.getDeclarationOrigin() == JAVA) {
trace.record(JavaBindingContext.IS_DECLARED_IN_JAVA, propertyDescriptor);
}
trace.record(JavaBindingContext.IS_DECLARED_IN_JAVA, propertyDescriptor);
if (AnnotationUtils.isPropertyAcceptableAsAnnotationParameter(propertyDescriptor) && psiData.getCharacteristicPsi() instanceof PsiField) {
PsiExpression initializer = ((PsiField) psiData.getCharacteristicPsi()).getInitializer();
@@ -442,13 +434,6 @@ public final class JavaPropertyResolver {
return regularPropertiesCount;
}
private static boolean isPropertyFinal(PsiDeclarationProvider scopeData, PropertyPsiData psiData) {
if (scopeData.getDeclarationOrigin() == JAVA) {
return true;
}
return psiData.isFinal();
}
@NotNull
private static Set<PropertyDescriptor> getPropertiesFromSupertypes(
@NotNull Name propertyName, @NotNull ClassOrNamespaceDescriptor ownerDescriptor
@@ -26,7 +26,6 @@ import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.java.*;
import org.jetbrains.jet.lang.resolve.java.provider.ClassPsiDeclarationProvider;
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiClassWrapper;
import org.jetbrains.jet.lang.types.ErrorUtils;
import org.jetbrains.jet.lang.types.JetType;
@@ -38,8 +37,6 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static org.jetbrains.jet.lang.resolve.java.provider.DeclarationOrigin.KOTLIN;
public final class JavaSupertypeResolver {
private BindingTrace trace;
@@ -64,7 +61,6 @@ public final class JavaSupertypeResolver {
public Collection<JetType> getSupertypes(
@NotNull ClassDescriptor classDescriptor,
@NotNull PsiClassWrapper psiClass,
@NotNull ClassPsiDeclarationProvider classData,
@NotNull List<TypeParameterDescriptor> typeParameters
) {
@@ -80,20 +76,17 @@ public final class JavaSupertypeResolver {
reportIncompleteHierarchyForErrorTypes(classDescriptor, result);
if (result.isEmpty()) {
addBaseClass(psiClass, classData, classDescriptor, result);
addBaseClass(psiClass, classDescriptor, result);
}
return result;
}
private void addBaseClass(
@NotNull PsiClassWrapper psiClass,
@NotNull ClassPsiDeclarationProvider classData,
@NotNull ClassDescriptor classDescriptor,
@NotNull List<JetType> result
) {
if (classData.getDeclarationOrigin() == KOTLIN
|| DescriptorResolverUtils.OBJECT_FQ_NAME.equalsTo(psiClass.getQualifiedName())
// TODO: annotations
if (DescriptorResolverUtils.OBJECT_FQ_NAME.equalsTo(psiClass.getQualifiedName())
|| classDescriptor.getKind() == ClassKind.ANNOTATION_CLASS) {
result.add(KotlinBuiltIns.getInstance().getAnyType());
}
@@ -69,15 +69,18 @@ public final class PropertyPsiData {
}
private static void checkDuplicatePropertyComponent(
@NotNull PropertyPsiDataElement checked, @NotNull String componentTypeName, @Nullable PropertyPsiDataElement existent) {
@NotNull PropertyPsiDataElement checked, @NotNull String componentTypeName, @Nullable PropertyPsiDataElement existent
) {
if (existent != null) {
PsiClass checkedElementClass = checked.getMember().getPsiMember().getContainingClass();
PsiClass existentElementClass = existent.getMember().getPsiMember().getContainingClass();
throw new IllegalStateException(
String.format("Psi element '%s' in class '%s' overwrites '%s' in class '%s' while generating %s component for property",
checked.getMember().getPsiMember(), checkedElementClass != null ? checkedElementClass.getQualifiedName() : "<no-class>",
existent.getMember().getPsiMember(), existentElementClass != null ? existentElementClass.getQualifiedName() : "<no-class>",
checked.getMember().getPsiMember(),
checkedElementClass != null ? checkedElementClass.getQualifiedName() : "<no-class>",
existent.getMember().getPsiMember(),
existentElementClass != null ? existentElementClass.getQualifiedName() : "<no-class>",
componentTypeName));
}
}
@@ -194,15 +197,4 @@ public final class PropertyPsiData {
public boolean isPropertyForNamedObject() {
return field != null && JvmAbi.INSTANCE_FIELD.equals(field.getMember().getName());
}
public boolean isFinal() {
if (getter != null) {
return getter.getMember().isFinal();
}
if (setter != null) {
return setter.getMember().isFinal();
}
assert field != null : "Property with no getter and no setter should at least have a backing field";
return field.getMember().isFinal();
}
}