Support properties declared as primary constructor parameters

This commit is contained in:
Andrey Breslav
2012-06-13 13:22:09 +04:00
parent efb3df5ca2
commit 5e47b923b3
4 changed files with 43 additions and 10 deletions
@@ -186,7 +186,10 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
for (JetDeclaration declaration : declarationProvider.getAllDeclarations()) {
if (declaration instanceof JetClassOrObject) {
JetClassOrObject classOrObject = (JetClassOrObject) declaration;
getClassifier(classOrObject.getNameAsName());
Name name = classOrObject.getNameAsName();
if (name != null) {
getClassifier(name);
}
}
else if (declaration instanceof JetFunction) {
JetFunction function = (JetFunction) declaration;
@@ -196,6 +199,13 @@ public abstract class AbstractLazyMemberScope<D extends DeclarationDescriptor, D
JetProperty property = (JetProperty) declaration;
getProperties(property.getNameAsSafeName());
}
else if (declaration instanceof JetParameter) {
JetParameter parameter = (JetParameter) declaration;
Name name = parameter.getNameAsName();
if (name != null) {
getProperties(name);
}
}
else {
throw new IllegalArgumentException("Unsupported declaration kind: " + declaration);
}
@@ -21,10 +21,7 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetNamedFunction;
import org.jetbrains.jet.lang.psi.JetProperty;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.name.Name;
import java.util.List;
@@ -64,6 +61,9 @@ public abstract class AbstractPsiBasedDeclarationProvider implements Declaration
JetClassOrObject classOrObject = (JetClassOrObject) declaration;
classesAndObjects.put(classOrObject.getNameAsName(), classOrObject);
}
else if (declaration instanceof JetParameter) {
// Do nothing, just put it into allDeclarations is enough
}
else {
throw new IllegalArgumentException("Unknown declaration: " + declaration);
}
@@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.diagnostics.Errors;
import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetParameter;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
@@ -104,10 +105,25 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope<LazyClassDescr
}
@Override
@SuppressWarnings("unchecked")
protected void getNonDeclaredProperties(@NotNull Name name, @NotNull final Set<VariableDescriptor> result) {
System.err.println("Parameter of the primary constructor");
JetClassOrObject classOrObject = declarationProvider.getOwnerClassOrObject();
if (classOrObject instanceof JetClass) {
JetClass jetClass = (JetClass) classOrObject;
for (JetParameter parameter : jetClass.getPrimaryConstructorParameters()) {
if (parameter.getValOrVarNode() != null) {
PropertyDescriptor propertyDescriptor =
resolveSession.getInjector().getDescriptorResolver().resolvePrimaryConstructorParameterToAProperty(
thisDescriptor,
thisDescriptor.getScopeForClassHeaderResolution(),
parameter, resolveSession.getTrace()
);
result.add(propertyDescriptor);
}
}
}
// Inherited fake overrides
Collection<PropertyDescriptor> fromSupertypes = Lists.newArrayList();
for (JetType supertype : thisDescriptor.getTypeConstructor().getSupertypes()) {
fromSupertypes.addAll((Set) supertype.getMemberScope().getProperties(name));
@@ -17,9 +17,7 @@
package org.jetbrains.jet.lang.resolve.lazy;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetClassObject;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.*;
/**
* @author abreslav
@@ -49,6 +47,15 @@ public class PsiBasedClassMemberDeclarationProvider extends AbstractPsiBasedDecl
putToIndex(declaration);
}
}
if (classOrObject instanceof JetClass) {
JetClass jetClass = (JetClass) classOrObject;
for (JetParameter parameter : jetClass.getPrimaryConstructorParameters()) {
if (parameter.getValOrVarNode() != null) {
putToIndex(parameter);
}
}
}
}
@Override