private void createVariable(VariableDeclaration declaration) {
   final JSVariable variable = new JSVariable(declaration.getVariableName());
   variable.setLocation(
       declaration.getInitializer() != null
           ? ReferenceLocation.create(
               referenceSource,
               declaration.start(),
               declaration.end(),
               declaration.getIdentifier())
           : ReferenceLocation.create(referenceSource, declaration.start(), declaration.end()));
   jsdocSupport.processVariable(declaration, variable, fReporter, fTypeChecker);
   final VariableNode variableNode = new VariableNode(peek(), declaration, variable);
   peek().addChild(variableNode);
   if (scopes.size() == 1) {
     // TODO (alex) option to treat it as field or local
     addFieldDeclaration(declaration.getIdentifier(), variable.getType());
   } else {
     nodes.add(
         new LocalVariableDeclarationNode(
             declaration.getIdentifier(), referenceSource.getSourceModule(), variable.getType()));
   }
 }
 /**
  * @param node
  * @return
  */
 private IMatchLocatorValue createFunctionDeclaration(FunctionStatement node, Identifier name) {
   final JSMethod method = new JSMethod(node, referenceSource);
   jsdocSupport.processMethod(node, method, fReporter, fTypeChecker);
   final FunctionNode functionNode;
   if (node.isDeclaration()) {
     functionNode = new FunctionDeclaration(peek(), node, method);
   } else {
     functionNode = new FunctionExpression(peek(), node, method);
   }
   method.setLocation(
       ReferenceLocation.create(
           referenceSource, node.start(), node.end(), functionNode.getNameNode()));
   functionNode.buildArgumentNodes();
   push(functionNode);
   addFunctionDeclaration(name, node, method);
   visitFunctionBody(node);
   pop();
   return null;
 }