[JVM] Don't analyze KtCodeFragment's file twice

We could get several files from the IDE to analyze. For example, some
code fragment and a file with context information. This additional
file, in fact, can be a file where a code fragment is defined, and we
can accidentally analyze a single file twice that leads to errors.
This commit is contained in:
Ivan Kylchik
2023-10-24 18:29:54 +02:00
committed by Space Team
parent d6f0530215
commit d7d42134df
@@ -30,6 +30,8 @@ import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments;
import org.jetbrains.org.objectweb.asm.Type; import org.jetbrains.org.objectweb.asm.Type;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.jetbrains.kotlin.resolve.BindingContext.*; import static org.jetbrains.kotlin.resolve.BindingContext.*;
@@ -96,15 +98,14 @@ public class CodegenBinding {
public static void initTrace(@NotNull GenerationState state, Collection<KtFile> files) { public static void initTrace(@NotNull GenerationState state, Collection<KtFile> files) {
CodegenAnnotatingVisitor visitor = new CodegenAnnotatingVisitor(state); CodegenAnnotatingVisitor visitor = new CodegenAnnotatingVisitor(state);
for (KtFile file : allFilesInPackages(state.getBindingContext(), files)) { Collection<KtFile> allFiles = allFilesInPackages(state.getBindingContext(), files);
file.accept(visitor); Stream<PsiFile> codeFragmentFiles = allFiles.stream()
if (file instanceof KtCodeFragment) { .filter(file -> file instanceof KtCodeFragment)
PsiFile contextFile = ((KtCodeFragment) file).getContextContainingFile(); .map(file -> {
if (contextFile != null) { PsiFile contextFile = ((KtCodeFragment) file).getContextContainingFile();
contextFile.accept(visitor); return contextFile != null ? contextFile : file;
} });
} Stream.concat(allFiles.stream(), codeFragmentFiles).distinct().forEach(file -> file.accept(visitor));
}
} }
public static boolean enumEntryNeedSubclass(BindingContext bindingContext, KtEnumEntry enumEntry) { public static boolean enumEntryNeedSubclass(BindingContext bindingContext, KtEnumEntry enumEntry) {