标签: scalac

-Ywarn-unused-import触发播放路由文件

我希望能够使用-Xfatal-warnings-Ywarn-unused-import,问题是,编译器是在其中包含了我的应用程序播放路由文件触发的错误:

[error] /path/to/app/conf/routes: Unused import
[error] /path/to/app/conf/routes: Unused import
[error] /path/to/app/conf/routes:1: Unused import
[error] GET        /document/:id        my.app.controllers.MyController.getById(id: Int)
Run Code Online (Sandbox Code Playgroud)

其他路线也一样.

有可能告诉scalac忽略文件吗?

Scala版本是2.11.8.

scala sbt scalac playframework

50
推荐指数
3
解决办法
1662
查看次数

如何找到scala编译器标志/选项的描述?

如何找到最新scalac版本的所有标志?谷歌搜索了几个小时后,我发现只有过时的 文档.(例如,他们甚至没有提到"-feature"标志).

有没有办法从scalac或其他任何东西获取带有描述的编译器标志列表?

scala scalac scala-compiler

33
推荐指数
2
解决办法
6698
查看次数

日志仅涉及"分散隐式扩展"

其他答案建议使用"-Xlog-implicits"选项来调试"分散隐式扩展"错误.但是,它也会在与这些错误无关的地方记录大量含义.有没有办法限制它只能解释产生编译错误的地方?

scala compiler-errors implicit scalac

31
推荐指数
1
解决办法
1873
查看次数

如何在使用vararg和不使用vararg的方法之间消除Scala中的歧义

我正在尝试使用Scala的java jcommander库.java JCommander类有多个构造函数:

 public JCommander(Object object)  
 public JCommander(Object object, ResourceBundle bundle, String... args)   
 public JCommander(Object object, String... args)   
Run Code Online (Sandbox Code Playgroud)

我想调用第一个不带 varargs的构造函数.我试过了:

jCommander = new JCommander(cmdLineArgs)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

error: ambiguous reference to overloaded definition,
both constructor JCommander in class JCommander of type (x$1: Any,x$2: <repeated...>[java.lang.String])com.beust.jcommander.JCommander
and  constructor JCommander in class JCommander of type (x$1: Any)com.beust.jcommander.JCommander
match argument types (com.lasic.CommandLineArgs) and expected result type com.beust.jcommander.JCommander
jCommander = new JCommander(cmdLineArgs)
Run Code Online (Sandbox Code Playgroud)

我也尝试使用命名参数,但结果相同:

jCommander = new JCommander(`object` = cmdLineArgs)
Run Code Online (Sandbox Code Playgroud)

我怎么告诉Scala我想调用不带varargs的构造函数?

我正在使用Scala 2.8.0.

java scala scalac

24
推荐指数
3
解决办法
7109
查看次数

提取scala项目的完整调用图(艰难的)

我想从给定的Scala项目中提取所有方法的调用图,这些方法是项目自己的源代码的一部分.

据我所知,演示编译器没有启用它,它需要一直向下到实际的编译器(或编译器插件?).

您能否建议完整的代码,这些代码可以安全地用于大多数scala项目,但是那些使用最古怪的动态语言功能的代码?对于调用图,我的意思是包含class/trait + method顶点的有向(可能是循环的)图,其中边A-> B表示A可以调用B.

应避免或"标记"来自/来自图书馆的呼叫在项目自己的来源之外.

编辑:

看看我的宏天堂衍生原型解决方案,基于@ dk14的主角,作为下面的答案.在https://github.com/matanster/sbt-example-paradise上的github上托管.

scala scalac scala-compiler scala-macro-paradise

24
推荐指数
2
解决办法
1358
查看次数

scala编译器阶段的顺序是什么?

我想要提高我对scala编译阶段的描述.我知道某些事情必须在编译器中发生,但实际上并不知道它们发生的顺序以及顺序如何影响我的编程.

我是否正确地说以下内容是编译器的完整列表?

  • 解析程序
  • 检查类型
  • 擦除
  • 隐式转换
  • 生成字节码
  • 优化

如果是这样,那么这些阶段的顺序是什么?这个命令如何影响程序员,尤其是类型级程序员?

compiler-construction scala scalac

22
推荐指数
2
解决办法
3879
查看次数

我如何将scala setter方法'myvar_ $ eq(myval)'别名为在java中更令人满意的东西?

