diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c0d6f8435..1a50fded7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ jobs: fail-fast: false matrix: include: - - os: ubuntu-latest + - os: ubuntu-20.04 java: 17 distribution: temurin jobtype: 1 @@ -41,8 +41,8 @@ jobs: distribution: adopt jobtype: 7 - os: macos-12 - java: 8 - distribution: adopt + java: 17 + distribution: temurin jobtype: 8 - os: windows-2019 java: 8 @@ -59,168 +59,168 @@ jobs: JDK11: adopt@1.11.0-9 SPARK_LOCAL_IP: "127.0.0.1" steps: - - name: Checkout sbt/sbt - uses: actions/checkout@v3 - - name: Checkout sbt/io - uses: actions/checkout@v3 - with: - repository: sbt/io - ref: develop - path: io - - name: Checkout sbt/librarymanagement - uses: actions/checkout@v3 - with: - repository: sbt/librarymanagement - ref: develop - path: librarymanagement - - name: Checkout sbt/zinc - uses: actions/checkout@v3 - with: - repository: sbt/zinc - ref: wip/sbt-2.x - path: zinc - - name: Setup JDK - uses: actions/setup-java@v3 - with: - distribution: "${{ matrix.distribution }}" - java-version: "${{ matrix.java }}" - - name: Set up Python 3.7 - uses: actions/setup-python@v4 - with: - python-version: 3.7 - - name: Coursier cache - uses: coursier/cache-action@v6 - # - name: Cache sbt - # uses: actions/cache@v3 - # with: - # path: ~/.sbt - # key: ${{ runner.os }}-sbt-cache-${{ hashFiles('**/*.sbt') }}-${{ hashFiles('project/build.properties') }} - - name: Setup Windows C++ toolchain - uses: ilammy/msvc-dev-cmd@v1 - if: ${{ matrix.os == 'windows-2019' }} - - name: Pre-test cleanup - shell: bash - run: | - rm -rf "$HOME/.sbt/scripted/" || true - rm -rf "$HOME/.ivy2/local" || true - rm -r $(find $HOME/.sbt/boot -name "*-SNAPSHOT") || true - - name: Publish local Zinc - shell: bash - run: | - ./sbt -v lowerUtils/publishLocal - cd zinc/ - sbt publishLocal - - name: Build and test (1) - if: ${{ matrix.jobtype == 1 }} - shell: bash - run: | - rm -rf "$HOME/.sbt/boot/" || true - # ./sbt -v --client mimaReportBinaryIssues - ./sbt -v --client javafmtCheck - ./sbt -v --client "Test/javafmtCheck" - ./sbt -v --client scalafmtCheckAll - ./sbt -v --client scalafmtSbtCheck - ./sbt -v --client serverTestProj/scalafmtCheckAll - # ./sbt -v --client headerCheck - # ./sbt -v --client "Test/headerCheck" - ./sbt -v --client "Test/compile" - ./sbt -v --client publishLocal - ./sbt -v --client test - ./sbt -v --client "serverTestProj/test" - # ./sbt -v --client doc - ./sbt -v --client "all $UTIL_TESTS" - ./sbt -v --client ++2.13.x - ./sbt -v --client "all $UTIL_TESTS" - ./sbt -v --client ++2.12.x - ./sbt -v --client "all $UTIL_TESTS" - - name: Build and test (2) - if: ${{ matrix.jobtype == 2 }} - shell: bash - run: | - ./sbt -v "scripted actions/* apiinfo/* compiler-project/* ivy-deps-management/* reporter/* tests/* classloader-cache/* package/*" - # ./sbt -v "scripted watch/*" - - name: Build and test (3) - if: ${{ matrix.jobtype == 3 }} - shell: bash - run: | - # ./sbt -v "dependencyTreeProj/publishLocal; scripted dependency-graph/*" - ./sbt -v --client "scripted dependency-management/* project-load/* java/* run/*" - # ./sbt -v --client "scripted plugins/*" - # ./sbt -v --client "scripted nio/*" - - name: Build and test (4) - if: ${{ matrix.jobtype == 4 }} - shell: bash - run: | - # ./sbt -v "repoOverrideTest:scripted dependency-management/*" - ./sbt -v "scripted source-dependencies/*" - # ./sbt -v "scripted project/*" - - name: Build and test (5) - if: ${{ matrix.jobtype == 5 }} - shell: bash - run: | - ./sbt -v --client test - ./sbt -v --client "++2.13.x; all $UTIL_TESTS" - ./sbt -v --client "++2.12.x; all $UTIL_TESTS" - # - name: Build and test (6) - # if: ${{ matrix.jobtype == 6 }} - # shell: bash - # run: | - # # build from fresh IO, LM, and Zinc - # BUILD_VERSION="1.5.0-SNAPSHOT" - # cd io - # sbt -v -Dsbt.build.version=${BUILD_VERSION} +publishLocal - # cd ../ - # sbt -Dsbtlm.path=$HOME/work/sbt/sbt/librarymanagement -Dsbtzinc.path=$HOME/work/sbt/sbt/zinc -Dsbt.build.version=$BUILD_VERSION -Dsbt.build.fatal=false "+lowerUtils/publishLocal; {librarymanagement}/publishLocal; {zinc}/publishLocal; upperModules/publishLocal" - # rm -r $(find $HOME/.sbt/boot -name "*-SNAPSHOT") || true - # sbt -v -Dsbt.version=$BUILD_VERSION "++$SCALA_213; all $UTIL_TESTS; ++$SCALA_212; all $UTIL_TESTS; scripted actions/* source-dependencies/*1of3 dependency-management/*1of4 java/*" - - name: Build and test (7) - if: ${{ matrix.jobtype == 7 }} - shell: bash - run: | - # test building sbtn on Linux - sbt "-Dsbt.io.virtual=false" nativeImage - # test launcher script - echo build using JDK 8 test using JDK 8 and JDK 11 - cd launcher-package - sbt -Dsbt.build.version=$TEST_SBT_VER rpm:packageBin debian:packageBin - sbt -Dsbt.build.version=$TEST_SBT_VER universal:packageBin universal:stage integrationTest/test - cd citest && ./test.sh - $HOME/bin/jabba install $JDK11 && exec $HOME/bin/jabba which --home $JDK11 - java -Xmx32m -version - ./test.sh - - name: Build and test (8) - if: ${{ matrix.jobtype == 8 }} - shell: bash - run: | - # test building sbtn on macOS - sbt "-Dsbt.io.virtual=false" nativeImage - # test launcher script - echo build using JDK 8, test using JDK 8, on macOS - cd launcher-package - bin/coursier resolve - sbt -Dsbt.build.version=$TEST_SBT_VER universal:packageBin universal:stage integrationTest/test - cd citest && ./test.sh - - name: Build and test (9) - if: ${{ matrix.jobtype == 9 }} - shell: bash - run: | - # test building sbtn on Windows - sbt "-Dsbt.io.virtual=false" nativeImage - # test launcher script - echo build using JDK 8, test using JDK 8, on Windows - cd launcher-package - bin/coursier.bat resolve - sbt -Dsbt.build.version=$TEST_SBT_VER universal:packageBin universal:stage integrationTest/test - cd citest - ./test.bat - test3/test3.bat - - name: Cleanup - shell: bash - run: | - rm -rf "$HOME/.sbt/scripted/" || true - rm -rf "$HOME/.ivy2/local" || true - rm -r $(find $HOME/.sbt/boot -name "*-SNAPSHOT") || true - find $HOME/Library/Caches/Coursier/v1 -name "ivydata-*.properties" -delete || true - find $HOME/.ivy2/cache -name "ivydata-*.properties" -delete || true - find $HOME/.cache/coursier/v1 -name "ivydata-*.properties" -delete || true - find $HOME/.sbt -name "*.lock" -delete || true + - name: Checkout sbt/sbt + uses: actions/checkout@v4 + - name: Checkout sbt/io + uses: actions/checkout@v4 + with: + repository: sbt/io + ref: develop + path: io + - name: Checkout sbt/librarymanagement + uses: actions/checkout@v4 + with: + repository: sbt/librarymanagement + ref: develop + path: librarymanagement + - name: Checkout sbt/zinc + uses: actions/checkout@v4 + with: + repository: sbt/zinc + ref: wip/sbt-2.x + path: zinc + - name: Setup JDK + uses: actions/setup-java@v4 + with: + distribution: "${{ matrix.distribution }}" + java-version: "${{ matrix.java }}" + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: 3.12 + - name: Coursier cache + uses: coursier/cache-action@v6 + # - name: Cache sbt + # uses: actions/cache@v3 + # with: + # path: ~/.sbt + # key: ${{ runner.os }}-sbt-cache-${{ hashFiles('**/*.sbt') }}-${{ hashFiles('project/build.properties') }} + - name: Setup Windows C++ toolchain + uses: ilammy/msvc-dev-cmd@v1 + if: ${{ matrix.os == 'windows-2019' }} + - name: Pre-test cleanup + shell: bash + run: | + rm -rf "$HOME/.sbt/scripted/" || true + rm -rf "$HOME/.ivy2/local" || true + rm -r $(find $HOME/.sbt/boot -name "*-SNAPSHOT") || true + - name: Publish local Zinc + shell: bash + run: | + ./sbt -v lowerUtils/publishLocal + cd zinc/ + sbt publishLocal + - name: Build and test (1) + if: ${{ matrix.jobtype == 1 }} + shell: bash + run: | + rm -rf "$HOME/.sbt/boot/" || true + # ./sbt -v --client mimaReportBinaryIssues + ./sbt -v --client javafmtCheck + ./sbt -v --client "Test/javafmtCheck" + ./sbt -v --client scalafmtCheckAll + ./sbt -v --client scalafmtSbtCheck + ./sbt -v --client serverTestProj/scalafmtCheckAll + # ./sbt -v --client headerCheck + # ./sbt -v --client "Test/headerCheck" + ./sbt -v --client "Test/compile" + ./sbt -v --client publishLocal + ./sbt -v --client test + ./sbt -v --client "serverTestProj/test" + # ./sbt -v --client doc + ./sbt -v --client "all $UTIL_TESTS" + ./sbt -v --client ++2.13.x + ./sbt -v --client "all $UTIL_TESTS" + ./sbt -v --client ++2.12.x + ./sbt -v --client "all $UTIL_TESTS" + - name: Build and test (2) + if: ${{ matrix.jobtype == 2 }} + shell: bash + run: | + ./sbt -v "scripted actions/* apiinfo/* compiler-project/* ivy-deps-management/* reporter/* tests/* classloader-cache/* package/*" + # ./sbt -v "scripted watch/*" + - name: Build and test (3) + if: ${{ matrix.jobtype == 3 }} + shell: bash + run: | + # ./sbt -v "dependencyTreeProj/publishLocal; scripted dependency-graph/*" + ./sbt -v --client "scripted dependency-management/* project-load/* java/* run/*" + # ./sbt -v --client "scripted plugins/*" + # ./sbt -v --client "scripted nio/*" + - name: Build and test (4) + if: ${{ matrix.jobtype == 4 }} + shell: bash + run: | + # ./sbt -v "repoOverrideTest:scripted dependency-management/*" + ./sbt -v "scripted source-dependencies/*" + # ./sbt -v "scripted project/*" + - name: Build and test (5) + if: ${{ matrix.jobtype == 5 }} + shell: bash + run: | + ./sbt -v --client test + ./sbt -v --client "++2.13.x; all $UTIL_TESTS" + ./sbt -v --client "++2.12.x; all $UTIL_TESTS" + # - name: Build and test (6) + # if: ${{ matrix.jobtype == 6 }} + # shell: bash + # run: | + # # build from fresh IO, LM, and Zinc + # BUILD_VERSION="1.5.0-SNAPSHOT" + # cd io + # sbt -v -Dsbt.build.version=${BUILD_VERSION} +publishLocal + # cd ../ + # sbt -Dsbtlm.path=$HOME/work/sbt/sbt/librarymanagement -Dsbtzinc.path=$HOME/work/sbt/sbt/zinc -Dsbt.build.version=$BUILD_VERSION -Dsbt.build.fatal=false "+lowerUtils/publishLocal; {librarymanagement}/publishLocal; {zinc}/publishLocal; upperModules/publishLocal" + # rm -r $(find $HOME/.sbt/boot -name "*-SNAPSHOT") || true + # sbt -v -Dsbt.version=$BUILD_VERSION "++$SCALA_213; all $UTIL_TESTS; ++$SCALA_212; all $UTIL_TESTS; scripted actions/* source-dependencies/*1of3 dependency-management/*1of4 java/*" + - name: Build and test (7) + if: ${{ matrix.jobtype == 7 }} + shell: bash + run: | + # test building sbtn on Linux + sbt "-Dsbt.io.virtual=false" nativeImage + # test launcher script + echo build using JDK 8 test using JDK 8 and JDK 11 + cd launcher-package + sbt -Dsbt.build.version=$TEST_SBT_VER rpm:packageBin debian:packageBin + sbt -Dsbt.build.version=$TEST_SBT_VER integrationTest/test + cd citest && ./test.sh + $HOME/bin/jabba install $JDK11 && exec $HOME/bin/jabba which --home $JDK11 + java -Xmx32m -version + ./test.sh + - name: Build and test (8) + if: ${{ matrix.jobtype == 8 }} + shell: bash + run: | + # test building sbtn on macOS + ./sbt "-Dsbt.io.virtual=false" nativeImage + # test launcher script + cd launcher-package + bin/coursier resolve + ../sbt -Dsbt.build.version=$TEST_SBT_VER integrationTest/test + # This fails due to the JLine issue + # cd citest && ./test.sh + - name: Build and test (9) + if: ${{ matrix.jobtype == 9 }} + shell: bash + run: | + # test building sbtn on Windows + sbt "-Dsbt.io.virtual=false" nativeImage + # test launcher script + echo build using JDK 8, test using JDK 8, on Windows + cd launcher-package + bin/coursier.bat resolve + sbt -Dsbt.build.version=$TEST_SBT_VER integrationTest/test + cd citest + ./test.bat + test3/test3.bat + - name: Cleanup + shell: bash + run: | + rm -rf "$HOME/.sbt/scripted/" || true + rm -rf "$HOME/.ivy2/local" || true + rm -r $(find $HOME/.sbt/boot -name "*-SNAPSHOT") || true + find $HOME/Library/Caches/Coursier/v1 -name "ivydata-*.properties" -delete || true + find $HOME/.ivy2/cache -name "ivydata-*.properties" -delete || true + find $HOME/.cache/coursier/v1 -name "ivydata-*.properties" -delete || true + find $HOME/.sbt -name "*.lock" -delete || true diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml new file mode 100644 index 000000000..f9ead39fd --- /dev/null +++ b/.github/workflows/cla.yml @@ -0,0 +1,24 @@ +name: Scala CLA +on: [pull_request] +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Check CLA + env: + AUTHOR: ${{ github.event.pull_request.user.login }} + run: | + echo "Pull request submitted by $AUTHOR"; + signed=$(curl -s "https://www.lightbend.com/contribute/cla/scala/check/$AUTHOR" | jq -r ".signed"); + if [ "$signed" = "true" ] ; then + echo "CLA check for $AUTHOR successful"; + else + echo "CLA check for $AUTHOR failed"; + echo "Please sign the Scala CLA to contribute to the Scala compiler."; + echo "Go to https://www.lightbend.com/contribute/cla/scala and then"; + echo "comment on the pull request to ask for a new check."; + echo ""; + echo "Check if CLA is signed: https://www.lightbend.com/contribute/cla/scala/check/$AUTHOR"; + exit 1; + fi; diff --git a/.github/workflows/dependency-graph.yml b/.github/workflows/dependency-graph.yml index 0ab49c9b3..8e5f9dc7a 100644 --- a/.github/workflows/dependency-graph.yml +++ b/.github/workflows/dependency-graph.yml @@ -2,7 +2,7 @@ name: Submit Dependency Graph on: push: - branches: [1.7.x] # default branch of the project + branches: [1.9.x] # default branch of the project permissions: {} jobs: submit-graph: @@ -12,5 +12,5 @@ jobs: name: Submit Dependency Graph runs-on: ubuntu-latest # or windows-latest, or macOS-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: scalacenter/sbt-dependency-submission@v2 diff --git a/.github/workflows/lock-thread.yml b/.github/workflows/lock-thread.yml new file mode 100644 index 000000000..7181837cf --- /dev/null +++ b/.github/workflows/lock-thread.yml @@ -0,0 +1,23 @@ +name: 'Lock Threads' + +on: + schedule: + # once a week on Saturday + - cron: '0 1 * * 6' + workflow_dispatch: + +permissions: + issues: write + pull-requests: write + discussions: write + +concurrency: + group: lock-threads + +jobs: + action: + runs-on: ubuntu-latest + steps: + - uses: dessant/lock-threads@v5 + with: + process-only: "issues" diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index b7664a12f..767d58986 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -15,34 +15,36 @@ jobs: include: - os: ubuntu-latest java: 8 + distribution: adopt runs-on: ${{ matrix.os }} env: JAVA_OPTS: -Xms800M -Xmx800M -Xss6M -XX:ReservedCodeCacheSize=128M -server -Dsbt.io.virtual=false -Dfile.encoding=UTF-8 steps: - name: Checkout sbt/sbt - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Checkout sbt/io - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: sbt/io ref: develop path: io - name: Checkout sbt/librarymanagement - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: sbt/librarymanagement ref: develop path: librarymanagement - name: Checkout sbt/zinc - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: sbt/zinc ref: develop path: zinc - - name: Setup - uses: olafurpg/setup-scala@v13 + - name: Setup JDK + uses: actions/setup-java@v4 with: - java-version: "adopt@1.${{ matrix.java }}" + distribution: "${{ matrix.distribution }}" + java-version: "${{ matrix.java }}" - name: Coursier cache uses: coursier/cache-action@v6 - name: Build and deploy diff --git a/.github/workflows/winget.yml b/.github/workflows/winget.yml new file mode 100644 index 000000000..95640dd33 --- /dev/null +++ b/.github/workflows/winget.yml @@ -0,0 +1,12 @@ +name: Publish to WinGet +on: + release: + types: [released] +jobs: + publish: + runs-on: windows-latest # action can only be run on windows + steps: + - uses: vedantmgoyal2009/winget-releaser@v2 + with: + identifier: sbt.sbt + token: ${{ secrets.WINGET_TOKEN }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7a90de47c..7fd032b34 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -98,34 +98,6 @@ Pull Requests See below for the branch to work against. -### Adding notes - -Most pull requests should include a "Notes" file which documents the change. This file should reside in the -directory: - - - notes/ - / - .md - -Notes files should have the following contents: - -* Bullet item description under one of the following sections: - - `### Bug fixes` - - `### Improvements` - - `### Fixes with compatibility implications` -* Complete section describing new features. - -### Clean history - -Make sure you document each commit and squash them appropriately. You can use the following guides as a reference: - -* Scala's documentation on [Git Hygiene](https://github.com/scala/scala/tree/v2.12.0-M3#git-hygiene) -* Play's documentation on [Working with Git](https://www.playframework.com/documentation/2.4.4/WorkingWithGit#Squashing-commits) - -Build from source ------------------ - See [DEVELOPING](./DEVELOPING.md) Profiling sbt @@ -133,27 +105,13 @@ Profiling sbt See [PROFILING](./PROFILING.md) -Other notes for maintainers ---------------------------- - -### Publishing VS Code Extensions - -Reference https://code.visualstudio.com/docs/extensions/publish-extension - -``` -$ sbt -> vscodePlugin/compile -> exit -cd vscode-sbt-scala/client -# update version number in vscode-sbt-scala/client/package.json -$ vsce package -$ vsce publish -``` +Other notes +----------- ## Signing the CLA Contributing to sbt requires you or your employer to sign the -[Lightbend Contributor License Agreement](https://www.lightbend.com/contribute/cla). +[Scala Contributor License Agreement](https://www.lightbend.com/contribute/cla/scala). To make it easier to respect our license agreements, we have added an sbt task that takes care of adding the LICENSE headers to new files. Run `headerCreate` diff --git a/DEVELOPING.md b/DEVELOPING.md index 909fb566a..8616765d3 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -7,15 +7,15 @@ Create a [fork](https://docs.github.com/en/github/getting-started-with-github/fo ### Branch to work against -sbt uses **two or three** branches for development: -Generally the default branch set on Github is what we recommend as the base line for PRs. +sbt uses two or three branches for development: +Use the **default** branch set on Github for bug fixes. -- Next minor branch: `1.$MINOR.x`, where `$MINOR` is next minor version (e.g. `1.9.x` during 1.8.x series) +- Next minor branch: `1.$MINOR.x`, where `$MINOR` is next minor version (e.g. `1.10.x` during 1.9.x series) - Development branch: `develop` -- Stable branch: `1.$MINOR.x`, where `$MINOR` is current minor version (e.g. `1.8.x` during 1.8.x series) +- Stable branch: `1.$MINOR.x`, where `$MINOR` is current minor version (e.g. `1.9.x` during 1.9.x series) -Currently `develop` branch represents the next major version of sbt, i.e. sbt 2. -Next minor branch is where new features can be added as long as it is binary compatible with sbt 1.0. +The `develop` branch represents sbt 2.x, the next major sbt series. +Next minor branch is where new features should be added as long as it is binary compatible with sbt 1.x. The `stable` branch represents the current stable sbt release. Only bug fixes are back-ported to the stable branch. ### Instruction to build just sbt @@ -96,7 +96,7 @@ In order to see a change you've made to sbt's source code, this cache should be By default sbt uses a snapshot version (this is a scala convention for quick local changes- it tells users that this version could change). One drawback of `-SNAPSHOT` version is that it's slow to resolve as it tries to hit all the resolvers. -This is important when testing perfomance, so that the slowness of the resolution does not impact sbt. +This is important when testing performance, so that the slowness of the resolution does not impact sbt. You can workaround that by using a version name like `1.$MINOR.$PATCH-LOCAL1`. A non-SNAPSHOT artifacts will now be cached under `$HOME/.ivy/cache/` directory, so you need to clear that out using [sbt-dirty-money](https://github.com/sbt/sbt-dirty-money)'s `cleanCache` task. @@ -167,6 +167,13 @@ command. To run a single test, such as the test in ### Random tidbits +### Clean history + +Make sure you document each commit and squash them appropriately. You can use the following guides as a reference: + +* Scala's documentation on [Git Hygiene](https://github.com/scala/scala/tree/v2.12.0-M3#git-hygiene) +* Play's documentation on [Working with Git](https://www.playframework.com/documentation/2.4.4/WorkingWithGit#Squashing-commits) + #### Import statements You'd need alternative DSL import since you can't rely on sbt package object. diff --git a/LICENSE b/LICENSE index a5c4997c4..5c4a3cff9 100644 --- a/LICENSE +++ b/LICENSE @@ -187,7 +187,8 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright (c) 2011 - 2018, Lightbend, Inc. + Copyright (c) 2023, Scala Center + Copyright (c) 2011 - 2022, Lightbend, Inc. Copyright (c) 2008 - 2010, Mark Harrah Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/NOTICE b/NOTICE index 82bd2c916..7cc4772ab 100644 --- a/NOTICE +++ b/NOTICE @@ -1,5 +1,6 @@ sbt -Copyright 2011 - 2017, Lightbend, Inc. +Copyright 2023, Scala center +Copyright 2011 - 2022, Lightbend, Inc. Copyright 2008 - 2010, Mark Harrah Licensed under Apache v2 license (see LICENSE) diff --git a/SUPPORT.md b/SUPPORT.md index c3c7d0c44..9195e0789 100644 --- a/SUPPORT.md +++ b/SUPPORT.md @@ -1,20 +1,10 @@ [ask]: https://stackoverflow.com/questions/ask?tags=sbt - [Lightbend]: https://www.lightbend.com/ - [subscriptions]: https://www.lightbend.com/platform/subscription [gitter]: https://gitter.im/sbt/sbt Support ======= -[Lightbend] sponsors sbt and encourages contributions from the active community. Enterprises can adopt it for mission critical systems with confidence because Lightbend stands behind sbt with commercial support and services. - For community support please [ask] on StackOverflow with the tag "sbt" (and the name of the sbt plugin(s) if any). - State the problem or question clearly and provide enough context. Code examples and `build.sbt` are often useful when appropriately edited. - There's also [Gitter sbt/sbt room][gitter], but Stackoverflow is recommended so others can benefit from the answers. - -For professional support, for instance if you need faster response times, [Lightbend], the maintainer of Scala compiler and sbt, provides: - -- [Lightbend Subscriptions][subscriptions], which includes Expert Support -- Training -- Consulting diff --git a/build.sbt b/build.sbt index 3bbcf6aba..404b0de63 100644 --- a/build.sbt +++ b/build.sbt @@ -4,6 +4,7 @@ import com.typesafe.tools.mima.core.ProblemFilters._ import com.typesafe.tools.mima.core._ import local.Scripted import java.nio.file.{ Files, Path => JPath } +import java.util.Locale import scala.util.Try @@ -47,7 +48,7 @@ ThisBuild / libraryDependencySchemes += "org.scala-lang.modules" %% "scala-xml" Global / semanticdbEnabled := !(Global / insideCI).value // Change main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala too, if you change this. -Global / semanticdbVersion := "4.5.13" +Global / semanticdbVersion := "4.7.8" val excludeLint = SettingKey[Set[Def.KeyedInitialize[_]]]("excludeLintKeys") Global / excludeLint := (Global / excludeLint).?.value.getOrElse(Set.empty) Global / excludeLint += componentID @@ -59,7 +60,8 @@ def commonSettings: Seq[Setting[_]] = Def.settings( headerLicense := Some( HeaderLicense.Custom( """|sbt - |Copyright 2011 - 2018, Lightbend, Inc. + |Copyright 2023, Scala center + |Copyright 2011 - 2022, Lightbend, Inc. |Copyright 2008 - 2010, Mark Harrah |Licensed under Apache License 2.0 (see LICENSE) |""".stripMargin @@ -69,6 +71,7 @@ def commonSettings: Seq[Setting[_]] = Def.settings( componentID := None, resolvers += Resolver.typesafeIvyRepo("releases").withName("typesafe-sbt-build-ivy-releases"), resolvers ++= Resolver.sonatypeOssRepos("snapshots"), + resolvers ++= Resolver.sonatypeOssRepos("snapshots"), testFrameworks += TestFramework("hedgehog.sbt.Framework"), testFrameworks += TestFramework("verify.runner.Framework"), Global / concurrentRestrictions += Util.testExclusiveRestriction, @@ -172,6 +175,9 @@ def mimaSettingsSince(versions: Seq[String]): Seq[Def.Setting[_]] = Def settings exclude[DirectMissingMethodProblem]("sbt.PluginData.apply"), exclude[DirectMissingMethodProblem]("sbt.PluginData.copy"), exclude[DirectMissingMethodProblem]("sbt.PluginData.this"), + exclude[IncompatibleResultTypeProblem]("sbt.EvaluateTask.executeProgress"), + exclude[DirectMissingMethodProblem]("sbt.Keys.currentTaskProgress"), + exclude[IncompatibleResultTypeProblem]("sbt.PluginData.copy$default$10") ), ) @@ -183,11 +189,11 @@ lazy val sbtRoot: Project = (project in file(".")) minimalSettings, onLoadMessage := { val version = sys.props("java.specification.version") - """ __ __ + """ __ __ | _____/ /_ / /_ | / ___/ __ \/ __/ - | (__ ) /_/ / /_ - | /____/_.___/\__/ + | (__ ) /_/ / /_ + | /____/_.___/\__/ |Welcome to the build for sbt. |""".stripMargin + (if (version != "1.8") @@ -201,7 +207,6 @@ lazy val sbtRoot: Project = (project in file(".")) scalacOptions += "-Ymacro-expand:none", // for both sxr and doc Util.publishPomSettings, otherRootSettings, - Transform.conscriptSettings(bundledLauncherProj), publish := {}, publishLocal := {}, publish / skip := true, @@ -363,7 +368,7 @@ lazy val utilLogging = project disruptor, sjsonNewScalaJson.value, ), - libraryDependencies ++= Seq(scalacheck % "test", scalatest % "test"), + testDependencies, Compile / generateContrabands / contrabandCodecsDependencies := List(sjsonNewCore.value), Compile / generateContrabands / sourceManaged := baseDirectory.value / "src" / "main" / "contraband-scala", Compile / managedSourceDirectories += @@ -374,6 +379,7 @@ lazy val utilLogging = project if (name == "Throwable") Nil else old(tpe) }, + Test / fork := true, utilMimaSettings, mimaBinaryIssueFilters ++= Seq( exclude[DirectMissingMethodProblem]("sbt.internal.util.SuccessEvent.copy*"), @@ -404,6 +410,7 @@ lazy val utilLogging = project exclude[MissingTypesProblem]("sbt.internal.util.ConsoleAppender"), exclude[MissingTypesProblem]("sbt.internal.util.BufferedAppender"), exclude[MissingClassProblem]("sbt.internal.util.Terminal$BlockingInputStream$"), + exclude[IncompatibleResultTypeProblem]("sbt.util.LoggerContext#Log4JLoggerContext.loggers"), ), ) .configure(addSbtIO) @@ -1056,6 +1063,10 @@ lazy val serverTestProj = (project in file("server-test")) ) val isWin = scala.util.Properties.isWin +val isLinux = scala.util.Properties.isLinux +val isArmArchitecture: Boolean = sys.props + .getOrElse("os.arch", "") + .toLowerCase(Locale.ROOT) == "aarch64" val buildThinClient = inputKey[JPath]("generate a java implementation of the thin client") // Use a TaskKey rather than SettingKey for nativeInstallDirectory so it can left unset by default @@ -1077,6 +1088,7 @@ lazy val sbtClientProj = (project in file("client")) nativeImageReady := { () => () }, + nativeImageVersion := "22.2.0", nativeImageOutput := target.value / "bin" / "sbtn", nativeImageOptions ++= Seq( "--no-fallback", diff --git a/buildfile/src/main/scala/sbt/internal/DslEntry.scala b/buildfile/src/main/scala/sbt/internal/DslEntry.scala index 9da26a9b2..f451a055f 100644 --- a/buildfile/src/main/scala/sbt/internal/DslEntry.scala +++ b/buildfile/src/main/scala/sbt/internal/DslEntry.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/buildfile/src/main/scala/sbt/internal/EvaluateConfigurations.scala b/buildfile/src/main/scala/sbt/internal/EvaluateConfigurations.scala index d18e3ec64..78f60b560 100644 --- a/buildfile/src/main/scala/sbt/internal/EvaluateConfigurations.scala +++ b/buildfile/src/main/scala/sbt/internal/EvaluateConfigurations.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/buildfile/src/main/scala/sbt/internal/LoadedSbtFile.scala b/buildfile/src/main/scala/sbt/internal/LoadedSbtFile.scala index 9196ca5c4..07eed441e 100644 --- a/buildfile/src/main/scala/sbt/internal/LoadedSbtFile.scala +++ b/buildfile/src/main/scala/sbt/internal/LoadedSbtFile.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/buildfile/src/test/scala/sbt/internal/parser/AbstractSpec.scala b/buildfile/src/test/scala/sbt/internal/parser/AbstractSpec.scala index a11fe9f85..3587401b3 100644 --- a/buildfile/src/test/scala/sbt/internal/parser/AbstractSpec.scala +++ b/buildfile/src/test/scala/sbt/internal/parser/AbstractSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/buildfile/src/test/scala/sbt/internal/parser/CommentedXmlSpec.scala b/buildfile/src/test/scala/sbt/internal/parser/CommentedXmlSpec.scala index 47858534a..5e13f6f45 100644 --- a/buildfile/src/test/scala/sbt/internal/parser/CommentedXmlSpec.scala +++ b/buildfile/src/test/scala/sbt/internal/parser/CommentedXmlSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/buildfile/src/test/scala/sbt/internal/parser/EmbeddedXmlSpec.scala b/buildfile/src/test/scala/sbt/internal/parser/EmbeddedXmlSpec.scala index b73fb7eff..b3f2a043b 100644 --- a/buildfile/src/test/scala/sbt/internal/parser/EmbeddedXmlSpec.scala +++ b/buildfile/src/test/scala/sbt/internal/parser/EmbeddedXmlSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/buildfile/src/test/scala/sbt/internal/parser/NewFormatSpec.scala b/buildfile/src/test/scala/sbt/internal/parser/NewFormatSpec.scala index 94f7d366f..4fd3c0e50 100644 --- a/buildfile/src/test/scala/sbt/internal/parser/NewFormatSpec.scala +++ b/buildfile/src/test/scala/sbt/internal/parser/NewFormatSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/buildfile/src/test/scala/sbt/internal/parser/SplitExpressions.scala b/buildfile/src/test/scala/sbt/internal/parser/SplitExpressions.scala index 38ec6e991..2399de076 100644 --- a/buildfile/src/test/scala/sbt/internal/parser/SplitExpressions.scala +++ b/buildfile/src/test/scala/sbt/internal/parser/SplitExpressions.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/buildfile/src/test/scala/sbt/internal/parser/SplitExpressionsBehavior.scala b/buildfile/src/test/scala/sbt/internal/parser/SplitExpressionsBehavior.scala index 2714c9a2a..3ba3e664d 100644 --- a/buildfile/src/test/scala/sbt/internal/parser/SplitExpressionsBehavior.scala +++ b/buildfile/src/test/scala/sbt/internal/parser/SplitExpressionsBehavior.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/buildfile/src/test/scala/sbt/internal/parser/SplitExpressionsTest.scala b/buildfile/src/test/scala/sbt/internal/parser/SplitExpressionsTest.scala index e202ec4d5..c38b08a2c 100644 --- a/buildfile/src/test/scala/sbt/internal/parser/SplitExpressionsTest.scala +++ b/buildfile/src/test/scala/sbt/internal/parser/SplitExpressionsTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/client/src/main/java/sbt/client/Client.java b/client/src/main/java/sbt/client/Client.java index bf9f120bb..6ffe838ff 100644 --- a/client/src/main/java/sbt/client/Client.java +++ b/client/src/main/java/sbt/client/Client.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/client/src/main/resources/META-INF/native-image/resource-config.json b/client/src/main/resources/META-INF/native-image/resource-config.json index 0bc65dde4..19d10f4a9 100644 --- a/client/src/main/resources/META-INF/native-image/resource-config.json +++ b/client/src/main/resources/META-INF/native-image/resource-config.json @@ -16,6 +16,7 @@ {"pattern":"org/jline/utils/screen.caps"}, {"pattern":"library.properties"}, {"pattern":"darwin/x86_64/libsbtipcsocket.dylib"}, + {"pattern":"linux/aarch64/libsbtipcsocket.so"}, {"pattern":"linux/x86_64/libsbtipcsocket.so"}, {"pattern":"win32/x86_64/sbtipcsocket.dll"} ] diff --git a/core-macros/src/main/scala-2/sbt/internal/util/appmacro/LinterDSL.scala b/core-macros/src/main/scala-2/sbt/internal/util/appmacro/LinterDSL.scala index fb42f2e2e..ea42203fa 100644 --- a/core-macros/src/main/scala-2/sbt/internal/util/appmacro/LinterDSL.scala +++ b/core-macros/src/main/scala-2/sbt/internal/util/appmacro/LinterDSL.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala b/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala index f6e3f9f79..2e89f1cd1 100644 --- a/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala +++ b/core-macros/src/main/scala/sbt/internal/util/appmacro/ContextUtil.scala @@ -1,4 +1,13 @@ -package sbt.internal.util.appmacro +/* + * sbt + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. + * Copyright 2008 - 2010, Mark Harrah + * Licensed under Apache License 2.0 (see LICENSE) + */ + +package sbt.internal.util +package appmacro import scala.compiletime.summonInline import scala.quoted.* diff --git a/core-macros/src/main/scala/sbt/internal/util/appmacro/Convert.scala b/core-macros/src/main/scala/sbt/internal/util/appmacro/Convert.scala index 1eb0edef4..b8e40f5c9 100644 --- a/core-macros/src/main/scala/sbt/internal/util/appmacro/Convert.scala +++ b/core-macros/src/main/scala/sbt/internal/util/appmacro/Convert.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/dependency-tree/src/main/scala/sbt/plugins/DependencyTreePlugin.scala b/dependency-tree/src/main/scala/sbt/plugins/DependencyTreePlugin.scala index 1fbaabd70..bbe154376 100644 --- a/dependency-tree/src/main/scala/sbt/plugins/DependencyTreePlugin.scala +++ b/dependency-tree/src/main/scala/sbt/plugins/DependencyTreePlugin.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -8,11 +9,14 @@ package sbt package plugins +import scala.annotation.nowarn + object DependencyTreePlugin extends AutoPlugin { object autoImport extends DependencyTreeKeys override def trigger = AllRequirements override def requires = MiniDependencyTreePlugin + @nowarn val configurations = Vector(Compile, Test, IntegrationTest, Runtime, Provided, Optional) // MiniDependencyTreePlugin provides baseBasicReportingSettings for Compile and Test diff --git a/internal/util-complete/NOTICE b/internal/util-complete/NOTICE index d5827b9c2..49c8ba71c 100644 --- a/internal/util-complete/NOTICE +++ b/internal/util-complete/NOTICE @@ -1,4 +1,5 @@ sbt: Completion Component -Copyright 2011 - 2017, Lightbend, Inc. +Copyright 2023, Scala center +Copyright 2011 - 2022, Lightbend, Inc. Copyright 2008 - 2010, Mark Harrah Licensed under BSD-3-Clause license (see LICENSE) diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/LineReader.scala b/internal/util-complete/src/main/scala/sbt/internal/util/LineReader.scala index 8f5cdc8b5..37022cb84 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/LineReader.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/LineReader.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/Completions.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/Completions.scala index b0f999f1d..a65b161c8 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/Completions.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/Completions.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/EditDistance.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/EditDistance.scala index 8609fbe1a..3cfe6a126 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/EditDistance.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/EditDistance.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/ExampleSource.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/ExampleSource.scala index 25031bd8c..ddb7bc101 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/ExampleSource.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/ExampleSource.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/History.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/History.scala index b65dba0dc..46b48591d 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/History.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/History.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/HistoryCommands.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/HistoryCommands.scala index bd2f637b6..818ea077e 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/HistoryCommands.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/HistoryCommands.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/JLineCompletion.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/JLineCompletion.scala index 10ebcc7e7..d9812a6d5 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/JLineCompletion.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/JLineCompletion.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/Parser.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/Parser.scala index 6cef91e2e..6bc1452b0 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/Parser.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/Parser.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/Parsers.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/Parsers.scala index 228de5996..e30173fd8 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/Parsers.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/Parsers.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/ProcessError.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/ProcessError.scala index 1d3a540bf..e26eebfc9 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/ProcessError.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/ProcessError.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/SizeParser.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/SizeParser.scala index 478261f1c..d8b9f3bab 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/SizeParser.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/SizeParser.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/TokenCompletions.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/TokenCompletions.scala index b956417da..0b30a9b64 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/TokenCompletions.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/TokenCompletions.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/TypeString.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/TypeString.scala index 28933c8cf..8505e9baf 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/TypeString.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/TypeString.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/main/scala/sbt/internal/util/complete/UpperBound.scala b/internal/util-complete/src/main/scala/sbt/internal/util/complete/UpperBound.scala index 7822c752a..abf7ed8d4 100644 --- a/internal/util-complete/src/main/scala/sbt/internal/util/complete/UpperBound.scala +++ b/internal/util-complete/src/main/scala/sbt/internal/util/complete/UpperBound.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/test/scala/DefaultParsersSpec.scala b/internal/util-complete/src/test/scala/DefaultParsersSpec.scala index 2ea81e7bf..36d057960 100644 --- a/internal/util-complete/src/test/scala/DefaultParsersSpec.scala +++ b/internal/util-complete/src/test/scala/DefaultParsersSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/test/scala/ParserTest.scala b/internal/util-complete/src/test/scala/ParserTest.scala index 4694f974a..2db039b43 100644 --- a/internal/util-complete/src/test/scala/ParserTest.scala +++ b/internal/util-complete/src/test/scala/ParserTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/test/scala/UnitSpec.scala b/internal/util-complete/src/test/scala/UnitSpec.scala index 912b39d16..1469ed6f6 100644 --- a/internal/util-complete/src/test/scala/UnitSpec.scala +++ b/internal/util-complete/src/test/scala/UnitSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/test/scala/sbt/complete/FileExamplesTest.scala b/internal/util-complete/src/test/scala/sbt/complete/FileExamplesTest.scala index 5b6a690a1..a4106d952 100644 --- a/internal/util-complete/src/test/scala/sbt/complete/FileExamplesTest.scala +++ b/internal/util-complete/src/test/scala/sbt/complete/FileExamplesTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -82,7 +83,7 @@ class FileExamplesTest extends UnitSpec { def prefixedPathsOnly: List[String] = allRelativizedPaths - .filter(_ startsWith withCompletionPrefix) + .withFilter(_ startsWith withCompletionPrefix) .map(_ substring withCompletionPrefix.length) def createSampleDirStructure(tempDir: File): Unit = { @@ -91,8 +92,8 @@ class FileExamplesTest extends UnitSpec { nestedFiles = toChildFiles(childDirectories(1), List("farfile1", "barfile2")) nestedDirectories = toChildFiles(childDirectories(1), List("fardir1", "bardir2")) - (childDirectories ++ nestedDirectories).map(_.mkdirs()) - (childFiles ++ nestedFiles).map(_.createNewFile()) + (childDirectories ++ nestedDirectories).foreach(_.mkdirs()) + (childFiles ++ nestedFiles).foreach(_.createNewFile()) baseDir = tempDir } diff --git a/internal/util-complete/src/test/scala/sbt/complete/FixedSetExamplesTest.scala b/internal/util-complete/src/test/scala/sbt/complete/FixedSetExamplesTest.scala index 51c6a2f6f..835afb593 100644 --- a/internal/util-complete/src/test/scala/sbt/complete/FixedSetExamplesTest.scala +++ b/internal/util-complete/src/test/scala/sbt/complete/FixedSetExamplesTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/test/scala/sbt/complete/ParserWithExamplesTest.scala b/internal/util-complete/src/test/scala/sbt/complete/ParserWithExamplesTest.scala index 840932368..60c8b9125 100644 --- a/internal/util-complete/src/test/scala/sbt/complete/ParserWithExamplesTest.scala +++ b/internal/util-complete/src/test/scala/sbt/complete/ParserWithExamplesTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-complete/src/test/scala/sbt/internal/util/complete/SizeParserSpec.scala b/internal/util-complete/src/test/scala/sbt/internal/util/complete/SizeParserSpec.scala index 6d68fdae9..73c3be393 100644 --- a/internal/util-complete/src/test/scala/sbt/internal/util/complete/SizeParserSpec.scala +++ b/internal/util-complete/src/test/scala/sbt/internal/util/complete/SizeParserSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-control/src/main/scala/sbt/internal/util/ErrorHandling.scala b/internal/util-control/src/main/scala/sbt/internal/util/ErrorHandling.scala index c8579b695..7c147bddd 100644 --- a/internal/util-control/src/main/scala/sbt/internal/util/ErrorHandling.scala +++ b/internal/util-control/src/main/scala/sbt/internal/util/ErrorHandling.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-control/src/main/scala/sbt/internal/util/ExitHook.scala b/internal/util-control/src/main/scala/sbt/internal/util/ExitHook.scala index 76d059741..d73b60065 100644 --- a/internal/util-control/src/main/scala/sbt/internal/util/ExitHook.scala +++ b/internal/util-control/src/main/scala/sbt/internal/util/ExitHook.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-control/src/main/scala/sbt/internal/util/MessageOnlyException.scala b/internal/util-control/src/main/scala/sbt/internal/util/MessageOnlyException.scala index f629c1bcf..7d2e3ea33 100644 --- a/internal/util-control/src/main/scala/sbt/internal/util/MessageOnlyException.scala +++ b/internal/util-control/src/main/scala/sbt/internal/util/MessageOnlyException.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-control/src/main/scala/sbt/internal/util/RunningProcesses.scala b/internal/util-control/src/main/scala/sbt/internal/util/RunningProcesses.scala index d99bd94ad..67c5711f9 100644 --- a/internal/util-control/src/main/scala/sbt/internal/util/RunningProcesses.scala +++ b/internal/util-control/src/main/scala/sbt/internal/util/RunningProcesses.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-core/src/main/scala/sbt/internal/util/Util.scala b/internal/util-core/src/main/scala/sbt/internal/util/Util.scala index e5e987a96..3b583fd40 100644 --- a/internal/util-core/src/main/scala/sbt/internal/util/Util.scala +++ b/internal/util-core/src/main/scala/sbt/internal/util/Util.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-interface/src/main/java/xsbti/Action.java b/internal/util-interface/src/main/java/xsbti/Action.java new file mode 100644 index 000000000..c5c25cdc8 --- /dev/null +++ b/internal/util-interface/src/main/java/xsbti/Action.java @@ -0,0 +1,33 @@ +/* + * sbt + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. + * Copyright 2008 - 2010, Mark Harrah + * Licensed under Apache License 2.0 (see LICENSE) + */ + +package xsbti; + +import java.util.Optional; + +/** + * An Action is very miminal representation of a `CodeAction` in the LSP protocol. + * + *

However it only focuses on the actual title, description, and edit, leaving it up to the + * language server to communicate with the client and put together a proper codeAction in accordance + * to client capabilities. + * + * @see `CodeAction` + */ +public interface Action { + + /** Title of the action that will be shown to the user client side. */ + String title(); + + /** Optional description that may be shown to the user client side to explain the action. */ + Optional description(); + + /** The actual edit contained in the action. */ + WorkspaceEdit edit(); +} diff --git a/internal/util-interface/src/main/java/xsbti/DiagnosticCode.java b/internal/util-interface/src/main/java/xsbti/DiagnosticCode.java index 6633e2b4e..21a9bbe72 100644 --- a/internal/util-interface/src/main/java/xsbti/DiagnosticCode.java +++ b/internal/util-interface/src/main/java/xsbti/DiagnosticCode.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-interface/src/main/java/xsbti/DiagnosticRelatedInformation.java b/internal/util-interface/src/main/java/xsbti/DiagnosticRelatedInformation.java index 786cecc52..e9be34ab9 100644 --- a/internal/util-interface/src/main/java/xsbti/DiagnosticRelatedInformation.java +++ b/internal/util-interface/src/main/java/xsbti/DiagnosticRelatedInformation.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-interface/src/main/java/xsbti/Logger.java b/internal/util-interface/src/main/java/xsbti/Logger.java index 54023b52e..5dffe56c0 100644 --- a/internal/util-interface/src/main/java/xsbti/Logger.java +++ b/internal/util-interface/src/main/java/xsbti/Logger.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-interface/src/main/java/xsbti/Position.java b/internal/util-interface/src/main/java/xsbti/Position.java index da4f139d6..694d005f4 100644 --- a/internal/util-interface/src/main/java/xsbti/Position.java +++ b/internal/util-interface/src/main/java/xsbti/Position.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-interface/src/main/java/xsbti/Problem.java b/internal/util-interface/src/main/java/xsbti/Problem.java index e63a95b64..50efefc8b 100644 --- a/internal/util-interface/src/main/java/xsbti/Problem.java +++ b/internal/util-interface/src/main/java/xsbti/Problem.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -11,6 +12,8 @@ import java.util.Collections; import java.util.List; import java.util.Optional; +// Note: Update InterfaceUtil.scala as well. + public interface Problem { String category(); @@ -39,13 +42,44 @@ public interface Problem { return Optional.empty(); } + /** @deprecated use {@link #diagnosticRelatedInformation()} instead. */ + @Deprecated + default List diagnosticRelatedInforamation() { + return diagnosticRelatedInformation(); + } + /** * The possible releated information for the diagnostic being reported. * *

NOTE: To avoid breaking compatibility we provide a default to account for older Scala * versions that do not have the concept of "related information". */ - default List diagnosticRelatedInforamation() { + default List diagnosticRelatedInformation() { + return Collections.emptyList(); + } + + /** + * Actions (aka quick fixes) that are able to either fix or address the issue that is causing this + * Problem. + * + *

For example given the following code: + * + *

+   *  trait Example:
+   *    def foo(): Unit
+   *    def bar(): Unit
+   *
+   *  class MyExample extends Example
+   * 
+ * + * You could expect this to have multiple actions attatched: + * + *
    + *
  • An option to implement a stub method for `foo()` and `bar()` + *
  • An option to make `MyExample` abstract + *
+ */ + default List actions() { return Collections.emptyList(); } } diff --git a/internal/util-interface/src/main/java/xsbti/Severity.java b/internal/util-interface/src/main/java/xsbti/Severity.java index 833d91093..261e79200 100644 --- a/internal/util-interface/src/main/java/xsbti/Severity.java +++ b/internal/util-interface/src/main/java/xsbti/Severity.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-interface/src/main/java/xsbti/T2.java b/internal/util-interface/src/main/java/xsbti/T2.java index 2f51726d7..382f4e446 100644 --- a/internal/util-interface/src/main/java/xsbti/T2.java +++ b/internal/util-interface/src/main/java/xsbti/T2.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-interface/src/main/java/xsbti/TextEdit.java b/internal/util-interface/src/main/java/xsbti/TextEdit.java new file mode 100644 index 000000000..1ea5fbce0 --- /dev/null +++ b/internal/util-interface/src/main/java/xsbti/TextEdit.java @@ -0,0 +1,26 @@ +/* + * sbt + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. + * Copyright 2008 - 2010, Mark Harrah + * Licensed under Apache License 2.0 (see LICENSE) + */ + +package xsbti; + +/** + * A representation of the `TextEdit` found in the LSP protocol. + * + *

NOTE: That instead of a `Range` we use the internal [[xsbti.Position]]. + * + * @see `TextEdit` + */ +public interface TextEdit { + + /** The position this edit will be applied to. */ + Position position(); + + /** The next text that will be inserted into the given [[TextEdit.position]]. */ + String newText(); +} diff --git a/internal/util-interface/src/main/java/xsbti/WorkspaceEdit.java b/internal/util-interface/src/main/java/xsbti/WorkspaceEdit.java new file mode 100644 index 000000000..9de31fb31 --- /dev/null +++ b/internal/util-interface/src/main/java/xsbti/WorkspaceEdit.java @@ -0,0 +1,27 @@ +/* + * sbt + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. + * Copyright 2008 - 2010, Mark Harrah + * Licensed under Apache License 2.0 (see LICENSE) + */ + +package xsbti; + +import java.util.List; + +/** + * A minimal representatin of the `WorkspaceEdit` found in the LSP protocol. + * + *

However it only supports the minimal `changes` to ensure the fixes will work with all clients. + * + *

NOTE: In the future this may be expanded to handle resource operations via `documentChanges`. + * + * @see `WorkspaceEdit` + */ +public interface WorkspaceEdit { + + /** List of [[xsbti.TextEdit]] that belong to this WorkspaceEdit. */ + List changes(); +} diff --git a/internal/util-logging/src/main/java/sbt/internal/util/DeprecatedJLine.java b/internal/util-logging/src/main/java/sbt/internal/util/DeprecatedJLine.java index 4e091a2a5..00fc47df2 100644 --- a/internal/util-logging/src/main/java/sbt/internal/util/DeprecatedJLine.java +++ b/internal/util-logging/src/main/java/sbt/internal/util/DeprecatedJLine.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/com/github/ghik/silencer/silent.scala b/internal/util-logging/src/main/scala/com/github/ghik/silencer/silent.scala index a8ba5d95f..239379461 100644 --- a/internal/util-logging/src/main/scala/com/github/ghik/silencer/silent.scala +++ b/internal/util-logging/src/main/scala/com/github/ghik/silencer/silent.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/BasicLogger.scala b/internal/util-logging/src/main/scala/sbt/internal/util/BasicLogger.scala index d61f43b3e..cef9dbb17 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/BasicLogger.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/BasicLogger.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/BufferedLogger.scala b/internal/util-logging/src/main/scala/sbt/internal/util/BufferedLogger.scala index b1cc338f1..06c3e370b 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/BufferedLogger.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/BufferedLogger.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala index d464757b8..e1e50c082 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleAppender.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -19,7 +20,7 @@ import org.apache.logging.log4j.{ Level => XLevel } import sbt.internal.util.ConsoleAppender._ import sbt.util._ import org.apache.logging.log4j.core.AbstractLogEvent -import org.apache.logging.log4j.message.StringFormatterMessageFactory +import org.apache.logging.log4j.message.SimpleMessageFactory import java.util.concurrent.atomic.AtomicReference object ConsoleLogger { @@ -654,7 +655,7 @@ private[sbt] class ConsoleAppenderFromLog4J( delegate.append(new AbstractLogEvent { override def getLevel(): XLevel = ConsoleAppender.toXLevel(level) override def getMessage(): Message = - StringFormatterMessageFactory.INSTANCE.newMessage(message.toString, Array.empty[AnyRef]) + SimpleMessageFactory.INSTANCE.newMessage(message.toString, Array.empty[AnyRef]) }) } } diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleOut.scala b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleOut.scala index 902fbfc43..386bc0308 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleOut.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/ConsoleOut.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/EscHelpers.scala b/internal/util-logging/src/main/scala/sbt/internal/util/EscHelpers.scala index 7bd7d7040..278c4b1c7 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/EscHelpers.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/EscHelpers.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/FilterLogger.scala b/internal/util-logging/src/main/scala/sbt/internal/util/FilterLogger.scala index c539823d7..234860f6f 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/FilterLogger.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/FilterLogger.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/FullLogger.scala b/internal/util-logging/src/main/scala/sbt/internal/util/FullLogger.scala index 3298d26a0..9eb93b1b0 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/FullLogger.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/FullLogger.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/GlobalLogging.scala b/internal/util-logging/src/main/scala/sbt/internal/util/GlobalLogging.scala index 9576428b2..e19332998 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/GlobalLogging.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/GlobalLogging.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/JLine3.scala b/internal/util-logging/src/main/scala/sbt/internal/util/JLine3.scala index ebd92e684..d6e216365 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/JLine3.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/JLine3.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -18,8 +19,8 @@ import org.jline.terminal.{ Attributes, Size, Terminal => JTerminal } import org.jline.terminal.Attributes.{ InputFlag, LocalFlag } import org.jline.terminal.Terminal.SignalHandler import org.jline.terminal.impl.{ AbstractTerminal, DumbTerminal } -import org.jline.terminal.impl.jansi.JansiSupportImpl -import org.jline.terminal.impl.jansi.win.JansiWinSysTerminal +import org.jline.terminal.impl.jansi.JansiTerminalProvider +import org.jline.terminal.spi.{ SystemStream, TerminalProvider } import org.jline.utils.OSUtils import scala.jdk.CollectionConverters.* import scala.util.Try @@ -31,23 +32,22 @@ private[sbt] object JLine3 { private[this] val forceWindowsJansiHolder = new AtomicBoolean(false) private[sbt] def forceWindowsJansi(): Unit = forceWindowsJansiHolder.set(true) private[this] def windowsJansi(): org.jline.terminal.Terminal = { + val provider = new JansiTerminalProvider val termType = sys.props.get("org.jline.terminal.type").orElse(sys.env.get("TERM")).orNull - val term = JansiWinSysTerminal.createTerminal( + provider.winSysTerminal( "console", termType, OSUtils.IS_CONEMU, Charset.forName("UTF-8"), - -1, false, SignalHandler.SIG_DFL, - true + true, + SystemStream.Output ) - term.disableScrolling() - term } private val jansi = { val (major, minor) = - (JansiSupportImpl.getJansiMajorVersion, JansiSupportImpl.getJansiMinorVersion) + (JansiTerminalProvider.getJansiMajorVersion, JansiTerminalProvider.getJansiMinorVersion) (major > 1 || minor >= 18) && Util.isWindows } private[util] def system: org.jline.terminal.Terminal = { @@ -115,6 +115,11 @@ private[sbt] object JLine3 { } } } + + // returns 'null' if the terminal was created with no provider + override def getProvider(): TerminalProvider = null + // returns 'null' if the terminal is not bound to a system stream. + override def getSystemStream(): SystemStream = null override val input: InputStream = new InputStream { override def read: Int = { val res = term.inputStream match { @@ -176,7 +181,7 @@ private[sbt] object JLine3 { case null => -1 case i => i.toInt } - override def readBuffered(buf: Array[Char]): Int = { + override def readBuffered(buf: Array[Char], off: Int, len: Int, timeout: Long): Int = { if (buffer.isEmpty) fillBuffer() buffer.take match { case i if i == -1 => -1 diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/LoggerWriter.scala b/internal/util-logging/src/main/scala/sbt/internal/util/LoggerWriter.scala index e412fe879..8068c22a0 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/LoggerWriter.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/LoggerWriter.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/MainAppender.scala b/internal/util-logging/src/main/scala/sbt/internal/util/MainAppender.scala index 22ad78a9c..734650bc6 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/MainAppender.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/MainAppender.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/ManagedLogger.scala b/internal/util-logging/src/main/scala/sbt/internal/util/ManagedLogger.scala index e0ca75aed..c1239f1ce 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/ManagedLogger.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/ManagedLogger.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/MultiLogger.scala b/internal/util-logging/src/main/scala/sbt/internal/util/MultiLogger.scala index 3169b868d..9e1240433 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/MultiLogger.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/MultiLogger.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/ObjectEvent.scala b/internal/util-logging/src/main/scala/sbt/internal/util/ObjectEvent.scala index e73b76183..dcebd5eb6 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/ObjectEvent.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/ObjectEvent.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/ProgressState.scala b/internal/util-logging/src/main/scala/sbt/internal/util/ProgressState.scala index cffa485e9..bab631e55 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/ProgressState.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/ProgressState.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/Prompt.scala b/internal/util-logging/src/main/scala/sbt/internal/util/Prompt.scala index 4a780873c..0ef6c0ec8 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/Prompt.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/Prompt.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/StackTrace.scala b/internal/util-logging/src/main/scala/sbt/internal/util/StackTrace.scala index f8cfec7f1..9d0b0d7b6 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/StackTrace.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/StackTrace.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -49,7 +50,7 @@ object StackTrace { val els = t.getStackTrace() var i = 0 - while ((i < els.size) && include(els(i))) { + while ((i < els.length) && include(els(i))) { appendElement(els(i)) i += 1 } diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala b/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala index af6ebe567..b255910e7 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/Terminal.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -192,9 +193,40 @@ trait Terminal extends AutoCloseable { else 0 } private[sbt] def flush(): Unit = printStream.flush() + + private[sbt] def readArrow: Int = withRawInput { + val in = System.in + val ESC = '\u001B' + val EOT = '\u0004' + var result: Int = -1 + def readBracket: Int = + in.read() match { + case '[' => readAnsiControl + case _ => 0 + } + def readAnsiControl: Int = + in.read() match { + case 'A' => Terminal.VK_UP + case 'B' => Terminal.VK_DOWN + case 'C' => Terminal.VK_RIGHT + case 'D' => Terminal.VK_LEFT + case _ => 0 + } + in.read() match { + case ESC => readBracket + // Ctrl+D to quit + case EOT => -1 + case c => c + } + } } object Terminal { + private[sbt] final val VK_UP = 256 + private[sbt] final val VK_DOWN = 257 + private[sbt] final val VK_RIGHT = 258 + private[sbt] final val VK_LEFT = 259 + val NO_BOOT_CLIENTS_CONNECTED: Int = -2 // Disable noisy jline log spam if (System.getProperty("sbt.jline.verbose", "false") != "true") @@ -868,13 +900,19 @@ object Terminal { override lazy val isAnsiSupported: Boolean = !isDumbTerminal && Terminal.isAnsiSupported && !isCI override private[sbt] def progressState: ProgressState = consoleProgressState.get - override def isEchoEnabled: Boolean = - try system.echo() - catch { case _: InterruptedIOException => false } override def isSuccessEnabled: Boolean = true + private lazy val echoEnabled: AtomicBoolean = new AtomicBoolean({ + try system.echo() + catch { + case _: InterruptedIOException => false + } + }) + override def isEchoEnabled: Boolean = echoEnabled.get() override def setEchoEnabled(toggle: Boolean): Unit = - try Util.ignoreResult(system.echo(toggle)) - catch { case _: InterruptedIOException => } + try { + Util.ignoreResult(system.echo(toggle)) + echoEnabled.set(toggle) + } catch { case _: InterruptedIOException => } override def getBooleanCapability(capability: String): Boolean = capabilityMap.get(capability).fold(false)(system.getBooleanCapability) override def getNumericCapability(capability: String): Integer = diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/WindowsInputStream.scala b/internal/util-logging/src/main/scala/sbt/internal/util/WindowsInputStream.scala index 26828b98c..541c60627 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/WindowsInputStream.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/WindowsInputStream.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/codec/JValueFormats.scala b/internal/util-logging/src/main/scala/sbt/internal/util/codec/JValueFormats.scala index 1b67fa425..455df179b 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/codec/JValueFormats.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/codec/JValueFormats.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/codec/PositionFormats.scala b/internal/util-logging/src/main/scala/sbt/internal/util/codec/PositionFormats.scala index e3965bb99..8823a537e 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/codec/PositionFormats.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/codec/PositionFormats.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/codec/ProblemFormats.scala b/internal/util-logging/src/main/scala/sbt/internal/util/codec/ProblemFormats.scala index 2ae0d7512..d81ae2425 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/codec/ProblemFormats.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/codec/ProblemFormats.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/codec/SeverityFormats.scala b/internal/util-logging/src/main/scala/sbt/internal/util/codec/SeverityFormats.scala index 982d248d0..63e931182 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/codec/SeverityFormats.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/codec/SeverityFormats.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/codec/SuccessEventShowLines.scala b/internal/util-logging/src/main/scala/sbt/internal/util/codec/SuccessEventShowLines.scala index d0bb12ea3..3da1789cc 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/codec/SuccessEventShowLines.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/codec/SuccessEventShowLines.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/internal/util/codec/ThrowableShowLines.scala b/internal/util-logging/src/main/scala/sbt/internal/util/codec/ThrowableShowLines.scala index 21f400ee4..7a23bec31 100644 --- a/internal/util-logging/src/main/scala/sbt/internal/util/codec/ThrowableShowLines.scala +++ b/internal/util-logging/src/main/scala/sbt/internal/util/codec/ThrowableShowLines.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/util/AbstractLogger.scala b/internal/util-logging/src/main/scala/sbt/util/AbstractLogger.scala index 1337aaf97..69a3de344 100644 --- a/internal/util-logging/src/main/scala/sbt/util/AbstractLogger.scala +++ b/internal/util-logging/src/main/scala/sbt/util/AbstractLogger.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/util/InterfaceUtil.scala b/internal/util-logging/src/main/scala/sbt/util/InterfaceUtil.scala index cb5fc5e13..b518a47fc 100644 --- a/internal/util-logging/src/main/scala/sbt/util/InterfaceUtil.scala +++ b/internal/util-logging/src/main/scala/sbt/util/InterfaceUtil.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -12,7 +13,17 @@ import java.util.Optional import java.util.function.Supplier import java.{ util => ju } -import xsbti.{ DiagnosticCode, DiagnosticRelatedInformation, Position, Problem, Severity, T2 } +import xsbti.{ + Action, + DiagnosticCode, + DiagnosticRelatedInformation, + Position, + Problem, + Severity, + TextEdit, + WorkspaceEdit, + T2, +} import scala.collection.mutable.ListBuffer @@ -130,6 +141,7 @@ object InterfaceUtil { ): Problem = problem(cat, pos, msg, sev, rendered, None, List.empty[DiagnosticRelatedInformation]) + @deprecated("Use the overload of this method with more arguments", "1.9.0") def problem( cat: String, pos: Position, @@ -139,7 +151,59 @@ object InterfaceUtil { diagnosticCode: Option[DiagnosticCode], diagnosticRelatedInforamation: List[DiagnosticRelatedInformation] ): Problem = - new ConcreteProblem(cat, pos, msg, sev, rendered, diagnosticCode, diagnosticRelatedInforamation) + problem( + cat, + pos, + msg, + sev, + rendered, + diagnosticCode, + diagnosticRelatedInforamation, + List.empty[Action], + ) + + def problem( + cat: String, + pos: Position, + msg: String, + sev: Severity, + rendered: Option[String], + diagnosticCode: Option[DiagnosticCode], + diagnosticRelatedInformation: List[DiagnosticRelatedInformation], + actions: List[Action], + ): Problem = + new ConcreteProblem( + cat, + pos, + msg, + sev, + rendered, + diagnosticCode, + diagnosticRelatedInformation, + actions, + ) + + def action( + title: String, + description: Option[String], + edit: WorkspaceEdit, + ): Action = + new ConcreteAction(title, description, edit) + + def workspaceEdit(changes: List[TextEdit]): WorkspaceEdit = + new ConcreteWorkspaceEdit(changes) + + def textEdit(position: Position, newText: String): TextEdit = + new ConcreteTextEdit(position, newText) + + def diagnosticCode(code: String, explanation: Option[String]): DiagnosticCode = + new ConcreteDiagnosticCode(code, explanation) + + def diagnosticRelatedInformation( + position: Position, + message: String + ): DiagnosticRelatedInformation = + new ConcreteDiagnosticRelatedInformation(position, message) private final class ConcreteT2[A1, A2](a1: A1, a2: A2) extends T2[A1, A2] { val get1: A1 = a1 @@ -187,6 +251,42 @@ object InterfaceUtil { override val startColumn = o2jo(startColumn0) override val endLine = o2jo(endLine0) override val endColumn = o2jo(endColumn0) + override def toString: String = { + val src = sourcePath0 match { + case Some(x) => s"$x" + case None => "none" + } + val line = line0 match { + case Some(x) => s":$x" + case None => "" + } + val offset = offset0 match { + case Some(x) => s":$x" + case None => "" + } + s"""$src$line$offset""" + } + private def toTuple(p: Position) = + ( + p.line, + p.lineContent, + p.offset, + p.pointer, + p.pointerSpace, + p.sourcePath, + p.sourceFile, + p.startOffset, + p.endOffset, + p.startLine, + p.startColumn, + p.endLine, + p.endColumn, + ) + override def hashCode: Int = toTuple(this).## + override def equals(o: Any): Boolean = o match { + case o: Position => toTuple(this) == toTuple(o) + case _ => false + } } private final class ConcreteProblem( @@ -196,7 +296,8 @@ object InterfaceUtil { sev: Severity, rendered0: Option[String], diagnosticCode0: Option[DiagnosticCode], - diagnosticRelatedInformation0: List[DiagnosticRelatedInformation] + diagnosticRelatedInformation0: List[DiagnosticRelatedInformation], + actions0: List[Action], ) extends Problem { val category = cat val position = pos @@ -204,8 +305,116 @@ object InterfaceUtil { val severity = sev override val rendered = o2jo(rendered0) override def diagnosticCode: Optional[DiagnosticCode] = o2jo(diagnosticCode0) - override def diagnosticRelatedInforamation(): ju.List[DiagnosticRelatedInformation] = + override def diagnosticRelatedInformation(): ju.List[DiagnosticRelatedInformation] = l2jl(diagnosticRelatedInformation0) + @deprecated("use diagnosticRelatedInformation", "1.9.0") + override def diagnosticRelatedInforamation(): ju.List[DiagnosticRelatedInformation] = + diagnosticRelatedInformation() + override def actions(): ju.List[Action] = + l2jl(actions0) override def toString = s"[$severity] $pos: $message" + private def toTuple(p: Problem) = + ( + p.category, + p.position, + p.message, + p.severity, + p.rendered, + p.diagnosticCode, + p.diagnosticRelatedInformation, + p.actions, + ) + override def hashCode: Int = toTuple(this).## + override def equals(o: Any): Boolean = o match { + case o: Problem => toTuple(this) == toTuple(o) + case _ => false + } + } + + private final class ConcreteAction( + title0: String, + description0: Option[String], + edit0: WorkspaceEdit, + ) extends Action { + val title: String = title0 + val edit: WorkspaceEdit = edit0 + override def description(): Optional[String] = + o2jo(description0) + override def toString(): String = + s"Action($title0, $description0, $edit0)" + private def toTuple(a: Action) = + ( + a.title, + a.description, + a.edit, + ) + override def hashCode: Int = toTuple(this).## + override def equals(o: Any): Boolean = o match { + case o: Action => toTuple(this) == toTuple(o) + case _ => false + } + } + + private final class ConcreteWorkspaceEdit(changes0: List[TextEdit]) extends WorkspaceEdit { + override def changes(): ju.List[TextEdit] = l2jl(changes0) + override def toString(): String = + s"WorkspaceEdit($changes0)" + private def toTuple(w: WorkspaceEdit) = jl2l(w.changes) + override def hashCode: Int = toTuple(this).## + override def equals(o: Any): Boolean = o match { + case o: WorkspaceEdit => toTuple(this) == toTuple(o) + case _ => false + } + } + + private final class ConcreteTextEdit(position0: Position, newText0: String) extends TextEdit { + val position: Position = position0 + val newText: String = newText0 + override def toString(): String = + s"TextEdit($position, $newText)" + private def toTuple(edit: TextEdit) = + ( + edit.position, + edit.newText, + ) + override def hashCode: Int = toTuple(this).## + override def equals(o: Any): Boolean = o match { + case o: TextEdit => toTuple(this) == toTuple(o) + case _ => false + } + } + + private final class ConcreteDiagnosticCode(code0: String, explanation0: Option[String]) + extends DiagnosticCode { + val code: String = code0 + val explanation: Optional[String] = o2jo(explanation0) + override def toString(): String = s"DiagnosticCode($code)" + private def toTuple(c: DiagnosticCode) = + ( + c.code, + c.explanation, + ) + override def hashCode: Int = toTuple(this).## + override def equals(o: Any): Boolean = o match { + case o: DiagnosticCode => toTuple(this) == toTuple(o) + case _ => false + } + } + + private final class ConcreteDiagnosticRelatedInformation(position0: Position, message0: String) + extends DiagnosticRelatedInformation { + val position: Position = position0 + val message: String = message0 + override def toString(): String = s"DiagnosticRelatedInformation($position, $message)" + private def toTuple(info: DiagnosticRelatedInformation) = + ( + info.position, + info.message, + ) + override def hashCode: Int = toTuple(this).## + override def equals(o: Any): Boolean = o match { + case o: DiagnosticRelatedInformation => toTuple(this) == toTuple(o) + case _ => false + } } } diff --git a/internal/util-logging/src/main/scala/sbt/util/Level.scala b/internal/util-logging/src/main/scala/sbt/util/Level.scala index 6749798a6..5e2fa1326 100644 --- a/internal/util-logging/src/main/scala/sbt/util/Level.scala +++ b/internal/util-logging/src/main/scala/sbt/util/Level.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/util/LogEvent.scala b/internal/util-logging/src/main/scala/sbt/util/LogEvent.scala index 28798feef..7f00b4d5a 100644 --- a/internal/util-logging/src/main/scala/sbt/util/LogEvent.scala +++ b/internal/util-logging/src/main/scala/sbt/util/LogEvent.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/util/LogExchange.scala b/internal/util-logging/src/main/scala/sbt/util/LogExchange.scala index 7edd4d3ec..9dd5e23ed 100644 --- a/internal/util-logging/src/main/scala/sbt/util/LogExchange.scala +++ b/internal/util-logging/src/main/scala/sbt/util/LogExchange.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/main/scala/sbt/util/Logger.scala b/internal/util-logging/src/main/scala/sbt/util/Logger.scala index 7f2ff157d..03616b7f1 100644 --- a/internal/util-logging/src/main/scala/sbt/util/Logger.scala +++ b/internal/util-logging/src/main/scala/sbt/util/Logger.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -39,11 +40,13 @@ abstract class Logger extends xLogger { def success(message: => String): Unit def log(level: Level.Value, message: => String): Unit + def verbose(msg: Supplier[String]): Unit = debug(msg) def debug(msg: Supplier[String]): Unit = log(Level.Debug, msg) def warn(msg: Supplier[String]): Unit = log(Level.Warn, msg) def info(msg: Supplier[String]): Unit = log(Level.Info, msg) def error(msg: Supplier[String]): Unit = log(Level.Error, msg) def trace(msg: Supplier[Throwable]): Unit = trace(msg.get()) + def success(msg: Supplier[String]): Unit = success(msg.get()) def log(level: Level.Value, msg: Supplier[String]): Unit = log(level, msg.get) } diff --git a/internal/util-logging/src/main/scala/sbt/util/LoggerContext.scala b/internal/util-logging/src/main/scala/sbt/util/LoggerContext.scala index 8e33f0649..af74d861c 100644 --- a/internal/util-logging/src/main/scala/sbt/util/LoggerContext.scala +++ b/internal/util-logging/src/main/scala/sbt/util/LoggerContext.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -10,8 +11,8 @@ package sbt.util import sbt.internal.util._ import java.util.concurrent.ConcurrentHashMap -import java.util.concurrent.atomic.AtomicBoolean -import scala.jdk.CollectionConverters.* +import java.util.concurrent.atomic.{ AtomicReference, AtomicBoolean } +// import scala.jdk.CollectionConverters.* /** * Provides a context for generating loggers during task evaluation. The logger context can be @@ -35,27 +36,27 @@ object LoggerContext { private[util] class LoggerContextImpl extends LoggerContext { private class Log extends MiniLogger { - private val consoleAppenders: java.util.Vector[(Appender, Level.Value)] = - new java.util.Vector + private val consoleAppenders: AtomicReference[Vector[(Appender, Level.Value)]] = + new AtomicReference(Vector.empty) def log(level: Level.Value, message: => String): Unit = { - val toAppend = consoleAppenders.asScala.filter { case (a, l) => level.compare(l) >= 0 } + val toAppend = consoleAppenders.get.filter { case (a, l) => level.compare(l) >= 0 } if (toAppend.nonEmpty) { val m = message toAppend.foreach { case (a, l) => a.appendLog(level, m) } } } def log[T](level: Level.Value, message: ObjectEvent[T]): Unit = { - consoleAppenders.forEach { case (a, l) => + consoleAppenders.get.foreach { case (a, l) => if (level.compare(l) >= 0) a.appendObjectEvent(level, message) } } def addAppender(newAppender: (Appender, Level.Value)): Unit = - Util.ignoreResult(consoleAppenders.add(newAppender)) + Util.ignoreResult(consoleAppenders.updateAndGet(_ :+ newAppender)) def clearAppenders(): Unit = { - consoleAppenders.forEach { case (a, _) => a.close() } - consoleAppenders.clear() + consoleAppenders.get.foreach { case (a, _) => a.close() } + consoleAppenders.set(Vector.empty) } - def appenders: Seq[Appender] = consoleAppenders.asScala.map(_._1).toVector + def appenders: Seq[Appender] = consoleAppenders.get.map(_._1) } private[this] val loggers = new ConcurrentHashMap[String, Log] private[this] val closed = new AtomicBoolean(false) diff --git a/internal/util-logging/src/main/scala/sbt/util/ShowLines.scala b/internal/util-logging/src/main/scala/sbt/util/ShowLines.scala index 2f428086f..f6ea6107e 100644 --- a/internal/util-logging/src/main/scala/sbt/util/ShowLines.scala +++ b/internal/util-logging/src/main/scala/sbt/util/ShowLines.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/test/scala/Escapes.scala b/internal/util-logging/src/test/scala/Escapes.scala index af4e1c705..fd92660de 100644 --- a/internal/util-logging/src/test/scala/Escapes.scala +++ b/internal/util-logging/src/test/scala/Escapes.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/test/scala/LogWriterTest.scala b/internal/util-logging/src/test/scala/LogWriterTest.scala index af87420dd..bc8681f53 100644 --- a/internal/util-logging/src/test/scala/LogWriterTest.scala +++ b/internal/util-logging/src/test/scala/LogWriterTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/test/scala/ManagedLoggerSpec.scala b/internal/util-logging/src/test/scala/ManagedLoggerSpec.scala index 05a2d9bab..7c945b61d 100644 --- a/internal/util-logging/src/test/scala/ManagedLoggerSpec.scala +++ b/internal/util-logging/src/test/scala/ManagedLoggerSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/test/scala/ProblemTest.scala b/internal/util-logging/src/test/scala/ProblemTest.scala new file mode 100644 index 000000000..ed54efe33 --- /dev/null +++ b/internal/util-logging/src/test/scala/ProblemTest.scala @@ -0,0 +1,205 @@ +/* + * sbt + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. + * Copyright 2008 - 2010, Mark Harrah + * Licensed under Apache License 2.0 (see LICENSE) + */ + +package sbt + +import java.net.URI +import hedgehog._ +import hedgehog.runner._ +import _root_.sbt.util.InterfaceUtil +import InterfaceUtil.{ jl2l, jo2o, l2jl } +import xsbti._ + +object ProblemTest extends Properties { + override def tests: List[Test] = List( + property( + "All problems can toString", + genProblem.forAll.map(toStringCheck), + ), + property( + "All problems can be compared structurally", + genProblem.forAll.map(equalityCheck), + ), + property( + "All diagnostic codes can be compared structurally", + genDiagnosticCode.forAll.map(equalityCheck), + ), + property( + "All diagnostic related information can be compared structurally", + genDiagnosticRelatedInformation.forAll.map(equalityCheck), + ), + property( + "All actions can be compared structurally", + genAction.forAll.map(equalityCheck), + ), + ) + + def toStringCheck(p: Problem): Result = + Result.assert(p.toString() != "") + + def equalityCheck(p: Problem): Result = { + val other = InterfaceUtil.problem( + p.category, + p.position, + p.message, + p.severity, + jo2o(p.rendered), + jo2o(p.diagnosticCode).map(copy), + jl2l(p.diagnosticRelatedInformation).map(copy), + jl2l(p.actions).map(copy), + ) + Result + .assert(p == other) + .log(s"$p == $other") + } + + def equalityCheck(c: DiagnosticCode): Result = { + val other = copy(c) + Result.assert(c == other) + } + + def equalityCheck(info: DiagnosticRelatedInformation): Result = { + val other = copy(info) + Result.assert(info == other) + } + + def equalityCheck(a: Action): Result = { + val other = copy(a) + Result.assert(a == other) + } + + lazy val genProblem: Gen[Problem] = + for { + cat <- genString + pos <- genPosition + msg <- genString + sev <- genSeverity + rendered <- optString + code <- optDiagnosticCode + info <- listDiagnosticRelatedInformation + actions <- listAction + } yield InterfaceUtil.problem( + cat, + pos, + msg, + sev, + rendered, + code, + info, + actions, + ) + + lazy val optDiagnosticCode: Gen[Option[DiagnosticCode]] = + Gen.choice1(genDiagnosticCode.map(Some(_)), Gen.constant(None)) + + lazy val genDiagnosticCode: Gen[DiagnosticCode] = + for { + code <- Gen.int(Range.linear(0, 1024)) + } yield InterfaceUtil.diagnosticCode("E" + code.toString, None) + + lazy val genSeverity: Gen[Severity] = + Gen.element(Severity.Info, List(Severity.Warn, Severity.Error)) + + lazy val genPosition: Gen[Position] = + for { + line <- optIntGen + content <- genString + offset <- optIntGen + } yield InterfaceUtil.position( + line, + content, + offset, + None, + None, + None, + None, + None, + None, + None, + None, + None, + None, + ) + + lazy val listDiagnosticRelatedInformation: Gen[List[DiagnosticRelatedInformation]] = + Gen.list(genDiagnosticRelatedInformation, Range.linear(0, 2)) + + lazy val genDiagnosticRelatedInformation: Gen[DiagnosticRelatedInformation] = + for { + pos <- genPosition + message <- genString + } yield InterfaceUtil.diagnosticRelatedInformation(pos, message) + + lazy val listAction: Gen[List[Action]] = + Gen.list(genAction, Range.linear(0, 2)) + + lazy val genAction: Gen[Action] = + for { + title <- genString + description <- optString + edit <- genWorkspaceEdit + } yield InterfaceUtil.action(title, description, edit) + + lazy val genWorkspaceEdit: Gen[WorkspaceEdit] = + for { + changes <- listTextEdit + } yield InterfaceUtil.workspaceEdit(changes) + + lazy val listTextEdit: Gen[List[TextEdit]] = + Gen.list(genTextEdit, Range.linear(0, 2)) + + lazy val genTextEdit: Gen[TextEdit] = + for { + pos <- genPosition + newText <- genString + } yield InterfaceUtil.textEdit(pos, newText) + + lazy val genUri: Gen[URI] = + for { + ssp <- genString + } yield new URI("file", "///" + ssp, null) + + lazy val optString: Gen[Option[String]] = + Gen.choice1(genString.map(Some(_)), Gen.constant(None)) + + lazy val genString = Gen.string(Gen.alphaNum, Range.linear(0, 256)) + + lazy val optIntGen: Gen[Option[Integer]] = + Gen.choice1(Gen.int(Range.linear(0, 1024)).map(Some(_)), Gen.constant(None)) + + private def copy(c: DiagnosticCode): DiagnosticCode = + new DiagnosticCode() { + val code = c.code + override def explanation = c.explanation + } + + private def copy(info: DiagnosticRelatedInformation): DiagnosticRelatedInformation = + new DiagnosticRelatedInformation() { + override def position = info.position + override def message = info.message + } + + private def copy(a: Action): Action = + new Action { + override def title = a.title + override def description = a.description + override def edit = copy(a.edit) + } + + private def copy(edit: WorkspaceEdit): WorkspaceEdit = + new WorkspaceEdit { + override def changes() = + l2jl(jl2l(edit.changes).map(copy)) + } + + private def copy(edit: TextEdit): TextEdit = + new TextEdit { + override val position = edit.position + override val newText = edit.newText + } +} diff --git a/internal/util-logging/src/test/scala/TestLogger.scala b/internal/util-logging/src/test/scala/TestLogger.scala index 45034ab10..d31369a71 100644 --- a/internal/util-logging/src/test/scala/TestLogger.scala +++ b/internal/util-logging/src/test/scala/TestLogger.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/test/scala/sbt/internal/util/CleanStringSpec.scala b/internal/util-logging/src/test/scala/sbt/internal/util/CleanStringSpec.scala index ee1abdd66..201235ba6 100644 --- a/internal/util-logging/src/test/scala/sbt/internal/util/CleanStringSpec.scala +++ b/internal/util-logging/src/test/scala/sbt/internal/util/CleanStringSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/test/scala/sbt/internal/util/ProgressStateSpec.scala b/internal/util-logging/src/test/scala/sbt/internal/util/ProgressStateSpec.scala index 909c64968..c777772ce 100644 --- a/internal/util-logging/src/test/scala/sbt/internal/util/ProgressStateSpec.scala +++ b/internal/util-logging/src/test/scala/sbt/internal/util/ProgressStateSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logging/src/test/scala/sbt/internal/util/UTF8DecoderSpec.scala b/internal/util-logging/src/test/scala/sbt/internal/util/UTF8DecoderSpec.scala index f99ba6d9a..4f5f47ea2 100644 --- a/internal/util-logging/src/test/scala/sbt/internal/util/UTF8DecoderSpec.scala +++ b/internal/util-logging/src/test/scala/sbt/internal/util/UTF8DecoderSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logic/src/main/scala/sbt/internal/util/logic/Logic.scala b/internal/util-logic/src/main/scala/sbt/internal/util/logic/Logic.scala index 5dd9836c0..706c7a587 100644 --- a/internal/util-logic/src/main/scala/sbt/internal/util/logic/Logic.scala +++ b/internal/util-logic/src/main/scala/sbt/internal/util/logic/Logic.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-logic/src/test/scala/sbt/logic/Test.scala b/internal/util-logic/src/test/scala/sbt/logic/Test.scala index 1a2046381..8d993f730 100644 --- a/internal/util-logic/src/test/scala/sbt/logic/Test.scala +++ b/internal/util-logic/src/test/scala/sbt/logic/Test.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-position/src/main/scala-2/sbt/internal/util/SourcePositionMacro.scala b/internal/util-position/src/main/scala-2/sbt/internal/util/SourcePositionMacro.scala index 309ce5835..9c025164b 100644 --- a/internal/util-position/src/main/scala-2/sbt/internal/util/SourcePositionMacro.scala +++ b/internal/util-position/src/main/scala-2/sbt/internal/util/SourcePositionMacro.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-position/src/main/scala/sbt/internal/util/Positions.scala b/internal/util-position/src/main/scala/sbt/internal/util/Positions.scala index 78deb8e48..a1d6f7123 100644 --- a/internal/util-position/src/main/scala/sbt/internal/util/Positions.scala +++ b/internal/util-position/src/main/scala/sbt/internal/util/Positions.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-position/src/test/scala/sbt/internal/util/SourcePositionSpec.scala b/internal/util-position/src/test/scala/sbt/internal/util/SourcePositionSpec.scala index 60206dcc6..f41cef10b 100644 --- a/internal/util-position/src/test/scala/sbt/internal/util/SourcePositionSpec.scala +++ b/internal/util-position/src/test/scala/sbt/internal/util/SourcePositionSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -12,7 +13,7 @@ import org.scalatest.flatspec.AnyFlatSpec class SourcePositionSpec extends AnyFlatSpec { "SourcePosition()" should "return a sane SourcePosition" in { val filename = "SourcePositionSpec.scala" - val lineNumber = 16 + val lineNumber = 17 SourcePosition.fromEnclosing() match { case LinePosition(path, startLine) => assert(path === filename && startLine === lineNumber) case RangePosition(path, range) => assert(path === filename && inRange(range, lineNumber)) diff --git a/internal/util-relation/src/main/scala/sbt/internal/util/Relation.scala b/internal/util-relation/src/main/scala/sbt/internal/util/Relation.scala index 4c9b0b3cf..a5a8ecf3e 100644 --- a/internal/util-relation/src/main/scala/sbt/internal/util/Relation.scala +++ b/internal/util-relation/src/main/scala/sbt/internal/util/Relation.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-relation/src/test/scala/RelationTest.scala b/internal/util-relation/src/test/scala/RelationTest.scala index 3cd71875f..469e3fd4a 100644 --- a/internal/util-relation/src/test/scala/RelationTest.scala +++ b/internal/util-relation/src/test/scala/RelationTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-scripted/src/main/java/sbt/internal/scripted/ScriptConfig.java b/internal/util-scripted/src/main/java/sbt/internal/scripted/ScriptConfig.java index 39216d3ae..32813b55d 100644 --- a/internal/util-scripted/src/main/java/sbt/internal/scripted/ScriptConfig.java +++ b/internal/util-scripted/src/main/java/sbt/internal/scripted/ScriptConfig.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/CommentHandler.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/CommentHandler.scala index 7b78f82e3..d832536d0 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/CommentHandler.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/CommentHandler.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala index eea382007..5d4cdd26e 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FileCommands.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FilteredLoader.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FilteredLoader.scala index 16499886e..2de59b5f7 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/FilteredLoader.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/FilteredLoader.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/HandlersProvider.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/HandlersProvider.scala index f6bfe1c20..06ccdf023 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/HandlersProvider.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/HandlersProvider.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/ScriptRunner.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/ScriptRunner.scala index 9bcbe25ee..85b61ad59 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/ScriptRunner.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/ScriptRunner.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/ScriptedTests.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/ScriptedTests.scala index aac26b140..52c08c70a 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/ScriptedTests.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/ScriptedTests.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/StatementHandler.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/StatementHandler.scala index 6962cee6a..e0c9b968e 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/StatementHandler.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/StatementHandler.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/internal/util-scripted/src/main/scala/sbt/internal/scripted/TestScriptParser.scala b/internal/util-scripted/src/main/scala/sbt/internal/scripted/TestScriptParser.scala index 9d2548059..51309a78d 100644 --- a/internal/util-scripted/src/main/scala/sbt/internal/scripted/TestScriptParser.scala +++ b/internal/util-scripted/src/main/scala/sbt/internal/scripted/TestScriptParser.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/launch/NOTICE b/launch/NOTICE index 8abf4ed53..620b87014 100644 --- a/launch/NOTICE +++ b/launch/NOTICE @@ -1,5 +1,6 @@ sbt Launcher -Copyright 2011 - 2017, Lightbend, Inc. +Copyright 2023, Scala center +Copyright 2011 - 2022, Lightbend, Inc. Copyright 2008 - 2010, Mark Harrah, David MacIver Licensed under BSD-3-Clause license (see LICENSE) diff --git a/launcher-package/NOTICE b/launcher-package/NOTICE index 6b28ce942..98799ed60 100644 --- a/launcher-package/NOTICE +++ b/launcher-package/NOTICE @@ -1,6 +1,7 @@ sbt https://www.scala-sbt.org/ -Copyright 2011 - 2019, Lightbend, Inc. +Copyright 2023, Scala center +Copyright 2011 - 2022, Lightbend, Inc. Copyright 2008 - 2010, Mark Harrah Licensed under Apache v2 license (see LICENSE) diff --git a/launcher-package/build.sbt b/launcher-package/build.sbt index 6ccf65f27..2873a7087 100755 --- a/launcher-package/build.sbt +++ b/launcher-package/build.sbt @@ -26,7 +26,7 @@ lazy val sbtVersionToRelease = sys.props.getOrElse("sbt.build.version", sys.env. })) lazy val scala210 = "2.10.7" -lazy val scala212 = "2.12.15" +lazy val scala212 = "2.12.19" lazy val scala210Jline = "org.scala-lang" % "jline" % scala210 lazy val jansi = { if (sbtVersionToRelease startsWith "1.") "org.fusesource.jansi" % "jansi" % "1.12" @@ -34,8 +34,8 @@ lazy val jansi = { } lazy val scala212Compiler = "org.scala-lang" % "scala-compiler" % scala212 lazy val scala212Jline = "jline" % "jline" % "2.14.6" -// use the scala-xml version used by the compiler not the latest: https://github.com/scala/scala/blob/v2.12.14/versions.properties#L21 -lazy val scala212Xml = "org.scala-lang.modules" % "scala-xml_2.12" % "1.0.6" +// use the scala-xml version used by the compiler not the latest: https://github.com/scala/scala/blob/v2.12.19/versions.properties +lazy val scala212Xml = "org.scala-lang.modules" % "scala-xml_2.12" % "2.2.0" lazy val sbtActual = "org.scala-sbt" % "sbt" % sbtVersionToRelease lazy val sbt013ExtraDeps = { @@ -70,11 +70,13 @@ val debianBuildId = settingKey[Int]("build id for Debian") val exportRepoUsingCoursier = taskKey[File]("export Maven style repository") val exportRepoCsrDirectory = settingKey[File]("") -val x86MacPlatform = "x86_64-apple-darwin" +val universalMacPlatform = "universal-apple-darwin" val x86LinuxPlatform = "x86_64-pc-linux" +val aarch64LinuxPlatform = "aarch64-pc-linux" val x86WindowsPlatform = "x86_64-pc-win32" -val x86MacImageName = s"sbtn-$x86MacPlatform" +val universalMacImageName = s"sbtn-$universalMacPlatform" val x86LinuxImageName = s"sbtn-$x86LinuxPlatform" +val aarch64LinuxImageName = s"sbtn-$aarch64LinuxPlatform" val x86WindowsImageName = s"sbtn-$x86WindowsPlatform.exe" organization in ThisBuild := "org.scala-sbt" @@ -119,39 +121,51 @@ val root = (project in file(".")). file }, // update sbt.sh at root - sbtnVersion := "1.7.0", + sbtnVersion := "1.10.0", sbtnJarsBaseUrl := "https://github.com/sbt/sbtn-dist/releases/download", sbtnJarsMappings := { val baseUrl = sbtnJarsBaseUrl.value val v = sbtnVersion.value - val macosImageTar = s"sbtn-$x86MacPlatform-$v.tar.gz" - val linuxImageTar = s"sbtn-$x86LinuxPlatform-$v.tar.gz" + val macosUniversalImageTar = s"sbtn-$universalMacPlatform-$v.tar.gz" + val linuxX86ImageTar = s"sbtn-$x86LinuxPlatform-$v.tar.gz" + val linuxAarch64ImageTar = s"sbtn-$aarch64LinuxPlatform-$v.tar.gz" val windowsImageZip = s"sbtn-$x86WindowsPlatform-$v.zip" val t = target.value - val macosTar = t / macosImageTar - val linuxTar = t / linuxImageTar + val macosUniversalTar = t / macosUniversalImageTar + val linuxX86Tar = t / linuxX86ImageTar + val linuxAarch64Tar = t / linuxAarch64ImageTar val windowsZip = t / windowsImageZip import dispatch.classic._ - if(!macosTar.exists && !isWindows && sbtIncludeSbtn) { - IO.touch(macosTar) - val writer = new java.io.BufferedOutputStream(new java.io.FileOutputStream(macosTar)) - try Http(url(s"$baseUrl/v$v/$macosImageTar") >>> writer) + if(!macosUniversalTar.exists && !isWindows && sbtIncludeSbtn) { + IO.touch(macosUniversalTar) + val writer = new java.io.BufferedOutputStream(new java.io.FileOutputStream(macosUniversalTar)) + try Http(url(s"$baseUrl/v$v/$macosUniversalImageTar") >>> writer) finally writer.close() - val platformDir = t / x86MacPlatform + val platformDir = t / universalMacPlatform IO.createDirectory(platformDir) - s"tar zxvf $macosTar --directory $platformDir".! - IO.move(platformDir / "sbtn", t / x86MacImageName) + s"tar zxvf $macosUniversalTar --directory $platformDir".! + IO.move(platformDir / "sbtn", t / universalMacImageName) } - if(!linuxTar.exists && !isWindows && sbtIncludeSbtn) { - IO.touch(linuxTar) - val writer = new java.io.BufferedOutputStream(new java.io.FileOutputStream(linuxTar)) - try Http(url(s"$baseUrl/v$v/$linuxImageTar") >>> writer) + if(!linuxX86Tar.exists && !isWindows && sbtIncludeSbtn) { + IO.touch(linuxX86Tar) + val writer = new java.io.BufferedOutputStream(new java.io.FileOutputStream(linuxX86Tar)) + try Http(url(s"$baseUrl/v$v/$linuxX86ImageTar") >>> writer) finally writer.close() val platformDir = t / x86LinuxPlatform IO.createDirectory(platformDir) - s"""tar zxvf $linuxTar --directory $platformDir""".! + s"""tar zxvf $linuxX86Tar --directory $platformDir""".! IO.move(platformDir / "sbtn", t / x86LinuxImageName) } + if(!linuxAarch64Tar.exists && !isWindows && sbtIncludeSbtn) { + IO.touch(linuxAarch64Tar) + val writer = new java.io.BufferedOutputStream(new java.io.FileOutputStream(linuxAarch64Tar)) + try Http(url(s"$baseUrl/v$v/$linuxAarch64ImageTar") >>> writer) + finally writer.close() + val platformDir = t / aarch64LinuxPlatform + IO.createDirectory(platformDir) + s"""tar zxvf $linuxAarch64Tar --directory $platformDir""".! + IO.move(platformDir / "sbtn", t / aarch64LinuxImageName) + } if(!windowsZip.exists && sbtIncludeSbtn) { IO.touch(windowsZip) val writer = new java.io.BufferedOutputStream(new java.io.FileOutputStream(windowsZip)) @@ -164,13 +178,14 @@ val root = (project in file(".")). if (!sbtIncludeSbtn) Seq() else if (isWindows) Seq(t / x86WindowsImageName -> s"bin/$x86WindowsImageName") else - Seq(t / x86MacImageName -> s"bin/$x86MacImageName", + Seq(t / universalMacImageName -> s"bin/$universalMacImageName", t / x86LinuxImageName -> s"bin/$x86LinuxImageName", + t / aarch64LinuxImageName -> s"bin/$aarch64LinuxImageName", t / x86WindowsImageName -> s"bin/$x86WindowsImageName") }, // GENERAL LINUX PACKAGING STUFFS - maintainer := "Eugene Yokota ", + maintainer := "Eugene Yokota ", packageSummary := "sbt, the interactive build tool", packageDescription := """This script provides a native way to run sbt, a build tool for Scala and more.""", @@ -222,10 +237,10 @@ val root = (project in file(".")). val orig = (linuxPackageMappings in Rpm).value val nativeMappings = sbtnJarsMappings.value orig.map(o => o.copy(mappings = o.mappings.toList filterNot { - case (x, p) => p.contains("sbtn-x86_64") + case (x, p) => p.contains("sbtn-x86_64") || p.contains("sbtn-aarch64") })) }, - rpmVendor := "lightbend", + rpmVendor := "scalacenter", rpmUrl := Some("http://github.com/sbt/sbt-launcher-package"), rpmLicense := Some("Apache-2.0"), // This is intentionally empty. java-devel could bring in JDK 9-ea on Fedora, @@ -247,7 +262,7 @@ val root = (project in file(".")). case Array(major) => Seq(major, "0", "0", bid.toString) mkString "." } }, - maintainer in Windows := "Lightbend, Inc.", + maintainer in Windows := "Scala Center", packageSummary in Windows := "sbt " + (version in Windows).value, packageDescription in Windows := "The interactive build tool.", wixProductId := "ce07be71-510d-414a-92d4-dff47631848a", @@ -349,7 +364,13 @@ lazy val integrationTest = (project in file("integration-test")) "com.eed3si9n.expecty" %% "expecty" % "0.11.0" % Test, "org.scala-sbt" %% "io" % "1.3.1" % Test ), - testFrameworks += new TestFramework("minitest.runner.Framework") + testFrameworks += new TestFramework("minitest.runner.Framework"), + test in Test := { + (test in Test).dependsOn(((packageBin in Universal) in LocalRootProject).dependsOn(((stage in (Universal) in LocalRootProject)))).value + }, + testOnly in Test := { + (testOnly in Test).dependsOn(((packageBin in Universal) in LocalRootProject).dependsOn(((stage in (Universal) in LocalRootProject)))).evaluated + } ) def downloadUrlForVersion(v: String) = (v split "[^\\d]" flatMap (i => catching(classOf[Exception]) opt (i.toInt))) match { diff --git a/launcher-package/integration-test/src/test/scala/RunnerTest.scala b/launcher-package/integration-test/src/test/scala/RunnerTest.scala index 6d43be04a..f3d406502 100755 --- a/launcher-package/integration-test/src/test/scala/RunnerTest.scala +++ b/launcher-package/integration-test/src/test/scala/RunnerTest.scala @@ -3,12 +3,14 @@ package example.test import minitest._ import scala.sys.process._ import java.io.File +import java.util.Locale object SbtRunnerTest extends SimpleTestSuite with PowerAssertions { // 1.3.0, 1.3.0-M4 private[test] val versionRegEx = "\\d(\\.\\d+){2}(-\\w+)?" - lazy val isWindows: Boolean = sys.props("os.name").toLowerCase(java.util.Locale.ENGLISH).contains("windows") + lazy val isWindows: Boolean = sys.props("os.name").toLowerCase(Locale.ENGLISH).contains("windows") + lazy val isMac: Boolean = sys.props("os.name").toLowerCase(Locale.ENGLISH).contains("mac") lazy val sbtScript = if (isWindows) new File("target/universal/stage/bin/sbt.bat") else new File("target/universal/stage/bin/sbt") @@ -58,9 +60,12 @@ object SbtRunnerTest extends SimpleTestSuite with PowerAssertions { } test("sbt \"testOnly *\"") { - val out = sbtProcess("testOnly *", "--no-colors", "-v").!!.linesIterator.toList - assert(out.contains[String]("[info] HelloTest")) - () + if (isMac) () + else { + val out = sbtProcess("testOnly *", "--no-colors", "-v").!!.linesIterator.toList + assert(out.contains[String]("[info] HelloTest")) + () + } } /* diff --git a/launcher-package/integration-test/src/test/scala/ScriptTest.scala b/launcher-package/integration-test/src/test/scala/ScriptTest.scala index e1fe01b5f..512cd4345 100644 --- a/launcher-package/integration-test/src/test/scala/ScriptTest.scala +++ b/launcher-package/integration-test/src/test/scala/ScriptTest.scala @@ -1,7 +1,11 @@ package example.test import minitest._ +import sbt.io.IO + import java.io.File +import java.io.PrintWriter +import java.nio.file.Files object SbtScriptTest extends SimpleTestSuite with PowerAssertions { lazy val isWindows: Boolean = @@ -16,28 +20,40 @@ object SbtScriptTest extends SimpleTestSuite with PowerAssertions { name: String, javaOpts: String = "", sbtOpts: String = "", + sbtOptsFileContents: String = "", + javaToolOptions: String = "" )(args: String*)(f: List[String] => Any) = { test(name) { - val out = - sbtProcessWithOpts(args: _*)(javaOpts = javaOpts, sbtOpts = sbtOpts).!!.linesIterator.toList - f(out) - () - } - } + val workingDirectory = Files.createTempDirectory("sbt-launcher-package-test").toFile + IO.copyDirectory(new File("citest"), workingDirectory) - def sbtProcess(args: String*) = sbtProcessWithOpts(args: _*)("", "") - def sbtProcessWithOpts(args: String*)(javaOpts: String, sbtOpts: String) = { - val path = sys.env("PATH") - sbt.internal.Process( - Seq(sbtScript.getAbsolutePath) ++ args, - new File("citest"), - "JAVA_OPTS" -> javaOpts, - "SBT_OPTS" -> sbtOpts, - if (isWindows) - "JAVACMD" -> new File(javaBinDir, "java.cmd").getAbsolutePath() - else - "PATH" -> (javaBinDir + File.pathSeparator + path) - ) + try { + val sbtOptsFile = new File(workingDirectory, ".sbtopts") + sbtOptsFile.createNewFile() + val writer = new PrintWriter(sbtOptsFile) + try { + writer.write(sbtOptsFileContents) + } finally { + writer.close() + } + val path = sys.env.getOrElse("PATH", sys.env("Path")) + val out = sbt.internal.Process( + Seq(sbtScript.getAbsolutePath) ++ args, + workingDirectory, + "JAVA_OPTS" -> javaOpts, + "SBT_OPTS" -> sbtOpts, + "JAVA_TOOL_OPTIONS" -> javaToolOptions, + if (isWindows) + "JAVACMD" -> new File(javaBinDir, "java").getAbsolutePath() + else + "PATH" -> (javaBinDir + File.pathSeparator + path) + ).!!.linesIterator.toList + f(out) + () + } finally { + IO.delete(workingDirectory) + } + } } makeTest("sbt -no-colors")("compile", "-no-colors", "-v") { out: List[String] => @@ -161,11 +177,9 @@ object SbtScriptTest extends SimpleTestSuite with PowerAssertions { assert(!out.contains[String]("-XX:+UseG1GC=-XX:+PrintGC")) } - test("sbt with -debug in SBT_OPTS appears in sbt commands") { + makeTest("sbt with -debug in SBT_OPTS appears in sbt commands", javaOpts = "", sbtOpts = "-debug")("compile", "-v") {out: List[String] => if (isWindows) cancel("Test not supported on windows") - val out: List[String] = - sbtProcessWithOpts("compile", "-v")(javaOpts = "", sbtOpts = "-debug").!!.linesIterator.toList // Debug argument must appear in the 'commands' section (after the sbt-launch.jar argument) to work val sbtLaunchMatcher = """^.+sbt-launch.jar["]{0,1}$""".r val locationOfSbtLaunchJarArg = out.zipWithIndex.collectFirst { @@ -196,14 +210,45 @@ object SbtScriptTest extends SimpleTestSuite with PowerAssertions { assert(out.contains[String]("-Dsbt.ivy.home=/ivy/dir")) } - test("sbt --script-version should print sbtVersion") { - val out = sbtProcess("--script-version").!!.trim + makeTest("sbt --script-version should print sbtVersion")("--script-version") { out: List[String] => val expectedVersion = "^" + SbtRunnerTest.versionRegEx + "$" - assert(out.matches(expectedVersion)) + assert(out.mkString(System.lineSeparator()).trim.matches(expectedVersion)) () } makeTest("--sbt-cache")("--sbt-cache", "./cachePath") { out: List[String] => assert(out.contains[String](s"-Dsbt.global.localcache=./cachePath")) } + + makeTest( + "sbt use .sbtopts file for memory options", sbtOptsFileContents = + """-J-XX:MaxInlineLevel=20 + |-J-Xmx222m + |-J-Xms111m + |-J-Xss12m""".stripMargin + + )("compile", "-v") { out: List[String] => + assert(out.contains[String]("-XX:MaxInlineLevel=20")) + assert(out.contains[String]("-Xmx222m")) + assert(out.contains[String]("-Xms111m")) + assert(out.contains[String]("-Xss12m")) + } + + makeTest( + "sbt use JAVA_OPTS for memory options", javaOpts = "-XX:MaxInlineLevel=20 -Xmx222m -Xms111m -Xss12m" + )("compile", "-v") { out: List[String] => + assert(out.contains[String]("-XX:MaxInlineLevel=20")) + assert(out.contains[String]("-Xmx222m")) + assert(out.contains[String]("-Xms111m")) + assert(out.contains[String]("-Xss12m")) + } + + makeTest( + "sbt use JAVA_TOOL_OPTIONS for memory options", javaToolOptions = "-XX:MaxInlineLevel=20 -Xmx222m -Xms111m -Xss12m" + )("compile", "-v") { out: List[String] => + assert(out.contains[String]("-XX:MaxInlineLevel=20")) + assert(out.contains[String]("-Xmx222m")) + assert(out.contains[String]("-Xms111m")) + assert(out.contains[String]("-Xss12m")) + } } diff --git a/launcher-package/src/universal/bin/sbt.bat b/launcher-package/src/universal/bin/sbt.bat index 19b2a0643..22956f7ec 100755 --- a/launcher-package/src/universal/bin/sbt.bat +++ b/launcher-package/src/universal/bin/sbt.bat @@ -112,20 +112,22 @@ if not defined _JAVACMD ( if not defined _JAVACMD set _JAVACMD=java -rem users can set JAVA_OPTS via .jvmopts (sbt-extras style) -if exist .jvmopts for /F %%A in (.jvmopts) do ( - set _jvmopts_line=%%A - if not "!_jvmopts_line:~0,1!" == "#" ( - if defined _JAVA_OPTS ( - set _JAVA_OPTS=!_JAVA_OPTS! %%A - ) else ( - set _JAVA_OPTS=%%A - ) - ) -) +rem We use the value of the JAVA_OPTS environment variable if defined, rather than the config. +if not defined _JAVA_OPTS if defined JAVA_OPTS set _JAVA_OPTS=%JAVA_OPTS% -rem We use the value of the JAVA_OPTS environment variable if defined, rather than the config. -if not defined _JAVA_OPTS if defined JAVA_OPTS set _JAVA_OPTS=%JAVA_OPTS% +rem users can set JAVA_OPTS via .jvmopts (sbt-extras style) +if exist .jvmopts for /F %%A in (.jvmopts) do ( + set _jvmopts_line=%%A + if not "!_jvmopts_line:~0,1!" == "#" ( + if defined _JAVA_OPTS ( + set _JAVA_OPTS=!_JAVA_OPTS! %%A + ) else ( + set _JAVA_OPTS=%%A + ) + ) +) + +rem If nothing is defined, use the defaults. if not defined _JAVA_OPTS if defined default_java_opts set _JAVA_OPTS=!default_java_opts! rem We use the value of the SBT_OPTS environment variable if defined, rather than the config. @@ -680,6 +682,7 @@ if defined sbt_args_verbose ( echo "!_JAVACMD!" if defined _JAVA_OPTS ( call :echolist !_JAVA_OPTS! ) if defined _SBT_OPTS ( call :echolist !_SBT_OPTS! ) + if defined JAVA_TOOL_OPTIONS ( call :echolist %JAVA_TOOL_OPTIONS% ) echo -cp echo "!sbt_jar!" echo xsbt.boot.Boot @@ -687,7 +690,7 @@ if defined sbt_args_verbose ( echo. ) -"!_JAVACMD!" !_JAVA_OPTS! !_SBT_OPTS! -cp "!sbt_jar!" xsbt.boot.Boot %* +"!_JAVACMD!" !_JAVA_OPTS! !_SBT_OPTS! %JAVA_TOOL_OPTIONS% -cp "!sbt_jar!" xsbt.boot.Boot %* goto :eof @@ -826,21 +829,21 @@ exit /B 0 set _has_memory_args= - if defined _JAVA_OPTS for /F %%g in ("!_JAVA_OPTS!") do ( + if defined _JAVA_OPTS for %%g in (%_JAVA_OPTS%) do ( set "p=%%g" if "!p:~0,4!" == "-Xmx" set _has_memory_args=1 if "!p:~0,4!" == "-Xms" set _has_memory_args=1 if "!p:~0,4!" == "-Xss" set _has_memory_args=1 ) - if defined JAVA_TOOL_OPTIONS for /F %%g in ("%JAVA_TOOL_OPTIONS%") do ( + if defined JAVA_TOOL_OPTIONS for %%g in (%JAVA_TOOL_OPTIONS%) do ( set "p=%%g" if "!p:~0,4!" == "-Xmx" set _has_memory_args=1 if "!p:~0,4!" == "-Xms" set _has_memory_args=1 if "!p:~0,4!" == "-Xss" set _has_memory_args=1 ) - if defined _SBT_OPTS for /F %%g in ("!_SBT_OPTS!") do ( + if defined _SBT_OPTS for %%g in (%_SBT_OPTS%) do ( set "p=%%g" if "!p:~0,4!" == "-Xmx" set _has_memory_args=1 if "!p:~0,4!" == "-Xms" set _has_memory_args=1 diff --git a/main-actions/src/main/scala/sbt/Console.scala b/main-actions/src/main/scala/sbt/Console.scala index 35d5a2559..a0a07289e 100644 --- a/main-actions/src/main/scala/sbt/Console.scala +++ b/main-actions/src/main/scala/sbt/Console.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-actions/src/main/scala/sbt/DotGraph.scala b/main-actions/src/main/scala/sbt/DotGraph.scala index 6d39109a3..71b927812 100644 --- a/main-actions/src/main/scala/sbt/DotGraph.scala +++ b/main-actions/src/main/scala/sbt/DotGraph.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-actions/src/main/scala/sbt/ForkTests.scala b/main-actions/src/main/scala/sbt/ForkTests.scala index 83ba4e5a1..150667e13 100755 --- a/main-actions/src/main/scala/sbt/ForkTests.scala +++ b/main-actions/src/main/scala/sbt/ForkTests.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-actions/src/main/scala/sbt/RawCompileLike.scala b/main-actions/src/main/scala/sbt/RawCompileLike.scala index 10206e22e..2282dd5fa 100644 --- a/main-actions/src/main/scala/sbt/RawCompileLike.scala +++ b/main-actions/src/main/scala/sbt/RawCompileLike.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-actions/src/main/scala/sbt/Sync.scala b/main-actions/src/main/scala/sbt/Sync.scala index b28f56d52..143f84c43 100644 --- a/main-actions/src/main/scala/sbt/Sync.scala +++ b/main-actions/src/main/scala/sbt/Sync.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -102,7 +103,7 @@ object Sync { def noDuplicateTargets(relation: Relation[File, File]): Unit = { val dups = relation.reverseMap - .filter { case (_, srcs) => srcs.size >= 2 && srcs.exists(!_.isDirectory) } + .withFilter { case (_, srcs) => srcs.size >= 2 && srcs.exists(!_.isDirectory) } .map { case (target, srcs) => "\n\t" + target + "\nfrom\n\t" + srcs.mkString("\n\t\t") } if (dups.nonEmpty) sys.error("Duplicate mappings:" + dups.mkString) diff --git a/main-actions/src/main/scala/sbt/TestResultLogger.scala b/main-actions/src/main/scala/sbt/TestResultLogger.scala index a0a31d08c..1415f3818 100644 --- a/main-actions/src/main/scala/sbt/TestResultLogger.scala +++ b/main-actions/src/main/scala/sbt/TestResultLogger.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -160,7 +161,7 @@ object TestResultLogger { "Canceled" -> canceledCount, "Pending" -> pendingCount ) - val extra = otherCounts.filter(_._2 > 0).map { case (label, count) => s", $label $count" } + val extra = otherCounts.withFilter(_._2 > 0).map { case (label, count) => s", $label $count" } val postfix = base + extra.mkString results.overall match { diff --git a/main-actions/src/main/scala/sbt/Tests.scala b/main-actions/src/main/scala/sbt/Tests.scala index 2b1eefbf2..e4d227ee6 100644 --- a/main-actions/src/main/scala/sbt/Tests.scala +++ b/main-actions/src/main/scala/sbt/Tests.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-actions/src/test/scala/sbt/CacheIvyTest.scala b/main-actions/src/test/scala/sbt/CacheIvyTest.scala index a8f76ec98..b78e3d537 100644 --- a/main-actions/src/test/scala/sbt/CacheIvyTest.scala +++ b/main-actions/src/test/scala/sbt/CacheIvyTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/java/sbt/internal/BootServerSocket.java b/main-command/src/main/java/sbt/internal/BootServerSocket.java index a64c18951..84cd3e69c 100644 --- a/main-command/src/main/java/sbt/internal/BootServerSocket.java +++ b/main-command/src/main/java/sbt/internal/BootServerSocket.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/java/sbt/internal/ServerAlreadyBootingException.java b/main-command/src/main/java/sbt/internal/ServerAlreadyBootingException.java index 90a16fdff..b036bdea4 100644 --- a/main-command/src/main/java/sbt/internal/ServerAlreadyBootingException.java +++ b/main-command/src/main/java/sbt/internal/ServerAlreadyBootingException.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/java/sbt/internal/classpath/WrappedLoader.java b/main-command/src/main/java/sbt/internal/classpath/WrappedLoader.java index 76942d046..89749c705 100644 --- a/main-command/src/main/java/sbt/internal/classpath/WrappedLoader.java +++ b/main-command/src/main/java/sbt/internal/classpath/WrappedLoader.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/BasicCommandStrings.scala b/main-command/src/main/scala/sbt/BasicCommandStrings.scala index 7945eac96..154f43d74 100644 --- a/main-command/src/main/scala/sbt/BasicCommandStrings.scala +++ b/main-command/src/main/scala/sbt/BasicCommandStrings.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -17,6 +18,7 @@ object BasicCommandStrings { val Shutdown: String = "shutdown" val Quit: String = "quit" val TemplateCommand: String = "new" + val TemplateCommandAlias: String = "init" val Cancel: String = "cancel" /** The command name to terminate the program. */ diff --git a/main-command/src/main/scala/sbt/BasicCommands.scala b/main-command/src/main/scala/sbt/BasicCommands.scala index ec78afedf..afece5131 100644 --- a/main-command/src/main/scala/sbt/BasicCommands.scala +++ b/main-command/src/main/scala/sbt/BasicCommands.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -130,8 +131,12 @@ object BasicCommands { def runHelp(s: State, h: Help)(arg: Option[String]): State = { val (extraArgs, remainingCommands) = s.remainingCommands match { - case xs :+ exec if exec.commandLine == "shell" => (xs, exec :: Nil) - case xs => (xs, nil[Exec]) + /* + exec.commandLine.endsWith(Shell) is done to allow shells other than original shell works correctly with help command. + It's assumed here that shell name must end with "shell" suffix which is true for e.g. shell, oldshell or idea-shell (https://github.com/JetBrains/sbt-idea-shell/blob/072b10e405860feb834402563773f12976be34b9/src/main/scala/org/jetbrains/sbt/constants.scala#L7) + */ + case xs :+ exec if exec.commandLine.endsWith(Shell) => (xs, exec :: Nil) + case xs => (xs, nil[Exec]) } val topic = (arg.toList ++ extraArgs.map(_.commandLine)) match { diff --git a/main-command/src/main/scala/sbt/BasicKeys.scala b/main-command/src/main/scala/sbt/BasicKeys.scala index a3ba955b6..a7d45b82b 100644 --- a/main-command/src/main/scala/sbt/BasicKeys.scala +++ b/main-command/src/main/scala/sbt/BasicKeys.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -165,7 +166,7 @@ object BasicKeys { ) private[sbt] val detachStdio = AttributeKey[Boolean]( "detach-stdio", - "Toggles wheter or not to close system in, out and error when the server starts.", + "Toggles whether or not to close system in, out and error when the server starts.", 1000 ) } diff --git a/main-command/src/main/scala/sbt/Command.scala b/main-command/src/main/scala/sbt/Command.scala index 72deb14dd..0d811899a 100644 --- a/main-command/src/main/scala/sbt/Command.scala +++ b/main-command/src/main/scala/sbt/Command.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -183,12 +184,17 @@ object Command { } ) - def process(command: String, state: State): State = { + // overload instead of default parameter to keep binary compatibility + @deprecated("Use overload that takes the onParseError callback", since = "1.9.4") + def process(command: String, state: State): State = process(command, state, _ => ()) + + def process(command: String, state: State, onParseError: String => Unit): State = { (if (command.contains(";")) parse(command, state.combinedParser) else parse(command, state.nonMultiParser)) match { case Right(s) => s() // apply command. command side effects happen here case Left(errMsg) => state.log.error(errMsg) + onParseError(errMsg) state.fail } } diff --git a/main-command/src/main/scala/sbt/CommandUtil.scala b/main-command/src/main/scala/sbt/CommandUtil.scala index e0fc08792..6719be51b 100644 --- a/main-command/src/main/scala/sbt/CommandUtil.scala +++ b/main-command/src/main/scala/sbt/CommandUtil.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/ExceptionCategory.scala b/main-command/src/main/scala/sbt/ExceptionCategory.scala index 5fab7dd34..b1d7e10fd 100644 --- a/main-command/src/main/scala/sbt/ExceptionCategory.scala +++ b/main-command/src/main/scala/sbt/ExceptionCategory.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/Highlight.scala b/main-command/src/main/scala/sbt/Highlight.scala index 8dc05f9b1..45c1fbfec 100644 --- a/main-command/src/main/scala/sbt/Highlight.scala +++ b/main-command/src/main/scala/sbt/Highlight.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/MainControl.scala b/main-command/src/main/scala/sbt/MainControl.scala index e552dc14c..3efb41ffa 100644 --- a/main-command/src/main/scala/sbt/MainControl.scala +++ b/main-command/src/main/scala/sbt/MainControl.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/State.scala b/main-command/src/main/scala/sbt/State.scala index caafeaa61..3a1983951 100644 --- a/main-command/src/main/scala/sbt/State.scala +++ b/main-command/src/main/scala/sbt/State.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/Watched.scala b/main-command/src/main/scala/sbt/Watched.scala index 9fcf7c765..9b5f7e632 100644 --- a/main-command/src/main/scala/sbt/Watched.scala +++ b/main-command/src/main/scala/sbt/Watched.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/internal/CommandChannel.scala b/main-command/src/main/scala/sbt/internal/CommandChannel.scala index b85af5d0b..49f139a93 100644 --- a/main-command/src/main/scala/sbt/internal/CommandChannel.scala +++ b/main-command/src/main/scala/sbt/internal/CommandChannel.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/internal/ConsoleChannel.scala b/main-command/src/main/scala/sbt/internal/ConsoleChannel.scala index dac0c9565..83f21eaf8 100644 --- a/main-command/src/main/scala/sbt/internal/ConsoleChannel.scala +++ b/main-command/src/main/scala/sbt/internal/ConsoleChannel.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/internal/LabeledFunctions.scala b/main-command/src/main/scala/sbt/internal/LabeledFunctions.scala index bb196462d..b5a8949b8 100644 --- a/main-command/src/main/scala/sbt/internal/LabeledFunctions.scala +++ b/main-command/src/main/scala/sbt/internal/LabeledFunctions.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/internal/LegacyWatched.scala b/main-command/src/main/scala/sbt/internal/LegacyWatched.scala index 59eaa25e3..bb423e7f0 100644 --- a/main-command/src/main/scala/sbt/internal/LegacyWatched.scala +++ b/main-command/src/main/scala/sbt/internal/LegacyWatched.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/internal/classpath/ClassLoaderCache.scala b/main-command/src/main/scala/sbt/internal/classpath/ClassLoaderCache.scala index 098bb42a1..a46803ed1 100644 --- a/main-command/src/main/scala/sbt/internal/classpath/ClassLoaderCache.scala +++ b/main-command/src/main/scala/sbt/internal/classpath/ClassLoaderCache.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/internal/client/BspClient.scala b/main-command/src/main/scala/sbt/internal/client/BspClient.scala index 375a05f0d..7aadc4cb4 100644 --- a/main-command/src/main/scala/sbt/internal/client/BspClient.scala +++ b/main-command/src/main/scala/sbt/internal/client/BspClient.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/internal/client/NetworkClient.scala b/main-command/src/main/scala/sbt/internal/client/NetworkClient.scala index bf42a8d94..806a47f15 100644 --- a/main-command/src/main/scala/sbt/internal/client/NetworkClient.scala +++ b/main-command/src/main/scala/sbt/internal/client/NetworkClient.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/internal/client/ServerConnection.scala b/main-command/src/main/scala/sbt/internal/client/ServerConnection.scala index 777593caa..51a1a862b 100644 --- a/main-command/src/main/scala/sbt/internal/client/ServerConnection.scala +++ b/main-command/src/main/scala/sbt/internal/client/ServerConnection.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/internal/server/Server.scala b/main-command/src/main/scala/sbt/internal/server/Server.scala index 588b6eaf8..4edcf3d9f 100644 --- a/main-command/src/main/scala/sbt/internal/server/Server.scala +++ b/main-command/src/main/scala/sbt/internal/server/Server.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -187,7 +188,7 @@ private[sbt] object Server { IO.write(tokenfile, CompactPrinter(jsonToken), IO.utf8, true) } - /** Set the persmission of the file such that the only the owner can read/write it. */ + /** Set the permission of the file such that the only the owner can read/write it. */ private[this] def ownerOnly(file: File): Unit = { def acl(owner: UserPrincipal) = { val builder = AclEntry.newBuilder diff --git a/main-command/src/main/scala/sbt/internal/server/ServerHandler.scala b/main-command/src/main/scala/sbt/internal/server/ServerHandler.scala index 58ed54bb4..dc55482a1 100644 --- a/main-command/src/main/scala/sbt/internal/server/ServerHandler.scala +++ b/main-command/src/main/scala/sbt/internal/server/ServerHandler.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/internal/ui/UITask.scala b/main-command/src/main/scala/sbt/internal/ui/UITask.scala index e02a2baaf..883cab252 100644 --- a/main-command/src/main/scala/sbt/internal/ui/UITask.scala +++ b/main-command/src/main/scala/sbt/internal/ui/UITask.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/internal/ui/UserThread.scala b/main-command/src/main/scala/sbt/internal/ui/UserThread.scala index 94f239bc0..4debe3d7d 100644 --- a/main-command/src/main/scala/sbt/internal/ui/UserThread.scala +++ b/main-command/src/main/scala/sbt/internal/ui/UserThread.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/internal/util/JoinThread.scala b/main-command/src/main/scala/sbt/internal/util/JoinThread.scala index c955e9993..0acf23e0e 100644 --- a/main-command/src/main/scala/sbt/internal/util/JoinThread.scala +++ b/main-command/src/main/scala/sbt/internal/util/JoinThread.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/main/scala/sbt/internal/util/ReadJsonFromInputStream.scala b/main-command/src/main/scala/sbt/internal/util/ReadJsonFromInputStream.scala index 42bdf3022..b8114b4dc 100644 --- a/main-command/src/main/scala/sbt/internal/util/ReadJsonFromInputStream.scala +++ b/main-command/src/main/scala/sbt/internal/util/ReadJsonFromInputStream.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -32,7 +33,7 @@ private[sbt] object ReadJsonFromInputStream { */ var headerBuffer = new Array[Byte](128) def expandHeaderBuffer(): Unit = { - val newHeaderBuffer = new Array[Byte](headerBuffer.size * 2) + val newHeaderBuffer = new Array[Byte](headerBuffer.length * 2) headerBuffer.view.zipWithIndex.foreach { case (b, i) => newHeaderBuffer(i) = b } headerBuffer = newHeaderBuffer } diff --git a/main-command/src/main/scala/xsbt/IPC.scala b/main-command/src/main/scala/xsbt/IPC.scala index 9c353613d..e685bb1a6 100644 --- a/main-command/src/main/scala/xsbt/IPC.scala +++ b/main-command/src/main/scala/xsbt/IPC.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -17,6 +18,7 @@ object IPC { private val portMin = 1025 private val portMax = 65536 private val loopback = InetAddress.getByName(null) + private[xsbt] val socketBacklog = 50 // 50 is the default backlog size for the java.net.Socket def client[T](port: Int)(f: IPC => T): T = ipc(new Socket(loopback, port))(f) @@ -34,7 +36,7 @@ object IPC { def createServer(attempts: Int): ServerSocket = if (attempts > 0) { - try new ServerSocket(nextPort, 1, loopback) + try new ServerSocket(nextPort, socketBacklog, loopback) catch { case NonFatal(_) => createServer(attempts - 1) } } else sys.error("Could not connect to socket: maximum attempts exceeded") diff --git a/main-command/src/test/scala/sbt/MultiParserSpec.scala b/main-command/src/test/scala/sbt/MultiParserSpec.scala index 47da8139e..3949b3eca 100644 --- a/main-command/src/test/scala/sbt/MultiParserSpec.scala +++ b/main-command/src/test/scala/sbt/MultiParserSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-command/src/test/scala/sbt/internal/ClassLoaderCacheTest.scala b/main-command/src/test/scala/sbt/internal/ClassLoaderCacheTest.scala index 089bbd034..5a02df2f4 100644 --- a/main-command/src/test/scala/sbt/internal/ClassLoaderCacheTest.scala +++ b/main-command/src/test/scala/sbt/internal/ClassLoaderCacheTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/Append.scala b/main-settings/src/main/scala/sbt/Append.scala index b8a9fc37c..e2a17f122 100644 --- a/main-settings/src/main/scala/sbt/Append.scala +++ b/main-settings/src/main/scala/sbt/Append.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/ConfigKey.scala b/main-settings/src/main/scala/sbt/ConfigKey.scala index 09f847bc4..44e14bdb1 100644 --- a/main-settings/src/main/scala/sbt/ConfigKey.scala +++ b/main-settings/src/main/scala/sbt/ConfigKey.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/Def.scala b/main-settings/src/main/scala/sbt/Def.scala index b850011f1..6860077e7 100644 --- a/main-settings/src/main/scala/sbt/Def.scala +++ b/main-settings/src/main/scala/sbt/Def.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/DelegateIndex.scala b/main-settings/src/main/scala/sbt/DelegateIndex.scala index c6ac7d02c..ced77fc8f 100644 --- a/main-settings/src/main/scala/sbt/DelegateIndex.scala +++ b/main-settings/src/main/scala/sbt/DelegateIndex.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/InputTask.scala b/main-settings/src/main/scala/sbt/InputTask.scala index add5b859e..9009d6e64 100644 --- a/main-settings/src/main/scala/sbt/InputTask.scala +++ b/main-settings/src/main/scala/sbt/InputTask.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/KeyRanks.scala b/main-settings/src/main/scala/sbt/KeyRanks.scala index 252dd10cd..f4eb4b22f 100644 --- a/main-settings/src/main/scala/sbt/KeyRanks.scala +++ b/main-settings/src/main/scala/sbt/KeyRanks.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/Plugins.scala b/main-settings/src/main/scala/sbt/Plugins.scala index 4a210a623..c814282aa 100644 --- a/main-settings/src/main/scala/sbt/Plugins.scala +++ b/main-settings/src/main/scala/sbt/Plugins.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -218,12 +219,12 @@ object Plugins extends PluginsFunctions { case Right(results) => log.debug(s" :: deduced result: ${results}") val selectedAtoms: List[Atom] = results.ordered - val selectedPlugins = selectedAtoms map { a => + val selectedPlugins = (selectedAtoms map { a => byAtomMap.getOrElse( a, throw AutoPluginException(s"${a} was not found in atom map.") ) - } + }).sortBy(_.getClass.getName) val forbidden: Set[AutoPlugin] = (selectedPlugins flatMap { Plugins.asExclusions }).toSet val c = selectedPlugins.toSet & forbidden diff --git a/main-settings/src/main/scala/sbt/Previous.scala b/main-settings/src/main/scala/sbt/Previous.scala index 440d3d3c7..22dbba3b9 100644 --- a/main-settings/src/main/scala/sbt/Previous.scala +++ b/main-settings/src/main/scala/sbt/Previous.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/PromiseWrap.scala b/main-settings/src/main/scala/sbt/PromiseWrap.scala index fbd083857..a4073699b 100644 --- a/main-settings/src/main/scala/sbt/PromiseWrap.scala +++ b/main-settings/src/main/scala/sbt/PromiseWrap.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/Reference.scala b/main-settings/src/main/scala/sbt/Reference.scala index 28222dd52..4b9d2608a 100644 --- a/main-settings/src/main/scala/sbt/Reference.scala +++ b/main-settings/src/main/scala/sbt/Reference.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/Remove.scala b/main-settings/src/main/scala/sbt/Remove.scala index 250285225..589954803 100644 --- a/main-settings/src/main/scala/sbt/Remove.scala +++ b/main-settings/src/main/scala/sbt/Remove.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/Scope.scala b/main-settings/src/main/scala/sbt/Scope.scala index 6b643b513..6016983bc 100644 --- a/main-settings/src/main/scala/sbt/Scope.scala +++ b/main-settings/src/main/scala/sbt/Scope.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/ScopeAxis.scala b/main-settings/src/main/scala/sbt/ScopeAxis.scala index eaded5d28..099e9ddd3 100644 --- a/main-settings/src/main/scala/sbt/ScopeAxis.scala +++ b/main-settings/src/main/scala/sbt/ScopeAxis.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/ScopeMask.scala b/main-settings/src/main/scala/sbt/ScopeMask.scala index 056fdc385..5133c5f87 100644 --- a/main-settings/src/main/scala/sbt/ScopeMask.scala +++ b/main-settings/src/main/scala/sbt/ScopeMask.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/SlashSyntax.scala b/main-settings/src/main/scala/sbt/SlashSyntax.scala index 2feebc60a..5a534ccb7 100644 --- a/main-settings/src/main/scala/sbt/SlashSyntax.scala +++ b/main-settings/src/main/scala/sbt/SlashSyntax.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/Structure.scala b/main-settings/src/main/scala/sbt/Structure.scala index 5539a155c..f03f127b3 100644 --- a/main-settings/src/main/scala/sbt/Structure.scala +++ b/main-settings/src/main/scala/sbt/Structure.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/dsl/LinterLevel.scala b/main-settings/src/main/scala/sbt/dsl/LinterLevel.scala index 7fe257c82..a4a6c9066 100644 --- a/main-settings/src/main/scala/sbt/dsl/LinterLevel.scala +++ b/main-settings/src/main/scala/sbt/dsl/LinterLevel.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/std/InputConvert.scala b/main-settings/src/main/scala/sbt/std/InputConvert.scala index a02ccb133..98035c71b 100644 --- a/main-settings/src/main/scala/sbt/std/InputConvert.scala +++ b/main-settings/src/main/scala/sbt/std/InputConvert.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/std/InputWrapper.scala b/main-settings/src/main/scala/sbt/std/InputWrapper.scala index c0888c836..553807e42 100644 --- a/main-settings/src/main/scala/sbt/std/InputWrapper.scala +++ b/main-settings/src/main/scala/sbt/std/InputWrapper.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/std/KeyMacro.scala b/main-settings/src/main/scala/sbt/std/KeyMacro.scala index 500ce4c25..a2679140d 100644 --- a/main-settings/src/main/scala/sbt/std/KeyMacro.scala +++ b/main-settings/src/main/scala/sbt/std/KeyMacro.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/std/SettingMacro.scala b/main-settings/src/main/scala/sbt/std/SettingMacro.scala index 70736d30d..8577e495f 100644 --- a/main-settings/src/main/scala/sbt/std/SettingMacro.scala +++ b/main-settings/src/main/scala/sbt/std/SettingMacro.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/std/TaskLinterDSL.scala b/main-settings/src/main/scala/sbt/std/TaskLinterDSL.scala index 367a9ee4f..94fe84d9f 100644 --- a/main-settings/src/main/scala/sbt/std/TaskLinterDSL.scala +++ b/main-settings/src/main/scala/sbt/std/TaskLinterDSL.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/std/TaskMacro.scala b/main-settings/src/main/scala/sbt/std/TaskMacro.scala index f87e3cb18..08278bacf 100644 --- a/main-settings/src/main/scala/sbt/std/TaskMacro.scala +++ b/main-settings/src/main/scala/sbt/std/TaskMacro.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/main/scala/sbt/unchecked.scala b/main-settings/src/main/scala/sbt/unchecked.scala index 012d15a20..7242dbb0b 100644 --- a/main-settings/src/main/scala/sbt/unchecked.scala +++ b/main-settings/src/main/scala/sbt/unchecked.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/test/scala/sbt/AppendSpec.scala b/main-settings/src/test/scala/sbt/AppendSpec.scala index 42a8d8edd..ab4d660d6 100644 --- a/main-settings/src/test/scala/sbt/AppendSpec.scala +++ b/main-settings/src/test/scala/sbt/AppendSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/test/scala/sbt/BuildSettingsInstances.scala b/main-settings/src/test/scala/sbt/BuildSettingsInstances.scala index f1518308b..00405643b 100644 --- a/main-settings/src/test/scala/sbt/BuildSettingsInstances.scala +++ b/main-settings/src/test/scala/sbt/BuildSettingsInstances.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -53,6 +54,7 @@ object BuildSettingsInstances { ) } + @nowarn implicit def arbConfigKey: Arbitrary[ConfigKey] = Arbitrary { Gen.frequency( 2 -> const[ConfigKey](Compile), diff --git a/main-settings/src/test/scala/sbt/ScopeDisplaySpec.scala b/main-settings/src/test/scala/sbt/ScopeDisplaySpec.scala index 6f0c1ae69..ee5269d37 100644 --- a/main-settings/src/test/scala/sbt/ScopeDisplaySpec.scala +++ b/main-settings/src/test/scala/sbt/ScopeDisplaySpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/test/scala/sbt/ScopedSpec.scala b/main-settings/src/test/scala/sbt/ScopedSpec.scala index 685778463..9fe44a724 100644 --- a/main-settings/src/test/scala/sbt/ScopedSpec.scala +++ b/main-settings/src/test/scala/sbt/ScopedSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/test/scala/sbt/SlashSyntaxSpec.scala b/main-settings/src/test/scala/sbt/SlashSyntaxSpec.scala index ed7391ad8..f6816ca1d 100644 --- a/main-settings/src/test/scala/sbt/SlashSyntaxSpec.scala +++ b/main-settings/src/test/scala/sbt/SlashSyntaxSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/test/scala/sbt/SlashSyntaxTest.scala b/main-settings/src/test/scala/sbt/SlashSyntaxTest.scala index cbe3bb446..8daa451af 100644 --- a/main-settings/src/test/scala/sbt/SlashSyntaxTest.scala +++ b/main-settings/src/test/scala/sbt/SlashSyntaxTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/test/scala/sbt/TupleSyntaxTest.scala b/main-settings/src/test/scala/sbt/TupleSyntaxTest.scala index ca2acc369..ff727b92b 100644 --- a/main-settings/src/test/scala/sbt/TupleSyntaxTest.scala +++ b/main-settings/src/test/scala/sbt/TupleSyntaxTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/test/scala/sbt/std/TaskConfigSpec.scala b/main-settings/src/test/scala/sbt/std/TaskConfigSpec.scala index 223a968e7..09c311a2b 100644 --- a/main-settings/src/test/scala/sbt/std/TaskConfigSpec.scala +++ b/main-settings/src/test/scala/sbt/std/TaskConfigSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/test/scala/sbt/std/TaskPosSpec.scala b/main-settings/src/test/scala/sbt/std/TaskPosSpec.scala index c4f78fc8e..ef783dc01 100644 --- a/main-settings/src/test/scala/sbt/std/TaskPosSpec.scala +++ b/main-settings/src/test/scala/sbt/std/TaskPosSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/test/scala/sbt/std/TestUtil.scala b/main-settings/src/test/scala/sbt/std/TestUtil.scala index 041b1f861..5cac962bc 100644 --- a/main-settings/src/test/scala/sbt/std/TestUtil.scala +++ b/main-settings/src/test/scala/sbt/std/TestUtil.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/test/scala/sbt/std/UsageTest.scala b/main-settings/src/test/scala/sbt/std/UsageTest.scala index b8abbc296..4aea6ccdc 100644 --- a/main-settings/src/test/scala/sbt/std/UsageTest.scala +++ b/main-settings/src/test/scala/sbt/std/UsageTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main-settings/src/test/scala/sbt/std/neg/TaskNegSpec.scala b/main-settings/src/test/scala/sbt/std/neg/TaskNegSpec.scala index ddf4cc80a..223dc6310 100644 --- a/main-settings/src/test/scala/sbt/std/neg/TaskNegSpec.scala +++ b/main-settings/src/test/scala/sbt/std/neg/TaskNegSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/NOTICE b/main/NOTICE index 0fab58e02..09043e901 100644 --- a/main/NOTICE +++ b/main/NOTICE @@ -1,4 +1,5 @@ sbt: Main integration component -Copyright 2011 - 2017, Lightbend, Inc. +Copyright 2023, Scala center +Copyright 2011 - 2022, Lightbend, Inc. Copyright 2008 - 2010, Mark Harrah Licensed under BSD-3-Clause license (see LICENSE) diff --git a/main/src/main/java/sbt/internal/BottomClassLoader.java b/main/src/main/java/sbt/internal/BottomClassLoader.java index 58997c4db..8bd485473 100644 --- a/main/src/main/java/sbt/internal/BottomClassLoader.java +++ b/main/src/main/java/sbt/internal/BottomClassLoader.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/java/sbt/internal/ClassLoaderClose.java b/main/src/main/java/sbt/internal/ClassLoaderClose.java index 70c7cf16c..67bf6e099 100644 --- a/main/src/main/java/sbt/internal/ClassLoaderClose.java +++ b/main/src/main/java/sbt/internal/ClassLoaderClose.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/java/sbt/internal/ClassLoadingLock.java b/main/src/main/java/sbt/internal/ClassLoadingLock.java index 1c5307430..a4cf46f12 100644 --- a/main/src/main/java/sbt/internal/ClassLoadingLock.java +++ b/main/src/main/java/sbt/internal/ClassLoadingLock.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/java/sbt/internal/FlatLoader.java b/main/src/main/java/sbt/internal/FlatLoader.java index 203635412..49c6debcf 100644 --- a/main/src/main/java/sbt/internal/FlatLoader.java +++ b/main/src/main/java/sbt/internal/FlatLoader.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/java/sbt/internal/FullScalaLoader.java b/main/src/main/java/sbt/internal/FullScalaLoader.java index fd8d88236..fd9818fe3 100644 --- a/main/src/main/java/sbt/internal/FullScalaLoader.java +++ b/main/src/main/java/sbt/internal/FullScalaLoader.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/java/sbt/internal/JLineLoader.java b/main/src/main/java/sbt/internal/JLineLoader.java index 098b21bc9..0a90b0d39 100644 --- a/main/src/main/java/sbt/internal/JLineLoader.java +++ b/main/src/main/java/sbt/internal/JLineLoader.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/java/sbt/internal/LayeredClassLoader.java b/main/src/main/java/sbt/internal/LayeredClassLoader.java index 457881816..e831b720e 100644 --- a/main/src/main/java/sbt/internal/LayeredClassLoader.java +++ b/main/src/main/java/sbt/internal/LayeredClassLoader.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/java/sbt/internal/ManagedClassLoader.java b/main/src/main/java/sbt/internal/ManagedClassLoader.java index 048572fc0..76e7f570c 100644 --- a/main/src/main/java/sbt/internal/ManagedClassLoader.java +++ b/main/src/main/java/sbt/internal/ManagedClassLoader.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/java/sbt/internal/MetaBuildLoader.java b/main/src/main/java/sbt/internal/MetaBuildLoader.java index f8ce8ceea..4719131a8 100644 --- a/main/src/main/java/sbt/internal/MetaBuildLoader.java +++ b/main/src/main/java/sbt/internal/MetaBuildLoader.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/java/sbt/internal/ReverseLookupClassLoader.java b/main/src/main/java/sbt/internal/ReverseLookupClassLoader.java index c2c0d5088..29c3c0bb7 100644 --- a/main/src/main/java/sbt/internal/ReverseLookupClassLoader.java +++ b/main/src/main/java/sbt/internal/ReverseLookupClassLoader.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/java/sbt/internal/SbtInterfaceLoader.java b/main/src/main/java/sbt/internal/SbtInterfaceLoader.java index 7d8d75450..47e396205 100644 --- a/main/src/main/java/sbt/internal/SbtInterfaceLoader.java +++ b/main/src/main/java/sbt/internal/SbtInterfaceLoader.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/java/sbt/internal/ScalaLibraryClassLoader.java b/main/src/main/java/sbt/internal/ScalaLibraryClassLoader.java index 6fe4403a6..80c0ea759 100644 --- a/main/src/main/java/sbt/internal/ScalaLibraryClassLoader.java +++ b/main/src/main/java/sbt/internal/ScalaLibraryClassLoader.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/java/sbt/internal/ScalaReflectClassLoader.java b/main/src/main/java/sbt/internal/ScalaReflectClassLoader.java index b8a3fff17..f0fe19cbd 100644 --- a/main/src/main/java/sbt/internal/ScalaReflectClassLoader.java +++ b/main/src/main/java/sbt/internal/ScalaReflectClassLoader.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/java/sbt/internal/XMainClassLoader.java b/main/src/main/java/sbt/internal/XMainClassLoader.java index 2668a5db7..d6cab932b 100644 --- a/main/src/main/java/sbt/internal/XMainClassLoader.java +++ b/main/src/main/java/sbt/internal/XMainClassLoader.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/java/sbt/internal/XMainConfiguration.java b/main/src/main/java/sbt/internal/XMainConfiguration.java index 674d39008..c547e6610 100644 --- a/main/src/main/java/sbt/internal/XMainConfiguration.java +++ b/main/src/main/java/sbt/internal/XMainConfiguration.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -13,6 +14,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.MalformedURLException; +import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.nio.file.Paths; @@ -30,7 +32,8 @@ public class XMainConfiguration { throws Throwable { try { boolean isScripted = Boolean.parseBoolean(System.getProperty("sbt.scripted")); - // in batch scripted tests, we disable caching of JAR URL connections to avoid interference + // in batch scripted tests, we disable caching of JAR URL connections to avoid + // interference // between tests if (isScripted) disableCachingOfURLConnections(); ClassLoader topLoader = configuration.provider().scalaProvider().launcher().topLoader(); @@ -79,9 +82,10 @@ public class XMainConfiguration { URL url = baseLoader.getResource(className); String path = url.toString().replaceAll(className.concat("$"), ""); URL[] urlArray = new URL[1]; - urlArray[0] = new URL(path); + urlArray[0] = new URI(path).toURL(); ClassLoader topLoader = configuration.provider().scalaProvider().launcher().topLoader(); - // This loader doesn't have the scala library in it so it's critical that none of the code + // This loader doesn't have the scala library in it so it's critical that none + // of the code // in this file use the scala library. ClassLoader modifiedLoader = new XMainClassLoader(urlArray, topLoader); Class xMainConfigurationClass = @@ -129,8 +133,9 @@ public class XMainConfiguration { } /* - * Replaces the AppProvider.loader method with a new loader that puts the sbt test interface - * jar ahead of the rest of the sbt classpath in the classloading hierarchy. + * Replaces the AppProvider.loader method with a new loader that puts the sbt + * test interface jar ahead of the rest of the sbt classpath in the classloading + * hierarchy. */ public class ModifiedConfiguration implements xsbti.AppConfiguration { private xsbti.AppConfiguration configuration; diff --git a/main/src/main/resources/MUnitSuite.scala.txt b/main/src/main/resources/MUnitSuite.scala.txt new file mode 100644 index 000000000..26c55ab0e --- /dev/null +++ b/main/src/main/resources/MUnitSuite.scala.txt @@ -0,0 +1,8 @@ +package example + +class ExampleSuite extends munit.FunSuite: + + test("addition") { + assert(1 + 1 == 2) + } +end ExampleSuite diff --git a/main/src/main/resources/ScalaMain.scala.txt b/main/src/main/resources/ScalaMain.scala.txt new file mode 100644 index 000000000..248e0407b --- /dev/null +++ b/main/src/main/resources/ScalaMain.scala.txt @@ -0,0 +1,4 @@ +package example + +@main def main(args: String*): Unit = + println(s"Hello ${args.mkString}") diff --git a/main/src/main/resources/TypelevelExampleSuite.scala.txt b/main/src/main/resources/TypelevelExampleSuite.scala.txt new file mode 100644 index 000000000..0575b6be7 --- /dev/null +++ b/main/src/main/resources/TypelevelExampleSuite.scala.txt @@ -0,0 +1,15 @@ +package example + +import cats.effect.* +import munit.CatsEffectSuite + +class ExampleSuite extends CatsEffectSuite: + + test("tests can return IO[Unit] with assertions expressed via a map") { + IO(42).map(it => assertEquals(it, 42)) + } + + test("alternatively, assertions can be written via assertIO") { + assertIO(IO(42), 42) + } +end ExampleSuite diff --git a/main/src/main/resources/TypelevelMain.scala.txt b/main/src/main/resources/TypelevelMain.scala.txt new file mode 100644 index 000000000..8f9624bd9 --- /dev/null +++ b/main/src/main/resources/TypelevelMain.scala.txt @@ -0,0 +1,6 @@ +package example + +import cats.effect.* + +object Hello extends IOApp.Simple: + def run = IO.println("Hello toolkit!") diff --git a/main/src/main/scala/sbt/BackgroundJobService.scala b/main/src/main/scala/sbt/BackgroundJobService.scala index 937b421c2..a9189d334 100644 --- a/main/src/main/scala/sbt/BackgroundJobService.scala +++ b/main/src/main/scala/sbt/BackgroundJobService.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/BuildPaths.scala b/main/src/main/scala/sbt/BuildPaths.scala index 87bfb7173..e6a97985b 100644 --- a/main/src/main/scala/sbt/BuildPaths.scala +++ b/main/src/main/scala/sbt/BuildPaths.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/BuildSyntax.scala b/main/src/main/scala/sbt/BuildSyntax.scala index 4595b0121..4226d358f 100644 --- a/main/src/main/scala/sbt/BuildSyntax.scala +++ b/main/src/main/scala/sbt/BuildSyntax.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/ClassLoaderLayeringStrategy.scala b/main/src/main/scala/sbt/ClassLoaderLayeringStrategy.scala index cfb360fc4..c1e1f7584 100644 --- a/main/src/main/scala/sbt/ClassLoaderLayeringStrategy.scala +++ b/main/src/main/scala/sbt/ClassLoaderLayeringStrategy.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/CommandLineUIService.scala b/main/src/main/scala/sbt/CommandLineUIService.scala index 39c3db302..790146980 100644 --- a/main/src/main/scala/sbt/CommandLineUIService.scala +++ b/main/src/main/scala/sbt/CommandLineUIService.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/Cross.scala b/main/src/main/scala/sbt/Cross.scala index d794ee7a1..63e6ef590 100644 --- a/main/src/main/scala/sbt/Cross.scala +++ b/main/src/main/scala/sbt/Cross.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -118,12 +119,13 @@ object Cross { )(command: String): (Seq[ProjectRef], String) = { import extracted._ import DefaultParsers._ - val parser = (OpOrID <~ charClass(_ == '/', "/")) ~ any.* map { case seg1 ~ cmd => - (seg1, cmd.mkString) - } + val parser = ((('{' ~> URIClass <~ '}').? ~ OpOrID <~ charClass(_ == '/', "/")) ~ any.*.string) + .map { case uri ~ seg1 ~ cmd => (uri, seg1, cmd) } Parser.parse(command, parser) match { - case Right((seg1, cmd)) => - structure.allProjectRefs.find(_.project == seg1) match { + case Right((uri, seg1, cmd)) => + structure.allProjectRefs.find(p => + uri.contains(p.build.toString) && seg1 == p.project + ) match { case Some(proj) => (Seq(proj), cmd) case _ => (resolveAggregates(extracted), command) } @@ -185,12 +187,13 @@ object Cross { .flatMap { case (v, keys) => val projects = keys.flatMap(project) keys.toSeq.flatMap { k => - project(k).filter(projects.contains).flatMap { p => + project(k).withFilter(projects.contains).flatMap { p => if (p == extracted.currentRef || !projects.contains(extracted.currentRef)) { val parts = - project(k).map(_.project) ++ k.scope.config.toOption.map { case ConfigKey(n) => - s"${n.head.toUpper}${n.tail}" - } ++ k.scope.task.toOption.map(_.label) ++ Some(k.key.label) + project(k).map(p => s"{${p.build}}${p.project}") ++ + k.scope.config.toOption.map(c => c.name.capitalize) ++ + k.scope.task.toOption.map(_.label) ++ + Some(k.key.label) Some(v -> parts.mkString("", "/", fullArgs)) } else None } @@ -258,7 +261,7 @@ object Cross { val (aggs, aggCommand) = parseSlashCommand(Project.extract(state))(rawCmd) aggs .intersect(affectedRefs) - .map({ case ProjectRef(_, proj) => s"$proj/$aggCommand" }) + .map(p => s"{${p.build}}${p.project}/$aggCommand") .mkString("all ", " ", "") } } diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 05b5110a0..a741fa37c 100644 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -215,6 +216,7 @@ object Defaults extends BuildCommon { autoCompilerPlugins :== true, scalaHome :== None, apiURL := None, + releaseNotesURL := None, javaHome :== None, discoveredJavaHomes := CrossJava.discoverJavaHomes, javaHomes :== ListMap.empty, @@ -310,6 +312,9 @@ object Defaults extends BuildCommon { csrLogger := LMCoursier.coursierLoggerTask.value, csrMavenProfiles :== Set.empty, csrReconciliations :== LMCoursier.relaxedForAllModules, + csrSameVersions := Seq( + ScalaArtifacts.Artifacts.map(a => InclExclRule(scalaOrganization.value, a)).toSet + ), csrCacheDirectory := { if (useCoursier.value) LMCoursier.defaultCacheLocation else Classpaths.dummyCoursierDirectory(appConfiguration.value) @@ -384,6 +389,7 @@ object Defaults extends BuildCommon { val rs = EvaluateTask.taskTimingProgress.toVector ++ EvaluateTask.taskTraceEvent.toVector rs map { Keys.TaskProgress(_) } }, + commandProgress := Seq(), // progressState is deprecated SettingKey[Option[ProgressState]]("progressState") := None, Previous.cache := new Previous( @@ -405,6 +411,8 @@ object Defaults extends BuildCommon { fork :== false, initialize :== {}, templateResolverInfos :== Nil, + templateDescriptions :== TemplateCommandUtil.defaultTemplateDescriptions, + templateRunLocal := templateRunLocalInputTask(runLocalTemplate).evaluated, forcegc :== sys.props .get("sbt.task.forcegc") .map(java.lang.Boolean.parseBoolean) @@ -727,7 +735,8 @@ object Defaults extends BuildCommon { scalaCompilerBridgeBinaryJar := Def.settingDyn { val sv = scalaVersion.value val managed = managedScalaInstance.value - if (ScalaArtifacts.isScala3(sv) && managed) fetchBridgeBinaryJarTask(sv) + val hasSbtBridge = ScalaArtifacts.isScala3(sv) || ZincLmUtil.hasScala2SbtBridge(sv) + if (hasSbtBridge && managed) fetchBridgeBinaryJarTask(sv) else Def.task[Option[File]](None) }.value, scalaCompilerBridgeSource := ZincLmUtil.getDefaultBridgeSourceModule(scalaVersion.value), @@ -739,13 +748,17 @@ object Defaults extends BuildCommon { consoleProject / scalaCompilerBridgeSource := ZincLmUtil.getDefaultBridgeSourceModule( appConfiguration.value.provider.scalaProvider.version ), + classpathOptions := ClasspathOptionsUtil.noboot(scalaVersion.value), + console / classpathOptions := ClasspathOptionsUtil.replNoboot(scalaVersion.value), ) // must be a val: duplication detected by object identity private[this] lazy val compileBaseGlobal: Seq[Setting[_]] = globalDefaults( Seq( auxiliaryClassFiles :== Nil, incOptions := IncOptions.of(), + // TODO: Kept for old Dotty plugin. Remove on sbt 2.x classpathOptions :== ClasspathOptionsUtil.boot, + // TODO: Kept for old Dotty plugin. Remove on sbt 2.x console / classpathOptions :== ClasspathOptionsUtil.repl, compileOrder :== CompileOrder.Mixed, javacOptions :== Nil, @@ -881,7 +894,12 @@ object Defaults extends BuildCommon { } def defaultCompileSettings: Seq[Setting[_]] = - globalDefaults(enableBinaryCompileAnalysis := true) + globalDefaults( + Seq( + enableBinaryCompileAnalysis :== true, + enableConsistentCompileAnalysis :== SysProp.analysis2024, + ) + ) lazy val configTasks: Seq[Setting[_]] = docTaskSettings(doc) ++ inTask(compile)(compileInputsSettings) ++ @@ -965,16 +983,21 @@ object Defaults extends BuildCommon { compileAnalysisTargetRoot.value / compileAnalysisFilename.value }, externalHooks := IncOptions.defaultExternal, + zincCompilationListeners := Seq.empty, incOptions := { val old = incOptions.value + val extHooks = externalHooks.value + val newExtHooks = extHooks.withInvalidationProfiler(() => + new DefaultRunProfiler(zincCompilationListeners.value) + ) old .withAuxiliaryClassFiles(auxiliaryClassFiles.value.toArray) - .withExternalHooks(externalHooks.value) + .withExternalHooks(newExtHooks) .withClassfileManagerType( Option( TransactionalManagerType .of( // https://github.com/sbt/sbt/issues/1673 - target.value / s"${prefix(configuration.value.name)}classes.bak", + crossTarget.value / s"${prefix(configuration.value.name)}classes.bak", streams.value.log ): ClassFileManagerType ).toOptional @@ -1172,10 +1195,52 @@ object Defaults extends BuildCommon { val sv = scalaVersion.value val fullReport = update.value - val toolReport = fullReport - .configuration(Configurations.ScalaTool) - .getOrElse(sys.error(noToolConfiguration(managedScalaInstance.value))) + // For Scala 3, update scala-library.jar in `scala-tool` and `scala-doc-tool` in case a newer version + // is present in the `compile` configuration. This is needed once forwards binary compatibility is dropped + // to avoid NoSuchMethod exceptions when expanding macros. + def updateLibraryToCompileConfiguration(report: ConfigurationReport) = + if (!ScalaArtifacts.isScala3(sv)) report + else + (for { + compileConf <- fullReport.configuration(Configurations.Compile) + compileLibMod <- compileConf.modules.find(_.module.name == ScalaArtifacts.LibraryID) + reportLibMod <- report.modules.find(_.module.name == ScalaArtifacts.LibraryID) + if VersionNumber(reportLibMod.module.revision) + .matchesSemVer(SemanticSelector(s"<${compileLibMod.module.revision}")) + } yield { + val newMods = report.modules + .filterNot(_.module.name == ScalaArtifacts.LibraryID) :+ compileLibMod + report.withModules(newMods) + }).getOrElse(report) + val toolReport = updateLibraryToCompileConfiguration( + fullReport + .configuration(Configurations.ScalaTool) + .getOrElse(sys.error(noToolConfiguration(managedScalaInstance.value))) + ) + + if (Classpaths.isScala213(sv)) { + for { + compileReport <- fullReport.configuration(Configurations.Compile) + libName <- ScalaArtifacts.Artifacts + } { + for (lib <- compileReport.modules.find(_.module.name == libName)) { + val libVer = lib.module.revision + val n = name.value + if (VersionNumber(sv).matchesSemVer(SemanticSelector(s"<$libVer"))) + sys.error( + s"""expected `$n/scalaVersion` to be "$libVer" or later, + |but found "$sv"; upgrade scalaVersion to fix the build. + | + |to support backwards-only binary compatibility (SIP-51), + |the Scala 2.13 compiler cannot be older than $libName on the + |dependency classpath. + |see `$n/evicted` to know why $libName $libVer is getting pulled in. + |""".stripMargin + ) + } + } + } def file(id: String): File = { val files = for { m <- toolReport.modules if m.module.name.startsWith(id) @@ -1188,6 +1253,7 @@ object Defaults extends BuildCommon { val allDocJars = fullReport .configuration(Configurations.ScalaDocTool) + .map(updateLibraryToCompileConfiguration) .toSeq .flatMap(_.modules) .flatMap(_.artifacts.map(_._2)) @@ -1253,10 +1319,7 @@ object Defaults extends BuildCommon { private[this] def testDefaults = Defaults.globalDefaults( Seq( - testFrameworks :== { - import sbt.TestFrameworks._ - Seq(ScalaCheck, Specs2, Specs, ScalaTest, JUnit, MUnit, ZIOTest) - }, + testFrameworks :== sbt.TestFrameworks.All, testListeners :== Nil, testOptions :== Nil, testResultLogger :== TestResultLogger.Default, @@ -2672,7 +2735,12 @@ object Defaults extends BuildCommon { ) }, bspCompileTask := - BspCompileTask.start(bspTargetIdentifier.value, thisProjectRef.value, configuration.value) + BspCompileTask.start( + bspTargetIdentifier.value, + thisProjectRef.value, + configuration.value, + compileInputs.value + ) ) } @@ -2755,7 +2823,8 @@ object Defaults extends BuildCommon { val cacheStore = factory.make("copy-resource") val converter = fileConverter.value val flt: File => Option[File] = flat(t) - val transform: File => Option[File] = (f: File) => rebase(dirs, t)(f).orElse(flt(f)) + val transform: File => Option[File] = + (f: File) => rebase(resourceDirectories.value.sorted, t)(f).orElse(flt(f)) val mappings: Seq[(File, File)] = resources.value.flatMap { case r if !dirs(r) => transform(r).map(r -> _) case _ => None @@ -2817,6 +2886,11 @@ object Defaults extends BuildCommon { lazy val testSettings: Seq[Setting[_]] = configSettings ++ testTasks + @nowarn + @deprecated( + "Create a separate subproject instead of using IntegrationTest and in addition avoid using itSettings", + "1.9.0" + ) lazy val itSettings: Seq[Setting[_]] = inConfig(IntegrationTest) { testSettings } @@ -2835,6 +2909,8 @@ object Defaults extends BuildCommon { if (turbo.value) ClassLoaderLayeringStrategy.AllLibraryJars else ClassLoaderLayeringStrategy.ScalaLibrary }, + publishLocal / skip := (publish / skip).value, + publishM2 / skip := (publish / skip).value ) // build.sbt is treated a Scala source of metabuild, so to enable deprecation flag on build.sbt we set the option here. lazy val deprecationSettings: Seq[Setting[_]] = @@ -2855,6 +2931,19 @@ object Defaults extends BuildCommon { if (useCoursier.value) CoursierDependencyResolution(csrConfiguration.value) else IvyDependencyResolution(ivyConfiguration.value) } + + def templateRunLocalInputTask( + runLocal: (Seq[String], Logger) => Unit + ): Initialize[InputTask[Unit]] = + Def.inputTask { + import Def._ + val s = streams.value + val args = spaceDelimited().parsed + runLocal(args, s.log) + } + + def runLocalTemplate(arguments: Seq[String], log: Logger): Unit = + TemplateCommandUtil.defaultRunLocalTemplate(arguments.toList, log) } object Classpaths { @@ -3061,16 +3150,83 @@ object Classpaths { Defaults.globalDefaults( Seq( publishMavenStyle :== true, + sbtPluginPublishLegacyMavenStyle := true, publishArtifact :== true, (Test / publishArtifact) :== false ) ) + private lazy val publishSbtPluginMavenStyle = Def.task(sbtPlugin.value && publishMavenStyle.value) + private lazy val packagedDefaultArtifacts = packaged(defaultArtifactTasks) + private lazy val emptyArtifacts = Def.task(Map.empty[Artifact, HashedVirtualFileRef]) + val jvmPublishSettings: Seq[Setting[_]] = Seq( artifacts := artifactDefs(defaultArtifactTasks).value, - packagedArtifacts := packaged(defaultArtifactTasks).value + packagedArtifacts := Def + .ifS(publishSbtPluginMavenStyle)(mavenArtifactsOfSbtPlugin)(packagedDefaultArtifacts) + .value, + // publishLocal needs legacy artifacts (see https://github.com/sbt/sbt/issues/7285) + publishLocal / packagedArtifacts ++= { + if (sbtPlugin.value && !sbtPluginPublishLegacyMavenStyle.value) { + packagedDefaultArtifacts.value + } else Map.empty[Artifact, HashedVirtualFileRef] + } ) ++ RemoteCache.projectSettings + /** + * Produces the Maven-compatible artifacts of an sbt plugin. + * It adds the sbt-cross version suffix into the artifact names, and it generates a + * valid POM file, that is a POM file that Maven can resolve. + */ + private def mavenArtifactsOfSbtPlugin: Def.Initialize[Task[Map[Artifact, HashedVirtualFileRef]]] = + Def.task { + val crossVersion = sbtCrossVersion.value + val legacyArtifact = (makePom / artifact).value + val converter = fileConverter.value + val pom = converter.toVirtualFile(makeMavenPomOfSbtPlugin.value.toPath) + val legacyPackages = packaged(defaultPackages).value + def addSuffix(a: Artifact): Artifact = a.withName(crossVersion(a.name)) + def copyArtifact( + artifact: Artifact, + fileRef: HashedVirtualFileRef + ): (Artifact, HashedVirtualFileRef) = { + val nameWithSuffix = crossVersion(artifact.name) + val file = converter.toPath(fileRef).toFile + val targetFile = + new File(file.getParentFile, file.name.replace(artifact.name, nameWithSuffix)) + IO.copyFile(file, targetFile) + artifact.withName(nameWithSuffix) -> converter.toVirtualFile(targetFile.toPath) + } + val packages = legacyPackages.map { case (artifact, file) => copyArtifact(artifact, file) } + val legacyPackagedArtifacts = Def + .ifS(sbtPluginPublishLegacyMavenStyle.toTask)(packagedDefaultArtifacts)(emptyArtifacts) + .value + packages + (addSuffix(legacyArtifact) -> pom) ++ legacyPackagedArtifacts + } + + private def sbtCrossVersion: Def.Initialize[String => String] = Def.setting { + val sbtV = (pluginCrossBuild / sbtBinaryVersion).value + val scalaV = scalaBinaryVersion.value + name => name + s"_${scalaV}_$sbtV" + } + + /** + * Generates a POM file that Maven can resolve. + * It appends the sbt cross version into all artifactIds of sbt plugins + * (the main one and the dependencies). + */ + private def makeMavenPomOfSbtPlugin: Def.Initialize[Task[File]] = Def.task { + val config = makePomConfiguration.value + val nameWithCross = sbtCrossVersion.value(artifact.value.name) + val version = Keys.version.value + val pomFile = config.file.get.getParentFile / s"$nameWithCross-$version.pom" + val publisher = Keys.publisher.value + val ivySbt = Keys.ivySbt.value + val module = new ivySbt.Module(moduleSettings.value, appendSbtCrossVersion = true) + publisher.makePomFile(module, config.withFile(pomFile), streams.value.log) + pomFile + } + val ivyPublishSettings: Seq[Setting[_]] = publishGlobalDefaults ++ Seq( artifacts :== Nil, packagedArtifacts :== Map.empty, @@ -3085,9 +3241,9 @@ object Classpaths { deliver := deliverTask(makeIvyXmlConfiguration).value, deliverLocal := deliverTask(makeIvyXmlLocalConfiguration).value, makeIvyXml := deliverTask(makeIvyXmlConfiguration).value, - publish := publishTask(publishConfiguration).value, - publishLocal := publishTask(publishLocalConfiguration).value, - publishM2 := publishTask(publishM2Configuration).value + publish := publishOrSkip(publishConfiguration, publish / skip).value, + publishLocal := publishOrSkip(publishLocalConfiguration, publishLocal / skip).value, + publishM2 := publishOrSkip(publishM2Configuration, publishM2 / skip).value ) private[this] def baseGlobalDefaults = @@ -3622,7 +3778,12 @@ object Classpaths { p1.extra(SbtPomExtraProperties.VERSION_SCHEME_KEY -> x) case _ => p1 } - p2 + val p3 = releaseNotesURL.value match { + case Some(u) => + p2.extra(SbtPomExtraProperties.POM_RELEASE_NOTES_KEY -> u.toExternalForm) + case _ => p2 + } + p3 } def pluginProjectID: Initialize[ModuleID] = Def.setting { @@ -3837,17 +3998,36 @@ object Classpaths { ): Initialize[Task[Unit]] = publishTask(config) - def publishTask(config: TaskKey[PublishConfiguration]): Initialize[Task[Unit]] = - Def.taskIf { - if ((publish / skip).value) { - val s = streams.value - val ref = thisProjectRef.value - s.log.debug(s"Skipping publish* for ${ref.project}") - } else { - val s = streams.value - IvyActions.publish(ivyModule.value, config.value, s.log) + private def logSkipPublish(log: Logger, ref: ProjectRef): Unit = + log.debug(s"Skipping publish* for ${ref.project}") + + @deprecated("use publishOrSkip instead", "1.9.1") + def publishTask(config: TaskKey[PublishConfiguration]): Initialize[Task[Unit]] = { + val skipKey = + if (config.key == publishLocalConfiguration.key) publishLocal / skip + else publish / skip + publishOrSkip(config, skipKey) + } + + def publishOrSkip( + config: TaskKey[PublishConfiguration], + skip: TaskKey[Boolean] + ): Initialize[Task[Unit]] = + Def + .taskIf { + if (skip.value) { + val log = streams.value.log + val ref = thisProjectRef.value + logSkipPublish(log, ref) + } else { + val conf = config.value + val log = streams.value.log + val module = ivyModule.value + val publisherInterface = publisher.value + publisherInterface.publish(module, conf, log) + } } - } tag (Tags.Publish, Tags.Network) + .tag(Tags.Publish, Tags.Network) def withExcludes(out: File, classifiers: Seq[String], lock: xsbti.GlobalLock)( f: Map[ModuleID, Vector[ConfigRef]] => UpdateReport @@ -4184,6 +4364,8 @@ object Classpaths { def deliverPattern(outputPath: File): String = (outputPath / "[artifact]-[revision](-[classifier]).[ext]").absolutePath + private[sbt] def isScala213(sv: String) = sv.startsWith("2.13.") + private[sbt] def isScala2Scala3Sandwich(sbv1: String, sbv2: String): Boolean = { def compare(a: String, b: String): Boolean = a == "2.13" && (b.startsWith("0.") || b.startsWith("3")) @@ -4488,7 +4670,7 @@ object Classpaths { if (module.organization == scalaOrg) { val jarName = module.name + ".jar" val replaceWith = scalaJars(module.revision).toVector - .filter(_.getName == jarName) + .withFilter(_.getName == jarName) .map(f => (Artifact(f.getName.stripSuffix(".jar")), f)) if (replaceWith.isEmpty) arts else replaceWith } else arts diff --git a/main/src/main/scala/sbt/EvaluateTask.scala b/main/src/main/scala/sbt/EvaluateTask.scala index 06e5b9105..3e1dabea6 100644 --- a/main/src/main/scala/sbt/EvaluateTask.scala +++ b/main/src/main/scala/sbt/EvaluateTask.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -148,6 +149,7 @@ final case class PluginData( resolvers: Option[Vector[Resolver]], report: Option[UpdateReport], scalacOptions: Seq[String], + javacOptions: Seq[String], unmanagedSourceDirectories: Seq[File], unmanagedSources: Seq[File], managedSourceDirectories: Seq[File], @@ -160,7 +162,7 @@ final case class PluginData( object PluginData { private[sbt] def apply(dependencyClasspath: Def.Classpath, converter: FileConverter): PluginData = - PluginData(dependencyClasspath, Nil, None, None, Nil, Nil, Nil, Nil, Nil, None, converter) + PluginData(dependencyClasspath, Nil, None, None, Nil, Nil, Nil, Nil, Nil, Nil, None, converter) } object EvaluateTask { @@ -263,12 +265,15 @@ object EvaluateTask { extracted: Extracted, structure: BuildStructure, state: State - ): ExecuteProgress = { + ): ExecuteProgress2 = { state - .get(currentTaskProgress) - .map { tp => - new ExecuteProgress { - val progress = tp.progress + .get(currentCommandProgress) + .map { progress => + new ExecuteProgress2 { + override def beforeCommand(cmd: String, state: State): Unit = + progress.beforeCommand(cmd, state) + override def afterCommand(cmd: String, result: Either[Throwable, State]): Unit = + progress.afterCommand(cmd, result) override def initial(): Unit = progress.initial() override def afterRegistered( task: TaskId[?], @@ -284,7 +289,9 @@ object EvaluateTask { progress.afterCompleted(task, result) override def afterAllCompleted(results: RMap[TaskId, Result]): Unit = progress.afterAllCompleted(results) - override def stop(): Unit = {} + override def stop(): Unit = { + // TODO: this is not a typo, but a questionable decision in 6559c3a0 that is probably obsolete + } } } .getOrElse { @@ -298,11 +305,12 @@ object EvaluateTask { (if (SysProp.taskTimings) new TaskTimings(reportOnShutdown = false, state.globalLogging.full) :: Nil else Nil) - reporters match { - case xs if xs.isEmpty => ExecuteProgress.empty - case xs if xs.size == 1 => xs.head - case xs => ExecuteProgress.aggregate(xs) - } + val cmdProgress = getSetting(Keys.commandProgress, Seq(), extracted, structure) + ExecuteProgress2.aggregate(reporters match { + case xs if xs.isEmpty => cmdProgress + case xs if xs.size == 1 => cmdProgress :+ new ExecuteProgressAdapter(xs.head) + case xs => cmdProgress :+ new ExecuteProgressAdapter(ExecuteProgress.aggregate(xs)) + }) } } // TODO - Should this pull from Global or from the project itself? diff --git a/main/src/main/scala/sbt/ExecuteProgress2.scala b/main/src/main/scala/sbt/ExecuteProgress2.scala new file mode 100644 index 000000000..fff7c95e5 --- /dev/null +++ b/main/src/main/scala/sbt/ExecuteProgress2.scala @@ -0,0 +1,85 @@ +/* + * sbt + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. + * Copyright 2008 - 2010, Mark Harrah + * Licensed under Apache License 2.0 (see LICENSE) + */ + +package sbt +import sbt.internal.util.RMap + +/** + * Tracks command execution progress. In addition to ExecuteProgress, this interface + * adds command start and end events, and gives access to the sbt.State at the beginning + * and end of each command. + * + * Command progress callbacks are wrapping task progress callbacks. That is, the `beforeCommand` + * callback will be called before the `initial` callback from ExecuteProgress, and the + * `afterCommand` callback will be called after the `stop` callback from ExecuteProgress. + */ +trait ExecuteProgress2 extends ExecuteProgress { + + /** + * Called before a command starts processing. The command has not yet been parsed. + * + * @param cmd The command string + * @param state The sbt.State before the command starts executing. + */ + def beforeCommand(cmd: String, state: State): Unit + + /** + * Called after a command finished execution. + * + * @param cmd The command string. + * @param result Left in case of an error. If the command cannot be parsed, it will be + * signalled as a ParseException with a detailed message. If the command + * was cancelled by the user, as sbt.Cancelled. If the command succeeded, + * Right with the new state after command execution. + */ + def afterCommand(cmd: String, result: Either[Throwable, State]): Unit +} + +class ExecuteProgressAdapter(ep: ExecuteProgress) extends ExecuteProgress2 { + override def beforeCommand(cmd: String, state: State): Unit = {} + override def afterCommand(cmd: String, result: Either[Throwable, State]): Unit = {} + override def initial(): Unit = ep.initial() + override def afterRegistered( + task: TaskId[_], + allDeps: Iterable[TaskId[_]], + pendingDeps: Iterable[TaskId[_]] + ): Unit = ep.afterRegistered(task, allDeps, pendingDeps) + override def afterReady(task: TaskId[_]): Unit = ep.afterReady(task) + override def beforeWork(task: TaskId[_]): Unit = ep.beforeWork(task) + override def afterWork[A](task: TaskId[A], result: Either[TaskId[A], Result[A]]): Unit = + ep.afterWork(task, result) + override def afterCompleted[A](task: TaskId[A], result: Result[A]): Unit = + ep.afterCompleted(task, result) + override def afterAllCompleted(results: RMap[TaskId, Result]): Unit = + ep.afterAllCompleted(results) + override def stop(): Unit = ep.stop() +} + +object ExecuteProgress2 { + def aggregate(xs: Seq[ExecuteProgress2]): ExecuteProgress2 = new ExecuteProgress2 { + override def beforeCommand(cmd: String, state: State): Unit = + xs.foreach(_.beforeCommand(cmd, state)) + override def afterCommand(cmd: String, result: Either[Throwable, State]): Unit = + xs.foreach(_.afterCommand(cmd, result)) + override def initial(): Unit = xs.foreach(_.initial()) + override def afterRegistered( + task: TaskId[_], + allDeps: Iterable[TaskId[_]], + pendingDeps: Iterable[TaskId[_]] + ): Unit = xs.foreach(_.afterRegistered(task, allDeps, pendingDeps)) + override def afterReady(task: TaskId[_]): Unit = xs.foreach(_.afterReady(task)) + override def beforeWork(task: TaskId[_]): Unit = xs.foreach(_.beforeWork(task)) + override def afterWork[A](task: TaskId[A], result: Either[TaskId[A], Result[A]]): Unit = + xs.foreach(_.afterWork(task, result)) + override def afterCompleted[A](task: TaskId[A], result: Result[A]): Unit = + xs.foreach(_.afterCompleted(task, result)) + override def afterAllCompleted(results: RMap[TaskId, Result]): Unit = + xs.foreach(_.afterAllCompleted(results)) + override def stop(): Unit = xs.foreach(_.stop()) + } +} diff --git a/main/src/main/scala/sbt/Extracted.scala b/main/src/main/scala/sbt/Extracted.scala index 94ed0d042..8a8512f73 100644 --- a/main/src/main/scala/sbt/Extracted.scala +++ b/main/src/main/scala/sbt/Extracted.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -46,7 +47,7 @@ final case class Extracted( structure.data.get(inCurrent(key.scope), key.key) @nowarn - private[this] def inCurrent[T](scope: Scope): Scope = + private[this] def inCurrent(scope: Scope): Scope = if (scope.project == This) scope in currentRef else scope /** diff --git a/main/src/main/scala/sbt/InteractionService.scala b/main/src/main/scala/sbt/InteractionService.scala index 6a37d4ff2..61edd7a34 100644 --- a/main/src/main/scala/sbt/InteractionService.scala +++ b/main/src/main/scala/sbt/InteractionService.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -8,7 +9,7 @@ package sbt /** - * InteractionService provides an abstration over standard input. + * InteractionService provides an abstraction over standard input. * In the future this could be used to ask for inputs from * other forms of sbt clients such as thin clients and IDEs. */ diff --git a/main/src/main/scala/sbt/Keys.scala b/main/src/main/scala/sbt/Keys.scala index 284519576..e2b885c70 100644 --- a/main/src/main/scala/sbt/Keys.scala +++ b/main/src/main/scala/sbt/Keys.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -232,7 +233,8 @@ object Keys { val scalaCompilerBridgeSource = settingKey[ModuleID]("Configures the module ID of the sources of the compiler bridge when scalaCompilerBridgeBinaryJar is None").withRank(CSetting) val scalaCompilerBridgeScope = taskKey[Unit]("The compiler bridge scope.").withRank(DTask) val scalaArtifacts = settingKey[Seq[String]]("Configures the list of artifacts which should match the Scala binary version").withRank(CSetting) - val enableBinaryCompileAnalysis = settingKey[Boolean]("Writes the analysis file in binary format") + val enableBinaryCompileAnalysis = settingKey[Boolean]("Writes the analysis file in binary format").withRank(DSetting) + val enableConsistentCompileAnalysis = settingKey[Boolean]("Writes the analysis file in consistent binary format").withRank(DSetting) val crossJavaVersions = settingKey[Seq[String]]("The java versions used during JDK cross testing").withRank(BPlusSetting) val semanticdbEnabled = settingKey[Boolean]("Enables SemanticDB Scalac plugin").withRank(CSetting) val semanticdbCompilerPlugin = settingKey[ModuleID]("SemanticDB Scalac plugin").withRank(CSetting) @@ -281,6 +283,7 @@ object Keys { val aggregate = settingKey[Boolean]("Configures task aggregation.").withRank(BMinusSetting) val sourcePositionMappers = taskKey[Seq[xsbti.Position => Option[xsbti.Position]]]("Maps positions in generated source files to the original source it was generated from").withRank(DTask) private[sbt] val externalHooks = taskKey[ExternalHooks]("The external hooks used by zinc.") + val zincCompilationListeners = settingKey[Seq[RunProfiler]]("Listeners that receive information about incremental compiler decisions.").withRank(DSetting) val auxiliaryClassFiles = taskKey[Seq[AuxiliaryClassFiles]]("The auxiliary class files that must be managed by Zinc (for instance the TASTy files)") @cacheLevel(include = Array.empty) val fileConverter = SettingKey(BasicKeys.fileConverter) @@ -379,6 +382,7 @@ object Keys { val entryApiURL = StringAttributeKey("entryApiURL") // , "Base URL for the API documentation for a classpath entry.") val apiMappings = taskKey[Map[HashedVirtualFileRef, URL]]("Mappings from classpath entry to API documentation base URL.").withRank(BMinusSetting) val autoAPIMappings = settingKey[Boolean]("If true, automatically manages mappings to the API doc URL.").withRank(BMinusSetting) + val releaseNotesURL = settingKey[Option[URL]]("URL for release notes.").withRank(BMinusSetting) val scmInfo = settingKey[Option[ScmInfo]]("Basic SCM information for the project.").withRank(BMinusSetting) val projectInfo = settingKey[ModuleInfo]("Addition project information like formal name, homepage, licenses etc.").withRank(CSetting) val defaultConfiguration = settingKey[Option[Configuration]]("Defines the configuration used when none is specified for a dependency in ivyXML.").withRank(CSetting) @@ -426,7 +430,7 @@ object Keys { val remoteCachePom = taskKey[HashedVirtualFileRef]("Generates a pom for publishing when publishing Maven-style.") val localCacheDirectory = settingKey[File]("Operating system specific cache directory.") val usePipelining = settingKey[Boolean]("Use subproject pipelining for compilation.").withRank(BSetting) - val exportPipelining = settingKey[Boolean]("Product early output so downstream subprojects can do pipelining.").withRank(BSetting) + val exportPipelining = settingKey[Boolean]("Produce early output so downstream subprojects can do pipelining.").withRank(BSetting) // BSP keys val bspConfig = taskKey[Unit]("Create or update the BSP connection files").withRank(DSetting) @@ -456,14 +460,16 @@ object Keys { val bspBuildTargetCleanCache = inputKey[Unit]("Corresponds to buildTarget/cleanCache request").withRank(DTask) val bspBuildTargetScalacOptions = inputKey[Unit]("").withRank(DTask) val bspBuildTargetScalacOptionsItem = taskKey[ScalacOptionsItem]("").withRank(DTask) + val bspBuildTargetJavacOptions = inputKey[Unit]("Implementation of buildTarget/javacOptions").withRank(DTask) + val bspBuildTargetJavacOptionsItem = taskKey[JavacOptionsItem]("Item of buildTarget/javacOptions").withRank(DTask) - val bspBuildTargetJVMRunEnvironment = inputKey[Unit]("Corresponds to the buildTarget/jvmRunEnvironment request").withRank(DTask) - val bspBuildTargetJVMTestEnvironment = inputKey[Unit]("Corresponds to the buildTarget/jvmTestEnvironment request").withRank(DTask) + val bspBuildTargetJVMRunEnvironment = inputKey[Unit]("Implementation of buildTarget/jvmRunEnvironment").withRank(DTask) + val bspBuildTargetJVMTestEnvironment = inputKey[Unit]("Implementation of buildTarget/jvmTestEnvironment").withRank(DTask) val bspBuildTargetJvmEnvironmentItem = taskKey[JvmEnvironmentItem]("Computes JVM environment item").withRank(DTask) - - val bspScalaTestClasses = inputKey[Unit]("Corresponds to buildTarget/scalaTestClasses request").withRank(DTask) + + val bspScalaTestClasses = inputKey[Unit]("Implementation of buildTarget/scalaTestClasses").withRank(DTask) val bspScalaTestClassesItem = taskKey[Seq[ScalaTestClassesItem]]("").withRank(DTask) - val bspScalaMainClasses = inputKey[Unit]("Corresponds to buildTarget/scalaMainClasses request").withRank(DTask) + val bspScalaMainClasses = inputKey[Unit]("Implementation of buildTarget/scalaMainClasses").withRank(DTask) val bspScalaMainClassesItem = taskKey[ScalaMainClassesItem]("").withRank(DTask) @cacheLevel(include = Array.empty) @@ -484,6 +490,7 @@ object Keys { val csrExtraCredentials = taskKey[Seq[lmcoursier.credentials.Credentials]]("") val csrPublications = taskKey[Seq[(lmcoursier.definitions.Configuration, lmcoursier.definitions.Publication)]]("") val csrReconciliations = settingKey[Seq[(ModuleMatchers, Reconciliation)]]("Strategy to reconcile version conflicts.") + val csrSameVersions = settingKey[Seq[Set[InclExclRule]]]("Modules to keep at the same version.") val internalConfigurationMap = settingKey[Configuration => Configuration]("Maps configurations to the actual configuration used to define the classpath.").withRank(CSetting) val classpathConfiguration = taskKey[Configuration]("The configuration used to define the classpath.").withRank(CTask) @@ -527,6 +534,7 @@ object Keys { val makeIvyXmlLocalConfiguration = taskKey[PublishConfiguration]("Configuration for generating ivy.xml.").withRank(DSetting) val packagedArtifacts = taskKey[Map[Artifact, HashedVirtualFileRef]]("Packages all artifacts for publishing and maps the Artifact definition to the generated file.").withRank(CTask) val publishMavenStyle = settingKey[Boolean]("Configures whether to generate and publish a pom (true) or Ivy file (false).").withRank(BSetting) + val sbtPluginPublishLegacyMavenStyle = settingKey[Boolean]("Configuration for generating the legacy pom of sbt plugins, to publish to Maven").withRank(CSetting) val credentials = taskKey[Seq[Credentials]]("The credentials to use for updating and publishing.").withRank(BMinusTask) val allCredentials = taskKey[Seq[Credentials]]("Aggregated credentials across current and root subprojects. Do not rewire this task.").withRank(DTask) @@ -605,8 +613,10 @@ object Keys { val sbtDependency = settingKey[ModuleID]("Provides a definition for declaring the current version of sbt.").withRank(BMinusSetting) val sbtVersion = settingKey[String]("Provides the version of sbt. This setting should not be modified.").withRank(AMinusSetting) val sbtBinaryVersion = settingKey[String]("Defines the binary compatibility version substring.").withRank(BPlusSetting) - val skip = taskKey[Boolean]("For tasks that support it (currently only 'compile', 'update', and 'publish'), setting skip to true will force the task to not to do its work. This exact semantics may vary by task.").withRank(BSetting) + val skip = taskKey[Boolean]("For tasks that support it (currently only 'compile', 'update', 'publish' and 'publishLocal'), setting skip to true will force the task to not to do its work. The exact semantics may vary depending on the task.").withRank(BSetting) val templateResolverInfos = settingKey[Seq[TemplateResolverInfo]]("Template resolvers used for 'new'.").withRank(BSetting) + val templateDescriptions = settingKey[Seq[(String, String)]]("List of templates with description used for 'new' / 'init'.") + val templateRunLocal = inputKey[Unit]("Runs a local template.").withRank(DTask) val interactionService = taskKey[InteractionService]("Service used to ask for user input through the current user interface(s).").withRank(CTask) val insideCI = SettingKey[Boolean]("insideCI", "Determines if the sbt is running in a Continuous Integration environment", AMinusSetting) @@ -633,7 +643,7 @@ object Keys { object TaskProgress { def apply(progress: ExecuteProgress): TaskProgress = new TaskProgress(progress) } - private[sbt] val currentTaskProgress = AttributeKey[TaskProgress]("current-task-progress") + private[sbt] val currentCommandProgress = AttributeKey[ExecuteProgress2]("current-command-progress") private[sbt] val taskProgress = AttributeKey[sbt.internal.TaskProgress]("active-task-progress") val useSuperShell = settingKey[Boolean]("Enables (true) or disables the super shell.") val superShellMaxTasks = settingKey[Int]("The max number of tasks to display in the supershell progress report") @@ -647,6 +657,7 @@ object Keys { private[sbt] val postProgressReports = settingKey[Unit]("Internally used to modify logger.").withRank(DTask) @deprecated("No longer used", "1.3.0") private[sbt] val executeProgress = settingKey[State => TaskProgress]("Experimental task execution listener.").withRank(DTask) + val commandProgress = settingKey[Seq[ExecuteProgress2]]("Command progress listeners receive events when commands start and end, in addition to task progress events.") val lintUnused = inputKey[Unit]("Check for keys unused by other settings and tasks.") val lintIncludeFilter = settingKey[String => Boolean]("Filters key names that should be included in the lint check.") val lintExcludeFilter = settingKey[String => Boolean]("Filters key names that should be excluded in the lint check.") diff --git a/main/src/main/scala/sbt/Main.scala b/main/src/main/scala/sbt/Main.scala index cc77cc3ca..31b1c49d5 100644 --- a/main/src/main/scala/sbt/Main.scala +++ b/main/src/main/scala/sbt/Main.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -76,7 +77,7 @@ private[sbt] object xMain: .filterNot(_ == DashDashServer) val isClient: String => Boolean = cmd => (cmd == JavaClient) || (cmd == DashDashClient) val isBsp: String => Boolean = cmd => (cmd == "-bsp") || (cmd == "--bsp") - val isNew: String => Boolean = cmd => (cmd == "new") + val isNew: String => Boolean = cmd => (cmd == "new") || (cmd == "init") lazy val isServer = !userCommands.exists(c => isBsp(c) || isClient(c)) // keep this lazy to prevent project directory created prematurely lazy val bootServerSocket = if (isServer) getSocketOrExit(configuration) match { @@ -113,8 +114,11 @@ private[sbt] object xMain: .initialState( rebasedConfig, Seq(defaults, early), - runEarly(DefaultsCommand) :: runEarly(InitCommand) :: BootCommand :: Nil + runEarly(DefaultsCommand) :: runEarly("error") :: runEarly( + InitCommand + ) :: BootCommand :: Nil ) + .put(BasicKeys.detachStdio, detachStdio) StandardMain.runManaged(state) } case _ if clientModByEnv || userCommands.exists(isClient) => @@ -293,7 +297,7 @@ object StandardMain { import sbt.BasicCommandStrings._ import sbt.BasicCommands._ import sbt.CommandUtil._ -import sbt.TemplateCommandUtil.templateCommand +import sbt.TemplateCommandUtil.{ templateCommandAlias, templateCommand } import sbt.internal.CommandStrings._ import sbt.internal.util.complete.DefaultParsers._ @@ -315,6 +319,7 @@ object BuiltinCommands { settingsCommand, loadProject, templateCommand, + templateCommandAlias, projects, project, set, @@ -479,7 +484,7 @@ object BuiltinCommands { )(s: State): Parser[(Int, Option[String])] = verbosityParser ~ selectedParser(s, keepKeys).? def selectedParser(s: State, keepKeys: AttributeKey[_] => Boolean): Parser[String] = - singleArgument(allTaskAndSettingKeys(s).filter(keepKeys).map(_.label).toSet) + singleArgument(allTaskAndSettingKeys(s).withFilter(keepKeys).map(_.label).toSet) def verbosityParser: Parser[Int] = success(1) | ((Space ~ "-") ~> ( 'v'.id.+.map(_.size + 1) | diff --git a/main/src/main/scala/sbt/MainLoop.scala b/main/src/main/scala/sbt/MainLoop.scala index 6d0947a19..fac42e605 100644 --- a/main/src/main/scala/sbt/MainLoop.scala +++ b/main/src/main/scala/sbt/MainLoop.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -12,7 +13,13 @@ import sbt.ProjectExtra.extract import sbt.internal.langserver.ErrorCodes import sbt.internal.nio.CheckBuildSources.CheckBuildSourcesKey import sbt.internal.protocol.JsonRpcResponseError -import sbt.internal.util.{ ErrorHandling, GlobalLogBacking, Prompt, Terminal => ITerminal } +import sbt.internal.util.{ + AttributeKey, + ErrorHandling, + GlobalLogBacking, + Prompt, + Terminal => ITerminal +} import sbt.internal.{ FastTrackCommands, ShutdownHooks, SysProp, TaskProgress } import sbt.io.{ IO, Using } import sbt.protocol._ @@ -25,6 +32,8 @@ import scala.annotation.tailrec import scala.concurrent.duration._ import scala.util.control.NonFatal +import java.text.ParseException + object MainLoop { /** Entry point to run the remaining commands in State with managed global logging. */ @@ -208,16 +217,25 @@ object MainLoop { ) try { def process(): State = { - val progressState = state.get(sbt.Keys.currentTaskProgress) match { - case Some(_) => state - case _ => - if (state.get(Keys.stateBuildStructure).isDefined) { - val extracted = Project.extract(state) - val progress = EvaluateTask.executeProgress(extracted, extracted.structure, state) - state.put(sbt.Keys.currentTaskProgress, new Keys.TaskProgress(progress)) - } else state + def getOrSet[T](state: State, key: AttributeKey[T], value: Extracted => T): State = { + state.get(key) match { + case Some(_) => state + case _ => + if (state.get(Keys.stateBuildStructure).isDefined) { + val extracted = Project.extract(state) + state.put(key, value(extracted)) + } else state + } } - exchange.setState(progressState) + + val cmdProgressState = + getOrSet( + state, + sbt.Keys.currentCommandProgress, + extracted => EvaluateTask.executeProgress(extracted, extracted.structure, state) + ) + + exchange.setState(cmdProgressState) exchange.setExec(Some(exec)) val (restoreTerminal, termState) = channelName.flatMap(exchange.channelForName) match { case Some(c) => @@ -227,9 +245,13 @@ object MainLoop { (() => { ITerminal.set(prevTerminal) c.terminal.flush() - }) -> progressState.put(Keys.terminalKey, Terminal(c.terminal)) - case _ => (() => ()) -> progressState.put(Keys.terminalKey, Terminal(ITerminal.get)) + }) -> cmdProgressState.put(Keys.terminalKey, Terminal(c.terminal)) + case _ => (() => ()) -> cmdProgressState.put(Keys.terminalKey, Terminal(ITerminal.get)) } + + val currentCmdProgress = + cmdProgressState.get(sbt.Keys.currentCommandProgress) + currentCmdProgress.foreach(_.beforeCommand(exec.commandLine, cmdProgressState)) /* * FastTrackCommands.evaluate can be significantly faster than Command.process because * it avoids an expensive parsing step for internal commands that are easy to parse. @@ -238,16 +260,29 @@ object MainLoop { */ val newState = try { - FastTrackCommands + var errorMsg: Option[String] = None + val res = FastTrackCommands .evaluate(termState, exec.commandLine) - .getOrElse(Command.process(exec.commandLine, termState)) + .getOrElse(Command.process(exec.commandLine, termState, m => errorMsg = Some(m))) + errorMsg match { + case Some(msg) => + currentCmdProgress.foreach( + _.afterCommand(exec.commandLine, Left(new ParseException(msg, 0))) + ) + case None => currentCmdProgress.foreach(_.afterCommand(exec.commandLine, Right(res))) + } + res } catch { case _: RejectedExecutionException => - // No stack trace since this is just to notify the user which command they cancelled - object Cancelled extends Throwable(exec.commandLine, null, true, false) { - override def toString: String = s"Cancelled: ${exec.commandLine}" - } - throw Cancelled + val cancelled = new Cancelled(exec.commandLine) + currentCmdProgress + .foreach(_.afterCommand(exec.commandLine, Left(cancelled))) + throw cancelled + + case e: Throwable => + currentCmdProgress + .foreach(_.afterCommand(exec.commandLine, Left(e))) + throw e } finally { // Flush the terminal output after command evaluation to ensure that all output // is displayed in the thin client before we report the command status. Also @@ -268,8 +303,10 @@ object MainLoop { exchange.respondStatus(doneEvent) } exchange.setExec(None) - newState.get(sbt.Keys.currentTaskProgress).foreach(_.progress.stop()) - newState.remove(sbt.Keys.currentTaskProgress).remove(Keys.terminalKey) + newState.get(sbt.Keys.currentCommandProgress).foreach(_.stop()) + newState + .remove(Keys.terminalKey) + .remove(Keys.currentCommandProgress) } state.get(CheckBuildSourcesKey) match { case Some(cbs) => @@ -342,3 +379,8 @@ object MainLoop { ExitCode(ErrorCodes.UnknownError) } else ExitCode.Success } + +// No stack trace since this is just to notify the user which command they cancelled +class Cancelled(cmdLine: String) extends Throwable(cmdLine, null, true, false) { + override def toString: String = s"Cancelled: $cmdLine" +} diff --git a/main/src/main/scala/sbt/OptionSyntax.scala b/main/src/main/scala/sbt/OptionSyntax.scala index 5716eba36..eac941392 100644 --- a/main/src/main/scala/sbt/OptionSyntax.scala +++ b/main/src/main/scala/sbt/OptionSyntax.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/Opts.scala b/main/src/main/scala/sbt/Opts.scala index 86ebf1f20..57b0fc3d6 100644 --- a/main/src/main/scala/sbt/Opts.scala +++ b/main/src/main/scala/sbt/Opts.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/PluginCross.scala b/main/src/main/scala/sbt/PluginCross.scala index 82b65f7b0..cf23826c9 100644 --- a/main/src/main/scala/sbt/PluginCross.scala +++ b/main/src/main/scala/sbt/PluginCross.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -97,7 +98,7 @@ private[sbt] object PluginCross { VersionNumber(sv) match { case VersionNumber(Seq(0, 12, _*), _, _) => "2.9.2" case VersionNumber(Seq(0, 13, _*), _, _) => "2.10.7" - case VersionNumber(Seq(1, 0, _*), _, _) => "2.12.17" + case VersionNumber(Seq(1, 0, _*), _, _) => "2.12.19" case _ => sys.error(s"Unsupported sbt binary version: $sv") } } diff --git a/main/src/main/scala/sbt/RemoteCache.scala b/main/src/main/scala/sbt/RemoteCache.scala index 371d6cdef..14bc67ccd 100644 --- a/main/src/main/scala/sbt/RemoteCache.scala +++ b/main/src/main/scala/sbt/RemoteCache.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/Resolvers.scala b/main/src/main/scala/sbt/Resolvers.scala index 4bee75e27..e4b6d7356 100644 --- a/main/src/main/scala/sbt/Resolvers.scala +++ b/main/src/main/scala/sbt/Resolvers.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/RichURI.scala b/main/src/main/scala/sbt/RichURI.scala index bf8954f9d..d3260744c 100644 --- a/main/src/main/scala/sbt/RichURI.scala +++ b/main/src/main/scala/sbt/RichURI.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/ScopeFilter.scala b/main/src/main/scala/sbt/ScopeFilter.scala index 19ea3b0b5..700b0e8e4 100644 --- a/main/src/main/scala/sbt/ScopeFilter.scala +++ b/main/src/main/scala/sbt/ScopeFilter.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -74,7 +75,7 @@ object ScopeFilter { def all(sfilter: => ScopeFilter): Initialize[Seq[A]] = Def.flatMap(getData) { data => data.allScopes.toSeq - .filter(sfilter(data)) + .withFilter(sfilter(data)) .map(s => Project.inScope(s, i)) .join } @@ -90,7 +91,7 @@ object ScopeFilter { Def.flatMap(getData) { data => import std.TaskExtra._ data.allScopes.toSeq - .filter(sfilter(data)) + .withFilter(sfilter(data)) .map(s => Project.inScope(s, i)) .join(_.join) } diff --git a/main/src/main/scala/sbt/ScopedKeyData.scala b/main/src/main/scala/sbt/ScopedKeyData.scala index c17701c9d..3cfbf3750 100644 --- a/main/src/main/scala/sbt/ScopedKeyData.scala +++ b/main/src/main/scala/sbt/ScopedKeyData.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/ScriptedPlugin.scala b/main/src/main/scala/sbt/ScriptedPlugin.scala index 916244558..fcbfb98e0 100644 --- a/main/src/main/scala/sbt/ScriptedPlugin.scala +++ b/main/src/main/scala/sbt/ScriptedPlugin.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -35,7 +36,7 @@ object ScriptedPlugin extends AutoPlugin { val ScriptedConf = Configurations.config("scripted-sbt").hide val ScriptedLaunchConf = Configurations.config("scripted-sbt-launch").hide - val scriptedSbt = settingKey[String]("") + val scriptedSbt = settingKey[String]("sbt version that is used when running scripted tests") val sbtLauncher = taskKey[File]("") val sbtTestDirectory = settingKey[File]("") val scriptedBufferLog = settingKey[Boolean]("") diff --git a/main/src/main/scala/sbt/ScriptedRun.scala b/main/src/main/scala/sbt/ScriptedRun.scala index 32313c4e7..d08467e49 100644 --- a/main/src/main/scala/sbt/ScriptedRun.scala +++ b/main/src/main/scala/sbt/ScriptedRun.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/SessionVar.scala b/main/src/main/scala/sbt/SessionVar.scala index a92f94fe2..f745130c8 100644 --- a/main/src/main/scala/sbt/SessionVar.scala +++ b/main/src/main/scala/sbt/SessionVar.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/StateTransform.scala b/main/src/main/scala/sbt/StateTransform.scala index 1b577ea62..af4b76c68 100644 --- a/main/src/main/scala/sbt/StateTransform.scala +++ b/main/src/main/scala/sbt/StateTransform.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/Tags.scala b/main/src/main/scala/sbt/Tags.scala index 8f22d39ea..fc63cde86 100644 --- a/main/src/main/scala/sbt/Tags.scala +++ b/main/src/main/scala/sbt/Tags.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/TemplateCommandUtil.scala b/main/src/main/scala/sbt/TemplateCommandUtil.scala index da1bdcbaf..7fbb69ef1 100644 --- a/main/src/main/scala/sbt/TemplateCommandUtil.scala +++ b/main/src/main/scala/sbt/TemplateCommandUtil.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -11,10 +12,10 @@ import java.lang.reflect.InvocationTargetException import java.nio.file.Path import java.io.File -import sbt.BasicCommandStrings.TerminateAction import sbt.SlashSyntax0._ import sbt.io._, syntax._ import sbt.util._ +import sbt.internal.util.{ ConsoleAppender, Terminal => ITerminal } import sbt.internal.util.complete.{ DefaultParsers, Parser }, DefaultParsers._ import xsbti.AppConfiguration import sbt.librarymanagement._ @@ -24,8 +25,10 @@ import BasicCommandStrings._, BasicKeys._ import sbt.ProjectExtra.* private[sbt] object TemplateCommandUtil { - def templateCommand: Command = - Command(TemplateCommand, templateBrief, templateDetailed)(_ => templateCommandParser)( + def templateCommand: Command = templateCommand0(TemplateCommand) + def templateCommandAlias: Command = templateCommand0("init") + private def templateCommand0(command: String): Command = + Command(command, templateBrief, templateDetailed)(_ => templateCommandParser)( runTemplate ) @@ -40,13 +43,28 @@ private[sbt] object TemplateCommandUtil { val extracted = (Project extract s0) val (s1, ivyConf) = extracted.runTask(Keys.ivyConfiguration, s0) val scalaModuleInfo = extracted.get(Keys.updateSbtClassifiers / Keys.scalaModuleInfo) - val arguments = inputArg.toList ++ + val templateDescriptions = extracted.get(Keys.templateDescriptions) + val args0 = inputArg.toList ++ (s0.remainingCommands match { case exec :: Nil if exec.commandLine == "shell" => Nil case xs => xs map (_.commandLine) }) - run(infos, arguments, s0.configuration, ivyConf, globalBase, scalaModuleInfo, log) - TerminateAction :: s1.copy(remainingCommands = Nil) + def terminate = TerminateAction :: s1.copy(remainingCommands = Nil) + def reload = "reboot" :: s1.copy(remainingCommands = Nil) + if (args0.nonEmpty) { + run(infos, args0, s0.configuration, ivyConf, globalBase, scalaModuleInfo, log) + terminate + } else { + fortifyArgs(templateDescriptions.toList) match { + case Nil => terminate + case arg :: Nil if arg.endsWith(".local") => + extracted.runInputTask(Keys.templateRunLocal, " " + arg, s0) + reload + case args => + run(infos, args, s0.configuration, ivyConf, globalBase, scalaModuleInfo, log) + terminate + } + } } private def run( @@ -144,4 +162,200 @@ private[sbt] object TemplateCommandUtil { xs.map(_.toPath) } } + + private final val ScalaToolkitSlug = "scala/toolkit.local" + private final val TypelevelToolkitSlug = "typelevel/toolkit.local" + private final val SbtCrossPlatformSlug = "sbt/cross-platform.local" + private lazy val term: ITerminal = ITerminal.get + private lazy val isAnsiSupported = term.isAnsiSupported + private lazy val nonMoveLetters = ('a' to 'z').toList diff List('h', 'j', 'k', 'l', 'q') + private[sbt] lazy val defaultTemplateDescriptions = List( + ScalaToolkitSlug -> "Scala Toolkit (beta) by Scala Center and VirtusLab", + TypelevelToolkitSlug -> "Toolkit to start building Typelevel apps", + SbtCrossPlatformSlug -> "A cross-JVM/JS/Native project", + "scala/scala3.g8" -> "Scala 3 seed template", + "scala/scala-seed.g8" -> "Scala 2 seed template", + "playframework/play-scala-seed.g8" -> "A Play project in Scala", + "playframework/play-java-seed.g8" -> "A Play project in Java", + "softwaremill/tapir.g8" -> "A tapir project using Netty", + "scala-js/vite.g8" -> "A Scala.JS + Vite project", + "holdenk/sparkProjectTemplate.g8" -> "A Scala Spark project", + "spotify/scio.g8" -> "A Scio project", + "disneystreaming/smithy4s.g8" -> "A Smithy4s project", + ) + private def fortifyArgs(templates: List[(String, String)]): List[String] = + if (System.console eq null) Nil + else + ITerminal.withStreams(true, false) { + assert(templates.size <= 20, "template list cannot have more than 20 items") + val mappingList = templates.zipWithIndex.map { case (v, idx) => + toLetter(idx) -> v + } + val out = term.printStream + out.println("") + out.println("Welcome to sbt new!") + out.println("Here are some templates to get started:") + val ans = askTemplate(mappingList, 0) + val mappings = Map(mappingList: _*) + mappings.get(ans).map(_._1).toList + } + + private def toLetter(idx: Int): String = + nonMoveLetters(idx).toString + + private def askTemplate(mappingList: List[(String, (String, String))], focus: Int): String = { + val msg = "Select a template" + displayMappings(mappingList, focus) + val focusValue = toLetter(focus) + if (!isAnsiSupported) ask(msg, focusValue) + else { + val out = term.printStream + out.print(s"$msg: ") + val ans0 = term.readArrow + def printThenReturn(ans: String): String = { + out.println(ans) // this is necessary to move the cursor + out.flush() + ans + } + ans0 match { + case '\r' | '\n' => printThenReturn(focusValue) + case 'q' | 'Q' | -1 => printThenReturn("") + case 'j' | 'J' | ITerminal.VK_DOWN => + clearMenu(mappingList) + askTemplate(mappingList, math.min(focus + 1, mappingList.size - 1)) + case 'k' | 'K' | ITerminal.VK_UP => + clearMenu(mappingList) + askTemplate(mappingList, math.max(focus - 1, 0)) + case c if nonMoveLetters.contains(c.toChar) => + printThenReturn(c.toChar.toString) + case _ => + clearMenu(mappingList) + askTemplate(mappingList, focus) + } + } + } + + private def clearMenu(mappingList: List[(String, (String, String))]): Unit = { + val out = term.printStream + out.print(ConsoleAppender.CursorLeft1000) + out.print(ConsoleAppender.cursorUp(mappingList.size + 1)) + } + + private def displayMappings(mappingList: List[(String, (String, String))], focus: Int): Unit = { + import scala.Console.{ RESET, REVERSED } + val out = term.printStream + mappingList.zipWithIndex.foreach { case ((k, (slug, desc)), idx) => + if (idx == focus && isAnsiSupported) { + out.print(REVERSED) + } + out.print(s" $k) ${slug.padTo(33, ' ')} - $desc") + if (idx == focus && isAnsiSupported) { + out.print(RESET) + } + out.println() + } + out.println(" q) quit") + out.flush() + } + + private def ask(question: String, default: String): String = { + System.out.print(s"$question (default: $default): ") + val ans0 = System.console.readLine() + if (ans0 == "") default + else ans0 + } + + // This is used by Defaults.runLocalTemplate, which implements + // templateRunLocal input task. + private[sbt] def defaultRunLocalTemplate( + arguments: List[String], + log: Logger + ): Unit = + arguments match { + case ScalaToolkitSlug :: Nil => scalaToolkitTemplate() + case TypelevelToolkitSlug :: Nil => typelevelToolkitTemplate() + case SbtCrossPlatformSlug :: Nil => sbtCrossPlatformTemplate() + case _ => + System.err.println("Local template not found for: " + arguments.mkString(" ")) + } + + private final val defaultScalaV = "3.3.0" + private def scalaToolkitTemplate(): Unit = { + val defaultScalaToolkitV = "0.2.0" + val scalaV = ask("Scala version", defaultScalaV) + val toolkitV = ask("Scala Toolkit version", defaultScalaToolkitV) + val content = s""" +val toolkitV = "$toolkitV" +val toolkit = "org.scala-lang" %% "toolkit" % toolkitV +val toolkitTest = "org.scala-lang" %% "toolkit-test" % toolkitV + +ThisBuild / scalaVersion := "$scalaV" +libraryDependencies += toolkit +libraryDependencies += (toolkitTest % Test) +""" + IO.write(new File("build.sbt"), content) + copyResource("ScalaMain.scala.txt", new File("src/main/scala/example/Main.scala")) + copyResource("MUnitSuite.scala.txt", new File("src/test/scala/example/ExampleSuite.scala")) + } + + private def typelevelToolkitTemplate(): Unit = { + val defaultTypelevelToolkitV = "0.1.3" + val scalaV = ask("Scala version", defaultScalaV) + val toolkitV = ask("Typelevel Toolkit version", defaultTypelevelToolkitV) + val content = s""" +val toolkitV = "$toolkitV" +val toolkit = "org.typelevel" %% "toolkit" % toolkitV +val toolkitTest = "org.typelevel" %% "toolkit-test" % toolkitV + +ThisBuild / scalaVersion := "$scalaV" +libraryDependencies += toolkit +libraryDependencies += (toolkitTest % Test) +""" + IO.write(new File("build.sbt"), content) + copyResource("TypelevelMain.scala.txt", new File("src/main/scala/example/Main.scala")) + copyResource( + "TypelevelExampleSuite.scala.txt", + new File("src/test/scala/example/ExampleSuite.scala") + ) + } + + private def sbtCrossPlatformTemplate(): Unit = { + val scalaV = ask("Scala version", defaultScalaV) + val content = s""" +ThisBuild / scalaVersion := "$scalaV" + +lazy val core = (projectMatrix in file("core")) + .settings( + name := "core", + ) + .jvmPlatform(scalaVersions = Seq("$scalaV")) + .jsPlatform(scalaVersions = Seq("$scalaV")) + .nativePlatform(scalaVersions = Seq("$scalaV")) +""" + IO.write(new File("build.sbt"), content) + + val pluginsContent = """ +addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.0") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.10.1") +addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.10") +""" + IO.write(new File("project/plugins.sbt"), pluginsContent) + copyResource("ScalaMain.scala.txt", new File("core/src/main/scala/example/Main.scala")) + } + + private def copyResource(resourcePath: String, out: File): Unit = { + if (out.exists()) { + sys.error(s"the file $out already exists!") + } + if (!out.getParentFile().exists()) { + IO.createDirectory(out.getParentFile()) + } + val is = getClass.getClassLoader().getResourceAsStream(resourcePath) + require(is ne null, s"Couldn't load '$resourcePath' from classpath.") + try { + IO.transfer(is, out) + } finally { + is.close() + } + } } diff --git a/main/src/main/scala/sbt/Terminal.scala b/main/src/main/scala/sbt/Terminal.scala index 6b0f8698b..751a9367a 100644 --- a/main/src/main/scala/sbt/Terminal.scala +++ b/main/src/main/scala/sbt/Terminal.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/UpperStateOps.scala b/main/src/main/scala/sbt/UpperStateOps.scala index 773544e4e..0ca038eda 100644 --- a/main/src/main/scala/sbt/UpperStateOps.scala +++ b/main/src/main/scala/sbt/UpperStateOps.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/VersionScheme.scala b/main/src/main/scala/sbt/VersionScheme.scala index 4427f7798..58e84adba 100644 --- a/main/src/main/scala/sbt/VersionScheme.scala +++ b/main/src/main/scala/sbt/VersionScheme.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/coursierint/CoursierArtifactsTasks.scala b/main/src/main/scala/sbt/coursierint/CoursierArtifactsTasks.scala index e7e13b095..144462d0b 100644 --- a/main/src/main/scala/sbt/coursierint/CoursierArtifactsTasks.scala +++ b/main/src/main/scala/sbt/coursierint/CoursierArtifactsTasks.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -125,7 +126,8 @@ object CoursierArtifactsTasks { // it puts it in all of them. See for example what happens to // the standalone JAR artifact of the coursier cli module. def allConfigsIfEmpty(configs: Iterable[ConfigRef]): Iterable[ConfigRef] = - if (configs.isEmpty) ivyConfs.filter(_.isPublic).map(c => ConfigRef(c.name)) else configs + if (configs.isEmpty) ivyConfs.withFilter(_.isPublic).map(c => ConfigRef(c.name)) + else configs val extraSbtArtifactsPublication = for { artifact <- extraSbtArtifacts diff --git a/main/src/main/scala/sbt/coursierint/CoursierInputsTasks.scala b/main/src/main/scala/sbt/coursierint/CoursierInputsTasks.scala index 4e2a1de25..ac79c66d9 100644 --- a/main/src/main/scala/sbt/coursierint/CoursierInputsTasks.scala +++ b/main/src/main/scala/sbt/coursierint/CoursierInputsTasks.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -46,6 +47,7 @@ object CoursierInputsTasks { sv: String, sbv: String, auOpt: Option[URL], + rnOpt: Option[URL], description: String, homepage: Option[URL], vsOpt: Option[String], @@ -73,8 +75,15 @@ object CoursierInputsTasks { proj1.withProperties(proj1.properties :+ (SbtPomExtraProperties.VERSION_SCHEME_KEY -> vs)) case _ => proj1 } - proj2.withInfo( - proj2.info.withDescription(description).withHomePage(homepage.fold("")(_.toString)) + val proj3 = rnOpt match { + case Some(rn) => + proj2.withProperties( + proj2.properties :+ (SbtPomExtraProperties.POM_RELEASE_NOTES_KEY -> rn.toString) + ) + case _ => proj2 + } + proj3.withInfo( + proj3.info.withDescription(description).withHomePage(homepage.fold("")(_.toString)) ) } @@ -87,6 +96,7 @@ object CoursierInputsTasks { scalaVersion.value, scalaBinaryVersion.value, apiURL.value, + releaseNotesURL.value, description.value, homepage.value, versionScheme.value, diff --git a/main/src/main/scala/sbt/coursierint/CoursierRepositoriesTasks.scala b/main/src/main/scala/sbt/coursierint/CoursierRepositoriesTasks.scala index 359cc0b80..2d05d53c9 100644 --- a/main/src/main/scala/sbt/coursierint/CoursierRepositoriesTasks.scala +++ b/main/src/main/scala/sbt/coursierint/CoursierRepositoriesTasks.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -69,7 +70,7 @@ object CoursierRepositoriesTasks { val result2 = paths.ivyHome match { case Some(ivyHome) => - val ivyHomeUri = ivyHome + val ivyHomeUri = ivyHome.toString result1 map { case r: FileRepository => val ivyPatterns = r.patterns.ivyPatterns map { diff --git a/main/src/main/scala/sbt/coursierint/LMCoursier.scala b/main/src/main/scala/sbt/coursierint/LMCoursier.scala index 565919dbb..0838b90aa 100644 --- a/main/src/main/scala/sbt/coursierint/LMCoursier.scala +++ b/main/src/main/scala/sbt/coursierint/LMCoursier.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -78,7 +79,6 @@ object LMCoursier { extraProjects: Seq[CProject], fallbackDeps: Seq[FallbackDependency], appConfig: AppConfiguration, - classifiers: Option[Seq[Classifier]], profiles: Set[String], scalaOrg: String, scalaVer: String, @@ -90,58 +90,11 @@ object LMCoursier { createLogger: Option[CacheLogger], cacheDirectory: File, reconciliation: Seq[(ModuleMatchers, Reconciliation)], - ivyHome: Option[String], - strict: Option[CStrict], - depsOverrides: Seq[ModuleID], - log: Logger - ): CoursierConfiguration = - coursierConfiguration( - rs, - interProjectDependencies, - extraProjects, - fallbackDeps, - appConfig, - classifiers, - profiles, - scalaOrg, - scalaVer, - scalaBinaryVer, - autoScalaLib, - scalaModInfo, - excludeDeps, - credentials, - createLogger, - cacheDirectory, - reconciliation, - ivyHome, - strict, - depsOverrides, - None, - log - ) - - def coursierConfiguration( - rs: Seq[Resolver], - interProjectDependencies: Seq[CProject], - extraProjects: Seq[CProject], - fallbackDeps: Seq[FallbackDependency], - appConfig: AppConfiguration, - classifiers: Option[Seq[Classifier]], - profiles: Set[String], - scalaOrg: String, - scalaVer: String, - scalaBinaryVer: String, - autoScalaLib: Boolean, - scalaModInfo: Option[ScalaModuleInfo], - excludeDeps: Seq[InclExclRule], - credentials: Seq[Credentials], - createLogger: Option[CacheLogger], - cacheDirectory: File, - reconciliation: Seq[(ModuleMatchers, Reconciliation)], - ivyHome: Option[String], + ivyHome: Option[File], strict: Option[CStrict], depsOverrides: Seq[ModuleID], updateConfig: Option[UpdateConfiguration], + sameVersions: Seq[Set[InclExclRule]], log: Logger ): CoursierConfiguration = { val coursierExcludeDeps = Inputs @@ -180,8 +133,6 @@ object LMCoursier { .withSbtScalaJars(sbtBootJars.toVector) .withSbtScalaVersion(sbtScalaVersion) .withSbtScalaOrganization(sbtScalaOrganization) - .withClassifiers(classifiers.toVector.flatten.map(_.value)) - .withHasClassifiers(classifiers.nonEmpty) .withMavenProfiles(profiles.toVector.sorted) .withScalaOrganization(scalaOrg) .withScalaVersion(scalaVer) @@ -190,10 +141,11 @@ object LMCoursier { .withCache(cacheDirectory) .withReconciliation(reconciliation.toVector) .withLog(log) - .withIvyHome(ivyHome.map(new File(_))) + .withIvyHome(ivyHome) .withStrict(strict) .withForceVersions(userForceVersions.toVector) .withMissingOk(missingOk) + .withSameVersions(sameVersions) } def coursierConfigurationTask: Def.Initialize[Task[CoursierConfiguration]] = Def.task { @@ -204,52 +156,31 @@ object LMCoursier { csrExtraProjects.value.toVector, csrFallbackDependencies.value, appConfiguration.value, - None, csrMavenProfiles.value, scalaOrganization.value, sv, scalaBinaryVersion.value, - autoScalaLibrary.value && !ScalaArtifacts.isScala3(sv), + autoScalaLibrary.value && !ScalaArtifacts.isScala3(sv) && !Classpaths.isScala213(sv), scalaModuleInfo.value, allExcludeDependencies.value, CoursierInputsTasks.credentialsTask.value, csrLogger.value, csrCacheDirectory.value, csrReconciliations.value, - ivyPaths.value.ivyHome, + ivyPaths.value.ivyHome.map(new File(_)), CoursierInputsTasks.strictTask.value, dependencyOverrides.value, Some(updateConfiguration.value), + csrSameVersions.value, streams.value.log ) } def updateClassifierConfigurationTask: Def.Initialize[Task[CoursierConfiguration]] = Def.task { - val sv = scalaVersion.value - coursierConfiguration( - csrRecursiveResolvers.value, - csrInterProjectDependencies.value.toVector, - csrExtraProjects.value.toVector, - csrFallbackDependencies.value, - appConfiguration.value, - Some(transitiveClassifiers.value.map(Classifier(_))), - csrMavenProfiles.value, - scalaOrganization.value, - sv, - scalaBinaryVersion.value, - autoScalaLibrary.value && !ScalaArtifacts.isScala3(sv), - scalaModuleInfo.value, - allExcludeDependencies.value, - CoursierInputsTasks.credentialsTask.value, - csrLogger.value, - csrCacheDirectory.value, - csrReconciliations.value, - ivyPaths.value.ivyHome, - CoursierInputsTasks.strictTask.value, - dependencyOverrides.value, - Some(updateConfiguration.value), - streams.value.log - ) + val classifiers = transitiveClassifiers.value.map(Classifier(_)) + coursierConfigurationTask.value + .withClassifiers(classifiers.toVector.map(_.value)) + .withHasClassifiers(true) } def updateSbtClassifierConfigurationTask: Def.Initialize[Task[CoursierConfiguration]] = Def.task { @@ -260,22 +191,22 @@ object LMCoursier { Vector(), csrFallbackDependencies.value, appConfiguration.value, - None, csrMavenProfiles.value, scalaOrganization.value, sv, scalaBinaryVersion.value, - autoScalaLibrary.value && !ScalaArtifacts.isScala3(sv), + autoScalaLibrary.value && !ScalaArtifacts.isScala3(sv) && !Classpaths.isScala213(sv), scalaModuleInfo.value, allExcludeDependencies.value, CoursierInputsTasks.credentialsTask.value, csrLogger.value, csrCacheDirectory.value, csrReconciliations.value, - ivyPaths.value.ivyHome, + ivyPaths.value.ivyHome.map(new File(_)), CoursierInputsTasks.strictTask.value, dependencyOverrides.value, Some(updateConfiguration.value), + csrSameVersions.value, streams.value.log ) } @@ -288,22 +219,22 @@ object LMCoursier { Vector(), csrFallbackDependencies.value, appConfiguration.value, - None, csrMavenProfiles.value, scalaOrganization.value, sv, scalaBinaryVersion.value, - autoScalaLibrary.value && !ScalaArtifacts.isScala3(sv), + autoScalaLibrary.value && !ScalaArtifacts.isScala3(sv) && !Classpaths.isScala213(sv), scalaModuleInfo.value, allExcludeDependencies.value, CoursierInputsTasks.credentialsTask.value, csrLogger.value, csrCacheDirectory.value, csrReconciliations.value, - ivyPaths.value.ivyHome, + ivyPaths.value.ivyHome.map(new File(_)), CoursierInputsTasks.strictTask.value, dependencyOverrides.value, Some(updateConfiguration.value), + csrSameVersions.value, streams.value.log ) } diff --git a/main/src/main/scala/sbt/internal/APIMappings.scala b/main/src/main/scala/sbt/internal/APIMappings.scala index 4a810cf05..25666839f 100644 --- a/main/src/main/scala/sbt/internal/APIMappings.scala +++ b/main/src/main/scala/sbt/internal/APIMappings.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -12,7 +13,6 @@ import java.net.{ MalformedURLException, URI, URL } import sbt.internal.librarymanagement.mavenint.SbtPomExtraProperties import sbt.librarymanagement.ModuleID - import sbt.internal.util.Attributed import sbt.util.Logger import xsbti.HashedVirtualFileRef @@ -47,7 +47,8 @@ private[sbt] object APIMappings { yield (entry, u) private[this] def parseURL(s: String, forEntry: HashedVirtualFileRef, log: Logger): Option[URL] = - try Some(new URL(s)) + try + Some(new URI(s).toURL) catch { case e: MalformedURLException => log.warn(s"Invalid API base URL '$s' for classpath entry '$forEntry': ${e.toString}") diff --git a/main/src/main/scala/sbt/internal/AbstractTaskProgress.scala b/main/src/main/scala/sbt/internal/AbstractTaskProgress.scala index 15a4bdb4e..5de66abf3 100644 --- a/main/src/main/scala/sbt/internal/AbstractTaskProgress.scala +++ b/main/src/main/scala/sbt/internal/AbstractTaskProgress.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/Act.scala b/main/src/main/scala/sbt/internal/Act.scala index ee9684a49..c2dd6bbb6 100644 --- a/main/src/main/scala/sbt/internal/Act.scala +++ b/main/src/main/scala/sbt/internal/Act.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/AddSettings.scala b/main/src/main/scala/sbt/internal/AddSettings.scala index 68bbaaf23..8d4b75210 100644 --- a/main/src/main/scala/sbt/internal/AddSettings.scala +++ b/main/src/main/scala/sbt/internal/AddSettings.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/Aggregation.scala b/main/src/main/scala/sbt/internal/Aggregation.scala index ad2dd2db4..289f0ff62 100644 --- a/main/src/main/scala/sbt/internal/Aggregation.scala +++ b/main/src/main/scala/sbt/internal/Aggregation.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/AnalysisUtil.scala b/main/src/main/scala/sbt/internal/AnalysisUtil.scala new file mode 100644 index 000000000..d200ddfde --- /dev/null +++ b/main/src/main/scala/sbt/internal/AnalysisUtil.scala @@ -0,0 +1,40 @@ +/* + * sbt + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. + * Copyright 2008 - 2010, Mark Harrah + * Licensed under Apache License 2.0 (see LICENSE) + */ + +package sbt +package internal + +import java.nio.file.Path +import sbt.internal.inc.MixedAnalyzingCompiler +import scala.concurrent.ExecutionContext +import xsbti.compile.{ AnalysisStore => XAnalysisStore } +import xsbti.compile.analysis.ReadWriteMappers + +private[sbt] object AnalysisUtil { + // some machines have many cores. + // we don't want to occupy them all for analysis serialization. + lazy val parallelism: Int = + scala.math.min( + Runtime.getRuntime.availableProcessors(), + 8, + ) + def staticCachedStore( + analysisFile: Path, + useTextAnalysis: Boolean, + useConsistent: Boolean, + ): XAnalysisStore = + MixedAnalyzingCompiler.staticCachedStore( + analysisFile = analysisFile, + useTextAnalysis = useTextAnalysis, + useConsistent = false, + mappers = ReadWriteMappers.getEmptyMappers(), + sort = true, + ec = ExecutionContext.global, + parallelism = parallelism, + ) +} diff --git a/main/src/main/scala/sbt/internal/Banner.scala b/main/src/main/scala/sbt/internal/Banner.scala index 24e3a9f6b..1ed7aa04b 100644 --- a/main/src/main/scala/sbt/internal/Banner.scala +++ b/main/src/main/scala/sbt/internal/Banner.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -10,6 +11,25 @@ package sbt.internal private[sbt] object Banner { def apply(version: String): Option[String] = version match { + case v if v.startsWith("1.10.0") => + Some(s""" + |Here are some highlights of sbt 1.10.0: + | - SIP-51 support for Scala 2.13 evolution + | - Various Zinc fixes + | - ConsistentAnalysisFormat: new Zinc Analysis serialization + | - CommandProgress API + |See https://eed3si9n.com/sbt-1.10.0 for full release notes. + |Hide the banner for this release by running `skipBanner`. + |""".stripMargin.linesIterator.mkString("\n")) + case v if v.startsWith("1.9.0") => + Some(s""" + |Here are some highlights of sbt 1.9.0: + | - POM consistency of sbt plugin publishing + | - sbt new, a text-based adventure + | - Deprecation of IntegrationTest configuration + |See https://eed3si9n.com/sbt-1.9.0 for full release notes. + |Hide the banner for this release by running `skipBanner`. + |""".stripMargin.linesIterator.mkString("\n")) case v if v.startsWith("1.7.0") => Some(s""" |Here are some highlights of this release: diff --git a/main/src/main/scala/sbt/internal/BuildDef.scala b/main/src/main/scala/sbt/internal/BuildDef.scala index 6085b780e..3c2ab391d 100644 --- a/main/src/main/scala/sbt/internal/BuildDef.scala +++ b/main/src/main/scala/sbt/internal/BuildDef.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/BuildDependencies.scala b/main/src/main/scala/sbt/internal/BuildDependencies.scala index 601584de7..3f24cda84 100644 --- a/main/src/main/scala/sbt/internal/BuildDependencies.scala +++ b/main/src/main/scala/sbt/internal/BuildDependencies.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/BuildLoader.scala b/main/src/main/scala/sbt/internal/BuildLoader.scala index 6f1832b3d..6d6f1d749 100644 --- a/main/src/main/scala/sbt/internal/BuildLoader.scala +++ b/main/src/main/scala/sbt/internal/BuildLoader.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/BuildStructure.scala b/main/src/main/scala/sbt/internal/BuildStructure.scala index 8261af40e..9e4610674 100644 --- a/main/src/main/scala/sbt/internal/BuildStructure.scala +++ b/main/src/main/scala/sbt/internal/BuildStructure.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/BuildUtil.scala b/main/src/main/scala/sbt/internal/BuildUtil.scala index a3c8baaef..30344b0a1 100644 --- a/main/src/main/scala/sbt/internal/BuildUtil.scala +++ b/main/src/main/scala/sbt/internal/BuildUtil.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/ClassLoaderWarmup.scala b/main/src/main/scala/sbt/internal/ClassLoaderWarmup.scala index 00159964e..2ce2a2e3a 100644 --- a/main/src/main/scala/sbt/internal/ClassLoaderWarmup.scala +++ b/main/src/main/scala/sbt/internal/ClassLoaderWarmup.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/ClassLoaders.scala b/main/src/main/scala/sbt/internal/ClassLoaders.scala index 22c824c8e..708193f43 100644 --- a/main/src/main/scala/sbt/internal/ClassLoaders.scala +++ b/main/src/main/scala/sbt/internal/ClassLoaders.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -11,7 +12,6 @@ package internal import java.io.File import java.net.URL import java.nio.file.Path - import sbt.ClassLoaderLayeringStrategy._ import sbt.Keys._ import sbt.SlashSyntax0._ @@ -21,10 +21,12 @@ import sbt.internal.inc.classpath.ClasspathUtil import sbt.internal.util.Attributed import sbt.internal.util.Attributed.data import sbt.io.IO +import sbt.librarymanagement.ScalaArtifacts import sbt.nio.FileStamp import sbt.nio.FileStamp.LastModified import sbt.nio.Keys._ import sbt.util.Logger +import xsbti.ArtifactInfo import xsbti.HashedVirtualFileRef private[sbt] object ClassLoaders { @@ -174,14 +176,24 @@ private[sbt] object ClassLoaders { case _: AllLibraryJars => true case _ => false } + val cpFiles = fullCP.map(_._1) val scalaLibraryLayer = { + val jars = + if (ScalaArtifacts.isScala3(si.version) || Classpaths.isScala213(si.version)) + cpFiles + .filter(f => { + val name = f.getName + name.contains(ArtifactInfo.ScalaLibraryID) || si.libraryJars + .exists(_.getName == name) + }) + .toArray + else si.libraryJars cache.apply( - si.libraryJars.map(j => j -> IO.getModifiedTimeOrZero(j)).toList, + jars.map(j => j -> IO.getModifiedTimeOrZero(j)).toList, interfaceLoader, - () => new ScalaLibraryClassLoader(si.libraryJars.map(_.toURI.toURL), interfaceLoader) + () => new ScalaLibraryClassLoader(jars.map(_.toURI.toURL), interfaceLoader) ) } - val cpFiles = fullCP.map(_._1) val allDependencies = cpFiles.filter(allDependenciesSet) def isReflectJar(f: File): Boolean = diff --git a/main/src/main/scala/sbt/internal/ClasspathImpl.scala b/main/src/main/scala/sbt/internal/ClasspathImpl.scala index ff1aabcdf..5fbd145e9 100644 --- a/main/src/main/scala/sbt/internal/ClasspathImpl.scala +++ b/main/src/main/scala/sbt/internal/ClasspathImpl.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/Clean.scala b/main/src/main/scala/sbt/internal/Clean.scala index e766a678a..34f0092e0 100644 --- a/main/src/main/scala/sbt/internal/Clean.scala +++ b/main/src/main/scala/sbt/internal/Clean.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -104,7 +105,7 @@ private[sbt] object Clean { val delete = cleanDelete(scope).value val targetDir = (scope / target).?.value.map(_.toPath) - targetDir.filter(_ => full).foreach(deleteContents(_, excludeFilter, view, delete)) + targetDir.withFilter(_ => full).foreach(deleteContents(_, excludeFilter, view, delete)) (scope / cleanFiles).?.value.getOrElse(Nil).foreach { x => if (x.isDirectory) deleteContents(x.toPath, excludeFilter, view, delete) else delete(x.toPath) diff --git a/main/src/main/scala/sbt/internal/CommandExchange.scala b/main/src/main/scala/sbt/internal/CommandExchange.scala index 381771e94..637270ef3 100644 --- a/main/src/main/scala/sbt/internal/CommandExchange.scala +++ b/main/src/main/scala/sbt/internal/CommandExchange.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -165,7 +166,7 @@ private[sbt] final class CommandExchange { commandQueue.removeIf { e => e.source.map(_.channelName) == Some(c.name) && e.commandLine != Shutdown } - currentExec.filter(_.source.map(_.channelName) == Some(c.name)).foreach { e => + currentExec.withFilter(_.source.map(_.channelName) == Some(c.name)).foreach { e => Util.ignoreResult(NetworkChannel.cancel(e.execId, e.execId.getOrElse("0"), force = false)) } try commandQueue.put(Exec(s"${ContinuousCommands.stopWatch} ${c.name}", None)) diff --git a/main/src/main/scala/sbt/internal/CommandStrings.scala b/main/src/main/scala/sbt/internal/CommandStrings.scala index 822a8c99a..e4996e6ec 100644 --- a/main/src/main/scala/sbt/internal/CommandStrings.scala +++ b/main/src/main/scala/sbt/internal/CommandStrings.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/CompatParColls.scala b/main/src/main/scala/sbt/internal/CompatParColls.scala index 00410e7d5..b79efc6d8 100644 --- a/main/src/main/scala/sbt/internal/CompatParColls.scala +++ b/main/src/main/scala/sbt/internal/CompatParColls.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/ConsoleProject.scala b/main/src/main/scala/sbt/internal/ConsoleProject.scala index eeeec30cf..6790d8c6c 100644 --- a/main/src/main/scala/sbt/internal/ConsoleProject.scala +++ b/main/src/main/scala/sbt/internal/ConsoleProject.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/Continuous.scala b/main/src/main/scala/sbt/internal/Continuous.scala index aae369942..edab39f5a 100644 --- a/main/src/main/scala/sbt/internal/Continuous.scala +++ b/main/src/main/scala/sbt/internal/Continuous.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -972,7 +973,7 @@ private[sbt] object Continuous extends DeprecatedContinuous { * input task. * * @param command the name of the command/task to run with each iteration - * @param inputs the transitive task inputs (see [[SettingsGraph]]) + * @param dynamicInputs the transitive task inputs (see [[SettingsGraph]]) * @param watchSettings the [[WatchSettings]] instance for the task */ private final class Config( diff --git a/main/src/main/scala/sbt/internal/CrossJava.scala b/main/src/main/scala/sbt/internal/CrossJava.scala index 6ec7d8ff9..aca3593da 100644 --- a/main/src/main/scala/sbt/internal/CrossJava.scala +++ b/main/src/main/scala/sbt/internal/CrossJava.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/DefaultBackgroundJobService.scala b/main/src/main/scala/sbt/internal/DefaultBackgroundJobService.scala index f4abe9cfa..e1b6179a9 100644 --- a/main/src/main/scala/sbt/internal/DefaultBackgroundJobService.scala +++ b/main/src/main/scala/sbt/internal/DefaultBackgroundJobService.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/DefaultRunProfiler.scala b/main/src/main/scala/sbt/internal/DefaultRunProfiler.scala new file mode 100644 index 000000000..cc3f54c64 --- /dev/null +++ b/main/src/main/scala/sbt/internal/DefaultRunProfiler.scala @@ -0,0 +1,54 @@ +/* + * sbt + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. + * Copyright 2008 - 2010, Mark Harrah + * Licensed under Apache License 2.0 (see LICENSE) + */ + +package sbt.internal + +import xsbti.VirtualFileRef +import xsbti.compile.{ APIChange, InitialChanges, RunProfiler } + +class DefaultRunProfiler(profilers: Seq[RunProfiler]) extends RunProfiler { + override def timeCompilation(startNanos: Long, durationNanos: Long): Unit = + profilers.foreach(_.timeCompilation(startNanos, durationNanos)) + + override def registerInitial(changes: InitialChanges): Unit = + profilers.foreach(_.registerInitial(changes)) + + override def registerEvent( + kind: String, + inputs: Array[String], + outputs: Array[String], + reason: String + ): Unit = + profilers.foreach(_.registerEvent(kind, inputs, outputs, reason)) + + override def registerCycle( + invalidatedClasses: Array[String], + invalidatedPackageObjects: Array[String], + initialSources: Array[VirtualFileRef], + invalidatedSources: Array[VirtualFileRef], + recompiledClasses: Array[String], + changesAfterRecompilation: Array[APIChange], + nextInvalidations: Array[String], + shouldCompileIncrementally: Boolean + ): Unit = + profilers.foreach( + _.registerCycle( + invalidatedClasses, + invalidatedPackageObjects, + initialSources, + invalidatedSources, + recompiledClasses, + changesAfterRecompilation, + nextInvalidations, + shouldCompileIncrementally + ) + ) + + override def registerRun(): Unit = + profilers.foreach(_.registerRun()) +} diff --git a/main/src/main/scala/sbt/internal/DeprecatedContinuous.scala b/main/src/main/scala/sbt/internal/DeprecatedContinuous.scala index fac38c369..8ca30fb20 100644 --- a/main/src/main/scala/sbt/internal/DeprecatedContinuous.scala +++ b/main/src/main/scala/sbt/internal/DeprecatedContinuous.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/DynamicInput.scala b/main/src/main/scala/sbt/internal/DynamicInput.scala index 36260e6c0..e2e4619cb 100644 --- a/main/src/main/scala/sbt/internal/DynamicInput.scala +++ b/main/src/main/scala/sbt/internal/DynamicInput.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/FastTrackCommands.scala b/main/src/main/scala/sbt/internal/FastTrackCommands.scala index 13774fe7c..673198a5b 100644 --- a/main/src/main/scala/sbt/internal/FastTrackCommands.scala +++ b/main/src/main/scala/sbt/internal/FastTrackCommands.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/FileChangesMacro.scala b/main/src/main/scala/sbt/internal/FileChangesMacro.scala index 862e3bd47..a71893f45 100644 --- a/main/src/main/scala/sbt/internal/FileChangesMacro.scala +++ b/main/src/main/scala/sbt/internal/FileChangesMacro.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/GCMonitor.scala b/main/src/main/scala/sbt/internal/GCMonitor.scala index 761b5c317..999b40d77 100644 --- a/main/src/main/scala/sbt/internal/GCMonitor.scala +++ b/main/src/main/scala/sbt/internal/GCMonitor.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/GCUtil.scala b/main/src/main/scala/sbt/internal/GCUtil.scala index 821ea7022..e114c9e85 100644 --- a/main/src/main/scala/sbt/internal/GCUtil.scala +++ b/main/src/main/scala/sbt/internal/GCUtil.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -36,7 +37,11 @@ private[sbt] object GCUtil { // Force the detection of finalizers for scala.reflect weakhashsets System.gc() // Force finalizers to run. - System.runFinalization() + try { + System.runFinalization() + } catch { + case _: NoSuchMethodError => + } // Force actually cleaning the weak hash maps. System.gc() } catch { diff --git a/main/src/main/scala/sbt/internal/GlobalPlugin.scala b/main/src/main/scala/sbt/internal/GlobalPlugin.scala index dae07423d..dcc9d816d 100644 --- a/main/src/main/scala/sbt/internal/GlobalPlugin.scala +++ b/main/src/main/scala/sbt/internal/GlobalPlugin.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/GroupedAutoPlugins.scala b/main/src/main/scala/sbt/internal/GroupedAutoPlugins.scala index b1aabc177..ca9c77ec7 100644 --- a/main/src/main/scala/sbt/internal/GroupedAutoPlugins.scala +++ b/main/src/main/scala/sbt/internal/GroupedAutoPlugins.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/InMemoryCacheStore.scala b/main/src/main/scala/sbt/internal/InMemoryCacheStore.scala index 58eeeb5ef..714c3544f 100644 --- a/main/src/main/scala/sbt/internal/InMemoryCacheStore.scala +++ b/main/src/main/scala/sbt/internal/InMemoryCacheStore.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/Inspect.scala b/main/src/main/scala/sbt/internal/Inspect.scala index 5d2de8d9b..8cc4cd32e 100644 --- a/main/src/main/scala/sbt/internal/Inspect.scala +++ b/main/src/main/scala/sbt/internal/Inspect.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/InstallSbtn.scala b/main/src/main/scala/sbt/internal/InstallSbtn.scala index ebed727f7..59e5bbcad 100644 --- a/main/src/main/scala/sbt/internal/InstallSbtn.scala +++ b/main/src/main/scala/sbt/internal/InstallSbtn.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -12,7 +13,7 @@ import Def._ import Keys.{ sbtVersion, state, terminal } import java.io.{ File, FileInputStream, FileOutputStream, InputStream, IOException } -import java.net.URL +import java.net.URI import java.nio.file.{ Files, Path } import java.util.zip.ZipInputStream import sbt.io.IO @@ -64,7 +65,17 @@ private[sbt] object InstallSbtn { if (Properties.isWin) "pc-win32.exe" else if (Properties.isLinux) "pc-linux" else "apple-darwin" - val sbtnName = s"sbt/bin/sbtn-x86_64-$bin" + val isArmArchitecture: Boolean = { + val prop = sys.props + .getOrElse("os.arch", "") + .toLowerCase(java.util.Locale.ROOT) + prop == "arm64" || prop == "aarch64" + } + val arch = + if (Properties.isWin) "x86_64" + else if (Properties.isLinux && isArmArchitecture) "aarch64" + else "universal" + val sbtnName = s"sbt/bin/sbtn-$arch-$bin" val fis = new FileInputStream(sbtZip.toFile) val zipInputStream = new ZipInputStream(fis) var foundBinary = false @@ -90,7 +101,7 @@ private[sbt] object InstallSbtn { } private[this] def downloadRelease(term: Terminal, version: String, location: Path): Unit = { val zip = s"https://github.com/sbt/sbt/releases/download/v$version/sbt-$version.zip" - val url = new URL(zip) + val url = new URI(zip).toURL term.printStream.println(s"downloading $zip to $location") transfer(url.openStream(), location) } @@ -130,7 +141,7 @@ private[sbt] object InstallSbtn { private[this] def downloadCompletion(completion: String, version: String, target: Path): Unit = { Files.createDirectories(target.getParent) val comp = s"https://raw.githubusercontent.com/sbt/sbt/v$version/client/completions/$completion" - transfer(new URL(comp).openStream, target) + transfer(new URI(comp).toURL.openStream, target) } private[this] def setupShell( shell: String, diff --git a/main/src/main/scala/sbt/internal/InternalDependencies.scala b/main/src/main/scala/sbt/internal/InternalDependencies.scala index 7af73c612..31ee6be94 100644 --- a/main/src/main/scala/sbt/internal/InternalDependencies.scala +++ b/main/src/main/scala/sbt/internal/InternalDependencies.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/IvyConsole.scala b/main/src/main/scala/sbt/internal/IvyConsole.scala index 4761bc3b2..e2a1e0651 100644 --- a/main/src/main/scala/sbt/internal/IvyConsole.scala +++ b/main/src/main/scala/sbt/internal/IvyConsole.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/JarClassPath.scala b/main/src/main/scala/sbt/internal/JarClassPath.scala index 93ed22690..9d93e6736 100644 --- a/main/src/main/scala/sbt/internal/JarClassPath.scala +++ b/main/src/main/scala/sbt/internal/JarClassPath.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/KeyIndex.scala b/main/src/main/scala/sbt/internal/KeyIndex.scala index f6f20d119..a2b72ea14 100644 --- a/main/src/main/scala/sbt/internal/KeyIndex.scala +++ b/main/src/main/scala/sbt/internal/KeyIndex.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/LayeredClassLoaders.scala b/main/src/main/scala/sbt/internal/LayeredClassLoaders.scala index c3662ad7f..276366227 100644 --- a/main/src/main/scala/sbt/internal/LayeredClassLoaders.scala +++ b/main/src/main/scala/sbt/internal/LayeredClassLoaders.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/LibraryManagement.scala b/main/src/main/scala/sbt/internal/LibraryManagement.scala index 900494224..4feb7dd3e 100644 --- a/main/src/main/scala/sbt/internal/LibraryManagement.scala +++ b/main/src/main/scala/sbt/internal/LibraryManagement.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/LintUnused.scala b/main/src/main/scala/sbt/internal/LintUnused.scala index 5344cf0ec..283e345c9 100644 --- a/main/src/main/scala/sbt/internal/LintUnused.scala +++ b/main/src/main/scala/sbt/internal/LintUnused.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/Load.scala b/main/src/main/scala/sbt/internal/Load.scala index d1f387409..136be4f7a 100755 --- a/main/src/main/scala/sbt/internal/Load.scala +++ b/main/src/main/scala/sbt/internal/Load.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -93,7 +94,7 @@ private[sbt] object Load { val dependencyResolution = IvyDependencyResolution(ivyConfiguration) val si = ScalaInstance(scalaProvider.version, scalaProvider.launcher) val zincDir = BuildPaths.getZincDirectory(state, globalBase) - val classpathOptions = ClasspathOptionsUtil.boot + val classpathOptions = ClasspathOptionsUtil.noboot(si.version) val scalac = ZincLmUtil.scalaCompiler( scalaInstance = si, classpathOptions = classpathOptions, @@ -1137,7 +1138,7 @@ private[sbt] object Load { // Filter the AutoPlugin settings we included based on which ones are // intended in the AddSettings.AutoPlugins filter. def autoPluginSettings(f: AutoPlugins) = - projectPlugins.filter(f.include).flatMap(_.projectSettings) + projectPlugins.withFilter(f.include).flatMap(_.projectSettings) // Expand the AddSettings instance into a real Seq[Setting[_]] we'll use on the project def expandPluginSettings(auto: AddSettings): Seq[Setting[_]] = auto match @@ -1304,6 +1305,7 @@ private[sbt] object Load { val prod = (Configurations.Runtime / exportedProducts).value val cp = (Configurations.Runtime / fullClasspath).value val opts = (Configurations.Compile / scalacOptions).value + val javaOpts = (Configurations.Compile / javacOptions).value val unmanagedSrcDirs = (Configurations.Compile / unmanagedSourceDirectories).value val unmanagedSrcs = (Configurations.Compile / unmanagedSources).value val managedSrcDirs = (Configurations.Compile / managedSourceDirectories).value @@ -1316,6 +1318,7 @@ private[sbt] object Load { Some(fullResolvers.value.toVector), Some(update.value), opts, + javaOpts, unmanagedSrcDirs, unmanagedSrcs, managedSrcDirs, @@ -1376,19 +1379,7 @@ private[sbt] object Load { loadPluginDefinition( dir, config, - PluginData( - config.globalPluginClasspath, - Nil, - None, - None, - Nil, - Nil, - Nil, - Nil, - Nil, - None, - config.converter, - ) + PluginData(config.globalPluginClasspath, config.converter) ) def buildPlugins(dir: File, s: State, config: LoadBuildConfiguration): LoadedPlugins = @@ -1593,6 +1584,7 @@ final case class LoadBuildConfiguration( Nil, Nil, Nil, + Nil, None, converter, ) diff --git a/main/src/main/scala/sbt/internal/LogManager.scala b/main/src/main/scala/sbt/internal/LogManager.scala index f414644f5..86631b387 100644 --- a/main/src/main/scala/sbt/internal/LogManager.scala +++ b/main/src/main/scala/sbt/internal/LogManager.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/Output.scala b/main/src/main/scala/sbt/internal/Output.scala index 350727da9..a1d599a3c 100644 --- a/main/src/main/scala/sbt/internal/Output.scala +++ b/main/src/main/scala/sbt/internal/Output.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/PluginDiscovery.scala b/main/src/main/scala/sbt/internal/PluginDiscovery.scala index 4bbae320b..adffe815c 100644 --- a/main/src/main/scala/sbt/internal/PluginDiscovery.scala +++ b/main/src/main/scala/sbt/internal/PluginDiscovery.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/PluginManagement.scala b/main/src/main/scala/sbt/internal/PluginManagement.scala index 74f616d5e..77a31f24a 100644 --- a/main/src/main/scala/sbt/internal/PluginManagement.scala +++ b/main/src/main/scala/sbt/internal/PluginManagement.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/PluginsDebug.scala b/main/src/main/scala/sbt/internal/PluginsDebug.scala index 917a8372a..ac29e518a 100644 --- a/main/src/main/scala/sbt/internal/PluginsDebug.scala +++ b/main/src/main/scala/sbt/internal/PluginsDebug.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -182,7 +183,7 @@ private[sbt] object PluginsDebug { ) lazy val debug = PluginsDebug(context.available) if (!pluginsThisBuild.contains(plugin)) { - val availableInBuilds: List[URI] = perBuild.toList.filter(_._2(plugin)).map(_._1) + val availableInBuilds: List[URI] = perBuild.toList.withFilter(_._2(plugin)).map(_._1) val s1 = s"Plugin ${plugin.label} is only available in builds:" val s2 = availableInBuilds.mkString("\n\t") val s3 = diff --git a/main/src/main/scala/sbt/internal/PrettyPrint.scala b/main/src/main/scala/sbt/internal/PrettyPrint.scala index 04683313b..b0e1955e7 100644 --- a/main/src/main/scala/sbt/internal/PrettyPrint.scala +++ b/main/src/main/scala/sbt/internal/PrettyPrint.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/ProjectNavigation.scala b/main/src/main/scala/sbt/internal/ProjectNavigation.scala index 069c91a59..f9b2219cb 100644 --- a/main/src/main/scala/sbt/internal/ProjectNavigation.scala +++ b/main/src/main/scala/sbt/internal/ProjectNavigation.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/RelayAppender.scala b/main/src/main/scala/sbt/internal/RelayAppender.scala index 2e61daa7c..3ac53b6f9 100644 --- a/main/src/main/scala/sbt/internal/RelayAppender.scala +++ b/main/src/main/scala/sbt/internal/RelayAppender.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/Resolve.scala b/main/src/main/scala/sbt/internal/Resolve.scala index 8162c2261..e4842f697 100644 --- a/main/src/main/scala/sbt/internal/Resolve.scala +++ b/main/src/main/scala/sbt/internal/Resolve.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/RetrieveUnit.scala b/main/src/main/scala/sbt/internal/RetrieveUnit.scala index bf8eb1939..93126743e 100644 --- a/main/src/main/scala/sbt/internal/RetrieveUnit.scala +++ b/main/src/main/scala/sbt/internal/RetrieveUnit.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/Script.scala b/main/src/main/scala/sbt/internal/Script.scala index b57a0eef9..7df34cadf 100644 --- a/main/src/main/scala/sbt/internal/Script.scala +++ b/main/src/main/scala/sbt/internal/Script.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/SessionSettings.scala b/main/src/main/scala/sbt/internal/SessionSettings.scala index 2928c1328..6e690c048 100755 --- a/main/src/main/scala/sbt/internal/SessionSettings.scala +++ b/main/src/main/scala/sbt/internal/SessionSettings.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -43,9 +44,9 @@ final case class SessionSettings( ) /** - * Modifiy the current state. + * Modify the current state. * - * @param build The buid with which we scope new settings. + * @param build The build with which we scope new settings. * @param project The project reference with which we scope new settings. * @param eval The mechanism to compile new settings. * @return A new SessionSettings object @@ -297,7 +298,7 @@ list, list-all Prints a numbered list of session settings defined. The numbers may be used to remove individual settings or ranges of settings using 'remove'. For 'list', only the settings for the current project are printed. - For 'list-all', all settings in all projets are printed. + For 'list-all', all settings in all projects are printed. remove diff --git a/main/src/main/scala/sbt/internal/SettingCompletions.scala b/main/src/main/scala/sbt/internal/SettingCompletions.scala index 2c1959c31..e7891351d 100644 --- a/main/src/main/scala/sbt/internal/SettingCompletions.scala +++ b/main/src/main/scala/sbt/internal/SettingCompletions.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/SettingGraph.scala b/main/src/main/scala/sbt/internal/SettingGraph.scala index 228fbed15..e7b65c438 100644 --- a/main/src/main/scala/sbt/internal/SettingGraph.scala +++ b/main/src/main/scala/sbt/internal/SettingGraph.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/ShutdownHooks.scala b/main/src/main/scala/sbt/internal/ShutdownHooks.scala index 385848371..411d42095 100644 --- a/main/src/main/scala/sbt/internal/ShutdownHooks.scala +++ b/main/src/main/scala/sbt/internal/ShutdownHooks.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/SysProp.scala b/main/src/main/scala/sbt/internal/SysProp.scala index 3ab08f6b3..fa24f7e81 100644 --- a/main/src/main/scala/sbt/internal/SysProp.scala +++ b/main/src/main/scala/sbt/internal/SysProp.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -154,6 +155,8 @@ object SysProp { def useLog4J: Boolean = getOrFalse("sbt.log.uselog4j") def turbo: Boolean = getOrFalse("sbt.turbo") def pipelining: Boolean = getOrFalse("sbt.pipelining") + // opt-in or out of Zinc's consistent Analysis format. + def analysis2024: Boolean = getOrTrue("sbt.analysis2024") def taskTimings: Boolean = getOrFalse("sbt.task.timings") def taskTimingsOnShutdown: Boolean = getOrFalse("sbt.task.timings.on.shutdown") diff --git a/main/src/main/scala/sbt/internal/TaskName.scala b/main/src/main/scala/sbt/internal/TaskName.scala index ce86c80d3..f84dd3126 100644 --- a/main/src/main/scala/sbt/internal/TaskName.scala +++ b/main/src/main/scala/sbt/internal/TaskName.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/TaskProgress.scala b/main/src/main/scala/sbt/internal/TaskProgress.scala index 9a3c4dc3c..f9550e0b1 100644 --- a/main/src/main/scala/sbt/internal/TaskProgress.scala +++ b/main/src/main/scala/sbt/internal/TaskProgress.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -151,7 +152,9 @@ private[sbt] class TaskProgress( "console", "consoleProject", "consoleQuick", - "state" + "state", + "streams", + "streams-manager", ) private[this] val hiddenTasks = Set( "compileEarly", diff --git a/main/src/main/scala/sbt/internal/TaskSequential.scala b/main/src/main/scala/sbt/internal/TaskSequential.scala index eeb5831b2..b893c26e5 100644 --- a/main/src/main/scala/sbt/internal/TaskSequential.scala +++ b/main/src/main/scala/sbt/internal/TaskSequential.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/TaskTimings.scala b/main/src/main/scala/sbt/internal/TaskTimings.scala index 9f39f0410..e636b218a 100644 --- a/main/src/main/scala/sbt/internal/TaskTimings.scala +++ b/main/src/main/scala/sbt/internal/TaskTimings.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/TaskTraceEvent.scala b/main/src/main/scala/sbt/internal/TaskTraceEvent.scala index ddb27ab70..f4c34266b 100644 --- a/main/src/main/scala/sbt/internal/TaskTraceEvent.scala +++ b/main/src/main/scala/sbt/internal/TaskTraceEvent.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/VirtualFileValueCache.scala b/main/src/main/scala/sbt/internal/VirtualFileValueCache.scala index b9838b99c..fd3121c13 100644 --- a/main/src/main/scala/sbt/internal/VirtualFileValueCache.scala +++ b/main/src/main/scala/sbt/internal/VirtualFileValueCache.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -31,8 +32,10 @@ object VirtualFileValueCache { } } def apply[A](converter: FileConverter)(f: VirtualFile => A): VirtualFileValueCache[A] = { - import collection.mutable.{ HashMap, Map } - val stampCache: Map[VirtualFileRef, (Long, XStamp)] = new HashMap + import collection.concurrent.Map + import java.util.concurrent.ConcurrentHashMap + import scala.jdk.CollectionConverters._ + val stampCache: Map[VirtualFileRef, (Long, XStamp)] = new ConcurrentHashMap().asScala make( Stamper.timeWrap( stampCache, diff --git a/main/src/main/scala/sbt/internal/WatchTransitiveDependencies.scala b/main/src/main/scala/sbt/internal/WatchTransitiveDependencies.scala index 13374bb23..f991822d5 100644 --- a/main/src/main/scala/sbt/internal/WatchTransitiveDependencies.scala +++ b/main/src/main/scala/sbt/internal/WatchTransitiveDependencies.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/graph/GraphTransformations.scala b/main/src/main/scala/sbt/internal/graph/GraphTransformations.scala index 816fe2624..b80dd1b97 100644 --- a/main/src/main/scala/sbt/internal/graph/GraphTransformations.scala +++ b/main/src/main/scala/sbt/internal/graph/GraphTransformations.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/graph/backend/IvyReport.scala b/main/src/main/scala/sbt/internal/graph/backend/IvyReport.scala index 07fb20312..71504081c 100644 --- a/main/src/main/scala/sbt/internal/graph/backend/IvyReport.scala +++ b/main/src/main/scala/sbt/internal/graph/backend/IvyReport.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/graph/backend/SbtUpdateReport.scala b/main/src/main/scala/sbt/internal/graph/backend/SbtUpdateReport.scala index f3066cb3d..5bad80b31 100644 --- a/main/src/main/scala/sbt/internal/graph/backend/SbtUpdateReport.scala +++ b/main/src/main/scala/sbt/internal/graph/backend/SbtUpdateReport.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/graph/model.scala b/main/src/main/scala/sbt/internal/graph/model.scala index 68f39dc51..04f254f0a 100644 --- a/main/src/main/scala/sbt/internal/graph/model.scala +++ b/main/src/main/scala/sbt/internal/graph/model.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/graph/package.scala b/main/src/main/scala/sbt/internal/graph/package.scala index f1fac27a6..50ef7036e 100644 --- a/main/src/main/scala/sbt/internal/graph/package.scala +++ b/main/src/main/scala/sbt/internal/graph/package.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/graph/rendering/AsciiTree.scala b/main/src/main/scala/sbt/internal/graph/rendering/AsciiTree.scala index 5c474bf6f..d40230bed 100644 --- a/main/src/main/scala/sbt/internal/graph/rendering/AsciiTree.scala +++ b/main/src/main/scala/sbt/internal/graph/rendering/AsciiTree.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/graph/rendering/DOT.scala b/main/src/main/scala/sbt/internal/graph/rendering/DOT.scala index 84b972427..e0b3759a7 100644 --- a/main/src/main/scala/sbt/internal/graph/rendering/DOT.scala +++ b/main/src/main/scala/sbt/internal/graph/rendering/DOT.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -52,7 +53,7 @@ object DOT: // add extra edges from evicted to evicted-by module val evictedByEdges: Seq[Edge] = graph.nodes - .filter(_.isEvicted) + .withFilter(_.isEvicted) .map(m => Edge(m.id, m.id.copy(version = m.evictedByVersion.get))) // remove edges to new evicted-by module which is now replaced by a chain diff --git a/main/src/main/scala/sbt/internal/graph/rendering/DagreHTML.scala b/main/src/main/scala/sbt/internal/graph/rendering/DagreHTML.scala index 0938d9ec9..d8247cff3 100644 --- a/main/src/main/scala/sbt/internal/graph/rendering/DagreHTML.scala +++ b/main/src/main/scala/sbt/internal/graph/rendering/DagreHTML.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/graph/rendering/FlatList.scala b/main/src/main/scala/sbt/internal/graph/rendering/FlatList.scala index a0a842408..cad3be0c3 100644 --- a/main/src/main/scala/sbt/internal/graph/rendering/FlatList.scala +++ b/main/src/main/scala/sbt/internal/graph/rendering/FlatList.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/graph/rendering/GraphML.scala b/main/src/main/scala/sbt/internal/graph/rendering/GraphML.scala index 9f61873dc..7415b90ea 100644 --- a/main/src/main/scala/sbt/internal/graph/rendering/GraphML.scala +++ b/main/src/main/scala/sbt/internal/graph/rendering/GraphML.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/graph/rendering/LicenseInfo.scala b/main/src/main/scala/sbt/internal/graph/rendering/LicenseInfo.scala index ba7194cbd..1d9f734fb 100644 --- a/main/src/main/scala/sbt/internal/graph/rendering/LicenseInfo.scala +++ b/main/src/main/scala/sbt/internal/graph/rendering/LicenseInfo.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/graph/rendering/Statistics.scala b/main/src/main/scala/sbt/internal/graph/rendering/Statistics.scala index 15c922992..720d15c9f 100644 --- a/main/src/main/scala/sbt/internal/graph/rendering/Statistics.scala +++ b/main/src/main/scala/sbt/internal/graph/rendering/Statistics.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -28,7 +29,7 @@ object Statistics { val directDependencies = graph.dependencyMap(moduleId).filterNot(_.isEvicted).map(_.id) val dependencyStats = directDependencies.map(statsFor).flatMap(_.transitiveStatsWithSelf).toMap - val selfSize = graph.module(moduleId).flatMap(_.jarFile).filter(_.exists).map(_.length) + val selfSize = graph.module(moduleId).flatMap(_.jarFile).withFilter(_.exists).map(_.length) val numDirectDependencies = directDependencies.size val numTransitiveDependencies = dependencyStats.size val transitiveSize = selfSize.getOrElse(0L) + dependencyStats @@ -46,6 +47,9 @@ object Statistics { } def format(stats: ModuleStats): String = { + import java.util.Locale + val dl = Locale.getDefault + Locale.setDefault(Locale.US) import stats._ def mb(bytes: Long): Double = bytes.toDouble / 1000000 val selfSize = @@ -53,7 +57,10 @@ object Statistics { case Some(size) => f"${mb(size)}%7.3f" case None => "-------" } - f"${mb(transitiveSize)}%7.3f MB $selfSize MB $numTransitiveDependencies%4d $numDirectDependencies%4d ${id.idString}%s" + val r = + f"${mb(transitiveSize)}%7.3f MB $selfSize MB $numTransitiveDependencies%4d $numDirectDependencies%4d ${id.idString}%s" + Locale.setDefault(dl) + r } val allStats = diff --git a/main/src/main/scala/sbt/internal/graph/rendering/TreeView.scala b/main/src/main/scala/sbt/internal/graph/rendering/TreeView.scala index cec138ad4..5c19f2381 100644 --- a/main/src/main/scala/sbt/internal/graph/rendering/TreeView.scala +++ b/main/src/main/scala/sbt/internal/graph/rendering/TreeView.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/librarymanagement/FakeRawRepository.scala b/main/src/main/scala/sbt/internal/librarymanagement/FakeRawRepository.scala index a8a236643..4d196279d 100644 --- a/main/src/main/scala/sbt/internal/librarymanagement/FakeRawRepository.scala +++ b/main/src/main/scala/sbt/internal/librarymanagement/FakeRawRepository.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/librarymanagement/IvyXml.scala b/main/src/main/scala/sbt/internal/librarymanagement/IvyXml.scala index ad8f50659..cb3ba06cd 100644 --- a/main/src/main/scala/sbt/internal/librarymanagement/IvyXml.scala +++ b/main/src/main/scala/sbt/internal/librarymanagement/IvyXml.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/server/BspCompileProgress.scala b/main/src/main/scala/sbt/internal/server/BspCompileProgress.scala index c445a9fe4..b5ccae255 100644 --- a/main/src/main/scala/sbt/internal/server/BspCompileProgress.scala +++ b/main/src/main/scala/sbt/internal/server/BspCompileProgress.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/server/BspCompileTask.scala b/main/src/main/scala/sbt/internal/server/BspCompileTask.scala index 877c0b58a..d90f02fe5 100644 --- a/main/src/main/scala/sbt/internal/server/BspCompileTask.scala +++ b/main/src/main/scala/sbt/internal/server/BspCompileTask.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -10,20 +11,21 @@ package sbt.internal.server import sbt._ import sbt.internal.bsp._ import sbt.librarymanagement.Configuration +import sbt.util.InterfaceUtil import sjsonnew.support.scalajson.unsafe.Converter -import xsbti.compile.CompileAnalysis +import xsbti.compile.{ CompileAnalysis, Inputs } import xsbti.{ CompileFailed, Problem, Severity } object BspCompileTask { - def start( targetId: BuildTargetIdentifier, project: ProjectRef, - config: Configuration + config: Configuration, + inputs: Inputs ): BspCompileTask = { val taskId = TaskId(BuildServerTasks.uniqueId, Vector()) val targetName = BuildTargetName.fromScope(project.project, config.name) - val task = BspCompileTask(targetId, targetName, taskId, System.currentTimeMillis()) + val task = BspCompileTask(targetId, targetName, taskId, inputs, System.currentTimeMillis()) task.notifyStart() task } @@ -33,6 +35,7 @@ case class BspCompileTask private ( targetId: BuildTargetIdentifier, targetName: String, id: sbt.internal.bsp.TaskId, + inputs: Inputs, startTimeMillis: Long ) { import sbt.internal.bsp.codec.JsonProtocol._ @@ -50,7 +53,8 @@ case class BspCompileTask private ( val elapsedTimeMillis = endTimeMillis - startTimeMillis val sourceInfos = analysis.readSourceInfos().getAllSourceInfos.asScala val problems = sourceInfos.values.flatMap(_.getReportedProblems).toSeq - val report = compileReport(problems, elapsedTimeMillis) + val isNoOp = InterfaceUtil.toOption(inputs.previousResult.analysis).map(_ == analysis) + val report = compileReport(problems, elapsedTimeMillis, isNoOp) val params = TaskFinishParams( id, endTimeMillis, @@ -83,7 +87,7 @@ case class BspCompileTask private ( val endTimeMillis = System.currentTimeMillis() val elapsedTimeMillis = endTimeMillis - startTimeMillis val problems = cause.map(_.problems().toSeq).getOrElse(Seq.empty[Problem]) - val report = compileReport(problems, elapsedTimeMillis) + val report = compileReport(problems, elapsedTimeMillis, None) val params = TaskFinishParams( id, endTimeMillis, @@ -95,10 +99,14 @@ case class BspCompileTask private ( StandardMain.exchange.notifyEvent("build/taskFinish", params) } - private def compileReport(problems: Seq[Problem], elapsedTimeMillis: Long): CompileReport = { - val countBySeverity = problems.groupBy(_.severity).view.mapValues(_.size) + private def compileReport( + problems: Seq[Problem], + elapsedTimeMillis: Long, + isNoOp: Option[Boolean] + ): CompileReport = { + val countBySeverity = problems.groupBy(_.severity()).view.mapValues(_.size).toMap val warnings = countBySeverity.getOrElse(Severity.Warn, 0) val errors = countBySeverity.getOrElse(Severity.Error, 0) - CompileReport(targetId, None, errors, warnings, Some(elapsedTimeMillis.toInt)) + CompileReport(targetId, None, errors, warnings, Some(elapsedTimeMillis.toInt), isNoOp) } } diff --git a/main/src/main/scala/sbt/internal/server/BuildServerEvalReporter.scala b/main/src/main/scala/sbt/internal/server/BuildServerEvalReporter.scala index 95210f80f..731e89e55 100644 --- a/main/src/main/scala/sbt/internal/server/BuildServerEvalReporter.scala +++ b/main/src/main/scala/sbt/internal/server/BuildServerEvalReporter.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala b/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala index 3e29b1fe6..0298bab85 100644 --- a/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala +++ b/main/src/main/scala/sbt/internal/server/BuildServerProtocol.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -33,7 +34,6 @@ import sjsonnew.shaded.scalajson.ast.unsafe.{ JNull, JValue } import sjsonnew.support.scalajson.unsafe.{ CompactPrinter, Converter, Parser => JsonParser } import xsbti.CompileFailed -import java.nio.file.Path import java.io.File import java.util.concurrent.atomic.AtomicBoolean import scala.collection.mutable @@ -42,6 +42,9 @@ import scala.util.control.NonFatal import scala.util.{ Try, Failure, Success } import scala.annotation.nowarn import sbt.testing.Framework +import scala.collection.immutable.ListSet +import xsbti.VirtualFileRef +import java.util.concurrent.atomic.AtomicReference object BuildServerProtocol { import sbt.internal.bsp.codec.JsonProtocol._ @@ -216,12 +219,26 @@ object BuildServerProtocol { state.value.respondEvent(result) }.evaluated, bspBuildTargetScalacOptions / aggregate := false, - bspBuildTargetJVMRunEnvironment := bspInputTask { (_, filter) => - val items = bspBuildTargetJvmEnvironmentItem.result.all(filter).value - val successfulItems = anyOrThrow(items) - val result = JvmRunEnvironmentResult(successfulItems.toVector, None) + bspBuildTargetJavacOptions := bspInputTask { (workspace, filter) => + val items = bspBuildTargetJavacOptionsItem.result.all(filter).value + val appProvider = appConfiguration.value.provider() + val sbtJars = appProvider.mainClasspath() + val buildItems = workspace.builds.map { case (targetId, build) => + Result.Value(javacOptionsBuildItem(sbtJars, targetId, build)) + } + val successfulItems = anyOrThrow(items ++ buildItems) + val result = JavacOptionsResult(successfulItems.toVector) state.value.respondEvent(result) }.evaluated, + bspBuildTargetJavacOptions / aggregate := false, + bspScalaTestClasses := bspInputTask { (workspace, filter) => + val s = state.value + workspace.warnIfBuildsNonEmpty(Method.ScalaTestClasses, s.log) + val items = bspScalaTestClassesItem.result.all(filter).value + val successfulItems = anyOrThrow(items).flatten.toVector + val result = ScalaTestClassesResult(successfulItems.toVector, None) + s.respondEvent(result) + }.evaluated, bspBuildTargetJVMRunEnvironment / aggregate := false, bspBuildTargetJVMTestEnvironment := bspInputTask { (_, filter) => val items = bspBuildTargetJvmEnvironmentItem.result.all(filter).value @@ -289,7 +306,32 @@ object BuildServerProtocol { }, bspBuildTargetCompileItem := bspCompileTask.value, bspBuildTargetRun := bspRunTask.evaluated, - bspBuildTargetScalacOptionsItem := scalacOptionsTask.value, + bspBuildTargetScalacOptionsItem := { + val target = Keys.bspTargetIdentifier.value + val scalacOptions = Keys.scalacOptions.value.toVector + val classDirectory = Keys.classDirectory.value + val classpath = classpathTask.value + ScalacOptionsItem(target, scalacOptions, classpath, classDirectory.toURI) + }, + bspBuildTargetJavacOptionsItem := { + val target = Keys.bspTargetIdentifier.value + val javacOptions = Keys.javacOptions.value.toVector + val classDirectory = Keys.classDirectory.value + val classpath = classpathTask.value + JavacOptionsItem(target, javacOptions, classpath, classDirectory.toURI) + }, + bspBuildTargetJVMRunEnvironment := bspInputTask { (_, filter) => + val items = bspBuildTargetJvmEnvironmentItem.result.all(filter).value + val successfulItems = anyOrThrow(items) + val result = JvmRunEnvironmentResult(successfulItems.toVector, None) + state.value.respondEvent(result) + }.evaluated, + bspBuildTargetJVMTestEnvironment := bspInputTask { (_, filter) => + val items = bspBuildTargetJvmEnvironmentItem.result.all(filter).value + val successfulItems = anyOrThrow(items) + val result = JvmTestEnvironmentResult(successfulItems.toVector, None) + state.value.respondEvent(result) + }.evaluated, bspBuildTargetJvmEnvironmentItem := jvmEnvironmentItem().value, bspInternalDependencyConfigurations := internalDependencyConfigurationsSetting.value, bspScalaTestClassesItem := scalaTestClassesTask.value, @@ -301,11 +343,13 @@ object BuildServerProtocol { val underlying = (Keys.compile / compilerReporter).value val logger = streams.value.log val meta = isMetaBuild.value + val spms = sourcePositionMappers.value if (bspEnabled.value) { new BuildServerReporterImpl( targetId, bspCompileStateInstance, converter, + Defaults.foldMappers(spms, reportAbsolutePath.value, fileConverter.value), meta, logger, underlying @@ -315,7 +359,7 @@ object BuildServerProtocol { } } ) - private object Method { + private[sbt] object Method { final val Initialize = "build/initialize" final val BuildTargets = "workspace/buildTargets" final val Reload = "workspace/reload" @@ -685,13 +729,44 @@ object BuildServerProtocol { ) } + private def scalacOptionsBuildItem( + sbtJars: Seq[File], + targetId: BuildTargetIdentifier, + build: LoadedBuildUnit + ): ScalacOptionsItem = { + val plugins: LoadedPlugins = build.unit.plugins + val scalacOptions = plugins.pluginData.scalacOptions.toVector + val converter = plugins.pluginData.converter + val classpath = + plugins.classpath.map(f => converter.toPath(f).toFile.toURI).toVector ++ + sbtJars.map(_.toURI).toVector + val classDirectory = new File(build.localBase, "project/target").toURI + val item = ScalacOptionsItem(targetId, scalacOptions, classpath, classDirectory) + item + } + + private def javacOptionsBuildItem( + sbtJars: Array[File], + targetId: BuildTargetIdentifier, + build: LoadedBuildUnit + ): JavacOptionsItem = { + val plugins: LoadedPlugins = build.unit.plugins + val javacOptions = plugins.pluginData.javacOptions.toVector + val converter = plugins.pluginData.converter + val classpath = + plugins.classpath.map(f => converter.toPath(f).toFile.toURI).toVector ++ + sbtJars.map(_.toURI).toVector + val classDirectory = new File(build.localBase, "project/target").toURI + val item = JavacOptionsItem(targetId, javacOptions, classpath, classDirectory) + item + } + private inline def bspInputTask[T]( inline taskImpl: (BspFullWorkspace, ScopeFilter) => T ): Def.Initialize[InputTask[T]] = Def .input(_ => targetIdentifierParser) .flatMapTask { targets => - val s = state.value val workspace: BspFullWorkspace = bspFullWorkspace.value.filter(targets) val filter = ScopeFilter.in(workspace.scopes.values.toList) Def.task(taskImpl(workspace, filter)) @@ -762,6 +837,20 @@ object BuildServerProtocol { } } + private lazy val classpathTask: Def.Initialize[Task[Vector[URI]]] = Def.taskDyn { + val converter = fileConverter.value + val externalDependencyClasspath = Keys.externalDependencyClasspath.value + .map(f => converter.toPath(f.data).toFile.toURI) + val internalDependencyClasspath = for { + (ref, configs) <- bspInternalDependencyConfigurations.value + config <- configs + } yield ref / config / Keys.classDirectory + Def.task { + internalDependencyClasspath.join.value.distinct.map(_.toURI).toVector ++ + externalDependencyClasspath + } + } + private def dependencySourcesItemTask: Def.Initialize[Task[DependencySourcesItem]] = Def.task { val targetId = Keys.bspTargetIdentifier.value val updateReport = Keys.updateClassifiers.value @@ -941,7 +1030,8 @@ object BuildServerProtocol { allDependencies .groupBy(_._1) .mapValues { deps => - deps.flatMap { case (_, configs) => configs }.toSet + // We use a list set to maintain the order of configs + ListSet(deps.flatMap { case (_, configs) => configs }: _*) } .toSeq } @@ -1061,17 +1151,25 @@ object BuildServerProtocol { /** * Additional information about compilation status for given build target. - * - * @param hasAnyProblems keeps track of problems in given file so BSP reporter - * can omit unnecessary diagnostics updates. - * @param compiledAtLeastOnce keeps track of those projects that were compiled at - * least once so that we can decide to enable fresh reporting for projects that - * are compiled for the first time. - * see: https://github.com/scalacenter/bloop/issues/726 */ private[server] final class BspCompileState { - val hasAnyProblems: java.util.Set[Path] = - java.util.concurrent.ConcurrentHashMap.newKeySet[Path] - val compiledAtLeastOnce: AtomicBoolean = new AtomicBoolean(false) + + /** + * keeps track of problems in a given file in a map of virtual source file to text documents. + * In most cases the only text document is the source file. In case of source generation, + * e.g. Twirl, the text documents are the input files, e.g. the Twirl files. + * We use the sourcePositionMappers to build this map. + */ + val problemsBySourceFiles + : AtomicReference[Map[VirtualFileRef, Vector[TextDocumentIdentifier]]] = + new AtomicReference(Map.empty) + + /** + * keeps track of those projects that were compiled at + * least once so that we can decide to enable fresh reporting for projects that + * are compiled for the first time. + * see: https://github.com/scalacenter/bloop/issues/726 + */ + val isFirstReport: AtomicBoolean = new AtomicBoolean(true) } } diff --git a/main/src/main/scala/sbt/internal/server/BuildServerReporter.scala b/main/src/main/scala/sbt/internal/server/BuildServerReporter.scala index 823a04a6a..3b796a408 100644 --- a/main/src/main/scala/sbt/internal/server/BuildServerReporter.scala +++ b/main/src/main/scala/sbt/internal/server/BuildServerReporter.scala @@ -1,14 +1,13 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ package sbt.internal.server -import java.nio.file.Path - import sbt.StandardMain import sbt.internal.bsp._ import sbt.internal.util.ManagedLogger @@ -27,6 +26,9 @@ import xsbti.{ import scala.jdk.CollectionConverters.* import scala.collection.mutable +/** + * Provides methods for sending success and failure reports and publishing diagnostics. + */ sealed trait BuildServerReporter extends Reporter { private final val sigFilesWritten = "[sig files written]" private final val pureExpression = "a pure expression does nothing in statement position" @@ -68,10 +70,16 @@ sealed trait BuildServerReporter extends Reporter { override def comment(pos: XPosition, msg: String): Unit = underlying.comment(pos, msg) } +/** + * @param bspCompileState what has already been reported in previous compilation. + * @param sourcePositionMapper a function that maps an xsbti.Position from the generated source + * (the Scala file) to the input file of the generator (e.g. Twirl file) + */ final class BuildServerReporterImpl( buildTarget: BuildTargetIdentifier, bspCompileState: BspCompileState, converter: FileConverter, + sourcePositionMapper: xsbti.Position => xsbti.Position, protected override val isMetaBuild: Boolean, protected override val logger: ManagedLogger, protected override val underlying: Reporter @@ -80,13 +88,13 @@ final class BuildServerReporterImpl( import sbt.internal.inc.JavaInterfaceUtil._ private lazy val exchange = StandardMain.exchange - private val problemsByFile = mutable.Map[Path, Vector[Diagnostic]]() + private val problemsByFile = mutable.Map[VirtualFileRef, Vector[Problem]]() // sometimes the compiler returns a fake position such as // on Windows, this causes InvalidPathException (see #5994 and #6720) - private def toSafePath(ref: VirtualFileRef): Option[Path] = + private def toDocument(ref: VirtualFileRef): Option[TextDocumentIdentifier] = if (ref.id().contains("<")) None - else Some(converter.toPath(ref)) + else Some(TextDocumentIdentifier(converter.toPath(ref).toUri)) /** * Send diagnostics from the compilation to the client. @@ -94,65 +102,42 @@ final class BuildServerReporterImpl( * * @param analysis current compile analysis */ - override def sendSuccessReport( - analysis: CompileAnalysis, - ): Unit = { - val shouldReportAllProblems = !bspCompileState.compiledAtLeastOnce.getAndSet(true) - for { - (source, infos) <- analysis.readSourceInfos.getAllSourceInfos.asScala - filePath <- toSafePath(source) - } { - // clear problems for current file - val hadProblems = bspCompileState.hasAnyProblems.remove(filePath) + override def sendSuccessReport(analysis: CompileAnalysis): Unit = { + for ((source, infos) <- analysis.readSourceInfos.getAllSourceInfos.asScala) { + val problems = infos.getReportedProblems.toVector + sendReport(source, problems) + } + notifyFirstReport() + } - val reportedProblems = infos.getReportedProblems.toVector - val diagnostics = reportedProblems.flatMap(toDiagnostic) - - // publish diagnostics if: - // 1. file had any problems previously - we might want to update them with new ones - // 2. file has fresh problems - we might want to update old ones - // 3. build project is compiled first time - shouldReportAllProblems is set - val shouldPublish = hadProblems || diagnostics.nonEmpty || shouldReportAllProblems - - // file can have some warnings - if (diagnostics.nonEmpty) { - bspCompileState.hasAnyProblems.add(filePath) - } - - if (shouldPublish) { - val params = PublishDiagnosticsParams( - textDocument = TextDocumentIdentifier(filePath.toUri), - buildTarget, - originId = None, - diagnostics.toVector, - reset = true - ) - exchange.notifyEvent("build/publishDiagnostics", params) - } + override def sendFailureReport(sources: Array[VirtualFile]): Unit = { + for (source <- sources) { + val problems = problemsByFile.getOrElse(source, Vector.empty) + sendReport(source, problems) } } - override def sendFailureReport(sources: Array[VirtualFile]): Unit = { - val shouldReportAllProblems = !bspCompileState.compiledAtLeastOnce.get - for { - source <- sources - filePath <- toSafePath(source) - } { - val diagnostics = problemsByFile.getOrElse(filePath, Vector.empty) - val hadProblems = bspCompileState.hasAnyProblems.remove(filePath) - val shouldPublish = hadProblems || diagnostics.nonEmpty || shouldReportAllProblems + private def sendReport(source: VirtualFileRef, problems: Vector[Problem]): Unit = { + val oldDocuments = getAndClearPreviousDocuments(source) - // mark file as file with problems - if (diagnostics.nonEmpty) { - bspCompileState.hasAnyProblems.add(filePath) - } + // publish diagnostics if: + // 1. file had any problems previously: update them with new ones + // 2. file has fresh problems: report them + // 3. build project is compiled for the first time: send success report + if (oldDocuments.nonEmpty || problems.nonEmpty || isFirstReport) { + val diagsByDocuments = problems + .flatMap(mapProblemToDiagnostic) + .groupMap((document, _) => document)((_, diag) => diag) + updateNewDocuments(source, diagsByDocuments.keys.toVector) - if (shouldPublish) { + // send a report for the new documents, the old ones and the source file + (diagsByDocuments.keySet ++ oldDocuments ++ toDocument(source)).foreach { document => + val diags = diagsByDocuments.getOrElse(document, Vector.empty) val params = PublishDiagnosticsParams( - textDocument = TextDocumentIdentifier(filePath.toUri), + document, buildTarget, originId = None, - diagnostics, + diags, reset = true ) exchange.notifyEvent("build/publishDiagnostics", params) @@ -163,12 +148,13 @@ final class BuildServerReporterImpl( protected override def publishDiagnostic(problem: Problem): Unit = { for { id <- problem.position.sourcePath.toOption - diagnostic <- toDiagnostic(problem) - filePath <- toSafePath(VirtualFileRef.of(id)) + (document, diagnostic) <- mapProblemToDiagnostic(problem) } { - problemsByFile(filePath) = problemsByFile.getOrElse(filePath, Vector.empty) :+ diagnostic + val fileRef = VirtualFileRef.of(id) + problemsByFile(fileRef) = problemsByFile.getOrElse(fileRef, Vector.empty) :+ problem + val params = PublishDiagnosticsParams( - TextDocumentIdentifier(filePath.toUri), + document, buildTarget, originId = None, Vector(diagnostic), @@ -178,34 +164,62 @@ final class BuildServerReporterImpl( } } - private def toDiagnostic(problem: Problem): Option[Diagnostic] = { - val pos = problem.position - for { - line <- pos.line.toOption.map(_.toLong - 1L) - pointer <- pos.pointer.toOption.map(_.toLong) - } yield { - val range = ( - pos.startLine.toOption, - pos.startColumn.toOption, - pos.endLine.toOption, - pos.endColumn.toOption - ) match { - case (Some(sl), Some(sc), Some(el), Some(ec)) => - Range(Position(sl.toLong - 1, sc.toLong), Position(el.toLong - 1, ec.toLong)) - case _ => - Range(Position(line, pointer), Position(line, pointer + 1)) - } + private def getAndClearPreviousDocuments(source: VirtualFileRef): Seq[TextDocumentIdentifier] = + bspCompileState.problemsBySourceFiles.getAndUpdate(_ - source).getOrElse(source, Seq.empty) - Diagnostic( - range, + private def updateNewDocuments( + source: VirtualFileRef, + documents: Vector[TextDocumentIdentifier] + ): Unit = { + val _ = bspCompileState.problemsBySourceFiles.updateAndGet(_ + (source -> documents)) + } + + private def isFirstReport: Boolean = bspCompileState.isFirstReport.get + private def notifyFirstReport(): Unit = { + val _ = bspCompileState.isFirstReport.set(false) + } + + /** + * Map a given problem, in a Scala source file, to a Diagnostic in an user-facing source file. + * E.g. if the source file is generated from Twirl, the diagnostic will be reported to the Twirl file. + */ + private def mapProblemToDiagnostic( + problem: Problem + ): Option[(TextDocumentIdentifier, Diagnostic)] = { + val mappedPosition = sourcePositionMapper(problem.position) + for { + mappedSource <- mappedPosition.sourcePath.toOption + document <- toDocument(VirtualFileRef.of(mappedSource)) + } yield { + val diagnostic = Diagnostic( + toRange(mappedPosition), Option(toDiagnosticSeverity(problem.severity)), problem.diagnosticCode().toOption.map(_.code), Option("sbt"), problem.message ) + (document, diagnostic) } } + private def toRange(position: xsbti.Position): Range = { + val startLineOpt = position.startLine.toOption.map(_.toLong - 1) + val startColumnOpt = position.startColumn.toOption.map(_.toLong) + val endLineOpt = position.endLine.toOption.map(_.toLong - 1) + val endColumnOpt = position.endColumn.toOption.map(_.toLong) + val lineOpt = position.line.toOption.map(_.toLong - 1) + val columnOpt = position.pointer.toOption.map(_.toLong) + + def toPosition(lineOpt: Option[Long], columnOpt: Option[Long]): Option[Position] = + lineOpt.map(line => Position(line, columnOpt.getOrElse(0L))) + + val startPos = toPosition(startLineOpt, startColumnOpt) + .orElse(toPosition(lineOpt, columnOpt)) + .getOrElse(Position(0L, 0L)) + val endPosOpt = toPosition(endLineOpt, endColumnOpt) + Range(startPos, endPosOpt.getOrElse(startPos)) + } + private def toDiagnosticSeverity(severity: Severity): Long = severity match { case Severity.Info => DiagnosticSeverity.Information case Severity.Warn => DiagnosticSeverity.Warning diff --git a/main/src/main/scala/sbt/internal/server/Definition.scala b/main/src/main/scala/sbt/internal/server/Definition.scala index 4b92e29b5..8768f5871 100644 --- a/main/src/main/scala/sbt/internal/server/Definition.scala +++ b/main/src/main/scala/sbt/internal/server/Definition.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -22,7 +23,7 @@ import sjsonnew.JsonFormat import sjsonnew.shaded.scalajson.ast.unsafe.JValue import sjsonnew.support.scalajson.unsafe.{ CompactPrinter, Converter } -import sbt.internal.inc.{ Analysis, MixedAnalyzingCompiler } +import sbt.internal.inc.Analysis import sbt.internal.inc.JavaInterfaceUtil._ import sbt.internal.parser.SbtParser import sbt.internal.protocol.JsonRpcResponseError @@ -162,11 +163,19 @@ private[sbt] object Definition { } private[this] val AnalysesKey = "lsp.definition.analyses.key" - private[server] type Analyses = Set[((String, Boolean), Option[Analysis])] + private[server] type Analyses = Set[((String, Boolean, Boolean), Option[Analysis])] - private def storeAnalysis(cacheFile: Path, useBinary: Boolean): Option[Analysis] = - MixedAnalyzingCompiler - .staticCachedStore(cacheFile, !useBinary) + private def storeAnalysis( + cacheFile: Path, + useBinary: Boolean, + useConsistent: Boolean, + ): Option[Analysis] = + AnalysisUtil + .staticCachedStore( + analysisFile = cacheFile, + useTextAnalysis = !useBinary, + useConsistent = useConsistent, + ) .get .toOption .map { _.getAnalysis } @@ -174,13 +183,13 @@ private[sbt] object Definition { private[sbt] def updateCache( cache: Cache[String, Analyses] - )(cacheFile: String, useBinary: Boolean): Any = { - cache.get(AnalysesKey, k => Set(cacheFile -> useBinary -> None)) match { + )(cacheFile: String, useBinary: Boolean, useConsistent: Boolean): Any = { + cache.get(AnalysesKey, k => Set((cacheFile, useBinary, useConsistent) -> None)) match { case null => new AnyRef case set => val newSet = set - .filterNot { case ((file, _), _) => file == cacheFile } - .+(cacheFile -> useBinary -> None) + .filterNot { case ((file, _, _), _) => file == cacheFile } + .+((cacheFile, useBinary, useConsistent) -> None) cache.put(AnalysesKey, newSet) } } @@ -200,10 +209,13 @@ private[sbt] object Definition { def collectAnalysesTask = Def.task { val cacheFile: String = compileAnalysisFile.value.getAbsolutePath - val useBinary = enableBinaryCompileAnalysis.value val s = state.value - s.log.debug(s"analysis location ${cacheFile -> useBinary}") - updateCache(AnalysesAccess.cache)(cacheFile, useBinary) + s.log.debug(s"analysis location ${cacheFile}") + updateCache(AnalysesAccess.cache)( + cacheFile = cacheFile, + useBinary = enableBinaryCompileAnalysis.value, + useConsistent = enableConsistentCompileAnalysis.value, + ) } private[sbt] def getAnalyses: Future[Seq[Analysis]] = { @@ -222,8 +234,9 @@ private[sbt] object Definition { case (_, None) => false } val addToCache = uninitialized.collect { - case (title @ (file, useBinary), _) if Files.exists(Paths.get(file)) => - (title, storeAnalysis(Paths.get(file), !useBinary)) + case (title @ (file, useBinary, useConsistent), _) + if Files.exists(Paths.get(file)) => + (title, storeAnalysis(Paths.get(file), !useBinary, useConsistent)) } val validCaches = working ++ addToCache if (addToCache.nonEmpty) { diff --git a/main/src/main/scala/sbt/internal/server/LanguageServerProtocol.scala b/main/src/main/scala/sbt/internal/server/LanguageServerProtocol.scala index c21b88764..f38f0a30f 100644 --- a/main/src/main/scala/sbt/internal/server/LanguageServerProtocol.scala +++ b/main/src/main/scala/sbt/internal/server/LanguageServerProtocol.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/server/NetworkChannel.scala b/main/src/main/scala/sbt/internal/server/NetworkChannel.scala index 942ef4de5..0b30f1a2e 100644 --- a/main/src/main/scala/sbt/internal/server/NetworkChannel.scala +++ b/main/src/main/scala/sbt/internal/server/NetworkChannel.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/server/SettingQuery.scala b/main/src/main/scala/sbt/internal/server/SettingQuery.scala index 1d6005e99..b768eddd3 100644 --- a/main/src/main/scala/sbt/internal/server/SettingQuery.scala +++ b/main/src/main/scala/sbt/internal/server/SettingQuery.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/internal/server/VirtualTerminal.scala b/main/src/main/scala/sbt/internal/server/VirtualTerminal.scala index 177373a1e..7423ce5a9 100644 --- a/main/src/main/scala/sbt/internal/server/VirtualTerminal.scala +++ b/main/src/main/scala/sbt/internal/server/VirtualTerminal.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/nio/CheckBuildSources.scala b/main/src/main/scala/sbt/nio/CheckBuildSources.scala index 1c96e949c..a04cd8ac1 100644 --- a/main/src/main/scala/sbt/nio/CheckBuildSources.scala +++ b/main/src/main/scala/sbt/nio/CheckBuildSources.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/nio/FileChanges.scala b/main/src/main/scala/sbt/nio/FileChanges.scala index 66329caad..a35139f26 100644 --- a/main/src/main/scala/sbt/nio/FileChanges.scala +++ b/main/src/main/scala/sbt/nio/FileChanges.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -22,7 +23,7 @@ import java.nio.file.Path * @param modified the files that have been modified. This should be empty when no previous list of * files is available. * @param unmodified the files that have no changes. This should be empty when no previous list of - * files is availab.e + * files is available */ final case class FileChanges( created: Seq[Path], diff --git a/main/src/main/scala/sbt/nio/FileStamp.scala b/main/src/main/scala/sbt/nio/FileStamp.scala index 3146f92f5..4194c9dc2 100644 --- a/main/src/main/scala/sbt/nio/FileStamp.scala +++ b/main/src/main/scala/sbt/nio/FileStamp.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/nio/Keys.scala b/main/src/main/scala/sbt/nio/Keys.scala index a06179452..a851448ca 100644 --- a/main/src/main/scala/sbt/nio/Keys.scala +++ b/main/src/main/scala/sbt/nio/Keys.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/nio/Settings.scala b/main/src/main/scala/sbt/nio/Settings.scala index f2e7488d6..98d7b6551 100644 --- a/main/src/main/scala/sbt/nio/Settings.scala +++ b/main/src/main/scala/sbt/nio/Settings.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/nio/Watch.scala b/main/src/main/scala/sbt/nio/Watch.scala index 88799d656..ab32086ac 100644 --- a/main/src/main/scala/sbt/nio/Watch.scala +++ b/main/src/main/scala/sbt/nio/Watch.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/plugins/CorePlugin.scala b/main/src/main/scala/sbt/plugins/CorePlugin.scala index c0ea66a10..3df867643 100644 --- a/main/src/main/scala/sbt/plugins/CorePlugin.scala +++ b/main/src/main/scala/sbt/plugins/CorePlugin.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/plugins/DependencyTreeKeys.scala b/main/src/main/scala/sbt/plugins/DependencyTreeKeys.scala index 5268941ef..71ea74c5c 100644 --- a/main/src/main/scala/sbt/plugins/DependencyTreeKeys.scala +++ b/main/src/main/scala/sbt/plugins/DependencyTreeKeys.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -45,7 +46,7 @@ abstract class DependencyTreeKeys { "The boxes of nodes are painted with colors. Otherwise they're black." ) val dependencyDotNodeLabel = settingKey[(String, String, String) => String]( - "Returns a formated string of a dependency. Takes organization, name and version as parameters" + "Returns a formatted string of a dependency. Takes organization, name and version as parameters" ) val dependencyDotHeader = settingKey[String]( "The header of the dot file. (e.g. to set your preferred node shapes)" diff --git a/main/src/main/scala/sbt/plugins/DependencyTreeSettings.scala b/main/src/main/scala/sbt/plugins/DependencyTreeSettings.scala index 43a5de1d4..65b75f59a 100644 --- a/main/src/main/scala/sbt/plugins/DependencyTreeSettings.scala +++ b/main/src/main/scala/sbt/plugins/DependencyTreeSettings.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -136,7 +137,7 @@ object DependencyTreeSettings { versionFilter match { case Some(version) => GraphModuleId(org, name, version) :: Nil case None => - graph.nodes.filter(m => m.id.organization == org && m.id.name == name).map(_.id) + graph.nodes.withFilter(m => m.id.organization == org && m.id.name == name).map(_.id) } val graphWidth = asciiGraphWidth.value val output = @@ -243,7 +244,7 @@ object DependencyTreeSettings { def openBrowser(uriKey: TaskKey[URI]) = Def.task { val uri = uriKey.value - streams.value.log.info("Opening in browser...") + streams.value.log.info(s"Opening ${uri} in browser...") java.awt.Desktop.getDesktop.browse(uri) uri } diff --git a/main/src/main/scala/sbt/plugins/Giter8TemplatePlugin.scala b/main/src/main/scala/sbt/plugins/Giter8TemplatePlugin.scala index 26d901d2e..51e60575b 100644 --- a/main/src/main/scala/sbt/plugins/Giter8TemplatePlugin.scala +++ b/main/src/main/scala/sbt/plugins/Giter8TemplatePlugin.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -26,7 +27,7 @@ object Giter8TemplatePlugin extends AutoPlugin { ModuleID( "org.scala-sbt.sbt-giter8-resolver", "sbt-giter8-resolver", - "0.15.0" + "0.16.2" ) cross CrossVersion.binary, "sbtgiter8resolver.Giter8TemplateResolver" ) diff --git a/main/src/main/scala/sbt/plugins/IvyPlugin.scala b/main/src/main/scala/sbt/plugins/IvyPlugin.scala index a459e1fa3..da877a72a 100644 --- a/main/src/main/scala/sbt/plugins/IvyPlugin.scala +++ b/main/src/main/scala/sbt/plugins/IvyPlugin.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/plugins/JUnitXmlReportPlugin.scala b/main/src/main/scala/sbt/plugins/JUnitXmlReportPlugin.scala index 30034d39c..d8eaa593b 100644 --- a/main/src/main/scala/sbt/plugins/JUnitXmlReportPlugin.scala +++ b/main/src/main/scala/sbt/plugins/JUnitXmlReportPlugin.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -18,6 +19,7 @@ import sbt.ProjectExtra.inConfig import sbt.internal._ import sbt.io.syntax._ import sbt.librarymanagement.Configurations.{ IntegrationTest, Test } +import scala.annotation.nowarn /** * An experimental plugin that adds the ability for junit-xml to be generated. @@ -50,6 +52,7 @@ object JUnitXmlReportPlugin extends AutoPlugin { import autoImport._ + @nowarn override lazy val projectSettings: Seq[Setting[_]] = inConfig(Test)(testReportSettings) ++ inConfig(IntegrationTest)(testReportSettings) diff --git a/main/src/main/scala/sbt/plugins/JvmPlugin.scala b/main/src/main/scala/sbt/plugins/JvmPlugin.scala index be930f5e5..e4b134d33 100644 --- a/main/src/main/scala/sbt/plugins/JvmPlugin.scala +++ b/main/src/main/scala/sbt/plugins/JvmPlugin.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/plugins/MiniDependencyTreePlugin.scala b/main/src/main/scala/sbt/plugins/MiniDependencyTreePlugin.scala index 701079fe5..d1d05f96d 100644 --- a/main/src/main/scala/sbt/plugins/MiniDependencyTreePlugin.scala +++ b/main/src/main/scala/sbt/plugins/MiniDependencyTreePlugin.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/plugins/SbtPlugin.scala b/main/src/main/scala/sbt/plugins/SbtPlugin.scala index 3572972f7..c38d34b76 100644 --- a/main/src/main/scala/sbt/plugins/SbtPlugin.scala +++ b/main/src/main/scala/sbt/plugins/SbtPlugin.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala b/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala index 3e7ed185e..453754a0a 100644 --- a/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala +++ b/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -26,7 +27,7 @@ object SemanticdbPlugin extends AutoPlugin { semanticdbEnabled := SysProp.semanticdb, semanticdbIncludeInJar := false, semanticdbOptions := List(), - semanticdbVersion := "4.5.13" + semanticdbVersion := "4.7.8" ) override lazy val projectSettings: Seq[Def.Setting[_]] = Seq( diff --git a/main/src/test/scala/BuildPathsTest.scala b/main/src/test/scala/BuildPathsTest.scala index 0fe69ab13..b4f37906f 100644 --- a/main/src/test/scala/BuildPathsTest.scala +++ b/main/src/test/scala/BuildPathsTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/ClasspathsTest.scala b/main/src/test/scala/ClasspathsTest.scala index ff155199c..278191bbe 100644 --- a/main/src/test/scala/ClasspathsTest.scala +++ b/main/src/test/scala/ClasspathsTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/DefaultsTest.scala b/main/src/test/scala/DefaultsTest.scala index fa73a5795..3e02ac0c8 100644 --- a/main/src/test/scala/DefaultsTest.scala +++ b/main/src/test/scala/DefaultsTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/Delegates.scala b/main/src/test/scala/Delegates.scala index 2bdb03df5..036272639 100644 --- a/main/src/test/scala/Delegates.scala +++ b/main/src/test/scala/Delegates.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/ParseKeySpec.scala b/main/src/test/scala/ParseKeySpec.scala index 57363a767..885538c26 100644 --- a/main/src/test/scala/ParseKeySpec.scala +++ b/main/src/test/scala/ParseKeySpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/ParserSpec.scala b/main/src/test/scala/ParserSpec.scala index d0309fe85..5a72e76ef 100644 --- a/main/src/test/scala/ParserSpec.scala +++ b/main/src/test/scala/ParserSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/PluginCommandTest.scala b/main/src/test/scala/PluginCommandTest.scala index f2cb823b6..06e1cc7c5 100644 --- a/main/src/test/scala/PluginCommandTest.scala +++ b/main/src/test/scala/PluginCommandTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/PluginsTest.scala b/main/src/test/scala/PluginsTest.scala index d4c1bbaaf..243fbe7e8 100644 --- a/main/src/test/scala/PluginsTest.scala +++ b/main/src/test/scala/PluginsTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -48,7 +49,7 @@ object PluginsTest extends verify.BasicTestSuite { assertEquals( s"""Contradiction in enabled plugins: - requested: sbt.AI$$S - - enabled: sbt.AI$$S, sbt.AI$$Q, sbt.AI$$R, sbt.AI$$B, sbt.AI$$A + - enabled: sbt.AI$$A, sbt.AI$$B, sbt.AI$$Q, sbt.AI$$R, sbt.AI$$S - conflict: sbt.AI$$R is enabled by sbt.AI$$Q; excluded by sbt.AI$$S""", e.message ) @@ -63,8 +64,8 @@ object PluginsTest extends verify.BasicTestSuite { assertEquals( s"""Contradiction in enabled plugins: - requested: sbt.AI$$T && sbt.AI$$U - - enabled: sbt.AI$$U, sbt.AI$$T, sbt.AI$$A, sbt.AI$$Q, sbt.AI$$R, sbt.AI$$B - - conflict: sbt.AI$$Q is enabled by sbt.AI$$A && sbt.AI$$B; required by sbt.AI$$T, sbt.AI$$R; excluded by sbt.AI$$U + - enabled: sbt.AI$$A, sbt.AI$$B, sbt.AI$$Q, sbt.AI$$R, sbt.AI$$T, sbt.AI$$U + - conflict: sbt.AI$$Q is enabled by sbt.AI$$A && sbt.AI$$B; required by sbt.AI$$R, sbt.AI$$T; excluded by sbt.AI$$U - conflict: sbt.AI$$R is enabled by sbt.AI$$Q; excluded by sbt.AI$$T""", e.message ) diff --git a/main/src/test/scala/ProjectMacro.scala b/main/src/test/scala/ProjectMacro.scala index 5b5845b76..0c35b7e35 100644 --- a/main/src/test/scala/ProjectMacro.scala +++ b/main/src/test/scala/ProjectMacro.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/ProjectSpec.scala b/main/src/test/scala/ProjectSpec.scala index aa61bac9c..e6490d1aa 100644 --- a/main/src/test/scala/ProjectSpec.scala +++ b/main/src/test/scala/ProjectSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/TagsTest.scala b/main/src/test/scala/TagsTest.scala index 4a6414c54..071a69515 100644 --- a/main/src/test/scala/TagsTest.scala +++ b/main/src/test/scala/TagsTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/sbt/internal/AggregationSpec.scala b/main/src/test/scala/sbt/internal/AggregationSpec.scala index 727805d6b..0423cb22f 100644 --- a/main/src/test/scala/sbt/internal/AggregationSpec.scala +++ b/main/src/test/scala/sbt/internal/AggregationSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/sbt/internal/CrossJavaTest.scala b/main/src/test/scala/sbt/internal/CrossJavaTest.scala index c884c31c8..b8dc89248 100644 --- a/main/src/test/scala/sbt/internal/CrossJavaTest.scala +++ b/main/src/test/scala/sbt/internal/CrossJavaTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/sbt/internal/FileStampJsonSpec.scala b/main/src/test/scala/sbt/internal/FileStampJsonSpec.scala index bf0f127f3..ab6a8e192 100644 --- a/main/src/test/scala/sbt/internal/FileStampJsonSpec.scala +++ b/main/src/test/scala/sbt/internal/FileStampJsonSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/sbt/internal/GCMonitorTest.scala b/main/src/test/scala/sbt/internal/GCMonitorTest.scala index d646b88f1..60461fa8f 100644 --- a/main/src/test/scala/sbt/internal/GCMonitorTest.scala +++ b/main/src/test/scala/sbt/internal/GCMonitorTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/sbt/internal/InstallSbtnSpec.scala b/main/src/test/scala/sbt/internal/InstallSbtnSpec.scala index 392cc1fc9..a5d6b8cdc 100644 --- a/main/src/test/scala/sbt/internal/InstallSbtnSpec.scala +++ b/main/src/test/scala/sbt/internal/InstallSbtnSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -37,7 +38,7 @@ class InstallSbtnSpec extends AnyFlatSpec { "InstallSbtn" should "extract native sbtn" ignore withTemp(".zip") { tmp => withTemp(".exe") { sbtn => - InstallSbtn.extractSbtn(term, "1.4.1", tmp, sbtn) + InstallSbtn.extractSbtn(term, "1.9.0", tmp, sbtn) val tmpDir = Files.createTempDirectory("sbtn-test").toRealPath() Files.createDirectories(tmpDir.resolve("project")) val foo = tmpDir.resolve("foo") @@ -46,7 +47,7 @@ class InstallSbtnSpec extends AnyFlatSpec { IO.write(tmpDir.resolve("build.sbt").toFile, build) IO.write( tmpDir.resolve("project").resolve("build.properties").toFile, - "sbt.version=1.4.1" + "sbt.version=1.9.0" ) try { val proc = diff --git a/main/src/test/scala/sbt/internal/StressGCMonitor.scala b/main/src/test/scala/sbt/internal/StressGCMonitor.scala index 8566b21d1..8a4d245b7 100644 --- a/main/src/test/scala/sbt/internal/StressGCMonitor.scala +++ b/main/src/test/scala/sbt/internal/StressGCMonitor.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/sbt/internal/TestBuild.scala b/main/src/test/scala/sbt/internal/TestBuild.scala index b8f1f5886..85b833223 100644 --- a/main/src/test/scala/sbt/internal/TestBuild.scala +++ b/main/src/test/scala/sbt/internal/TestBuild.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/sbt/internal/graph/rendering/TreeViewTest.scala b/main/src/test/scala/sbt/internal/graph/rendering/TreeViewTest.scala index 6b291b4e3..705dd9dfc 100644 --- a/main/src/test/scala/sbt/internal/graph/rendering/TreeViewTest.scala +++ b/main/src/test/scala/sbt/internal/graph/rendering/TreeViewTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/sbt/internal/server/DefinitionTest.scala b/main/src/test/scala/sbt/internal/server/DefinitionTest.scala index f30260cf6..70818abbe 100644 --- a/main/src/test/scala/sbt/internal/server/DefinitionTest.scala +++ b/main/src/test/scala/sbt/internal/server/DefinitionTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -203,12 +204,13 @@ object DefinitionTest extends verify.BasicTestSuite { val cache = Caffeine.newBuilder().build[String, Definition.Analyses]() val cacheFile = "Test.scala" val useBinary = true + val useConsistent = true - Definition.updateCache(cache)(cacheFile, useBinary) + Definition.updateCache(cache)(cacheFile, useBinary, useConsistent) val actual = Definition.AnalysesAccess.getFrom(cache) - assert(actual.get.contains(("Test.scala" -> true -> None))) + assert(actual.get.contains((("Test.scala", true, true) -> None))) } test("it should replace cache data in cache") { @@ -216,13 +218,14 @@ object DefinitionTest extends verify.BasicTestSuite { val cacheFile = "Test.scala" val useBinary = true val falseUseBinary = false + val useConsistent = true - Definition.updateCache(cache)(cacheFile, falseUseBinary) - Definition.updateCache(cache)(cacheFile, useBinary) + Definition.updateCache(cache)(cacheFile, falseUseBinary, useConsistent) + Definition.updateCache(cache)(cacheFile, useBinary, useConsistent) val actual = Definition.AnalysesAccess.getFrom(cache) - assert(actual.get.contains(("Test.scala" -> true -> None))) + assert(actual.get.contains((("Test.scala", true, true) -> None))) } test("it should cache more data in cache") { @@ -231,15 +234,16 @@ object DefinitionTest extends verify.BasicTestSuite { val useBinary = true val otherCacheFile = "OtherTest.scala" val otherUseBinary = false + val useConsistent = true - Definition.updateCache(cache)(otherCacheFile, otherUseBinary) - Definition.updateCache(cache)(cacheFile, useBinary) + Definition.updateCache(cache)(otherCacheFile, otherUseBinary, useConsistent) + Definition.updateCache(cache)(cacheFile, useBinary, useConsistent) val actual = Definition.AnalysesAccess.getFrom(cache) assert( - actual.get.contains("Test.scala" -> true -> Option.empty[Analysis]) && - actual.get.contains("OtherTest.scala" -> false -> Option.empty[Analysis]) + actual.get.contains(("Test.scala", true, true) -> Option.empty[Analysis]) && + actual.get.contains(("OtherTest.scala", false, true) -> Option.empty[Analysis]) ) } } diff --git a/main/src/test/scala/sbt/internal/server/SettingQueryTest.scala b/main/src/test/scala/sbt/internal/server/SettingQueryTest.scala index dceaf5f88..e26444ba5 100644 --- a/main/src/test/scala/sbt/internal/server/SettingQueryTest.scala +++ b/main/src/test/scala/sbt/internal/server/SettingQueryTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/main/src/test/scala/testpkg/CompletionSpec.scala b/main/src/test/scala/testpkg/CompletionSpec.scala index ee364eb6f..ceb337819 100644 --- a/main/src/test/scala/testpkg/CompletionSpec.scala +++ b/main/src/test/scala/testpkg/CompletionSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/notes/1.1.0.markdown b/notes/1.1.0.markdown index 723c20c27..b7b951a56 100644 --- a/notes/1.1.0.markdown +++ b/notes/1.1.0.markdown @@ -44,7 +44,7 @@ - Adds a check for a change in sbt version before `reload`. [#1055][1055]/[#3673][3673] by [@RomanIakovlev][@RomanIakovlev] - Adds a new setting `insideCI`, which indicates that sbt is likely running in an Continuous Integration environment. [#3672][3672] by [@RomanIakovlev][@RomanIakovlev] - Adds `nameOption` to `Command` trait. [#3671][3671] by [@miklos-martin][@miklos-martin] -- Adds POSIX persmission operations in IO, such as `IO.chmod(..)`. [io#76][io76] by [@eed3si9n][@eed3si9n] +- Adds POSIX permission operations in IO, such as `IO.chmod(..)`. [io#76][io76] by [@eed3si9n][@eed3si9n] - Treat sbt 1 modules using Semantic Versioning in the eviction warning. [lm#188][lm188] by [@eed3si9n][@eed3si9n] - Uses kind-projector in the code. [#3650][3650] by [@dwijnand][@dwijnand] - Make `displayOnly` etc methods strict in `Completions`. [#3763][3763] by [@xuwei-k][@xuwei-k] diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 1b255422b..d12246e87 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -4,7 +4,7 @@ import sbt.contraband.ContrabandPlugin.autoImport._ object Dependencies { // WARNING: Please Scala update versions in PluginCross.scala too - val scala212 = "2.12.18" + val scala212 = "2.12.19" val scala213 = "2.13.12" val scala3 = "3.3.1" val checkPluginCross = settingKey[Unit]("Make sure scalaVersion match up") @@ -13,21 +13,21 @@ object Dependencies { sys.env.get("BUILD_VERSION") orElse sys.props.get("sbt.build.version") // sbt modules - private val ioVersion = nightlyVersion.getOrElse("1.8.0") + private val ioVersion = nightlyVersion.getOrElse("1.10.0") private val lmVersion = - sys.props.get("sbt.build.lm.version").orElse(nightlyVersion).getOrElse("2.0.0-alpha13") - val zincVersion = nightlyVersion.getOrElse("2.0.0-alpha13") + sys.props.get("sbt.build.lm.version").orElse(nightlyVersion).getOrElse("2.0.0-alpha16") + val zincVersion = nightlyVersion.getOrElse("2.0.0-alpha14") private val sbtIO = "org.scala-sbt" %% "io" % ioVersion private val libraryManagementCore = "org.scala-sbt" %% "librarymanagement-core" % lmVersion private val libraryManagementIvy = "org.scala-sbt" %% "librarymanagement-ivy" % lmVersion - val launcherVersion = "1.4.1" + val launcherVersion = "1.4.2" val launcherInterface = "org.scala-sbt" % "launcher-interface" % launcherVersion val rawLauncher = "org.scala-sbt" % "launcher" % launcherVersion val testInterface = "org.scala-sbt" % "test-interface" % "1.0" - val ipcSocket = "org.scala-sbt.ipcsocket" % "ipcsocket" % "1.5.0" + val ipcSocket = "org.scala-sbt.ipcsocket" % "ipcsocket" % "1.6.2" private val compilerInterface = "org.scala-sbt" % "compiler-interface" % zincVersion private val compilerClasspath = "org.scala-sbt" %% "zinc-classpath" % zincVersion @@ -78,7 +78,7 @@ object Dependencies { def addSbtZincCompileCore = addSbtModule(sbtZincPath, "zincCompileCore", zincCompileCore) // val lmCoursierShaded = "io.get-coursier" %% "lm-coursier-shaded" % "2.0.10" - val lmCoursierShaded = "org.scala-sbt" %% "librarymanagement-coursier" % "2.0.0-alpha7" + val lmCoursierShaded = "org.scala-sbt" %% "librarymanagement-coursier" % "2.0.0-alpha8" lazy val sjsonNewVersion = "0.14.0-M1" def sjsonNew(n: String) = Def.setting( @@ -93,14 +93,14 @@ object Dependencies { // JLine 3 version must be coordinated together with JAnsi version // and the JLine 2 fork version, which uses the same JAnsi val jline = - "org.scala-sbt.jline" % "jline" % "2.14.7-sbt-a1b0ffbb8f64bb820f4f84a0c07a0c0964507493" - val jline3Version = "3.19.0" + "org.scala-sbt.jline" % "jline" % "2.14.7-sbt-9c3b6aca11c57e339441442bbf58e550cdfecb79" + val jline3Version = "3.24.1" val jline3Terminal = "org.jline" % "jline-terminal" % jline3Version val jline3Jansi = "org.jline" % "jline-terminal-jansi" % jline3Version val jline3JNA = "org.jline" % "jline-terminal-jna" % jline3Version val jline3Reader = "org.jline" % "jline-reader" % jline3Version val jline3Builtins = "org.jline" % "jline-builtins" % jline3Version - val jansi = "org.fusesource.jansi" % "jansi" % "2.1.0" + val jansi = "org.fusesource.jansi" % "jansi" % "2.4.1" val scalatest = "org.scalatest" %% "scalatest" % "3.2.10" val scalacheck = "org.scalacheck" %% "scalacheck" % "1.15.4" val junit = "junit" % "junit" % "4.13.1" @@ -113,9 +113,9 @@ object Dependencies { val scalaXml = Def.setting( if (scalaBinaryVersion.value == "3") { - "org.scala-lang.modules" %% "scala-xml" % "2.1.0" + "org.scala-lang.modules" %% "scala-xml" % "2.2.0" } else { - "org.scala-lang.modules" %% "scala-xml" % "2.1.0" + "org.scala-lang.modules" %% "scala-xml" % "2.2.0" } ) val scalaParsers = Def.setting( diff --git a/project/Transform.scala b/project/Transform.scala index e6d61676d..2a83ca06c 100644 --- a/project/Transform.scala +++ b/project/Transform.scala @@ -2,27 +2,6 @@ import sbt._ import sbt.Keys._ object Transform { - private val conscriptConfigs = taskKey[Unit]("") - - def conscriptSettings(launch: Reference) = Seq( - conscriptConfigs := { - val sourceFile = (launch / Compile / managedResources).value - .find(_.getName == "sbt.boot.properties") - .getOrElse(sys.error("No managed boot.properties file.")) - val source = IO.readLines(sourceFile) - val conscriptBase = (Compile / sourceDirectory).value / "conscript" - IO.delete(conscriptBase) - val pairs = Seq( - "sbt.xMain" -> "xsbt", - "sbt.ScriptMain" -> "scalas", - "sbt.ConsoleMain" -> "screpl", - ) - for ((main, dir) <- pairs) { - val lines = source.map(l => if (l.trim.startsWith("class:")) s" class: $main" else l) - IO.writeLines(conscriptBase / dir / "launchconfig", lines) - } - }, - ) def configSettings = Seq( resourceGenerators += Def.task { diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/CompileReport.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/CompileReport.scala index 5eb2ac41a..1144cd8a3 100644 --- a/protocol/src/main/contraband-scala/sbt/internal/bsp/CompileReport.scala +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/CompileReport.scala @@ -10,28 +10,30 @@ package sbt.internal.bsp * @param errors The total number of reported errors compiling this target. * @param warnings The total number of reported warnings compiling the target. * @param time The total number of milliseconds it took to compile the target. + * @param noOp The compilation was a noOp compilation. */ final class CompileReport private ( val target: sbt.internal.bsp.BuildTargetIdentifier, val originId: Option[String], val errors: Int, val warnings: Int, - val time: Option[Int]) extends Serializable { + val time: Option[Int], + val noOp: Option[Boolean]) extends Serializable { override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match { - case x: CompileReport => (this.target == x.target) && (this.originId == x.originId) && (this.errors == x.errors) && (this.warnings == x.warnings) && (this.time == x.time) + case x: CompileReport => (this.target == x.target) && (this.originId == x.originId) && (this.errors == x.errors) && (this.warnings == x.warnings) && (this.time == x.time) && (this.noOp == x.noOp) case _ => false }) override def hashCode: Int = { - 37 * (37 * (37 * (37 * (37 * (37 * (17 + "sbt.internal.bsp.CompileReport".##) + target.##) + originId.##) + errors.##) + warnings.##) + time.##) + 37 * (37 * (37 * (37 * (37 * (37 * (37 * (17 + "sbt.internal.bsp.CompileReport".##) + target.##) + originId.##) + errors.##) + warnings.##) + time.##) + noOp.##) } override def toString: String = { - "CompileReport(" + target + ", " + originId + ", " + errors + ", " + warnings + ", " + time + ")" + "CompileReport(" + target + ", " + originId + ", " + errors + ", " + warnings + ", " + time + ", " + noOp + ")" } - private[this] def copy(target: sbt.internal.bsp.BuildTargetIdentifier = target, originId: Option[String] = originId, errors: Int = errors, warnings: Int = warnings, time: Option[Int] = time): CompileReport = { - new CompileReport(target, originId, errors, warnings, time) + private[this] def copy(target: sbt.internal.bsp.BuildTargetIdentifier = target, originId: Option[String] = originId, errors: Int = errors, warnings: Int = warnings, time: Option[Int] = time, noOp: Option[Boolean] = noOp): CompileReport = { + new CompileReport(target, originId, errors, warnings, time, noOp) } def withTarget(target: sbt.internal.bsp.BuildTargetIdentifier): CompileReport = { copy(target = target) @@ -54,9 +56,15 @@ final class CompileReport private ( def withTime(time: Int): CompileReport = { copy(time = Option(time)) } + def withNoOp(noOp: Option[Boolean]): CompileReport = { + copy(noOp = noOp) + } + def withNoOp(noOp: Boolean): CompileReport = { + copy(noOp = Option(noOp)) + } } object CompileReport { - def apply(target: sbt.internal.bsp.BuildTargetIdentifier, originId: Option[String], errors: Int, warnings: Int, time: Option[Int]): CompileReport = new CompileReport(target, originId, errors, warnings, time) - def apply(target: sbt.internal.bsp.BuildTargetIdentifier, originId: String, errors: Int, warnings: Int, time: Int): CompileReport = new CompileReport(target, Option(originId), errors, warnings, Option(time)) + def apply(target: sbt.internal.bsp.BuildTargetIdentifier, originId: Option[String], errors: Int, warnings: Int, time: Option[Int], noOp: Option[Boolean]): CompileReport = new CompileReport(target, originId, errors, warnings, time, noOp) + def apply(target: sbt.internal.bsp.BuildTargetIdentifier, originId: String, errors: Int, warnings: Int, time: Int, noOp: Boolean): CompileReport = new CompileReport(target, Option(originId), errors, warnings, Option(time), Option(noOp)) } diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/Diagnostic.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/Diagnostic.scala index a9e2dd10f..da46048cb 100644 --- a/protocol/src/main/contraband-scala/sbt/internal/bsp/Diagnostic.scala +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/Diagnostic.scala @@ -14,28 +14,37 @@ package sbt.internal.bsp * @param source A human-readable string describing the source of this diagnostic, e.g. 'typescript' or 'super lint'. * @param message The diagnostic's message. + * @param relatedInformation A list of related diagnostic information, e.g. when symbol-names within + a scope collide all definitions can be marked via this property. + * @param dataKind Kind of data to expect in the `data` field. If this field is not set, + the kind of data is not specified. + * @param data A data entry field. */ final class Diagnostic private ( val range: sbt.internal.bsp.Range, val severity: Option[Long], val code: Option[String], val source: Option[String], - val message: String) extends Serializable { - + val message: String, + val relatedInformation: Vector[sbt.internal.bsp.DiagnosticRelatedInformation], + val dataKind: Option[String], + val data: Option[sbt.internal.bsp.ScalaDiagnostic]) extends Serializable { + private def this(range: sbt.internal.bsp.Range, severity: Option[Long], code: Option[String], source: Option[String], message: String) = this(range, severity, code, source, message, Vector(), None, None) + private def this(range: sbt.internal.bsp.Range, severity: Option[Long], code: Option[String], source: Option[String], message: String, relatedInformation: Vector[sbt.internal.bsp.DiagnosticRelatedInformation]) = this(range, severity, code, source, message, relatedInformation, None, None) override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match { - case x: Diagnostic => (this.range == x.range) && (this.severity == x.severity) && (this.code == x.code) && (this.source == x.source) && (this.message == x.message) + case x: Diagnostic => (this.range == x.range) && (this.severity == x.severity) && (this.code == x.code) && (this.source == x.source) && (this.message == x.message) && (this.relatedInformation == x.relatedInformation) && (this.dataKind == x.dataKind) && (this.data == x.data) case _ => false }) override def hashCode: Int = { - 37 * (37 * (37 * (37 * (37 * (37 * (17 + "sbt.internal.bsp.Diagnostic".##) + range.##) + severity.##) + code.##) + source.##) + message.##) + 37 * (37 * (37 * (37 * (37 * (37 * (37 * (37 * (37 * (17 + "sbt.internal.bsp.Diagnostic".##) + range.##) + severity.##) + code.##) + source.##) + message.##) + relatedInformation.##) + dataKind.##) + data.##) } override def toString: String = { - "Diagnostic(" + range + ", " + severity + ", " + code + ", " + source + ", " + message + ")" + "Diagnostic(" + range + ", " + severity + ", " + code + ", " + source + ", " + message + ", " + relatedInformation + ", " + dataKind + ", " + data + ")" } - private[this] def copy(range: sbt.internal.bsp.Range = range, severity: Option[Long] = severity, code: Option[String] = code, source: Option[String] = source, message: String = message): Diagnostic = { - new Diagnostic(range, severity, code, source, message) + private[this] def copy(range: sbt.internal.bsp.Range = range, severity: Option[Long] = severity, code: Option[String] = code, source: Option[String] = source, message: String = message, relatedInformation: Vector[sbt.internal.bsp.DiagnosticRelatedInformation] = relatedInformation, dataKind: Option[String] = dataKind, data: Option[sbt.internal.bsp.ScalaDiagnostic] = data): Diagnostic = { + new Diagnostic(range, severity, code, source, message, relatedInformation, dataKind, data) } def withRange(range: sbt.internal.bsp.Range): Diagnostic = { copy(range = range) @@ -61,9 +70,28 @@ final class Diagnostic private ( def withMessage(message: String): Diagnostic = { copy(message = message) } + def withRelatedInformation(relatedInformation: Vector[sbt.internal.bsp.DiagnosticRelatedInformation]): Diagnostic = { + copy(relatedInformation = relatedInformation) + } + def withDataKind(dataKind: Option[String]): Diagnostic = { + copy(dataKind = dataKind) + } + def withDataKind(dataKind: String): Diagnostic = { + copy(dataKind = Option(dataKind)) + } + def withData(data: Option[sbt.internal.bsp.ScalaDiagnostic]): Diagnostic = { + copy(data = data) + } + def withData(data: sbt.internal.bsp.ScalaDiagnostic): Diagnostic = { + copy(data = Option(data)) + } } object Diagnostic { def apply(range: sbt.internal.bsp.Range, severity: Option[Long], code: Option[String], source: Option[String], message: String): Diagnostic = new Diagnostic(range, severity, code, source, message) def apply(range: sbt.internal.bsp.Range, severity: Long, code: String, source: String, message: String): Diagnostic = new Diagnostic(range, Option(severity), Option(code), Option(source), message) + def apply(range: sbt.internal.bsp.Range, severity: Option[Long], code: Option[String], source: Option[String], message: String, relatedInformation: Vector[sbt.internal.bsp.DiagnosticRelatedInformation]): Diagnostic = new Diagnostic(range, severity, code, source, message, relatedInformation) + def apply(range: sbt.internal.bsp.Range, severity: Long, code: String, source: String, message: String, relatedInformation: Vector[sbt.internal.bsp.DiagnosticRelatedInformation]): Diagnostic = new Diagnostic(range, Option(severity), Option(code), Option(source), message, relatedInformation) + def apply(range: sbt.internal.bsp.Range, severity: Option[Long], code: Option[String], source: Option[String], message: String, relatedInformation: Vector[sbt.internal.bsp.DiagnosticRelatedInformation], dataKind: Option[String], data: Option[sbt.internal.bsp.ScalaDiagnostic]): Diagnostic = new Diagnostic(range, severity, code, source, message, relatedInformation, dataKind, data) + def apply(range: sbt.internal.bsp.Range, severity: Long, code: String, source: String, message: String, relatedInformation: Vector[sbt.internal.bsp.DiagnosticRelatedInformation], dataKind: String, data: sbt.internal.bsp.ScalaDiagnostic): Diagnostic = new Diagnostic(range, Option(severity), Option(code), Option(source), message, relatedInformation, Option(dataKind), Option(data)) } diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/DiagnosticRelatedInformation.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/DiagnosticRelatedInformation.scala new file mode 100644 index 000000000..c048fba0c --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/DiagnosticRelatedInformation.scala @@ -0,0 +1,43 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp +/** + * Represents a related message and source code location for a diagnostic. + * This should be used to point to code locations that cause or are related to + * a diagnostics, e.g when duplicating a symbol in a scope. + * @param location The location of this related diagnostic information. + * @param message The message of this related diagnostic information. + */ +final class DiagnosticRelatedInformation private ( + val location: sbt.internal.bsp.Location, + val message: String) extends Serializable { + + + + override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match { + case x: DiagnosticRelatedInformation => (this.location == x.location) && (this.message == x.message) + case _ => false + }) + override def hashCode: Int = { + 37 * (37 * (37 * (17 + "sbt.internal.bsp.DiagnosticRelatedInformation".##) + location.##) + message.##) + } + override def toString: String = { + "DiagnosticRelatedInformation(" + location + ", " + message + ")" + } + private[this] def copy(location: sbt.internal.bsp.Location = location, message: String = message): DiagnosticRelatedInformation = { + new DiagnosticRelatedInformation(location, message) + } + def withLocation(location: sbt.internal.bsp.Location): DiagnosticRelatedInformation = { + copy(location = location) + } + def withMessage(message: String): DiagnosticRelatedInformation = { + copy(message = message) + } +} +object DiagnosticRelatedInformation { + + def apply(location: sbt.internal.bsp.Location, message: String): DiagnosticRelatedInformation = new DiagnosticRelatedInformation(location, message) +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/JavacOptionsItem.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/JavacOptionsItem.scala new file mode 100644 index 000000000..30157dfb5 --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/JavacOptionsItem.scala @@ -0,0 +1,57 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp +/** + * @param options Additional arguments to the compiler. + For example, -deprecation. + * @param classpath The dependency classpath for this target, must be + identical to what is passed as arguments to + the -classpath flag in the command line interface + of scalac. + * @param classDirectory The output directory for classfiles produced by this target + */ +final class JavacOptionsItem private ( + val target: sbt.internal.bsp.BuildTargetIdentifier, + val options: Vector[String], + val classpath: Vector[java.net.URI], + val classDirectory: Option[java.net.URI]) extends Serializable { + + + + override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match { + case x: JavacOptionsItem => (this.target == x.target) && (this.options == x.options) && (this.classpath == x.classpath) && (this.classDirectory == x.classDirectory) + case _ => false + }) + override def hashCode: Int = { + 37 * (37 * (37 * (37 * (37 * (17 + "sbt.internal.bsp.JavacOptionsItem".##) + target.##) + options.##) + classpath.##) + classDirectory.##) + } + override def toString: String = { + "JavacOptionsItem(" + target + ", " + options + ", " + classpath + ", " + classDirectory + ")" + } + private[this] def copy(target: sbt.internal.bsp.BuildTargetIdentifier = target, options: Vector[String] = options, classpath: Vector[java.net.URI] = classpath, classDirectory: Option[java.net.URI] = classDirectory): JavacOptionsItem = { + new JavacOptionsItem(target, options, classpath, classDirectory) + } + def withTarget(target: sbt.internal.bsp.BuildTargetIdentifier): JavacOptionsItem = { + copy(target = target) + } + def withOptions(options: Vector[String]): JavacOptionsItem = { + copy(options = options) + } + def withClasspath(classpath: Vector[java.net.URI]): JavacOptionsItem = { + copy(classpath = classpath) + } + def withClassDirectory(classDirectory: Option[java.net.URI]): JavacOptionsItem = { + copy(classDirectory = classDirectory) + } + def withClassDirectory(classDirectory: java.net.URI): JavacOptionsItem = { + copy(classDirectory = Option(classDirectory)) + } +} +object JavacOptionsItem { + + def apply(target: sbt.internal.bsp.BuildTargetIdentifier, options: Vector[String], classpath: Vector[java.net.URI], classDirectory: Option[java.net.URI]): JavacOptionsItem = new JavacOptionsItem(target, options, classpath, classDirectory) + def apply(target: sbt.internal.bsp.BuildTargetIdentifier, options: Vector[String], classpath: Vector[java.net.URI], classDirectory: java.net.URI): JavacOptionsItem = new JavacOptionsItem(target, options, classpath, Option(classDirectory)) +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/JavacOptionsParams.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/JavacOptionsParams.scala new file mode 100644 index 000000000..4cc1ebbe2 --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/JavacOptionsParams.scala @@ -0,0 +1,37 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp +/** + * Javac options + * The build target javac options request is sent from the client to the server + * to query for the list of compiler options necessary to compile in a given list of targets. + */ +final class JavacOptionsParams private ( + val targets: Vector[sbt.internal.bsp.BuildTargetIdentifier]) extends Serializable { + + + + override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match { + case x: JavacOptionsParams => (this.targets == x.targets) + case _ => false + }) + override def hashCode: Int = { + 37 * (37 * (17 + "sbt.internal.bsp.JavacOptionsParams".##) + targets.##) + } + override def toString: String = { + "JavacOptionsParams(" + targets + ")" + } + private[this] def copy(targets: Vector[sbt.internal.bsp.BuildTargetIdentifier] = targets): JavacOptionsParams = { + new JavacOptionsParams(targets) + } + def withTargets(targets: Vector[sbt.internal.bsp.BuildTargetIdentifier]): JavacOptionsParams = { + copy(targets = targets) + } +} +object JavacOptionsParams { + + def apply(targets: Vector[sbt.internal.bsp.BuildTargetIdentifier]): JavacOptionsParams = new JavacOptionsParams(targets) +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/JavacOptionsResult.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/JavacOptionsResult.scala new file mode 100644 index 000000000..fb89063b4 --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/JavacOptionsResult.scala @@ -0,0 +1,32 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp +final class JavacOptionsResult private ( + val items: Vector[sbt.internal.bsp.JavacOptionsItem]) extends Serializable { + + + + override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match { + case x: JavacOptionsResult => (this.items == x.items) + case _ => false + }) + override def hashCode: Int = { + 37 * (37 * (17 + "sbt.internal.bsp.JavacOptionsResult".##) + items.##) + } + override def toString: String = { + "JavacOptionsResult(" + items + ")" + } + private[this] def copy(items: Vector[sbt.internal.bsp.JavacOptionsItem] = items): JavacOptionsResult = { + new JavacOptionsResult(items) + } + def withItems(items: Vector[sbt.internal.bsp.JavacOptionsItem]): JavacOptionsResult = { + copy(items = items) + } +} +object JavacOptionsResult { + + def apply(items: Vector[sbt.internal.bsp.JavacOptionsItem]): JavacOptionsResult = new JavacOptionsResult(items) +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/Location.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/Location.scala new file mode 100644 index 000000000..1ee36e2be --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/Location.scala @@ -0,0 +1,37 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp +/** Represents a location inside a resource, such as a line inside a text file. */ +final class Location private ( + val uri: String, + val range: sbt.internal.bsp.Range) extends Serializable { + + + + override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match { + case x: Location => (this.uri == x.uri) && (this.range == x.range) + case _ => false + }) + override def hashCode: Int = { + 37 * (37 * (37 * (17 + "sbt.internal.bsp.Location".##) + uri.##) + range.##) + } + override def toString: String = { + "Location(" + uri + ", " + range + ")" + } + private[this] def copy(uri: String = uri, range: sbt.internal.bsp.Range = range): Location = { + new Location(uri, range) + } + def withUri(uri: String): Location = { + copy(uri = uri) + } + def withRange(range: sbt.internal.bsp.Range): Location = { + copy(range = range) + } +} +object Location { + + def apply(uri: String, range: sbt.internal.bsp.Range): Location = new Location(uri, range) +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaAction.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaAction.scala new file mode 100644 index 000000000..f608dbba9 --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaAction.scala @@ -0,0 +1,54 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp +/** + * A Scala action represents a change that can be performed in code. + * See also LSP: Code Action Request (https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_codeAction). + * @param title A short, human-readable, title for this code action. + * @param description A description that may be shown to the user client side to explain the action. + * @param edit The workspace edit this code action performs. + */ +final class ScalaAction private ( + val title: String, + val description: Option[String], + val edit: Option[sbt.internal.bsp.ScalaWorkspaceEdit]) extends Serializable { + + + + override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match { + case x: ScalaAction => (this.title == x.title) && (this.description == x.description) && (this.edit == x.edit) + case _ => false + }) + override def hashCode: Int = { + 37 * (37 * (37 * (37 * (17 + "sbt.internal.bsp.ScalaAction".##) + title.##) + description.##) + edit.##) + } + override def toString: String = { + "ScalaAction(" + title + ", " + description + ", " + edit + ")" + } + private[this] def copy(title: String = title, description: Option[String] = description, edit: Option[sbt.internal.bsp.ScalaWorkspaceEdit] = edit): ScalaAction = { + new ScalaAction(title, description, edit) + } + def withTitle(title: String): ScalaAction = { + copy(title = title) + } + def withDescription(description: Option[String]): ScalaAction = { + copy(description = description) + } + def withDescription(description: String): ScalaAction = { + copy(description = Option(description)) + } + def withEdit(edit: Option[sbt.internal.bsp.ScalaWorkspaceEdit]): ScalaAction = { + copy(edit = edit) + } + def withEdit(edit: sbt.internal.bsp.ScalaWorkspaceEdit): ScalaAction = { + copy(edit = Option(edit)) + } +} +object ScalaAction { + + def apply(title: String, description: Option[String], edit: Option[sbt.internal.bsp.ScalaWorkspaceEdit]): ScalaAction = new ScalaAction(title, description, edit) + def apply(title: String, description: String, edit: sbt.internal.bsp.ScalaWorkspaceEdit): ScalaAction = new ScalaAction(title, Option(description), Option(edit)) +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaDiagnostic.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaDiagnostic.scala new file mode 100644 index 000000000..8774922d7 --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaDiagnostic.scala @@ -0,0 +1,40 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp +/** + * ScalaDiagnostic is a data structure that contains Scala-specific + * metadata generated by Scala compilation. This metadata is + * embedded in the `data: Option[Json]` field of the Diagnostic definition, when + * the dataKind field contains "scala". + * @param actions Actions (also known as quick fixes) that are able to either fix or address + the issue that is causing this diagnostic. + */ +final class ScalaDiagnostic private ( + val actions: Vector[sbt.internal.bsp.ScalaAction]) extends Serializable { + + + + override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match { + case x: ScalaDiagnostic => (this.actions == x.actions) + case _ => false + }) + override def hashCode: Int = { + 37 * (37 * (17 + "sbt.internal.bsp.ScalaDiagnostic".##) + actions.##) + } + override def toString: String = { + "ScalaDiagnostic(" + actions + ")" + } + private[this] def copy(actions: Vector[sbt.internal.bsp.ScalaAction] = actions): ScalaDiagnostic = { + new ScalaDiagnostic(actions) + } + def withActions(actions: Vector[sbt.internal.bsp.ScalaAction]): ScalaDiagnostic = { + copy(actions = actions) + } +} +object ScalaDiagnostic { + + def apply(actions: Vector[sbt.internal.bsp.ScalaAction]): ScalaDiagnostic = new ScalaDiagnostic(actions) +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaTestClassesParams.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaTestClassesParams.scala index d7c4b9a39..c925139f2 100644 --- a/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaTestClassesParams.scala +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaTestClassesParams.scala @@ -7,7 +7,7 @@ package sbt.internal.bsp /** * Scala Test Class Request * The build target scala test options request is sent from the client to the server - * to query for the list of fully qualified names of test clases in a given list of targets. + * to query for the list of fully qualified names of test classes in a given list of targets. * @param originId An optional number uniquely identifying a client request. */ final class ScalaTestClassesParams private ( diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaTextEdit.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaTextEdit.scala new file mode 100644 index 000000000..33f7be6a3 --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaTextEdit.scala @@ -0,0 +1,43 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp +/** + * A textual edit applicable to a text document. + * @param range The range of the text document to be manipulated. To insert + text into a document create a range where start === end. + * @param newText The string to be inserted. For delete operations use an + empty string. + */ +final class ScalaTextEdit private ( + val range: sbt.internal.bsp.Range, + val newText: String) extends Serializable { + + + + override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match { + case x: ScalaTextEdit => (this.range == x.range) && (this.newText == x.newText) + case _ => false + }) + override def hashCode: Int = { + 37 * (37 * (37 * (17 + "sbt.internal.bsp.ScalaTextEdit".##) + range.##) + newText.##) + } + override def toString: String = { + "ScalaTextEdit(" + range + ", " + newText + ")" + } + private[this] def copy(range: sbt.internal.bsp.Range = range, newText: String = newText): ScalaTextEdit = { + new ScalaTextEdit(range, newText) + } + def withRange(range: sbt.internal.bsp.Range): ScalaTextEdit = { + copy(range = range) + } + def withNewText(newText: String): ScalaTextEdit = { + copy(newText = newText) + } +} +object ScalaTextEdit { + + def apply(range: sbt.internal.bsp.Range, newText: String): ScalaTextEdit = new ScalaTextEdit(range, newText) +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaWorkspaceEdit.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaWorkspaceEdit.scala new file mode 100644 index 000000000..6c6f59328 --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/ScalaWorkspaceEdit.scala @@ -0,0 +1,33 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp +/** A workspace edit represents changes to many resources managed in the workspace. */ +final class ScalaWorkspaceEdit private ( + val changes: Vector[sbt.internal.bsp.ScalaTextEdit]) extends Serializable { + + + + override def equals(o: Any): Boolean = this.eq(o.asInstanceOf[AnyRef]) || (o match { + case x: ScalaWorkspaceEdit => (this.changes == x.changes) + case _ => false + }) + override def hashCode: Int = { + 37 * (37 * (17 + "sbt.internal.bsp.ScalaWorkspaceEdit".##) + changes.##) + } + override def toString: String = { + "ScalaWorkspaceEdit(" + changes + ")" + } + private[this] def copy(changes: Vector[sbt.internal.bsp.ScalaTextEdit] = changes): ScalaWorkspaceEdit = { + new ScalaWorkspaceEdit(changes) + } + def withChanges(changes: Vector[sbt.internal.bsp.ScalaTextEdit]): ScalaWorkspaceEdit = { + copy(changes = changes) + } +} +object ScalaWorkspaceEdit { + + def apply(changes: Vector[sbt.internal.bsp.ScalaTextEdit]): ScalaWorkspaceEdit = new ScalaWorkspaceEdit(changes) +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/CompileReportFormats.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/CompileReportFormats.scala index 953258a86..dde3a3598 100644 --- a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/CompileReportFormats.scala +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/CompileReportFormats.scala @@ -16,8 +16,9 @@ implicit lazy val CompileReportFormat: JsonFormat[sbt.internal.bsp.CompileReport val errors = unbuilder.readField[Int]("errors") val warnings = unbuilder.readField[Int]("warnings") val time = unbuilder.readField[Option[Int]]("time") + val noOp = unbuilder.readField[Option[Boolean]]("noOp") unbuilder.endObject() - sbt.internal.bsp.CompileReport(target, originId, errors, warnings, time) + sbt.internal.bsp.CompileReport(target, originId, errors, warnings, time, noOp) case None => deserializationError("Expected JsObject but found None") } @@ -29,6 +30,7 @@ implicit lazy val CompileReportFormat: JsonFormat[sbt.internal.bsp.CompileReport builder.addField("errors", obj.errors) builder.addField("warnings", obj.warnings) builder.addField("time", obj.time) + builder.addField("noOp", obj.noOp) builder.endObject() } } diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/DiagnosticFormats.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/DiagnosticFormats.scala index 979054066..6a8fb8bff 100644 --- a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/DiagnosticFormats.scala +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/DiagnosticFormats.scala @@ -5,7 +5,7 @@ // DO NOT EDIT MANUALLY package sbt.internal.bsp.codec import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } -trait DiagnosticFormats { self: sbt.internal.bsp.codec.RangeFormats with sbt.internal.bsp.codec.PositionFormats with sjsonnew.BasicJsonProtocol => +trait DiagnosticFormats { self: sbt.internal.bsp.codec.RangeFormats with sbt.internal.bsp.codec.PositionFormats with sjsonnew.BasicJsonProtocol with sbt.internal.bsp.codec.DiagnosticRelatedInformationFormats with sbt.internal.bsp.codec.LocationFormats with sbt.internal.bsp.codec.ScalaDiagnosticFormats with sbt.internal.bsp.codec.ScalaActionFormats with sbt.internal.bsp.codec.ScalaWorkspaceEditFormats with sbt.internal.bsp.codec.ScalaTextEditFormats => implicit lazy val DiagnosticFormat: JsonFormat[sbt.internal.bsp.Diagnostic] = new JsonFormat[sbt.internal.bsp.Diagnostic] { override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.bsp.Diagnostic = { __jsOpt match { @@ -16,8 +16,11 @@ implicit lazy val DiagnosticFormat: JsonFormat[sbt.internal.bsp.Diagnostic] = ne val code = unbuilder.readField[Option[String]]("code") val source = unbuilder.readField[Option[String]]("source") val message = unbuilder.readField[String]("message") + val relatedInformation = unbuilder.readField[Vector[sbt.internal.bsp.DiagnosticRelatedInformation]]("relatedInformation") + val dataKind = unbuilder.readField[Option[String]]("dataKind") + val data = unbuilder.readField[Option[sbt.internal.bsp.ScalaDiagnostic]]("data") unbuilder.endObject() - sbt.internal.bsp.Diagnostic(range, severity, code, source, message) + sbt.internal.bsp.Diagnostic(range, severity, code, source, message, relatedInformation, dataKind, data) case None => deserializationError("Expected JsObject but found None") } @@ -29,6 +32,9 @@ implicit lazy val DiagnosticFormat: JsonFormat[sbt.internal.bsp.Diagnostic] = ne builder.addField("code", obj.code) builder.addField("source", obj.source) builder.addField("message", obj.message) + builder.addField("relatedInformation", obj.relatedInformation) + builder.addField("dataKind", obj.dataKind) + builder.addField("data", obj.data) builder.endObject() } } diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/DiagnosticRelatedInformationFormats.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/DiagnosticRelatedInformationFormats.scala new file mode 100644 index 000000000..b4271dbcd --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/DiagnosticRelatedInformationFormats.scala @@ -0,0 +1,29 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp.codec +import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } +trait DiagnosticRelatedInformationFormats { self: sbt.internal.bsp.codec.LocationFormats with sbt.internal.bsp.codec.RangeFormats with sbt.internal.bsp.codec.PositionFormats with sjsonnew.BasicJsonProtocol => +implicit lazy val DiagnosticRelatedInformationFormat: JsonFormat[sbt.internal.bsp.DiagnosticRelatedInformation] = new JsonFormat[sbt.internal.bsp.DiagnosticRelatedInformation] { + override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.bsp.DiagnosticRelatedInformation = { + __jsOpt match { + case Some(__js) => + unbuilder.beginObject(__js) + val location = unbuilder.readField[sbt.internal.bsp.Location]("location") + val message = unbuilder.readField[String]("message") + unbuilder.endObject() + sbt.internal.bsp.DiagnosticRelatedInformation(location, message) + case None => + deserializationError("Expected JsObject but found None") + } + } + override def write[J](obj: sbt.internal.bsp.DiagnosticRelatedInformation, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("location", obj.location) + builder.addField("message", obj.message) + builder.endObject() + } +} +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JavacOptionsItemFormats.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JavacOptionsItemFormats.scala new file mode 100644 index 000000000..2605a99dc --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JavacOptionsItemFormats.scala @@ -0,0 +1,33 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp.codec +import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } +trait JavacOptionsItemFormats { self: sbt.internal.bsp.codec.BuildTargetIdentifierFormats with sjsonnew.BasicJsonProtocol => +implicit lazy val JavacOptionsItemFormat: JsonFormat[sbt.internal.bsp.JavacOptionsItem] = new JsonFormat[sbt.internal.bsp.JavacOptionsItem] { + override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.bsp.JavacOptionsItem = { + __jsOpt match { + case Some(__js) => + unbuilder.beginObject(__js) + val target = unbuilder.readField[sbt.internal.bsp.BuildTargetIdentifier]("target") + val options = unbuilder.readField[Vector[String]]("options") + val classpath = unbuilder.readField[Vector[java.net.URI]]("classpath") + val classDirectory = unbuilder.readField[Option[java.net.URI]]("classDirectory") + unbuilder.endObject() + sbt.internal.bsp.JavacOptionsItem(target, options, classpath, classDirectory) + case None => + deserializationError("Expected JsObject but found None") + } + } + override def write[J](obj: sbt.internal.bsp.JavacOptionsItem, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("target", obj.target) + builder.addField("options", obj.options) + builder.addField("classpath", obj.classpath) + builder.addField("classDirectory", obj.classDirectory) + builder.endObject() + } +} +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JavacOptionsParamsFormats.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JavacOptionsParamsFormats.scala new file mode 100644 index 000000000..91bd41177 --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JavacOptionsParamsFormats.scala @@ -0,0 +1,27 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp.codec +import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } +trait JavacOptionsParamsFormats { self: sbt.internal.bsp.codec.BuildTargetIdentifierFormats with sjsonnew.BasicJsonProtocol => +implicit lazy val JavacOptionsParamsFormat: JsonFormat[sbt.internal.bsp.JavacOptionsParams] = new JsonFormat[sbt.internal.bsp.JavacOptionsParams] { + override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.bsp.JavacOptionsParams = { + __jsOpt match { + case Some(__js) => + unbuilder.beginObject(__js) + val targets = unbuilder.readField[Vector[sbt.internal.bsp.BuildTargetIdentifier]]("targets") + unbuilder.endObject() + sbt.internal.bsp.JavacOptionsParams(targets) + case None => + deserializationError("Expected JsObject but found None") + } + } + override def write[J](obj: sbt.internal.bsp.JavacOptionsParams, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("targets", obj.targets) + builder.endObject() + } +} +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JavacOptionsResultFormats.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JavacOptionsResultFormats.scala new file mode 100644 index 000000000..a3f054618 --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JavacOptionsResultFormats.scala @@ -0,0 +1,27 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp.codec +import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } +trait JavacOptionsResultFormats { self: sbt.internal.bsp.codec.JavacOptionsItemFormats with sbt.internal.bsp.codec.BuildTargetIdentifierFormats with sjsonnew.BasicJsonProtocol => +implicit lazy val JavacOptionsResultFormat: JsonFormat[sbt.internal.bsp.JavacOptionsResult] = new JsonFormat[sbt.internal.bsp.JavacOptionsResult] { + override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.bsp.JavacOptionsResult = { + __jsOpt match { + case Some(__js) => + unbuilder.beginObject(__js) + val items = unbuilder.readField[Vector[sbt.internal.bsp.JavacOptionsItem]]("items") + unbuilder.endObject() + sbt.internal.bsp.JavacOptionsResult(items) + case None => + deserializationError("Expected JsObject but found None") + } + } + override def write[J](obj: sbt.internal.bsp.JavacOptionsResult, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("items", obj.items) + builder.endObject() + } +} +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JsonProtocol.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JsonProtocol.scala index fc9784914..a918c0d06 100644 --- a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JsonProtocol.scala +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/JsonProtocol.scala @@ -15,6 +15,12 @@ trait JsonProtocol extends sjsonnew.BasicJsonProtocol with sbt.internal.bsp.codec.TextDocumentIdentifierFormats with sbt.internal.bsp.codec.PositionFormats with sbt.internal.bsp.codec.RangeFormats + with sbt.internal.bsp.codec.LocationFormats + with sbt.internal.bsp.codec.DiagnosticRelatedInformationFormats + with sbt.internal.bsp.codec.ScalaTextEditFormats + with sbt.internal.bsp.codec.ScalaWorkspaceEditFormats + with sbt.internal.bsp.codec.ScalaActionFormats + with sbt.internal.bsp.codec.ScalaDiagnosticFormats with sbt.internal.bsp.codec.DiagnosticFormats with sbt.internal.bsp.codec.BuildClientCapabilitiesFormats with sbt.internal.bsp.codec.InitializeBuildParamsFormats @@ -51,10 +57,13 @@ trait JsonProtocol extends sjsonnew.BasicJsonProtocol with sbt.internal.bsp.codec.RunParamsFormats with sbt.internal.bsp.codec.RunResultFormats with sbt.internal.bsp.codec.ScalaBuildTargetFormats - with sbt.internal.bsp.codec.SbtBuildTargetFormats with sbt.internal.bsp.codec.ScalacOptionsParamsFormats with sbt.internal.bsp.codec.ScalacOptionsItemFormats with sbt.internal.bsp.codec.ScalacOptionsResultFormats + with sbt.internal.bsp.codec.JavacOptionsParamsFormats + with sbt.internal.bsp.codec.JavacOptionsItemFormats + with sbt.internal.bsp.codec.JavacOptionsResultFormats + with sbt.internal.bsp.codec.SbtBuildTargetFormats with sbt.internal.bsp.codec.BspConnectionDetailsFormats with sbt.internal.bsp.codec.MetalsMetadataFormats with sbt.internal.bsp.codec.ScalaTestClassesItemFormats diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/LocationFormats.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/LocationFormats.scala new file mode 100644 index 000000000..e6fb63912 --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/LocationFormats.scala @@ -0,0 +1,29 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp.codec +import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } +trait LocationFormats { self: sbt.internal.bsp.codec.RangeFormats with sbt.internal.bsp.codec.PositionFormats with sjsonnew.BasicJsonProtocol => +implicit lazy val LocationFormat: JsonFormat[sbt.internal.bsp.Location] = new JsonFormat[sbt.internal.bsp.Location] { + override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.bsp.Location = { + __jsOpt match { + case Some(__js) => + unbuilder.beginObject(__js) + val uri = unbuilder.readField[String]("uri") + val range = unbuilder.readField[sbt.internal.bsp.Range]("range") + unbuilder.endObject() + sbt.internal.bsp.Location(uri, range) + case None => + deserializationError("Expected JsObject but found None") + } + } + override def write[J](obj: sbt.internal.bsp.Location, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("uri", obj.uri) + builder.addField("range", obj.range) + builder.endObject() + } +} +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/PublishDiagnosticsParamsFormats.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/PublishDiagnosticsParamsFormats.scala index ed047b33e..d8bf69965 100644 --- a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/PublishDiagnosticsParamsFormats.scala +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/PublishDiagnosticsParamsFormats.scala @@ -5,7 +5,7 @@ // DO NOT EDIT MANUALLY package sbt.internal.bsp.codec import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } -trait PublishDiagnosticsParamsFormats { self: sbt.internal.bsp.codec.TextDocumentIdentifierFormats with sjsonnew.BasicJsonProtocol with sbt.internal.bsp.codec.BuildTargetIdentifierFormats with sbt.internal.bsp.codec.DiagnosticFormats with sbt.internal.bsp.codec.RangeFormats with sbt.internal.bsp.codec.PositionFormats => +trait PublishDiagnosticsParamsFormats { self: sbt.internal.bsp.codec.TextDocumentIdentifierFormats with sjsonnew.BasicJsonProtocol with sbt.internal.bsp.codec.BuildTargetIdentifierFormats with sbt.internal.bsp.codec.DiagnosticFormats with sbt.internal.bsp.codec.RangeFormats with sbt.internal.bsp.codec.PositionFormats with sbt.internal.bsp.codec.DiagnosticRelatedInformationFormats with sbt.internal.bsp.codec.LocationFormats with sbt.internal.bsp.codec.ScalaDiagnosticFormats with sbt.internal.bsp.codec.ScalaActionFormats with sbt.internal.bsp.codec.ScalaWorkspaceEditFormats with sbt.internal.bsp.codec.ScalaTextEditFormats => implicit lazy val PublishDiagnosticsParamsFormat: JsonFormat[sbt.internal.bsp.PublishDiagnosticsParams] = new JsonFormat[sbt.internal.bsp.PublishDiagnosticsParams] { override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.bsp.PublishDiagnosticsParams = { __jsOpt match { diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/ScalaActionFormats.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/ScalaActionFormats.scala new file mode 100644 index 000000000..9262da34c --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/ScalaActionFormats.scala @@ -0,0 +1,31 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp.codec +import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } +trait ScalaActionFormats { self: sbt.internal.bsp.codec.ScalaWorkspaceEditFormats with sbt.internal.bsp.codec.ScalaTextEditFormats with sbt.internal.bsp.codec.RangeFormats with sbt.internal.bsp.codec.PositionFormats with sjsonnew.BasicJsonProtocol => +implicit lazy val ScalaActionFormat: JsonFormat[sbt.internal.bsp.ScalaAction] = new JsonFormat[sbt.internal.bsp.ScalaAction] { + override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.bsp.ScalaAction = { + __jsOpt match { + case Some(__js) => + unbuilder.beginObject(__js) + val title = unbuilder.readField[String]("title") + val description = unbuilder.readField[Option[String]]("description") + val edit = unbuilder.readField[Option[sbt.internal.bsp.ScalaWorkspaceEdit]]("edit") + unbuilder.endObject() + sbt.internal.bsp.ScalaAction(title, description, edit) + case None => + deserializationError("Expected JsObject but found None") + } + } + override def write[J](obj: sbt.internal.bsp.ScalaAction, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("title", obj.title) + builder.addField("description", obj.description) + builder.addField("edit", obj.edit) + builder.endObject() + } +} +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/ScalaDiagnosticFormats.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/ScalaDiagnosticFormats.scala new file mode 100644 index 000000000..e5f1d0dbf --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/ScalaDiagnosticFormats.scala @@ -0,0 +1,27 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp.codec +import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } +trait ScalaDiagnosticFormats { self: sbt.internal.bsp.codec.ScalaActionFormats with sbt.internal.bsp.codec.ScalaWorkspaceEditFormats with sbt.internal.bsp.codec.ScalaTextEditFormats with sbt.internal.bsp.codec.RangeFormats with sbt.internal.bsp.codec.PositionFormats with sjsonnew.BasicJsonProtocol => +implicit lazy val ScalaDiagnosticFormat: JsonFormat[sbt.internal.bsp.ScalaDiagnostic] = new JsonFormat[sbt.internal.bsp.ScalaDiagnostic] { + override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.bsp.ScalaDiagnostic = { + __jsOpt match { + case Some(__js) => + unbuilder.beginObject(__js) + val actions = unbuilder.readField[Vector[sbt.internal.bsp.ScalaAction]]("actions") + unbuilder.endObject() + sbt.internal.bsp.ScalaDiagnostic(actions) + case None => + deserializationError("Expected JsObject but found None") + } + } + override def write[J](obj: sbt.internal.bsp.ScalaDiagnostic, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("actions", obj.actions) + builder.endObject() + } +} +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/ScalaTextEditFormats.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/ScalaTextEditFormats.scala new file mode 100644 index 000000000..9ffda9946 --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/ScalaTextEditFormats.scala @@ -0,0 +1,29 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp.codec +import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } +trait ScalaTextEditFormats { self: sbt.internal.bsp.codec.RangeFormats with sbt.internal.bsp.codec.PositionFormats with sjsonnew.BasicJsonProtocol => +implicit lazy val ScalaTextEditFormat: JsonFormat[sbt.internal.bsp.ScalaTextEdit] = new JsonFormat[sbt.internal.bsp.ScalaTextEdit] { + override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.bsp.ScalaTextEdit = { + __jsOpt match { + case Some(__js) => + unbuilder.beginObject(__js) + val range = unbuilder.readField[sbt.internal.bsp.Range]("range") + val newText = unbuilder.readField[String]("newText") + unbuilder.endObject() + sbt.internal.bsp.ScalaTextEdit(range, newText) + case None => + deserializationError("Expected JsObject but found None") + } + } + override def write[J](obj: sbt.internal.bsp.ScalaTextEdit, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("range", obj.range) + builder.addField("newText", obj.newText) + builder.endObject() + } +} +} diff --git a/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/ScalaWorkspaceEditFormats.scala b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/ScalaWorkspaceEditFormats.scala new file mode 100644 index 000000000..b439045cc --- /dev/null +++ b/protocol/src/main/contraband-scala/sbt/internal/bsp/codec/ScalaWorkspaceEditFormats.scala @@ -0,0 +1,27 @@ +/** + * This code is generated using [[https://www.scala-sbt.org/contraband/ sbt-contraband]]. + */ + +// DO NOT EDIT MANUALLY +package sbt.internal.bsp.codec +import _root_.sjsonnew.{ Unbuilder, Builder, JsonFormat, deserializationError } +trait ScalaWorkspaceEditFormats { self: sbt.internal.bsp.codec.ScalaTextEditFormats with sbt.internal.bsp.codec.RangeFormats with sbt.internal.bsp.codec.PositionFormats with sjsonnew.BasicJsonProtocol => +implicit lazy val ScalaWorkspaceEditFormat: JsonFormat[sbt.internal.bsp.ScalaWorkspaceEdit] = new JsonFormat[sbt.internal.bsp.ScalaWorkspaceEdit] { + override def read[J](__jsOpt: Option[J], unbuilder: Unbuilder[J]): sbt.internal.bsp.ScalaWorkspaceEdit = { + __jsOpt match { + case Some(__js) => + unbuilder.beginObject(__js) + val changes = unbuilder.readField[Vector[sbt.internal.bsp.ScalaTextEdit]]("changes") + unbuilder.endObject() + sbt.internal.bsp.ScalaWorkspaceEdit(changes) + case None => + deserializationError("Expected JsObject but found None") + } + } + override def write[J](obj: sbt.internal.bsp.ScalaWorkspaceEdit, builder: Builder[J]): Unit = { + builder.beginObject() + builder.addField("changes", obj.changes) + builder.endObject() + } +} +} diff --git a/protocol/src/main/contraband/bsp.contra b/protocol/src/main/contraband/bsp.contra index b5a7a6738..393d21b2b 100644 --- a/protocol/src/main/contraband/bsp.contra +++ b/protocol/src/main/contraband/bsp.contra @@ -116,6 +116,12 @@ type Range { end: sbt.internal.bsp.Position! } +## Represents a location inside a resource, such as a line inside a text file. +type Location { + uri: String! + range: sbt.internal.bsp.Range! +} + ## Represents a diagnostic, such as a compiler error or warning. ## Diagnostic objects are only valid in the scope of a resource. type Diagnostic { @@ -135,6 +141,67 @@ type Diagnostic { ## The diagnostic's message. message: String! + + ## A list of related diagnostic information, e.g. when symbol-names within + ## a scope collide all definitions can be marked via this property. + relatedInformation: [sbt.internal.bsp.DiagnosticRelatedInformation] @since("1.8.0") + + ## Kind of data to expect in the `data` field. If this field is not set, + ## the kind of data is not specified. + dataKind: String @since("1.9.0") + + ## A data entry field. + data: sbt.internal.bsp.ScalaDiagnostic @since("1.9.0") +} + +## Represents a related message and source code location for a diagnostic. +## This should be used to point to code locations that cause or are related to +## a diagnostics, e.g when duplicating a symbol in a scope. +type DiagnosticRelatedInformation { + ## The location of this related diagnostic information. + location: sbt.internal.bsp.Location! + + ## The message of this related diagnostic information. + message: String! +} + +## ScalaDiagnostic is a data structure that contains Scala-specific +## metadata generated by Scala compilation. This metadata is +## embedded in the `data: Option[Json]` field of the Diagnostic definition, when +## the dataKind field contains "scala". +type ScalaDiagnostic { + ## Actions (also known as quick fixes) that are able to either fix or address + ## the issue that is causing this diagnostic. + actions: [sbt.internal.bsp.ScalaAction] +} + +## A Scala action represents a change that can be performed in code. +## See also LSP: Code Action Request (https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_codeAction). +type ScalaAction { + ## A short, human-readable, title for this code action. + title: String! + + ## A description that may be shown to the user client side to explain the action. + description: String + + ## The workspace edit this code action performs. + edit: sbt.internal.bsp.ScalaWorkspaceEdit +} + +## A workspace edit represents changes to many resources managed in the workspace. +type ScalaWorkspaceEdit { + changes: [sbt.internal.bsp.ScalaTextEdit] +} + +## A textual edit applicable to a text document. +type ScalaTextEdit { + ## The range of the text document to be manipulated. To insert + ## text into a document create a range where start === end. + range: sbt.internal.bsp.Range! + + ## The string to be inserted. For delete operations use an + ## empty string. + newText: String! } ## Initialize Build Request @@ -473,6 +540,9 @@ type CompileReport { ## The total number of milliseconds it took to compile the target. time: Int + + ## The compilation was a noOp compilation. + noOp: Boolean } ## Test Request @@ -568,31 +638,6 @@ type ScalaBuildTarget { jars: [String]! } -# sbt Extension - -## Contains sbt-specific metadata for providing editor support for sbt build files. -## This metadata is embedded in the data: Option[Json] field of the BuildTarget definition -## when the dataKind field contains "sbt". -type SbtBuildTarget { - ## The sbt version. Useful to support version-dependent syntax. - sbtVersion: String! - - ## A sequence of Scala imports that are automatically imported in the sbt build files. - autoImports: [String]! - - ## The Scala build target describing the scala - ## version and scala jars used by this sbt version. - scalaBuildTarget: sbt.internal.bsp.ScalaBuildTarget! - - ## An optional parent if the target has an sbt meta project. - parent: sbt.internal.bsp.BuildTargetIdentifier - - ## The inverse of parent, list of targets that have this build target - ## defined as their parent. It can contain normal project targets or - ## sbt build targets if this target represents an sbt meta-meta build. - children: [sbt.internal.bsp.BuildTargetIdentifier]! -} - ## Scalac options ## The build target scalac options request is sent from the client to the server ## to query for the list of compiler options necessary to compile in a given list of targets. @@ -621,6 +666,61 @@ type ScalacOptionsItem { classDirectory: java.net.URI } +# Java Extension + +## Javac options +## The build target javac options request is sent from the client to the server +## to query for the list of compiler options necessary to compile in a given list of targets. +type JavacOptionsParams { + targets: [sbt.internal.bsp.BuildTargetIdentifier] +} + +type JavacOptionsResult { + items: [sbt.internal.bsp.JavacOptionsItem] +} + +type JavacOptionsItem { + target: sbt.internal.bsp.BuildTargetIdentifier! + + ## Additional arguments to the compiler. + ## For example, -deprecation. + options: [String] + + ## The dependency classpath for this target, must be + ## identical to what is passed as arguments to + ## the -classpath flag in the command line interface + ## of scalac. + classpath: [java.net.URI] + + ## The output directory for classfiles produced by this target + classDirectory: java.net.URI +} + +# sbt Extension + +## Contains sbt-specific metadata for providing editor support for sbt build files. +## This metadata is embedded in the data: Option[Json] field of the BuildTarget definition +## when the dataKind field contains "sbt". +type SbtBuildTarget { + ## The sbt version. Useful to support version-dependent syntax. + sbtVersion: String! + + ## A sequence of Scala imports that are automatically imported in the sbt build files. + autoImports: [String]! + + ## The Scala build target describing the scala + ## version and scala jars used by this sbt version. + scalaBuildTarget: sbt.internal.bsp.ScalaBuildTarget! + + ## An optional parent if the target has an sbt meta project. + parent: sbt.internal.bsp.BuildTargetIdentifier + + ## The inverse of parent, list of targets that have this build target + ## defined as their parent. It can contain normal project targets or + ## sbt build targets if this target represents an sbt meta-meta build. + children: [sbt.internal.bsp.BuildTargetIdentifier]! +} + ## https://build-server-protocol.github.io/docs/server-discovery.html type BspConnectionDetails { ## The name of the build tool @@ -658,7 +758,7 @@ type ScalaTestParams { ## Scala Test Class Request ## The build target scala test options request is sent from the client to the server -## to query for the list of fully qualified names of test clases in a given list of targets. +## to query for the list of fully qualified names of test classes in a given list of targets. type ScalaTestClassesParams { targets: [sbt.internal.bsp.BuildTargetIdentifier] diff --git a/protocol/src/main/scala/sbt/internal/bsp/BuildServerConnection.scala b/protocol/src/main/scala/sbt/internal/bsp/BuildServerConnection.scala index 623c5e9dc..65f9fe120 100644 --- a/protocol/src/main/scala/sbt/internal/bsp/BuildServerConnection.scala +++ b/protocol/src/main/scala/sbt/internal/bsp/BuildServerConnection.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/bsp/BuildServerTasks.scala b/protocol/src/main/scala/sbt/internal/bsp/BuildServerTasks.scala index 9a8737bf7..9861d116c 100644 --- a/protocol/src/main/scala/sbt/internal/bsp/BuildServerTasks.scala +++ b/protocol/src/main/scala/sbt/internal/bsp/BuildServerTasks.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/bsp/BuildTargetName.scala b/protocol/src/main/scala/sbt/internal/bsp/BuildTargetName.scala index 1c3307542..e17f78581 100644 --- a/protocol/src/main/scala/sbt/internal/bsp/BuildTargetName.scala +++ b/protocol/src/main/scala/sbt/internal/bsp/BuildTargetName.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/bsp/BuildTargetTag.scala b/protocol/src/main/scala/sbt/internal/bsp/BuildTargetTag.scala index fa1773f27..478208cb7 100644 --- a/protocol/src/main/scala/sbt/internal/bsp/BuildTargetTag.scala +++ b/protocol/src/main/scala/sbt/internal/bsp/BuildTargetTag.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/bsp/DiagnosticSeverity.scala b/protocol/src/main/scala/sbt/internal/bsp/DiagnosticSeverity.scala index 6f7797421..68358f8de 100644 --- a/protocol/src/main/scala/sbt/internal/bsp/DiagnosticSeverity.scala +++ b/protocol/src/main/scala/sbt/internal/bsp/DiagnosticSeverity.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/bsp/OutputPathItemKind.scala b/protocol/src/main/scala/sbt/internal/bsp/OutputPathItemKind.scala index 009cd036c..32cb64cf1 100644 --- a/protocol/src/main/scala/sbt/internal/bsp/OutputPathItemKind.scala +++ b/protocol/src/main/scala/sbt/internal/bsp/OutputPathItemKind.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/bsp/ScalaPlatform.scala b/protocol/src/main/scala/sbt/internal/bsp/ScalaPlatform.scala index ea1efffb5..158bd36d6 100644 --- a/protocol/src/main/scala/sbt/internal/bsp/ScalaPlatform.scala +++ b/protocol/src/main/scala/sbt/internal/bsp/ScalaPlatform.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/bsp/SourceItemKind.scala b/protocol/src/main/scala/sbt/internal/bsp/SourceItemKind.scala index 58f68655d..1b59754a6 100644 --- a/protocol/src/main/scala/sbt/internal/bsp/SourceItemKind.scala +++ b/protocol/src/main/scala/sbt/internal/bsp/SourceItemKind.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/bsp/StatusCode.scala b/protocol/src/main/scala/sbt/internal/bsp/StatusCode.scala index a5b75971f..65085f7a0 100644 --- a/protocol/src/main/scala/sbt/internal/bsp/StatusCode.scala +++ b/protocol/src/main/scala/sbt/internal/bsp/StatusCode.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/langserver/DiagnosticSeverity.scala b/protocol/src/main/scala/sbt/internal/langserver/DiagnosticSeverity.scala index e13bb3081..52789d9c7 100644 --- a/protocol/src/main/scala/sbt/internal/langserver/DiagnosticSeverity.scala +++ b/protocol/src/main/scala/sbt/internal/langserver/DiagnosticSeverity.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/langserver/ErrorCodes.scala b/protocol/src/main/scala/sbt/internal/langserver/ErrorCodes.scala index 74611035a..a8f7936bc 100644 --- a/protocol/src/main/scala/sbt/internal/langserver/ErrorCodes.scala +++ b/protocol/src/main/scala/sbt/internal/langserver/ErrorCodes.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/langserver/MessageType.scala b/protocol/src/main/scala/sbt/internal/langserver/MessageType.scala index 2597fb1d1..4cef17853 100644 --- a/protocol/src/main/scala/sbt/internal/langserver/MessageType.scala +++ b/protocol/src/main/scala/sbt/internal/langserver/MessageType.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRPCProtocol.scala b/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRPCProtocol.scala index 06a8fe423..ae5baedb3 100644 --- a/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRPCProtocol.scala +++ b/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRPCProtocol.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcNotificationMessageFormats.scala b/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcNotificationMessageFormats.scala index 46464f019..f74643c9f 100644 --- a/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcNotificationMessageFormats.scala +++ b/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcNotificationMessageFormats.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcRequestMessageFormats.scala b/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcRequestMessageFormats.scala index eb9cb042e..a87724dd1 100644 --- a/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcRequestMessageFormats.scala +++ b/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcRequestMessageFormats.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcResponseErrorFormats.scala b/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcResponseErrorFormats.scala index 5e99fdc81..72211d131 100644 --- a/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcResponseErrorFormats.scala +++ b/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcResponseErrorFormats.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcResponseMessageFormats.scala b/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcResponseMessageFormats.scala index 72134c492..1da1a4805 100644 --- a/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcResponseMessageFormats.scala +++ b/protocol/src/main/scala/sbt/internal/protocol/codec/JsonRpcResponseMessageFormats.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/protocol/ClientSocket.scala b/protocol/src/main/scala/sbt/protocol/ClientSocket.scala index 165148f2a..90109e418 100644 --- a/protocol/src/main/scala/sbt/protocol/ClientSocket.scala +++ b/protocol/src/main/scala/sbt/protocol/ClientSocket.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/protocol/src/main/scala/sbt/protocol/Serialization.scala b/protocol/src/main/scala/sbt/protocol/Serialization.scala index 1059afe00..71bf7fb31 100644 --- a/protocol/src/main/scala/sbt/protocol/Serialization.scala +++ b/protocol/src/main/scala/sbt/protocol/Serialization.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/run/NOTICE b/run/NOTICE index 40d55bd9b..42bb77ca6 100644 --- a/run/NOTICE +++ b/run/NOTICE @@ -1,5 +1,6 @@ sbt: Run Component -Copyright 2011 - 2017, Lightbend, Inc. +Copyright 2023, Scala center +Copyright 2011 - 2022, Lightbend, Inc. Copyright 2008 - 2010, Mark Harrah Licensed under BSD-3-Clause license (see LICENSE) diff --git a/run/src/main/scala/sbt/Fork.scala b/run/src/main/scala/sbt/Fork.scala index b1d5d05d9..0e2356fb7 100644 --- a/run/src/main/scala/sbt/Fork.scala +++ b/run/src/main/scala/sbt/Fork.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -159,7 +160,7 @@ object Fork { /** * Use an arguments file if: * - we are on jdk >= 9 - * - sbt.argfile is unset or not falsy + * - sbt.argsfile is unset or not falsy * - the command line length would exceed MaxConcatenatedOptionLength */ private def shouldUseArgumentsFile(options: Seq[String]): Boolean = diff --git a/run/src/main/scala/sbt/OutputStrategy.scala b/run/src/main/scala/sbt/OutputStrategy.scala index 3dfaff2f2..ccd54e103 100644 --- a/run/src/main/scala/sbt/OutputStrategy.scala +++ b/run/src/main/scala/sbt/OutputStrategy.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/run/src/main/scala/sbt/Run.scala b/run/src/main/scala/sbt/Run.scala index d5a5ecabf..56297b484 100644 --- a/run/src/main/scala/sbt/Run.scala +++ b/run/src/main/scala/sbt/Run.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/run/src/main/scala/sbt/SelectMainClass.scala b/run/src/main/scala/sbt/SelectMainClass.scala index c70bc8260..3ec208b8f 100644 --- a/run/src/main/scala/sbt/SelectMainClass.scala +++ b/run/src/main/scala/sbt/SelectMainClass.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/run/src/main/scala/sbt/TrapExit.scala b/run/src/main/scala/sbt/TrapExit.scala index c7eaee08e..d12f3d873 100644 --- a/run/src/main/scala/sbt/TrapExit.scala +++ b/run/src/main/scala/sbt/TrapExit.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/run/src/main/scala/sbt/TrapExitSecurityException.scala b/run/src/main/scala/sbt/TrapExitSecurityException.scala index b3f445f6f..894a2baff 100644 --- a/run/src/main/scala/sbt/TrapExitSecurityException.scala +++ b/run/src/main/scala/sbt/TrapExitSecurityException.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/run/src/test/scala/sbt/ForkTest.scala b/run/src/test/scala/sbt/ForkTest.scala index cc819113d..51799f77a 100644 --- a/run/src/test/scala/sbt/ForkTest.scala +++ b/run/src/test/scala/sbt/ForkTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/run/src/test/scala/sbt/TestLogger.scala b/run/src/test/scala/sbt/TestLogger.scala index 6c3e96d51..3ee34f599 100644 --- a/run/src/test/scala/sbt/TestLogger.scala +++ b/run/src/test/scala/sbt/TestLogger.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/sbt b/sbt index 2702263a3..e4123a72e 100755 --- a/sbt +++ b/sbt @@ -1,7 +1,7 @@ #!/usr/bin/env bash set +e -declare builtin_sbt_version="1.8.0" +declare builtin_sbt_version="1.10.0" declare -a residual_args declare -a java_args declare -a scalac_args @@ -24,7 +24,7 @@ declare build_props_sbt_version= declare use_sbtn= declare no_server= declare sbtn_command="$SBTN_CMD" -declare sbtn_version="1.7.0" +declare sbtn_version="1.10.0" ### ------------------------------- ### ### Helper methods for BASH scripts ### @@ -174,12 +174,19 @@ acquire_sbtn () { local target="$p/sbtn" local archive_target= local url= + local arch="x86_64" if [[ "$OSTYPE" == "linux-gnu"* ]]; then - archive_target="$p/sbtn-x86_64-pc-linux-${sbtn_v}.tar.gz" - url="https://github.com/sbt/sbtn-dist/releases/download/v${sbtn_v}/sbtn-x86_64-pc-linux-${sbtn_v}.tar.gz" + arch=$(uname -m) + if [[ "$arch" == "aarch64" ]] || [[ "$arch" == "x86_64" ]]; then + archive_target="$p/sbtn-${arch}-pc-linux-${sbtn_v}.tar.gz" + url="https://github.com/sbt/sbtn-dist/releases/download/v${sbtn_v}/sbtn-${arch}-pc-linux-${sbtn_v}.tar.gz" + else + echoerr "sbtn is not supported on $arch" + exit 2 + fi elif [[ "$OSTYPE" == "darwin"* ]]; then - archive_target="$p/sbtn-x86_64-apple-darwin-${sbtn_v}.tar.gz" - url="https://github.com/sbt/sbtn-dist/releases/download/v${sbtn_v}/sbtn-x86_64-apple-darwin-${sbtn_v}.tar.gz" + archive_target="$p/sbtn-universal-apple-darwin-${sbtn_v}.tar.gz" + url="https://github.com/sbt/sbtn-dist/releases/download/v${sbtn_v}/sbtn-universal-apple-darwin-${sbtn_v}.tar.gz" elif [[ "$OSTYPE" == "cygwin" ]] || [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "win32" ]]; then target="$p/sbtn.exe" archive_target="$p/sbtn-x86_64-pc-win32-${sbtn_v}.zip" @@ -192,7 +199,7 @@ acquire_sbtn () { if [[ -f "$target" ]]; then sbtn_command="$target" else - echoerr "downloading sbtn ${sbtn_v}" + echoerr "downloading sbtn ${sbtn_v} for ${arch}" download_url "$url" "$archive_target" if [[ "$OSTYPE" == "linux-gnu"* ]] || [[ "$OSTYPE" == "darwin"* ]]; then tar zxf "$archive_target" --directory "$p" @@ -316,7 +323,8 @@ addSbtScriptProperty () { : else sbt_script=$0 - sbt_script=${sbt_script/ /%20} + # Use // to replace all spaces with %20. + sbt_script=${sbt_script// /%20} addJava "-Dsbt.script=$sbt_script" fi } @@ -510,6 +518,7 @@ run() { execRunner "$java_cmd" \ "${java_args[@]}" \ "${sbt_options[@]}" \ + "${java_tool_options[@]}" \ -jar "$sbt_jar" \ "${sbt_commands[@]}" \ "${residual_args[@]}" @@ -569,7 +578,6 @@ Usage: `basename "$0"` [options] --sbt-version use the specified version of sbt --sbt-jar use the specified jar as the sbt launcher - # java version (default: java from PATH, currently $(java -version 2>&1 | grep version)) --java-home alternate JAVA_HOME # jvm options and output control @@ -713,7 +721,8 @@ detectNativeClient() { if [[ "$sbtn_command" != "" ]]; then : elif [[ "$OSTYPE" == "linux-gnu"* ]]; then - [[ -f "${sbt_bin_dir}/sbtn-x86_64-pc-linux" ]] && sbtn_command="${sbt_bin_dir}/sbtn-x86_64-pc-linux" + arch=$(uname -m) + [[ -f "${sbt_bin_dir}/sbtn-${arch}-pc-linux" ]] && sbtn_command="${sbt_bin_dir}/sbtn-${arch}-pc-linux" elif [[ "$OSTYPE" == "darwin"* ]]; then [[ -f "${sbt_bin_dir}/sbtn-x86_64-apple-darwin" ]] && sbtn_command="${sbt_bin_dir}/sbtn-x86_64-apple-darwin" elif [[ "$OSTYPE" == "cygwin" ]] || [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "win32" ]]; then @@ -780,6 +789,7 @@ original_args=("$@") java_args=($JAVA_OPTS) sbt_options0=(${SBT_OPTS:-$default_sbt_opts}) +java_tool_options=($JAVA_TOOL_OPTIONS) if [[ "$SBT_NATIVE_CLIENT" == "true" ]]; then use_sbtn=1 fi diff --git a/sbt-app/src/main/scala/package.scala b/sbt-app/src/main/scala/package.scala index 3dd09f06c..9b9c3d9ab 100644 --- a/sbt-app/src/main/scala/package.scala +++ b/sbt-app/src/main/scala/package.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -40,7 +41,7 @@ package object sbt // IO def uri(s: String): URI = new URI(s) def file(s: String): File = new File(s) - def url(s: String): URL = new URL(s) + def url(s: String): URL = new URI(s).toURL implicit def fileToRichFile(file: File): sbt.io.RichFile = new sbt.io.RichFile(file) implicit def filesToFinder(cc: Iterable[File]): sbt.io.PathFinder = sbt.io.PathFinder.strict(cc) diff --git a/sbt-app/src/main/scala/sbt/AllSyntax.scala b/sbt-app/src/main/scala/sbt/AllSyntax.scala index d3b6520fd..6d489eff8 100644 --- a/sbt-app/src/main/scala/sbt/AllSyntax.scala +++ b/sbt-app/src/main/scala/sbt/AllSyntax.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/sbt-app/src/main/scala/sbt/Import.scala b/sbt-app/src/main/scala/sbt/Import.scala index 563819660..bd0d4d0f4 100644 --- a/sbt-app/src/main/scala/sbt/Import.scala +++ b/sbt-app/src/main/scala/sbt/Import.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/sbt-app/src/sbt-test/actions/cross-advanced/build.sbt b/sbt-app/src/sbt-test/actions/cross-advanced/build.sbt index f1edfa46f..a54ad5555 100644 --- a/sbt-app/src/sbt-test/actions/cross-advanced/build.sbt +++ b/sbt-app/src/sbt-test/actions/cross-advanced/build.sbt @@ -1,6 +1,7 @@ lazy val check = taskKey[Unit]("") lazy val compile2 = taskKey[Unit]("") -lazy val scala212 = "2.12.17" +lazy val scala212 = "2.12.19" +lazy val scala213 = "2.13.12" ThisBuild / scalaVersion := scala212 @@ -13,7 +14,7 @@ lazy val root = (project in file(".")) lazy val foo = project .settings( - crossScalaVersions := Seq(scala212, "2.13.1"), + crossScalaVersions := Seq(scala212, scala213), libraryDependencies += "org.scalatest" %% "scalatest" % "3.1.0", check := { // This tests that +check will respect bar's crossScalaVersions and not switch @@ -44,7 +45,7 @@ lazy val bar = project lazy val baz = project .settings( - crossScalaVersions := Seq("2.13.1"), + crossScalaVersions := Seq(scala213), check := { // This tests that +baz/check will respect bar's crossScalaVersions and not switch val x = (LocalProject("bar") / scalaVersion).value @@ -55,7 +56,7 @@ lazy val baz = project lazy val client = project .settings( - crossScalaVersions := Seq(scala212, "2.13.1"), + crossScalaVersions := Seq(scala212, scala213), check := (Compile / compile).value, compile2 := (Compile / compile).value, ) diff --git a/sbt-app/src/sbt-test/actions/cross-advanced/test b/sbt-app/src/sbt-test/actions/cross-advanced/test index a85909358..06dfb2d91 100644 --- a/sbt-app/src/sbt-test/actions/cross-advanced/test +++ b/sbt-app/src/sbt-test/actions/cross-advanced/test @@ -17,11 +17,11 @@ ## test + with command or alias > clean ## for command cross building you do need crossScalaVerions on root -> set root/crossScalaVersions := Seq("2.12.17", "2.13.1") +> set root/crossScalaVersions := Seq("2.12.19", "2.13.12") > + build -$ exists target/out/jvm/scala-2.12.17/foo -$ exists target/out/jvm/scala-2.13.1/foo -$ exists target/out/jvm/scala-2.12.17/bar -$ exists target/out/jvm/scala-2.13.1/bar -$ exists target/out/jvm/scala-2.12.17/client -$ exists target/out/jvm/scala-2.13.1/client +$ exists target/out/jvm/scala-2.12.19/foo +$ exists target/out/jvm/scala-2.13.12/foo +$ exists target/out/jvm/scala-2.12.19/bar +$ exists target/out/jvm/scala-2.13.12/bar +$ exists target/out/jvm/scala-2.12.19/client +$ exists target/out/jvm/scala-2.13.12/client diff --git a/sbt-app/src/sbt-test/actions/cross-incremental/build.sbt b/sbt-app/src/sbt-test/actions/cross-incremental/build.sbt index b8ff210c9..751353326 100644 --- a/sbt-app/src/sbt-test/actions/cross-incremental/build.sbt +++ b/sbt-app/src/sbt-test/actions/cross-incremental/build.sbt @@ -1,5 +1,5 @@ -scalaVersion := "2.12.12" -crossScalaVersions := List("2.12.12", "2.13.0") +scalaVersion := "2.12.19" +crossScalaVersions := List("2.12.19", "2.13.12") val setLastModified = taskKey[Unit]("Sets the last modified time for classfiles") setLastModified := { diff --git a/sbt-app/src/sbt-test/actions/cross-multi-parser/build.sbt b/sbt-app/src/sbt-test/actions/cross-multi-parser/build.sbt index 7fb4676d4..bc2b10efb 100644 --- a/sbt-app/src/sbt-test/actions/cross-multi-parser/build.sbt +++ b/sbt-app/src/sbt-test/actions/cross-multi-parser/build.sbt @@ -1 +1 @@ -crossScalaVersions := Seq[String]("2.11.12", "2.12.12") +crossScalaVersions := Seq[String]("2.11.12", "2.12.19") diff --git a/sbt-app/src/sbt-test/actions/cross-multi-parser/test b/sbt-app/src/sbt-test/actions/cross-multi-parser/test index e731a77d1..b2666730a 100644 --- a/sbt-app/src/sbt-test/actions/cross-multi-parser/test +++ b/sbt-app/src/sbt-test/actions/cross-multi-parser/test @@ -1,5 +1,5 @@ > ++2.11.12; compile -> ++ 2.12.12 ; compile; +> ++ 2.12.19 ; compile; -> ++ 2.12.12 ; compile +> ++ 2.12.19 ; compile diff --git a/sbt-app/src/sbt-test/actions/cross-multiproject/build.sbt b/sbt-app/src/sbt-test/actions/cross-multiproject/build.sbt index db47ed628..f6fb39bcb 100644 --- a/sbt-app/src/sbt-test/actions/cross-multiproject/build.sbt +++ b/sbt-app/src/sbt-test/actions/cross-multiproject/build.sbt @@ -1,11 +1,11 @@ -lazy val scala3 = "3.2.1" +lazy val scala3 = "3.3.1" lazy val scala213 = "2.13.1" crossScalaVersions := Seq(scala3, scala213) -ThisBuild / scalaVersion := scala3 +ThisBuild / scalaVersion := scala3 lazy val rootProj = (project in file(".")) - .aggregate(libProj, fooPlugin) + .aggregate(libProj, fooPlugin, externalProj) .settings( crossScalaVersions := Nil, addCommandAlias("build", "compile") @@ -28,3 +28,4 @@ lazy val extrasProj = (project in file("extras")) name := "foo-extras", ) +lazy val externalProj = ProjectRef(file("ref"), "external") diff --git a/sbt-app/src/sbt-test/actions/cross-multiproject/lib/A.scala b/sbt-app/src/sbt-test/actions/cross-multiproject/lib/src/main/scala/A.scala similarity index 100% rename from sbt-app/src/sbt-test/actions/cross-multiproject/lib/A.scala rename to sbt-app/src/sbt-test/actions/cross-multiproject/lib/src/main/scala/A.scala diff --git a/sbt-app/src/sbt-test/actions/cross-multiproject/test b/sbt-app/src/sbt-test/actions/cross-multiproject/pending similarity index 100% rename from sbt-app/src/sbt-test/actions/cross-multiproject/test rename to sbt-app/src/sbt-test/actions/cross-multiproject/pending diff --git a/sbt-app/src/sbt-test/actions/cross-multiproject/ref/build.sbt b/sbt-app/src/sbt-test/actions/cross-multiproject/ref/build.sbt new file mode 100644 index 000000000..6fdb53f78 --- /dev/null +++ b/sbt-app/src/sbt-test/actions/cross-multiproject/ref/build.sbt @@ -0,0 +1,4 @@ +lazy val external = (project in file(".")) + .settings( + scalaVersion := "2.12.19" + ) diff --git a/sbt-app/src/sbt-test/actions/cross-multiproject/ref/src/main/scala/C.scala b/sbt-app/src/sbt-test/actions/cross-multiproject/ref/src/main/scala/C.scala new file mode 100644 index 000000000..2fb50c68d --- /dev/null +++ b/sbt-app/src/sbt-test/actions/cross-multiproject/ref/src/main/scala/C.scala @@ -0,0 +1,5 @@ +package ref.sbt + +object Ref { + +} \ No newline at end of file diff --git a/sbt-app/src/sbt-test/actions/cross-multiproject/sbt-foo/B.scala b/sbt-app/src/sbt-test/actions/cross-multiproject/sbt-foo/src/main/scala/B.scala similarity index 100% rename from sbt-app/src/sbt-test/actions/cross-multiproject/sbt-foo/B.scala rename to sbt-app/src/sbt-test/actions/cross-multiproject/sbt-foo/src/main/scala/B.scala diff --git a/sbt-app/src/sbt-test/actions/cross-strict-aggregation-scala-3/build.sbt b/sbt-app/src/sbt-test/actions/cross-strict-aggregation-scala-3/build.sbt index aca345c51..38a5a26fe 100644 --- a/sbt-app/src/sbt-test/actions/cross-strict-aggregation-scala-3/build.sbt +++ b/sbt-app/src/sbt-test/actions/cross-strict-aggregation-scala-3/build.sbt @@ -1,14 +1,14 @@ -scalaVersion := "2.12.17" +scalaVersion := "2.12.19" lazy val core = project .settings( - crossScalaVersions := Seq("2.12.17", "3.0.2", "3.1.2") + crossScalaVersions := Seq("2.12.19", "3.0.2", "3.1.2") ) lazy val subproj = project .dependsOn(core) .settings( - crossScalaVersions := Seq("2.12.17", "3.1.2"), + crossScalaVersions := Seq("2.12.19", "3.1.2"), // a random library compiled against Scala 3.1 libraryDependencies += "org.http4s" %% "http4s-core" % "0.23.12" ) diff --git a/sbt-app/src/sbt-test/actions/cross-strict-aggregation/build.sbt b/sbt-app/src/sbt-test/actions/cross-strict-aggregation/build.sbt index f65bc2364..5ddafe8b5 100644 --- a/sbt-app/src/sbt-test/actions/cross-strict-aggregation/build.sbt +++ b/sbt-app/src/sbt-test/actions/cross-strict-aggregation/build.sbt @@ -1,5 +1,5 @@ -lazy val scala212 = "2.12.17" -lazy val scala213 = "2.13.1" +lazy val scala212 = "2.12.19" +lazy val scala213 = "2.13.12" ThisBuild / scalaVersion := scala212 @@ -11,7 +11,8 @@ lazy val root = (project in file(".")) lazy val core = (project in file("core")) .settings( - crossScalaVersions := Seq(scala212, scala213)) + crossScalaVersions := Seq(scala212, scala213), + ) lazy val module = (project in file("module")) .dependsOn(core) diff --git a/sbt-app/src/sbt-test/actions/cross-strict-aggregation/module/B.scala b/sbt-app/src/sbt-test/actions/cross-strict-aggregation/module/src/main/scala/B.scala similarity index 100% rename from sbt-app/src/sbt-test/actions/cross-strict-aggregation/module/B.scala rename to sbt-app/src/sbt-test/actions/cross-strict-aggregation/module/src/main/scala/B.scala diff --git a/sbt-app/src/sbt-test/actions/cross-strict-aggregation/pending b/sbt-app/src/sbt-test/actions/cross-strict-aggregation/pending new file mode 100644 index 000000000..3b55656f6 --- /dev/null +++ b/sbt-app/src/sbt-test/actions/cross-strict-aggregation/pending @@ -0,0 +1,11 @@ +-> ++2.12.0-magic + +> ++2.12.19 + +> clean + +> ++2.13.12 compile + +$ exists target/out/jvm/scala-2.13.12/core/core_2.13-0.1.0-SNAPSHOT-noresources.jar +-$ exists target/out/jvm/scala-2.13.12/module +-$ exists target/out/jvm/scala-2.12.19/module diff --git a/sbt-app/src/sbt-test/actions/cross-strict-aggregation/test b/sbt-app/src/sbt-test/actions/cross-strict-aggregation/test deleted file mode 100644 index 729999288..000000000 --- a/sbt-app/src/sbt-test/actions/cross-strict-aggregation/test +++ /dev/null @@ -1,9 +0,0 @@ --> ++2.12.0-magic - --> ++2.12.12 - -> ++2.13.1 compile - -$ exists target/out/jvm/scala-2.13.1/core/core_2.13-0.1.0-SNAPSHOT-noresources.jar --$ exists target/out/jvm/scala-2.13.1/module --$ exists target/out/jvm/scala-2.12.18/module diff --git a/sbt-app/src/sbt-test/actions/doc-file-options/build.sbt b/sbt-app/src/sbt-test/actions/doc-file-options/build.sbt index 204628694..25e997f7d 100644 --- a/sbt-app/src/sbt-test/actions/doc-file-options/build.sbt +++ b/sbt-app/src/sbt-test/actions/doc-file-options/build.sbt @@ -12,6 +12,9 @@ lazy val root = (project in file(".")) }, TaskKey[Unit]("check") := { val packageHtml = (Compile / doc / target).value / "index.html" - assert(IO.read(packageHtml).contains(newContents), s"does not contains ${newContents} in ${packageHtml}" ) + assert( + IO.read(packageHtml).contains(newContents), + s"does not contains ${newContents} in ${packageHtml}" + ) } ) diff --git a/sbt-app/src/sbt-test/actions/doc/build.sbt b/sbt-app/src/sbt-test/actions/doc/build.sbt index 3bc429b9a..98e1c25bc 100644 --- a/sbt-app/src/sbt-test/actions/doc/build.sbt +++ b/sbt-app/src/sbt-test/actions/doc/build.sbt @@ -5,15 +5,17 @@ import Parsers._ lazy val root = (project in file(".")) .settings( crossPaths := false, - crossScalaVersions := Seq("2.12.18", "2.13.3"), - scalaVersion := "2.12.18", + crossScalaVersions := Seq("2.12.19", "2.13.12"), + scalaVersion := "2.12.19", Compile / doc / scalacOptions += "-Xfatal-warnings", commands += Command.command("excludeB") { s => val impl = """val src = (Compile / sources).value; src.filterNot(_.getName.contains("B"))""" s"set Compile / doc / sources := { $impl }" :: s }, - commands += Command.arb(_ => ("setDocExtension": Parser[String]) ~> " " ~> matched(any.*)) { (s, filter: String) => - val impl = s"""val src = (Compile / sources).value; src.filter(_.getName.endsWith("$filter"))""" - s"set Compile / doc / sources := { $impl }" :: s + commands += Command.arb(_ => ("setDocExtension": Parser[String]) ~> " " ~> matched(any.*)) { + (s, filter: String) => + val impl = + s"""val src = (Compile / sources).value; src.filter(_.getName.endsWith("$filter"))""" + s"set Compile / doc / sources := { $impl }" :: s }, ) diff --git a/sbt-app/src/sbt-test/actions/doc/test b/sbt-app/src/sbt-test/actions/doc/test index 354fe9643..14fd9b04d 100644 --- a/sbt-app/src/sbt-test/actions/doc/test +++ b/sbt-app/src/sbt-test/actions/doc/test @@ -5,10 +5,10 @@ # hybrid project, only scaladoc run > doc > packageBin -$ exists target/out/jvm/scala-2.12.18/root/api/index.js -$ exists target/out/jvm/scala-2.12.18/root/api/A$.html -$ absent target/out/jvm/scala-2.12.18/root/api/scala -$ absent target/out/jvm/scala-2.12.18/root/api/java +$ exists target/out/jvm/scala-2.12.19/root/api/index.js +$ exists target/out/jvm/scala-2.12.19/root/api/A$.html +$ absent target/out/jvm/scala-2.12.19/root/api/scala +$ absent target/out/jvm/scala-2.12.19/root/api/java > setDocExtension scala @@ -19,12 +19,12 @@ $ copy-file changes/B.scala B.scala > clean ; compile ; doc # pure scala project, only scaladoc at top level -$ exists target/out/jvm/scala-2.12.18/root/api/index.js -$ exists target/out/jvm/scala-2.12.18/root/api/A$.html -$ exists target/out/jvm/scala-2.12.18/root/api/B$.html -$ absent target/out/jvm/scala-2.12.18/root/api/package-list -$ absent target/out/jvm/scala-2.12.18/root/api/scala -$ absent target/out/jvm/scala-2.12.18/root/api/java +$ exists target/out/jvm/scala-2.12.19/root/api/index.js +$ exists target/out/jvm/scala-2.12.19/root/api/A$.html +$ exists target/out/jvm/scala-2.12.19/root/api/B$.html +$ absent target/out/jvm/scala-2.12.19/root/api/package-list +$ absent target/out/jvm/scala-2.12.19/root/api/scala +$ absent target/out/jvm/scala-2.12.19/root/api/java > setDocExtension java @@ -34,14 +34,14 @@ $ absent target/out/jvm/scala-2.12.18/root/api/java > doc # pure java project, only javadoc at top level -$ exists target/out/jvm/scala-2.12.18/root/api/index.html -$ exists target/out/jvm/scala-2.12.18/root/api/pkg/J.html -$ absent target/out/jvm/scala-2.12.18/root/api/index.js +$ exists target/out/jvm/scala-2.12.19/root/api/index.html +$ exists target/out/jvm/scala-2.12.19/root/api/pkg/J.html +$ absent target/out/jvm/scala-2.12.19/root/api/index.js > setDocExtension scala > ++2.13.x > clean -$ absent target/out/jvm/scala-2.12.18/root/api/A$.html +$ absent target/out/jvm/scala-2.12.19/root/api/A$.html > doc -$ exists target/out/jvm/scala-2.13.3/root/api/A$.html -$ exists target/out/jvm/scala-2.13.3/root/api/B$.html +$ exists target/out/jvm/scala-2.13.12/root/api/A$.html +$ exists target/out/jvm/scala-2.13.12/root/api/B$.html diff --git a/sbt-app/src/sbt-test/actions/external-doc/build.sbt b/sbt-app/src/sbt-test/actions/external-doc/build.sbt index ab3cb5847..812d87b2b 100644 --- a/sbt-app/src/sbt-test/actions/external-doc/build.sbt +++ b/sbt-app/src/sbt-test/actions/external-doc/build.sbt @@ -41,9 +41,14 @@ def expectedMappings = Def.task { mod.artifacts.flatMap { case (a, f) => val n = a.name.stripSuffix("_" + binVersion) n match { - case "a" | "b" | "c" => (converter.toVirtualFile(f.toPath()): HashedVirtualFileRef, apiBase(n)) :: Nil - case "scala-library" => (converter.toVirtualFile(f.toPath()): HashedVirtualFileRef, scalaLibraryBase(stdLibVersion)) :: Nil - case _ => Nil + case "a" | "b" | "c" => + (converter.toVirtualFile(f.toPath()): HashedVirtualFileRef, apiBase(n)) :: Nil + case "scala-library" => + ( + converter.toVirtualFile(f.toPath()): HashedVirtualFileRef, + scalaLibraryBase(stdLibVersion) + ) :: Nil + case _ => Nil } } } diff --git a/sbt-app/src/sbt-test/actions/generator/build.sbt b/sbt-app/src/sbt-test/actions/generator/build.sbt index 5d88c6637..349e7821c 100644 --- a/sbt-app/src/sbt-test/actions/generator/build.sbt +++ b/sbt-app/src/sbt-test/actions/generator/build.sbt @@ -1,6 +1,6 @@ val buildInfo = taskKey[Seq[File]]("generates the build info") -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val root = (project in file(".")) .settings( diff --git a/sbt-app/src/sbt-test/actions/generator/test b/sbt-app/src/sbt-test/actions/generator/test index b568c3497..672c7cc9f 100644 --- a/sbt-app/src/sbt-test/actions/generator/test +++ b/sbt-app/src/sbt-test/actions/generator/test @@ -1,2 +1,2 @@ > compile -$ exists target/out/jvm/scala-2.12.12/root/src_managed/BuildInfo.scala +$ exists target/out/jvm/scala-2.12.19/root/src_managed/BuildInfo.scala diff --git a/sbt-app/src/sbt-test/actions/multi-command/build.sbt b/sbt-app/src/sbt-test/actions/multi-command/build.sbt index e3dba3ba2..6853cdcfa 100644 --- a/sbt-app/src/sbt-test/actions/multi-command/build.sbt +++ b/sbt-app/src/sbt-test/actions/multi-command/build.sbt @@ -19,4 +19,4 @@ val dynamicTask = taskKey[Unit]("dynamic input task") dynamicTask := { println("not yet et") } -crossScalaVersions := "2.11.12" :: "2.12.12" :: Nil +crossScalaVersions := "2.11.12" :: "2.12.19" :: Nil diff --git a/sbt-app/src/sbt-test/actions/multi-command/test b/sbt-app/src/sbt-test/actions/multi-command/test index 568d028fb..455953b6a 100644 --- a/sbt-app/src/sbt-test/actions/multi-command/test +++ b/sbt-app/src/sbt-test/actions/multi-command/test @@ -37,4 +37,4 @@ > ++ 2.11.12 compile; setStringValue bar; checkStringValue bar -> ++2.12.12 compile; setStringValue foo; checkStringValue foo +> ++2.12.19 compile; setStringValue foo; checkStringValue foo diff --git a/sbt-app/src/sbt-test/actions/package-delete-target/build.sbt b/sbt-app/src/sbt-test/actions/package-delete-target/build.sbt index dbecc17a2..b238d3d93 100644 --- a/sbt-app/src/sbt-test/actions/package-delete-target/build.sbt +++ b/sbt-app/src/sbt-test/actions/package-delete-target/build.sbt @@ -1,5 +1,5 @@ lazy val root = (project in file(".")) .settings( name := "delete-target", - scalaVersion := "2.12.18" + scalaVersion := "2.12.19" ) diff --git a/sbt-app/src/sbt-test/actions/package-delete-target/test b/sbt-app/src/sbt-test/actions/package-delete-target/test index a4f29a7c5..cfca1bb64 100644 --- a/sbt-app/src/sbt-test/actions/package-delete-target/test +++ b/sbt-app/src/sbt-test/actions/package-delete-target/test @@ -1,4 +1,4 @@ -$ mkdir target/out/jvm/scala-2.12.18/delete-target/delete-target_2.12-0.1.0-SNAPSHOT.jar -$ touch target/out/jvm/scala-2.12.18/delete-target/delete-target_2.12-0.1.0-SNAPSHOT.jar/hello +$ mkdir target/out/jvm/scala-2.12.19/delete-target/delete-target_2.12-0.1.0-SNAPSHOT.jar +$ touch target/out/jvm/scala-2.12.19/delete-target/delete-target_2.12-0.1.0-SNAPSHOT.jar/hello -> package -$ exists target/out/jvm/scala-2.12.18/delete-target/delete-target_2.12-0.1.0-SNAPSHOT.jar/hello +$ exists target/out/jvm/scala-2.12.19/delete-target/delete-target_2.12-0.1.0-SNAPSHOT.jar/hello diff --git a/sbt-app/src/sbt-test/actions/remote-cache-semanticdb/build.sbt b/sbt-app/src/sbt-test/actions/remote-cache-semanticdb/build.sbt index 374410229..fa9f2fbd7 100644 --- a/sbt-app/src/sbt-test/actions/remote-cache-semanticdb/build.sbt +++ b/sbt-app/src/sbt-test/actions/remote-cache-semanticdb/build.sbt @@ -1,6 +1,6 @@ name := "my-project" -scalaVersion := "2.12.12" +scalaVersion := "2.12.19" semanticdbIncludeInJar := true diff --git a/sbt-app/src/sbt-test/actions/remote-cache/build.sbt b/sbt-app/src/sbt-test/actions/remote-cache/build.sbt index 43766a055..9f6c91865 100644 --- a/sbt-app/src/sbt-test/actions/remote-cache/build.sbt +++ b/sbt-app/src/sbt-test/actions/remote-cache/build.sbt @@ -8,7 +8,7 @@ lazy val CustomArtifact = config("custom-artifact") val recordPreviousIterations = taskKey[Unit]("Record previous iterations.") val checkIterations = inputKey[Unit]("Verifies the accumulated number of iterations of incremental compilation.") -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" ThisBuild / pushRemoteCacheTo := Some( MavenCache("local-cache", (ThisBuild / baseDirectory).value / "r") ) diff --git a/sbt-app/src/sbt-test/classloader-cache/akka-actor-system/build.sbt b/sbt-app/src/sbt-test/classloader-cache/akka-actor-system/build.sbt index 889490e92..b89e34a3f 100644 --- a/sbt-app/src/sbt-test/classloader-cache/akka-actor-system/build.sbt +++ b/sbt-app/src/sbt-test/classloader-cache/akka-actor-system/build.sbt @@ -2,7 +2,7 @@ ThisBuild / turbo := true val akkaTest = (project in file(".")).settings( name := "akka-test", - scalaVersion := "2.12.12", + scalaVersion := "2.12.19", libraryDependencies ++= Seq( "com.typesafe.akka" %% "akka-actor" % "2.5.16", "com.lihaoyi" %% "utest" % "0.6.6" % "test" diff --git a/sbt-app/src/sbt-test/classloader-cache/jni/build.sbt b/sbt-app/src/sbt-test/classloader-cache/jni/build.sbt index b3f4c9d15..e9449cc48 100644 --- a/sbt-app/src/sbt-test/classloader-cache/jni/build.sbt +++ b/sbt-app/src/sbt-test/classloader-cache/jni/build.sbt @@ -13,7 +13,7 @@ def wrap(task: InputKey[Unit]): Def.Initialize[Task[Unit]] = // ThisBuild / turbo := true val root = (project in file(".")).settings( - scalaVersion := "2.12.12", + scalaVersion := "2.12.19", javacOptions ++= Seq("-source", "1.8", "-target", "1.8", "-h", sourceDirectory.value.toPath.resolve("main/native/include").toString), libraryDependencies += "com.lihaoyi" %% "utest" % "0.6.6" % "test", diff --git a/sbt-app/src/sbt-test/classloader-cache/library-mismatch/build.sbt b/sbt-app/src/sbt-test/classloader-cache/library-mismatch/build.sbt index b0fe1aa10..dec40d399 100644 --- a/sbt-app/src/sbt-test/classloader-cache/library-mismatch/build.sbt +++ b/sbt-app/src/sbt-test/classloader-cache/library-mismatch/build.sbt @@ -2,7 +2,7 @@ ThisBuild / turbo := true val snapshot = (project in file(".")).settings( name := "mismatched-libraries", - scalaVersion := "2.12.12", + scalaVersion := "2.12.19", libraryDependencies ++= Seq("com.lihaoyi" %% "utest" % "0.6.6" % "test"), testFrameworks := Seq(TestFramework("utest.runner.Framework")), resolvers += "Local Maven" at file("libraries/ivy").toURI.toURL.toString, diff --git a/sbt-app/src/sbt-test/classloader-cache/runtime-layers/build.sbt b/sbt-app/src/sbt-test/classloader-cache/runtime-layers/build.sbt index 45c966d82..d029cd576 100644 --- a/sbt-app/src/sbt-test/classloader-cache/runtime-layers/build.sbt +++ b/sbt-app/src/sbt-test/classloader-cache/runtime-layers/build.sbt @@ -1,6 +1,6 @@ val layeringStrategyTest = (project in file(".")).settings( name := "layering-strategy-test", - scalaVersion := "2.12.12", + scalaVersion := "2.12.19", organization := "sbt", libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.5.16", ) diff --git a/sbt-app/src/sbt-test/classloader-cache/snapshot/build.sbt b/sbt-app/src/sbt-test/classloader-cache/snapshot/build.sbt index 0a3819c95..4d93e6bb6 100644 --- a/sbt-app/src/sbt-test/classloader-cache/snapshot/build.sbt +++ b/sbt-app/src/sbt-test/classloader-cache/snapshot/build.sbt @@ -10,7 +10,7 @@ ThisBuild / useCoursier := false val snapshot = (project in file(".")).settings( name := "akka-test", - scalaVersion := "2.12.12", + scalaVersion := "2.12.19", libraryDependencies ++= Seq( "com.lihaoyi" %% "utest" % "0.6.6" % "test" ), diff --git a/sbt-app/src/sbt-test/classloader-cache/snapshot/libraries/library-1/ivy/sbt/foo-lib_2.12/0.1.0-SNAPSHOT/foo-lib_2.12-0.1.0-SNAPSHOT.pom b/sbt-app/src/sbt-test/classloader-cache/snapshot/libraries/library-1/ivy/sbt/foo-lib_2.12/0.1.0-SNAPSHOT/foo-lib_2.12-0.1.0-SNAPSHOT.pom index d5fedc71b..233c03dbe 100644 --- a/sbt-app/src/sbt-test/classloader-cache/snapshot/libraries/library-1/ivy/sbt/foo-lib_2.12/0.1.0-SNAPSHOT/foo-lib_2.12-0.1.0-SNAPSHOT.pom +++ b/sbt-app/src/sbt-test/classloader-cache/snapshot/libraries/library-1/ivy/sbt/foo-lib_2.12/0.1.0-SNAPSHOT/foo-lib_2.12-0.1.0-SNAPSHOT.pom @@ -14,7 +14,7 @@ org.scala-lang scala-library - 2.12.12 + 2.12.19 diff --git a/sbt-app/src/sbt-test/classloader-cache/snapshot/libraries/library-2/ivy/sbt/foo-lib_2.12/0.1.0-SNAPSHOT/foo-lib_2.12-0.1.0-SNAPSHOT.pom b/sbt-app/src/sbt-test/classloader-cache/snapshot/libraries/library-2/ivy/sbt/foo-lib_2.12/0.1.0-SNAPSHOT/foo-lib_2.12-0.1.0-SNAPSHOT.pom index d5fedc71b..233c03dbe 100644 --- a/sbt-app/src/sbt-test/classloader-cache/snapshot/libraries/library-2/ivy/sbt/foo-lib_2.12/0.1.0-SNAPSHOT/foo-lib_2.12-0.1.0-SNAPSHOT.pom +++ b/sbt-app/src/sbt-test/classloader-cache/snapshot/libraries/library-2/ivy/sbt/foo-lib_2.12/0.1.0-SNAPSHOT/foo-lib_2.12-0.1.0-SNAPSHOT.pom @@ -14,7 +14,7 @@ org.scala-lang scala-library - 2.12.12 + 2.12.19 diff --git a/sbt-app/src/sbt-test/classloader-cache/spark/build.sbt b/sbt-app/src/sbt-test/classloader-cache/spark/build.sbt index af76b9d35..43b6315d5 100644 --- a/sbt-app/src/sbt-test/classloader-cache/spark/build.sbt +++ b/sbt-app/src/sbt-test/classloader-cache/spark/build.sbt @@ -2,7 +2,7 @@ name := "Simple Project" version := "1.0" -scalaVersion := "2.12.12" +scalaVersion := "2.12.19" libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.4.3" diff --git a/sbt-app/src/sbt-test/classloader-cache/utest/build.sbt b/sbt-app/src/sbt-test/classloader-cache/utest/build.sbt index 5745fe973..e504b97a7 100644 --- a/sbt-app/src/sbt-test/classloader-cache/utest/build.sbt +++ b/sbt-app/src/sbt-test/classloader-cache/utest/build.sbt @@ -2,7 +2,7 @@ ThisBuild / turbo := true val utestTest = (project in file(".")).settings( name := "utest-test", - scalaVersion := "2.12.12", + scalaVersion := "2.12.19", libraryDependencies ++= Seq( "com.lihaoyi" %% "utest" % "0.6.6" % "test" ), diff --git a/sbt-app/src/sbt-test/compiler-project/error-in-invalidated/build.sbt b/sbt-app/src/sbt-test/compiler-project/error-in-invalidated/build.sbt index c9260beeb..ba36bc767 100644 --- a/sbt-app/src/sbt-test/compiler-project/error-in-invalidated/build.sbt +++ b/sbt-app/src/sbt-test/compiler-project/error-in-invalidated/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val root = (project in file(".")). settings( diff --git a/sbt-app/src/sbt-test/compiler-project/macro-config/build.sbt b/sbt-app/src/sbt-test/compiler-project/macro-config/build.sbt index 15598d96a..db9150602 100644 --- a/sbt-app/src/sbt-test/compiler-project/macro-config/build.sbt +++ b/sbt-app/src/sbt-test/compiler-project/macro-config/build.sbt @@ -5,7 +5,7 @@ val Macro = config("macro").hide.extend(Compile) lazy val root = (project in file(".")) .settings( - scalaVersion := "2.12.2", + scalaVersion := "2.12.19", // Adds a "macro" configuration for macro dependencies. ivyConfigurations.value += Macro, diff --git a/sbt-app/src/sbt-test/compiler-project/no-bootclasspath/build.sbt b/sbt-app/src/sbt-test/compiler-project/no-bootclasspath/build.sbt new file mode 100644 index 000000000..edd870753 --- /dev/null +++ b/sbt-app/src/sbt-test/compiler-project/no-bootclasspath/build.sbt @@ -0,0 +1,9 @@ +TaskKey[Unit]("check212") := checkCp(true) +TaskKey[Unit]("check213") := checkCp(false) + +def checkCp(auto: Boolean) = Def.task { + val opts = compilers.value.scalac.classpathOptions + assert(opts.autoBoot == auto, opts) + assert(opts.filterLibrary == auto, opts) + () +} diff --git a/sbt-app/src/sbt-test/compiler-project/no-bootclasspath/test b/sbt-app/src/sbt-test/compiler-project/no-bootclasspath/test new file mode 100644 index 000000000..a62a34698 --- /dev/null +++ b/sbt-app/src/sbt-test/compiler-project/no-bootclasspath/test @@ -0,0 +1,4 @@ +> set scalaVersion := "2.13.12" +> check213 +> set scalaVersion := "2.12.18" +> check212 diff --git a/sbt-app/src/sbt-test/compiler-project/run-test/build.sbt b/sbt-app/src/sbt-test/compiler-project/run-test/build.sbt index 214317110..910d61c97 100644 --- a/sbt-app/src/sbt-test/compiler-project/run-test/build.sbt +++ b/sbt-app/src/sbt-test/compiler-project/run-test/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.17" +ThisBuild / scalaVersion := "2.12.19" libraryDependencies ++= Seq( "com.novocode" % "junit-interface" % "0.5" % Test, diff --git a/sbt-app/src/sbt-test/compiler-project/separate-analysis-per-scala/build.sbt b/sbt-app/src/sbt-test/compiler-project/separate-analysis-per-scala/build.sbt index 77191747f..b65bda46b 100644 --- a/sbt-app/src/sbt-test/compiler-project/separate-analysis-per-scala/build.sbt +++ b/sbt-app/src/sbt-test/compiler-project/separate-analysis-per-scala/build.sbt @@ -1,5 +1,5 @@ -lazy val scala212 = "2.12.12" -lazy val scala213 = "2.13.1" +lazy val scala212 = "2.12.19" +lazy val scala213 = "2.13.12" ThisBuild / scalaVersion := scala212 lazy val root = (project in file(".")) diff --git a/sbt-app/src/sbt-test/compiler-project/separate-analysis-per-scala/test b/sbt-app/src/sbt-test/compiler-project/separate-analysis-per-scala/test index fc6216380..1643abf15 100644 --- a/sbt-app/src/sbt-test/compiler-project/separate-analysis-per-scala/test +++ b/sbt-app/src/sbt-test/compiler-project/separate-analysis-per-scala/test @@ -1,3 +1,3 @@ > + compile -$ exists target/out/jvm/scala-2.12.12/foo -$ exists target/out/jvm/scala-2.13.1/foo +$ exists target/out/jvm/scala-2.12.19/foo +$ exists target/out/jvm/scala-2.13.12/foo diff --git a/sbt-app/src/sbt-test/console/project-compiler-bridge/build.sbt b/sbt-app/src/sbt-test/console/project-compiler-bridge/build.sbt index 3c4ba1908..0843374a5 100644 --- a/sbt-app/src/sbt-test/console/project-compiler-bridge/build.sbt +++ b/sbt-app/src/sbt-test/console/project-compiler-bridge/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "2.13.1" +scalaVersion := "2.13.12" // Send some bogus initial command so that it doesn't get stuck. // The task itself will still succeed. diff --git a/sbt-app/src/sbt-test/console/project-compiler-bridge/project/build.sbt b/sbt-app/src/sbt-test/console/project-compiler-bridge/project/build.sbt index 366c27de7..8f5047976 100644 --- a/sbt-app/src/sbt-test/console/project-compiler-bridge/project/build.sbt +++ b/sbt-app/src/sbt-test/console/project-compiler-bridge/project/build.sbt @@ -1 +1 @@ -scalaVersion := "2.12.12" +scalaVersion := "2.12.19" diff --git a/sbt-app/src/sbt-test/dependency-graph/asciiGraphWidth/build.sbt b/sbt-app/src/sbt-test/dependency-graph/asciiGraphWidth/build.sbt index aa4780397..167083797 100644 --- a/sbt-app/src/sbt-test/dependency-graph/asciiGraphWidth/build.sbt +++ b/sbt-app/src/sbt-test/dependency-graph/asciiGraphWidth/build.sbt @@ -1,5 +1,5 @@ ThisBuild / version := "0.1.0-SNAPSHOT" -ThisBuild / scalaVersion := "2.13.5" +ThisBuild / scalaVersion := "2.13.12" name := "asciiGraphWidthSpecs" diff --git a/sbt-app/src/sbt-test/dependency-graph/cachedResolution/build.sbt b/sbt-app/src/sbt-test/dependency-graph/cachedResolution/build.sbt index e4d1990a8..29548c20e 100644 --- a/sbt-app/src/sbt-test/dependency-graph/cachedResolution/build.sbt +++ b/sbt-app/src/sbt-test/dependency-graph/cachedResolution/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "2.12.9" +scalaVersion := "2.12.19" libraryDependencies += "org.slf4j" % "slf4j-api" % "1.7.28" updateOptions := updateOptions.value.withCachedResolution(true) diff --git a/sbt-app/src/sbt-test/dependency-graph/ignoreScalaLibrary/build.sbt b/sbt-app/src/sbt-test/dependency-graph/ignoreScalaLibrary/build.sbt index 5ba1d09ce..bc11b4a40 100644 --- a/sbt-app/src/sbt-test/dependency-graph/ignoreScalaLibrary/build.sbt +++ b/sbt-app/src/sbt-test/dependency-graph/ignoreScalaLibrary/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.17" +ThisBuild / scalaVersion := "2.12.19" libraryDependencies ++= Seq( "org.slf4j" % "slf4j-api" % "1.7.2", diff --git a/sbt-app/src/sbt-test/dependency-graph/toFileSubTask/build.sbt b/sbt-app/src/sbt-test/dependency-graph/toFileSubTask/build.sbt index 85fd38f7f..cfb295484 100644 --- a/sbt-app/src/sbt-test/dependency-graph/toFileSubTask/build.sbt +++ b/sbt-app/src/sbt-test/dependency-graph/toFileSubTask/build.sbt @@ -1,5 +1,5 @@ // ThisBuild / useCoursier := false -ThisBuild / scalaVersion := "2.12.17" +ThisBuild / scalaVersion := "2.12.19" ThisBuild / organization := "org.example" ThisBuild / version := "0.1" diff --git a/sbt-app/src/sbt-test/dependency-graph/whatDependsOn-without-previous-initialization/build.sbt b/sbt-app/src/sbt-test/dependency-graph/whatDependsOn-without-previous-initialization/build.sbt index 4826145e5..1c7a78e3f 100644 --- a/sbt-app/src/sbt-test/dependency-graph/whatDependsOn-without-previous-initialization/build.sbt +++ b/sbt-app/src/sbt-test/dependency-graph/whatDependsOn-without-previous-initialization/build.sbt @@ -1,5 +1,5 @@ ThisBuild / version := "0.1.0-SNAPSHOT" -ThisBuild / scalaVersion := "2.13.5" +ThisBuild / scalaVersion := "2.13.12" name := "whatDependsOn" diff --git a/sbt-app/src/sbt-test/dependency-graph/whatDependsOn/build.sbt b/sbt-app/src/sbt-test/dependency-graph/whatDependsOn/build.sbt index 4826145e5..1c7a78e3f 100644 --- a/sbt-app/src/sbt-test/dependency-graph/whatDependsOn/build.sbt +++ b/sbt-app/src/sbt-test/dependency-graph/whatDependsOn/build.sbt @@ -1,5 +1,5 @@ ThisBuild / version := "0.1.0-SNAPSHOT" -ThisBuild / scalaVersion := "2.13.5" +ThisBuild / scalaVersion := "2.13.12" name := "whatDependsOn" diff --git a/sbt-app/src/sbt-test/dependency-management/artifact/build.sbt b/sbt-app/src/sbt-test/dependency-management/artifact/build.sbt index 49745392f..dc421654e 100644 --- a/sbt-app/src/sbt-test/dependency-management/artifact/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/artifact/build.sbt @@ -6,7 +6,7 @@ lazy val check = taskKey[Unit]("") lazy val checkArtifact = taskKey[Unit]("") ThisBuild / useCoursier := false -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" ThisBuild / version := "0.1.0-SNAPSHOT" ThisBuild / organization := "com.example" ThisBuild / organizationName := "example" diff --git a/sbt-app/src/sbt-test/dependency-management/cache-classifiers/multi.sbt b/sbt-app/src/sbt-test/dependency-management/cache-classifiers/multi.sbt index 37637a953..6e14ac995 100644 --- a/sbt-app/src/sbt-test/dependency-management/cache-classifiers/multi.sbt +++ b/sbt-app/src/sbt-test/dependency-management/cache-classifiers/multi.sbt @@ -1,6 +1,6 @@ import xsbti.AppConfiguration -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" // TTL of Coursier is 24h ThisBuild / useCoursier := false diff --git a/sbt-app/src/sbt-test/dependency-management/cache-update/build.sbt b/sbt-app/src/sbt-test/dependency-management/cache-update/build.sbt index 4db4f0caa..81e66bb93 100644 --- a/sbt-app/src/sbt-test/dependency-management/cache-update/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/cache-update/build.sbt @@ -23,7 +23,7 @@ lazy val root = (project in file(".")) ), version := "0.3.1-SNAPSHOT", description := "An HTTP client for Scala with Async Http Client underneath.", - licenses := Seq("Apache 2" -> new URL("http://www.apache.org/licenses/LICENSE-2.0.txt")), + licenses := Seq("Apache 2" -> url("http://www.apache.org/licenses/LICENSE-2.0.txt")), )), localCache, libraryDependencies += "com.github.nscala-time" %% "nscala-time" % "1.0.0", diff --git a/sbt-app/src/sbt-test/dependency-management/cached-resolution-interproj/multi.sbt b/sbt-app/src/sbt-test/dependency-management/cached-resolution-interproj/multi.sbt index 1e4757556..7c4cef4f9 100644 --- a/sbt-app/src/sbt-test/dependency-management/cached-resolution-interproj/multi.sbt +++ b/sbt-app/src/sbt-test/dependency-management/cached-resolution-interproj/multi.sbt @@ -3,7 +3,7 @@ lazy val check = taskKey[Unit]("Runs the check") val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" val junit = "junit" % "junit" % "4.13.1" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" ThisBuild / csrCacheDirectory := (ThisBuild / baseDirectory).value / "coursier-cache" def localCache = diff --git a/sbt-app/src/sbt-test/dependency-management/compiler-bridge-binary/build.sbt b/sbt-app/src/sbt-test/dependency-management/compiler-bridge-binary/build.sbt index 5f6646644..59aad4118 100644 --- a/sbt-app/src/sbt-test/dependency-management/compiler-bridge-binary/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/compiler-bridge-binary/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val check = taskKey[Unit]("") diff --git a/sbt-app/src/sbt-test/dependency-management/conflict-coursier/build.sbt b/sbt-app/src/sbt-test/dependency-management/conflict-coursier/build.sbt index c03c939e6..436ed6e36 100644 --- a/sbt-app/src/sbt-test/dependency-management/conflict-coursier/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/conflict-coursier/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" libraryDependencies ++= List( "org.webjars.npm" % "randomatic" % "1.1.7", "org.webjars.npm" % "is-odd" % "2.0.0", diff --git a/sbt-app/src/sbt-test/dependency-management/conflict-manager-with-org/test b/sbt-app/src/sbt-test/dependency-management/conflict-manager-with-org/pending similarity index 100% rename from sbt-app/src/sbt-test/dependency-management/conflict-manager-with-org/test rename to sbt-app/src/sbt-test/dependency-management/conflict-manager-with-org/pending diff --git a/sbt-app/src/sbt-test/dependency-management/cp-order/build.sbt b/sbt-app/src/sbt-test/dependency-management/cp-order/build.sbt index 3ea183127..2764be76f 100644 --- a/sbt-app/src/sbt-test/dependency-management/cp-order/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/cp-order/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "2.13.1" +scalaVersion := "2.13.12" csrConfiguration := csrConfiguration.value.withCache(target.value / "coursier-cache") libraryDependencies += "com.typesafe.play" %% "play-test" % "2.8.0-RC1" % Test // worked around in 2.8.0 diff --git a/sbt-app/src/sbt-test/dependency-management/credentials/build.sbt b/sbt-app/src/sbt-test/dependency-management/credentials/build.sbt index f42a799b6..c5b3da5d1 100644 --- a/sbt-app/src/sbt-test/dependency-management/credentials/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/credentials/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.13.0" +ThisBuild / scalaVersion := "2.13.12" ThisBuild / csrCacheDirectory := (ThisBuild / baseDirectory).value / "coursier-cache" ivyPaths := IvyPaths(baseDirectory.value.toString, Some(((ThisBuild / baseDirectory).value / "ivy" / "cache").toString)) diff --git a/sbt-app/src/sbt-test/dependency-management/evicted-semver-spec/build.sbt b/sbt-app/src/sbt-test/dependency-management/evicted-semver-spec/build.sbt index 2fd840665..a00becacf 100644 --- a/sbt-app/src/sbt-test/dependency-management/evicted-semver-spec/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/evicted-semver-spec/build.sbt @@ -1,7 +1,7 @@ import xsbti.AppConfiguration // ThisBuild / useCoursier := false ThisBuild / organization := "com.example" -ThisBuild / scalaVersion := "2.13.3" +ThisBuild / scalaVersion := "2.13.12" ThisBuild / versionScheme := Some("semver-spec") ThisBuild / csrCacheDirectory := (ThisBuild / baseDirectory).value / "coursier-cache" diff --git a/sbt-app/src/sbt-test/dependency-management/ext-pom-classifier/build.sbt b/sbt-app/src/sbt-test/dependency-management/ext-pom-classifier/build.sbt index d3253a483..00bb5f7d5 100644 --- a/sbt-app/src/sbt-test/dependency-management/ext-pom-classifier/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/ext-pom-classifier/build.sbt @@ -2,6 +2,6 @@ ThisBuild / useCoursier := false lazy val root = (project in file(".")) .settings( - scalaVersion := "2.12.6", + scalaVersion := "2.12.19", externalPom() ) diff --git a/sbt-app/src/sbt-test/dependency-management/global-plugins/build.sbt b/sbt-app/src/sbt-test/dependency-management/global-plugins/build.sbt index 366c27de7..8f5047976 100644 --- a/sbt-app/src/sbt-test/dependency-management/global-plugins/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/global-plugins/build.sbt @@ -1 +1 @@ -scalaVersion := "2.12.12" +scalaVersion := "2.12.19" diff --git a/sbt-app/src/sbt-test/dependency-management/make-pom/build.sbt b/sbt-app/src/sbt-test/dependency-management/make-pom/build.sbt index 23e38d5a6..388f35898 100644 --- a/sbt-app/src/sbt-test/dependency-management/make-pom/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/make-pom/build.sbt @@ -9,7 +9,11 @@ lazy val root = (project in file(".")) settings ( TaskKey[Unit]("checkPom") := checkPom.value, TaskKey[Unit]("checkExtra") := checkExtra.value, TaskKey[Unit]("checkVersionPlusMapping") := checkVersionPlusMapping.value, + TaskKey[Unit]("checkAPIURL") := checkAPIURL.value, + TaskKey[Unit]("checkReleaseNotesURL") := checkReleaseNotesURL.value, resolvers += Resolver.sonatypeRepo("snapshots"), + apiURL := Some(url("https://www.scala-sbt.org/1.x/api/")), + releaseNotesURL := Some(url("https://github.com/sbt/sbt/releases")), makePomConfiguration := { val p = makePomConfiguration.value p.withExtra() @@ -50,6 +54,16 @@ lazy val checkVersionPlusMapping = (readPom) map { (pomXml) => () } +lazy val checkAPIURL = (readPom) map { (pomXml) => + val notes = pomXml \ "properties" \ "info.apiURL" + if (notes.isEmpty) sys.error("'apiURL' not found in generated pom.xml.") else () +} + +lazy val checkReleaseNotesURL = (readPom) map { (pomXml) => + val notes = pomXml \ "properties" \ "info.releaseNotesUrl" + if (notes.isEmpty) sys.error("'releaseNotesUrl' not found in generated pom.xml.") else () +} + lazy val checkPom = Def task { val pomXML = readPom.value checkProject(pomXML) diff --git a/sbt-app/src/sbt-test/dependency-management/make-pom/test b/sbt-app/src/sbt-test/dependency-management/make-pom/test index 1e92792f9..b6f7bda7d 100644 --- a/sbt-app/src/sbt-test/dependency-management/make-pom/test +++ b/sbt-app/src/sbt-test/dependency-management/make-pom/test @@ -1,3 +1,5 @@ > checkPom > checkExtra > checkVersionPlusMapping +> checkAPIURL +> checkReleaseNotesURL diff --git a/sbt-app/src/sbt-test/dependency-management/missingok/build.sbt b/sbt-app/src/sbt-test/dependency-management/missingok/build.sbt index 51257fd6e..aa97b584f 100644 --- a/sbt-app/src/sbt-test/dependency-management/missingok/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/missingok/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.13.2" +ThisBuild / scalaVersion := "2.13.12" libraryDependencies ++= Seq( "com.chuusai" %% "shapeless" % "2.3.3", // non-existing diff --git a/sbt-app/src/sbt-test/dependency-management/sbt-plugin-diamond/build.sbt b/sbt-app/src/sbt-test/dependency-management/sbt-plugin-diamond/build.sbt new file mode 100644 index 000000000..6b213123d --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/sbt-plugin-diamond/build.sbt @@ -0,0 +1,108 @@ +// sbt-plugin-example-diamond is a diamond graph of dependencies of sbt plugins. +// sbt-plugin-example-diamond +// / \ +// sbt-plugin-example-left sbt-plugin-example-right +// \ / +// sbt-plugin-example-bottom +// Depending on the version of sbt-plugin-example-diamond, we test different patterns +// of dependencies: +// * Some dependencies were published using the deprecated Maven paths, some with the new +// * Wheter the dependency on sbt-plugin-example-bottom needs conflict resolution or not + +inThisBuild( + Seq( + csrCacheDirectory := baseDirectory.value / "coursier-cache" + ) +) + +// only deprecated Maven paths +lazy val v1 = project + .in(file("v1")) + .settings( + localCache, + addSbtPlugin("ch.epfl.scala" % "sbt-plugin-example-diamond" % "0.1.0"), + checkUpdate := checkUpdateDef( + "sbt-plugin-example-diamond-0.1.0.jar", + "sbt-plugin-example-left-0.1.0.jar", + "sbt-plugin-example-right-0.1.0.jar", + "sbt-plugin-example-bottom-0.1.0.jar", + ).value + ) + +// diamond and left use the new Maven paths +lazy val v2 = project + .in(file("v2")) + .settings( + localCache, + addSbtPlugin("ch.epfl.scala" % "sbt-plugin-example-diamond" % "0.2.0"), + checkUpdate := checkUpdateDef( + "sbt-plugin-example-diamond_2.12_1.0-0.2.0.jar", + "sbt-plugin-example-left_2.12_1.0-0.2.0.jar", + "sbt-plugin-example-right-0.1.0.jar", + "sbt-plugin-example-bottom-0.1.0.jar", + ).value + ) + +// conflict resolution on bottom between new and deprecated Maven paths +lazy val v3 = project + .in(file("v3")) + .settings( + localCache, + addSbtPlugin("ch.epfl.scala" % "sbt-plugin-example-diamond" % "0.3.0"), + checkUpdate := checkUpdateDef( + "sbt-plugin-example-diamond_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-left_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-right-0.1.0.jar", + "sbt-plugin-example-bottom_2.12_1.0-0.2.0.jar", + ).value + ) + +// right still uses the deprecated Maven path and it depends on bottom +// which uses the new Maven path +lazy val v4 = project + .in(file("v4")) + .settings( + localCache, + addSbtPlugin("ch.epfl.scala" % "sbt-plugin-example-diamond" % "0.4.0"), + checkUpdate := checkUpdateDef( + "sbt-plugin-example-diamond_2.12_1.0-0.4.0.jar", + "sbt-plugin-example-left_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-right-0.2.0.jar", + "sbt-plugin-example-bottom_2.12_1.0-0.2.0.jar", + ).value + ) + +// only new Maven paths with conflict resolution on bottom +lazy val v5 = project + .in(file("v5")) + .settings( + localCache, + addSbtPlugin("ch.epfl.scala" % "sbt-plugin-example-diamond" % "0.5.0"), + checkUpdate := checkUpdateDef( + "sbt-plugin-example-diamond_2.12_1.0-0.5.0.jar", + "sbt-plugin-example-left_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-right_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-bottom_2.12_1.0-0.3.0.jar", + ).value + ) + +def localCache = + ivyPaths := IvyPaths( + baseDirectory.value.toString, + Some(((ThisBuild / baseDirectory).value / "ivy-cache").toString) + ) + +lazy val checkUpdate = taskKey[Unit]("check the resolved artifacts") + +def checkUpdateDef(expected: String*): Def.Initialize[Task[Unit]] = Def.task { + val report = update.value + val obtainedFiles = report.configurations + .find(_.configuration.name == Compile.name) + .toSeq + .flatMap(_.modules) + .flatMap(_.artifacts) + .map(_._2) + val obtainedSet = obtainedFiles.map(_.getName).toSet + val expectedSet = expected.toSet + "scala-library.jar" + assert(obtainedSet == expectedSet, obtainedFiles) +} diff --git a/sbt-app/src/sbt-test/dependency-management/sbt-plugin-diamond/disabled b/sbt-app/src/sbt-test/dependency-management/sbt-plugin-diamond/disabled new file mode 100644 index 000000000..32fc99ced --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/sbt-plugin-diamond/disabled @@ -0,0 +1,12 @@ +> v1 / checkUpdate +> v2 / checkUpdate +> v3 / checkUpdate +> v4 / checkUpdate +> v5 / checkUpdate + +> set ThisBuild / useCoursier:=false +> v1 / checkUpdate +> v2 / checkUpdate +> v3 / checkUpdate +> v4 / checkUpdate +> v5 / checkUpdate diff --git a/sbt-app/src/sbt-test/dependency-management/sbt-plugin-publish/build.sbt b/sbt-app/src/sbt-test/dependency-management/sbt-plugin-publish/build.sbt new file mode 100644 index 000000000..b49b1a248 --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/sbt-plugin-publish/build.sbt @@ -0,0 +1,163 @@ +import scala.util.matching.Regex + +lazy val repo = file("test-repo") +lazy val resolver = Resolver.file("test-repo", repo) + +lazy val sbtPlugin1 = project.in(file("sbt-plugin-1")) + .enablePlugins(SbtPlugin) + .settings( + organization := "org.example", + name := "sbt-plugin-1", + addSbtPlugin("ch.epfl.scala" % "sbt-plugin-example-diamond" % "0.5.0"), + publishTo := Some(resolver), + checkPackagedArtifacts := checkPackagedArtifactsDef("sbt-plugin-1", true).value, + checkPublish := checkPublishDef("sbt-plugin-1", true).value + ) + +lazy val testMaven1 = project.in(file("test-maven-1")) + .settings( + addSbtPlugin("org.example" % "sbt-plugin-1" % "0.1.0-SNAPSHOT"), + externalResolvers -= Resolver.defaultLocal, + resolvers += { + val base = (ThisBuild / baseDirectory).value + MavenRepository("test-repo", s"file://$base/test-repo") + }, + checkUpdate := checkUpdateDef( + "sbt-plugin-1_2.12_1.0-0.1.0-SNAPSHOT.jar", + "sbt-plugin-example-diamond_2.12_1.0-0.5.0.jar", + "sbt-plugin-example-left_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-right_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-bottom_2.12_1.0-0.3.0.jar", + ).value + ) + +lazy val testLocal1 = project.in(file("test-local-1")) + .settings( + addSbtPlugin("org.example" % "sbt-plugin-1" % "0.1.0-SNAPSHOT"), + checkUpdate := checkUpdateDef( + "sbt-plugin-1.jar", // resolved from local repository + "sbt-plugin-example-diamond_2.12_1.0-0.5.0.jar", + "sbt-plugin-example-left_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-right_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-bottom_2.12_1.0-0.3.0.jar", + ).value + ) + +// test publish without legacy Maven artifacts +lazy val sbtPlugin2 = project.in(file("sbt-plugin-2")) + .enablePlugins(SbtPlugin) + .settings( + organization := "org.example", + name := "sbt-plugin-2", + addSbtPlugin("ch.epfl.scala" % "sbt-plugin-example-diamond" % "0.5.0"), + sbtPluginPublishLegacyMavenStyle := false, + publishTo := Some(resolver), + checkPackagedArtifacts := checkPackagedArtifactsDef("sbt-plugin-2", false).value, + checkPublish := checkPublishDef("sbt-plugin-2", false).value, + ) + +lazy val testMaven2 = project.in(file("test-maven-2")) + .settings( + addSbtPlugin("org.example" % "sbt-plugin-2" % "0.1.0-SNAPSHOT"), + externalResolvers -= Resolver.defaultLocal, + resolvers += { + val base = (ThisBuild / baseDirectory).value + MavenRepository("test-repo", s"file://$base/test-repo") + }, + checkUpdate := checkUpdateDef( + "sbt-plugin-2_2.12_1.0-0.1.0-SNAPSHOT.jar", + "sbt-plugin-example-diamond_2.12_1.0-0.5.0.jar", + "sbt-plugin-example-left_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-right_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-bottom_2.12_1.0-0.3.0.jar", + ).value + ) + +lazy val testLocal2 = project.in(file("test-local-2")) + .settings( + addSbtPlugin("org.example" % "sbt-plugin-2" % "0.1.0-SNAPSHOT"), + checkUpdate := checkUpdateDef( + "sbt-plugin-2.jar", // resolved from local repository + "sbt-plugin-example-diamond_2.12_1.0-0.5.0.jar", + "sbt-plugin-example-left_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-right_2.12_1.0-0.3.0.jar", + "sbt-plugin-example-bottom_2.12_1.0-0.3.0.jar", + ).value + ) + +lazy val checkPackagedArtifacts = taskKey[Unit]("check the packaged artifacts") +lazy val checkPublish = taskKey[Unit]("check publish") +lazy val checkUpdate = taskKey[Unit]("check update") + +def checkPackagedArtifactsDef(artifactName: String, withLegacy: Boolean): Def.Initialize[Task[Unit]] = Def.task { + val packagedArtifacts = Keys.packagedArtifacts.value + + val legacyArtifacts = packagedArtifacts.keys.filter(a => a.name == artifactName) + if (withLegacy) { + assert(legacyArtifacts.size == 4) + val legacyPom = legacyArtifacts.find(_.`type` == "pom") + assert(legacyPom.isDefined) + val legacyPomContent = IO.read(packagedArtifacts(legacyPom.get)) + assert(legacyPomContent.contains(s"$artifactName")) + assert(legacyPomContent.contains(s"sbt-plugin-example-diamond")) + } else { + assert(legacyArtifacts.size == 0) + } + + val artifactsWithCrossVersion = + packagedArtifacts.keys.filter(a => a.name == s"${artifactName}_2.12_1.0") + assert(artifactsWithCrossVersion.size == 4) + val pomWithCrossVersion = artifactsWithCrossVersion.find(_.`type` == "pom") + assert(pomWithCrossVersion.isDefined) + val pomContent = IO.read(packagedArtifacts(pomWithCrossVersion.get)) + assert(pomContent.contains(s"${artifactName}_2.12_1.0")) + assert(pomContent.contains(s"sbt-plugin-example-diamond_2.12_1.0")) +} + +def checkPublishDef(artifactName: String, withLegacy: Boolean): Def.Initialize[Task[Unit]] = Def.task { + val _ = publish.value + val org = organization.value + val files = IO.listFiles(repo / org.replace('.', '/') / s"${artifactName}_2.12_1.0" / "0.1.0-SNAPSHOT") + val logger = streams.value.log + + assert(files.nonEmpty) + + val legacyRegex = + s"$artifactName-${Regex.quote("0.1.0-SNAPSHOT")}(-javadoc|-sources)?(\\.jar|\\.pom)".r + val legacyArtifacts = files.filter(f => legacyRegex.unapplySeq(f.name).isDefined) + if (withLegacy) { + val legacyJars = legacyArtifacts.map(_.name).filter(_.endsWith(".jar")) + assert(legacyJars.size == 3, legacyJars.mkString(", ")) // bin, sources and javadoc + val legacyPom = legacyArtifacts.find(_.name.endsWith(".pom")) + assert(legacyPom.isDefined, "missing legacy pom") + val legacyPomContent = IO.read(legacyPom.get) + assert(legacyPomContent.contains(s"$artifactName")) + assert(legacyPomContent.contains(s"sbt-plugin-example-diamond")) + } else { + assert(legacyArtifacts.size == 0) + } + + val withCrossVersionRegex = + s"$artifactName${Regex.quote("_2.12_1.0")}-${Regex.quote("0.1.0-SNAPSHOT")}(-javadoc|-sources)?(\\.jar|\\.pom)".r + val artifactWithCrossVersion = files.filter(f => withCrossVersionRegex.unapplySeq(f.name).isDefined) + val jarsWithCrossVersion = artifactWithCrossVersion.map(_.name).filter(_.endsWith(".jar")) + assert(jarsWithCrossVersion.size == 3, jarsWithCrossVersion.mkString(", ")) // bin, sources and javadoc + val pomWithCrossVersion = artifactWithCrossVersion.find(_.name.endsWith(".pom")) + assert(pomWithCrossVersion.isDefined, "missing pom with sbt cross-version _2.12_1.0") + val pomContent = IO.read(pomWithCrossVersion.get) + assert(pomContent.contains(s"${artifactName}_2.12_1.0")) + assert(pomContent.contains(s"sbt-plugin-example-diamond_2.12_1.0")) +} + +def checkUpdateDef(expected: String*): Def.Initialize[Task[Unit]] = Def.task { + val report = update.value + val obtainedFiles = report.configurations + .find(_.configuration.name == Compile.name) + .toSeq + .flatMap(_.modules) + .flatMap(_.artifacts) + .map(_._2) + val obtainedSet = obtainedFiles.map(_.getName).toSet + val expectedSet = expected.toSet + "scala-library.jar" + assert(obtainedSet == expectedSet, obtainedSet) +} diff --git a/sbt-app/src/sbt-test/dependency-management/sbt-plugin-publish/disabled b/sbt-app/src/sbt-test/dependency-management/sbt-plugin-publish/disabled new file mode 100644 index 000000000..4816c7b88 --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/sbt-plugin-publish/disabled @@ -0,0 +1,24 @@ +> sbtPlugin1 / checkPackagedArtifacts + +> sbtPlugin1 / checkPublish +> testMaven1 / checkUpdate +> set testMaven1 / useCoursier := false +> testMaven1 / checkUpdate + +> sbtPlugin1 / publishLocal +> testLocal1 / checkUpdate +> set testLocal1 / useCoursier := false +> testLocal1 / checkUpdate + +> sbtPlugin2 / checkPackagedArtifacts + +# test publish without legacy artifacts and resolve +> sbtPlugin2 / checkPublish +> testMaven2 / checkUpdate +> set testMaven2 / useCoursier := false +> testMaven2 / checkUpdate + +> sbtPlugin2 / publishLocal +> testLocal2 / checkUpdate +> set testLocal2 / useCoursier := false +> testLocal2 / checkUpdate diff --git a/sbt-app/src/sbt-test/dependency-management/snapshot-local/build.sbt b/sbt-app/src/sbt-test/dependency-management/snapshot-local/build.sbt index 4378e416f..4f6f86397 100644 --- a/sbt-app/src/sbt-test/dependency-management/snapshot-local/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/snapshot-local/build.sbt @@ -1,5 +1,5 @@ ThisBuild / organization := "com.example" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" ThisBuild / csrCacheDirectory := (ThisBuild / baseDirectory).value / "coursier-cache" def localCache = diff --git a/sbt-app/src/sbt-test/dependency-management/snapshot-resolution/build.sbt b/sbt-app/src/sbt-test/dependency-management/snapshot-resolution/build.sbt index 16678e2f2..1e96d06ac 100644 --- a/sbt-app/src/sbt-test/dependency-management/snapshot-resolution/build.sbt +++ b/sbt-app/src/sbt-test/dependency-management/snapshot-resolution/build.sbt @@ -1,5 +1,5 @@ ThisBuild / organization := "com.example" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" // TTL is 24h so we can't detect the change ThisBuild / useCoursier := false diff --git a/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze-update/build.sbt b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze-update/build.sbt new file mode 100644 index 000000000..ed6887bc4 --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze-update/build.sbt @@ -0,0 +1,4 @@ +lazy val a = project.settings( + scalaVersion := "2.13.4", + libraryDependencies += "org.scala-lang.modules" %% "scala-parallel-collections" % "1.0.4", // depends on library 2.13.6 +) diff --git a/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze-update/test b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze-update/test new file mode 100644 index 000000000..7f263ab0b --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze-update/test @@ -0,0 +1,3 @@ +-> a/scalaInstance +> set a/scalaVersion := "2.13.6" +> a/scalaInstance diff --git a/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/a/A.scala b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/a/A.scala new file mode 100644 index 000000000..d1522c579 --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/a/A.scala @@ -0,0 +1,20 @@ +import scala.language.reflectiveCalls + +object A extends App { + println(scala.util.Properties.versionString) +} + +object AMacro { + import scala.language.experimental.macros + import scala.reflect.macros.blackbox.Context + + def m(x: Int): Int = macro impl + + def impl(c: Context)(x: c.Expr[Int]): c.Expr[Int] = { + import c.universe._ + // added in 2.13.4 + val ec = (scala.concurrent.ExecutionContext: {def opportunistic: scala.concurrent.ExecutionContextExecutor}).opportunistic + println(ec) + c.Expr(q"2 + $x") + } +} diff --git a/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/a3/A.scala b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/a3/A.scala new file mode 100644 index 000000000..e6f35a100 --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/a3/A.scala @@ -0,0 +1,17 @@ +import scala.quoted.* // imports Quotes, Expr + +package scala.collection { + object Exp: + // added in 2.13.10, not available in 2.13.8 + def m(i: Int) = IterableOnce.checkArraySizeWithinVMLimit(i) +} + +object Mac: + inline def inspect(inline x: Any): Any = ${ inspectCode('x) } + + def inspectCode(x: Expr[Any])(using Quotes): Expr[Any] = + scala.collection.Exp.m(42) + println(x.show) + x + +@main def huhu = println(scala.util.Properties.versionString) diff --git a/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/b/B.scala b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/b/B.scala new file mode 100644 index 000000000..e24101062 --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/b/B.scala @@ -0,0 +1,7 @@ +import java.nio.file.{Paths, Files} +import java.nio.charset.StandardCharsets + +object B extends App { + println(AMacro.m(33)) + Files.write(Paths.get(s"s${scala.util.Properties.versionNumberString}.txt"), "nix".getBytes) +} diff --git a/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/b3/B.scala b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/b3/B.scala new file mode 100644 index 000000000..a011c5c95 --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/b3/B.scala @@ -0,0 +1,6 @@ +import java.nio.file.{Paths, Files} +import java.nio.charset.StandardCharsets + +@main def hubu = + Mac.inspect(println("hai")) + Files.write(Paths.get(s"s${scala.util.Properties.versionNumberString}.txt"), "nix".getBytes) diff --git a/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/build.sbt b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/build.sbt new file mode 100644 index 000000000..901101cea --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/build.sbt @@ -0,0 +1,46 @@ +import sbt.librarymanagement.InclExclRule + +lazy val a = project.settings( + scalaVersion := "2.13.6", + libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value, + TaskKey[Unit]("checkLibs") := checkLibs("2.13.6", (Compile/dependencyClasspath).value, ".*scala-(library|reflect).*"), +) + +lazy val b = project.dependsOn(a).settings( + scalaVersion := "2.13.8", + TaskKey[Unit]("checkLibs") := checkLibs("2.13.8", (Compile/dependencyClasspath).value, ".*scala-(library|reflect).*"), +) + +lazy val a3 = project.settings( + scalaVersion := "3.2.2", // 2.13.10 library +) + +lazy val b3 = project.dependsOn(a3).settings( + scalaVersion := "3.2.0", // 2.13.8 library + TaskKey[Unit]("checkScala") := { + val i = scalaInstance.value + i.libraryJars.filter(_.toString.contains("scala-library")).toList match { + case List(l) => assert(l.toString.contains("2.13.10"), i.toString) + } + assert(i.compilerJars.filter(_.toString.contains("scala-library")).isEmpty, i.toString) + assert(i.otherJars.filter(_.toString.contains("scala-library")).isEmpty, i.toString) + }, +) + +lazy val ak = project.settings( + scalaVersion := "2.13.12", + csrSameVersions += Set[InclExclRule]("com.typesafe.akka" % "akka-*"), + libraryDependencies ++= Seq( + "com.typesafe.akka" %% "akka-remote" % "2.6.5", + "com.typesafe.akka" %% "akka-actor" % "2.6.2", + ), + TaskKey[Unit]("checkLibs") := checkLibs("2.6.5", (Compile/dependencyClasspath).value, ".*akka-.*"), +) + +def checkLibs(v: String, cp: Classpath, filter: String): Unit = { + for (p <- cp) + if (p.toString.matches(filter)) { + println(s"$p -- $v") + assert(p.toString.contains(v), p) + } +} diff --git a/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/test b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/test new file mode 100644 index 000000000..7df93ab6c --- /dev/null +++ b/sbt-app/src/sbt-test/dependency-management/stdlib-unfreeze/test @@ -0,0 +1,20 @@ +> a/checkLibs +> b/checkLibs + +> b/run +$ exists s2.13.8.txt +$ delete s2.13.8.txt + +# don't crash when expanding the macro +> b3/run +$ exists s2.13.10.txt +$ delete s2.13.10.txt + +> b3/checkScala + +# without the default `csrSameVersions`, scala-reflect in b stays at 2.13.6 +> set b/csrSameVersions := Nil +> b/update +-> b/checkLibs + +> ak/checkLibs diff --git a/sbt-app/src/sbt-test/ivy-deps-management/update-classifiers-snapshot-srcs/build.sbt b/sbt-app/src/sbt-test/ivy-deps-management/update-classifiers-snapshot-srcs/build.sbt index 64ad6b758..fbd3c5f71 100644 --- a/sbt-app/src/sbt-test/ivy-deps-management/update-classifiers-snapshot-srcs/build.sbt +++ b/sbt-app/src/sbt-test/ivy-deps-management/update-classifiers-snapshot-srcs/build.sbt @@ -7,19 +7,23 @@ val commonSettings = Seq[Def.Setting[_]]( organization := "org.example", version := "1.0-SNAPSHOT", scalaVersion := "2.11.7", - ivyPaths := IvyPaths((baseDirectory in ThisBuild).value, Some(ivyHome.value)), + ivyPaths := IvyPaths((baseDirectory in ThisBuild).value.toString, Some(ivyHome.value.toString)), fullResolvers := fullResolvers.value.filterNot(_ == projectResolver.value) ) lazy val bippy = project settings ( commonSettings, - resolvers += Resolver.file("ivy-local", file(sys.props("user.home")) / ".ivy2" / "local")(Resolver.ivyStylePatterns), + resolvers += Resolver + .file("ivy-local", file(sys.props("user.home")) / ".ivy2" / "local")(Resolver.ivyStylePatterns), publishTo := Some(Resolver.file("local-repo", localRepo.value)) ) lazy val myapp = project settings ( commonSettings, - resolvers += new MavenRepository("local-repo", localRepo.value.toURL.toString) withLocalIfFile false, + resolvers += new MavenRepository( + "local-repo", + localRepo.value.toURL.toString + ) withLocalIfFile false, libraryDependencies += "org.example" %% "bippy" % "1.0-SNAPSHOT" ) @@ -29,7 +33,8 @@ InputKey[Unit]("check") := { val jarname = "bippy_2.11-1.0-SNAPSHOT-sources.jar" val file1 = ivyHome.value / "cache" / "org.example" / "bippy_2.11" / "srcs" / jarname - val file2 = ivyHome.value / "maven-cache" / "org" / "example" / "bippy_2.11" / "1.0-SNAPSHOT" / jarname + val file2 = + ivyHome.value / "maven-cache" / "org" / "example" / "bippy_2.11" / "1.0-SNAPSHOT" / jarname val file = if (file1.exists()) file1 else if (file2.exists) file2 else sys error s"$jarname MIA" val jar = new java.util.jar.JarFile(file) val s = IO readStream jar.getInputStream(jar.getJarEntry("Bippy.scala")) diff --git a/sbt-app/src/sbt-test/java/argfile/build.sbt b/sbt-app/src/sbt-test/java/argfile/build.sbt index c31ca0ae8..7b1038980 100644 --- a/sbt-app/src/sbt-test/java/argfile/build.sbt +++ b/sbt-app/src/sbt-test/java/argfile/build.sbt @@ -1,7 +1,7 @@ Configurations.Compile / scalaSource := (sourceDirectory.value / " scala test ") Configurations.Compile / javaSource := (sourceDirectory.value / " java test ") -TaskKey[Unit]("init") := { +TaskKey[Unit]("init0") := { val ss = (Configurations.Compile / scalaSource).value val js = (Configurations.Compile / javaSource).value import IO._ diff --git a/sbt-app/src/sbt-test/java/argfile/test b/sbt-app/src/sbt-test/java/argfile/test index 75991e02e..5563b8c77 100644 --- a/sbt-app/src/sbt-test/java/argfile/test +++ b/sbt-app/src/sbt-test/java/argfile/test @@ -1,2 +1,2 @@ -> init +> init0 > run \ No newline at end of file diff --git a/sbt-app/src/sbt-test/java/cross/build.sbt b/sbt-app/src/sbt-test/java/cross/build.sbt index c71bd179e..b5f39d15e 100644 --- a/sbt-app/src/sbt-test/java/cross/build.sbt +++ b/sbt-app/src/sbt-test/java/cross/build.sbt @@ -4,7 +4,7 @@ val check = inputKey[Unit]("Runs the check") lazy val root = (project in file(".")) .settings( - ThisBuild / scalaVersion := "2.12.6", + ThisBuild / scalaVersion := "2.12.19", crossJavaVersions := List("1.8"), // read out.txt and see if it starts with the passed in number diff --git a/sbt-app/src/sbt-test/java/cross/changes/build.sbt b/sbt-app/src/sbt-test/java/cross/changes/build.sbt index 245745912..9facfdb8d 100644 --- a/sbt-app/src/sbt-test/java/cross/changes/build.sbt +++ b/sbt-app/src/sbt-test/java/cross/changes/build.sbt @@ -4,7 +4,7 @@ val check = inputKey[Unit]("Runs the check") lazy val root = (project in file(".")) .settings( - ThisBuild / scalaVersion := "2.12.6", + ThisBuild / scalaVersion := "2.12.19", crossJavaVersions := List("1.8", "10"), // read out.txt and see if it starts with the passed in number diff --git a/sbt-app/src/sbt-test/plugins/dotty-sandwich-sjs/build.sbt b/sbt-app/src/sbt-test/plugins/dotty-sandwich-sjs/build.sbt index f28325922..5fd5c06b8 100644 --- a/sbt-app/src/sbt-test/plugins/dotty-sandwich-sjs/build.sbt +++ b/sbt-app/src/sbt-test/plugins/dotty-sandwich-sjs/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.13.8" +ThisBuild / scalaVersion := "2.13.12" ThisBuild / scalacOptions += "-Ytasty-reader" lazy val scala3code = project diff --git a/sbt-app/src/sbt-test/plugins/dotty-sandwich/build.sbt b/sbt-app/src/sbt-test/plugins/dotty-sandwich/build.sbt index fe7f9dd1f..a8e206007 100644 --- a/sbt-app/src/sbt-test/plugins/dotty-sandwich/build.sbt +++ b/sbt-app/src/sbt-test/plugins/dotty-sandwich/build.sbt @@ -1,7 +1,7 @@ ThisBuild / scalaVersion := "3.1.3" ThisBuild / scalacOptions += "-Ytasty-reader" -lazy val scala213 = "2.13.8" +lazy val scala213 = "2.13.12" lazy val root = (project in file(".")) .aggregate(fooApp, fooCore, barApp, barCore) diff --git a/sbt-app/src/sbt-test/plugins/hydra/build.sbt b/sbt-app/src/sbt-test/plugins/hydra/build.sbt index 2324a2515..efc3b0a27 100644 --- a/sbt-app/src/sbt-test/plugins/hydra/build.sbt +++ b/sbt-app/src/sbt-test/plugins/hydra/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val check = taskKey[Unit]("") diff --git a/sbt-app/src/sbt-test/plugins/sbt-native-packager/build.sbt b/sbt-app/src/sbt-test/plugins/sbt-native-packager/build.sbt index 8f8aa3c80..202a48a91 100644 --- a/sbt-app/src/sbt-test/plugins/sbt-native-packager/build.sbt +++ b/sbt-app/src/sbt-test/plugins/sbt-native-packager/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" name := "hello" enablePlugins(JavaAppPackaging) diff --git a/sbt-app/src/sbt-test/plugins/unidoc/build.sbt b/sbt-app/src/sbt-test/plugins/unidoc/build.sbt index 3aa46422f..2abb1992d 100644 --- a/sbt-app/src/sbt-test/plugins/unidoc/build.sbt +++ b/sbt-app/src/sbt-test/plugins/unidoc/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "2.12.1" +scalaVersion := "2.12.19" scalacOptions += "-Xfatal-warnings" // required for the test enablePlugins(ScalaUnidocPlugin) diff --git a/sbt-app/src/sbt-test/project/skip/build.sbt b/sbt-app/src/sbt-test/project/skip/build.sbt new file mode 100644 index 000000000..9f575bd75 --- /dev/null +++ b/sbt-app/src/sbt-test/project/skip/build.sbt @@ -0,0 +1,28 @@ +publish / skip := true + +lazy val check = taskKey[Unit]("check") + +lazy val a = project + .in(file("a")) + .settings( + publishLocal / skip := true + ) + +lazy val b = project + .in(file("b")) + +lazy val c = project + .in(file("c")) + .settings( + publish / skip := true + ) + +check := { + assert((publishLocal / skip).value, "Expected true, got false") + assert((a / publishLocal / skip).value, "Expected true, got false") + assert(!(a / publish / skip).value, "Expected false, got true") + assert(!(b / publish / skip).value, "Expected false, got true") + assert(!(b / publishLocal / skip).value, "Expected false, got true") + assert((c / publishLocal / skip).value, "Expected true, got false") + assert((c / publish / skip ).value, "Expected true, got false") +} diff --git a/sbt-app/src/sbt-test/project/skip/test b/sbt-app/src/sbt-test/project/skip/test new file mode 100644 index 000000000..d2f0e9905 --- /dev/null +++ b/sbt-app/src/sbt-test/project/skip/test @@ -0,0 +1,4 @@ +> check + +# should not fail if skipped, and publishTo is empty +> c / publish diff --git a/sbt-app/src/sbt-test/project1/aggregate/projA/build.sbt b/sbt-app/src/sbt-test/project1/aggregate/projA/build.sbt index cb6b82872..b12345076 100644 --- a/sbt-app/src/sbt-test/project1/aggregate/projA/build.sbt +++ b/sbt-app/src/sbt-test/project1/aggregate/projA/build.sbt @@ -1,3 +1,3 @@ name := "projA" -scalaVersion := "2.12.12" +scalaVersion := "2.12.19" diff --git a/sbt-app/src/sbt-test/project1/cross-plugins-defaults/build.sbt b/sbt-app/src/sbt-test/project1/cross-plugins-defaults/build.sbt index 07ff57632..8f328730b 100644 --- a/sbt-app/src/sbt-test/project1/cross-plugins-defaults/build.sbt +++ b/sbt-app/src/sbt-test/project1/cross-plugins-defaults/build.sbt @@ -1,7 +1,7 @@ val baseSbt = "1." -val buildCrossList = List("2.10.7", "2.11.12", "2.12.12") -(ThisBuild / scalaVersion) := "2.12.12" +val buildCrossList = List("2.10.7", "2.11.12", "2.12.19") +(ThisBuild / scalaVersion) := "2.12.19" (ThisBuild / crossScalaVersions) := buildCrossList addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.7.0") @@ -21,12 +21,17 @@ def mkCheck(scalaBinV: String, sbtBinVer: String, sbtVerPrefix: String) = Def.ta val sv = projectID.value.extraAttributes("e:scalaVersion") assert(sbtVersion.value startsWith baseSbt, s"Wrong sbt version: ${sbtVersion.value}") assert(sv == scalaBinV, s"Wrong e:scalaVersion: $sv") - assert(scalaBinaryVersion.value == scalaBinV, s"Wrong Scala binary version: ${scalaBinaryVersion.value}") + assert( + scalaBinaryVersion.value == scalaBinV, + s"Wrong Scala binary version: ${scalaBinaryVersion.value}" + ) assert(crossV startsWith sbtVerPrefix, s"Wrong `sbtVersion in pluginCrossBuild`: $crossV") val ur = update.value val cr = ur.configuration(Compile).get - val mr = cr.modules.find(mr => mr.module.organization == "com.eed3si9n" && mr.module.name == "sbt-buildinfo").get + val mr = cr.modules + .find(mr => mr.module.organization == "com.eed3si9n" && mr.module.name == "sbt-buildinfo") + .get val plugSv = mr.module.extraAttributes("scalaVersion") val plugSbtV = mr.module.extraAttributes("sbtVersion") assert(plugSv == scalaBinV, s"Wrong plugin scalaVersion: $plugSv") @@ -35,6 +40,9 @@ def mkCheck(scalaBinV: String, sbtBinVer: String, sbtVerPrefix: String) = Def.ta // crossScalaVersions in app should not be affected, per se or after ^^ val appCrossScalaVersions = (app / crossScalaVersions).value.toList val appScalaVersion = (app / scalaVersion).value - assert(appCrossScalaVersions == buildCrossList, s"Wrong `crossScalaVersions in app`: $appCrossScalaVersions") + assert( + appCrossScalaVersions == buildCrossList, + s"Wrong `crossScalaVersions in app`: $appCrossScalaVersions" + ) assert(appScalaVersion startsWith "2.12", s"Wrong `scalaVersion in app`: $appScalaVersion") } diff --git a/sbt-app/src/sbt-test/project1/flatten/build.sbt b/sbt-app/src/sbt-test/project1/flatten/build.sbt index 3e3f1da00..89646a328 100644 --- a/sbt-app/src/sbt-test/project1/flatten/build.sbt +++ b/sbt-app/src/sbt-test/project1/flatten/build.sbt @@ -1,6 +1,6 @@ val unpackage = TaskKey[Unit]("unpackage") -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val root = (project in file(".")) .settings( diff --git a/sbt-app/src/sbt-test/project1/generated-root-no-publish/build.sbt b/sbt-app/src/sbt-test/project1/generated-root-no-publish/build.sbt index ae666eb28..6408dd195 100644 --- a/sbt-app/src/sbt-test/project1/generated-root-no-publish/build.sbt +++ b/sbt-app/src/sbt-test/project1/generated-root-no-publish/build.sbt @@ -4,11 +4,13 @@ ThisBuild / csrCacheDirectory := (ThisBuild / baseDirectory).value / "coursier-c val commonSettings = Seq( organization := "com.example", version := "0.1.0", - ivyPaths := IvyPaths((LocalRootProject / baseDirectory).value, Some((LocalRootProject / target).value / "ivy-cache")) + ivyPaths := IvyPaths( + (LocalRootProject / baseDirectory).value.toString, + Some(((LocalRootProject / target).value / "ivy-cache").toString) + ) ) -lazy val app = (project in file("app")). - settings(commonSettings: _*) +lazy val app = (project in file("app")).settings(commonSettings: _*) name := "generated-root-no-publish" commonSettings diff --git a/sbt-app/src/sbt-test/project1/generated-root-no-publish/changes/bare.sbt b/sbt-app/src/sbt-test/project1/generated-root-no-publish/changes/bare.sbt index 80e595cfb..9a5aac831 100644 --- a/sbt-app/src/sbt-test/project1/generated-root-no-publish/changes/bare.sbt +++ b/sbt-app/src/sbt-test/project1/generated-root-no-publish/changes/bare.sbt @@ -3,4 +3,7 @@ ThisBuild / csrCacheDirectory := (ThisBuild / baseDirectory).value / "coursier-c organization := "com.example" version := "0.1.0" -ivyPaths := IvyPaths((LocalRootProject / baseDirectory).value, Some((LocalRootProject / target).value / "ivy-cache")) +ivyPaths := IvyPaths( + (LocalRootProject / baseDirectory).value.toString, + Some(((LocalRootProject / target).value / "ivy-cache").toString) +) diff --git a/sbt-app/src/sbt-test/project1/internal-tracking/build.sbt b/sbt-app/src/sbt-test/project1/internal-tracking/build.sbt index 0d567f22e..711d9f88a 100644 --- a/sbt-app/src/sbt-test/project1/internal-tracking/build.sbt +++ b/sbt-app/src/sbt-test/project1/internal-tracking/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" ThisBuild / trackInternalDependencies := TrackLevel.NoTracking lazy val root = (project in file(".")) diff --git a/sbt-app/src/sbt-test/project1/sbt-plugin/build.sbt b/sbt-app/src/sbt-test/project1/sbt-plugin/build.sbt index d0943ff9d..681686b5a 100644 --- a/sbt-app/src/sbt-test/project1/sbt-plugin/build.sbt +++ b/sbt-app/src/sbt-test/project1/sbt-plugin/build.sbt @@ -1,6 +1,6 @@ lazy val root = project.in(file(".")) .enablePlugins(SbtPlugin) .settings( - scalaVersion := "2.12.17", + scalaVersion := "2.12.19", scalacOptions ++= Seq("-Xfatal-warnings", "-Xlint") ) diff --git a/sbt-app/src/sbt-test/project1/sbt-plugin/changes/oldSbtPlugin.sbt b/sbt-app/src/sbt-test/project1/sbt-plugin/changes/oldSbtPlugin.sbt index 61199e931..7b654c196 100644 --- a/sbt-app/src/sbt-test/project1/sbt-plugin/changes/oldSbtPlugin.sbt +++ b/sbt-app/src/sbt-test/project1/sbt-plugin/changes/oldSbtPlugin.sbt @@ -1,6 +1,6 @@ lazy val root = project.in(file(".")) .settings( - scalaVersion := "2.12.17", + scalaVersion := "2.12.19", sbtPlugin := true, scalacOptions ++= Seq("-Xfatal-warnings", "-Xlint") ) diff --git a/sbt-app/src/sbt-test/project1/semanticdb/build.sbt b/sbt-app/src/sbt-test/project1/semanticdb/build.sbt index 8c8a5b3d2..fcc03b2ec 100644 --- a/sbt-app/src/sbt-test/project1/semanticdb/build.sbt +++ b/sbt-app/src/sbt-test/project1/semanticdb/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.16" +ThisBuild / scalaVersion := "2.12.19" ThisBuild / semanticdbEnabled := true ThisBuild / semanticdbIncludeInJar := true diff --git a/sbt-app/src/sbt-test/project1/transitive-plugins/build.sbt b/sbt-app/src/sbt-test/project1/transitive-plugins/build.sbt index a3a4057ec..ecbe2e0c2 100644 --- a/sbt-app/src/sbt-test/project1/transitive-plugins/build.sbt +++ b/sbt-app/src/sbt-test/project1/transitive-plugins/build.sbt @@ -7,12 +7,17 @@ lazy val root = (project in file(".")) ) lazy val commonSettings = Seq( - ivyPaths := IvyPaths((baseDirectory in ThisBuild).value, Some((target in LocalRootProject).value / "ivy-cache")), + ivyPaths := IvyPaths( + (baseDirectory in ThisBuild).value.toString, + Some(((target in LocalRootProject).value / "ivy-cache").toString) + ), publishTo := Some(Resolver.file("test-publish", (baseDirectory in ThisBuild).value / "repo/")), // to get sbt artifacts resolvers += { - val ivyHome = Classpaths.bootIvyHome(appConfiguration.value) getOrElse sys.error("Launcher did not provide the Ivy home directory.") - Resolver.file("real-local", ivyHome / "local")(Resolver.ivyStylePatterns) + val ivyHome = Classpaths.bootIvyHome(appConfiguration.value) getOrElse sys.error( + "Launcher did not provide the Ivy home directory." + ) + Resolver.file("real-local", ivyHome / "local")(Resolver.ivyStylePatterns) }, resolvers += Resolver.mavenLocal, resolvers += ("test-repo" at ((baseDirectory in ThisBuild).value / "repo/").asURL.toString) diff --git a/sbt-app/src/sbt-test/project1/unified/build.sbt b/sbt-app/src/sbt-test/project1/unified/build.sbt index fe6b1a94a..18ae6cfce 100644 --- a/sbt-app/src/sbt-test/project1/unified/build.sbt +++ b/sbt-app/src/sbt-test/project1/unified/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.17" +ThisBuild / scalaVersion := "2.12.19" import sbt.internal.CommandStrings.{ inspectBrief, inspectDetailed } import sbt.internal.Inspect diff --git a/sbt-app/src/sbt-test/project1/val-order/build.sbt b/sbt-app/src/sbt-test/project1/val-order/build.sbt index d34d36cdc..683c645b6 100644 --- a/sbt-app/src/sbt-test/project1/val-order/build.sbt +++ b/sbt-app/src/sbt-test/project1/val-order/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.13.1" +ThisBuild / scalaVersion := "2.13.12" ThisBuild / version := "0.1.0-SNAPSHOT" lazy val check = taskKey[Unit]("") diff --git a/sbt-app/src/sbt-test/reporter/command-progress/build.sbt b/sbt-app/src/sbt-test/reporter/command-progress/build.sbt new file mode 100644 index 000000000..81985c63a --- /dev/null +++ b/sbt-app/src/sbt-test/reporter/command-progress/build.sbt @@ -0,0 +1,38 @@ +commandProgress += new ExecuteProgress2: + override def beforeCommand(cmd: String, state: State): Unit = { + EventLog.logs += (s"BEFORE: $cmd") + // assert that `state` is the current state indeed + assert(state.currentCommand.isDefined) + assert(state.currentCommand.get.commandLine == cmd) + } + override def afterCommand(cmd: String, result: Either[Throwable, State]): Unit = { + EventLog.logs += (s"AFTER: $cmd") + result.left.foreach(EventLog.errors += _) + } + override def initial(): Unit = {} + override def afterRegistered( + task: TaskId[?], + allDeps: Iterable[TaskId[?]], + pendingDeps: Iterable[TaskId[?]] + ): Unit = () + override def afterReady(task: TaskId[_]): Unit = () + override def beforeWork(task: TaskId[_]): Unit = () + override def afterWork[A](task: TaskId[A], result: Either[TaskId[A], Result[A]]): Unit = () + override def afterCompleted[A](task: TaskId[A], result: Result[A]): Unit = () + override def afterAllCompleted(results: RMap[TaskId, Result]): Unit = () + override def stop(): Unit = () + +val check = taskKey[Unit]("Check basic command events") +val checkParseError = taskKey[Unit]("Check that parse error is recorded") + +check := { + def hasEvent(cmd: String): Boolean = + EventLog.logs.contains(s"BEFORE: $cmd") && EventLog.logs.contains(s"AFTER: $cmd") + + assert(hasEvent("compile"), "Missing command event `compile`") + assert(hasEvent("+compile"), "Missing command event `+compile`") +} + +checkParseError := { + assert(EventLog.errors.exists(_.getMessage.toLowerCase.contains("not a valid command"))) +} diff --git a/sbt-app/src/sbt-test/reporter/command-progress/project/EventLog.scala b/sbt-app/src/sbt-test/reporter/command-progress/project/EventLog.scala new file mode 100644 index 000000000..88b00c491 --- /dev/null +++ b/sbt-app/src/sbt-test/reporter/command-progress/project/EventLog.scala @@ -0,0 +1,8 @@ +import scala.collection.mutable.ListBuffer + +object EventLog { + val logs = ListBuffer.empty[String] + val errors = ListBuffer.empty[Throwable] + + def reset(): Unit = logs.clear() +} diff --git a/sbt-app/src/sbt-test/reporter/command-progress/test b/sbt-app/src/sbt-test/reporter/command-progress/test new file mode 100644 index 000000000..9011065e1 --- /dev/null +++ b/sbt-app/src/sbt-test/reporter/command-progress/test @@ -0,0 +1,5 @@ +> compile +> +compile +> check +-> asdf +> checkParseError diff --git a/sbt-app/src/sbt-test/run/fork-loader/build.sbt b/sbt-app/src/sbt-test/run/fork-loader/build.sbt index 9ffe20e13..c5b8530f1 100644 --- a/sbt-app/src/sbt-test/run/fork-loader/build.sbt +++ b/sbt-app/src/sbt-test/run/fork-loader/build.sbt @@ -1,6 +1,6 @@ val scalcheck = "org.scalacheck" %% "scalacheck" % "1.14.0" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val root = (project in file(".")) .settings( diff --git a/sbt-app/src/sbt-test/run/fork-loader/test b/sbt-app/src/sbt-test/run/fork-loader/disabled similarity index 100% rename from sbt-app/src/sbt-test/run/fork-loader/test rename to sbt-app/src/sbt-test/run/fork-loader/disabled diff --git a/sbt-app/src/sbt-test/run/non-local-main/test b/sbt-app/src/sbt-test/run/non-local-main/disabled similarity index 100% rename from sbt-app/src/sbt-test/run/non-local-main/test rename to sbt-app/src/sbt-test/run/non-local-main/disabled diff --git a/sbt-app/src/sbt-test/run/spawn-exit/test b/sbt-app/src/sbt-test/run/spawn-exit/disabled similarity index 100% rename from sbt-app/src/sbt-test/run/spawn-exit/test rename to sbt-app/src/sbt-test/run/spawn-exit/disabled diff --git a/sbt-app/src/sbt-test/run/spawn/test b/sbt-app/src/sbt-test/run/spawn/disabled similarity index 100% rename from sbt-app/src/sbt-test/run/spawn/test rename to sbt-app/src/sbt-test/run/spawn/disabled diff --git a/sbt-app/src/sbt-test/source-dependencies/binary/build.sbt b/sbt-app/src/sbt-test/source-dependencies/binary/build.sbt index 09dea40d0..98ff1e4b2 100644 --- a/sbt-app/src/sbt-test/source-dependencies/binary/build.sbt +++ b/sbt-app/src/sbt-test/source-dependencies/binary/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val dep = project diff --git a/sbt-app/src/sbt-test/source-dependencies/constants/test b/sbt-app/src/sbt-test/source-dependencies/constants/test index eeebe3599..ff8815d85 100644 --- a/sbt-app/src/sbt-test/source-dependencies/constants/test +++ b/sbt-app/src/sbt-test/source-dependencies/constants/test @@ -1,4 +1,4 @@ -> ++2.12.17! +> ++2.12.19! $ copy-file changes/B.scala B.scala @@ -8,7 +8,7 @@ $ copy-file changes/A2.scala A.scala > run 2 > clean -> ++2.13.6! +> ++2.13.12! $ copy-file changes/A1.scala A.scala > run 1 diff --git a/sbt-app/src/sbt-test/source-dependencies/cross-source/test b/sbt-app/src/sbt-test/source-dependencies/cross-source/test index d0d770085..53348a66c 100644 --- a/sbt-app/src/sbt-test/source-dependencies/cross-source/test +++ b/sbt-app/src/sbt-test/source-dependencies/cross-source/test @@ -1,3 +1,3 @@ # A.scala needs B.scala, it would be in source list -> ++2.12.12! +> ++2.12.19! > compile diff --git a/sbt-app/src/sbt-test/source-dependencies/export-jars/changes/B.scala b/sbt-app/src/sbt-test/source-dependencies/export-jars/changes/B.scala index 058527993..1e08585d1 100644 --- a/sbt-app/src/sbt-test/source-dependencies/export-jars/changes/B.scala +++ b/sbt-app/src/sbt-test/source-dependencies/export-jars/changes/B.scala @@ -1,4 +1,3 @@ -object B -{ - def main(args: Array[String]) = assert(args(0).toInt == A.x ) -} \ No newline at end of file +object B { + def main(args: Array[String]) = assert(args(0).toInt == A.x, s"actual A.x is ${A.x}") +} diff --git a/sbt-app/src/sbt-test/source-dependencies/export-jars/test b/sbt-app/src/sbt-test/source-dependencies/export-jars/test index f1a605f00..3aff93a7d 100644 --- a/sbt-app/src/sbt-test/source-dependencies/export-jars/test +++ b/sbt-app/src/sbt-test/source-dependencies/export-jars/test @@ -1,12 +1,16 @@ $ copy-file changes/B.scala B.scala $ copy-file changes/A1.scala a/A.scala +$ sleep 1000 + > run 1 $ copy-file changes/A2.scala a/A.scala +$ sleep 1000 # done this way because last modified times often have ~1s resolution > run 2 $ copy-file changes/A3.scala a/A.scala +$ sleep 1000 > run 3 @@ -14,10 +18,14 @@ $ copy-file changes/build2.sbt build2.sbt > reload $ copy-file changes/A1.scala a/A.scala +$ sleep 1000 + > run 1 $ copy-file changes/A2.scala a/A.scala +$ sleep 1000 > run 2 $ copy-file changes/A3.scala a/A.scala +$ sleep 1000 > run 3 diff --git a/sbt-app/src/sbt-test/source-dependencies/false-error/pending b/sbt-app/src/sbt-test/source-dependencies/false-error/test similarity index 100% rename from sbt-app/src/sbt-test/source-dependencies/false-error/pending rename to sbt-app/src/sbt-test/source-dependencies/false-error/test diff --git a/sbt-app/src/sbt-test/source-dependencies/implicit-search/test b/sbt-app/src/sbt-test/source-dependencies/implicit-search/test index 91f01259f..18d69f6b8 100644 --- a/sbt-app/src/sbt-test/source-dependencies/implicit-search/test +++ b/sbt-app/src/sbt-test/source-dependencies/implicit-search/test @@ -5,5 +5,7 @@ $ copy-file changes/C.scala C.scala -> run $ copy-file changes/A2.scala A.scala +$ sleep 1000 + > compile > run diff --git a/sbt-app/src/sbt-test/source-dependencies/linearization/test b/sbt-app/src/sbt-test/source-dependencies/linearization/test index e6078ebfb..22f17664a 100644 --- a/sbt-app/src/sbt-test/source-dependencies/linearization/test +++ b/sbt-app/src/sbt-test/source-dependencies/linearization/test @@ -5,6 +5,8 @@ # modify D.scala so that the linearization changes $ copy-file changes/D.scala D.scala +$ sleep 1000 + # F.x becomes 11 > compile diff --git a/sbt-app/src/sbt-test/source-dependencies/macro-annotation/build.sbt b/sbt-app/src/sbt-test/source-dependencies/macro-annotation/build.sbt index 0db8723f6..14f708f09 100644 --- a/sbt-app/src/sbt-test/source-dependencies/macro-annotation/build.sbt +++ b/sbt-app/src/sbt-test/source-dependencies/macro-annotation/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" val paradiseVersion = "2.1.1" val commonSettings = Seq( diff --git a/sbt-app/src/sbt-test/source-dependencies/macro-arg-dep-nested/build.sbt b/sbt-app/src/sbt-test/source-dependencies/macro-arg-dep-nested/build.sbt index 71627ff7c..4e0809123 100644 --- a/sbt-app/src/sbt-test/source-dependencies/macro-arg-dep-nested/build.sbt +++ b/sbt-app/src/sbt-test/source-dependencies/macro-arg-dep-nested/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" val defaultSettings = Seq( libraryDependencies += scalaVersion("org.scala-lang" % "scala-reflect" % _ ).value diff --git a/sbt-app/src/sbt-test/source-dependencies/macro-arg-dep-stackoverflow/build.sbt b/sbt-app/src/sbt-test/source-dependencies/macro-arg-dep-stackoverflow/build.sbt index 71627ff7c..4e0809123 100644 --- a/sbt-app/src/sbt-test/source-dependencies/macro-arg-dep-stackoverflow/build.sbt +++ b/sbt-app/src/sbt-test/source-dependencies/macro-arg-dep-stackoverflow/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" val defaultSettings = Seq( libraryDependencies += scalaVersion("org.scala-lang" % "scala-reflect" % _ ).value diff --git a/sbt-app/src/sbt-test/source-dependencies/macro-arg-dep/build.sbt b/sbt-app/src/sbt-test/source-dependencies/macro-arg-dep/build.sbt index 71627ff7c..4e0809123 100644 --- a/sbt-app/src/sbt-test/source-dependencies/macro-arg-dep/build.sbt +++ b/sbt-app/src/sbt-test/source-dependencies/macro-arg-dep/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" val defaultSettings = Seq( libraryDependencies += scalaVersion("org.scala-lang" % "scala-reflect" % _ ).value diff --git a/sbt-app/src/sbt-test/source-dependencies/macro/build.sbt b/sbt-app/src/sbt-test/source-dependencies/macro/build.sbt index 71627ff7c..4e0809123 100644 --- a/sbt-app/src/sbt-test/source-dependencies/macro/build.sbt +++ b/sbt-app/src/sbt-test/source-dependencies/macro/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" val defaultSettings = Seq( libraryDependencies += scalaVersion("org.scala-lang" % "scala-reflect" % _ ).value diff --git a/sbt-app/src/sbt-test/source-dependencies/pipelining-java/build.sbt b/sbt-app/src/sbt-test/source-dependencies/pipelining-java/build.sbt index a5b9eef0d..7c8f19928 100644 --- a/sbt-app/src/sbt-test/source-dependencies/pipelining-java/build.sbt +++ b/sbt-app/src/sbt-test/source-dependencies/pipelining-java/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.13.3" +ThisBuild / scalaVersion := "2.13.12" ThisBuild / usePipelining := true lazy val root = (project in file(".")) diff --git a/sbt-app/src/sbt-test/source-dependencies/pipelining/build.sbt b/sbt-app/src/sbt-test/source-dependencies/pipelining/build.sbt index 36db86700..96b5b5a17 100644 --- a/sbt-app/src/sbt-test/source-dependencies/pipelining/build.sbt +++ b/sbt-app/src/sbt-test/source-dependencies/pipelining/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.13.3" +ThisBuild / scalaVersion := "2.13.12" ThisBuild / usePipelining := true lazy val root = (project in file(".")) diff --git a/sbt-app/src/sbt-test/tests/arguments/build.sbt b/sbt-app/src/sbt-test/tests/arguments/build.sbt index ac9bfeafa..7de646c0c 100644 --- a/sbt-app/src/sbt-test/tests/arguments/build.sbt +++ b/sbt-app/src/sbt-test/tests/arguments/build.sbt @@ -1,6 +1,6 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" val foo = settingKey[Seq[String]]("foo") val checkFoo = inputKey[Unit]("check contents of foo") diff --git a/sbt-app/src/sbt-test/tests/do-not-discover/build.sbt b/sbt-app/src/sbt-test/tests/do-not-discover/build.sbt index 4a2b5826a..59179e413 100644 --- a/sbt-app/src/sbt-test/tests/do-not-discover/build.sbt +++ b/sbt-app/src/sbt-test/tests/do-not-discover/build.sbt @@ -1,6 +1,6 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val root = (project in file(".")) .settings( diff --git a/sbt-app/src/sbt-test/tests/done/build.sbt b/sbt-app/src/sbt-test/tests/done/build.sbt index 4a2b5826a..59179e413 100644 --- a/sbt-app/src/sbt-test/tests/done/build.sbt +++ b/sbt-app/src/sbt-test/tests/done/build.sbt @@ -1,6 +1,6 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val root = (project in file(".")) .settings( diff --git a/sbt-app/src/sbt-test/tests/filter-runners/build.sbt b/sbt-app/src/sbt-test/tests/filter-runners/build.sbt index c24c76ba9..bc17f844d 100644 --- a/sbt-app/src/sbt-test/tests/filter-runners/build.sbt +++ b/sbt-app/src/sbt-test/tests/filter-runners/build.sbt @@ -1,7 +1,7 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.2.2" val munit = "org.scalameta" %% "munit" % "0.7.22" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" libraryDependencies += scalatest % Test libraryDependencies += munit % Test diff --git a/sbt-app/src/sbt-test/tests/fork-async/build.sbt b/sbt-app/src/sbt-test/tests/fork-async/build.sbt index bd0bb8041..1f765fdb1 100644 --- a/sbt-app/src/sbt-test/tests/fork-async/build.sbt +++ b/sbt-app/src/sbt-test/tests/fork-async/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val root = (project in file(".")) .settings( diff --git a/sbt-app/src/sbt-test/tests/fork-parallel/build.sbt b/sbt-app/src/sbt-test/tests/fork-parallel/build.sbt index 5a762a03d..105ef5a2c 100644 --- a/sbt-app/src/sbt-test/tests/fork-parallel/build.sbt +++ b/sbt-app/src/sbt-test/tests/fork-parallel/build.sbt @@ -1,7 +1,7 @@ import Tests._ import Defaults._ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" val check = taskKey[Unit]("Check that tests are executed in parallel") lazy val root = (project in file(".")) diff --git a/sbt-app/src/sbt-test/tests/fork-test-group-parallel-custom-tags/build.sbt b/sbt-app/src/sbt-test/tests/fork-test-group-parallel-custom-tags/build.sbt index f6eacaa6d..059a130a2 100644 --- a/sbt-app/src/sbt-test/tests/fork-test-group-parallel-custom-tags/build.sbt +++ b/sbt-app/src/sbt-test/tests/fork-test-group-parallel-custom-tags/build.sbt @@ -1,5 +1,5 @@ val specs = "org.specs2" %% "specs2-core" % "4.3.4" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" val TestATypeTag = Tags.Tag("TestA") val TestBTypeTag = Tags.Tag("TestB") diff --git a/sbt-app/src/sbt-test/tests/fork-test-group-parallel/build.sbt b/sbt-app/src/sbt-test/tests/fork-test-group-parallel/build.sbt index bf225760b..a6b2aaf9d 100644 --- a/sbt-app/src/sbt-test/tests/fork-test-group-parallel/build.sbt +++ b/sbt-app/src/sbt-test/tests/fork-test-group-parallel/build.sbt @@ -1,5 +1,5 @@ val specs = "org.specs2" %% "specs2-core" % "4.3.4" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" Global / concurrentRestrictions := Seq(Tags.limitAll(4)) libraryDependencies += specs % Test diff --git a/sbt-app/src/sbt-test/tests/fork-uncaught2/build.sbt b/sbt-app/src/sbt-test/tests/fork-uncaught2/build.sbt index 533b61158..b34d2e349 100644 --- a/sbt-app/src/sbt-test/tests/fork-uncaught2/build.sbt +++ b/sbt-app/src/sbt-test/tests/fork-uncaught2/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" libraryDependencies += "org.scala-sbt" % "test-interface" % "1.0" diff --git a/sbt-app/src/sbt-test/tests/fork/build.sbt b/sbt-app/src/sbt-test/tests/fork/build.sbt index bfefc042b..7a975bd9a 100644 --- a/sbt-app/src/sbt-test/tests/fork/build.sbt +++ b/sbt-app/src/sbt-test/tests/fork/build.sbt @@ -11,7 +11,7 @@ val scalaxml = "org.scala-lang.modules" %% "scala-xml" % "1.1.1" def groupId(idx: Int) = "group_" + (idx + 1) def groupPrefix(idx: Int) = groupId(idx) + "_file_" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" ThisBuild / organization := "org.example" lazy val root = (project in file(".")) diff --git a/sbt-app/src/sbt-test/tests/fork2/build.sbt b/sbt-app/src/sbt-test/tests/fork2/build.sbt index e0e873c69..6c272bbde 100644 --- a/sbt-app/src/sbt-test/tests/fork2/build.sbt +++ b/sbt-app/src/sbt-test/tests/fork2/build.sbt @@ -1,6 +1,6 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" fork := true libraryDependencies += scalatest % Test diff --git a/sbt-app/src/sbt-test/tests/hedgehog/build.sbt b/sbt-app/src/sbt-test/tests/hedgehog/build.sbt new file mode 100644 index 000000000..dc0a0b0ed --- /dev/null +++ b/sbt-app/src/sbt-test/tests/hedgehog/build.sbt @@ -0,0 +1,9 @@ +ThisBuild / scalaVersion := "2.13.12" + +val hedgehogVersion = "0.10.0" + +libraryDependencies ++= Seq( + "qa.hedgehog" %% "hedgehog-core" % hedgehogVersion, + "qa.hedgehog" %% "hedgehog-runner" % hedgehogVersion, + "qa.hedgehog" %% "hedgehog-sbt" % hedgehogVersion +).map(_ % Test) diff --git a/sbt-app/src/sbt-test/tests/hedgehog/src/test/scala/spec/FailureSpec.scala b/sbt-app/src/sbt-test/tests/hedgehog/src/test/scala/spec/FailureSpec.scala new file mode 100644 index 000000000..05da4684f --- /dev/null +++ b/sbt-app/src/sbt-test/tests/hedgehog/src/test/scala/spec/FailureSpec.scala @@ -0,0 +1,16 @@ +package spec + +import hedgehog._ +import hedgehog.runner._ + +object FailureSpec extends Properties { + def tests: List[Test] = + List( + example("test failure", testFailure), + ) + + def testFailure: Result = { + // expected to fail + 1 ==== 2 + } +} diff --git a/sbt-app/src/sbt-test/tests/hedgehog/src/test/scala/spec/SuccessSpec.scala b/sbt-app/src/sbt-test/tests/hedgehog/src/test/scala/spec/SuccessSpec.scala new file mode 100644 index 000000000..dd71589c1 --- /dev/null +++ b/sbt-app/src/sbt-test/tests/hedgehog/src/test/scala/spec/SuccessSpec.scala @@ -0,0 +1,17 @@ +package spec + +import hedgehog._ +import hedgehog.runner._ + +object SuccessSpec extends Properties { + def tests: List[Test] = + List( + property("reverse", testReverse), + ) + + def testReverse: Property = + for { + xs <- Gen.alpha.list(Range.linear(0, 100)).log("xs") + } yield xs.reverse.reverse ==== xs + +} diff --git a/sbt-app/src/sbt-test/tests/hedgehog/test b/sbt-app/src/sbt-test/tests/hedgehog/test new file mode 100644 index 000000000..7e85d1433 --- /dev/null +++ b/sbt-app/src/sbt-test/tests/hedgehog/test @@ -0,0 +1,2 @@ +> testOnly spec.SuccessSpec +-> testOnly spec.FailureSpec diff --git a/sbt-app/src/sbt-test/tests/it/build.sbt b/sbt-app/src/sbt-test/tests/it/build.sbt index fd96cc57a..f784e70a1 100644 --- a/sbt-app/src/sbt-test/tests/it/build.sbt +++ b/sbt-app/src/sbt-test/tests/it/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" val specs = "org.specs2" %% "specs2-core" % "4.3.4" diff --git a/sbt-app/src/sbt-test/tests/junit-xml-report/build.sbt b/sbt-app/src/sbt-test/tests/junit-xml-report/build.sbt index 1ecdd37ba..c63d4c94f 100644 --- a/sbt-app/src/sbt-test/tests/junit-xml-report/build.sbt +++ b/sbt-app/src/sbt-test/tests/junit-xml-report/build.sbt @@ -5,89 +5,111 @@ import Defaults._ val checkReport = taskKey[Unit]("Check the test reports") val checkNoReport = taskKey[Unit]("Check that no reports are present") -val oneSecondReportFile = "target/out/jvm/scala-2.12.18/root/test-reports/TEST-a.pkg.OneSecondTest.xml" -val failingReportFile = "target/out/jvm/scala-2.12.18/root/test-reports/TEST-another.pkg.FailingTest.xml" +val oneSecondReportFile = + "target/out/jvm/scala-2.12.19/root/test-reports/TEST-a.pkg.OneSecondTest.xml" +val failingReportFile = + "target/out/jvm/scala-2.12.19/root/test-reports/TEST-another.pkg.FailingTest.xml" -val flatSuiteReportFile = "target/out/jvm/scala-2.12.18/root/test-reports/TEST-my.scalatest.MyFlatSuite.xml" -val nestedSuitesReportFile = "target/out/jvm/scala-2.12.18/root/test-reports/TEST-my.scalatest.MyNestedSuites.xml" +val flatSuiteReportFile = + "target/out/jvm/scala-2.12.19/root/test-reports/TEST-my.scalatest.MyFlatSuite.xml" +val nestedSuitesReportFile = + "target/out/jvm/scala-2.12.19/root/test-reports/TEST-my.scalatest.MyNestedSuites.xml" val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" val junitinterface = "com.novocode" % "junit-interface" % "0.11" -ThisBuild / scalaVersion := "2.12.18" +ThisBuild / scalaVersion := "2.12.19" -lazy val root = (project in file(".")). - settings( - libraryDependencies += junitinterface % Test, - libraryDependencies += scalatest % Test, - // TODO use matchers instead of sys.error - checkReport := { - val oneSecondReport = XML.loadFile(oneSecondReportFile) - if( oneSecondReport.label != "testsuite" ) sys.error("Report should have a root element.") - // somehow the 'success' event doesn't go through... TODO investigate +lazy val root = (project in file(".")).settings( + libraryDependencies += junitinterface % Test, + libraryDependencies += scalatest % Test, + // TODO use matchers instead of sys.error + checkReport := { + val oneSecondReport = XML.loadFile(oneSecondReportFile) + if (oneSecondReport.label != "testsuite") + sys.error("Report should have a root element.") + // somehow the 'success' event doesn't go through... TODO investigate // if( (oneSecondReport \ "@time").text.toFloat < 1f ) sys.error("expected test to take at least 1 sec") - if( (oneSecondReport \ "@tests").text != "1" ) sys.error("expected 1 tests") - if( (oneSecondReport \ "@failures").text != "0" ) sys.error("expected 0 failures") - if( (oneSecondReport \ "@name").text != "a.pkg.OneSecondTest" ) sys.error("wrong fixture name: " + (oneSecondReport \ "@name").text) - oneSecondReport foreach { testsuite => - val className = testsuite \ "testcase" \@ "classname" - if( className != "a.pkg.OneSecondTest" ) sys.error(s"wrong class name: $className") + if ((oneSecondReport \ "@tests").text != "1") sys.error("expected 1 tests") + if ((oneSecondReport \ "@failures").text != "0") sys.error("expected 0 failures") + if ((oneSecondReport \ "@name").text != "a.pkg.OneSecondTest") + sys.error("wrong fixture name: " + (oneSecondReport \ "@name").text) + oneSecondReport foreach { testsuite => + val className = testsuite \ "testcase" \@ "classname" + if (className != "a.pkg.OneSecondTest") sys.error(s"wrong class name: $className") - val actualTestName = testsuite \ "testcase" \@ "name" - if( actualTestName != "oneSecond") sys.error(s"wrong test names: $actualTestName") - } - // TODO more checks + val actualTestName = testsuite \ "testcase" \@ "name" + if (actualTestName != "oneSecond") sys.error(s"wrong test names: $actualTestName") + } + // TODO more checks - val failingReport = XML.loadFile(failingReportFile) - if( failingReport.label != "testsuite" ) sys.error("Report should have a root element.") - if( (failingReport \ "@failures").text != "2" ) sys.error("expected 2 failures") - if( (failingReport \ "@name").text != "another.pkg.FailingTest" ) sys.error("wrong test name: " + (failingReport \ "@name").text) - // TODO more checks -> the two test cases with time etc.. + val failingReport = XML.loadFile(failingReportFile) + if (failingReport.label != "testsuite") + sys.error("Report should have a root element.") + if ((failingReport \ "@failures").text != "2") sys.error("expected 2 failures") + if ((failingReport \ "@name").text != "another.pkg.FailingTest") + sys.error("wrong test name: " + (failingReport \ "@name").text) + // TODO more checks -> the two test cases with time etc.. - val scalaTestFlatReport = XML.loadFile(flatSuiteReportFile) - if( scalaTestFlatReport.label != "testsuite" ) sys.error("Report should have a root element.") - if( (scalaTestFlatReport \ "@tests").text != "3" ) sys.error("expected 3 tests") - if( (scalaTestFlatReport \ "@failures").text != "1" ) sys.error("expected 1 failures") - if( (scalaTestFlatReport \ "@name").text != "my.scalatest.MyFlatSuite" ) sys.error("wrong fixture name: " + (scalaTestFlatReport \ "@name").text) - scalaTestFlatReport foreach { testsuite => - val classNames = (testsuite \ "testcase").map(_ \@ "classname") - if( classNames.length != 3 ) sys.error(s"expected 3 classname's, actual result: " + classNames.length) - if( classNames.toSet != Set("my.scalatest.MyFlatSuite") ) sys.error(s"wrong class names: ${classNames.mkString(", ")}") + val scalaTestFlatReport = XML.loadFile(flatSuiteReportFile) + if (scalaTestFlatReport.label != "testsuite") + sys.error("Report should have a root element.") + if ((scalaTestFlatReport \ "@tests").text != "3") sys.error("expected 3 tests") + if ((scalaTestFlatReport \ "@failures").text != "1") sys.error("expected 1 failures") + if ((scalaTestFlatReport \ "@name").text != "my.scalatest.MyFlatSuite") + sys.error("wrong fixture name: " + (scalaTestFlatReport \ "@name").text) + scalaTestFlatReport foreach { testsuite => + val classNames = (testsuite \ "testcase").map(_ \@ "classname") + if (classNames.length != 3) + sys.error(s"expected 3 classname's, actual result: " + classNames.length) + if (classNames.toSet != Set("my.scalatest.MyFlatSuite")) + sys.error(s"wrong class names: ${classNames.mkString(", ")}") - val expectedTestNames = Set( - "Passing test should pass", - "Passing test should also pass with file.extension", - "Failing test should fail" + val expectedTestNames = Set( + "Passing test should pass", + "Passing test should also pass with file.extension", + "Failing test should fail" + ) + val actualTestName = (testsuite \ "testcase").map(_ \@ "name") + if (actualTestName.toSet != expectedTestNames) + sys.error(s"wrong test names: ${actualTestName.mkString(", ")}") + } + + val nestedSuitesReport = XML.loadFile(nestedSuitesReportFile) + if (nestedSuitesReport.label != "testsuite") + sys.error("Report should have a root element.") + if ((nestedSuitesReport \ "@tests").text != "2") sys.error("expected 2 tests") + if ((nestedSuitesReport \ "@failures").text != "1") sys.error("expected 1 failures") + if ((nestedSuitesReport \ "@name").text != "my.scalatest.MyNestedSuites") + sys.error("wrong fixture name: " + (nestedSuitesReport \ "@name").text) + nestedSuitesReport foreach { testsuite => + val classNames = (testsuite \ "testcase").map(_ \@ "classname") + if (classNames.length != 2) + sys.error(s"expected 2 classname's, actual result: " + classNames.length) + if (classNames.toSet != Set("my.scalatest.MyInnerSuite")) + sys.error(s"wrong class names: ${classNames.mkString(", ")}") + + val actualTestName = (testsuite \ "testcase").map(_ \@ "name") + if ( + actualTestName.toSet != Set( + "Inner passing test should pass", + "Inner failing test should fail" ) - val actualTestName = (testsuite \ "testcase").map(_ \@ "name") - if( actualTestName.toSet != expectedTestNames) sys.error(s"wrong test names: ${actualTestName.mkString(", ")}") - } + ) sys.error(s"wrong test names: ${actualTestName.mkString(", ")}") + } - val nestedSuitesReport = XML.loadFile(nestedSuitesReportFile) - if( nestedSuitesReport.label != "testsuite" ) sys.error("Report should have a root element.") - if( (nestedSuitesReport \ "@tests").text != "2" ) sys.error("expected 2 tests") - if( (nestedSuitesReport \ "@failures").text != "1" ) sys.error("expected 1 failures") - if( (nestedSuitesReport \ "@name").text != "my.scalatest.MyNestedSuites" ) sys.error("wrong fixture name: " + (nestedSuitesReport \ "@name").text) - nestedSuitesReport foreach { testsuite => - val classNames = (testsuite \ "testcase").map(_ \@ "classname") - if( classNames.length != 2 ) sys.error(s"expected 2 classname's, actual result: " + classNames.length) - if( classNames.toSet != Set("my.scalatest.MyInnerSuite") ) sys.error(s"wrong class names: ${classNames.mkString(", ")}") - - val actualTestName = (testsuite \ "testcase").map(_ \@ "name") - if( actualTestName.toSet != Set("Inner passing test should pass", "Inner failing test should fail")) sys.error(s"wrong test names: ${actualTestName.mkString(", ")}") - } - - // TODO check console output is in the report - }, - - checkNoReport := { - for (f <- Seq( + // TODO check console output is in the report + }, + checkNoReport := { + for ( + f <- Seq( oneSecondReportFile, failingReportFile, flatSuiteReportFile, nestedSuitesReportFile - )) { - if( file(f).exists() ) sys.error(f + " should not exist") - } + ) + ) { + if (file(f).exists()) sys.error(f + " should not exist") } - ) + } +) diff --git a/sbt-app/src/sbt-test/tests/munit/build.sbt b/sbt-app/src/sbt-test/tests/munit/build.sbt index 53b13bf93..bc719880c 100644 --- a/sbt-app/src/sbt-test/tests/munit/build.sbt +++ b/sbt-app/src/sbt-test/tests/munit/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val munit = "org.scalameta" %% "munit" % "0.7.22" diff --git a/sbt-app/src/sbt-test/tests/nested-inproc-par/build.sbt b/sbt-app/src/sbt-test/tests/nested-inproc-par/build.sbt index bd76bb20c..5cbfb735e 100644 --- a/sbt-app/src/sbt-test/tests/nested-inproc-par/build.sbt +++ b/sbt-app/src/sbt-test/tests/nested-inproc-par/build.sbt @@ -1,6 +1,6 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val root = (project in file(".")) .settings( diff --git a/sbt-app/src/sbt-test/tests/nested-inproc-seq/build.sbt b/sbt-app/src/sbt-test/tests/nested-inproc-seq/build.sbt index 21b809d76..a03155c8a 100644 --- a/sbt-app/src/sbt-test/tests/nested-inproc-seq/build.sbt +++ b/sbt-app/src/sbt-test/tests/nested-inproc-seq/build.sbt @@ -1,6 +1,6 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val root = (project in file(".")) .settings( diff --git a/sbt-app/src/sbt-test/tests/nested-subproc/build.sbt b/sbt-app/src/sbt-test/tests/nested-subproc/build.sbt index dc50503e9..7b8de3010 100644 --- a/sbt-app/src/sbt-test/tests/nested-subproc/build.sbt +++ b/sbt-app/src/sbt-test/tests/nested-subproc/build.sbt @@ -1,7 +1,7 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" val scalaxml = "org.scala-lang.modules" %% "scala-xml" % "1.1.1" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val root = (project in file(".")) .settings( diff --git a/sbt-app/src/sbt-test/tests/nested-tests/build.sbt b/sbt-app/src/sbt-test/tests/nested-tests/build.sbt index d4737f0f5..6ae21f33f 100644 --- a/sbt-app/src/sbt-test/tests/nested-tests/build.sbt +++ b/sbt-app/src/sbt-test/tests/nested-tests/build.sbt @@ -1,6 +1,6 @@ val scalcheck = "org.scalacheck" %% "scalacheck" % "1.14.0" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" ThisBuild / version := "0.0.1" ThisBuild / organization := "org.catastrophe" diff --git a/sbt-app/src/sbt-test/tests/one-class-multi-framework/build.sbt b/sbt-app/src/sbt-test/tests/one-class-multi-framework/build.sbt index 27b51b848..3fa69b6cf 100644 --- a/sbt-app/src/sbt-test/tests/one-class-multi-framework/build.sbt +++ b/sbt-app/src/sbt-test/tests/one-class-multi-framework/build.sbt @@ -1,5 +1,5 @@ val specsJunit = "org.specs2" %% "specs2-junit" % "4.3.4" val junitinterface = "com.novocode" % "junit-interface" % "0.11" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" libraryDependencies += junitinterface % Test libraryDependencies += specsJunit % Test diff --git a/sbt-app/src/sbt-test/tests/order/build.sbt b/sbt-app/src/sbt-test/tests/order/build.sbt index 53ce38e0e..fefa56d8e 100644 --- a/sbt-app/src/sbt-test/tests/order/build.sbt +++ b/sbt-app/src/sbt-test/tests/order/build.sbt @@ -1,5 +1,5 @@ val scalcheck = "org.scalacheck" %% "scalacheck" % "1.14.0" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" Test / parallelExecution := false libraryDependencies += scalcheck % Test diff --git a/sbt-app/src/sbt-test/tests/resources/build.sbt b/sbt-app/src/sbt-test/tests/resources/build.sbt index 858e7a1c2..e6997605a 100644 --- a/sbt-app/src/sbt-test/tests/resources/build.sbt +++ b/sbt-app/src/sbt-test/tests/resources/build.sbt @@ -1,3 +1,3 @@ val specs = "org.specs2" %% "specs2-core" % "4.3.4" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" libraryDependencies += specs % Test diff --git a/sbt-app/src/sbt-test/tests/scala-instance-classloader/build.sbt b/sbt-app/src/sbt-test/tests/scala-instance-classloader/build.sbt index ce5ebab94..81bcda844 100644 --- a/sbt-app/src/sbt-test/tests/scala-instance-classloader/build.sbt +++ b/sbt-app/src/sbt-test/tests/scala-instance-classloader/build.sbt @@ -3,7 +3,7 @@ import sbt.internal.inc.ScalaInstance lazy val OtherScala = config("other-scala").hide lazy val junitinterface = "com.novocode" % "junit-interface" % "0.11" lazy val akkaActor = "com.typesafe.akka" %% "akka-actor" % "2.5.17" -ThisBuild / scalaVersion := "2.12.17" +ThisBuild / scalaVersion := "2.12.19" lazy val root = (project in file(".")) .configs(OtherScala) diff --git a/sbt-app/src/sbt-test/tests/scalatest/build.sbt b/sbt-app/src/sbt-test/tests/scalatest/build.sbt index 1f501a862..8ec076ab9 100644 --- a/sbt-app/src/sbt-test/tests/scalatest/build.sbt +++ b/sbt-app/src/sbt-test/tests/scalatest/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.13.1" +ThisBuild / scalaVersion := "2.13.12" ThisBuild / version := "0.1.0-SNAPSHOT" ThisBuild / organization := "com.example" ThisBuild / organizationName := "example" diff --git a/sbt-app/src/sbt-test/tests/serial/build.sbt b/sbt-app/src/sbt-test/tests/serial/build.sbt index 5f999ecb6..baa4751cc 100644 --- a/sbt-app/src/sbt-test/tests/serial/build.sbt +++ b/sbt-app/src/sbt-test/tests/serial/build.sbt @@ -1,6 +1,6 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" ThisBuild / organization := "com.example" ThisBuild / version := "0.0.1-SNAPSHOT" diff --git a/sbt-app/src/sbt-test/tests/setup-cleanup/base.sbt b/sbt-app/src/sbt-test/tests/setup-cleanup/base.sbt index 516692e12..ea0abf0e5 100644 --- a/sbt-app/src/sbt-test/tests/setup-cleanup/base.sbt +++ b/sbt-app/src/sbt-test/tests/setup-cleanup/base.sbt @@ -1,3 +1,3 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" libraryDependencies += scalatest diff --git a/sbt-app/src/sbt-test/tests/single-runner/build.sbt b/sbt-app/src/sbt-test/tests/single-runner/build.sbt index be394850b..69ff2b711 100644 --- a/sbt-app/src/sbt-test/tests/single-runner/build.sbt +++ b/sbt-app/src/sbt-test/tests/single-runner/build.sbt @@ -1,4 +1,4 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" libraryDependencies += scalatest Test / testOptions += Tests.Argument("-C", "custom.CustomReporter") diff --git a/sbt-app/src/sbt-test/tests/specs-run/build.sbt b/sbt-app/src/sbt-test/tests/specs-run/build.sbt index 07a4350f6..7b2f632b6 100644 --- a/sbt-app/src/sbt-test/tests/specs-run/build.sbt +++ b/sbt-app/src/sbt-test/tests/specs-run/build.sbt @@ -1,4 +1,4 @@ val specs = "org.specs2" %% "specs2-core" % "4.3.4" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" libraryDependencies += specs % Test diff --git a/sbt-app/src/sbt-test/tests/t543/build.sbt b/sbt-app/src/sbt-test/tests/t543/build.sbt index 982d2822b..3f885106a 100644 --- a/sbt-app/src/sbt-test/tests/t543/build.sbt +++ b/sbt-app/src/sbt-test/tests/t543/build.sbt @@ -7,7 +7,7 @@ val check = TaskKey[Unit]("check", "Check correct error has been returned.") val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" val scalaxml = "org.scala-lang.modules" %% "scala-xml" % "1.1.1" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val root = (project in file(".")). settings( diff --git a/sbt-app/src/sbt-test/tests/task/build.sbt b/sbt-app/src/sbt-test/tests/task/build.sbt index be394850b..69ff2b711 100644 --- a/sbt-app/src/sbt-test/tests/task/build.sbt +++ b/sbt-app/src/sbt-test/tests/task/build.sbt @@ -1,4 +1,4 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" libraryDependencies += scalatest Test / testOptions += Tests.Argument("-C", "custom.CustomReporter") diff --git a/sbt-app/src/sbt-test/tests/test-exclude/build.sbt b/sbt-app/src/sbt-test/tests/test-exclude/build.sbt index 9fd396d27..c05ef3c0d 100644 --- a/sbt-app/src/sbt-test/tests/test-exclude/build.sbt +++ b/sbt-app/src/sbt-test/tests/test-exclude/build.sbt @@ -1,5 +1,5 @@ val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val root = (project in file(".")) .settings( diff --git a/sbt-app/src/sbt-test/tests/test-quick/build.sbt b/sbt-app/src/sbt-test/tests/test-quick/build.sbt index 9153720ef..c30aa0fc2 100644 --- a/sbt-app/src/sbt-test/tests/test-quick/build.sbt +++ b/sbt-app/src/sbt-test/tests/test-quick/build.sbt @@ -1,7 +1,7 @@ Global / cacheStores := Seq.empty val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" -ThisBuild / scalaVersion := "2.12.12" +ThisBuild / scalaVersion := "2.12.19" lazy val root = (project in file(".")) .settings( diff --git a/sbt-app/src/sbt-test/tests/weaver-cats/build.sbt b/sbt-app/src/sbt-test/tests/weaver-cats/build.sbt new file mode 100644 index 000000000..eb9ab64ca --- /dev/null +++ b/sbt-app/src/sbt-test/tests/weaver-cats/build.sbt @@ -0,0 +1,3 @@ +ThisBuild / scalaVersion := "2.13.12" + +libraryDependencies += "com.disneystreaming" %% "weaver-cats" % "0.8.3" % Test diff --git a/sbt-app/src/sbt-test/tests/weaver-cats/src/test/scala/spec/Spec.scala b/sbt-app/src/sbt-test/tests/weaver-cats/src/test/scala/spec/Spec.scala new file mode 100644 index 000000000..13153d720 --- /dev/null +++ b/sbt-app/src/sbt-test/tests/weaver-cats/src/test/scala/spec/Spec.scala @@ -0,0 +1,10 @@ +package spec + +import weaver._ + +object Spec extends FunSuite { + test("test") { + // expected to fail + assert(1 == 2) + } +} diff --git a/sbt-app/src/sbt-test/tests/weaver-cats/test b/sbt-app/src/sbt-test/tests/weaver-cats/test new file mode 100644 index 000000000..5a9f22365 --- /dev/null +++ b/sbt-app/src/sbt-test/tests/weaver-cats/test @@ -0,0 +1 @@ +-> test diff --git a/sbt-app/src/sbt-test/tests/zio-test/build.sbt b/sbt-app/src/sbt-test/tests/zio-test/build.sbt index a2ddfa655..60996aead 100644 --- a/sbt-app/src/sbt-test/tests/zio-test/build.sbt +++ b/sbt-app/src/sbt-test/tests/zio-test/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.13.10" +ThisBuild / scalaVersion := "2.13.12" libraryDependencies += "dev.zio" %% "zio-test" % "2.0.2" % Test libraryDependencies += "dev.zio" %% "zio-test-sbt" % "2.0.2" % Test diff --git a/sbt-app/src/sbt-test/watch/commands/build.sbt b/sbt-app/src/sbt-test/watch/commands/build.sbt index 7b77c165a..58410762c 100644 --- a/sbt-app/src/sbt-test/watch/commands/build.sbt +++ b/sbt-app/src/sbt-test/watch/commands/build.sbt @@ -53,4 +53,4 @@ expectFailure / watchOnFileInputEvent := { (_, e) => } -crossScalaVersions := Seq("2.11.12", "2.12.12") +crossScalaVersions := Seq("2.11.12", "2.12.19") diff --git a/sbt-app/src/test/scala/sbt/IllegalReferenceSpec.scala b/sbt-app/src/test/scala/sbt/IllegalReferenceSpec.scala index 93b1426ad..b9981d9f4 100644 --- a/sbt-app/src/test/scala/sbt/IllegalReferenceSpec.scala +++ b/sbt-app/src/test/scala/sbt/IllegalReferenceSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/sbt-app/src/test/scala/sbt/RunFromSourceMain.scala b/sbt-app/src/test/scala/sbt/RunFromSourceMain.scala index 03c5d2191..4712cc2e1 100644 --- a/sbt-app/src/test/scala/sbt/RunFromSourceMain.scala +++ b/sbt-app/src/test/scala/sbt/RunFromSourceMain.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/sbt-app/src/test/scala/sbt/internal/scriptedtest/ScriptedLauncher.java b/sbt-app/src/test/scala/sbt/internal/scriptedtest/ScriptedLauncher.java index a2710c66d..5badb4a56 100644 --- a/sbt-app/src/test/scala/sbt/internal/scriptedtest/ScriptedLauncher.java +++ b/sbt-app/src/test/scala/sbt/internal/scriptedtest/ScriptedLauncher.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -13,6 +14,8 @@ import java.lang.reflect.Array; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; import java.nio.file.FileAlreadyExistsException; @@ -40,11 +43,11 @@ import xsbti.ScalaProvider; public class ScriptedLauncher { private static URL URLForClass(final Class clazz) - throws MalformedURLException, ClassNotFoundException { + throws MalformedURLException, ClassNotFoundException, URISyntaxException { final String path = clazz.getCanonicalName().replace('.', '/') + ".class"; final URL url = clazz.getClassLoader().getResource(path); if (url == null) throw new ClassNotFoundException(clazz.getCanonicalName()); - return new URL(url.toString().replaceAll(path + "$", "")); + return new URI(url.toString().replaceAll(path + "$", "")).toURL(); } public static Optional launch( @@ -56,7 +59,7 @@ public class ScriptedLauncher { final File[] classpath, String[] arguments) throws InvocationTargetException, ClassNotFoundException, NoSuchMethodException, - IllegalAccessException, IOException { + IllegalAccessException, IOException, URISyntaxException { String[] args = arguments; Object appID = null; if (System.getProperty("sbt.launch.jar") == null) { @@ -135,7 +138,7 @@ public class ScriptedLauncher { swap(loader, previous); } } else { - final URL url = new URL("file:" + System.getProperty("sbt.launch.jar")); + final URL url = new URI("file:" + System.getProperty("sbt.launch.jar")).toURL(); final URLClassLoader loader = new URLClassLoader(new URL[] {url}, top()); final Class boot = loader.loadClass("xsbt.boot.Boot"); // If we don't initialize the arguments this way, then the call to invoke on @@ -568,7 +571,9 @@ public class ScriptedLauncher { @Override public URL url() { try { - return new URL(url); + return new URI(url).toURL(); + } catch (URISyntaxException e) { + throw new RuntimeException(e); } catch (MalformedURLException e) { throw new RuntimeException(e); } diff --git a/scripted-plugin/src/main/scala/sbt/ScriptedPlugin.scala b/scripted-plugin/src/main/scala/sbt/ScriptedPlugin.scala index e00e0ef31..8383a97f3 100644 --- a/scripted-plugin/src/main/scala/sbt/ScriptedPlugin.scala +++ b/scripted-plugin/src/main/scala/sbt/ScriptedPlugin.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/scripted-sbt-old/src/main/scala/sbt/test/OldScriptedTests.scala b/scripted-sbt-old/src/main/scala/sbt/test/OldScriptedTests.scala index 2497a27fe..0eaf16602 100644 --- a/scripted-sbt-old/src/main/scala/sbt/test/OldScriptedTests.scala +++ b/scripted-sbt-old/src/main/scala/sbt/test/OldScriptedTests.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/scripted-sbt-redux/NOTICE b/scripted-sbt-redux/NOTICE index 89cb6a81c..e8ad87d2c 100644 --- a/scripted-sbt-redux/NOTICE +++ b/scripted-sbt-redux/NOTICE @@ -1,4 +1,5 @@ sbt: Scripted Testing -Copyright 2011 - 2017, Lightbend, Inc. +Copyright 2023, Scala center +Copyright 2011 - 2022, Lightbend, Inc. Copyright 2008 - 2010, Mark Harrah Licensed under BSD-3-Clause license (see LICENSE) diff --git a/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/BatchScriptRunner.scala b/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/BatchScriptRunner.scala index c9b5ec08e..7f3966647 100644 --- a/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/BatchScriptRunner.scala +++ b/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/BatchScriptRunner.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -8,10 +9,8 @@ package sbt package scriptedtest -import java.util.concurrent.{ Executors, TimeUnit, TimeoutException } - import scala.collection.mutable -import scala.concurrent.duration._ + import sbt.internal.scripted._ private[sbt] object BatchScriptRunner { @@ -21,7 +20,6 @@ private[sbt] object BatchScriptRunner { /** Defines an alternative script runner that allows batch execution. */ private[sbt] class BatchScriptRunner extends ScriptRunner with AutoCloseable { import BatchScriptRunner.States - private[this] val service = Executors.newCachedThreadPool() /** * Defines a method to run batched execution. @@ -44,34 +42,28 @@ private[sbt] class BatchScriptRunner extends ScriptRunner with AutoCloseable { } } - private val timeout = 5.minutes def processStatement(handler: StatementHandler, statement: Statement, states: States): Unit = { val state = states(handler).asInstanceOf[handler.State] - val nextStateFuture = service.submit(() => + val nextState = try Right(handler(statement.command, statement.arguments, state)) catch { case e: Exception => Left(e) } - ) - try { - nextStateFuture.get(timeout.toMillis, TimeUnit.MILLISECONDS) match { - case Left(err) => - if (statement.successExpected) { - err match { - case t: TestFailed => - throw new TestException(statement, "Command failed: " + t.getMessage, null) - case _ => throw new TestException(statement, "Command failed", err) - } - } else - () - case Right(s) => - if (statement.successExpected) - states(handler) = s - else - throw new TestException(statement, "Command succeeded but failure was expected", null) - } - } catch { - case e: TimeoutException => throw new TestException(statement, "Command timed out", e) + nextState match { + case Left(err) => + if (statement.successExpected) { + err match { + case t: TestFailed => + throw new TestException(statement, "Command failed: " + t.getMessage, null) + case _ => throw new TestException(statement, "Command failed", err) + } + } else + () + case Right(s) => + if (statement.successExpected) + states(handler) = s + else + throw new TestException(statement, "Command succeeded but failure was expected", null) } } - override def close(): Unit = service.shutdown() + override def close(): Unit = () } diff --git a/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/RemoteSbtCreator.scala b/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/RemoteSbtCreator.scala index 5857948dc..60b2545ae 100644 --- a/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/RemoteSbtCreator.scala +++ b/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/RemoteSbtCreator.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/SbtHandler.scala b/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/SbtHandler.scala index b8af69c58..1888ffa4f 100644 --- a/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/SbtHandler.scala +++ b/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/SbtHandler.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/ScriptedTests.scala b/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/ScriptedTests.scala index b7c9b0611..d6f0532ab 100644 --- a/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/ScriptedTests.scala +++ b/scripted-sbt-redux/src/main/scala/sbt/scriptedtest/ScriptedTests.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -68,8 +69,7 @@ final class ScriptedTests( val handlers = createScriptedHandlers(testDirectory, buffer, prop) val runner = new BatchScriptRunner val states = new mutable.HashMap[StatementHandler, StatementHandler#State]() - try commonRunTest(label, testDirectory, prescripted, handlers, runner, states, buffer) - finally runner.close() + commonRunTest(label, testDirectory, prescripted, handlers, runner, states, buffer) } runOrHandleDisabled(label, testDirectory, singleTestRunner, buffer) } @@ -257,10 +257,7 @@ final class ScriptedTests( } try runBatchTests - finally { - runner.cleanUpHandlers(seqHandlers, states) - runner.close() - } + finally runner.cleanUpHandlers(seqHandlers, states) } private def runOrHandleDisabled( @@ -313,7 +310,6 @@ final class ScriptedTests( case null | _: SocketException => log.error(s" Cause of test exception: ${t.getMessage}") case _ => if (!pending) t.printStackTrace() } - log.play() } if (pending) None else Some(label) } diff --git a/server-test/src/server-test/buildserver/build.sbt b/server-test/src/server-test/buildserver/build.sbt index b3a6eae15..838a60d02 100644 --- a/server-test/src/server-test/buildserver/build.sbt +++ b/server-test/src/server-test/buildserver/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / scalaVersion := "2.13.8" +ThisBuild / scalaVersion := "2.13.11" Global / serverLog / logLevel := Level.Debug Global / cacheStores := Seq.empty @@ -37,6 +37,16 @@ lazy val util = project.settings( lazy val diagnostics = project +lazy val javaProj = project + .in(file("java-proj")) + .settings( + javacOptions += "-Xlint:all" + ) + +// lazy val twirlProj = project +// .in(file("twirlProj")) +// .enablePlugins(SbtTwirl) + def somethingBad = throw new MessageOnlyException("I am a bad build target") // other build targets should not be affected by this bad build target lazy val badBuildTarget = project.in(file("bad-build-target")) diff --git a/server-test/src/server-test/buildserver/java-proj/src/main/java/example/Hello.java b/server-test/src/server-test/buildserver/java-proj/src/main/java/example/Hello.java new file mode 100644 index 000000000..ddcab20e4 --- /dev/null +++ b/server-test/src/server-test/buildserver/java-proj/src/main/java/example/Hello.java @@ -0,0 +1,12 @@ +package example; + +import java.util.List; +import java.util.ArrayList; + +class Hello { + public static void main(String[] args) { + List list = new ArrayList(); + String msg = 42; + System.out.println(msg); + } +} diff --git a/server-test/src/server-test/buildserver/project/plugins.sbt b/server-test/src/server-test/buildserver/project/plugins.sbt new file mode 100644 index 000000000..721e2f251 --- /dev/null +++ b/server-test/src/server-test/buildserver/project/plugins.sbt @@ -0,0 +1 @@ +// addSbtPlugin("com.typesafe.play" % "sbt-twirl" % "1.5.2") diff --git a/server-test/src/server-test/buildserver/twirlProj/src/main/twirl/main.scala.html b/server-test/src/server-test/buildserver/twirlProj/src/main/twirl/main.scala.html new file mode 100644 index 000000000..ca8f06954 --- /dev/null +++ b/server-test/src/server-test/buildserver/twirlProj/src/main/twirl/main.scala.html @@ -0,0 +1,14 @@ +@(title: String, paragraphs: Seq[String]) + + + + + @title + + +

@tilte

+ @for(paragraph <- paragraphs) { +

@paragraph

+ } + + diff --git a/server-test/src/server-test/response/build.sbt b/server-test/src/server-test/response/build.sbt index 5444110ac..ee58de0e2 100644 --- a/server-test/src/server-test/response/build.sbt +++ b/server-test/src/server-test/response/build.sbt @@ -1,6 +1,6 @@ import sbt.internal.server.{ ServerHandler, ServerIntent } -ThisBuild / scalaVersion := "2.12.17" +ThisBuild / scalaVersion := "2.12.19" Global / serverLog / logLevel := Level.Debug // custom handler diff --git a/server-test/src/test/scala/testpkg/BuildServerTest.scala b/server-test/src/test/scala/testpkg/BuildServerTest.scala index 32a6f1f22..b112ecf18 100644 --- a/server-test/src/test/scala/testpkg/BuildServerTest.scala +++ b/server-test/src/test/scala/testpkg/BuildServerTest.scala @@ -18,6 +18,7 @@ import sjsonnew.support.scalajson.unsafe.{ CompactPrinter, Converter } import java.io.File import java.net.URI import java.nio.file.Files +import java.util.concurrent.atomic.AtomicInteger import scala.concurrent.duration.* // starts svr using server-test/buildserver and perform custom server tests @@ -26,11 +27,13 @@ class BuildServerTest extends AbstractServerTest { import sbt.internal.bsp.codec.JsonProtocol._ override val testDirectory: String = "buildserver" + private val idGen: AtomicInteger = new AtomicInteger(0) + private def nextId(): Int = idGen.getAndIncrement() test("build/initialize") { - initializeRequest() + val id = initializeRequest() assert(svr.waitForString(10.seconds) { s => - (s contains """"id":"8"""") && + (s contains s""""id":"$id"""") && (s contains """"resourcesProvider":true""") && (s contains """"outputPathsProvider":true""") }) @@ -40,7 +43,7 @@ class BuildServerTest extends AbstractServerTest { svr.sendJsonRpc( """{ "jsonrpc": "2.0", "id": "16", "method": "workspace/buildTargets", "params": {} }""" ) - assert(processing("workspace/buildTargets")) + assertProcessing("workspace/buildTargets") val result = svr.waitFor[WorkspaceBuildTargetsResult](10.seconds) val utilTarget = result.targets.find(_.displayName.contains("util")).get assert(utilTarget.id.uri.toString.endsWith("#util/Compile")) @@ -53,16 +56,14 @@ class BuildServerTest extends AbstractServerTest { test("buildTarget/sources") { val buildTarget = buildTargetUri("util", "Compile") val badBuildTarget = buildTargetUri("badBuildTarget", "Compile") - svr.sendJsonRpc(buildTargetSources(24, Seq(buildTarget, badBuildTarget))) - assert(processing("buildTarget/sources")) + buildTargetSources(Seq(buildTarget, badBuildTarget)) val s = svr.waitFor[SourcesResult](10.seconds) val sources = s.items.head.sources.map(_.uri) assert(sources.contains(new File(svr.baseDirectory, "util/src/main/scala").toURI)) } test("buildTarget/sources: base sources") { val buildTarget = buildTargetUri("buildserver", "Compile") - svr.sendJsonRpc(buildTargetSources(25, Seq(buildTarget))) - assert(processing("buildTarget/sources")) + buildTargetSources(Seq(buildTarget)) val s = svr.waitFor[SourcesResult](10.seconds) val sources = s.items.head.sources val expectedSource = SourceItem( @@ -75,8 +76,7 @@ class BuildServerTest extends AbstractServerTest { test("buildTarget/sources: sbt") { val x = new URI(s"${svr.baseDirectory.getAbsoluteFile.toURI}#buildserver-build") - svr.sendJsonRpc(buildTargetSources(26, Seq(x))) - assert(processing("buildTarget/sources")) + buildTargetSources(Seq(x)) val s = svr.waitFor[SourcesResult](10.seconds) val sources = s.items.head.sources.map(_.uri).sorted val expectedSources = Vector( @@ -93,17 +93,14 @@ class BuildServerTest extends AbstractServerTest { test("buildTarget/compile") { val buildTarget = buildTargetUri("util", "Compile") - - compile(buildTarget, id = 32) - - assert(processing("buildTarget/compile")) + compile(buildTarget) val res = svr.waitFor[BspCompileResult](10.seconds) assert(res.statusCode == StatusCode.Success) } test("buildTarget/compile - reports compilation progress") { val buildTarget = buildTargetUri("runAndTest", "Compile") - compile(buildTarget, id = 33) + compile(buildTarget) // This doesn't always come back in 10s on CI. assert(svr.waitForString(20.seconds) { s => s.contains("build/taskStart") && @@ -137,12 +134,9 @@ class BuildServerTest extends AbstractServerTest { val buildTarget = buildTargetUri("diagnostics", "Compile") val mainFile = new File(svr.baseDirectory, "diagnostics/src/main/scala/Diagnostics.scala") - compile(buildTarget, id = 33) + compile(buildTarget) - assert(svr.waitForString(30.seconds) { s => - s.contains("build/taskFinish") && - s.contains(""""message":"Compiled diagnostics"""") - }) + assertMessage("build/taskFinish", """"message":"Compiled diagnostics"""")(30.seconds) // introduce compile error IO.write( @@ -152,16 +146,15 @@ class BuildServerTest extends AbstractServerTest { |}""".stripMargin ) - reloadWorkspace(id = 55) - compile(buildTarget, id = 66) + compile(buildTarget) - assert( - svr.waitForString(30.seconds) { s => - s.contains("build/publishDiagnostics") && - s.contains("Diagnostics.scala") && - s.contains("\"message\":\"type mismatch") - }, - "should send publishDiagnostics with type error for Main.scala" + assertMessage( + "build/publishDiagnostics", + "Diagnostics.scala", + "\"message\":\"type mismatch" + )( + duration = 30.seconds, + message = "should send publishDiagnostics with type error for Main.scala" ) // fix compilation error @@ -172,25 +165,23 @@ class BuildServerTest extends AbstractServerTest { |}""".stripMargin ) - reloadWorkspace(id = 77) - compile(buildTarget, id = 88) + reloadWorkspace() + compile(buildTarget) - assert( - svr.waitForString(30.seconds) { s => - s.contains("build/publishDiagnostics") && - s.contains("Diagnostics.scala") && - s.contains("\"diagnostics\":[]") - }, - "should send publishDiagnostics with empty diagnostics" + assertMessage("build/publishDiagnostics", "Diagnostics.scala", "\"diagnostics\":[]")( + duration = 30.seconds, + message = "should send publishDiagnostics with empty diagnostics" ) + assertMessage("build/taskFinish", "\"noOp\":true")() // trigger no-op compilation - compile(buildTarget, id = 99) + compile(buildTarget) assert( - !svr.waitForString(20.seconds) { s => - s.contains("build/publishDiagnostics") && - s.contains("Diagnostics.scala") + svr.waitForString(20.seconds) { s => + if (s.contains("build/publishDiagnostics") && s.contains("Diagnostics.scala")) + throw new Exception("shouldn't send publishDiagnostics if noOp compilation") + else s.contains("build/taskFinish") && s.contains("\"noOp\":true") }, "shouldn't send publishDiagnostics if there's no change in diagnostics (were empty, are empty)" ) @@ -200,15 +191,15 @@ class BuildServerTest extends AbstractServerTest { val buildTarget = buildTargetUri("diagnostics", "Compile") val testFile = new File(svr.baseDirectory, s"diagnostics/src/main/scala/PatternMatch.scala") - compile(buildTarget, id = 33) + compile(buildTarget) - assert( - svr.waitForString(30.seconds) { s => - s.contains("build/publishDiagnostics") && - s.contains("PatternMatch.scala") && - s.contains(""""message":"match may not be exhaustive""") - }, - "should send publishDiagnostics with type error for PatternMatch.scala" + assertMessage( + "build/publishDiagnostics", + "PatternMatch.scala", + """"message":"match may not be exhaustive""" + )( + duration = 30.seconds, + message = "should send publishDiagnostics with type error for PatternMatch.scala" ) IO.write( @@ -223,49 +214,62 @@ class BuildServerTest extends AbstractServerTest { |""".stripMargin ) - reloadWorkspace(id = 55) - compile(buildTarget, id = 66) + reloadWorkspace() + compile(buildTarget) - assert( - svr.waitForString(30.seconds) { s => - s.contains("build/publishDiagnostics") && - s.contains("PatternMatch.scala") && - s.contains("\"diagnostics\":[]") - }, - "should send publishDiagnostics with empty diagnostics" + assertMessage("build/publishDiagnostics", "PatternMatch.scala", "\"diagnostics\":[]")( + duration = 30.seconds, + message = "should send publishDiagnostics with empty diagnostics" ) - } - test("buildTarget/scalacOptions") { + test("buildTarget/compile: Java diagnostics") { + val buildTarget = buildTargetUri("javaProj", "Compile") + + compile(buildTarget) + + assertMessage( + "build/publishDiagnostics", + "Hello.java", + """"severity":2""", + """missing type arguments for generic class java.util.List""" + )(message = "should send publishDiagnostics with severity 2 for Hello.java") + + assertMessage( + "build/publishDiagnostics", + "Hello.java", + """"severity":1""", + """incompatible types: int cannot be converted to java.lang.String""" + )( + message = "should send publishDiagnostics with severity 1 for Hello.java" + ) + } + + test("buildTarget/scalacOptions, buildTarget/javacOptions") { val buildTarget = buildTargetUri("util", "Compile") val badBuildTarget = buildTargetUri("badBuildTarget", "Compile") - svr.sendJsonRpc( - s"""{ "jsonrpc": "2.0", "id": "40", "method": "buildTarget/scalacOptions", "params": { - | "targets": [{ "uri": "$buildTarget" }, { "uri": "$badBuildTarget" }] - |} }""".stripMargin - ) - assert(processing("buildTarget/scalacOptions")) - assert(svr.waitForString(10.seconds) { s => - (s contains """"id":"40"""") && - (s contains "scala-library-2.13.8.jar") - }) + + val id1 = scalacOptions(Seq(buildTarget, badBuildTarget)) + assertMessage(s""""id":"$id1"""", "scala-library-2.13.11.jar")() + + val id2 = javacOptions(Seq(buildTarget, badBuildTarget)) + assertMessage(s""""id":"$id2"""", "scala-library-2.13.11.jar")() } test("buildTarget/cleanCache") { def classFile = svr.baseDirectory.toPath.resolve( - "target/out/jvm/scala-2.13.8/runandtest/backend/main/Main.class" + "target/out/jvm/scala-2.13.11/runandtest/backend/main/Main.class" ) val buildTarget = buildTargetUri("runAndTest", "Compile") - compile(buildTarget, id = 43) + compile(buildTarget) svr.waitFor[BspCompileResult](10.seconds) assert(Files.exists(classFile)) svr.sendJsonRpc( - s"""{ "jsonrpc": "2.0", "id": "44", "method": "buildTarget/cleanCache", "params": { + s"""{ "jsonrpc": "2.0", "id": "${nextId()}", "method": "buildTarget/cleanCache", "params": { | "targets": [{ "uri": "$buildTarget" }] |} }""".stripMargin ) - assert(processing("buildTarget/cleanCache")) + assertProcessing("buildTarget/cleanCache") val res = svr.waitFor[CleanCacheResult](10.seconds) assert(res.cleaned) assert(Files.notExists(classFile)) @@ -273,33 +277,31 @@ class BuildServerTest extends AbstractServerTest { test("buildTarget/cleanCache: rebuild project") { svr.sendJsonRpc( - """{ "jsonrpc": "2.0", "id": "45", "method": "workspace/buildTargets", "params": {} }""" + s"""{ "jsonrpc": "2.0", "id": "${nextId()}", "method": "workspace/buildTargets", "params": {} }""" ) - assert(processing("workspace/buildTargets")) + assertProcessing("workspace/buildTargets") val result = svr.waitFor[WorkspaceBuildTargetsResult](10.seconds) val allTargets = result.targets.map(_.id.uri) svr.sendJsonRpc( - s"""{ "jsonrpc": "2.0", "id": "46", "method": "buildTarget/cleanCache", "params": { + s"""{ "jsonrpc": "2.0", "id": "${nextId()}", "method": "buildTarget/cleanCache", "params": { | "targets": [ | ${allTargets.map(uri => s"""{ "uri": "$uri" }""").mkString(",\n")} | ] |} }""".stripMargin ) - assert(processing("buildTarget/cleanCache")) + assertProcessing("buildTarget/cleanCache") val res = svr.waitFor[CleanCacheResult](10.seconds) assert(res.cleaned) } test("workspace/reload") { + val id = nextId() svr.sendJsonRpc( - """{ "jsonrpc": "2.0", "id": "48", "method": "workspace/reload"}""" + s"""{ "jsonrpc": "2.0", "id": "$id", "method": "workspace/reload"}""" ) - assert(processing("workspace/reload")) - assert(svr.waitForString(10.seconds) { s => - (s contains """"id":"48"""") && - (s contains """"result":null""") - }) + assertProcessing("workspace/reload") + assertMessage(s""""id":"$id"""", """"result":null""")() } test("workspace/reload: send diagnostic and respond with error") { @@ -312,24 +314,21 @@ class BuildServerTest extends AbstractServerTest { |) |""".stripMargin.getBytes ) + val id = reloadWorkspace() // reload - reloadWorkspace(id = 52) - assert( - svr.waitForString(10.seconds) { s => - s.contains(s""""buildTarget":{"uri":"$metaBuildTarget"}""") && - s.contains(s""""textDocument":{"uri":"${otherBuildFile.toUri}"}""") && - s.contains(""""severity":1""") && - s.contains(""""reset":true""") - } - ) - assert( - svr.waitForString(10.seconds) { s => - s.contains(""""id":"52"""") && - s.contains(""""error"""") && - s.contains(s""""code":${ErrorCodes.InternalError}""") && - s.contains("No Append.Values[Seq[String], String] found") - } - ) + assertMessage( + s""""buildTarget":{"uri":"$metaBuildTarget"}""", + s""""textDocument":{"uri":"${otherBuildFile.toUri}"}""", + """"severity":1""", + """"reset":true""" + )() + + assertMessage( + s""""id":"$id"""", + """"error"""", + s""""code":${ErrorCodes.InternalError}""", + "String cannot be appended to Seq[String]" + )() // fix the other-build.sbt file and reload again Files.write( otherBuildFile, @@ -338,133 +337,120 @@ class BuildServerTest extends AbstractServerTest { |) |""".stripMargin.getBytes ) - reloadWorkspace(id = 52) + reloadWorkspace() // assert received an empty diagnostic - assert( - svr.waitForString(10.seconds) { s => - s.contains(s""""buildTarget":{"uri":"$metaBuildTarget"}""") && - s.contains(s""""textDocument":{"uri":"${otherBuildFile.toUri}"}""") && - s.contains(""""diagnostics":[]""") && - s.contains(""""reset":true""") - } - ) + assertMessage( + s""""buildTarget":{"uri":"$metaBuildTarget"}""", + s""""textDocument":{"uri":"${otherBuildFile.toUri}"}""", + """"diagnostics":[]""", + """"reset":true""" + )() Files.delete(otherBuildFile) } test("buildTarget/scalaMainClasses") { val buildTarget = buildTargetUri("runAndTest", "Compile") val badBuildTarget = buildTargetUri("badBuildTarget", "Compile") + val id = nextId() svr.sendJsonRpc( - s"""{ "jsonrpc": "2.0", "id": "56", "method": "buildTarget/scalaMainClasses", "params": { + s"""{ "jsonrpc": "2.0", "id": "$id", "method": "buildTarget/scalaMainClasses", "params": { | "targets": [{ "uri": "$buildTarget" }, { "uri": "$badBuildTarget" }] |} }""".stripMargin ) - assert(processing("buildTarget/scalaMainClasses")) - assert(svr.waitForString(30.seconds) { s => - (s contains """"id":"56"""") && - (s contains """"class":"main.Main"""") - }) + assertProcessing("buildTarget/scalaMainClasses") + assertMessage(s""""id":"$id"""", """"class":"main.Main"""")(duration = 30.seconds) } test("buildTarget/run") { val buildTarget = buildTargetUri("runAndTest", "Compile") + val id = nextId() svr.sendJsonRpc( - s"""{ "jsonrpc": "2.0", "id": "64", "method": "buildTarget/run", "params": { + s"""{ "jsonrpc": "2.0", "id": "$id", "method": "buildTarget/run", "params": { | "target": { "uri": "$buildTarget" }, | "dataKind": "scala-main-class", | "data": { "class": "main.Main" } |} }""".stripMargin ) - assert(processing("buildTarget/run")) - assert(svr.waitForString(10.seconds) { s => - (s contains "build/logMessage") && - (s contains """"message":"Hello World!"""") - }) - assert(svr.waitForString(10.seconds) { s => - (s contains """"id":"64"""") && - (s contains """"statusCode":1""") - }) + assertProcessing("buildTarget/run") + assertMessage("build/logMessage", """"message":"Hello World!"""")() + assertMessage(s""""id":"$id"""", """"statusCode":1""")() } test("buildTarget/jvmRunEnvironment") { val buildTarget = buildTargetUri("runAndTest", "Compile") + val id = nextId() svr.sendJsonRpc( s"""|{ "jsonrpc": "2.0", - | "id": "97", + | "id": "$id", | "method": "buildTarget/jvmRunEnvironment", | "params": { "targets": [{ "uri": "$buildTarget" }] } |}""".stripMargin ) - assert(processing("buildTarget/jvmRunEnvironment")) - assert { - svr.waitForString(10.seconds) { s => - (s contains """"id":"97"""") && - (s contains "jsoniter-scala-core_2.13-2.13.11.jar") && // compile dependency - (s contains "\"jvmOptions\":[\"Xmx256M\"]") && - (s contains "\"environmentVariables\":{\"KEY\":\"VALUE\"}") && - (s contains s""""workingDirectory":"${svr.baseDirectory.getAbsolutePath}/run-and-test"""") - } - } + assertProcessing("buildTarget/jvmRunEnvironment") + assertMessage( + s""""id":"$id"""", + "jsoniter-scala-core_2.13-2.13.11.jar", // compile dependency + "\"jvmOptions\":[\"Xmx256M\"]", + "\"environmentVariables\":{\"KEY\":\"VALUE\"}", + "/buildserver/run-and-test" // working directory + )() } test("buildTarget/jvmTestEnvironment") { val buildTarget = buildTargetUri("runAndTest", "Test") + val id = nextId() svr.sendJsonRpc( s"""|{ "jsonrpc": "2.0", - | "id": "98", + | "id": "$id", | "method": "buildTarget/jvmTestEnvironment", | "params": { "targets": [{ "uri": "$buildTarget" }] } |}""".stripMargin ) - assert(processing("buildTarget/jvmTestEnvironment")) - assert { - svr.waitForString(10.seconds) { s => - (s contains """"id":"98"""") && - // test depends on compile so it has dependencies from both - (s contains "jsoniter-scala-core_2.13-2.13.11.jar") && // compile dependency - (s contains "scalatest_2.13-3.0.8.jar") && // test dependency - (s contains "\"jvmOptions\":[\"Xmx512M\"]") && - (s contains "\"environmentVariables\":{\"KEY_TEST\":\"VALUE_TEST\"}") && - (s contains s""""workingDirectory":"${svr.baseDirectory.getAbsolutePath}/run-and-test"""") - } - } + assertProcessing("buildTarget/jvmTestEnvironment") + assertMessage( + s""""id":"$id"""", + "jsoniter-scala-core_2.13-2.13.11.jar", // compile dependency + "scalatest_2.13-3.0.8.jar", // test dependency + "\"jvmOptions\":[\"Xmx512M\"]", + "\"environmentVariables\":{\"KEY_TEST\":\"VALUE_TEST\"}" + )() } test("buildTarget/scalaTestClasses") { val buildTarget = buildTargetUri("runAndTest", "Test") val badBuildTarget = buildTargetUri("badBuildTarget", "Test") + val id = nextId() svr.sendJsonRpc( - s"""{ "jsonrpc": "2.0", "id": "72", "method": "buildTarget/scalaTestClasses", "params": { + s"""{ "jsonrpc": "2.0", "id": "$id", "method": "buildTarget/scalaTestClasses", "params": { | "targets": [{ "uri": "$buildTarget" }, { "uri": "$badBuildTarget" }] |} }""".stripMargin ) - assert(processing("buildTarget/scalaTestClasses")) - assert(svr.waitForString(10.seconds) { s => - (s contains """"id":"72"""") && - (s contains """"tests.FailingTest"""") && - (s contains """"tests.PassingTest"""") && - (s contains """"framework":"ScalaTest"""") - }) + assertProcessing("buildTarget/scalaTestClasses") + assertMessage( + s""""id":"$id"""", + """"tests.FailingTest"""", + """"tests.PassingTest"""", + """"framework":"ScalaTest"""" + )() } test("buildTarget/test: run all tests") { val buildTarget = buildTargetUri("runAndTest", "Test") + val id = nextId() svr.sendJsonRpc( - s"""{ "jsonrpc": "2.0", "id": "80", "method": "buildTarget/test", "params": { + s"""{ "jsonrpc": "2.0", "id": "$id", "method": "buildTarget/test", "params": { | "targets": [{ "uri": "$buildTarget" }] |} }""".stripMargin ) - assert(processing("buildTarget/test")) - assert(svr.waitForString(10.seconds) { s => - (s contains """"id":"80"""") && - (s contains """"statusCode":2""") - }) + assertProcessing("buildTarget/test") + assertMessage(s""""id":"$id"""", """"statusCode":2""")() } test("buildTarget/test: run one test class") { val buildTarget = buildTargetUri("runAndTest", "Test") + val id = nextId() svr.sendJsonRpc( - s"""{ "jsonrpc": "2.0", "id": "84", "method": "buildTarget/test", "params": { + s"""{ "jsonrpc": "2.0", "id": "$id", "method": "buildTarget/test", "params": { | "targets": [{ "uri": "$buildTarget" }], | "dataKind": "scala-test", | "data": { @@ -477,67 +463,63 @@ class BuildServerTest extends AbstractServerTest { | } |} }""".stripMargin ) - assert(processing("buildTarget/test")) - assert(svr.waitForString(10.seconds) { s => - (s contains """"id":"84"""") && - (s contains """"statusCode":1""") - }) + assertProcessing("buildTarget/test") + assertMessage(s""""id":"$id"""", """"statusCode":1""")() } test("buildTarget/compile: report error") { val buildTarget = buildTargetUri("reportError", "Compile") - compile(buildTarget, id = 88) - assert(svr.waitForString(10.seconds) { s => - (s contains s""""buildTarget":{"uri":"$buildTarget"}""") && - (s contains """"severity":1""") && - (s contains """"reset":true""") - }) + compile(buildTarget) + assertMessage( + s""""buildTarget":{"uri":"$buildTarget"}""", + """"severity":1""", + """"reset":true""" + )() } test("buildTarget/compile: report warning") { val buildTarget = buildTargetUri("reportWarning", "Compile") - compile(buildTarget, id = 90) - assert(svr.waitForString(10.seconds) { s => - (s contains s""""buildTarget":{"uri":"$buildTarget"}""") && - (s contains """"severity":2""") && - (s contains """"reset":true""") - }) + compile(buildTarget) + assertMessage( + s""""buildTarget":{"uri":"$buildTarget"}""", + """"severity":2""", + """"reset":true""" + )() } test("buildTarget/compile: respond error") { val buildTarget = buildTargetUri("respondError", "Compile") - compile(buildTarget, id = 92) - assert(svr.waitForString(10.seconds) { s => - s.contains(""""id":"92"""") && - s.contains(""""error"""") && - s.contains(s""""code":${ErrorCodes.InternalError}""") && - s.contains("custom message") - }) + val id = compile(buildTarget) + assertMessage( + s""""id":"$id"""", + """"error"""", + s""""code":${ErrorCodes.InternalError}""", + "custom message" + )() } test("buildTarget/resources") { val buildTarget = buildTargetUri("util", "Compile") val badBuildTarget = buildTargetUri("badBuildTarget", "Compile") + val id = nextId() svr.sendJsonRpc( - s"""{ "jsonrpc": "2.0", "id": "96", "method": "buildTarget/resources", "params": { + s"""{ "jsonrpc": "2.0", "id": "$id", "method": "buildTarget/resources", "params": { | "targets": [{ "uri": "$buildTarget" }, { "uri": "$badBuildTarget" }] |} }""".stripMargin ) - assert(processing("buildTarget/resources")) - assert(svr.waitForString(10.seconds) { s => - (s contains """"id":"96"""") && (s contains "util/src/main/resources/") - }) + assertProcessing("buildTarget/resources") + assertMessage(s""""id":"$id"""", "util/src/main/resources/")() } test("buildTarget/outputPaths") { val buildTarget = buildTargetUri("util", "Compile") val badBuildTarget = buildTargetUri("badBuildTarget", "Compile") svr.sendJsonRpc( - s"""{ "jsonrpc": "2.0", "id": "97", "method": "buildTarget/outputPaths", "params": { + s"""{ "jsonrpc": "2.0", "id": "${nextId()}", "method": "buildTarget/outputPaths", "params": { | "targets": [{ "uri": "$buildTarget" }, { "uri": "$badBuildTarget" }] |} }""".stripMargin ) - assert(processing("buildTarget/outputPaths")) + assertProcessing("buildTarget/outputPaths") val actualResult = svr.waitFor[OutputPathsResult](10.seconds) val expectedResult = OutputPathsResult( items = Vector( @@ -555,57 +537,116 @@ class BuildServerTest extends AbstractServerTest { assert(actualResult == expectedResult) } - private def initializeRequest(): Unit = { - svr.sendJsonRpc( - """{ "jsonrpc": "2.0", "id": "8", "method": "build/initialize", - | "params": { - | "displayName": "test client", - | "version": "1.0.0", - | "bspVersion": "2.1.0-M1", - | "rootUri": "file://root/", - | "capabilities": { "languageIds": ["scala"] } - | } - |}""".stripMargin + ignore("buildTarget/compile: twirl diagnostics (sourcePositionMappers)") { + val buildTarget = buildTargetUri("twirlProj", "Compile") + val testFile = new File(svr.baseDirectory, s"twirlProj/src/main/twirl/main.scala.html") + + compile(buildTarget) + assertMessage( + "build/publishDiagnostics", + "main.scala.html", + """"severity":1""", + "not found: value tilte" + )(message = "should report diagnostic in Twirl file") + IO.write( + testFile, + """|@(title: String, paragraphs: Seq[String]) + | + | + | + | + | @title + | + | + |

@title

+ | @for(paragraph <- paragraphs) { + |

@paragraph

+ | } + | + | + |""".stripMargin + ) + compile(buildTarget) + assertMessage( + "build/publishDiagnostics", + "main.scala.html", + """"diagnostics":[]""", + """"reset":true""" + )( + duration = 30.seconds, + message = "should reset diagnostic in Twirl file" ) } - private def processing(method: String, debug: Boolean = false): Boolean = { - svr.waitForString(10.seconds) { msg => - if (debug) println(msg) - msg.contains("build/logMessage") && - msg.contains(s""""message":"Processing $method"""") - } + private def initializeRequest(): Int = { + val params = InitializeBuildParams( + "test client", + "1.0.0", + "2.1.0-M1", + new URI("file://root/"), + BuildClientCapabilities(Vector("scala")), + None + ) + sendRequest("build/initialize", params) } - private def reloadWorkspace(id: Int): Unit = - svr.sendJsonRpc( - s"""{ "jsonrpc": "2.0", "id": "$id", "method": "workspace/reload"}""" - ) + private def assertProcessing(method: String, debug: Boolean = false): Unit = + assertMessage("build/logMessage", s""""message":"Processing $method"""")(debug = debug) - private def compile(buildTarget: URI, id: Int): Unit = - compile(buildTarget.toString, id) + def assertMessage( + parts: String* + )(duration: FiniteDuration = 10.seconds, debug: Boolean = false, message: String = ""): Unit = { + def assertion = + svr.waitForString(duration) { msg => + if (debug) println(msg) + parts.forall(msg.contains) + } + if (message.nonEmpty) assert(assertion, message) else assert(assertion) + } - private def compile(buildTarget: String, id: Int): Unit = - svr.sendJsonRpc( - s"""{ "jsonrpc": "2.0", "id": "$id", "method": "buildTarget/compile", "params": { - | "targets": [{ "uri": "$buildTarget" }] - |} }""".stripMargin - ) + private def reloadWorkspace(): Int = + sendRequest("workspace/reload") - private def buildTargetSources(id: Int, buildTargets: Seq[URI]): String = { + private def compile(buildTarget: URI): Int = { + val params = + CompileParams(targets = Vector(BuildTargetIdentifier(buildTarget)), None, Vector.empty) + sendRequest("buildTarget/compile", params) + } + + private def scalacOptions(buildTargets: Seq[URI]): Int = { val targets = buildTargets.map(BuildTargetIdentifier.apply).toVector - request(id, "buildTarget/sources", SourcesParams(targets)) + sendRequest("buildTarget/scalacOptions", ScalacOptionsParams(targets)) } - private def request[T: JsonWriter](id: Int, method: String, params: T): String = { - val request = JsonRpcRequestMessage("2.0", id.toString, method, Converter.toJson(params).get) - val json = Converter.toJson(request).get - CompactPrinter(json) + private def javacOptions(buildTargets: Seq[URI]): Int = { + val targets = buildTargets.map(BuildTargetIdentifier.apply).toVector + sendRequest("buildTarget/scalacOptions", ScalacOptionsParams(targets)) } - private def buildTargetUri(project: String, config: String): URI = { + private def buildTargetSources(buildTargets: Seq[URI]): Int = { + val targets = buildTargets.map(BuildTargetIdentifier.apply).toVector + sendRequest("buildTarget/sources", SourcesParams(targets)) + } + + private def sendRequest(method: String): Int = { + val id = nextId() + val msg = JsonRpcRequestMessage("2.0", id.toString, method, None) + val json = Converter.toJson(msg).get + svr.sendJsonRpc(CompactPrinter(json)) + id + } + + private def sendRequest[T: JsonWriter](method: String, params: T): Int = { + val id = nextId() + val msg = JsonRpcRequestMessage("2.0", id.toString, method, Converter.toJson(params).get) + val json = Converter.toJson(msg).get + svr.sendJsonRpc(CompactPrinter(json)) + if (method != "build/initialize") assertProcessing(method) + id + } + + private def buildTargetUri(project: String, config: String): URI = new URI(s"${svr.baseDirectory.getAbsoluteFile.toURI}#$project/$config") - } private def metaBuildTarget: String = s"${svr.baseDirectory.getAbsoluteFile.toURI}project/#buildserver-build/Compile" diff --git a/server-test/src/test/scala/testpkg/ResponseTest.scala b/server-test/src/test/scala/testpkg/ResponseTest.scala index 82b693b3b..21f5a32a5 100644 --- a/server-test/src/test/scala/testpkg/ResponseTest.scala +++ b/server-test/src/test/scala/testpkg/ResponseTest.scala @@ -16,9 +16,10 @@ class ResponseTest extends AbstractServerTest { test("response from a command") { svr.sendJsonRpc("""{ "jsonrpc": "2.0", "id": "10", "method": "foo/export", "params": {} }""") assert(svr.waitForString(10.seconds) { s => - if (!s.contains("systemOut")) println(s) + if (!s.contains("systemOut")) + println(s) (s contains """"id":"10"""") && - (s contains "scala-library-2.12.17.jar") + (s contains "scala-library-2.12.19.jar") }) } @@ -29,7 +30,7 @@ class ResponseTest extends AbstractServerTest { assert(svr.waitForString(10.seconds) { s => if (!s.contains("systemOut")) println(s) (s contains """"id":"11"""") && - (s contains "scala-library-2.12.17.jar") + (s contains "scala-library-2.12.19.jar") }) } diff --git a/tasks-standard/NOTICE b/tasks-standard/NOTICE index 3f12e2eda..94605a69a 100644 --- a/tasks-standard/NOTICE +++ b/tasks-standard/NOTICE @@ -1,4 +1,5 @@ sbt: Standard Tasks Component -Copyright 2011 - 2017, Lightbend, Inc. +Copyright 2023, Scala center +Copyright 2011 - 2022, Lightbend, Inc. Copyright 2008 - 2010, Mark Harrah Licensed under BSD-3-Clause license (see LICENSE) diff --git a/tasks-standard/src/main/scala/sbt/std/Streams.scala b/tasks-standard/src/main/scala/sbt/std/Streams.scala index cc4b83ef3..25fd67de5 100644 --- a/tasks-standard/src/main/scala/sbt/std/Streams.scala +++ b/tasks-standard/src/main/scala/sbt/std/Streams.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks-standard/src/main/scala/sbt/std/TaskExtra.scala b/tasks-standard/src/main/scala/sbt/std/TaskExtra.scala index d04d08a3c..d7d86a385 100644 --- a/tasks-standard/src/main/scala/sbt/std/TaskExtra.scala +++ b/tasks-standard/src/main/scala/sbt/std/TaskExtra.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -259,7 +260,7 @@ trait TaskExtra extends TaskExtra0 { def lines: Task[List[String]] = lines0(None) def lines(sid: String): Task[List[String]] = lines0(Some(sid)) - private def lines0[T](sid: Option[String]): Task[List[String]] = + private def lines0(sid: Option[String]): Task[List[String]] = streams map { s => IO.readLines(s.readText(key(in), sid)) } diff --git a/tasks-standard/src/main/scala/sbt/std/Transform.scala b/tasks-standard/src/main/scala/sbt/std/Transform.scala index 794b7610e..4c1790d3d 100644 --- a/tasks-standard/src/main/scala/sbt/std/Transform.scala +++ b/tasks-standard/src/main/scala/sbt/std/Transform.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks-standard/src/test/scala/Execute.scala b/tasks-standard/src/test/scala/Execute.scala index c61dc9c6b..b75eaf66a 100644 --- a/tasks-standard/src/test/scala/Execute.scala +++ b/tasks-standard/src/test/scala/Execute.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks-standard/src/test/scala/TaskGen.scala b/tasks-standard/src/test/scala/TaskGen.scala index ad4cdcbdf..8e087ac24 100644 --- a/tasks-standard/src/test/scala/TaskGen.scala +++ b/tasks-standard/src/test/scala/TaskGen.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks-standard/src/test/scala/TaskRunnerCircular.scala b/tasks-standard/src/test/scala/TaskRunnerCircular.scala index a08c91b1d..bc2c8576f 100644 --- a/tasks-standard/src/test/scala/TaskRunnerCircular.scala +++ b/tasks-standard/src/test/scala/TaskRunnerCircular.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks-standard/src/test/scala/TaskRunnerFork.scala b/tasks-standard/src/test/scala/TaskRunnerFork.scala index 3551a0914..1621c8324 100644 --- a/tasks-standard/src/test/scala/TaskRunnerFork.scala +++ b/tasks-standard/src/test/scala/TaskRunnerFork.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks-standard/src/test/scala/TaskSerial.scala b/tasks-standard/src/test/scala/TaskSerial.scala index 951a94118..f4298b78a 100644 --- a/tasks-standard/src/test/scala/TaskSerial.scala +++ b/tasks-standard/src/test/scala/TaskSerial.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks-standard/src/test/scala/Test.scala b/tasks-standard/src/test/scala/Test.scala index 34447cebd..5a2a70c89 100644 --- a/tasks-standard/src/test/scala/Test.scala +++ b/tasks-standard/src/test/scala/Test.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks-standard/src/test/scala/TestRunnerCall.scala b/tasks-standard/src/test/scala/TestRunnerCall.scala index 754c38bb8..849ea0d4f 100644 --- a/tasks-standard/src/test/scala/TestRunnerCall.scala +++ b/tasks-standard/src/test/scala/TestRunnerCall.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks-standard/src/test/scala/TestRunnerSort.scala b/tasks-standard/src/test/scala/TestRunnerSort.scala index f47daeefc..4abd4f449 100644 --- a/tasks-standard/src/test/scala/TestRunnerSort.scala +++ b/tasks-standard/src/test/scala/TestRunnerSort.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks-standard/src/test/scala/checkResult.scala b/tasks-standard/src/test/scala/checkResult.scala index 4eb13075d..601aa5943 100644 --- a/tasks-standard/src/test/scala/checkResult.scala +++ b/tasks-standard/src/test/scala/checkResult.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks/NOTICE b/tasks/NOTICE index e3f56a307..8b66ff19e 100644 --- a/tasks/NOTICE +++ b/tasks/NOTICE @@ -1,4 +1,5 @@ sbt: Task Engine Component -Copyright 2011 - 2017, Lightbend, Inc. +Copyright 2023, Scala center +Copyright 2011 - 2022, Lightbend, Inc. Copyright 2008 - 2010, Mark Harrah Licensed under BSD-3-Clause license (see LICENSE) diff --git a/tasks/src/main/scala/sbt/CompletionService.scala b/tasks/src/main/scala/sbt/CompletionService.scala index 64012b02b..c4b9cdad7 100644 --- a/tasks/src/main/scala/sbt/CompletionService.scala +++ b/tasks/src/main/scala/sbt/CompletionService.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks/src/main/scala/sbt/ConcurrentRestrictions.scala b/tasks/src/main/scala/sbt/ConcurrentRestrictions.scala index 2776a44a3..7ed701941 100644 --- a/tasks/src/main/scala/sbt/ConcurrentRestrictions.scala +++ b/tasks/src/main/scala/sbt/ConcurrentRestrictions.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -65,8 +66,6 @@ object ConcurrentRestrictions { /** * A ConcurrentRestrictions instance that places no restrictions on concurrently executing tasks. - * @param zero - * the constant placeholder used for t */ def unrestricted: ConcurrentRestrictions = new ConcurrentRestrictions { diff --git a/tasks/src/main/scala/sbt/Execute.scala b/tasks/src/main/scala/sbt/Execute.scala index e17142568..b6cc3bca2 100644 --- a/tasks/src/main/scala/sbt/Execute.scala +++ b/tasks/src/main/scala/sbt/Execute.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks/src/main/scala/sbt/ExecuteProgress.scala b/tasks/src/main/scala/sbt/ExecuteProgress.scala index e58405f2f..04c7b1414 100644 --- a/tasks/src/main/scala/sbt/ExecuteProgress.scala +++ b/tasks/src/main/scala/sbt/ExecuteProgress.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks/src/main/scala/sbt/Incomplete.scala b/tasks/src/main/scala/sbt/Incomplete.scala index db35fac2b..706657e1c 100644 --- a/tasks/src/main/scala/sbt/Incomplete.scala +++ b/tasks/src/main/scala/sbt/Incomplete.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks/src/main/scala/sbt/Node.scala b/tasks/src/main/scala/sbt/Node.scala index c58a96fe1..f4814d10b 100644 --- a/tasks/src/main/scala/sbt/Node.scala +++ b/tasks/src/main/scala/sbt/Node.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/tasks/src/main/scala/sbt/Result.scala b/tasks/src/main/scala/sbt/Result.scala index 3b5191b98..287d1465a 100644 --- a/tasks/src/main/scala/sbt/Result.scala +++ b/tasks/src/main/scala/sbt/Result.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/testing/NOTICE b/testing/NOTICE index 36daa88f1..4749d5e51 100644 --- a/testing/NOTICE +++ b/testing/NOTICE @@ -1,4 +1,5 @@ sbt: Testing Component -Copyright 2011 - 2017, Lightbend, Inc. +Copyright 2023, Scala center +Copyright 2011 - 2022, Lightbend, Inc. Copyright 2008 - 2010, Mark Harrah, Steven Blundy, Josh Cough Licensed under BSD-3-Clause license (see LICENSE) diff --git a/testing/agent/src/main/java/sbt/ForkConfiguration.java b/testing/agent/src/main/java/sbt/ForkConfiguration.java index 5a357ae24..993fe6908 100644 --- a/testing/agent/src/main/java/sbt/ForkConfiguration.java +++ b/testing/agent/src/main/java/sbt/ForkConfiguration.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/testing/agent/src/main/java/sbt/ForkMain.java b/testing/agent/src/main/java/sbt/ForkMain.java index 8856a09fb..fdc79a7d8 100644 --- a/testing/agent/src/main/java/sbt/ForkMain.java +++ b/testing/agent/src/main/java/sbt/ForkMain.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/testing/agent/src/main/java/sbt/ForkTags.java b/testing/agent/src/main/java/sbt/ForkTags.java index 5f8022fed..1b0660119 100644 --- a/testing/agent/src/main/java/sbt/ForkTags.java +++ b/testing/agent/src/main/java/sbt/ForkTags.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/testing/agent/src/main/java/sbt/FrameworkWrapper.java b/testing/agent/src/main/java/sbt/FrameworkWrapper.java index 22c94af0b..4d67edf8f 100644 --- a/testing/agent/src/main/java/sbt/FrameworkWrapper.java +++ b/testing/agent/src/main/java/sbt/FrameworkWrapper.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala b/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala index 848a6e4ba..bd5819cc1 100644 --- a/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala +++ b/testing/src/main/scala/sbt/JUnitXmlTestsListener.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/testing/src/main/scala/sbt/TestFramework.scala b/testing/src/main/scala/sbt/TestFramework.scala index 90e102345..e350d9bf1 100644 --- a/testing/src/main/scala/sbt/TestFramework.scala +++ b/testing/src/main/scala/sbt/TestFramework.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -28,6 +29,11 @@ object TestFrameworks { val JUnit = TestFramework("com.novocode.junit.JUnitFramework") val MUnit = TestFramework("munit.Framework") val ZIOTest = TestFramework("zio.test.sbt.ZTestFramework") + val WeaverTestCats = TestFramework("weaver.framework.CatsEffect") + val Hedgehog = TestFramework("hedgehog.sbt.Framework") + + val All: Seq[TestFramework] = + Seq(ScalaCheck, Specs2, Specs, ScalaTest, JUnit, MUnit, ZIOTest, WeaverTestCats, Hedgehog) } final class TestFramework(val implClassNames: String*) extends Serializable { diff --git a/testing/src/main/scala/sbt/TestReportListener.scala b/testing/src/main/scala/sbt/TestReportListener.scala index 0e73d21e1..2b1c1e607 100644 --- a/testing/src/main/scala/sbt/TestReportListener.scala +++ b/testing/src/main/scala/sbt/TestReportListener.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/testing/src/main/scala/sbt/TestStatusReporter.scala b/testing/src/main/scala/sbt/TestStatusReporter.scala index 631265f41..4eb110dac 100644 --- a/testing/src/main/scala/sbt/TestStatusReporter.scala +++ b/testing/src/main/scala/sbt/TestStatusReporter.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/testing/src/main/scala/sbt/internal/testing/StatusFormats.scala b/testing/src/main/scala/sbt/internal/testing/StatusFormats.scala index 51729dcb3..a73ee9dab 100644 --- a/testing/src/main/scala/sbt/internal/testing/StatusFormats.scala +++ b/testing/src/main/scala/sbt/internal/testing/StatusFormats.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/testing/src/main/scala/sbt/internal/testing/TestLogger.scala b/testing/src/main/scala/sbt/internal/testing/TestLogger.scala index bb772ac11..6e80abbc2 100644 --- a/testing/src/main/scala/sbt/internal/testing/TestLogger.scala +++ b/testing/src/main/scala/sbt/internal/testing/TestLogger.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-cache/src/main/scala/sbt/internal/util/EmptyCacheError.scala b/util-cache/src/main/scala/sbt/internal/util/EmptyCacheError.scala index a3e555859..36b5095d5 100644 --- a/util-cache/src/main/scala/sbt/internal/util/EmptyCacheError.scala +++ b/util-cache/src/main/scala/sbt/internal/util/EmptyCacheError.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-cache/src/main/scala/sbt/util/BasicCacheImplicits.scala b/util-cache/src/main/scala/sbt/util/BasicCacheImplicits.scala index 4acfd57f8..44ccc710e 100644 --- a/util-cache/src/main/scala/sbt/util/BasicCacheImplicits.scala +++ b/util-cache/src/main/scala/sbt/util/BasicCacheImplicits.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-cache/src/main/scala/sbt/util/Cache.scala b/util-cache/src/main/scala/sbt/util/Cache.scala index 8b152a327..e9655ba62 100644 --- a/util-cache/src/main/scala/sbt/util/Cache.scala +++ b/util-cache/src/main/scala/sbt/util/Cache.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-cache/src/main/scala/sbt/util/CacheImplicits.scala b/util-cache/src/main/scala/sbt/util/CacheImplicits.scala index ba72b9d79..766afb608 100644 --- a/util-cache/src/main/scala/sbt/util/CacheImplicits.scala +++ b/util-cache/src/main/scala/sbt/util/CacheImplicits.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-cache/src/main/scala/sbt/util/CacheStore.scala b/util-cache/src/main/scala/sbt/util/CacheStore.scala index 42cc10c40..9d3ea5a0f 100644 --- a/util-cache/src/main/scala/sbt/util/CacheStore.scala +++ b/util-cache/src/main/scala/sbt/util/CacheStore.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-cache/src/main/scala/sbt/util/FileInfo.scala b/util-cache/src/main/scala/sbt/util/FileInfo.scala index 394ed07bd..db43aedc5 100644 --- a/util-cache/src/main/scala/sbt/util/FileInfo.scala +++ b/util-cache/src/main/scala/sbt/util/FileInfo.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-cache/src/main/scala/sbt/util/Input.scala b/util-cache/src/main/scala/sbt/util/Input.scala index 3d7438b9e..62c91cb6d 100644 --- a/util-cache/src/main/scala/sbt/util/Input.scala +++ b/util-cache/src/main/scala/sbt/util/Input.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-cache/src/main/scala/sbt/util/Output.scala b/util-cache/src/main/scala/sbt/util/Output.scala index 2c19f18ce..9a288233f 100644 --- a/util-cache/src/main/scala/sbt/util/Output.scala +++ b/util-cache/src/main/scala/sbt/util/Output.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-cache/src/main/scala/sbt/util/SeparatedCache.scala b/util-cache/src/main/scala/sbt/util/SeparatedCache.scala index c986bfdfc..fa1338599 100644 --- a/util-cache/src/main/scala/sbt/util/SeparatedCache.scala +++ b/util-cache/src/main/scala/sbt/util/SeparatedCache.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-cache/src/main/scala/sbt/util/StampedFormat.scala b/util-cache/src/main/scala/sbt/util/StampedFormat.scala index cdb9ed805..bb26f2e44 100644 --- a/util-cache/src/main/scala/sbt/util/StampedFormat.scala +++ b/util-cache/src/main/scala/sbt/util/StampedFormat.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-cache/src/test/scala/CacheSpec.scala b/util-cache/src/test/scala/CacheSpec.scala index 5d4064910..2fa660320 100644 --- a/util-cache/src/test/scala/CacheSpec.scala +++ b/util-cache/src/test/scala/CacheSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-cache/src/test/scala/FileInfoSpec.scala b/util-cache/src/test/scala/FileInfoSpec.scala index 5ea495195..9ced623f2 100644 --- a/util-cache/src/test/scala/FileInfoSpec.scala +++ b/util-cache/src/test/scala/FileInfoSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-cache/src/test/scala/SingletonCacheSpec.scala b/util-cache/src/test/scala/SingletonCacheSpec.scala index 9c47a6c86..ac4c5f33f 100644 --- a/util-cache/src/test/scala/SingletonCacheSpec.scala +++ b/util-cache/src/test/scala/SingletonCacheSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/NOTICE b/util-collection/NOTICE index db1ba7e33..476ffa821 100644 --- a/util-collection/NOTICE +++ b/util-collection/NOTICE @@ -1,4 +1,5 @@ sbt: Collection Component -Copyright 2011 - 2017, Lightbend, Inc. +Copyright 2023, Scala center +Copyright 2011 - 2022, Lightbend, Inc. Copyright 2008 - 2010, Mark Harrah Licensed under BSD-3-Clause license (see LICENSE) diff --git a/util-collection/src/main/scala-2.12/sbt/internal/util/Par.scala b/util-collection/src/main/scala-2.12/sbt/internal/util/Par.scala index 34e939244..6f07a0074 100644 --- a/util-collection/src/main/scala-2.12/sbt/internal/util/Par.scala +++ b/util-collection/src/main/scala-2.12/sbt/internal/util/Par.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/main/scala-2.12/sbt/internal/util/WrappedMap.scala b/util-collection/src/main/scala-2.12/sbt/internal/util/WrappedMap.scala index 55c7bbee3..3cbc6fa26 100644 --- a/util-collection/src/main/scala-2.12/sbt/internal/util/WrappedMap.scala +++ b/util-collection/src/main/scala-2.12/sbt/internal/util/WrappedMap.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/main/scala-2/sbt/internal/util/HList.scala b/util-collection/src/main/scala-2/sbt/internal/util/HList.scala index dc9d163f9..d0644a4b5 100644 --- a/util-collection/src/main/scala-2/sbt/internal/util/HList.scala +++ b/util-collection/src/main/scala-2/sbt/internal/util/HList.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/main/scala-2/sbt/internal/util/HListFormats.scala b/util-collection/src/main/scala-2/sbt/internal/util/HListFormats.scala index 04d8fc694..454a3bd36 100644 --- a/util-collection/src/main/scala-2/sbt/internal/util/HListFormats.scala +++ b/util-collection/src/main/scala-2/sbt/internal/util/HListFormats.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/main/scala-2/sbt/internal/util/KList.scala b/util-collection/src/main/scala-2/sbt/internal/util/KList.scala index c64869f99..c8ede969a 100644 --- a/util-collection/src/main/scala-2/sbt/internal/util/KList.scala +++ b/util-collection/src/main/scala-2/sbt/internal/util/KList.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/main/scala/sbt/internal/util/Dag.scala b/util-collection/src/main/scala/sbt/internal/util/Dag.scala index df2917fb7..3c2e88a4f 100644 --- a/util-collection/src/main/scala/sbt/internal/util/Dag.scala +++ b/util-collection/src/main/scala/sbt/internal/util/Dag.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/main/scala/sbt/internal/util/IDSet.scala b/util-collection/src/main/scala/sbt/internal/util/IDSet.scala index 6b802b291..5b7c71242 100644 --- a/util-collection/src/main/scala/sbt/internal/util/IDSet.scala +++ b/util-collection/src/main/scala/sbt/internal/util/IDSet.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/main/scala/sbt/internal/util/INode.scala b/util-collection/src/main/scala/sbt/internal/util/INode.scala index 6e647f4ab..bd8a569c2 100644 --- a/util-collection/src/main/scala/sbt/internal/util/INode.scala +++ b/util-collection/src/main/scala/sbt/internal/util/INode.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/main/scala/sbt/internal/util/Signal.scala b/util-collection/src/main/scala/sbt/internal/util/Signal.scala index 13442c9ec..864740703 100644 --- a/util-collection/src/main/scala/sbt/internal/util/Signal.scala +++ b/util-collection/src/main/scala/sbt/internal/util/Signal.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/main/scala/sbt/internal/util/Types.scala b/util-collection/src/main/scala/sbt/internal/util/Types.scala index 5ae6dbb02..d81de5494 100644 --- a/util-collection/src/main/scala/sbt/internal/util/Types.scala +++ b/util-collection/src/main/scala/sbt/internal/util/Types.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/main/scala/sbt/util/OptJsonWriter.scala b/util-collection/src/main/scala/sbt/util/OptJsonWriter.scala index 13883bbff..15df76707 100644 --- a/util-collection/src/main/scala/sbt/util/OptJsonWriter.scala +++ b/util-collection/src/main/scala/sbt/util/OptJsonWriter.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/main/scala/sbt/util/Show.scala b/util-collection/src/main/scala/sbt/util/Show.scala index 221824737..93b647aee 100644 --- a/util-collection/src/main/scala/sbt/util/Show.scala +++ b/util-collection/src/main/scala/sbt/util/Show.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/test/scala-2/DagSpecification.scala b/util-collection/src/test/scala-2/DagSpecification.scala index f5da77dee..9b919faa2 100644 --- a/util-collection/src/test/scala-2/DagSpecification.scala +++ b/util-collection/src/test/scala-2/DagSpecification.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/test/scala-2/HListFormatSpec.scala b/util-collection/src/test/scala-2/HListFormatSpec.scala index dbdd5ce88..2b0b96bab 100644 --- a/util-collection/src/test/scala-2/HListFormatSpec.scala +++ b/util-collection/src/test/scala-2/HListFormatSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/test/scala-2/KeyTest.scala b/util-collection/src/test/scala-2/KeyTest.scala index b2ebb4d11..01f1e4830 100644 --- a/util-collection/src/test/scala-2/KeyTest.scala +++ b/util-collection/src/test/scala-2/KeyTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/test/scala-2/PMapTest.scala b/util-collection/src/test/scala-2/PMapTest.scala index c21cfd4b0..98660389a 100644 --- a/util-collection/src/test/scala-2/PMapTest.scala +++ b/util-collection/src/test/scala-2/PMapTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/test/scala-2/SettingsTest.scala b/util-collection/src/test/scala-2/SettingsTest.scala index bbfa2a848..00cf122fb 100644 --- a/util-collection/src/test/scala-2/SettingsTest.scala +++ b/util-collection/src/test/scala-2/SettingsTest.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -69,7 +70,7 @@ object SettingsTest extends Properties("settings") { ).toSeq { - // Note: This causes a cycle refernec error, quite frequently. + // Note: This causes a cycle reference error, quite frequently. checkKey(last, Some(nr - 1), evaluate(setting(chk, value(0)) +: derivedSettings)) :| "Not derived?" } && { checkKey(last, None, evaluate(derivedSettings)) :| "Should not be derived" diff --git a/util-collection/src/test/scala-2/UnitSpec.scala b/util-collection/src/test/scala-2/UnitSpec.scala index 912b39d16..1469ed6f6 100644 --- a/util-collection/src/test/scala-2/UnitSpec.scala +++ b/util-collection/src/test/scala-2/UnitSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-collection/src/test/scala/SettingsExample.scala b/util-collection/src/test/scala/SettingsExample.scala index 9876fa7a0..9ec7828e5 100644 --- a/util-collection/src/test/scala/SettingsExample.scala +++ b/util-collection/src/test/scala/SettingsExample.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-tracking/src/main/scala/sbt/util/ChangeReport.scala b/util-tracking/src/main/scala/sbt/util/ChangeReport.scala index 9ebe7da84..24ef43c1d 100644 --- a/util-tracking/src/main/scala/sbt/util/ChangeReport.scala +++ b/util-tracking/src/main/scala/sbt/util/ChangeReport.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-tracking/src/main/scala/sbt/util/FileFunction.scala b/util-tracking/src/main/scala/sbt/util/FileFunction.scala index 3a5b06d7f..efd8dc4ac 100644 --- a/util-tracking/src/main/scala/sbt/util/FileFunction.scala +++ b/util-tracking/src/main/scala/sbt/util/FileFunction.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-tracking/src/main/scala/sbt/util/Tracked.scala b/util-tracking/src/main/scala/sbt/util/Tracked.scala index 850392397..00c6bff49 100644 --- a/util-tracking/src/main/scala/sbt/util/Tracked.scala +++ b/util-tracking/src/main/scala/sbt/util/Tracked.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/util-tracking/src/test/scala/sbt/util/TrackedSpec.scala b/util-tracking/src/test/scala/sbt/util/TrackedSpec.scala index 8d8a69337..ad24cf535 100644 --- a/util-tracking/src/test/scala/sbt/util/TrackedSpec.scala +++ b/util-tracking/src/test/scala/sbt/util/TrackedSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/vscode-sbt-scala/.vscode/launch.json b/vscode-sbt-scala/.vscode/launch.json deleted file mode 100644 index 5201e0897..000000000 --- a/vscode-sbt-scala/.vscode/launch.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "version": "0.2.0", - // List of configurations. Add new configurations or edit existing ones. - "configurations": [ - { - "name": "Launch Client", - "type": "extensionHost", - "request": "launch", - "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceRoot}/client" - ], - "stopOnEntry": false, - "sourceMaps": true, - "outFiles": [ - "${workspaceRoot}/client/out/**/*.js" - ] - // "preLaunchTask": "Client Watch" - }, - { - "name": "Attach to Server", - "type": "node", - "request": "attach", - "port": 6009, - "sourceMaps": true, - "outFiles": [ - "${workspaceRoot}/client/server/**/*.js" - ], - "protocol": "legacy" - // "preLaunchTask": "Server Watch" - } - ] -} \ No newline at end of file diff --git a/vscode-sbt-scala/.vscode/settings.json b/vscode-sbt-scala/.vscode/settings.json deleted file mode 100644 index ed40daef9..000000000 --- a/vscode-sbt-scala/.vscode/settings.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "files.exclude": { - "out": false // set this to true to hide the "out" folder with the compiled JS files - }, - "search.exclude": { - "out": true // set this to false to include "out" folder in search results - }, - "typescript.tsdk": "./node_modules/typescript/lib", - "typescript.tsc.autoDetect": "off" -} \ No newline at end of file diff --git a/vscode-sbt-scala/.vscode/tasks.json b/vscode-sbt-scala/.vscode/tasks.json deleted file mode 100644 index 51026cd2d..000000000 --- a/vscode-sbt-scala/.vscode/tasks.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "taskName": "compile", - "dependsOn": [ - "compile:client", - "compile:server" - ], - "problemMatcher": [] - }, - { - "label": "compile:client", - "type": "npm", - "script": "compile:client", - "group": "build", - "presentation": { - "panel": "dedicated", - "reveal": "never" - }, - "problemMatcher": [ - "$tsc" - ] - }, - { - "label": "compile:server", - "type": "npm", - "script": "compile:server", - "group": "build", - "presentation": { - "panel": "dedicated", - "reveal": "never" - }, - "problemMatcher": [ - "$tsc" - ] - }, - { - "taskName": "watch", - "dependsOn": [ - "watch:client", - "watch:server" - ], - "group": { - "kind": "build", - "isDefault": true - }, - "problemMatcher": [] - }, - { - "label": "watch:client", - "type": "npm", - "script": "watch:client", - "isBackground": true, - "group": "build", - "presentation": { - "panel": "dedicated", - "reveal": "never" - }, - "problemMatcher": [ - "$tsc-watch" - ] - }, - { - "label": "watch:server", - "type": "npm", - "script": "watch:server", - "isBackground": true, - "group": "build", - "presentation": { - "panel": "dedicated", - "reveal": "never" - }, - "problemMatcher": [ - "$tsc-watch" - ] - } - ] -} \ No newline at end of file diff --git a/vscode-sbt-scala/client/.vscodeignore b/vscode-sbt-scala/client/.vscodeignore deleted file mode 100644 index 93e28ff2f..000000000 --- a/vscode-sbt-scala/client/.vscodeignore +++ /dev/null @@ -1,9 +0,0 @@ -.vscode/** -typings/** -out/test/** -test/** -src/** -**/*.map -.gitignore -tsconfig.json -vsc-extension-quickstart.md diff --git a/vscode-sbt-scala/client/README.md b/vscode-sbt-scala/client/README.md deleted file mode 100644 index 01de59573..000000000 --- a/vscode-sbt-scala/client/README.md +++ /dev/null @@ -1,9 +0,0 @@ -Scala language support using sbt -================================ - -This is an experimental Scala language support using sbt as the language server. - -To try this, use sbt 1.1.0-RC1 or above. - -- Saving `*.scala` will trigger `compile` task. -- Jump to definition support for class names. diff --git a/vscode-sbt-scala/client/images/sbt-logo-bgwhite-455x262.png b/vscode-sbt-scala/client/images/sbt-logo-bgwhite-455x262.png deleted file mode 100644 index cce326960..000000000 Binary files a/vscode-sbt-scala/client/images/sbt-logo-bgwhite-455x262.png and /dev/null differ diff --git a/vscode-sbt-scala/client/images/sbt-logo.svg b/vscode-sbt-scala/client/images/sbt-logo.svg deleted file mode 100644 index d028d0540..000000000 --- a/vscode-sbt-scala/client/images/sbt-logo.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - diff --git a/vscode-sbt-scala/client/language-configuration.json b/vscode-sbt-scala/client/language-configuration.json deleted file mode 100644 index aa2571000..000000000 --- a/vscode-sbt-scala/client/language-configuration.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "comments": { - // symbol used for single line comment. Remove this entry if your language does not support line comments - "lineComment": "//", - // symbols used for start and end a block comment. Remove this entry if your language does not support block comments - "blockComment": [ "/*", "*/" ] - }, - // symbols used as brackets - "brackets": [ - ["{", "}"], - ["[", "]"], - ["(", ")"] - ], - // symbols that are auto closed when typing - "autoClosingPairs": [ - ["{", "}"], - ["[", "]"], - ["(", ")"], - ["\"", "\""], - ["'", "'"] - ], - // symbols that that can be used to surround a selection - "surroundingPairs": [ - ["{", "}"], - ["[", "]"], - ["(", ")"], - ["\"", "\""], - ["'", "'"] - ] -} \ No newline at end of file diff --git a/vscode-sbt-scala/client/package-lock.json b/vscode-sbt-scala/client/package-lock.json deleted file mode 100644 index 75dc4fb56..000000000 --- a/vscode-sbt-scala/client/package-lock.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "vscode-sbt-scala", - "version": "0.2.4", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/vscode": { - "version": "1.34.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.34.0.tgz", - "integrity": "sha512-t81rGr6aFw8TMap7UJdikC5ilOtL0yNr/pkovyyTy31fZ4XJehrxLMRh8nJuoOF3+g4rG9ljmtQo7tm6wyoaYA==", - "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" - }, - "vscode-jsonrpc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", - "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" - }, - "vscode-languageclient": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-5.2.1.tgz", - "integrity": "sha512-7jrS/9WnV0ruqPamN1nE7qCxn0phkH5LjSgSp9h6qoJGoeAKzwKz/PF6M+iGA/aklx4GLZg1prddhEPQtuXI1Q==", - "requires": { - "semver": "^5.5.0", - "vscode-languageserver-protocol": "3.14.1" - } - }, - "vscode-languageserver-protocol": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz", - "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==", - "requires": { - "vscode-jsonrpc": "^4.0.0", - "vscode-languageserver-types": "3.14.0" - } - }, - "vscode-languageserver-types": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", - "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" - } - } -} diff --git a/vscode-sbt-scala/client/package.json b/vscode-sbt-scala/client/package.json deleted file mode 100644 index 15736ae67..000000000 --- a/vscode-sbt-scala/client/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "vscode-sbt-scala", - "displayName": "Scala (sbt)", - "version": "0.2.4", - "author": "Lightbend, Inc.", - "license": "BSD-3-Clause", - "publisher": "lightbend", - "repository": { - "type": "git", - "url": "https://github.com/sbt/sbt" - }, - "description": "Scala language support using sbt", - "icon": "images/sbt-logo-bgwhite-455x262.png", - "engines": { - "vscode": "^1.23.0" - }, - "categories": [ - "Languages" - ], - "contributes": { - "languages": [ - { - "id": "scala", - "aliases": [ - "Scala", - "scala" - ], - "extensions": [ - ".scala", - ".sbt" - ], - "configuration": "./language-configuration.json" - } - ], - "grammars": [ - { - "language": "scala", - "scopeName": "source.scala", - "path": "./syntaxes/Scala.tmLanguage" - } - ] - }, - "activationEvents": [ - "workspaceContains:build.sbt" - ], - "main": "./out/src/extension", - "scripts": {}, - "dependencies": { - "vscode-languageclient": "^5.2.1" - }, - "devDependencies": { - "@types/vscode": "^1.32.0" - } -} diff --git a/vscode-sbt-scala/client/src/extension.ts b/vscode-sbt-scala/client/src/extension.ts deleted file mode 100644 index 4ccebed75..000000000 --- a/vscode-sbt-scala/client/src/extension.ts +++ /dev/null @@ -1,129 +0,0 @@ -'use strict'; - -import * as path from 'path'; -import * as url from 'url'; -import * as net from 'net'; -let fs = require('fs'), - os = require('os'); -import * as vscode from 'vscode'; -import { ExtensionContext, workspace } from 'vscode'; // workspace, -import { - LanguageClient, - LanguageClientOptions, - RevealOutputChannelOn, - ServerOptions, - TransportKind -} from 'vscode-languageclient'; - -let terminal: vscode.Terminal = null; - -function delay(ms: number) { - return new Promise(resolve => setTimeout(resolve, ms)); -} - -export async function deactivate() { - if (terminal != null) { - terminal.sendText("exit"); - await delay(1000); - terminal.dispose(); - } -} - -export async function activate(context: ExtensionContext) { - // Start sbt - terminal = vscode.window.createTerminal(`sbt`); - terminal.show(); - terminal.sendText("sbt"); - // Wait for sbt server to start - let retries = 60; - while (retries > 0) { - retries--; - await delay(1000); - if (isServerUp()) { - break; - } - } - - // The server is implemented in node - let serverModule = context.asAbsolutePath(path.join('server', 'server.js')); - // The debug options for the server - // let debugOptions = { execArgv: ["--nolazy", "--debug=6009"] }; - - // If the extension is launched in debug mode then the debug server options are used - // Otherwise the run options are used - let serverOptions: ServerOptions = { - run : { module: serverModule, transport: TransportKind.stdio }, - debug: { module: serverModule, transport: TransportKind.stdio } - } - - // Options to control the language client - let clientOptions: LanguageClientOptions = { - documentSelector: [{ language: 'scala', scheme: 'file' }, { language: 'java', scheme: 'file' }], - revealOutputChannelOn: RevealOutputChannelOn.Never, - initializationOptions: () => { - return discoverToken(); - } - } - - // Don't start VS Code connection until sbt server is confirmed to be up and running. - function isServerUp(): boolean { - let isFileThere = fs.existsSync(path.join(workspace.rootPath, 'project', 'target', 'active.json')); - if (!isFileThere) { - return false; - } else { - let skt = new net.Socket(); - try { - connectSocket(skt); - } catch(e) { - return false; - } - skt.end(); - return true; - } - } - - function connectSocket(socket: net.Socket):  net.Socket { - let u = discoverUrl(); - // let socket = net.Socket(); - if (u.protocol == 'tcp:') { - socket.connect(+u.port, '127.0.0.1'); - } else if (u.protocol == 'local:' && os.platform() == 'win32') { - let pipePath = '\\\\.\\pipe\\' + u.hostname; - socket.connect(pipePath); - } else if (u.protocol == 'local:') { - socket.connect(u.path); - } else { - throw 'Unknown protocol ' + u.protocol; - } - return socket; - } - - // the port file is hardcoded to a particular location relative to the build. - function discoverUrl(): url.Url { - let pf = path.join(process.cwd(), 'project', 'target', 'active.json'); - let portfile = JSON.parse(fs.readFileSync(pf)); - return url.parse(portfile.uri); - } - - // the port file is hardcoded to a particular location relative to the build. - function discoverToken(): any { - let pf = path.join(workspace.rootPath, 'project', 'target', 'active.json'); - let portfile = JSON.parse(fs.readFileSync(pf)); - - // if tokenfilepath exists, return the token. - if (portfile.hasOwnProperty('tokenfilePath')) { - let tf = portfile.tokenfilePath; - let tokenfile = JSON.parse(fs.readFileSync(tf)); - return { - token: tokenfile.token - }; - } else { - return {}; - } - } - - // Create the language client and start the client. - let disposable = new LanguageClient('lspSbtScala', 'sbt Scala Language Server', serverOptions, clientOptions).start(); - - context.subscriptions.push(disposable); -} diff --git a/vscode-sbt-scala/client/syntaxes/Scala.tmLanguage b/vscode-sbt-scala/client/syntaxes/Scala.tmLanguage deleted file mode 100644 index aee49eaf0..000000000 --- a/vscode-sbt-scala/client/syntaxes/Scala.tmLanguage +++ /dev/null @@ -1,1262 +0,0 @@ - - - - - fileTypes - - scala - - firstLineMatch - ^#!/.*\b\w*scala\b - foldingStartMarker - /\*\*|\{\s*$ - foldingStopMarker - \*\*/|^\s*\} - keyEquivalent - ^~S - name - Scala - patterns - - - include - #code - - - repository - - block-comments - - begin - /\* - end - \*/ - name - comment.block.scala - patterns - - - include - #block-comments - - - match - (?x) - (?! /\*) - (?! \*/) - - - - - char-literal - - begin - ' - beginCaptures - - 0 - - name - punctuation.definition.character.begin.scala - - - end - ' - endCaptures - - 0 - - name - punctuation.definition.character.end.scala - - - name - constant.character.literal.scala - patterns - - - match - \\(?:[btnfr\\"']|[0-7]{1,3}|u[0-9A-Fa-f]{4}) - name - constant.character.escape.scala - - - match - \\. - name - invalid.illegal.unrecognized-character-escape.scala - - - match - [^']{2,} - name - invalid.illegal.character-literal-too-long - - - match - (?<!')[^'] - name - invalid.illegal.character-literal-too-long - - - - code - - patterns - - - include - #script-header - - - include - #storage-modifiers - - - include - #declarations - - - include - #inheritance - - - include - #imports - - - include - #comments - - - include - #strings - - - include - #initialization - - - include - #xml-literal - - - include - #keywords - - - include - #constants - - - include - #scala-symbol - - - include - #special-identifier - - - include - #char-literal - - - include - #empty-parentheses - - - include - #parameter-list - - - include - #qualifiedClassName - - - include - #meta-brackets - - - include - #meta-bounds - - - include - #meta-colons - - - - comments - - patterns - - - captures - - 0 - - name - punctuation.definition.comment.scala - - - match - /\*\*/ - name - comment.block.empty.scala - - - begin - ^\s*(/\*\*)(?!/) - beginCaptures - - 1 - - name - punctuation.definition.comment.scala - - - end - \*/ - endCaptures - - 0 - - name - punctuation.definition.comment.scala - - - name - comment.block.documentation.scala - patterns - - - captures - - 1 - - name - keyword.other.documentation.scaladoc.scala - - 2 - - name - variable.parameter.scala - - - match - (@param)\s+(\S+) - - - captures - - 1 - - name - keyword.other.documentation.scaladoc.scala - - 2 - - name - entity.name.class - - - match - (@(?:tparam|throws))\s+(\S+) - - - match - @(return|see|note|example|usecase|author|version|since|todo|deprecated|migration|define|inheritdoc)\b - name - keyword.other.documentation.scaladoc.scala - - - captures - - 1 - - name - punctuation.definition.documentation.link.scala - - 2 - - name - entity.other.documentation.link.scala - - 3 - - name - punctuation.definition.documentation.link.scala - - - match - (\[\[)([^\]]+)(\]\]) - - - - - begin - /\* - captures - - 0 - - name - punctuation.definition.comment.scala - - - end - \*/ - name - comment.block.scala - - - begin - (^[ \t]+)?(?=//) - beginCaptures - - 1 - - name - punctuation.whitespace.comment.leading.scala - - - end - (?!\G) - patterns - - - begin - // - beginCaptures - - 0 - - name - punctuation.definition.comment.scala - - - end - \n - name - comment.line.double-slash.scala - - - - - - constants - - patterns - - - match - \b(false|null|true|Nil|None)\b - name - constant.language.scala - - - match - \b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.[0-9]+)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?|[0-9]+)([LlFfDd]|UL|ul)?\b - name - constant.numeric.scala - - - match - \b(this|super|self)\b - name - variable.language.scala - - - match - \b(Unit|Boolean|Byte|Char|Short|Int|Float|Long|Double)\b - name - storage.type.primitive.scala - - - match - \b(String|Symbol)\b - name - storage.type.scala - - - - declarations - - patterns - - - captures - - 1 - - name - keyword.declaration.scala - - 2 - - name - entity.name.function.declaration - - - match - (?x) - \b(def)\s+ - (`[^`]+`|[_$a-zA-Z][_$a-zA-Z0-9]*(?:_[^\t .,;()\[\]{}'"`\w])(?=[(\t ])|[_$a-zA-Z][_$a-zA-Z0-9]*|[-?~><^+*%:!#|/@\\]+) - - - captures - - 1 - - name - keyword.declaration.scala - - 2 - - name - keyword.declaration.scala - - 3 - - name - entity.name.class.declaration - - - match - (case)?\b(class|trait|object)\s+([^\s\{\(\[]+) - - - captures - - 1 - - name - keyword.declaration.scala - - 2 - - name - entity.name.type.declaration - - - match - \b(type)\s+(`[^`]+`|[_$a-zA-Z][_$a-zA-Z0-9]*(?:_[^\s])(?=[\t ])|[_$a-zA-Z][_$a-zA-Z0-9]*|[-?~><^+*%:!#|/@\\]+) - - - captures - - 1 - - name - keyword.declaration.stable.scala - - 2 - - name - constant.other.declaration.scala - - - match - \b(val)\s+(?:([A-Z][_a-zA-Z0-9]*))\b - - - captures - - 1 - - name - keyword.declaration.stable.scala - - 2 - - name - keyword.declaration.volatile.scala - - 3 - - name - variable.other.declaration.scala - - - match - \b(?:(val)|(var))\s+(?:(`[^`]+`|[_$a-zA-Z][_$a-zA-Z0-9]*(?:_[^\t .,;()\[\]{}'"`\w])(?=[\t ])|[_$a-zA-Z][_$a-zA-Z0-9]*|[-?~><^+*%:!#|/@\\]+)|(?=\()) - - - captures - - 1 - - name - keyword.other.scoping.scala - - 2 - - name - keyword.declaration.scala - - 3 - - name - entity.name.class.declaration - - - match - \b(package)\s+(object)\s+([^\s\{\(\[]+) - - - begin - \b(package)\s+ - beginCaptures - - 1 - - name - keyword.other.import.scala - - - end - (?<=[\n;]) - name - meta.package.scala - patterns - - - include - #comments - - - match - (`[^`]+`|[_$a-zA-Z][_$a-zA-Z0-9]*) - name - entity.name.package.scala - - - match - \. - name - punctuation.definition.package - - - - - - empty-parentheses - - captures - - 1 - - name - meta.bracket.scala - - - match - (\(\)) - name - meta.parentheses.scala - - imports - - begin - \b(import)\s+ - beginCaptures - - 1 - - name - keyword.other.import.scala - - - end - (?<=[\n;]) - name - meta.import.scala - patterns - - - include - #comments - - - match - (`[^`]+`|[_$a-zA-Z][_$a-zA-Z0-9]*) - name - entity.name.import.scala - - - match - \. - name - punctuation.definition.import - - - begin - { - beginCaptures - - 0 - - name - meta.bracket.scala - - - end - } - endCaptures - - 0 - - name - meta.bracket.scala - - - name - meta.import.selector.scala - patterns - - - captures - - 1 - - name - entity.name.import.renamed-from.scala - - 2 - - name - keyword.other.arrow.scala - - 3 - - name - entity.name.import.renamed-to.scala - - - match - (?x) \s* - (`[^`]+`|[_$a-zA-Z][_$a-zA-Z0-9]*) \s* - (=>) \s* - (`[^`]+`|[_$a-zA-Z][_$a-zA-Z0-9]*) \s* - - - - match - ([^\s.,}]+) - name - entity.name.import.scala - - - - - - inheritance - - patterns - - - captures - - 1 - - name - keyword.declaration.scala - - 2 - - name - entity.other.inherited-class.scala - - - match - (extends|with)\s+([^\s\{\(\[\]]+) - - - - initialization - - captures - - 1 - - name - keyword.declaration.scala - - 2 - - name - entity.name.class - - - match - \b(new)\s+([^\s,\{\}\(\)\[\]]+) - - keywords - - patterns - - - match - \b(return|throw)\b - name - keyword.control.flow.jump.scala - - - match - \b(classOf|isInstanceOf|asInstanceOf)\b - name - support.function.type-of.scala - - - match - \b(else|if|do|while|for|yield|match|case)\b - name - keyword.control.flow.scala - - - match - \b(catch|finally|try)\b - name - keyword.control.exception.scala - - - match - (==?|!=|<=|>=|<>|<|>) - name - keyword.operator.comparison.scala - - - match - (\-|\+|\*|/(?![/*])|%|~) - name - keyword.operator.arithmetic.scala - - - match - (!|&&|\|\|) - name - keyword.operator.logical.scala - - - match - (<-|←|->|→|=>|⇒|\?|\:+|@|\|)+ - name - keyword.operator.scala - - - - meta-bounds - - comment - For themes: Matching view bounds - match - <%|=:=|<:<|<%<|>:|<: - name - meta.bounds.scala - - meta-brackets - - comment - For themes: Brackets look nice when colored. - patterns - - - comment - The punctuation.section.*.begin is needed for return snippet in source bundle - match - \{ - name - punctuation.section.block.begin.scala - - - comment - The punctuation.section.*.end is needed for return snippet in source bundle - match - \} - name - punctuation.section.block.end.scala - - - match - {|}|\(|\)|\[|\] - name - meta.bracket.scala - - - - meta-colons - - comment - For themes: Matching type colons - patterns - - - match - (?<!:):(?!:) - name - meta.colon.scala - - - - parameter-list - - patterns - - - captures - - 1 - - name - variable.parameter.scala - - 2 - - name - meta.colon.scala - - - comment - We do not match param names that start with a Capitol letter - match - (?<=[^\._$a-zA-Z0-9])(`[^`]+`|[_$a-z][_$a-zA-Z0-9]*(?:_[^\s])(?=[\t ])|[_$a-z][_$a-zA-Z0-9]*|[-?~><^+*%:!#|/@\\]+)\s*(:)\s+ - - - - qualifiedClassName - - captures - - 1 - - name - entity.name.class - - - match - (\b([A-Z][\w]*)) - - scala-symbol - - match - '\w+(?=[^'\w]|$) - name - constant.other.symbol.scala - - script-header - - captures - - 1 - - name - string.unquoted.shebang.scala - - - match - ^#!(.*)$ - name - comment.block.shebang.scala - - special-identifier - - comment - - Match special scala style identifiers that can end with and underscore and - a a not letter such as blank_?. This way the symbol will not be colored - differently. - - match - \b[_$a-zA-Z][_$a-zA-Z0-9]*(?:_[^\t .,;()\[\]{}'"`\w]) - - storage-modifiers - - patterns - - - match - \b(private\[\S+\]|protected\[\S+\]|private|protected)\b - name - storage.modifier.access - - - match - \b(synchronized|@volatile|abstract|final|lazy|sealed|implicit|override|@transient|@native)\b - name - storage.modifier.other - - - - strings - - patterns - - - begin - """ - beginCaptures - - 0 - - name - punctuation.definition.string.begin.scala - - - end - """(?!") - endCaptures - - 0 - - name - punctuation.definition.string.end.scala - - - name - string.quoted.triple.scala - patterns - - - match - \\\\|\\u[0-9A-Fa-f]{4} - name - constant.character.escape.scala - - - - - begin - " - beginCaptures - - 0 - - name - punctuation.definition.string.begin.scala - - - end - " - endCaptures - - 0 - - name - punctuation.definition.string.end.scala - - - name - string.quoted.double.scala - patterns - - - match - \\(?:[btnfr\\"']|[0-7]{1,3}|u[0-9A-Fa-f]{4}) - name - constant.character.escape.scala - - - match - \\. - name - invalid.illegal.unrecognized-string-escape.scala - - - - - - xml-doublequotedString - - begin - " - beginCaptures - - 0 - - name - punctuation.definition.string.begin.xml - - - end - " - endCaptures - - 0 - - name - punctuation.definition.string.end.xml - - - name - string.quoted.double.xml - patterns - - - include - #xml-entity - - - - xml-embedded-content - - patterns - - - begin - { - captures - - 0 - - name - meta.bracket.scala - - - end - } - name - meta.source.embedded.scala - patterns - - - include - #code - - - - - captures - - 1 - - name - entity.other.attribute-name.namespace.xml - - 2 - - name - entity.other.attribute-name.xml - - 3 - - name - punctuation.separator.namespace.xml - - 4 - - name - entity.other.attribute-name.localname.xml - - - match - (?:([-_a-zA-Z0-9]+)((:)))?([_a-zA-Z-]+)= - - - include - #xml-doublequotedString - - - include - #xml-singlequotedString - - - - xml-entity - - captures - - 1 - - name - punctuation.definition.constant.xml - - 3 - - name - punctuation.definition.constant.xml - - - match - (&)([:a-zA-Z_][:a-zA-Z0-9_.-]*|#[0-9]+|#x[0-9a-fA-F]+)(;) - name - constant.character.entity.xml - - xml-literal - - patterns - - - begin - (<)((?:([_a-zA-Z0-9][_a-zA-Z0-9]*)((:)))?([_a-zA-Z0-9][-_a-zA-Z0-9:]*))(?=(\s[^>]*)?></\2>) - beginCaptures - - 1 - - name - punctuation.definition.tag.xml - - 3 - - name - entity.name.tag.namespace.xml - - 4 - - name - entity.name.tag.xml - - 5 - - name - punctuation.separator.namespace.xml - - 6 - - name - entity.name.tag.localname.xml - - - comment - We do not allow a tag name to start with a - since this would - likely conflict with the <- operator. This is not very common - for tag names anyway. Also code such as -- if (val <val2 || val> val3) - will falsly be recognized as an xml tag. The solution is to put a - space on either side of the comparison operator - end - (>(<))/(?:([-_a-zA-Z0-9]+)((:)))?([-_a-zA-Z0-9:]*[_a-zA-Z0-9])(>) - endCaptures - - 1 - - name - punctuation.definition.tag.xml - - 2 - - name - meta.scope.between-tag-pair.xml - - 3 - - name - entity.name.tag.namespace.xml - - 4 - - name - entity.name.tag.xml - - 5 - - name - punctuation.separator.namespace.xml - - 6 - - name - entity.name.tag.localname.xml - - 7 - - name - punctuation.definition.tag.xml - - - name - meta.tag.no-content.xml - patterns - - - include - #xml-embedded-content - - - - - begin - (</?)(?:([_a-zA-Z0-9][-_a-zA-Z0-9]*)((:)))?([_a-zA-Z0-9][-_a-zA-Z0-9:]*)(?=[^>]*?>) - captures - - 1 - - name - punctuation.definition.tag.xml - - 2 - - name - entity.name.tag.namespace.xml - - 3 - - name - entity.name.tag.xml - - 4 - - name - punctuation.separator.namespace.xml - - 5 - - name - entity.name.tag.localname.xml - - - end - (/?>) - name - meta.tag.xml - patterns - - - include - #xml-embedded-content - - - - - include - #xml-entity - - - - xml-singlequotedString - - begin - ' - beginCaptures - - 0 - - name - punctuation.definition.string.begin.xml - - - end - ' - endCaptures - - 0 - - name - punctuation.definition.string.end.xml - - - name - string.quoted.single.xml - patterns - - - include - #xml-entity - - - - - scopeName - source.scala - uuid - 158C0929-299A-40C8-8D89-316BE0C446E8 - - diff --git a/vscode-sbt-scala/client/tsconfig.json b/vscode-sbt-scala/client/tsconfig.json deleted file mode 100644 index c10ad282c..000000000 --- a/vscode-sbt-scala/client/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "target": "es6", - "module": "commonjs", - "moduleResolution": "node", - "rootDir": ".", - "outDir": "out", - "lib": [ "es2016" ], - "sourceMap": true - }, - "exclude": [ - "node_modules", - "server" - ] -} \ No newline at end of file diff --git a/vscode-sbt-scala/package-lock.json b/vscode-sbt-scala/package-lock.json deleted file mode 100644 index f0c985121..000000000 --- a/vscode-sbt-scala/package-lock.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "vscode-sbt-scala", - "version": "0.0.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/mocha": { - "version": "2.2.48", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", - "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", - "dev": true - }, - "@types/node": { - "version": "7.0.69", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.69.tgz", - "integrity": "sha512-S5NC8HV6HnRipg8nC0j30TPl7ktXjRTKqgyINLNe8K/64UJUI8Lq0sRopXC0hProsV2F5ibj8IqPkl1xpGggrw==", - "dev": true - }, - "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", - "dev": true - } - } -} diff --git a/vscode-sbt-scala/package.json b/vscode-sbt-scala/package.json deleted file mode 100644 index ded6ee6d6..000000000 --- a/vscode-sbt-scala/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "vscode-sbt-scala", - "displayName": "Scala (sbt)", - "version": "0.0.1", - "author": "Lightbend, Inc.", - "license": "BSD-3-Clause", - "publisher": "lightbend", - "description": "Scala language support for Visual Studio Code using sbt", - "repository": { - "type": "git", - "url": "https://github.com/sbt/sbt" - }, - "scripts": { - "postinstall": "cd server && npm install && cd ../client && npm install && cd ..", - "compile": "tsc -p client/tsconfig.json && cd server && npm run installServer && cd .. && tsc -p server/tsconfig.json", - "compile:client": "tsc -p client/tsconfig.json", - "watch:client": "tsc -w -p client/tsconfig.json", - "compile:server": "cd server && npm run installServer && cd .. && tsc -p server/tsconfig.json", - "watch:server": "cd server && npm run installServer && cd .. && tsc -w -p server/tsconfig.json" - }, - "devDependencies": { - "@types/mocha": "^2.2.48", - "@types/node": "^7.0.69", - "typescript": "^2.9.2" - } -} diff --git a/vscode-sbt-scala/server/package-lock.json b/vscode-sbt-scala/server/package-lock.json deleted file mode 100644 index bfe7026f9..000000000 --- a/vscode-sbt-scala/server/package-lock.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "vscode-sbt-scala", - "version": "0.0.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "vscode-jsonrpc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", - "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" - }, - "vscode-languageserver": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz", - "integrity": "sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A==", - "requires": { - "vscode-languageserver-protocol": "3.14.1", - "vscode-uri": "^1.0.6" - } - }, - "vscode-languageserver-protocol": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz", - "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==", - "requires": { - "vscode-jsonrpc": "^4.0.0", - "vscode-languageserver-types": "3.14.0" - } - }, - "vscode-languageserver-types": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", - "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" - }, - "vscode-uri": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.6.tgz", - "integrity": "sha512-sLI2L0uGov3wKVb9EB+vIQBl9tVP90nqRvxSoJ35vI3NjxE8jfsE5DSOhWgSunHSZmKS4OCi2jrtfxK7uyp2ww==" - } - } -} diff --git a/vscode-sbt-scala/server/package.json b/vscode-sbt-scala/server/package.json deleted file mode 100644 index d37750e03..000000000 --- a/vscode-sbt-scala/server/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "vscode-sbt-scala", - "displayName": "Scala (sbt)", - "version": "0.0.1", - "author": "Lightbend, Inc.", - "license": "BSD-3-Clause", - "publisher": "lightbend", - "description": "Relay server to sbt server.", - "repository": { - "type": "git", - "url": "https://github.com/sbt/sbt" - }, - "engines": { - "node": "*" - }, - "dependencies": { - "vscode-languageserver": "^5.2.1" - }, - "scripts": { - "installServer": "installServerIntoExtension ../client ./package.json ./tsconfig.json", - "compile": "installServerIntoExtension ../client ./package.json ./tsconfig.json && tsc -p .", - "watch": "installServerIntoExtension ../client ./package.json ./tsconfig.json && tsc -w -p ." - } -} diff --git a/vscode-sbt-scala/server/src/server.ts b/vscode-sbt-scala/server/src/server.ts deleted file mode 100644 index 8404c7b74..000000000 --- a/vscode-sbt-scala/server/src/server.ts +++ /dev/null @@ -1,48 +0,0 @@ -'use strict'; - -import * as path from 'path'; -import * as url from 'url'; -import * as net from 'net'; -let fs = require('fs'), - os = require('os'), - stdin = process.stdin, - stdout = process.stdout; - -let socket = new net.Socket(); -socket.on('data', (chunk: any) => { - // send it back to stdout - stdout.write(chunk); -}).on('end', () => { - stdin.pause(); -}); -connectSocket(socket); - -stdin.resume(); -stdin.on('data', (chunk: any) => { - socket.write(chunk); -}).on('end', () => { - socket.end(); -}); - -function connectSocket(socket: net.Socket): net.Socket { - let u = discoverUrl(); - // let socket = net.Socket(); - if (u.protocol == 'tcp:') { - socket.connect(+u.port, '127.0.0.1'); - } else if (u.protocol == 'local:' && os.platform() == 'win32') { - let pipePath = '\\\\.\\pipe\\' + u.hostname; - socket.connect(pipePath); - } else if (u.protocol == 'local:') { - socket.connect(u.path); - } else { - throw 'Unknown protocol ' + u.protocol; - } - return socket; -} - -// the port file is hardcoded to a particular location relative to the build. -function discoverUrl(): url.Url { - let pf = path.join(process.cwd(), 'project', 'target', 'active.json'); - let portfile = JSON.parse(fs.readFileSync(pf)); - return url.parse(portfile.uri); -} diff --git a/vscode-sbt-scala/server/tsconfig.json b/vscode-sbt-scala/server/tsconfig.json deleted file mode 100644 index 1ae7a021a..000000000 --- a/vscode-sbt-scala/server/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "target": "es6", - "module": "commonjs", - "moduleResolution": "node", - "sourceMap": true, - "lib" : [ "es2016" ], - "outDir": "../client/server" - }, - "exclude": [ - "node_modules" - ] -} \ No newline at end of file diff --git a/zinc-lm-integration/src/main/java/xsbti/compile/ZincBridgeProvider.java b/zinc-lm-integration/src/main/java/xsbti/compile/ZincBridgeProvider.java index c0c1ca4e3..e7b9850ae 100644 --- a/zinc-lm-integration/src/main/java/xsbti/compile/ZincBridgeProvider.java +++ b/zinc-lm-integration/src/main/java/xsbti/compile/ZincBridgeProvider.java @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/zinc-lm-integration/src/main/scala/sbt/internal/inc/Errors.scala b/zinc-lm-integration/src/main/scala/sbt/internal/inc/Errors.scala index 35b344e6a..0d19dc24d 100644 --- a/zinc-lm-integration/src/main/scala/sbt/internal/inc/Errors.scala +++ b/zinc-lm-integration/src/main/scala/sbt/internal/inc/Errors.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/zinc-lm-integration/src/main/scala/sbt/internal/inc/IfMissing.scala b/zinc-lm-integration/src/main/scala/sbt/internal/inc/IfMissing.scala index ab5462655..abdee08c0 100644 --- a/zinc-lm-integration/src/main/scala/sbt/internal/inc/IfMissing.scala +++ b/zinc-lm-integration/src/main/scala/sbt/internal/inc/IfMissing.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/zinc-lm-integration/src/main/scala/sbt/internal/inc/ResourceLoader.scala b/zinc-lm-integration/src/main/scala/sbt/internal/inc/ResourceLoader.scala index d3c0f00b8..d097538ac 100644 --- a/zinc-lm-integration/src/main/scala/sbt/internal/inc/ResourceLoader.scala +++ b/zinc-lm-integration/src/main/scala/sbt/internal/inc/ResourceLoader.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/zinc-lm-integration/src/main/scala/sbt/internal/inc/ZincComponentCompiler.scala b/zinc-lm-integration/src/main/scala/sbt/internal/inc/ZincComponentCompiler.scala index de023d3c1..05a9ea6f1 100644 --- a/zinc-lm-integration/src/main/scala/sbt/internal/inc/ZincComponentCompiler.scala +++ b/zinc-lm-integration/src/main/scala/sbt/internal/inc/ZincComponentCompiler.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -56,7 +57,11 @@ private[sbt] object ZincComponentCompiler { scalaInstance: XScalaInstance, logger: Logger, ): File = lock.synchronized { - val raw = new RawCompiler(scalaInstance, ClasspathOptionsUtil.auto, logger) + val raw = new RawCompiler( + scalaInstance, + ClasspathOptionsUtil.autoNoboot(scalaInstance.version), + logger + ) val zinc = new ZincComponentCompiler(raw, manager, dependencyResolution, bridgeSources, logger) logger.debug(f0(s"Getting $bridgeSources for Scala ${scalaInstance.version}")) diff --git a/zinc-lm-integration/src/main/scala/sbt/internal/inc/ZincComponentManager.scala b/zinc-lm-integration/src/main/scala/sbt/internal/inc/ZincComponentManager.scala index e9df5f319..e075bc5ac 100644 --- a/zinc-lm-integration/src/main/scala/sbt/internal/inc/ZincComponentManager.scala +++ b/zinc-lm-integration/src/main/scala/sbt/internal/inc/ZincComponentManager.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/zinc-lm-integration/src/main/scala/sbt/internal/inc/ZincLmUtil.scala b/zinc-lm-integration/src/main/scala/sbt/internal/inc/ZincLmUtil.scala index 3205052ef..1c8979f84 100644 --- a/zinc-lm-integration/src/main/scala/sbt/internal/inc/ZincLmUtil.scala +++ b/zinc-lm-integration/src/main/scala/sbt/internal/inc/ZincLmUtil.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ @@ -14,8 +15,10 @@ import sbt.librarymanagement.{ DependencyResolution, ModuleID, ScalaArtifacts, + SemanticSelector, UnresolvedWarningConfiguration, - UpdateConfiguration + UpdateConfiguration, + VersionNumber, } import sbt.librarymanagement.syntax._ import xsbti.ArtifactInfo.SbtOrganization @@ -24,6 +27,12 @@ import xsbti.compile.{ ClasspathOptions, ScalaInstance => XScalaInstance } object ZincLmUtil { + final val scala2SbtBridgeStart = "2.13.12" + def hasScala2SbtBridge(sv: String): Boolean = + VersionNumber(sv).matchesSemVer( + SemanticSelector(s"=2.13 >=$scala2SbtBridgeStart") + ) + /** * Instantiate a Scala compiler that is instrumented to analyze dependencies. * This Scala compiler is useful to create your own instance of incremental @@ -85,6 +94,9 @@ object ZincLmUtil { if (ScalaArtifacts.isScala3(scalaVersion)) { ModuleID(ScalaArtifacts.Organization, "scala3-sbt-bridge", scalaVersion) .withConfigurations(Some(Compile.name)) + } else if (hasScala2SbtBridge(scalaVersion)) { + ModuleID(ScalaArtifacts.Organization, "scala2-sbt-bridge", scalaVersion) + .withConfigurations(Some(Compile.name)) } else { val compilerBridgeId = scalaVersion match { case sc if sc startsWith "2.10." => "compiler-bridge_2.10" diff --git a/zinc-lm-integration/src/test/scala/sbt/internal/inc/IvyBridgeProviderSpecification.scala b/zinc-lm-integration/src/test/scala/sbt/internal/inc/IvyBridgeProviderSpecification.scala index a45af3462..e2255cee2 100644 --- a/zinc-lm-integration/src/test/scala/sbt/internal/inc/IvyBridgeProviderSpecification.scala +++ b/zinc-lm-integration/src/test/scala/sbt/internal/inc/IvyBridgeProviderSpecification.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */ diff --git a/zinc-lm-integration/src/test/scala/sbt/internal/inc/ZincComponentCompilerSpec.scala b/zinc-lm-integration/src/test/scala/sbt/internal/inc/ZincComponentCompilerSpec.scala index 1e0875a7b..bad241e51 100644 --- a/zinc-lm-integration/src/test/scala/sbt/internal/inc/ZincComponentCompilerSpec.scala +++ b/zinc-lm-integration/src/test/scala/sbt/internal/inc/ZincComponentCompilerSpec.scala @@ -1,6 +1,7 @@ /* * sbt - * Copyright 2011 - 2018, Lightbend, Inc. + * Copyright 2023, Scala center + * Copyright 2011 - 2022, Lightbend, Inc. * Copyright 2008 - 2010, Mark Harrah * Licensed under Apache License 2.0 (see LICENSE) */