Skip to content

Instantly share code, notes, and snippets.

@paulp
Created January 16, 2023 06:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save paulp/472f6359d44922c2f8ed4ed466f6c28a to your computer and use it in GitHub Desktop.
Save paulp/472f6359d44922c2f8ed4ed466f6c28a to your computer and use it in GitHub Desktop.
mscala
#!/usr/bin/env bash
#
# scala runner which can handle lots of variation automatically
# Paul Phillips <psp@brb.fyi>
set -euo pipefail
declare SCALA2_VERSION="2.13.10"
declare SCALA3_VERSION="3.2.0"
declare AMM_VERSION="2.5.5"
# defaults
declare ARTIFACT="scala-compiler"
declare VERSION="$SCALA2_VERSION"
declare JBIN="java"
declare JCP=""
declare MOPTS="-usejavacp"
declare WHAT="repl"
usage () {
cat <<EOM
Usage: mscala [-acdhjmrv23] [arg arg ...]
-a ammonite repl
-c compiler
-d debug
-h help
-j java version
-m dependency
-r scala repl
-v scala version
-2 scala v2
-3 scala v3
Examples:
mscala -2 -r -m net.bytebuddy:byte-buddy:1.12.18 # start scala 2 repl with dep
mscala -3 -c a.scala # compile a.scala with scala 3
EOM
}
crossDependency () {
local g="$1"
local a="$2"
local v="$3"
local crossv="$VERSION"
echo "$g:${a}_${crossv}:$v"
}
addDependency () {
local runner="$(which cs || which coursier)"
local cp="$("$runner" fetch "$1" | paste -sd: -)"
if [[ -z $JCP ]]; then
JCP="$cp"
else
JCP="$JCP:$cp"
fi
}
while getopts :acdhj:m:rv:23 opt; do
case $opt in
a) WHAT="amm" ;; # MAIN="$AMM_REPL" ;;
c) WHAT="compiler" ;; # MAIN="$SCALA_MAIN" ;;
d) set -x ;;
h) usage && exit 0 ;;
j) JBIN="$(java_home -v "$OPTARG")/bin/java" ;;
m) addDependency "$OPTARG" ;;
r) WHAT="repl" ;; # MAIN="$SCALA_REPL" ;;
v) VERSION="$OPTARG" ;;
2) VERSION="$SCALA2_VERSION" ;;
3) VERSION="$SCALA3_VERSION" ;;
esac
done
shift $(( OPTIND-1 ))
if [[ "$WHAT" == amm ]]; then
addDependency "$(crossDependency com.lihaoyi ammonite $AMM_VERSION)"
MAIN="ammonite.AmmoniteMain"
MOPTS=""
else
# [[ -z "$VERSION" ]] && VERSION="$SCALA3_VERSION"
[[ $VERSION == "" ]] && VERSION="3"
[[ $VERSION == "2" ]] && VERSION="2.13"
[[ $VERSION == "3" ]] && VERSION="3.2"
[[ $VERSION == "2.10" ]] && VERSION="2.10.7"
[[ $VERSION == "2.11" ]] && VERSION="2.11.12"
[[ $VERSION == "2.12" ]] && VERSION="2.12.17"
[[ $VERSION == "2.13" ]] && VERSION="2.13.10"
[[ $VERSION == "3.2" ]] && VERSION="3.2.0"
[[ $VERSION == 3.* ]] && ARTIFACT="scala3-compiler_3"
# https://stackoverflow.com/questions/56457685/how-to-fix-the-sbt-crash-java-lang-numberformatexception-for-input-string-0x
[[ $VERSION == 2.11.* ]] && TERM="xterm-color"
addDependency "org.scala-lang:$ARTIFACT:$VERSION"
case "$WHAT/${VERSION:0:1}" in
repl/2) MAIN="scala.tools.nsc.MainGenericRunner" ;;
repl/3) MAIN="dotty.tools.MainGenericRunner" ;;
compiler/2) MAIN="scala.tools.nsc.Main" ;;
compiler/3) MAIN="dotty.tools.MainGenericCompiler" ;;
esac
fi
"$JBIN" -cp "$JCP" "$MAIN" $MOPTS "$@"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment