Multi-platform refactoring: get rid of PlatformKind (replace with MultiTargetPlatform)

This commit is contained in:
Mikhail Glukhikh
2017-01-10 17:46:54 +03:00
parent aeb6bff145
commit c09a71b178
24 changed files with 78 additions and 88 deletions
@@ -29,13 +29,13 @@ import org.jetbrains.kotlin.analyzer.ResolverForProject
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.context.GlobalContextImpl
import org.jetbrains.kotlin.context.withProject
import org.jetbrains.kotlin.descriptors.PlatformKind
import org.jetbrains.kotlin.descriptors.SourceKind
import org.jetbrains.kotlin.idea.project.IdeaEnvironment
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.MultiTargetPlatform
import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters
fun createModuleResolverProvider(
@@ -78,7 +78,7 @@ fun createModuleResolverProvider(
sdk?.let { SdkInfo(project, it) },
modulePlatforms = { moduleInfo ->
val module = (moduleInfo as? ModuleSourceInfo)?.module
module?.let { TargetPlatformDetector.getPlatform(module).kind } ?: PlatformKind.DEFAULT
module?.let { TargetPlatformDetector.getPlatform(module).multiTargetPlatform }
},
moduleSources = { moduleInfo ->
when (moduleInfo) {
@@ -236,7 +236,7 @@ public class SourceNavigationHelper {
@NotNull Project project
) {
MutableModuleContext newModuleContext = ContextKt.ContextForNewModule(
ContextKt.ProjectContext(project), Name.special("<library module>"), DefaultBuiltIns.getInstance()
ContextKt.ProjectContext(project), Name.special("<library module>"), DefaultBuiltIns.getInstance(), null
);
newModuleContext.setDependencies(newModuleContext.getModule(), newModuleContext.getModule().getBuiltIns().getBuiltInsModule());
@@ -22,7 +22,6 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
import org.jetbrains.kotlin.descriptors.MemberDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PlatformKind
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor
@@ -30,6 +29,7 @@ import org.jetbrains.kotlin.idea.core.toDescriptor
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.resolve.TargetPlatform
import org.jetbrains.kotlin.resolve.checkers.HeaderImplDeclarationChecker
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
import org.jetbrains.kotlin.resolve.diagnostics.SimpleDiagnostics
@@ -40,8 +40,7 @@ class PlatformHeaderAnnotator : Annotator {
val declaration = element as? KtDeclaration ?: return
if (!declaration.hasModifier(KtTokens.HEADER_KEYWORD)) return
val platform = TargetPlatformDetector.getPlatform(declaration.containingKtFile)
if (platform.kind != PlatformKind.DEFAULT) return
if (TargetPlatformDetector.getPlatform(declaration.containingKtFile) !is TargetPlatform.Default) return
val defaultModuleDescriptor = declaration.findModuleDescriptor()
val dependentDescriptors = defaultModuleDescriptor.allImplementingModules
@@ -22,10 +22,12 @@ import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor
import org.jetbrains.kotlin.idea.core.toDescriptor
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.MultiTargetPlatform
import org.jetbrains.kotlin.resolve.checkers.HeaderImplDeclarationChecker
import org.jetbrains.kotlin.resolve.getMultiTargetPlatform
fun ModuleDescriptor.commonModuleOrNull() = allDependencyModules.filter {
it.platformKind == PlatformKind.DEFAULT && it.sourceKind == sourceKind
it.getMultiTargetPlatform() == MultiTargetPlatform.Common && it.sourceKind == sourceKind
}.firstOrNull()
fun ModuleDescriptor.hasDeclarationOf(descriptor: MemberDescriptor) = declarationOf(descriptor) != null
@@ -24,7 +24,9 @@ import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor
import org.jetbrains.kotlin.idea.core.toDescriptor
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.MultiTargetPlatform
import org.jetbrains.kotlin.resolve.checkers.HeaderImplDeclarationChecker
import org.jetbrains.kotlin.resolve.getMultiTargetPlatform
import java.awt.event.MouseEvent
fun ModuleDescriptor.hasImplementationsOf(descriptor: MemberDescriptor) =
@@ -49,7 +51,7 @@ fun getPlatformImplementationTooltip(declaration: KtDeclaration): String? {
if (platformModulesWithImplementation.isEmpty()) return null
return platformModulesWithImplementation.joinToString(prefix = "Has implementations in ") {
it.platformKind.name
(it.getMultiTargetPlatform() as MultiTargetPlatform.Specific).platform
}
}
@@ -41,10 +41,12 @@ import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.idea.util.projectStructure.allModules
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.MultiTargetPlatform
import org.jetbrains.kotlin.resolve.getMultiTargetPlatform
sealed class CreateHeaderImplementationFix<out D : KtNamedDeclaration>(
declaration: D,
private val implPlatformKind: PlatformKind,
private val implPlatform: MultiTargetPlatform.Specific,
private val generateIt: KtPsiFactory.(Project, D) -> D?
) : KotlinQuickFixAction<D>(declaration) {
@@ -52,7 +54,7 @@ sealed class CreateHeaderImplementationFix<out D : KtNamedDeclaration>(
protected abstract val elementType: String
override fun getText() = "Create header $elementType implementation for platform ${implPlatformKind.name}"
override fun getText() = "Create header $elementType implementation for platform ${implPlatform.platform}"
override fun startInWriteAction() = false
@@ -86,7 +88,7 @@ sealed class CreateHeaderImplementationFix<out D : KtNamedDeclaration>(
private fun Project.implementationModuleOf(headerModule: Module) =
allModules().firstOrNull {
TargetPlatformDetector.getPlatform(it).kind == implPlatformKind &&
TargetPlatformDetector.getPlatform(it).multiTargetPlatform == implPlatform &&
headerModule in ModuleRootManager.getInstance(it).dependencies
}
@@ -136,11 +138,11 @@ sealed class CreateHeaderImplementationFix<out D : KtNamedDeclaration>(
val declaration = d.psiElement as? KtNamedDeclaration ?: return null
val compatibility = d.c
if (compatibility.isNotEmpty()) return null
val implPlatformKind = d.b.platformKind
val implPlatform = d.b.getMultiTargetPlatform() as? MultiTargetPlatform.Specific ?: return null
return when (declaration) {
is KtClassOrObject -> CreateHeaderClassImplementationFix(declaration, implPlatformKind)
is KtFunction -> CreateHeaderFunctionImplementationFix(declaration, implPlatformKind)
is KtProperty -> CreateHeaderPropertyImplementationFix(declaration, implPlatformKind)
is KtClassOrObject -> CreateHeaderClassImplementationFix(declaration, implPlatform)
is KtFunction -> CreateHeaderFunctionImplementationFix(declaration, implPlatform)
is KtProperty -> CreateHeaderPropertyImplementationFix(declaration, implPlatform)
else -> null
}
}
@@ -149,8 +151,8 @@ sealed class CreateHeaderImplementationFix<out D : KtNamedDeclaration>(
class CreateHeaderClassImplementationFix(
klass: KtClassOrObject,
implPlatformKind: PlatformKind
) : CreateHeaderImplementationFix<KtClassOrObject>(klass, implPlatformKind, { project, element ->
implPlatform: MultiTargetPlatform.Specific
) : CreateHeaderImplementationFix<KtClassOrObject>(klass, implPlatform, { project, element ->
generateClassOrObject(project, element, implNeeded = true)
}) {
@@ -159,8 +161,8 @@ class CreateHeaderClassImplementationFix(
class CreateHeaderPropertyImplementationFix(
property: KtProperty,
implPlatformKind: PlatformKind
) : CreateHeaderImplementationFix<KtProperty>(property, implPlatformKind, { project, element ->
implPlatform: MultiTargetPlatform.Specific
) : CreateHeaderImplementationFix<KtProperty>(property, implPlatform, { project, element ->
val descriptor = element.toDescriptor() as? PropertyDescriptor
descriptor?.let { generateProperty(project, element, descriptor, implNeeded = true) }
}) {
@@ -170,8 +172,8 @@ class CreateHeaderPropertyImplementationFix(
class CreateHeaderFunctionImplementationFix(
function: KtFunction,
implPlatformKind: PlatformKind
) : CreateHeaderImplementationFix<KtFunction>(function, implPlatformKind, { project, element ->
implPlatform: MultiTargetPlatform.Specific
) : CreateHeaderImplementationFix<KtFunction>(function, implPlatform, { project, element ->
val descriptor = element.toDescriptor() as? FunctionDescriptor
descriptor?.let { generateFunction(project, element, descriptor, implNeeded = true) }
}) {