public void testLinenoFunctionCall() {
    AstNode root = parse("\nfoo.\n" + "bar.\n" + "baz(1);");

    ExpressionStatement stmt = (ExpressionStatement) root.getFirstChild();
    FunctionCall fc = (FunctionCall) stmt.getExpression();
    // Line number should get closest to the actual paren.
    assertEquals(3, fc.getLineno());
  }
 @Override
 public AstNode functionCall(AstNode target, Iterable<AstNode> arguments) {
   FunctionCall fc = new FunctionCall();
   fc.setTarget(target);
   if (!Iterables.isEmpty(arguments)) {
     fc.setArguments(list(arguments));
   }
   return fc;
 }
 public void testJSDocAttachment4() {
   AstRoot root = parse("(function() {/** should not be attached */})()");
   assertNotNull(root.getComments());
   assertEquals(1, root.getComments().size());
   ExpressionStatement st = (ExpressionStatement) root.getFirstChild();
   FunctionCall fc = (FunctionCall) st.getExpression();
   ParenthesizedExpression pe = (ParenthesizedExpression) fc.getTarget();
   assertNull(pe.getJsDoc());
 }
  public void testRegexpLocation() {
    AstNode root = parse("\nvar path =\n" + "      replace(\n" + "/a/g," + "'/');\n");

    VariableDeclaration firstVarDecl = (VariableDeclaration) root.getFirstChild();
    List<VariableInitializer> vars1 = firstVarDecl.getVariables();
    VariableInitializer firstInitializer = vars1.get(0);
    Name firstVarName = (Name) firstInitializer.getTarget();
    FunctionCall callNode = (FunctionCall) firstInitializer.getInitializer();
    AstNode fnName = callNode.getTarget();
    List<AstNode> args = callNode.getArguments();
    RegExpLiteral regexObject = (RegExpLiteral) args.get(0);
    AstNode aString = args.get(1);

    assertEquals(1, firstVarDecl.getLineno());
    assertEquals(1, firstVarName.getLineno());
    assertEquals(2, callNode.getLineno());
    assertEquals(2, fnName.getLineno());
    assertEquals(3, regexObject.getLineno());
    assertEquals(3, aString.getLineno());
  }