我在Scala中看到了关于静态分析的StackOverflow问题,但是在2009年得到了回答.如您所知,Scala工具正在快速变化.
因此,我想知道熟悉Scala中当前静态分析工具状态的人是否可以告诉我,例如,Scala的Findbugs等价物是否存在.我发现Findbugs为Scala发出了许多不必要的警告,可能与"对象"单例编译成字节码的方式有关,由于特征等等.我听说Scalastyle不仅是Java的CheckStyle的Scala版本,它也是包括Findbugs和PMD.但是,如果它没有实现所有Findbugs和/或PMD,那么还有其他工具可以补充吗?或者,Scalastyle不仅适用于样式检查,还有助于提高代码质量吗?
另外,Scala与Sonar的整合怎么样?Scala Sonar插件(适用于Scalastyle)是否可靠?
我得到以下代码:
string match {
case Regex(_, "1", "0", _, _) =>
case Regex(_, "1", "1", null, _) =>
}
Run Code Online (Sandbox Code Playgroud)
Scalastyle抱怨使用null,这是无法避免的.我能用这条线压制警告吗?
IntelliJ的Scala插件中有一些scalastyle支持.这个问题是关于设置它捡起scalastyle配置文件,该文件是在定制的目录名下根的最佳方法scalastyle-config.xml(例如,用于星火项目).
目前,要获取IntelliJ中的scalastyle插件来拾取我们的scalastyle配置,您需要将它的副本放入您的.idea文件夹(据说.project也可以使用,但我还没有测试过).此外,需要命名文件scalastyle_config.xml(使用下划线而不是连字符).简而言之,您需要在项目的根目录中调用以下内容:
cp scalastyle-config.xml .idea/scalastyle_config.xml
虽然我认为这是一个丑陋的黑客,但它至少允许我在构建整个项目之前看到scalastyle违规.如果您有更好的解决方案,请告诉我.
我正处于学习Scala的早期阶段,我注意到了声明方法的不同方法.
我已经确定不使用等号使方法成为一个void方法(返回一个Unit而不是一个值),并使用等号返回实际值,所以
def product(x: Int, y: Int) {
x*y
}
Run Code Online (Sandbox Code Playgroud)
将返回()(单位),但是
def product(x: Int, y: Int) = {
x*y
}
Run Code Online (Sandbox Code Playgroud)
将返回两个参数的乘积(x*y)
我注意到了第三种声明方法 - 用冒号.这是一个例子
def isEqual(x: Any): Boolean
Run Code Online (Sandbox Code Playgroud)
这与=符号有何不同?在什么情况下最好用这种方式?
我们已经开始在我的工作中尝试使用Scala和Play框架.设置我们的自动linting和测试框架作为第一件事,并已部署Scalastyle来处理前者.
这是非常有用的,除了我们得到这个特定的lint错误,我们发现很难以一个好的方式解决.一个简单的例子是这样的:
def helloWorld = Action {
req =>
Ok("Hello World!")
}
Run Code Online (Sandbox Code Playgroud)
虽然它常常会复杂得多(当然,很难弄清楚实际上是什么类型).
在任何一种情况下,这都为Scalastyle提供了"公共方法必须具有显式类型"错误.
不幸的是,在这里设置预期的显式类型似乎通常会导致语法错误.
对此有什么好的解决方案的建议?或者我们是否只需要对Play项目进行此检查?
Scalastyle(intellij 2016.1默认值)表示这个布尔表达式可以简化
val t = Option(true)
val f = Option(false)
if(t.contains(true) && f.contains(false)) {
println("booop")
}
Run Code Online (Sandbox Code Playgroud)
我可以通过改变if来解决这个问题:
if(t.contains(true).&&(f.contains(false)))
Run Code Online (Sandbox Code Playgroud)
或者将&&更改为&
但是没有真正看到这是如何简化它,任何人都可以解释发生了什么?
更新 它似乎与vals在编译时是否已知,或者它们是否在本地定义无关.以下代码也会得到表达式可以简化的警告:
object TestFoo {
def bar(t: Option[Boolean]) = {
val f = Option(scala.util.Random.nextBoolean)
if (t.contains(true) && f.contains(false)) println("booop")
}
def main(args: Array[String]) = bar(t = Option(scala.util.Random.nextBoolean))
}
Run Code Online (Sandbox Code Playgroud)
我只是不知道我应该如何做到更简单,是否有一些奇怪的选项[布尔]比较我错过了?
基本上我希望 IDE 在自动完成时强制执行命名参数语法
https://docs.scala-lang.org/style/method-invocation.html
因此,例如给定的类
class MyClass {
def myMethod( param1 : String, param2 : String)
}
Run Code Online (Sandbox Code Playgroud)
我希望 IDE 像这样放置“param1”和“param2”的占位符:
val myObj = new MyClass()
myObj.myMethod( param1 = "value of param 1", param2 = "value of param2")
Run Code Online (Sandbox Code Playgroud)
AND NOT(这很糟糕)
myObj.myMethod("calling the method without explicitly naming param1" , "calling the method without explicitly naming param2")
Run Code Online (Sandbox Code Playgroud) 我有这样的代码:
optionBoolean.getOrElse(false) && otherOptionBoolean.getOrElse(false)
Run Code Online (Sandbox Code Playgroud)
Scalastyle 告诉我它可以简化。如何?
我想no.finalize仅针对一个特定类抑制 ScalaStyle 规则。
我认为抑制 IntelliJ IDEA 检查的一种方法是在类的开头添加以下注释:
//noinspection ScalaStyle
但是,这将抑制该特定类的所有 ScalaStyle 规则。我只想选择性地抑制一项规则。
请注意,我已经尝试过 scalastyle 的抑制方法,即使用
// scalastyle:off no.finalize. 然而,IntelliJ IDEA 不尊重它。
我使用的是IDEA版本2018.2.5(社区版)。
我正在对我的代码空间执行scalastyle检查,参考http://www.scalastyle.org/sbt.html.
在build.sbt中:
// scalastyle check
lazy val compileScalastyle = taskKey[Unit]("compileScalastyle")
compileScalastyle := org.scalastyle.sbt.ScalastylePlugin.scalastyle.in(Compile).toTask("").value
(compile in Compile) <<= (compile in Compile) dependsOn compileScalastyle
Run Code Online (Sandbox Code Playgroud)
在project/plugins.sbt中:
addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "0.8.0")
Run Code Online (Sandbox Code Playgroud)
当我运行时sbt compile,scalastyle正在生成[warning] ***./utils/ConfigManager.scala: File must end with newline character,但编译仍然成功.
有没有办法让sbt compile scalastyle警告失败?
我只是改变这一切<check level="warning" ...>是<check level="error" ...>在scalastyleGenerateConfig,我不知道这是做正确的方式.
非常感谢
scalastyle ×10
scala ×9
function ×1
intellij-14 ×1
methods ×1
optional ×1
sbt ×1
scala-option ×1
sonarqube ×1