Use module instead of trace in light class search
Fixes weird and infrequent compilation errors in KotlinLightClassForPackage.kt
This commit is contained in:
+31
-24
@@ -17,6 +17,7 @@
|
|||||||
package org.jetbrains.kotlin.cli.jvm.compiler;
|
package org.jetbrains.kotlin.cli.jvm.compiler;
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
|
import com.google.common.base.Predicates;
|
||||||
import com.google.common.collect.Collections2;
|
import com.google.common.collect.Collections2;
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
import com.intellij.psi.PsiClass;
|
import com.intellij.psi.PsiClass;
|
||||||
@@ -44,6 +45,7 @@ import org.jetbrains.kotlin.name.FqName;
|
|||||||
import org.jetbrains.kotlin.psi.*;
|
import org.jetbrains.kotlin.psi.*;
|
||||||
import org.jetbrains.kotlin.resolve.*;
|
import org.jetbrains.kotlin.resolve.*;
|
||||||
import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer;
|
import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer;
|
||||||
|
import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter;
|
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.JetScope;
|
import org.jetbrains.kotlin.resolve.scopes.JetScope;
|
||||||
import org.jetbrains.kotlin.util.slicedMap.ReadOnlySlice;
|
import org.jetbrains.kotlin.util.slicedMap.ReadOnlySlice;
|
||||||
@@ -118,34 +120,39 @@ public class CliLightClassGenerationSupport extends LightClassGenerationSupport
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Collection<JetClassOrObject> findClassOrObjectDeclarations(@NotNull FqName fqName, @NotNull GlobalSearchScope searchScope) {
|
public Collection<JetClassOrObject> findClassOrObjectDeclarations(@NotNull FqName fqName, @NotNull final GlobalSearchScope searchScope) {
|
||||||
ClassDescriptor classDescriptor = getBindingContext().get(BindingContext.FQNAME_TO_CLASS_DESCRIPTOR, fqName.toUnsafe());
|
|
||||||
if (classDescriptor != null) {
|
|
||||||
PsiElement element = DescriptorToSourceUtils.classDescriptorToDeclaration(classDescriptor);
|
|
||||||
if (element != null && PsiSearchScopeUtil.isInScope(searchScope, element)) {
|
|
||||||
return Collections.singletonList((JetClassOrObject) element);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (JvmAbi.isClassObjectFqName(fqName)) {
|
if (JvmAbi.isClassObjectFqName(fqName)) {
|
||||||
Collection<JetClassOrObject> parentClasses = findClassOrObjectDeclarations(fqName.parent(), searchScope);
|
Collection<JetClassOrObject> parentClasses = findClassOrObjectDeclarations(fqName.parent(), searchScope);
|
||||||
return ContainerUtil.mapNotNull(parentClasses,
|
return ContainerUtil.mapNotNull(
|
||||||
new Function<JetClassOrObject, JetClassOrObject>() {
|
parentClasses,
|
||||||
@Override
|
new Function<JetClassOrObject, JetClassOrObject>() {
|
||||||
public JetClassOrObject fun(JetClassOrObject classOrObject) {
|
@Override
|
||||||
if (classOrObject instanceof JetClass) {
|
public JetClassOrObject fun(JetClassOrObject classOrObject) {
|
||||||
JetClass jetClass = (JetClass) classOrObject;
|
if (classOrObject instanceof JetClass) {
|
||||||
JetClassObject classObject = jetClass.getClassObject();
|
JetClassObject classObject = ((JetClass) classOrObject).getClassObject();
|
||||||
if (classObject != null) {
|
if (classObject != null) {
|
||||||
return classObject.getObjectDeclaration();
|
return classObject.getObjectDeclaration();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Collections.emptyList();
|
Collection<ClassDescriptor> classDescriptors =
|
||||||
|
ResolveSessionUtils.getClassOrObjectDescriptorsByFqName(getModule(), fqName, Predicates.<ClassDescriptor>alwaysTrue());
|
||||||
|
|
||||||
|
return ContainerUtil.mapNotNull(classDescriptors, new Function<ClassDescriptor, JetClassOrObject>() {
|
||||||
|
@Override
|
||||||
|
public JetClassOrObject fun(ClassDescriptor descriptor) {
|
||||||
|
PsiElement element = DescriptorToSourceUtils.classDescriptorToDeclaration(descriptor);
|
||||||
|
if (element instanceof JetClassOrObject && PsiSearchScopeUtil.isInScope(searchScope, element)) {
|
||||||
|
return (JetClassOrObject) element;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
Reference in New Issue
Block a user