[devkit] Use top-level definitions instead of *Util objects

IJ-CR-105402

GitOrigin-RevId: 7fbf7fe02a4e3d2a9b003c796486dc4c1ff78b89
This commit is contained in:
Andrey Cherkasov
2023-06-18 18:33:28 +00:00
committed by intellij-monorepo-bot
parent 780fd6c1de
commit 7edae307bd
3 changed files with 48 additions and 48 deletions
@@ -23,12 +23,12 @@ internal class LightServiceMigrationCodeInspection : DevKitUastInspectionBase(UC
aClass.isAnonymousOrLocal()) {
return ProblemDescriptor.EMPTY_ARRAY
}
if (LightServiceMigrationUtil.isVersion193OrHigher(psiClass) ||
if (isVersion193OrHigher(psiClass) ||
ApplicationManager.getApplication().isUnitTestMode) {
if (isLightService(aClass)) return ProblemDescriptor.EMPTY_ARRAY
for (candidate in locateExtensionsByPsiClass(psiClass)) {
val extension = DomUtil.findDomElement(candidate.pointer.element, Extension::class.java, false) ?: continue
val (serviceImplementation, level) = LightServiceMigrationUtil.getServiceImplementation(extension) ?: continue
val (serviceImplementation, level) = getServiceImplementation(extension) ?: continue
if (level == Service.Level.APP &&
JvmInheritanceUtil.isInheritor(aClass, PersistentStateComponent::class.java.canonicalName)) {
continue
@@ -45,7 +45,7 @@ internal class LightServiceMigrationCodeInspection : DevKitUastInspectionBase(UC
level: Service.Level,
manager: InspectionManager,
isOnTheFly: Boolean): Array<ProblemDescriptor> {
val message = LightServiceMigrationUtil.getMessage(level)
val message = getMessage(level)
val holder = createProblemsHolder(aClass, manager, isOnTheFly)
holder.registerUProblem(aClass, message)
return holder.resultsArray
@@ -1,4 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
@file:JvmName("LightServiceMigrationUtil")
package org.jetbrains.idea.devkit.inspections
import com.intellij.openapi.components.Service
@@ -14,54 +17,51 @@ import org.jetbrains.idea.devkit.util.DevKitDomUtil
import org.jetbrains.idea.devkit.util.PluginPlatformInfo
import org.jetbrains.idea.devkit.util.PsiUtil
internal object LightServiceMigrationUtil {
internal data class ServiceInfo(val aClass: PsiClass, val level: Service.Level)
data class ServiceInfo(val aClass: PsiClass, val level: Service.Level)
fun getServiceImplementation(extension: Extension): ServiceInfo? {
val level = when (extension.extensionPoint?.effectiveQualifiedName) {
"com.intellij.projectService" -> Service.Level.PROJECT
"com.intellij.applicationService" -> Service.Level.APP
else -> return null
}
val extensionPoint = extension.extensionPoint
if (extensionPoint == null || !DomUtil.hasXml(extensionPoint.beanClass)) return null
if (ServiceDescriptor::class.java.name != extensionPoint.beanClass.stringValue) return null
if (hasDisallowedAttributes(extension)) return null
val serviceImplementation = DevKitDomUtil.getAttribute(extension, "serviceImplementation") ?: return null
if (!DomUtil.hasXml(serviceImplementation)) return null
val aClass = serviceImplementation.value as? PsiClass ?: return null
return ServiceInfo(aClass, level)
internal fun getServiceImplementation(extension: Extension): ServiceInfo? {
val level = when (extension.extensionPoint?.effectiveQualifiedName) {
"com.intellij.projectService" -> Service.Level.PROJECT
"com.intellij.applicationService" -> Service.Level.APP
else -> return null
}
val extensionPoint = extension.extensionPoint
if (extensionPoint == null || !DomUtil.hasXml(extensionPoint.beanClass)) return null
if (ServiceDescriptor::class.java.name != extensionPoint.beanClass.stringValue) return null
if (hasDisallowedAttributes(extension)) return null
val serviceImplementation = DevKitDomUtil.getAttribute(extension, "serviceImplementation") ?: return null
if (!DomUtil.hasXml(serviceImplementation)) return null
val aClass = serviceImplementation.value as? PsiClass ?: return null
return ServiceInfo(aClass, level)
}
private fun hasDisallowedAttributes(extension: Extension): Boolean {
for (attributeName in disallowedAttributes) {
val attribute = DevKitDomUtil.getAttribute(extension, attributeName)
if (attribute != null && DomUtil.hasXml(attribute)) return true
}
return false
private fun hasDisallowedAttributes(extension: Extension): Boolean {
for (attributeName in disallowedAttributes) {
val attribute = DevKitDomUtil.getAttribute(extension, attributeName)
if (attribute != null && DomUtil.hasXml(attribute)) return true
}
return false
}
@Nls(capitalization = Nls.Capitalization.Sentence)
fun getMessage(level: Service.Level): String {
return when (level) {
Service.Level.APP -> DevKitBundle.message("inspection.light.service.migration.app.level.message")
Service.Level.PROJECT -> DevKitBundle.message("inspection.light.service.migration.project.level.message")
}
}
fun isVersion193OrHigher(element: DomElement): Boolean {
if (PsiUtil.isIdeaProject(element.module?.project)) return true
val buildNumber = PluginPlatformInfo.forDomElement(element).sinceBuildNumber
return buildNumber != null && buildNumber.baselineVersion >= 193
}
fun isVersion193OrHigher(aClass: PsiClass): Boolean {
if (PsiUtil.isIdeaProject(aClass.project)) return true
val module = ModuleUtilCore.findModuleForPsiElement(aClass) ?: return false
val buildNumber = PluginPlatformInfo.forModule(module).sinceBuildNumber
return buildNumber != null && buildNumber.baselineVersion >= 193
@Nls(capitalization = Nls.Capitalization.Sentence)
internal fun getMessage(level: Service.Level): String {
return when (level) {
Service.Level.APP -> DevKitBundle.message("inspection.light.service.migration.app.level.message")
Service.Level.PROJECT -> DevKitBundle.message("inspection.light.service.migration.project.level.message")
}
}
internal fun isVersion193OrHigher(element: DomElement): Boolean {
if (PsiUtil.isIdeaProject(element.module?.project)) return true
val buildNumber = PluginPlatformInfo.forDomElement(element).sinceBuildNumber
return buildNumber != null && buildNumber.baselineVersion >= 193
}
internal fun isVersion193OrHigher(aClass: PsiClass): Boolean {
if (PsiUtil.isIdeaProject(aClass.project)) return true
val module = ModuleUtilCore.findModuleForPsiElement(aClass) ?: return false
val buildNumber = PluginPlatformInfo.forModule(module).sinceBuildNumber
return buildNumber != null && buildNumber.baselineVersion >= 193
}
private val disallowedAttributes = setOf("serviceInterface", "os", "client", "overrides", "id", "preload")
@@ -22,9 +22,9 @@ internal class LightServiceMigrationXMLInspection : DevKitPluginXmlInspectionBas
if (element !is Extension) return
if (!isAllowed(holder)) return
if (LightServiceMigrationUtil.isVersion193OrHigher(element) ||
if (isVersion193OrHigher(element) ||
ApplicationManager.getApplication().isUnitTestMode) {
val (aClass, level) = LightServiceMigrationUtil.getServiceImplementation(element) ?: return
val (aClass, level) = getServiceImplementation(element) ?: return
if (!aClass.hasModifier(JvmModifier.FINAL) || isLibraryClass(aClass)) return
if (level == Service.Level.APP &&
JvmInheritanceUtil.isInheritor(aClass, PersistentStateComponent::class.java.canonicalName)) {
@@ -35,7 +35,7 @@ internal class LightServiceMigrationXMLInspection : DevKitPluginXmlInspectionBas
holder.createProblem(element, ProblemHighlightType.ERROR, message, null)
}
else {
val message = LightServiceMigrationUtil.getMessage(level)
val message = getMessage(level)
holder.createProblem(element, message)
}
}