docs: @Override
      public Object visitExpressionStatement(final ExpressionStatementTree node, final ScannerParams scannerParams) {
  
          final JCTree.JCExpressionStatement statement = (JCTree.JCExpressionStatement) getCurrentPath().getLeaf();
  
          final StatementInfo statementInfo = new StatementInfo(
                  scannerParams.getCompilationUnitTree().getLineMap().getLineNumber(statement.pos),
                  scannerParams.getTypeElement().getQualifiedName().toString(),
                  statement
          );
  
          //inner scanner to go through statement methods
          final TreePathScanner scanner = new TreePathScanner<Object, ScannerParams>() {
              Stack<MethodAndParameter> stack = new Stack<>();
  
              @Override
              public Object visitMethodInvocation(final MethodInvocationTree node, final ScannerParams o) {
                  if (node.getMethodSelect() instanceof JCTree.JCFieldAccess) { // if is call on field
                      try {
                          final JCTree.JCFieldAccess methodSelect = (JCTree.JCFieldAccess) node.getMethodSelect();
                          ExpressionTree parameter = null;
                          if (!node.getArguments().isEmpty()) {
                              parameter = node.getArguments().get(0);
                          }
                          // each method invocation on field is added to stack
                          stack.add(new MethodAndParameter(methodSelect.name, parameter));
                          handle(methodSelect, stack, node, statementInfo, scannerParams);
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                  }
  
                  return super.visitMethodInvocation(node, o);
              }
  
          };
  
          scanner.scan(getCurrentPath(), scannerParams);
  
          return super.visitExpressionStatement(node, scannerParams);
      }