fun getDynamicPluginStatus()

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
  }