Add support of local classes/objects declared in class constructor parameters

This commit is contained in:
Alexey Sedunov
2013-12-20 17:35:46 +04:00
parent 34e80056eb
commit c20ee310d0
3 changed files with 14 additions and 4 deletions
@@ -1006,7 +1006,7 @@ public class JetPsiUtil {
//noinspection unchecked
JetElement container = PsiTreeUtil.getParentOfType(
declaration,
JetBlockExpression.class, JetClassInitializer.class, JetProperty.class, JetFunction.class
JetBlockExpression.class, JetClassInitializer.class, JetProperty.class, JetFunction.class, JetParameter.class
);
if (container == null) return null;
@@ -39,6 +39,7 @@ import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.stubs.PsiClassHolderFileStub;
import com.intellij.psi.util.CachedValue;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.reference.SoftReference;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
@@ -106,9 +107,13 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC
//noinspection unchecked
PsiElement declaration = JetPsiUtil.getTopmostParentOfTypes(
classOrObject,
JetNamedFunction.class, JetProperty.class, JetClassInitializer.class
JetNamedFunction.class, JetProperty.class, JetClassInitializer.class, JetParameter.class
);
if (declaration instanceof JetParameter) {
declaration = PsiTreeUtil.getParentOfType(declaration, JetNamedDeclaration.class);
}
if (declaration instanceof JetNamedFunction) {
JetNamedFunction function = (JetNamedFunction) declaration;
return getParentByPsiMethod(LightClassUtil.getLightClassMethod(function), function.getName(), false);
@@ -128,6 +133,10 @@ public class KotlinLightClassForExplicitDeclaration extends KotlinWrappingLightC
return LightClassUtil.getPsiClass((JetClassOrObject) grandparent);
}
}
if (declaration instanceof JetClass) {
return LightClassUtil.getPsiClass((JetClass) declaration);
}
}
return classOrObject.getParent() == classOrObject.getContainingFile() ? getContainingFile() : getContainingClass();
@@ -88,6 +88,7 @@ public class ResolveElementCache {
JetNamedFunction.class,
JetClassInitializer.class,
JetProperty.class,
JetParameter.class,
JetDelegationSpecifierList.class,
JetImportDirective.class,
JetAnnotationEntry.class,
@@ -95,7 +96,7 @@ public class ResolveElementCache {
JetTypeConstraint.class,
JetNamespaceHeader.class);
if (elementOfAdditionalResolve != null) {
if (elementOfAdditionalResolve != null && !(elementOfAdditionalResolve instanceof JetParameter)) {
if (elementOfAdditionalResolve instanceof JetNamespaceHeader) {
elementOfAdditionalResolve = jetElement;
}
@@ -103,7 +104,7 @@ public class ResolveElementCache {
return additionalResolveCache.getValue().invoke(elementOfAdditionalResolve);
}
JetParameter parameter = PsiTreeUtil.getTopmostParentOfType(jetElement, JetParameter.class);
JetParameter parameter = (JetParameter) elementOfAdditionalResolve;
if (parameter != null) {
JetClass klass = PsiTreeUtil.getParentOfType(parameter, JetClass.class);
if (klass != null && parameter.getParent() == klass.getPrimaryConstructorParameterList()) {