rust-code-analysis 0.0.18

Tool to compute and export code metrics
Documentation
=====================================
Return constant
=====================================

class A {
  int Sample() {
    return 1;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (predefined_type)
      (identifier)
      (parameter_list)
      (block
        (return_statement (integer_literal)))))))

=====================================
Return nothing
=====================================

class A {
  void Sample() {
    return;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list
      (method_declaration
        (void_keyword)
        (identifier)
        (parameter_list)
        (block
          (return_statement))))))

=====================================
Break statement
=====================================

class A {
  void Sample() {
    while (true) break;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list
      (method_declaration
        (void_keyword)
        (identifier)
        (parameter_list)
        (block
          (while_statement (boolean_literal)
            (break_statement)))))))

=====================================
Continue statement
=====================================

class A {
  void Sample() {
    while (false) continue;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (while_statement (boolean_literal)
          (continue_statement)))))))

=====================================
Throw nothing
=====================================

class A {
  void Sample() {
    throw;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (throw_statement))))))

=====================================
Throw exception
=====================================

class A {
  void Sample() {
    throw ex;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (throw_statement (identifier)))))))

=====================================
Do while
=====================================

class A {
  void Sample(bool a) {
    do { } while (a);
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list
        (parameter (predefined_type) (identifier)))
      (block
        (do_statement
          (block)
          (identifier)))))))

=====================================
Goto statement and label
=====================================

class A {
  void Sample() {
    goto end;
    end:
      return;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (goto_statement (label_name))
        (labeled_statement
          (label_name) (return_statement)))))))

=====================================
If statement
=====================================

class A {
  int Sample() {
    if (true) return 1;
  }
}

---

(compilation_unit
  (class_declaration
    name: (identifier)
    body: (declaration_list (method_declaration
      type: (predefined_type)
      name: (identifier)
      parameters: (parameter_list)
      body: (block
        (if_statement
          condition: (boolean_literal)
          consequence: (return_statement (integer_literal))))))))

=====================================
If Else statement
=====================================

class A {
  int Sample() {
    if (true) return 1;
    else return 0;
  }
}

---

(compilation_unit
  (class_declaration
    name: (identifier)
    body: (declaration_list (method_declaration
      type: (predefined_type)
      name: (identifier)
      parameters: (parameter_list)
      body: (block
        (if_statement
          condition: (boolean_literal)
          consequence: (return_statement (integer_literal))
          alternative: (return_statement (integer_literal))))))))

=====================================
Switch statement
=====================================

class A {
  int Sample(int a) {
    switch (a) {
      case 1:
      case 2:
        return 0;
      default: {
        return 1;
      }
    }
  }
}

---

(compilation_unit
  (class_declaration
    name: (identifier)
    body: (declaration_list (method_declaration
      type: (predefined_type)
      name: (identifier)
      parameters: (parameter_list
        (parameter
          type: (predefined_type)
          name: (identifier)))
      body: (block
        (switch_statement
          value: (identifier)
          body: (switch_body
            (switch_section
              (case_switch_label (integer_literal))
              (case_switch_label (integer_literal))
              (return_statement (integer_literal)))
            (switch_section
              (default_switch_label)
              (block
                (return_statement (integer_literal)))))))))))

=====================================
Try finally statement
=====================================

class A {
  void Sample() {
    try {
    } finally {
    }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (try_statement
          (block)
          (finally_clause
            (block))))))))

=====================================
Try catch statement
=====================================

class A {
  void Sample() {
    try {
    } catch (Exception ex) {
    }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (try_statement
          (block)
          (catch_clause
            (catch_declaration (identifier) (identifier))
            (block))))))))

=====================================
Try catch finally statement
=====================================

class A {
  void Sample() {
    try {
    } catch (Exception ex) {
    } finally {
    }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (try_statement
          (block)
          (catch_clause
            (catch_declaration (identifier) (identifier))
            (block))
          (finally_clause
            (block))))))))

=====================================
Try catch multiple statement
=====================================

