Top-down analysis accounts for script classes too

This commit is contained in:
Andrey Breslav
2014-04-01 20:15:25 +04:00
parent 0f422df98f
commit 98e6b7ddbe
3 changed files with 20 additions and 3 deletions
@@ -74,7 +74,7 @@ public class OverrideResolver {
* Generate fake overrides and add overridden descriptors to existing descriptors.
*/
private void generateOverridesAndDelegation(@NotNull TopDownAnalysisContext c) {
Set<ClassDescriptorWithResolutionScopes> ourClasses = new HashSet<ClassDescriptorWithResolutionScopes>(c.getClasses().values());
Set<ClassDescriptorWithResolutionScopes> ourClasses = new HashSet<ClassDescriptorWithResolutionScopes>(c.getAllClasses());
Set<ClassifierDescriptor> processed = new HashSet<ClassifierDescriptor>();
for (MutableClassDescriptorLite klass : ContainerUtil.reverse(c.getClassesTopologicalOrder())) {
@@ -21,6 +21,8 @@ import com.google.common.base.Functions;
import com.google.common.collect.Maps;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import kotlin.Function1;
import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptorLite;
@@ -198,4 +200,19 @@ public class TopDownAnalysisContext implements BodiesResolveContext {
public void setOuterDataFlowInfo(@NotNull DataFlowInfo outerDataFlowInfo) {
this.outerDataFlowInfo = outerDataFlowInfo;
}
@NotNull
public Collection<ClassDescriptorWithResolutionScopes> getAllClasses() {
// SCRIPT: all classes are declared classes + script classes
Collection<ClassDescriptorWithResolutionScopes> scriptClasses = KotlinPackage.map(
getScripts().values(),
new Function1<ScriptDescriptor, ClassDescriptorWithResolutionScopes>() {
@Override
public ClassDescriptorWithResolutionScopes invoke(ScriptDescriptor scriptDescriptor) {
return (ClassDescriptorWithResolutionScopes) scriptDescriptor.getClassDescriptor();
}
}
);
return KotlinPackage.plus(getClasses().values(), scriptClasses);
}
}
@@ -218,12 +218,12 @@ public class TypeHierarchyResolver {
}
}
private List<MutableClassDescriptorLite> topologicallySortClassesAndObjects(@NotNull TopDownAnalysisContext c) {
private static List<MutableClassDescriptorLite> topologicallySortClassesAndObjects(@NotNull TopDownAnalysisContext c) {
// A topsort is needed only for better diagnostics:
// edges that get removed to disconnect loops are more reasonable in this case
//noinspection unchecked
return DFS.topologicalOrder(
(Iterable) c.getClasses().values(),
(Iterable) c.getAllClasses(),
new DFS.Neighbors<MutableClassDescriptorLite>() {
@NotNull
@Override