in intellij-plugin-verifier/verifier-intellij/src/main/java/com/jetbrains/pluginverifier/dymamic/DynamicPlugins.kt [19:79]
fun getDynamicPluginStatus(context: PluginVerificationContext): DynamicPluginStatus? {
val verificationDescriptor = context.verificationDescriptor
val idePlugin = context.idePlugin
if (verificationDescriptor is PluginVerificationDescriptor.IDE && idePlugin is IdePluginImpl) {
val reasonsNotToLoadUnloadWithoutRestart = hashSetOf<String>()
listOf(
idePlugin.appContainerDescriptor to "application",
idePlugin.projectContainerDescriptor to "project",
idePlugin.moduleContainerDescriptor to "module"
)
.filter { it.first.components.isNotEmpty() }
.mapTo(reasonsNotToLoadUnloadWithoutRestart) { (descriptor, area) ->
"$MESSAGE because it declares $area components: " + formatListOfNames(descriptor.components.map { it.implementationClass })
}
val declaredExtensions = idePlugin.extensions.keys
val ide = verificationDescriptor.ide
val nonDynamicExtensions = arrayListOf<String>()
for (epName in declaredExtensions) {
val extensionPoint = ide.bundledPlugins.asSequence()
.filterIsInstance<IdePluginImpl>()
.mapNotNull { it.findExtensionPoint(epName) }
.firstOrNull()
if (extensionPoint != null && !extensionPoint.isDynamic) {
nonDynamicExtensions += extensionPoint.extensionPointName
}
}
if (nonDynamicExtensions.isNotEmpty()) {
reasonsNotToLoadUnloadWithoutRestart += "$MESSAGE because it declares non-dynamic extensions: " +
formatListOfNames(nonDynamicExtensions)
}
val allActionsAndGroups = getAllActionsAndGroupsRecursively(idePlugin)
for (element in allActionsAndGroups) {
if (element.name == "group" && element.getAttributeValue("id") == null) {
reasonsNotToLoadUnloadWithoutRestart += "$MESSAGE because it declares a group without 'id' specified"
break
}
}
for (element in allActionsAndGroups) {
if (element.name == "action" && element.getAttributeValue("id") == null && element.getAttributeValue("class") == null) {
reasonsNotToLoadUnloadWithoutRestart += "$MESSAGE because it declares an action with neither 'id' nor 'class' specified"
break
}
}
if (reasonsNotToLoadUnloadWithoutRestart.isEmpty()) {
return DynamicPluginStatus.MaybeDynamic
}
return DynamicPluginStatus.NotDynamic(reasonsNotToLoadUnloadWithoutRestart)
}
return null
}