Support for properties defined by object declarations
This commit is contained in:
+10
@@ -141,6 +141,16 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
|
||||
resolveSession.getTrace()));
|
||||
}
|
||||
|
||||
// Objects are also properties
|
||||
JetClassOrObject classOrObjectDeclaration = declarationProvider.getClassOrObjectDeclaration(name);
|
||||
if (classOrObjectDeclaration instanceof JetObjectDeclaration) {
|
||||
JetObjectDeclaration objectDeclaration = (JetObjectDeclaration) classOrObjectDeclaration;
|
||||
ClassDescriptor classifier = (ClassDescriptor) getClassifier(name);
|
||||
VariableDescriptor propertyDescriptor = resolveSession.getInjector().getDescriptorResolver()
|
||||
.resolveObjectDeclaration(thisDescriptor, objectDeclaration, classifier, resolveSession.getTrace());
|
||||
result.add(propertyDescriptor);
|
||||
}
|
||||
|
||||
getNonDeclaredProperties(name, result);
|
||||
|
||||
if (!result.isEmpty()) {
|
||||
|
||||
@@ -112,7 +112,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
|
||||
JetClass jetClass = (JetClass) classOrObject;
|
||||
|
||||
for (JetParameter parameter : jetClass.getPrimaryConstructorParameters()) {
|
||||
if (parameter.getValOrVarNode() != null) {
|
||||
if (parameter.getValOrVarNode() != null && name.equals(parameter.getNameAsName())) {
|
||||
PropertyDescriptor propertyDescriptor =
|
||||
resolveSession.getInjector().getDescriptorResolver().resolvePrimaryConstructorParameterToAProperty(
|
||||
thisDescriptor,
|
||||
|
||||
@@ -67,7 +67,7 @@ public class ResolveSession {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public InjectorForLazyResolve getInjector() {
|
||||
/*package*/ InjectorForLazyResolve getInjector() {
|
||||
return injector;
|
||||
}
|
||||
|
||||
@@ -159,7 +159,7 @@ public class ResolveSession {
|
||||
|
||||
@NotNull
|
||||
public DeclarationDescriptor resolveToDescriptor(JetDeclaration declaration) {
|
||||
return declaration.accept(new JetVisitor<DeclarationDescriptor, Void>() {
|
||||
DeclarationDescriptor result = declaration.accept(new JetVisitor<DeclarationDescriptor, Void>() {
|
||||
@Override
|
||||
public DeclarationDescriptor visitClass(JetClass klass, Void data) {
|
||||
return getClassDescriptor(klass);
|
||||
@@ -238,10 +238,22 @@ public class ResolveSession {
|
||||
return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, property);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DeclarationDescriptor visitObjectDeclarationName(JetObjectDeclarationName declarationName, Void data) {
|
||||
JetScope scopeForDeclaration = getInjector().getScopeProvider().getResolutionScopeForDeclaration(
|
||||
(JetDeclaration) declarationName.getParent());
|
||||
scopeForDeclaration.getProperties(declarationName.getNameAsName());
|
||||
return getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, declarationName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public DeclarationDescriptor visitJetElement(JetElement element, Void data) {
|
||||
throw new IllegalArgumentException("Unsupported declaration type: " + element + " " + element.getText());
|
||||
}
|
||||
}, null);
|
||||
if (result == null) {
|
||||
throw new IllegalStateException("No descriptor resolevd for " + declaration + " " + declaration.getText());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user