Skip to content

CyclomaticComplexity で for + discarded parameter を意図通りに計算したい #19

Open
@xirc

Description

@xirc

次の2つの場合で、CyclomaticComplexity の計算結果が変わりました。

  • for (_ <- ???)
  • for (i <- ???)

for (_ <- ???) の方が複雑度が高くなっていますが、
この2つは同じ複雑度としてカウントする方が好ましいと思われます。
for (i <- ???) の方が意図通りの複雑度となっているようです。

次のコードを実行すると異なる SyntaxTree となることが確認できます。
これは改善の手がかりとなりそうです。

import scala.reflect.runtime.universe._

val expr = reify {
  for (_ <- 1 to 2) {
    println(s"test")
  }
  for (i <- 1 to 2) {
    println(s"test $i")
  }
}

println(show(expr))
println(showRaw(expr))
Expr[Unit]({
  Predef.intWrapper(1).to(2).foreach(((x$1) => x$1: @unchecked match {
    case _ => Predef.println(StringContext.apply("test").s())
  }));
  Predef.intWrapper(1).to(2).foreach(((i) => Predef.println(StringContext.apply("test ", "").s(i))))
})
Expr(Block(List(Apply(Select(Apply(Select(Apply(Select(Ident(scala.Predef), TermName("intWrapper")), List(Literal(Constant(1)))), TermName("to")), List(Literal(Constant(2)))), TermName("foreach")), List(Function(List(ValDef(Modifiers(PARAM | SYNTHETIC), TermName("x$1"), TypeTree(), EmptyTree)), Match(Annotated(Apply(Select(New(Ident(scala.unchecked)), termNames.CONSTRUCTOR), List()), Ident(TermName("x$1"))), List(CaseDef(Ident(termNames.WILDCARD), EmptyTree, Apply(Select(Ident(scala.Predef), TermName("println")), List(Apply(Select(Apply(Select(Ident(scala.StringContext), TermName("apply")), List(Literal(Constant("test")))), TermName("s")), List())))))))))), Apply(Select(Apply(Select(Apply(Select(Ident(scala.Predef), TermName("intWrapper")), List(Literal(Constant(1)))), TermName("to")), List(Literal(Constant(2)))), TermName("foreach")), List(Function(List(ValDef(Modifiers(PARAM), TermName("i"), TypeTree(), EmptyTree)), Apply(Select(Ident(scala.Predef), TermName("println")), List(Apply(Select(Apply(Select(Ident(scala.StringContext), TermName("apply")), List(Literal(Constant("test ")), Literal(Constant("")))), TermName("s")), List(Ident(TermName("i")))))))))))

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions