Use TargetPlatformDetector.getPlatform instead of ProjectStructureUtil.isJsKotlinModule
The reason for this is to make the choice of the platform more explicit now that there are more platforms than just JVM and JS (default platform, and also possibly native in the future)
This commit is contained in:
+8
-6
@@ -16,18 +16,20 @@
|
||||
|
||||
package org.jetbrains.kotlin.idea.caches.resolve
|
||||
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.module.ModuleManager
|
||||
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
|
||||
import com.intellij.psi.util.CachedValuesManager
|
||||
import com.intellij.psi.util.CachedValueProvider
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.roots.ProjectRootModificationTracker
|
||||
import com.intellij.psi.util.CachedValueProvider
|
||||
import com.intellij.psi.util.CachedValuesManager
|
||||
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
|
||||
import org.jetbrains.kotlin.js.resolve.JsPlatform
|
||||
|
||||
//TODO: this should go away to support cross-platform projects
|
||||
object JsProjectDetector {
|
||||
@JvmStatic fun isJsProject(project: Project): Boolean {
|
||||
@JvmStatic
|
||||
fun isJsProject(project: Project): Boolean {
|
||||
return CachedValuesManager.getManager(project).getCachedValue(project) {
|
||||
val result = ModuleManager.getInstance(project).modules.any { ProjectStructureUtil.isJsKotlinModule(it) }
|
||||
val result = ModuleManager.getInstance(project).modules.any { TargetPlatformDetector.getPlatform(it) == JsPlatform }
|
||||
CachedValueProvider.Result(result, ProjectRootModificationTracker.getInstance(project))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.project;
|
||||
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleUtilCore;
|
||||
import com.intellij.openapi.roots.ModuleRootManager;
|
||||
import com.intellij.openapi.roots.ProjectRootModificationTracker;
|
||||
import com.intellij.openapi.roots.libraries.Library;
|
||||
@@ -32,7 +31,6 @@ import com.intellij.util.Processor;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.kotlin.idea.framework.JsLibraryStdDetectionUtil;
|
||||
import org.jetbrains.kotlin.psi.KtFile;
|
||||
|
||||
public class ProjectStructureUtil {
|
||||
private static final Key<CachedValue<Boolean>> IS_KOTLIN_JS_MODULE = Key.create("IS_KOTLIN_JS_MODULE");
|
||||
@@ -40,11 +38,6 @@ public class ProjectStructureUtil {
|
||||
private ProjectStructureUtil() {
|
||||
}
|
||||
|
||||
public static boolean isJsKotlinModule(@NotNull KtFile file) {
|
||||
Module module = ModuleUtilCore.findModuleForPsiElement(file);
|
||||
return module != null && isJsKotlinModule(module);
|
||||
}
|
||||
|
||||
public static boolean isJsKotlinModule(@NotNull final Module module) {
|
||||
CachedValue<Boolean> result = module.getUserData(IS_KOTLIN_JS_MODULE);
|
||||
if (result == null) {
|
||||
|
||||
+3
-2
@@ -27,12 +27,13 @@ import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.ClassifierDescriptorWithTypeParameters
|
||||
import org.jetbrains.kotlin.idea.core.KotlinIndicesHelper
|
||||
import org.jetbrains.kotlin.idea.core.isJavaClassNotToBeUsedInKotlin
|
||||
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
|
||||
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
|
||||
import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName
|
||||
import org.jetbrains.kotlin.idea.resolve.ResolutionFacade
|
||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
||||
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||
import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered
|
||||
@@ -67,7 +68,7 @@ class AllClassesCompletion(private val parameters: CompletionParameters,
|
||||
.forEach { classifierDescriptorCollector(it) }
|
||||
}
|
||||
|
||||
if (!ProjectStructureUtil.isJsKotlinModule(parameters.originalFile as KtFile)) {
|
||||
if (TargetPlatformDetector.getPlatform(parameters.originalFile as KtFile) == JvmPlatform) {
|
||||
addAdaptedJavaCompletion(javaClassCollector)
|
||||
}
|
||||
}
|
||||
|
||||
+3
-2
@@ -34,7 +34,7 @@ import org.jetbrains.kotlin.idea.completion.smart.SMART_COMPLETION_ITEM_PRIORITY
|
||||
import org.jetbrains.kotlin.idea.completion.smart.SmartCompletion
|
||||
import org.jetbrains.kotlin.idea.completion.smart.SmartCompletionItemPriority
|
||||
import org.jetbrains.kotlin.idea.core.ExpectedInfo
|
||||
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
|
||||
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
|
||||
import org.jetbrains.kotlin.idea.stubindex.PackageIndexUtil
|
||||
import org.jetbrains.kotlin.idea.util.CallTypeAndReceiver
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.*
|
||||
import org.jetbrains.kotlin.renderer.render
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindExclude
|
||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||
@@ -233,7 +234,7 @@ class BasicCompletionSession(
|
||||
val packageNames = PackageIndexUtil.getSubPackageFqNames(FqName.ROOT, searchScope, project, prefixMatcher.asNameFilter())
|
||||
.toMutableSet()
|
||||
|
||||
if (!ProjectStructureUtil.isJsKotlinModule(parameters.originalFile as KtFile)) {
|
||||
if (TargetPlatformDetector.getPlatform(parameters.originalFile as KtFile) == JvmPlatform) {
|
||||
JavaPsiFacade.getInstance(project).findPackage("")?.getSubPackages(searchScope)?.forEach { psiPackage ->
|
||||
val name = psiPackage.name
|
||||
if (Name.isValidIdentifier(name!!)) {
|
||||
|
||||
@@ -35,12 +35,13 @@ import org.jetbrains.kotlin.idea.caches.resolve.getResolveScope
|
||||
import org.jetbrains.kotlin.idea.codeInsight.ReferenceVariantsHelper
|
||||
import org.jetbrains.kotlin.idea.core.*
|
||||
import org.jetbrains.kotlin.idea.imports.importableFqName
|
||||
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
|
||||
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
|
||||
import org.jetbrains.kotlin.idea.references.mainReference
|
||||
import org.jetbrains.kotlin.idea.util.*
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
||||
@@ -79,7 +80,7 @@ abstract class CompletionSession(
|
||||
protected val resolutionFacade = file.getResolutionFacade()
|
||||
protected val moduleDescriptor = resolutionFacade.moduleDescriptor
|
||||
protected val project = position.project
|
||||
protected val isJvmModule = !ProjectStructureUtil.isJsKotlinModule(parameters.originalFile as KtFile)
|
||||
protected val isJvmModule = TargetPlatformDetector.getPlatform(parameters.originalFile as KtFile) == JvmPlatform
|
||||
protected val isDebuggerContext = file is KtCodeFragment
|
||||
|
||||
protected val nameExpression: KtSimpleNameExpression?
|
||||
|
||||
@@ -18,13 +18,14 @@ package org.jetbrains.kotlin.idea.intentions
|
||||
|
||||
import com.intellij.codeInsight.intention.LowPriorityAction
|
||||
import com.intellij.openapi.editor.Editor
|
||||
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
|
||||
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
|
||||
import org.jetbrains.kotlin.idea.util.addAnnotation
|
||||
import org.jetbrains.kotlin.idea.util.findAnnotation
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
||||
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
||||
|
||||
private val annotationFqName = FqName("kotlin.jvm.JvmOverloads")
|
||||
|
||||
@@ -68,7 +69,7 @@ class AddJvmOverloadsIntention : SelfTargetingIntention<KtModifierListOwner>(
|
||||
|
||||
text = "Add '@JvmOverloads' annotation to $targetName"
|
||||
|
||||
return !ProjectStructureUtil.isJsKotlinModule(element.getContainingKtFile())
|
||||
return TargetPlatformDetector.getPlatform(element.getContainingKtFile()) == JvmPlatform
|
||||
&& parameters.any { it.hasDefaultValue() }
|
||||
&& element.findAnnotation(annotationFqName) == null
|
||||
}
|
||||
@@ -84,5 +85,4 @@ class AddJvmOverloadsIntention : SelfTargetingIntention<KtModifierListOwner>(
|
||||
element.addAnnotation(annotationFqName)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,11 +51,12 @@ import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||
import org.jetbrains.kotlin.idea.core.KotlinIndicesHelper
|
||||
import org.jetbrains.kotlin.idea.core.isVisible
|
||||
import org.jetbrains.kotlin.idea.imports.canBeReferencedViaImport
|
||||
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
|
||||
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
|
||||
import org.jetbrains.kotlin.idea.references.mainReference
|
||||
import org.jetbrains.kotlin.idea.util.CallTypeAndReceiver
|
||||
import org.jetbrains.kotlin.idea.util.getResolutionScope
|
||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||
import org.jetbrains.kotlin.js.resolve.JsPlatform
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
@@ -69,6 +70,7 @@ import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getParentCall
|
||||
import org.jetbrains.kotlin.resolve.calls.context.ContextDependency
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
|
||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||
import org.jetbrains.kotlin.resolve.scopes.ExplicitImportsScope
|
||||
import org.jetbrains.kotlin.resolve.scopes.utils.addImportingScope
|
||||
@@ -77,7 +79,6 @@ import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
import org.jetbrains.kotlin.utils.CachedValueProperty
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.singletonList
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList
|
||||
import java.lang.IllegalStateException
|
||||
import java.util.*
|
||||
|
||||
/**
|
||||
@@ -242,11 +243,9 @@ internal abstract class OrdinaryImportFixBase<T : KtExpression>(expression: T, f
|
||||
if (!expression.isImportDirectiveExpression() && !isSelectorInQualified(expression)) {
|
||||
val filterByCallType = { descriptor: DeclarationDescriptor -> callTypeAndReceiver.callType.descriptorKindFilter.accepts(descriptor) }
|
||||
|
||||
if (ProjectStructureUtil.isJsKotlinModule(expression.getContainingKtFile())) {
|
||||
indicesHelper.getKotlinClasses({ it == name }, { true }).filterTo(result, filterByCallType)
|
||||
}
|
||||
else {
|
||||
indicesHelper.getJvmClassesByName(name).filterTo(result, filterByCallType)
|
||||
when (TargetPlatformDetector.getPlatform(expression.getContainingKtFile())) {
|
||||
JsPlatform -> indicesHelper.getKotlinClasses({ it == name }, { true }).filterTo(result, filterByCallType)
|
||||
JvmPlatform -> indicesHelper.getJvmClassesByName(name).filterTo(result, filterByCallType)
|
||||
}
|
||||
|
||||
indicesHelper.getTopLevelTypeAliases { it == name }.filterTo(result, filterByCallType)
|
||||
@@ -419,7 +418,7 @@ internal class ImportMemberFix(expression: KtSimpleNameExpression) : ImportFixBa
|
||||
processor = processor
|
||||
)
|
||||
|
||||
if (!ProjectStructureUtil.isJsKotlinModule(element.getContainingKtFile())) {
|
||||
if (TargetPlatformDetector.getPlatform(element.getContainingKtFile()) == JvmPlatform) {
|
||||
indicesHelper.processJvmCallablesByName(
|
||||
name,
|
||||
filter = { it.hasModifierProperty(PsiModifier.STATIC) },
|
||||
|
||||
@@ -36,7 +36,7 @@ import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.getJavaOrKotlinMemberDescriptor
|
||||
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
|
||||
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
|
||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinMethodDescriptor.Kind
|
||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallableDefinitionUsage
|
||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.KotlinCallerUsage
|
||||
@@ -48,6 +48,7 @@ import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.jvm.annotations.hasJvmOverloadsAnnotation
|
||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
||||
import org.jetbrains.kotlin.types.typeUtil.isUnit
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList
|
||||
import org.jetbrains.kotlin.utils.keysToMap
|
||||
@@ -479,7 +480,7 @@ open class KotlinChangeInfo(
|
||||
return createJavaChangeInfo(originalPsiMethod, currentPsiMethod, newName, PsiType.VOID, newJavaParameters.toTypedArray())
|
||||
}
|
||||
|
||||
if (ProjectStructureUtil.isJsKotlinModule(method.containingFile as KtFile)) return null
|
||||
if (TargetPlatformDetector.getPlatform(method.containingFile as KtFile) != JvmPlatform) return null
|
||||
|
||||
if (javaChangeInfos == null) {
|
||||
val method = method
|
||||
|
||||
@@ -29,13 +29,14 @@ import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiMethod
|
||||
import com.intellij.psi.util.PsiTreeUtil
|
||||
import org.jetbrains.kotlin.asJava.toLightClass
|
||||
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
|
||||
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
|
||||
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
|
||||
import org.jetbrains.kotlin.psi.KtClass
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.psi.KtFunction
|
||||
import org.jetbrains.kotlin.psi.KtNamedFunction
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
||||
|
||||
class KotlinJUnitRunConfigurationProducer : RunConfigurationProducer<JUnitConfiguration>(JUnitConfigurationType.getInstance()) {
|
||||
override fun shouldReplace(self: ConfigurationFromContext, other: ConfigurationFromContext): Boolean {
|
||||
@@ -89,9 +90,9 @@ class KotlinJUnitRunConfigurationProducer : RunConfigurationProducer<JUnitConfig
|
||||
return false
|
||||
}
|
||||
|
||||
val jetFile = leaf.containingFile as KtFile
|
||||
val ktFile = leaf.containingFile as KtFile
|
||||
|
||||
if (ProjectStructureUtil.isJsKotlinModule(jetFile)) {
|
||||
if (TargetPlatformDetector.getPlatform(ktFile) != JvmPlatform) {
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
@@ -29,10 +29,11 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
|
||||
import org.jetbrains.kotlin.idea.MainFunctionDetector
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
|
||||
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
|
||||
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
|
||||
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
||||
|
||||
class KotlinRunConfigurationProducer : RunConfigurationProducer<JetRunConfiguration>(JetRunConfigurationType.getInstance()) {
|
||||
|
||||
@@ -57,7 +58,7 @@ class KotlinRunConfigurationProducer : RunConfigurationProducer<JetRunConfigurat
|
||||
|
||||
val module = location.module ?: return null
|
||||
|
||||
if (ProjectStructureUtil.isJsKotlinModule(module)) return null
|
||||
if (TargetPlatformDetector.getPlatform(module) != JvmPlatform) return null
|
||||
|
||||
val locationElement = location.psiElement
|
||||
|
||||
|
||||
@@ -37,9 +37,10 @@ import kotlin.collections.CollectionsKt;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.kotlin.asJava.LightClassUtilsKt;
|
||||
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil;
|
||||
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector;
|
||||
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil;
|
||||
import org.jetbrains.kotlin.psi.*;
|
||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -74,9 +75,9 @@ public class KotlinTestNgConfigurationProducer extends TestNGConfigurationProduc
|
||||
return false;
|
||||
}
|
||||
|
||||
KtFile jetFile = (KtFile) leaf.getContainingFile();
|
||||
KtFile ktFile = (KtFile) leaf.getContainingFile();
|
||||
|
||||
if (ProjectStructureUtil.isJsKotlinModule(jetFile)) {
|
||||
if (TargetPlatformDetector.getPlatform(ktFile) != JvmPlatform.INSTANCE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
+9
-9
@@ -51,7 +51,9 @@ import org.jetbrains.kotlin.idea.framework.getJsStdLibJar
|
||||
import org.jetbrains.kotlin.idea.framework.getReflectJar
|
||||
import org.jetbrains.kotlin.idea.framework.getRuntimeJar
|
||||
import org.jetbrains.kotlin.idea.framework.getTestJar
|
||||
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil.isJsKotlinModule
|
||||
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
|
||||
import org.jetbrains.kotlin.js.resolve.JsPlatform
|
||||
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform
|
||||
import org.jetbrains.kotlin.serialization.deserialization.BinaryVersion
|
||||
import java.awt.event.ComponentAdapter
|
||||
import java.awt.event.ComponentEvent
|
||||
@@ -335,15 +337,13 @@ class UnsupportedAbiVersionNotificationPanelProvider(private val project: Projec
|
||||
}
|
||||
|
||||
fun collectBadRoots(module: Module): Collection<BinaryVersionedFile<BinaryVersion>> {
|
||||
val badRoots =
|
||||
if (!isJsKotlinModule(module))
|
||||
getLibraryRootsWithAbiIncompatibleKotlinClasses(module)
|
||||
else
|
||||
getLibraryRootsWithAbiIncompatibleForKotlinJs(module)
|
||||
val badRoots = when (TargetPlatformDetector.getPlatform(module)) {
|
||||
JvmPlatform -> getLibraryRootsWithAbiIncompatibleKotlinClasses(module)
|
||||
JsPlatform -> getLibraryRootsWithAbiIncompatibleForKotlinJs(module)
|
||||
else -> return emptyList()
|
||||
}
|
||||
|
||||
if (badRoots.isEmpty()) return emptyList()
|
||||
|
||||
return badRoots.toHashSet()
|
||||
return if (badRoots.isEmpty()) emptyList() else badRoots.toHashSet()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user