我最近将一些代码从java转换为scala,试图自学语言.

假设我们有这个scala类:

class Person() {
  var name:String = "joebob"
}
Run Code Online (Sandbox Code Playgroud)

现在我想从java访问它,所以我不能像我在scala那样使用点符号.

所以我可以通过发出以下内容来获取我的var的内容:

person = Person.new();
System.out.println(person.name());
Run Code Online (Sandbox Code Playgroud)

并通过以下方式设置:

person = Person.new();
person.name_$eq("sallysue");
System.out.println(person.name());
Run Code Online (Sandbox Code Playgroud)

这是正确的,因为我们的Person类在javap中看起来像这样:

Compiled from "Person.scala"
public class Person extends java.lang.Object implements scala.ScalaObject{
    public Person();
    public void name_$eq(java.lang.String);
    public java.lang.String name();
}
Run Code Online (Sandbox Code Playgroud)

是的,我可以编写自己的getter/setter但是我讨厌用这个来填充类,考虑到我已经拥有它们并没有多大意义 - 我只想更好地为_ $ eq方法添加别名.(当你处理像antlr这样的东西时,这实际上会变得更糟,因为那时你必须逃避它,它最终看起来像person.name _\$ eq("newname");

注意:我宁愿忍受这个,而不是用更多的setter方法填充我的类.

那么在这种情况下你会做什么?

java setter scala javap scalac

13
推荐指数
1
解决办法
1173
查看次数

如何关闭Scala快速编译服务器(FSC)超时?

我正在使用Scala编译服务器.这可能与我的IDE IntelliJ IDEA无关,但我只是通知您,我通过该IDE中的特殊运行配置启动Scala编译服务器.

经过一段时间没有编译任何东西,编译服务器终止,没有任何消息.通常,当我尝试编译某些内容并且编译失败时,我只会注意到这一点.然后,我需要再次启动编译服务器,当然下一次编译需要很长时间,因为它是自启动编译服务器以来的第一次编译.

如何关闭超时?我查看了scalac的联机帮助页,似乎没有选项.我可以为该运行配置添加VM选项.

scala intellij-idea scalac fsc

13
推荐指数
2
解决办法
1624
查看次数

在Scala中使用类型类模式会对性能产生什么影响

我目前正在广泛使用类型类模式作为我的代码中与性能相关的部分.我发现了至少两个潜在的低效率来源.

  1. 隐式参数将通过消息调用传递.我不知道这是否真的发生了.也许scalac可以简单地在使用它们的地方插入隐式参数,并从方法签名中删除它们.在手动插入隐式参数的情况下,这可能是不可能的,因为它们可能仅在运行时解析.传递隐式参数有哪些优化适用

  2. 如果类型类实例由a提供def(与a 相反val),则必须在每次调用"类型分类方法"时重新创建对象.JVM可能会解决此问题,这可能会优化对象创建.scalac也可以通过重用这些对象来解决这个问题.有关创建隐式参数对象的优化是什么?

当然,在应用类型类模式时可能还有其他低效率来源.请告诉我他们.

optimization scala implicit scalac

13
推荐指数
1
解决办法
759
查看次数

Scala不确定/缓存类?

我有一个非常简单的目标:编译Scala类,然后从另一个Scala脚本中加载它.问题是Scala似乎缓存(不确定在哪里)我创建的类,并且不遵守后续更改.

以下行创建一个包含两个.scala文件的目录,编译一个,然后运行另一个:

mkdir test
cd test
echo 'class MyClass(s: String)' > MyClass.scala
echo 'val p = new MyClass("ok")' > test.scala
scalac MyClass.scala
scala test.scala # this works
cd ..
rm -rf test
Run Code Online (Sandbox Code Playgroud)

如果我运行上面的行,我需要重新启动我的计算机以使下面的行工作:

mkdir test
cd test
echo 'class MyClass()' > MyClass.scala
echo 'val p = new MyClass()' > test.scala
scalac MyClass.scala
scala test.scala # this doesn't
cd ..
rm -rf test
Run Code Online (Sandbox Code Playgroud)

如果我不重新启动,我得到一个错误,我在构造函数中缺少一个String.不知道Scala-land在哪里缓存了之前基于String的构造函数.

scala scalac

12
推荐指数
1
解决办法
181
查看次数