src/Pure/Tools/scala_project.scala
author Mathias Fleury <Mathias.Fleury@mpi-inf.mpg.de>
Thu, 04 Nov 2021 16:50:03 +0100
changeset 74691 634e2323b6cf
parent 74659 f1c53e78d0f0
child 74737 d912c1b6c1d0
permissions -rw-r--r--
proper support of verit's return code for timeout
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
74656
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
     4
Manage Isabelle/Scala/Java project sources, with output to Maven for
74054
9ce319c846d9 tuned comments;
wenzelm
parents: 74032
diff changeset
     5
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
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
    11
object Scala_Project
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
    12
{
74656
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    13
  /* Maven project */
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
    14
74656
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    15
  def java_version: String = "11"
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    16
  def scala_version: String = scala.util.Properties.versionNumberString
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    17
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    18
  def maven_project(jars: List[Path]): String =
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
    19
  {
74656
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    20
    def dependency(jar: Path): String =
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    21
    {
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    22
      val name = jar.expand.drop_ext.base.implode
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    23
      val system_path = File.platform_path(jar.absolute)
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    24
      """  <dependency>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    25
    <groupId>classpath</groupId>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    26
    <artifactId>""" + XML.text(name) + """</artifactId>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    27
    <version>0</version>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    28
    <scope>system</scope>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    29
    <systemPath>""" + XML.text(system_path) + """</systemPath>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    30
  </dependency>"""
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    31
    }
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    32
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    33
    """<?xml version="1.0" encoding="UTF-8"?>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    34
<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
    35
  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
    36
  <modelVersion>4.0.0</modelVersion>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    37
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    38
  <groupId>isabelle</groupId>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    39
  <artifactId>isabelle</artifactId>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    40
  <version>0</version>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    41
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    42
  <properties>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    43
    <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
    44
    <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
    45
    <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
    46
  </properties>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    47
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    48
  <build>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    49
    <plugins>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    50
      <plugin>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    51
        <groupId>net.alchim31.maven</groupId>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    52
        <artifactId>scala-maven-plugin</artifactId>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    53
        <version>4.5.3</version>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    54
        <configuration>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    55
            <scalaVersion>""" + scala_version + """</scalaVersion>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    56
        </configuration>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    57
        </plugin>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    58
    </plugins>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    59
  </build>
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
    60
74659
f1c53e78d0f0 removed junk;
wenzelm
parents: 74656
diff changeset
    61
  <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
    62
</project>"""
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
    63
  }
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
    64
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
    65
74429
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
    66
  /* plugins: modules with dynamic build */
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
    67
74429
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
    68
  class Plugin(dir: Path) extends Isabelle_System.Service
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
    69
  {
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
    70
    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
    71
  }
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
    72
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
    73
  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
    74
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
    75
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
    76
  /* file and directories */
74032
c9ec6f03ab91 more complete scala_project, including Isabelle/jEdit plugins;
wenzelm
parents: 74030
diff changeset
    77
74030
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
    78
  lazy val isabelle_files: (List[Path], List[Path]) =
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
    79
  {
74429
fedc0b659881 provide Isabelle/jEdit plugins as services, and thus allow user components do the same;
wenzelm
parents: 74104
diff changeset
    80
    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
    81
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
    82
    val jars1 = Path.split(Isabelle_System.getenv("ISABELLE_CLASSPATH"))
74056
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
    83
    val jars2 = contexts.flatMap(_.requirements)
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
    84
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
    85
    val jars =
74056
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
    86
      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
    87
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
    88
    val sources =
74030
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
    89
      (for {
74032
c9ec6f03ab91 more complete scala_project, including Isabelle/jEdit plugins;
wenzelm
parents: 74030
diff changeset
    90
        context <- contexts.iterator
74056
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
    91
        path <- context.sources.iterator
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
    92
        if path.is_scala || path.is_java
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
    93
      } yield path).toList
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
    94
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
    95
    (jars, sources)
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
    96
  }
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
    97
72762
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
    98
  lazy val isabelle_scala_files: Map[String, Path] =
74030
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
    99
  {
74055
0ee44ed80290 clarified signature;
wenzelm
parents: 74054
diff changeset
   100
    val context = Scala_Build.context(Path.ISABELLE_HOME, component = true)
74056
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
   101
    context.sources.iterator.foldLeft(Map.empty[String, Path]) {
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
   102
      case (map, path) =>
fb8d5c0133c9 clarified signature;
wenzelm
parents: 74055
diff changeset
   103
        if (path.is_scala) {
74030
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   104
        val base = path.base.implode
72762
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   105
          map.get(base) match {
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   106
            case None => map + (base -> path)
74030
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   107
            case Some(path2) => error("Conflicting base names: " + path + " vs. " + path2)
72762
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   108
          }
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   109
        }
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   110
        else map
73359
d8a0e996614b tuned --- fewer warnings;
wenzelm
parents: 73340
diff changeset
   111
    }
73675
6c56f2ebe157 guess package more directly;
wenzelm
parents: 73522
diff changeset
   112
  }
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   113
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   114
72755
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   115
  /* compile-time position */
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   116
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   117
  def here: Here =
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   118
  {
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   119
    val exn = new Exception
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   120
    exn.getStackTrace.toList match {
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   121
      case _ :: caller :: _ =>
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   122
        val name = proper_string(caller.getFileName).getOrElse("")
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   123
        val line = caller.getLineNumber
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   124
        new Here(name, line)
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   125
      case _ => new Here("", 0)
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   126
    }
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   127
  }
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   128
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   129
  class Here private[Scala_Project](name: String, line: Int)
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   130
  {
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   131
    override def toString: String = name + ":" + line
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   132
    def position: Position.T =
72762
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   133
      isabelle_scala_files.get(name) match {
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   134
        case Some(path) => Position.Line_File(line, path.implode)
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   135
        case None => Position.none
72755
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   136
      }
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   137
  }
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   138
8dffbe01a3e1 support for Scala compile-time positions;
wenzelm
parents: 72748
diff changeset
   139
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   140
  /* scala project */
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   141
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   142
  val default_project_dir = Path.explode("$ISABELLE_HOME_USER/scala_project")
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   143
74104
fa92c5f8af86 clarified jEdit java sources;
wenzelm
parents: 74103
diff changeset
   144
  def package_name(source_file: Path): Option[String] =
74030
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   145
  {
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   146
    val lines = split_lines(File.read(source_file))
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   147
    val Package = """\s*\bpackage\b\s*(?:object\b\s*)?((?:\w|\.)+)\b.*""".r
74104
fa92c5f8af86 clarified jEdit java sources;
wenzelm
parents: 74103
diff changeset
   148
    lines.collectFirst({ case Package(name) => name })
74030
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   149
  }
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   150
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   151
  def the_package_dir(source_file: Path): Path =
74104
fa92c5f8af86 clarified jEdit java sources;
wenzelm
parents: 74103
diff changeset
   152
  {
fa92c5f8af86 clarified jEdit java sources;
wenzelm
parents: 74103
diff changeset
   153
    package_name(source_file) match {
fa92c5f8af86 clarified jEdit java sources;
wenzelm
parents: 74103
diff changeset
   154
      case Some(name) =>
fa92c5f8af86 clarified jEdit java sources;
wenzelm
parents: 74103
diff changeset
   155
        if (source_file.is_java) Path.explode(space_explode('.', name).mkString("/"))
fa92c5f8af86 clarified jEdit java sources;
wenzelm
parents: 74103
diff changeset
   156
        else Path.basic(name)
fa92c5f8af86 clarified jEdit java sources;
wenzelm
parents: 74103
diff changeset
   157
      case None => error("Failed to guess package from " + source_file)
fa92c5f8af86 clarified jEdit java sources;
wenzelm
parents: 74103
diff changeset
   158
    }
fa92c5f8af86 clarified jEdit java sources;
wenzelm
parents: 74103
diff changeset
   159
  }
74030
39e05601faeb more accurate scala_project, based on build.props of components;
wenzelm
parents: 73987
diff changeset
   160
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   161
  def scala_project(
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   162
    project_dir: Path = default_project_dir,
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   163
    more_sources: List[Path] = Nil,
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   164
    symlinks: Boolean = false,
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   165
    force: Boolean = false,
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   166
    progress: Progress = new Progress): Unit =
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   167
  {
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   168
    if (project_dir.file.exists) {
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   169
      val detect =
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   170
        project_dir.is_dir &&
74656
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   171
        (project_dir + Path.explode("pom.xml")).is_file &&
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   172
        (project_dir + Path.explode("src/main/scala")).is_dir
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   173
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   174
      if (force && detect) {
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   175
        progress.echo("Purging existing project directory: " + project_dir.absolute)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   176
        Isabelle_System.rm_tree(project_dir)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   177
      }
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   178
      else error("Project directory already exists: " + project_dir.absolute)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   179
    }
71524
4b908e70d642 copy jEdit sources instead of jar, for better browsing experience;
wenzelm
parents: 71503
diff changeset
   180
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   181
    progress.echo("Creating project directory: " + project_dir.absolute)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   182
    Isabelle_System.make_directory(project_dir)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   183
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   184
    val java_src_dir = Isabelle_System.make_directory(Path.explode("src/main/java"))
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   185
    val scala_src_dir = Isabelle_System.make_directory(Path.explode("src/main/scala"))
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   186
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   187
    val (jars, sources) = isabelle_files
72762
d9a54c4c9da9 more robust isabelle_scala_files;
wenzelm
parents: 72755
diff changeset
   188
    isabelle_scala_files
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   189
74656
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   190
    File.write(project_dir + Path.explode("pom.xml"), maven_project(jars))
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   191
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   192
    for (source <- sources ::: more_sources) {
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   193
      val dir = (if (source.is_java) java_src_dir else scala_src_dir) + the_package_dir(source)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   194
      val target_dir = project_dir + dir
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   195
      if (!target_dir.is_dir) {
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   196
        progress.echo("  Creating package directory: " + dir)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   197
        Isabelle_System.make_directory(target_dir)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   198
      }
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   199
      if (symlinks) Isabelle_System.symlink(source.absolute, target_dir, native = true)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   200
      else Isabelle_System.copy_file(source, target_dir)
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   201
    }
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   202
  }
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   203
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   204
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   205
  /* Isabelle tool wrapper */
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   206
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   207
  val isabelle_tool =
74656
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   208
    Isabelle_Tool("scala_project", "setup Maven project for Isabelle/Scala/jEdit",
72763
3cc73d00553c added document antiquotation @{tool};
wenzelm
parents: 72762
diff changeset
   209
      Scala_Project.here, args =>
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   210
    {
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   211
      var project_dir = default_project_dir
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   212
      var symlinks = false
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   213
      var force = false
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   214
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   215
      val getopts = Getopts("""
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   216
Usage: isabelle scala_project [OPTIONS] [MORE_SOURCES ...]
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   217
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   218
  Options are:
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   219
    -D DIR       project directory (default: """ + default_project_dir + """)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   220
    -L           make symlinks to original source files
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   221
    -f           force update of existing directory
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   222
74656
0659536b150b more robust "isabelle scala_project": Gradle has been replaced by Maven;
wenzelm
parents: 74429
diff changeset
   223
  Setup Maven project for Isabelle/Scala/jEdit --- to support common IDEs
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   224
  such as IntelliJ IDEA.
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   225
""",
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   226
        "D:" -> (arg => project_dir = Path.explode(arg)),
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   227
        "L" -> (_ => symlinks = true),
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   228
        "f" -> (_ => force = true))
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   229
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   230
      val more_args = getopts(args)
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   231
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   232
      val more_sources = more_args.map(Path.explode)
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   233
      val progress = new Console_Progress
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   234
74071
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   235
      scala_project(project_dir = project_dir, more_sources = more_sources,
b25b7c264a93 various improvements of "isabelle scala_project";
wenzelm
parents: 74070
diff changeset
   236
        symlinks = symlinks, force = force, progress = progress)
71378
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   237
    })
820cf124dced added "isabelle scala_project" to support e.g. IntelliJ IDEA;
wenzelm
parents:
diff changeset
   238
}