Как я могу проверить синтаксис скрипта Scala, не выполняя скрипт и не генерируя файлы классов? - PullRequest
11 голосов
/ 05 марта 2011

Можно писать скрипты в Scala. Таким образом, вы можете поместить это в Hello.scala

#!/bin/sh
exec scala $0 $@
!#

println("You supplied " + args.length + " arguments!")

и сделайте его исполняемым в Unix

chmod u+x Hello.scala

Тогда вы можете запустить скрипт просто

./Hello.scala

Это компилирует скрипт и запускает его, если нет синтаксических ошибок. Однако это не учитывает ситуацию, когда я хочу только проверить синтаксис без выполнения скрипта. Я не хочу изменять скрипт (т.е. удаляя директиву #!) И не хочу, чтобы генерировались файлы * .class.

Как проверить синтаксис скрипта Scala?

Ответы [ 2 ]

24 голосов
/ 05 марта 2011

Я ожидаю, что вы на самом деле хотите немного больше, чем просто проверка правильности синтаксиса ... вероятно, вы хотите знать, что ваш файл будет правильно скомпилирован, если вы действительно его скомпилировали. Это включает проверку типов, а также проверку синтаксиса.

Для исходных файлов Scala (т. Е. Не скриптов) вы можете указать аргумент командной строки -Ystop: refchecks, чтобы компилятор остановился перед началом генерации кода (если вас действительно интересует только синтаксическая корректность, вы можете указать -Ystop : синтаксический анализатор). Если есть ошибки, они будут отображаться на консоли точно так же, как если бы вы полностью скомпилировали исходники.

Для скриптов Scala вы также можете указать аргумент -Ystop: refchecks. Если вы сделаете это, то вы увидите сообщения об ошибках компиляции на консоли или, если в скрипте нет ошибок, вы увидите следующее:

$ scala -Ystop:refchecks Hello.scala 
java.lang.ClassNotFoundException: Main

Исключение ClassNotFoundException, указывающее, что файлы классов не были созданы и что ваш скрипт не был выполнен.

0 голосов
/ 05 марта 2011

Если вы хотите вырезать строки из вашего файла для передачи интерпретатору, вы можете создать скрипт с именем CutScala.scala (или как вам удобнее):

#!/bin/sh
exec scala $0 $@
!#

import scala.collection.JavaConversions._
import java.io._

val p = new ProcessBuilder(
  List(
    "scala",
    "-e",
    io.Source.fromFile(args(1)).getLines().drop(args(0).toInt).mkString("\n")
  ) :::
  args.drop(2).toList
).start()

p.waitFor

val output = List(p.getInputStream,p.getErrorStream).map(
  x => new BufferedReader(new InputStreamReader(x))
)

println("Exit code = " + p.exitValue)
for ((reader,title) <- (output zip List("Output:","Errors:"))) {
  println(title);
  Iterator.continually(reader.readLine).takeWhile(_!=null).foreach(println)
  println
}

и затем назовите это как

./CutScala.scala 4 Hello.scala a b c

чтобы отбросить первые 4 строки и просто разобрать остальные. В ответе Майлза рассказывается, как сделать другую (более сложную) половину: не производить никакого вывода и ничего не запускать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...