tomokinakamaru/silverchain

View on GitHub

Showing 85 of 85 total issues

Avoid too many return statements within this method.
Open

      return visitRepeatOperatorNX(ctx.repeatOperatorNX());
Severity: Major
Found in src/main/java/silverchain/parser/adapter/ASTBuilder.java - About 30 mins to fix

    Avoid too many return statements within this method.
    Open

          return visitRepeatOperatorNM(ctx.repeatOperatorNM());
    Severity: Major
    Found in src/main/java/silverchain/parser/adapter/ASTBuilder.java - About 30 mins to fix

      Similar blocks of code found in 2 locations. Consider refactoring.
      Open

          test("Foo { Baz foo(); Bar foo(); }")
              .name("Foo")
              .typeParameterCount(0)
              .stateCount(2)
              .stateTypeParameterCount(0, 0)
      Severity: Minor
      Found in src/test/java/diagram/Tests.java and 1 other location - About 30 mins to fix
      src/test/java/diagram/Tests.java on lines 120..127

      Duplicated Code

      Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

      Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

      When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

      Tuning

      This issue has a mass of 40.

      We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

      The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

      If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

      See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

      Refactorings

      Further Reading

      Similar blocks of code found in 2 locations. Consider refactoring.
      Open

          test("Foo { Baz bar(Bar bar) baz(Baz baz)?; }")
              .name("Foo")
              .typeParameterCount(0)
              .stateCount(3)
              .end(1, 2)
      Severity: Minor
      Found in src/test/java/diagram/Tests.java and 1 other location - About 30 mins to fix
      src/test/java/diagram/Tests.java on lines 168..175

      Duplicated Code

      Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

      Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

      When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

      Tuning

      This issue has a mass of 40.

      We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

      The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

      If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

      See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

      Refactorings

      Further Reading

      Method delete has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.
      Open

        @SuppressWarnings("ResultOfMethodCallIgnored")
        private static void delete(File file) {
          if (!file.exists()) {
            return;
          }
      Severity: Minor
      Found in src/test/java/command/Tests.java - About 25 mins to fix

      Cognitive Complexity

      Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

      A method's cognitive complexity is based on a few simple rules:

      • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
      • Code is considered more complex for each "break in the linear flow of the code"
      • Code is considered more complex when "flow breaking structures are nested"

      Further reading

      Method findFqn has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.
      Open

        private String findFqn(String name, Node node) {
          CompilationUnit unit = getCompilationUnit(node);
      
          String head = name.split("\\.")[0];
          String tail = name.substring(head.length());
      Severity: Minor
      Found in src/main/java/silverchain/javadoc/Javadocs.java - About 25 mins to fix

      Cognitive Complexity

      Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

      A method's cognitive complexity is based on a few simple rules:

      • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
      • Code is considered more complex for each "break in the linear flow of the code"
      • Code is considered more complex when "flow breaking structures are nested"

      Further reading

      Method visitRepeatOperator has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.
      Open

        @Override
        public RepeatOperator visitRepeatOperator(AgParser.RepeatOperatorContext ctx) {
          if (ctx.repeatOperator0X() != null) {
            return visitRepeatOperator0X(ctx.repeatOperator0X());
          }
      Severity: Minor
      Found in src/main/java/silverchain/parser/adapter/ASTBuilder.java - About 25 mins to fix

      Cognitive Complexity

      Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

      A method's cognitive complexity is based on a few simple rules:

      • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
      • Code is considered more complex for each "break in the linear flow of the code"
      • Code is considered more complex when "flow breaking structures are nested"

      Further reading

      Method getComment has a Cognitive Complexity of 6 (exceeds 5 allowed). Consider refactoring.
      Open

        private String getComment(MethodDeclaration declaration) {
          if (!declaration.hasJavaDocComment()) {
            return null;
          }
      
      
      Severity: Minor
      Found in src/main/java/silverchain/javadoc/Javadocs.java - About 25 mins to fix

      Cognitive Complexity

      Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

      A method's cognitive complexity is based on a few simple rules:

      • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
      • Code is considered more complex for each "break in the linear flow of the code"
      • Code is considered more complex when "flow breaking structures are nested"

      Further reading

      These nested if statements could be combined
      Open

            if (parsedTypeNames.get(pkg).contains(head)) {
              return getQualifiedName(pkg, head) + tail;
            }

      CollapsibleIfStatements

      Since: PMD 3.1

      Priority: Medium

      Categories: Style

      Remediation Points: 50000

      Sometimes two consecutive 'if' statements can be consolidated by separating their conditions with a boolean short-circuit operator.

      Example:

      void bar() {
       if (x) { // original implementation
       if (y) {
       // do stuff
       }
       }
      }
      
      void bar() {
       if (x && y) { // optimized implementation
       // do stuff
       }
      }

      These nested if statements could be combined
      Open

            if (importMap.containsKey(name().name())) {
              left = importMap.get(name().name());
            }

      CollapsibleIfStatements

      Since: PMD 3.1

      Priority: Medium

      Categories: Style

      Remediation Points: 50000

      Sometimes two consecutive 'if' statements can be consolidated by separating their conditions with a boolean short-circuit operator.

      Example:

      void bar() {
       if (x) { // original implementation
       if (y) {
       // do stuff
       }
       }
      }
      
      void bar() {
       if (x && y) { // optimized implementation
       // do stuff
       }
      }

      These nested if statements could be combined
      Open

            if (importedNames.get(unit).containsKey(head)) {
              return importedNames.get(unit).get(head) + tail;
            }

      CollapsibleIfStatements

      Since: PMD 3.1

      Priority: Medium

      Categories: Style

      Remediation Points: 50000

      Sometimes two consecutive 'if' statements can be consolidated by separating their conditions with a boolean short-circuit operator.

      Example:

      void bar() {
       if (x) { // original implementation
       if (y) {
       // do stuff
       }
       }
      }
      
      void bar() {
       if (x && y) { // optimized implementation
       // do stuff
       }
      }

      Rename this constant name to match the regular expression '^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$'.
      Open

        private static final String help =
      Severity: Critical
      Found in src/test/java/command/Tests.java by sonar-java

      Shared coding conventions allow teams to collaborate efficiently. This rule checks that all constant names match a provided regular expression.

      Noncompliant Code Example

      With the default regular expression ^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$:

      public class MyClass {
        public static final int first = 1;
      }
      
      public enum MyEnum {
        first;
      }
      

      Compliant Solution

      public class MyClass {
        public static final int FIRST = 1;
      }
      
      public enum MyEnum {
        FIRST;
      }
      

      Replace this use of System.out or System.err by a logger.
      Open

                  compile(stream), new Javadocs(javadocPath, s -> System.err.println("WARNING: " + s)))

      When logging a message there are several important requirements which must be fulfilled:

      • The user must be able to easily retrieve the logs
      • The format of all logged message must be uniform to allow the user to easily read the log
      • Logged data must actually be recorded
      • Sensitive data must only be logged securely

      If a program directly writes to the standard outputs, there is absolutely no way to comply with those requirements. That's why defining and using a dedicated logger is highly recommended.

      Noncompliant Code Example

      System.out.println("My Message");  // Noncompliant
      

      Compliant Solution

      logger.log("My Message");
      

      See

      Define and throw a dedicated exception instead of using a generic one.
      Open

            throw new RuntimeException(e);
      Severity: Major
      Found in src/test/java/diagram/Tests.java by sonar-java

      Using such generic exceptions as Error, RuntimeException, Throwable, and Exception prevents calling methods from handling true, system-generated exceptions differently than application-generated errors.

      Noncompliant Code Example

      public void foo(String bar) throws Throwable {  // Noncompliant
        throw new RuntimeException("My Message");     // Noncompliant
      }
      

      Compliant Solution

      public void foo(String bar) {
        throw new MyOwnRuntimeException("My Message");
      }
      

      Exceptions

      Generic exceptions in the signatures of overriding methods are ignored, because overriding method has to follow signature of the throw declaration in the superclass. The issue will be raised on superclass declaration of the method (or won't be raised at all if superclass is not part of the analysis).

      @Override
      public void myMethod() throws Exception {...}
      

      Generic exceptions are also ignored in the signatures of methods that make calls to methods that throw generic exceptions.

      public void myOtherMethod throws Exception {
        doTheThing();  // this method throws Exception
      }
      

      See

      Merge this if statement with the enclosing one.
      Open

            if (importMap.containsKey(name().name())) {

      Merging collapsible if statements increases the code's readability.

      Noncompliant Code Example

      if (file != null) {
        if (file.isFile() || file.isDirectory()) {
          /* ... */
        }
      }
      

      Compliant Solution

      if (file != null && isFileOrDirectory(file)) {
        /* ... */
      }
      
      private static boolean isFileOrDirectory(File file) {
        return file.isFile() || file.isDirectory();
      }
      

      Use "java.nio.file.Files#delete" here for better messages on error conditions.
      Open

          file.delete();
      Severity: Major
      Found in src/test/java/command/Tests.java by sonar-java

      When java.io.File#delete fails, this boolean method simply returns false with no indication of the cause. On the other hand, when java.nio.file.Files#delete fails, this void method returns one of a series of exception types to better indicate the cause of the failure. And since more information is generally better in a debugging situation, java.nio.file.Files#delete is the preferred option.

      Noncompliant Code Example

      public void cleanUp(Path path) {
        File file = new File(path);
        if (!file.delete()) {  // Noncompliant
          //...
        }
      }
      

      Compliant Solution

      public void cleanUp(Path path) throws NoSuchFileException, DirectoryNotEmptyException, IOException {
        Files.delete(path);
      }
      

      Define and throw a dedicated exception instead of using a generic one.
      Open

            throw new RuntimeException(e);

      Using such generic exceptions as Error, RuntimeException, Throwable, and Exception prevents calling methods from handling true, system-generated exceptions differently than application-generated errors.

      Noncompliant Code Example

      public void foo(String bar) throws Throwable {  // Noncompliant
        throw new RuntimeException("My Message");     // Noncompliant
      }
      

      Compliant Solution

      public void foo(String bar) {
        throw new MyOwnRuntimeException("My Message");
      }
      

      Exceptions

      Generic exceptions in the signatures of overriding methods are ignored, because overriding method has to follow signature of the throw declaration in the superclass. The issue will be raised on superclass declaration of the method (or won't be raised at all if superclass is not part of the analysis).

      @Override
      public void myMethod() throws Exception {...}
      

      Generic exceptions are also ignored in the signatures of methods that make calls to methods that throw generic exceptions.

      public void myOtherMethod throws Exception {
        doTheThing();  // this method throws Exception
      }
      

      See

      Define and throw a dedicated exception instead of using a generic one.
      Open

          throw new RuntimeException();

      Using such generic exceptions as Error, RuntimeException, Throwable, and Exception prevents calling methods from handling true, system-generated exceptions differently than application-generated errors.

      Noncompliant Code Example

      public void foo(String bar) throws Throwable {  // Noncompliant
        throw new RuntimeException("My Message");     // Noncompliant
      }
      

      Compliant Solution

      public void foo(String bar) {
        throw new MyOwnRuntimeException("My Message");
      }
      

      Exceptions

      Generic exceptions in the signatures of overriding methods are ignored, because overriding method has to follow signature of the throw declaration in the superclass. The issue will be raised on superclass declaration of the method (or won't be raised at all if superclass is not part of the analysis).

      @Override
      public void myMethod() throws Exception {...}
      

      Generic exceptions are also ignored in the signatures of methods that make calls to methods that throw generic exceptions.

      public void myOtherMethod throws Exception {
        doTheThing();  // this method throws Exception
      }
      

      See

      Define a constant instead of duplicating this literal "foo()" 5 times.
      Open

            args(AgParser::method, "foo()"),
      Severity: Critical
      Found in src/test/java/parser/Tests.java by sonar-java

      Duplicated string literals make the process of refactoring error-prone, since you must be sure to update all occurrences.

      On the other hand, constants can be referenced from many places, but only need to be updated in a single place.

      Noncompliant Code Example

      With the default threshold of 3:

      public void run() {
        prepare("action1");                              // Noncompliant - "action1" is duplicated 3 times
        execute("action1");
        release("action1");
      }
      
      @SuppressWarning("all")                            // Compliant - annotations are excluded
      private void method1() { /* ... */ }
      @SuppressWarning("all")
      private void method2() { /* ... */ }
      
      public String method3(String a) {
        System.out.println("'" + a + "'");               // Compliant - literal "'" has less than 5 characters and is excluded
        return "";                                       // Compliant - literal "" has less than 5 characters and is excluded
      }
      

      Compliant Solution

      private static final String ACTION_1 = "action1";  // Compliant
      
      public void run() {
        prepare(ACTION_1);                               // Compliant
        execute(ACTION_1);
        release(ACTION_1);
      }
      

      Exceptions

      To prevent generating some false-positives, literals having less than 5 characters are excluded.

      Remove this unused method parameter "state".
      Open

        private String getIStateModifier(State state) {

      Unused parameters are misleading. Whatever the values passed to such parameters, the behavior will be the same.

      Noncompliant Code Example

      void doSomething(int a, int b) {     // "b" is unused
        compute(a);
      }
      

      Compliant Solution

      void doSomething(int a) {
        compute(a);
      }
      

      Exceptions

      The rule will not raise issues for unused parameters:

      • that are annotated with @javax.enterprise.event.Observes
      • in overrides and implementation methods
      • in interface default methods
      • in non-private methods that only throw or that have empty bodies
      • in annotated methods, unless the annotation is @SuppressWarning("unchecked") or @SuppressWarning("rawtypes"), in which case the annotation will be ignored
      • in overridable methods (non-final, or not member of a final class, non-static, non-private), if the parameter is documented with a proper javadoc.
      @Override
      void doSomething(int a, int b) {     // no issue reported on b
        compute(a);
      }
      
      public void foo(String s) {
        // designed to be extended but noop in standard case
      }
      
      protected void bar(String s) {
        //open-closed principle
      }
      
      public void qix(String s) {
        throw new UnsupportedOperationException("This method should be implemented in subclasses");
      }
      
      /**
       * @param s This string may be use for further computation in overriding classes
       */
      protected void foobar(int a, String s) { // no issue, method is overridable and unused parameter has proper javadoc
        compute(a);
      }
      

      See

      • CERT, MSC12-C. - Detect and remove code that has no effect or is never executed
      Severity
      Category
      Status
      Source
      Language