Supported multi-reference in imports (SAM interfaces are resolved as both functions and classes).

This commit is contained in:
Evgeny Gerashchenko
2013-03-27 18:21:03 +04:00
parent 8130c813e9
commit cadb9bcb8f
@@ -87,14 +87,15 @@ public class MapPlatformClassToKotlinFix extends JetIntentionAction<JetReference
if (diagnostic.getFactory() != Errors.PLATFORM_CLASS_MAPPED_TO_KOTLIN) continue;
JetReferenceExpression refExpr = getImportOrUsageFromDiagnostic(diagnostic);
if (refExpr == null) continue;
DeclarationDescriptor descriptor = context.get(BindingContext.REFERENCE_TARGET, refExpr);
ClassDescriptor descriptor = resolveToClass(refExpr, context);
if (descriptor == null || !(descriptor.equals(platformClass))) continue;
JetImportDirective imp = PsiTreeUtil.getParentOfType(refExpr, JetImportDirective.class);
if (imp == null) {
JetUserType type = PsiTreeUtil.getParentOfType(refExpr, JetUserType.class);
if (type == null) continue;
usages.add(type);
} else {
}
else {
imports.add(imp);
}
}
@@ -193,9 +194,8 @@ public class MapPlatformClassToKotlinFix extends JetIntentionAction<JetReference
Project project = diagnostic.getPsiFile().getProject();
BindingContext context = KotlinCacheManager.getInstance(project).getDeclarationsFromProject().getBindingContext();
DeclarationDescriptor descriptor = context.get(BindingContext.REFERENCE_TARGET, typeExpr);
if (descriptor == null || !(descriptor instanceof ClassDescriptor)) return null;
ClassDescriptor platformClass = (ClassDescriptor) descriptor;
ClassDescriptor platformClass = resolveToClass(typeExpr, context);
if (platformClass == null) return null;
assert diagnostic.getFactory() == Errors.PLATFORM_CLASS_MAPPED_TO_KOTLIN;
@SuppressWarnings("unchecked")
@@ -206,4 +206,22 @@ public class MapPlatformClassToKotlinFix extends JetIntentionAction<JetReference
}
};
}
@Nullable
private static ClassDescriptor resolveToClass(@NotNull JetReferenceExpression referenceExpression, @NotNull BindingContext context) {
DeclarationDescriptor descriptor = context.get(BindingContext.REFERENCE_TARGET, referenceExpression);
Collection<? extends DeclarationDescriptor> ambiguousTargets =
context.get(BindingContext.AMBIGUOUS_REFERENCE_TARGET, referenceExpression);
if (descriptor instanceof ClassDescriptor) {
return (ClassDescriptor) descriptor;
}
else if (ambiguousTargets != null) {
for (DeclarationDescriptor target : ambiguousTargets) {
if (target instanceof ClassDescriptor) {
return (ClassDescriptor) target;
}
}
}
return null;
}
}