Keep function parameters in the AST.

--
MOS_MIGRATED_REVID=102330569
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java b/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
index f9e26ed..ae7c027 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java
@@ -16,7 +16,6 @@
 import com.google.common.collect.ImmutableList;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 
 /**
@@ -25,20 +24,23 @@
 public class FunctionDefStatement extends Statement {
 
   private final Identifier ident;
-  private final FunctionSignature.WithValues<Expression, Expression> args;
+  private final FunctionSignature.WithValues<Expression, Expression> signature;
   private final ImmutableList<Statement> statements;
+  private final ImmutableList<Parameter<Expression, Expression>> parameters;
 
   public FunctionDefStatement(Identifier ident,
-      FunctionSignature.WithValues<Expression, Expression> args,
-      Collection<Statement> statements) {
+      Iterable<Parameter<Expression, Expression>> parameters,
+      FunctionSignature.WithValues<Expression, Expression> signature,
+      Iterable<Statement> statements) {
     this.ident = ident;
-    this.args = args;
+    this.signature = signature;
     this.statements = ImmutableList.copyOf(statements);
+    this.parameters = ImmutableList.copyOf(parameters);
   }
 
   @Override
   void exec(Environment env) throws EvalException, InterruptedException {
-    List<Expression> defaultExpressions = args.getDefaultValues();
+    List<Expression> defaultExpressions = signature.getDefaultValues();
     ArrayList<Object> defaultValues = null;
     ArrayList<SkylarkType> types = null;
 
@@ -50,13 +52,13 @@
     }
     env.update(ident.getName(), new UserDefinedFunction(
         ident, FunctionSignature.WithValues.<Object, SkylarkType>create(
-            args.getSignature(), defaultValues, types),
+            signature.getSignature(), defaultValues, types),
         statements, (SkylarkEnvironment) env));
   }
 
   @Override
   public String toString() {
-    return "def " + ident + "(" + args + "):\n";
+    return "def " + ident + "(" + signature + "):\n";
   }
 
   public Identifier getIdent() {
@@ -67,8 +69,12 @@
     return statements;
   }
 
-  public FunctionSignature.WithValues<Expression, Expression> getArgs() {
-    return args;
+  public ImmutableList<Parameter<Expression, Expression>> getParameters() {
+    return parameters;
+  }
+
+  public FunctionSignature.WithValues<Expression, Expression> getSignature() {
+    return signature;
   }
 
   @Override
@@ -79,10 +85,10 @@
   @Override
   void validate(final ValidationEnvironment env) throws EvalException {
     ValidationEnvironment localEnv = new ValidationEnvironment(env);
-    FunctionSignature sig = args.getSignature();
+    FunctionSignature sig = signature.getSignature();
     FunctionSignature.Shape shape = sig.getShape();
     ImmutableList<String> names = sig.getNames();
-    List<Expression> defaultExpressions = args.getDefaultValues();
+    List<Expression> defaultExpressions = signature.getDefaultValues();
 
     int positionals = shape.getPositionals();
     int mandatoryPositionals = shape.getMandatoryPositionals();
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
index 67c9ceb..1075e15 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Parser.java
@@ -1329,21 +1329,17 @@
     expect(TokenKind.DEF);
     Identifier ident = parseIdent();
     expect(TokenKind.LPAREN);
-    FunctionSignature.WithValues<Expression, Expression> args = parseFunctionSignature();
+    List<Parameter<Expression, Expression>> params = parseParameters();
+    FunctionSignature.WithValues<Expression, Expression> signature = functionSignature(params);
     expect(TokenKind.RPAREN);
     expect(TokenKind.COLON);
     List<Statement> block = parseSuite();
-    FunctionDefStatement stmt = new FunctionDefStatement(ident, args, block);
+    FunctionDefStatement stmt = new FunctionDefStatement(ident, params, signature, block);
     list.add(setLocation(stmt, start, token.right));
   }
 
-  private FunctionSignature.WithValues<Expression, Expression> parseFunctionSignature() {
-    List<Parameter<Expression, Expression>> parameters =
-        parseFunctionArguments(new Supplier<Parameter<Expression, Expression>>() {
-              @Override public Parameter<Expression, Expression> get() {
-                return parseFunctionParameter();
-              }
-            });
+  private FunctionSignature.WithValues<Expression, Expression> functionSignature(
+      List<Parameter<Expression, Expression>> parameters) {
     try {
       return FunctionSignature.WithValues.<Expression, Expression>of(parameters);
     } catch (FunctionSignature.SignatureException e) {
@@ -1353,6 +1349,15 @@
     }
   }
 
+  private List<Parameter<Expression, Expression>> parseParameters() {
+    return parseFunctionArguments(
+        new Supplier<Parameter<Expression, Expression>>() {
+          @Override public Parameter<Expression, Expression> get() {
+            return parseFunctionParameter();
+          }
+        });
+  }
+
   /**
    * Parse a list of Argument-s. The arguments can be of class Argument.Passed or Parameter,
    * as returned by the Supplier parseArgument (that, taking no argument, must be closed over
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitor.java b/src/main/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitor.java
index 2e0f19d..d625c24 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitor.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitor.java
@@ -40,6 +40,10 @@
     visit(node.getValue());
   }
 
+  public void visit(Parameter node) {
+    // leaf node (we need the function for overrides)
+  }
+
   public void visit(BuildFileAST node) {
     visitAll(node.getStatements());
     visitAll(node.getComments());
@@ -110,7 +114,7 @@
 
   public void visit(FunctionDefStatement node) {
     visit(node.getIdent());
-    List<Expression> defaults = node.getArgs().getDefaultValues();
+    List<Expression> defaults = node.getSignature().getDefaultValues();
     if (defaults != null) {
       visitAll(defaults);
     }