KT-1973 Loading object declarations from compiled classes.

#KT-1973 in progress
This commit is contained in:
Evgeny Gerashchenko
2012-10-03 23:02:51 +04:00
parent 998095c55c
commit f33669bc83
4 changed files with 66 additions and 34 deletions
@@ -116,10 +116,11 @@ public final class JavaDescriptorPropertiesResolver {
DeclarationDescriptor realOwner = getRealOwner(owner, scopeData, characteristicMember.getMember().isStatic());
boolean isEnumEntry = DescriptorUtils.isEnumClassObject(realOwner);
boolean isPropertyForNamedObject = members.field != null && JvmAbi.INSTANCE_FIELD.equals(members.field.getMember().getName());
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
realOwner,
javaDescriptorResolver.resolveAnnotations(characteristicMember.getMember().getPsiMember()),
JavaDescriptorResolver.resolveModality(characteristicMember.getMember(), isFinal || isEnumEntry),
JavaDescriptorResolver.resolveModality(characteristicMember.getMember(), isFinal || isEnumEntry || isPropertyForNamedObject),
visibility,
isVar,
propertyName,
@@ -206,6 +207,16 @@ public final class JavaDescriptorPropertiesResolver {
trace.record(BindingContext.VARIABLE, characteristicMember.getMember().getPsiMember(), propertyDescriptor);
}
if (isPropertyForNamedObject) {
ClassDescriptor objectDescriptor = (ClassDescriptor) propertyType.getConstructor().getDeclarationDescriptor();
assert objectDescriptor.getKind() == ClassKind.OBJECT;
assert objectDescriptor.getContainingDeclaration() == realOwner;
trace.record(BindingContext.OBJECT_DECLARATION_CLASS, propertyDescriptor, objectDescriptor);
}
propertiesFromCurrent.add(propertyDescriptor);
}
@@ -377,11 +388,8 @@ public final class JavaDescriptorPropertiesResolver {
@NotNull ResolverScopeData scopeData,
boolean isStatic
) {
final PsiClass psiClass = scopeData.getPsiClass();
assert psiClass != null;
boolean isEnum = psiClass.isEnum();
if (isEnum && isStatic) {
PsiClass psiClass = scopeData.getPsiClass();
if (psiClass != null && psiClass.isEnum() && isStatic) {
final String qualifiedName = psiClass.getQualifiedName();
assert qualifiedName != null;
final ClassDescriptor classDescriptor = javaDescriptorResolver.resolveClass(new FqName(qualifiedName));
@@ -230,7 +230,8 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
checkPsiClassIsNotJet(psiClass);
Name name = Name.identifier(psiClass.getName());
ClassKind kind = psiClass.isInterface() ? (psiClass.isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT) : (psiClass.isEnum() ? ClassKind.ENUM_CLASS : ClassKind.CLASS);
JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass);
ClassKind kind = getClassKind(psiClass, jetClassAnnotation);
ClassOrNamespaceDescriptor containingDeclaration = resolveParentDescriptor(psiClass);
// class may be resolved during resolution of parent
@@ -257,7 +258,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
classData.getClassDescriptor().setTypeParameterDescriptors(typeParameters);
classData.getClassDescriptor().setSupertypes(supertypes);
classData.getClassDescriptor().setVisibility(resolveVisibility(psiClass, JetClassAnnotation.get(psiClass)));
classData.getClassDescriptor().setVisibility(resolveVisibility(psiClass, jetClassAnnotation));
Modality modality;
if (classData.getClassDescriptor().getKind() == ClassKind.ANNOTATION_CLASS) {
modality = Modality.FINAL;
@@ -289,6 +290,20 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
return classData;
}
private static ClassKind getClassKind(@NotNull PsiClass psiClass, @NotNull JetClassAnnotation jetClassAnnotation) {
if (psiClass.isInterface()) {
return (psiClass.isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT);
}
else {
if (psiClass.isEnum()) {
return ClassKind.ENUM_CLASS;
}
else {
return jetClassAnnotation.kind() == JvmStdlibNames.FLAG_CLASS_KIND_OBJECT ? ClassKind.OBJECT : ClassKind.CLASS;
}
}
}
@NotNull
public Collection<ConstructorDescriptor> resolveConstructors(@NotNull ResolverClassData classData) {
Collection<ConstructorDescriptor> constructors = Lists.newArrayList();
@@ -892,11 +907,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
public Set<VariableDescriptor> resolveFieldGroupByName(@NotNull Name fieldName, @NotNull ResolverScopeData scopeData) {
final PsiClass psiClass = scopeData.getPsiClass();
if (psiClass == null) {
return Collections.emptySet();
}
PsiClass psiClass = scopeData.getPsiClass();
getResolverScopeData(scopeData);
NamedMembers namedMembers = scopeData.getNamedMembersMap().get(fieldName);
@@ -904,9 +915,9 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
return Collections.emptySet();
}
final String qualifiedName = psiClass.getQualifiedName();
javaDescriptorPropertiesResolver.resolveNamedGroupProperties(
scopeData.getClassOrNamespaceDescriptor(), scopeData, namedMembers, fieldName,
//noinspection ConstantConditions
String qualifiedName = psiClass == null ? scopeData.getPsiPackage().getQualifiedName() : psiClass.getQualifiedName();
javaDescriptorPropertiesResolver.resolveNamedGroupProperties(scopeData.getClassOrNamespaceDescriptor(), scopeData, namedMembers, fieldName,
"class or namespace " + qualifiedName);
return namedMembers.propertyDescriptors;
@@ -16,9 +16,7 @@
package org.jetbrains.jet.lang.resolve.java;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiType;
import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolveData.ResolverScopeData;
import org.jetbrains.jet.lang.resolve.java.prop.PropertyNameUtils;
@@ -26,7 +24,6 @@ import org.jetbrains.jet.lang.resolve.java.prop.PropertyParseResult;
import org.jetbrains.jet.lang.resolve.java.wrapper.*;
import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@@ -39,20 +36,27 @@ class JavaDescriptorResolverHelper {
private static class Builder {
private final PsiClassWrapper psiClass;
private final PsiPackage psiPackage;
private final boolean staticMembers;
private final boolean kotlin;
private final Map<Name, NamedMembers> namedMembersMap = new HashMap<Name, NamedMembers>();
private Builder(PsiClassWrapper psiClass, boolean staticMembers, boolean kotlin) {
private Builder(PsiClassWrapper psiClass, PsiPackage psiPackage, boolean staticMembers, boolean kotlin) {
this.psiClass = psiClass;
this.psiPackage = psiPackage;
this.staticMembers = staticMembers;
this.kotlin = kotlin;
}
public void run() {
processFields();
processMethods();
if (psiClass != null) {
processFields();
processMethods();
}
if (psiPackage != null) {
processNeighborClasses();
}
}
private NamedMembers getNamedMembers(Name name) {
@@ -204,20 +208,30 @@ class JavaDescriptorResolverHelper {
}
}
}
private void processNeighborClasses() {
for (PsiClass neighborPsiClass : psiPackage.getClasses()) {
if (!neighborPsiClass.isPhysical()) { // to filter out JetLightClasses
continue;
}
PsiField instanceField = neighborPsiClass.findFieldByName(JvmAbi.INSTANCE_FIELD, false);
if (instanceField != null) {
NamedMembers namedMembers = getNamedMembers(Name.identifier(neighborPsiClass.getName()));
TypeSource type = new TypeSource("", instanceField.getType(), instanceField);
namedMembers.addPropertyAccessor(new PropertyAccessorData(new PsiFieldWrapper(instanceField), type, null));
}
}
}
}
@NotNull
static Map<Name, NamedMembers> getNamedMembers(@NotNull ResolverScopeData resolverScopeData) {
if (resolverScopeData.getPsiClass() != null) {
@SuppressWarnings("ConstantConditions")
Builder builder = new Builder(new PsiClassWrapper(resolverScopeData.getPsiClass()), resolverScopeData.isStaticMembers(), resolverScopeData.isKotlin());
builder.run();
return builder.namedMembersMap;
}
else {
return Collections.emptyMap();
}
PsiClassWrapper aClass = resolverScopeData.getPsiClass() != null ? new PsiClassWrapper(resolverScopeData.getPsiClass()) : null;
Builder builder = new Builder(aClass, resolverScopeData.getPsiPackage(), resolverScopeData.isStaticMembers(), resolverScopeData.isKotlin());
builder.run();
return builder.namedMembersMap;
}
@@ -53,8 +53,7 @@ public class JavaPackageScope extends JavaClassOrPackageScope {
@Override
public ClassDescriptor getObjectDescriptor(@NotNull Name name) {
// TODO
return null;
return semanticServices.getDescriptorResolver().resolveClass(packageFQN.child(name), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
}
@Override