Improve SyntaxTreeVisitor API.

RELNOTES: None.
PiperOrigin-RevId: 164481927
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java b/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java
index 2d2b50e..2ba51d7 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BuildFileAST.java
@@ -301,6 +301,11 @@
         HashCode.fromBytes(file.getDigest()).toString(), eventHandler);
   }
 
+  public static BuildFileAST parseSkylarkFile(ParserInputSource input, EventHandler eventHandler) {
+    Parser.ParseResult result = Parser.parseFile(input, eventHandler, SKYLARK);
+    return create(ImmutableList.<Statement>of(), result, /*contentHashCode=*/ null, eventHandler);
+  }
+
   /**
    * Parse the specified non-build Skylark file but avoid the validation of the imports, returning
    * its AST. All errors during scanning or parsing will be reported to the reporter.
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Parameter.java b/src/main/java/com/google/devtools/build/lib/syntax/Parameter.java
index 29e122c..e16fe58 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Parameter.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Parameter.java
@@ -199,6 +199,6 @@
 
   @Override
   public void accept(SyntaxTreeVisitor visitor) {
-    visitor.visit(this);
+    visitor.visit((Parameter<Expression, Expression>) this);
   }
 }
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 8229e39..c086fe3 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
@@ -39,8 +39,10 @@
     visit(node.getValue());
   }
 
-  public void visit(@SuppressWarnings("unused") Parameter<?, ?> node) {
-    // leaf node (we need the function for overrides)
+  public void visit(Parameter<Expression, Expression> node) {
+    if (node.getDefaultValue() != null) {
+      visit(node.getDefaultValue());
+    }
   }
 
   public void visit(BuildFileAST node) {
@@ -122,7 +124,11 @@
 
   public void visit(FunctionDefStatement node) {
     visit(node.getIdentifier());
-    visitAll(node.getParameters());
+    // Do not use visitAll for the parameters, because we would lose the type information.
+    // Inside the AST, we know that Parameters are using Expressions.
+    for (Parameter<Expression, Expression> param : node.getParameters()) {
+      visit(param);
+    }
     visitAll(node.getStatements());
   }