private def injectModules()

in ideaSupport/src/main/scala/org/jetbrains/sbtidea/tasks/UpdateWithIDEAInjectionTask.scala [38:100]


  private def injectModules(
    reportOriginal: UpdateReport,
    intellijBaseDir: File,
    intellijMainJars: Seq[File],
    intellijTestJars: Seq[File],
    intellijPluginClasspath: Seq[(PluginDescriptor, Classpath)],
    buildNumber: String,
    attachSources: Boolean,
  ): UpdateReport = {
    val ideaModule: ModuleID = Modules.getIntellijSdkModule(buildNumber)
    val ideaModuleTest: ModuleID = Modules.getIntellijSdkTestModule(buildNumber)

    def findSourcesArchives(intellijBaseDir: File): Seq[File] = {
      val sourcesDir = IdeaSourcesInstaller.sourcesRoot(intellijBaseDir.toPath).toFile
      if (sourcesDir.isDirectory) FileUtils.listFiles(sourcesDir, Array("zip", "jar"), false).asScala.toSeq
      else Seq()
    }

    val intelliJSourcesArchives = findSourcesArchives(intellijBaseDir)

    val ideaArtifactsMapping: Seq[(sbt.Artifact, File)] = {
      val mainJarsArtifact: Artifact = Artifacts.ideaMainJarsArtifact(intellijMainJars)
      val sourcesArtifactMapping = if (attachSources) intelliJSourcesArchives.map(Artifacts.ideaSourcesArtifact -> _) else Seq.empty
      intellijMainJars.map(mainJarsArtifact -> _) ++ sourcesArtifactMapping
    }

    val ideaTestArtifactMappings: Seq[(sbt.Artifact, File)] = {
      //testFramework sources are located in the same archive as main sources
      val sourcesArtifactMapping = if (attachSources) intelliJSourcesArchives.map(Artifacts.ideaTestSourcesArtifact -> _) else Seq.empty
      val testJarsArtifact = Artifacts.ideaTestArtifact
      intellijTestJars.map(testJarsArtifact -> _) ++ sourcesArtifactMapping
    }

    val pluginArtifactsMappings: Seq[(ModuleID, Seq[(Artifact, File)], Configuration)] = intellijPluginClasspath.flatMap { case (_, classpath) =>
      val representativeJar = classpath.headOption
      representativeJar.map { f =>
        //NOTE: in current architecture plugins are attributed, but intellij jars are not?
        // It's not consistent, and it's better to unify it in one place
        val pluginModule = f.get(moduleID.key).get
        val pluginArtifact = f.get(artifact.key).get
        val mainArtifactMapping = classpath.map(pluginArtifact -> _.data)
        //bundled plugin sources are located in the same archive as main sources
        val sourcesArtifactMappings = intelliJSourcesArchives.map(Artifacts.pluginSourcesArtifact(pluginArtifact.name) -> _)

        // bundled plugin has the same version as the platform; add sources
        val mappings = if (attachSources && pluginModule.revision == buildNumber)
          mainArtifactMapping ++ sourcesArtifactMappings
        else
          mainArtifactMapping
        (pluginModule, mappings, Configurations.Compile)
      }
    }

    val injectInfos: Seq[(sbt.ModuleID, Seq[(sbt.Artifact, sbt.File)], Configuration)] = Seq(
      (ideaModule, ideaArtifactsMapping, Configurations.Compile),
      (ideaModuleTest, ideaTestArtifactMappings, Configurations.Test),
    ) ++ pluginArtifactsMappings

    val reportNew = injectInfos.foldLeft(reportOriginal) { case (previousReport, (module, artifactMappings, configuration)) =>
      injectModulesIntoUpdateReport(previousReport, module, artifactMappings, configuration)
    }
    reportNew //keep a separate variable for easier debugging
  }