class A {
  void Sample() {
    try {
    } catch (Exception ex) {
    } catch (OtherException ex) {
    }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (try_statement
          (block)
          (catch_clause
            (catch_declaration (identifier) (identifier))
            (block))
          (catch_clause
            (catch_declaration (identifier) (identifier))
            (block))))))))

=====================================
Try catch filtered statement
=====================================

class A {
  void Sample() {
    try {
    } catch (Exception ex) when (a == 1) {
    }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (try_statement
          (block)
          (catch_clause
            (catch_declaration (identifier) (identifier))
            (catch_filter_clause (binary_expression (identifier) (integer_literal)))
            (block))))))))

=====================================
Checked statement
=====================================

class A {
  void Sample() {
    checked {
      return;
    }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (checked_statement
          (block
            (return_statement))))))))

=====================================
Unchecked statement
=====================================

class A {
  void Sample() {
    unchecked {
      return;
    }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (checked_statement
          (block
            (return_statement))))))))

=====================================
Lock statement
=====================================

class A {
  void Sample() {
    lock (this) {
      return;
    }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (lock_statement
          (this_expression)
          (block
            (return_statement))))))))

=====================================
Yield statement
=====================================

class A {
  IEnumerable<int> Sample() {
    yield return 1;
    yield break;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (generic_name
        (identifier)
        (type_argument_list (predefined_type)))
      (identifier)
      (parameter_list)
      (block
        (yield_statement (integer_literal))
        (yield_statement))))))

=====================================
Implicit local variable with literal initializer
=====================================

class A {
  void Sample() {
    var a = 1;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (local_declaration_statement
          (variable_declaration
            (implicit_type)
            (variable_declarator
              (identifier)
              (equals_value_clause
                (integer_literal))))))))))

=====================================
Method with static local function block
=====================================

class A {
  void Sample() {
    private void A<T1, T2>(T1 a, T2 b) where T1:I1 {
      return a + b;
    }

    private static int X() {
      return 1;
    }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list
      (method_declaration (void_keyword) (identifier) (parameter_list)
      (block
        (local_function_statement (modifier) (void_keyword) (identifier)
          (type_parameter_list
            (type_parameter (identifier))
            (type_parameter (identifier)))
          (parameter_list
            (parameter (identifier) (identifier))
            (parameter (identifier) (identifier)))
          (type_parameter_constraints_clause (identifier)
            (type_parameter_constraint (type_constraint (identifier))))
          (block
            (return_statement (binary_expression (identifier) (identifier)))))
        (local_function_statement (modifier) (modifier) (predefined_type) (identifier) (parameter_list)
          (block
            (return_statement (integer_literal)))))))))

=====================================
Method with local expression bodied function
=====================================

class A {
  void Sample() {
    void A<T1, T2>(T1 a, T2 b) => Test(a, b);
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (local_function_statement (void_keyword) (identifier)
          (type_parameter_list
            (type_parameter (identifier))
            (type_parameter (identifier)))
          (parameter_list
            (parameter (identifier) (identifier))
            (parameter (identifier) (identifier)))
          (arrow_expression_clause
            (invocation_expression (identifier)
              (argument_list
                (argument (identifier))
                (argument (identifier)))))))))))

=====================================
Explicit local variable with no initializer
=====================================

class A {
  void Sample() {
    int a;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (local_declaration_statement
          (variable_declaration
            (predefined_type)
            (variable_declarator
              (identifier)))))))))

=====================================
Explicit local variables with multiple literal initializers
=====================================

class A {
  void Sample() {
    int a = 1, b = 2;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (local_declaration_statement
          (variable_declaration
            (predefined_type)
            (variable_declarator
              (identifier)
              (equals_value_clause
                (integer_literal)))
            (variable_declarator
              (identifier)
              (equals_value_clause
                (integer_literal))))))))))

=====================================
Explicit local constant with literal initializer
=====================================

class A {
  void Sample() {
    const int a = 1;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (local_declaration_statement
          (modifier)
          (variable_declaration
            (predefined_type)
              (variable_declarator (identifier)
                (equals_value_clause
                  (integer_literal))))))))))

=====================================
Explicit local constant with multiple literal initializers
=====================================

