public void addFunctionDeclaration(
      Expression identifier, FunctionStatement function, IMethod method) {
    nodes.add(new MethodDeclarationNode(identifier != null ? identifier : function, method));

    Map<String, Argument> arguments = new HashMap<String, Argument>();
    for (Argument argument : function.getArguments()) {
      arguments.put(argument.getIdentifier().getName(), argument);
    }
    for (IParameter parameter : method.getParameters()) {
      final Argument argument = arguments.get(parameter.getName());
      if (argument != null) {
        nodes.add(
            new ArgumentDeclarationNode(
                argument, method.getLocation().getSourceModule(), parameter.getType()));
      }
    }
    final Comment comment = JSDocSupport.getComment(function);
    if (comment != null) {
      final JSDocTags tags = JSDocSupport.parse(comment);
      for (JSDocTag tag : tags.list(JSDocTag.PARAM)) {
        final ParameterNode node = JSDocSupport.parseParameter(tag);
        if (node != null) {
          final IParameter parameter = method.getParameter(node.name);
          if (parameter != null) {
            final Identifier ref = new Identifier(null);
            ref.setName(node.name);
            final int start = tag.fromValueOffset(node.offset);
            ref.setStart(start);
            ref.setEnd(start + node.name.length());
            nodes.add(new LocalVariableReferenceNode(ref, parameter.getLocation(), true));
          }
        }
      }
    }
  }