From 9f03217e1df458a3b674705b2748c415b7afd662 Mon Sep 17 00:00:00 2001 From: Tim Nieradzik Date: Sat, 13 Jul 2019 16:17:40 +0300 Subject: [PATCH] IDEA: Set language level for Scala library This setting is required for IDEA to know whether certain version-specific features are available (such as literal types in 2.13). --- src/main/scala/seed/generation/Idea.scala | 7 +++--- .../scala/seed/generation/util/IdeaFile.scala | 24 ++++++++++++++----- src/test/scala/seed/generation/IdeaSpec.scala | 13 ++++++++++ 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/main/scala/seed/generation/Idea.scala b/src/main/scala/seed/generation/Idea.scala index 2367a52..08482a2 100644 --- a/src/main/scala/seed/generation/Idea.scala +++ b/src/main/scala/seed/generation/Idea.scala @@ -31,8 +31,7 @@ object Idea { ): Unit = { val xml = IdeaFile.createLibrary(IdeaFile.Library( libraryJar.getFileName.toString, - isScalaCompiler = false, - compilerClasses = List(), + compilerInfo = None, classes = List(libraryJar.toAbsolutePath.toString), javaDoc = javaDocJar.toList.map(_.toAbsolutePath.toString), sources = sourcesJar.toList.map(_.toAbsolutePath.toString))) @@ -122,8 +121,8 @@ object Idea { val xml = IdeaFile.createLibrary(IdeaFile.Library( name = build.project.scalaOrganisation + "-" + scalaVersion, - isScalaCompiler = true, - compilerClasses = scalaCompiler.compilerJars.map(_.toString), + compilerInfo = Some(IdeaFile.CompilerInfo( + scalaVersion, scalaCompiler.compilerJars.map(_.toString))), classes = scalaCompiler.fullClassPath.map(_.toString), javaDoc = List(), sources = List())) diff --git a/src/main/scala/seed/generation/util/IdeaFile.scala b/src/main/scala/seed/generation/util/IdeaFile.scala index cd92878..7d7f2cb 100644 --- a/src/main/scala/seed/generation/util/IdeaFile.scala +++ b/src/main/scala/seed/generation/util/IdeaFile.scala @@ -1,5 +1,7 @@ package seed.generation.util +import seed.generation.Bloop + import pine._ /** XML writers for IDEA files */ @@ -14,9 +16,10 @@ object IdeaFile { moduleDeps: List[String], output: Option[Output]) + case class CompilerInfo(version: String, compilerClasses: List[String]) + case class Library(name: String, - isScalaCompiler: Boolean, - compilerClasses: List[String], + compilerInfo: Option[CompilerInfo], classes: List[String], javaDoc: List[String], sources: List[String]) @@ -83,11 +86,20 @@ object IdeaFile { } def createLibrary(library: Library): String = { - val tpe = if (library.isScalaCompiler) Some("Scala") else None - val compilerPaths = library.compilerClasses - .map(path => xml"""""") + val tpe = library.compilerInfo.map(_ => "Scala") + val languageLevel = + library.compilerInfo.map { case CompilerInfo(version, _) => + val level = "Scala_" + Bloop.majorMinorVersion(version) + .replaceAllLiterally(".", "_") + xml"""$level""" + }.toList + val compilerPaths = library.compilerInfo.fold(List[pine.Tag[Singleton]]())( + _.compilerClasses.map(path => xml"""""")) val properties = if (compilerPaths.isEmpty) List() else List(xml""" - $compilerPaths + + $languageLevel + $compilerPaths + """) val classes = library.classes.map(path => xml"""""") val javaDoc = library.javaDoc.map(path => xml"""""") diff --git a/src/test/scala/seed/generation/IdeaSpec.scala b/src/test/scala/seed/generation/IdeaSpec.scala index 5b9534f..32ba603 100644 --- a/src/test/scala/seed/generation/IdeaSpec.scala +++ b/src/test/scala/seed/generation/IdeaSpec.scala @@ -108,6 +108,19 @@ object IdeaSpec extends SimpleTestSuite { assertEquals(profileNodes.head.attr("modules"), Some("module212,module211")) + val scalaLibrary2_11_11 = + pine.XmlParser.fromString(FileUtils.readFileToString( + ideaPath.resolve("libraries").resolve("org_scala_lang_2_11_11.xml").toFile, + "UTF-8")) + val scalaLibrary2_12_8 = + pine.XmlParser.fromString(FileUtils.readFileToString( + ideaPath.resolve("libraries").resolve("org_scala_lang_2_12_8.xml").toFile, + "UTF-8")) + assertEquals(scalaLibrary2_11_11.byTagAll["language-level"].map(_.toText), + List("Scala_2_11")) + assertEquals(scalaLibrary2_12_8.byTagAll["language-level"].map(_.toText), + List("Scala_2_12")) + val module211 = pine.XmlParser.fromString(FileUtils.readFileToString( ideaPath.resolve("modules").resolve("module211.iml").toFile,