Skip to content

Instantly share code, notes, and snippets.

@paulp
Created January 16, 2023 06:45
Show Gist options
  • Select an option

  • Save paulp/472f6359d44922c2f8ed4ed466f6c28a to your computer and use it in GitHub Desktop.

Select an option

Save paulp/472f6359d44922c2f8ed4ed466f6c28a to your computer and use it in GitHub Desktop.

Revisions

  1. paulp created this gist Jan 16, 2023.
    109 changes: 109 additions & 0 deletions mscala
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,109 @@
    #!/usr/bin/env bash
    #
    # scala runner which can handle lots of variation automatically
    # Paul Phillips <[email protected]>

    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 "$@"