Top-down analysis accounts for script classes too
This commit is contained in:
@@ -74,7 +74,7 @@ public class OverrideResolver {
|
|||||||
* Generate fake overrides and add overridden descriptors to existing descriptors.
|
* Generate fake overrides and add overridden descriptors to existing descriptors.
|
||||||
*/
|
*/
|
||||||
private void generateOverridesAndDelegation(@NotNull TopDownAnalysisContext c) {
|
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>();
|
Set<ClassifierDescriptor> processed = new HashSet<ClassifierDescriptor>();
|
||||||
|
|
||||||
for (MutableClassDescriptorLite klass : ContainerUtil.reverse(c.getClassesTopologicalOrder())) {
|
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.google.common.collect.Maps;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import com.intellij.psi.PsiFile;
|
import com.intellij.psi.PsiFile;
|
||||||
|
import kotlin.Function1;
|
||||||
|
import kotlin.KotlinPackage;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptorLite;
|
import org.jetbrains.jet.lang.descriptors.impl.MutableClassDescriptorLite;
|
||||||
@@ -198,4 +200,19 @@ public class TopDownAnalysisContext implements BodiesResolveContext {
|
|||||||
public void setOuterDataFlowInfo(@NotNull DataFlowInfo outerDataFlowInfo) {
|
public void setOuterDataFlowInfo(@NotNull DataFlowInfo outerDataFlowInfo) {
|
||||||
this.outerDataFlowInfo = 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:
|
// A topsort is needed only for better diagnostics:
|
||||||
// edges that get removed to disconnect loops are more reasonable in this case
|
// edges that get removed to disconnect loops are more reasonable in this case
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
return DFS.topologicalOrder(
|
return DFS.topologicalOrder(
|
||||||
(Iterable) c.getClasses().values(),
|
(Iterable) c.getAllClasses(),
|
||||||
new DFS.Neighbors<MutableClassDescriptorLite>() {
|
new DFS.Neighbors<MutableClassDescriptorLite>() {
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user