process(ast) {
    var nodeWithoutSemicolon;

    ast.traverseByType('block', (block) => {
      block.eachFor((currentNode) => {
        // Skip nodes that already have `;` at the end:
        if (currentNode.is('declarationDelimiter')) return null;

        // Add semicolon only after declarations and includes.
        // If current node is include, insert semicolon right into it.
        // If it's declaration, look for value node:
        if (currentNode.is('include') ||
            currentNode.is('extend')) {
          nodeWithoutSemicolon = currentNode;
        } else if (currentNode.is('declaration')) {
          nodeWithoutSemicolon = currentNode.last('value');
        } else {
          return;
        }

        // Check if there are spaces and comments at the end of the node
        for (var j = nodeWithoutSemicolon.length; j--;) {
          var lastNode = nodeWithoutSemicolon.get(j);

          // If the node's last child is block, do not add semicolon:
          // TODO: Add syntax check and run the code only for scss
          if (lastNode.is('block')) {
            return null;
          } else if (!lastNode.is('space') &&
                     !lastNode.is('multilineComment') &&
                     !lastNode.is('singlelineComment')) {
            j++;
            break;
          }
        }

        var declDelim = gonzales.createNode({
          type: 'declarationDelimiter',
          content: ';'
        });
        nodeWithoutSemicolon.insert(j, declDelim);
        return null;
      });
    });
  }
Processes ast and fixes found code style errors.
@param {Node} ast