Support for properties defined by object declarations

This commit is contained in:
Andrey Breslav
2012-06-13 20:34:00 +04:00
parent acc658e9c1
commit bcb93751ae
3 changed files with 25 additions and 3 deletions
@@ -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;
}
}