KT-1973 Loading object declarations from compiled classes.
#KT-1973 in progress
This commit is contained in:
+14
-6
@@ -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));
|
||||
|
||||
+21
-10
@@ -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;
|
||||
|
||||
+30
-16
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+1
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user