src/Pure/Tools/scala_project.scala
author wenzelm
Tue, 05 Jul 2022 13:12:04 +0200
changeset 75654 21164fd15e3d
parent 75416 39aa4d9e5559
child 75656 7900336c82b6
permissions -rw-r--r--
switch to Scala 3;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Tools/scala_project.scala
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
     3
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
     4
Manage Isabelle/Scala/Java project sources, with output to Gradle or
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
     5
Maven for IntelliJ IDEA.
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
     6
*/
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
     7
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
     8
package isabelle
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
     9
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
    10
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
    11
object Scala_Project {
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    12
  /** build tools **/
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
    13
75416
39aa4d9e5559 clarified versions;
wenzelm
parents: 75394
diff changeset
    14
  val java_version: String = "17"
75654
21164fd15e3d switch to Scala 3;
wenzelm
parents: 75416
diff changeset
    15
  val scala_version: String = "3.1.3"
74656
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    16
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
    17
  abstract class Build_Tool {
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    18
    def project_root: Path
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    19
    def init_project(dir: Path, jars: List[Path]): Unit
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    20
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    21
    val java_src_dir: Path = Path.explode("src/main/java")
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    22
    val scala_src_dir: Path = Path.explode("src/main/scala")
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    23
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    24
    def detect_project(dir: Path): Boolean =
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    25
      (dir + project_root).is_file &&
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    26
      (dir + scala_src_dir).is_dir
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    27
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
    28
    def package_dir(source_file: Path): Path = {
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    29
      val dir =
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    30
        package_name(source_file) match {
75082
ea4fa50dbb74 more robust package_dir, to increase chances that it works with IntelliJ IDEA;
wenzelm
parents: 74960
diff changeset
    31
          case Some(name) => Path.explode(space_explode('.', name).mkString("/"))
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    32
          case None => error("Failed to guess package from " + source_file)
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    33
        }
75082
ea4fa50dbb74 more robust package_dir, to increase chances that it works with IntelliJ IDEA;
wenzelm
parents: 74960
diff changeset
    34
      (if (source_file.is_java) java_src_dir else scala_src_dir) + dir
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    35
    }
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    36
  }
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    37
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    38
  def build_tools: List[Build_Tool] = List(Gradle, Maven)
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    39
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    40
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    41
  /* Gradle */
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    42
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
    43
  object Gradle extends Build_Tool {
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    44
    override def toString: String = "Gradle"
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    45
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    46
    val project_settings: Path = Path.explode("settings.gradle")
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    47
    override val project_root: Path = Path.explode("build.gradle")
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    48
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
    49
    private def groovy_string(s: String): String = {
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    50
      s.map(c =>
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    51
        c match {
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    52
          case '\t' | '\b' | '\n' | '\r' | '\f' | '\\' | '\'' | '"' => "\\" + c
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    53
          case _ => c.toString
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    54
        }).mkString("'", "", "'")
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    55
    }
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    56
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
    57
    override def init_project(dir: Path, jars: List[Path]): Unit = {
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    58
      File.write(dir + project_settings, "rootProject.name = 'Isabelle'\n")
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    59
      File.write(dir + project_root,
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    60
"""plugins {
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    61
  id 'scala'
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    62
}
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    63
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    64
repositories {
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    65
  mavenCentral()
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    66
}
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    67
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    68
dependencies {
75654
21164fd15e3d switch to Scala 3;
wenzelm
parents: 75416
diff changeset
    69
  implementation 'org.scala-lang:scala3-library_3:scala-library:""" + scala_version + """'
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    70
  compileOnly files(
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    71
    """ + jars.map(jar => groovy_string(File.platform_path(jar))).mkString("", ",\n    ", ")") +
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    72
"""
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    73
}
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    74
""")
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    75
    }
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    76
  }
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    77
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    78
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    79
  /* Maven */
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    80
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
    81
  object Maven extends Build_Tool {
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    82
    override def toString: String = "Maven"
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    83
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    84
    override val project_root: Path = Path.explode("pom.xml")
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    85
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
    86
    override def init_project(dir: Path, jars: List[Path]): Unit = {
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
    87
      def dependency(jar: Path): String = {
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    88
        val name = jar.expand.drop_ext.base.implode
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    89
        val system_path = File.platform_path(jar.absolute)
74656
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    90
      """  <dependency>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    91
    <groupId>classpath</groupId>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    92
    <artifactId>""" + XML.text(name) + """</artifactId>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    93
    <version>0</version>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    94
    <scope>system</scope>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    95
    <systemPath>""" + XML.text(system_path) + """</systemPath>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    96
  </dependency>"""
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    97
      }
74656
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    98
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
    99
      val project = """<?xml version="1.0" encoding="UTF-8"?>
74656
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   100
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   101
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   102
  <modelVersion>4.0.0</modelVersion>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   103
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   104
  <groupId>isabelle</groupId>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   105
  <artifactId>isabelle</artifactId>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   106
  <version>0</version>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   107
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   108
  <properties>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   109
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   110
    <maven.compiler.source>""" + java_version + """</maven.compiler.source>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   111
    <maven.compiler.target>""" + java_version + """</maven.compiler.target>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   112
  </properties>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   113
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   114
  <build>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   115
    <plugins>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   116
      <plugin>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   117
        <groupId>net.alchim31.maven</groupId>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   118
        <artifactId>scala-maven-plugin</artifactId>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   119
        <version>4.5.3</version>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   120
        <configuration>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   121
            <scalaVersion>""" + scala_version + """</scalaVersion>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   122
        </configuration>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   123
        </plugin>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   124
    </plugins>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   125
  </build>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   126
74659
f1c53e78d0f0 removed junk;
wenzelm
parents: 74656
diff changeset
   127
  <dependencies>""" + jars.map(dependency).mkString("\n", "\n", "\n") + """</dependencies>
74656
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   128
</project>"""
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   129
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   130
      File.write(dir + project_root, project)
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   131
    }
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   132
  }
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   133
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   134
74429
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
   135
  /* plugins: modules with dynamic build */
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   136
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
   137
  class Plugin(dir: Path) extends Isabelle_System.Service {
74429
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
   138
    def context(): Scala_Build.Context = Scala_Build.context(dir)
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
   139
  }
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
   140
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
   141
  lazy val plugins: List[Plugin] = Isabelle_System.make_services(classOf[Plugin])
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
   142
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
   143
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
   144
  /* file and directories */
74032
c9ec6f03ab91 more complete scala_project, including Isabelle/jEdit plugins;
wenzelm
parents: 74030
diff changeset
   145
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
   146
  lazy val isabelle_files: (List[Path], List[Path]) = {
74429
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
   147
    val contexts = Scala_Build.component_contexts() ::: plugins.map(_.context())
74030
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   148
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   149
    val jars1 = Path.split(Isabelle_System.getenv("ISABELLE_CLASSPATH"))
74056
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
   150
    val jars2 = contexts.flatMap(_.requirements)
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   151
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   152
    val jars =
74056
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
   153
      Library.distinct(jars1 ::: jars2).filterNot(path => contexts.exists(_.is_module(path)))
73987
fc363a3b690a build.props for isabelle.jar, including isabelle.jedit;
wenzelm
parents: 73912
diff changeset
   154
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   155
    val sources =
74030
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   156
      (for {
74032
c9ec6f03ab91 more complete scala_project, including Isabelle/jEdit plugins;
wenzelm
parents: 74030
diff changeset
   157
        context <- contexts.iterator
74056
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
   158
        path <- context.sources.iterator
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
   159
        if path.is_scala || path.is_java
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
   160
      } yield path).toList
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   161
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   162
    (jars, sources)
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   163
  }
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   164
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
   165
  lazy val isabelle_scala_files: Map[String, Path] = {
74055
0ee44ed80290 clarified signature;
wenzelm
parents: 74054
diff changeset
   166
    val context = Scala_Build.context(Path.ISABELLE_HOME, component = true)
74056
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
   167
    context.sources.iterator.foldLeft(Map.empty[String, Path]) {
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
   168
      case (map, path) =>
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
   169
        if (path.is_scala) {
74030
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   170
        val base = path.base.implode
72762
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   171
          map.get(base) match {
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   172
            case None => map + (base -> path)
74030
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   173
            case Some(path2) => error("Conflicting base names: " + path + " vs. " + path2)
72762
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   174
          }
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   175
        }
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   176
        else map
73359
d8a0e996614b tuned --- fewer warnings;
wenzelm
parents: 73340
diff changeset
   177
    }
73675
6c56f2ebe157 guess package more directly;
wenzelm
parents: 73522
diff changeset
   178
  }
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   179
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   180
72755
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   181
  /* compile-time position */
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   182
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
   183
  def here: Here = {
72755
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   184
    val exn = new Exception
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   185
    exn.getStackTrace.toList match {
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   186
      case _ :: caller :: _ =>
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   187
        val name = proper_string(caller.getFileName).getOrElse("")
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   188
        val line = caller.getLineNumber
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   189
        new Here(name, line)
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   190
      case _ => new Here("", 0)
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   191
    }
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   192
  }
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   193
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
   194
  class Here private[Scala_Project](name: String, line: Int) {
72755
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   195
    override def toString: String = name + ":" + line
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   196
    def position: Position.T =
72762
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   197
      isabelle_scala_files.get(name) match {
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   198
        case Some(path) => Position.Line_File(line, path.implode)
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   199
        case None => Position.none
72755
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   200
      }
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   201
  }
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   202
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   203
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   204
  /* scala project */
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   205
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   206
  val default_project_dir = Path.explode("$ISABELLE_HOME_USER/scala_project")
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   207
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
   208
  def package_name(source_file: Path): Option[String] = {
74830
40bb5f41e06c more robust support for Windows line-endings;
wenzelm
parents: 74737
diff changeset
   209
    val lines = Library.trim_split_lines(File.read(source_file))
74030
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   210
    val Package = """\s*\bpackage\b\s*(?:object\b\s*)?((?:\w|\.)+)\b.*""".r
74104
fa92c5f8af86 clarified jEdit java sources;
wenzelm
parents: 74103
diff changeset
   211
    lines.collectFirst({ case Package(name) => name })
74030
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   212
  }
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   213
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   214
  def scala_project(
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   215
    build_tool: Build_Tool,
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   216
    project_dir: Path = default_project_dir,
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   217
    more_sources: List[Path] = Nil,
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   218
    symlinks: Boolean = false,
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   219
    force: Boolean = false,
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
   220
    progress: Progress = new Progress
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
   221
  ): Unit = {
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   222
    if (project_dir.file.exists) {
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   223
      val detect = project_dir.is_dir && build_tools.exists(_.detect_project(project_dir))
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   224
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   225
      if (force && detect) {
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   226
        progress.echo("Purging existing project directory: " + project_dir.absolute)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   227
        Isabelle_System.rm_tree(project_dir)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   228
      }
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   229
      else error("Project directory already exists: " + project_dir.absolute)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   230
    }
71524
4b908e70d642 copy jEdit sources instead of jar, for better browsing experience;
wenzelm
parents: 71503
diff changeset
   231
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   232
    progress.echo("Creating " + build_tool + " project directory: " + project_dir.absolute)
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   233
    Isabelle_System.make_directory(project_dir)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   234
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   235
    val java_src_dir = Isabelle_System.make_directory(project_dir + build_tool.java_src_dir)
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   236
    val scala_src_dir = Isabelle_System.make_directory(project_dir + build_tool.scala_src_dir)
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   237
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   238
    val (jars, sources) = isabelle_files
72762
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   239
    isabelle_scala_files
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   240
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   241
    build_tool.init_project(project_dir, jars)
74656
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   242
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   243
    for (source <- sources ::: more_sources) {
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   244
      val dir = build_tool.package_dir(source)
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   245
      val target_dir = project_dir + dir
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   246
      if (!target_dir.is_dir) {
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   247
        progress.echo("  Creating package directory: " + dir)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   248
        Isabelle_System.make_directory(target_dir)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   249
      }
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   250
      if (symlinks) Isabelle_System.symlink(source.absolute, target_dir, native = true)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   251
      else Isabelle_System.copy_file(source, target_dir)
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   252
    }
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   253
  }
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   254
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   255
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   256
  /* Isabelle tool wrapper */
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   257
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   258
  val isabelle_tool =
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   259
    Isabelle_Tool("scala_project", "setup IDE project for Isabelle/Java/Scala sources",
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 75082
diff changeset
   260
      Scala_Project.here,
75394
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   261
      { args =>
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   262
        var build_tool: Option[Build_Tool] = None
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   263
        var project_dir = default_project_dir
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   264
        var symlinks = false
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   265
        var force = false
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   266
75394
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   267
        val getopts = Getopts("""
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   268
Usage: isabelle scala_project [OPTIONS] [MORE_SOURCES ...]
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   269
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   270
  Options are:
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   271
    -D DIR       project directory (default: """ + default_project_dir + """)
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   272
    -G           use Gradle as build tool
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   273
    -L           make symlinks to original source files
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   274
    -M           use Maven as build tool
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   275
    -f           force update of existing directory
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   276
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   277
  Setup project for Isabelle/Scala/jEdit --- to support common IDEs such
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   278
  as IntelliJ IDEA. Either option -G or -M is mandatory to specify the
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   279
  build tool.
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   280
""",
75394
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   281
          "D:" -> (arg => project_dir = Path.explode(arg)),
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   282
          "G" -> (_ => build_tool = Some(Gradle)),
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   283
          "L" -> (_ => symlinks = true),
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   284
          "M" -> (_ => build_tool = Some(Maven)),
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   285
          "f" -> (_ => force = true))
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   286
75394
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   287
        val more_args = getopts(args)
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   288
75394
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   289
        val more_sources = more_args.map(Path.explode)
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   290
        val progress = new Console_Progress
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   291
75394
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   292
        if (build_tool.isEmpty) {
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   293
          error("Unspecified build tool: need to provide option -G or -M")
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   294
        }
74960
f03ece7155d6 support Gradle as alternative to Maven (again);
wenzelm
parents: 74830
diff changeset
   295
75394
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   296
        scala_project(build_tool.get, project_dir = project_dir, more_sources = more_sources,
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   297
          symlinks = symlinks, force = force, progress = progress)
42267c650205 tuned formatting;
wenzelm
parents: 75393
diff changeset
   298
      })
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   299
}