class A {
  void Sample() {
    const int a = 1, b = 2;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (local_declaration_statement
          (modifier)
          (variable_declaration
            (predefined_type)
              (variable_declarator (identifier)
                (equals_value_clause
                  (integer_literal)))
              (variable_declarator (identifier)
                (equals_value_clause
                  (integer_literal))))))))))

=====================================
Using statement with implicit local variable
=====================================

class A {
  void Sample() {
    using (var a = b) {
      return;
    }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (using_statement
          (variable_declaration
            (implicit_type)
            (variable_declarator
              (identifier)
              (equals_value_clause
                (identifier))))
          (block
            (return_statement))))))))

=====================================
Using statement with explicit local variable
=====================================

class A {
  void Sample() {
    using (Object a = b) {
      return;
    }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (using_statement
          (variable_declaration
            (identifier)
            (variable_declarator
              (identifier)
              (equals_value_clause
                (identifier))))
          (block
            (return_statement))))))))

=====================================
Using statement with expression
=====================================

class A {
  void Sample() {
    using (this) {
      return;
    }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (using_statement
          (this_expression)
          (block
            (return_statement))))))))

=====================================
Foreach inline declaration
=====================================

class A {
  void Sample() {
    foreach(int x in y)
      z += x;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (for_each_statement
          (predefined_type)
          (identifier)
          (identifier)
          (expression_statement
            (assignment_expression
              (identifier)
              (assignment_operator)
              (identifier)))))))))

=====================================
Foreach existing expression
=====================================

class A {
  void Sample() {
    foreach(x in y)
      z += x;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (for_each_statement
          (identifier)
          (identifier)
          (expression_statement
            (assignment_expression
              (identifier)
              (assignment_operator)
              (identifier)))))))))

=====================================
Unsafe statement
=====================================

class A {
  void Sample() {
    unsafe { x = y; }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (unsafe_statement
          (block
            (expression_statement
              (assignment_expression
                (identifier)
                (assignment_operator)
                (identifier))))))))))

=====================================
Fixed statement
=====================================

class A {
  void Sample() {
    fixed (double p = arr) { }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (fixed_statement
          (variable_declaration
            (predefined_type)
            (variable_declarator
              (identifier)
              (equals_value_clause
                (identifier))))
                (block)))))))

=====================================
For inline declaration fully populated
=====================================

class A {
  void Sample() {
    for(int x = 0; x < 100; x++) {
      z += x;
    }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (for_statement
          (variable_declaration
            (predefined_type)
            (variable_declarator
              (identifier)
              (equals_value_clause
                (integer_literal))))
          (binary_expression
            (identifier)
            (integer_literal))
          (postfix_unary_expression
            (identifier))
          (block
            (expression_statement
              (assignment_expression
                (identifier)
                (assignment_operator)
                (identifier))))))))))

=====================================
For no population
=====================================

class A {
  void Sample() {
    for(;;) {
    }
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list (method_declaration
      (void_keyword)
      (identifier)
      (parameter_list)
      (block
        (for_statement
          (block)))))))

=====================================
Deconstruction
=====================================

class A {
  void Sample() {
    (var a, var b) = c;
    var (a, b) = c;
    (a, b) = c;
    var (a, _) = c;
  }
}

---

(compilation_unit
  (class_declaration
    (identifier)
    (declaration_list
      (method_declaration
        (void_keyword)
        (identifier)
        (parameter_list)
        (block
          (expression_statement
            (assignment_expression
              (tuple_expression
                (argument (declaration_expression (implicit_type) (identifier)))
                (argument (declaration_expression (implicit_type) (identifier))))
              (assignment_operator)
              (identifier)))
          (local_declaration_statement (variable_declaration
            (implicit_type)
            (variable_declarator
              (tuple_pattern (identifier) (identifier))
              (equals_value_clause (identifier)))))
          (expression_statement
            (assignment_expression
              (tuple_expression (argument (identifier)) (argument (identifier)))
              (assignment_operator)
              (identifier)))
          (local_declaration_statement (variable_declaration
            (implicit_type)
            (variable_declarator
              (tuple_pattern (identifier) (discard))
              (equals_value_clause (identifier))))))))))