aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/FunctionDefStatement.java30
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/Parser.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/SyntaxTreeVisitor.java6
-rw-r--r--src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java2
4 files changed, 38 insertions, 23 deletions
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 f9e26edbf5..ae7c0272ef 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 @@ package com.google.devtools.build.lib.syntax;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.List;
/**
@@ -25,20 +24,23 @@ import java.util.List;
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 @@ public class FunctionDefStatement extends Statement {
}
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 @@ public class FunctionDefStatement extends Statement {
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 @@ public class FunctionDefStatement extends Statement {
@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 67c9ceb3fb..1075e152bb 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 @@ class Parser {
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 @@ class Parser {
}
}
+ 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 2e0f19d4ff..d625c24973 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 @@ public class SyntaxTreeVisitor {
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 class SyntaxTreeVisitor {
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);
}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
index 02bb0f1f8d..e0c074a126 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
@@ -1210,7 +1210,7 @@ public class ParserTest extends EvaluationTestCase {
assertThat(statements).hasSize(1);
assertThat(statements.get(0)).isInstanceOf(FunctionDefStatement.class);
FunctionDefStatement stmt = (FunctionDefStatement) statements.get(0);
- FunctionSignature sig = stmt.getArgs().getSignature();
+ FunctionSignature sig = stmt.getSignature().getSignature();
// Note the reordering of optional named-only at the end.
assertThat(sig.getNames()).isEqualTo(ImmutableList.<String>of(
"a", "b1", "b2", "c1", "c2", "d"));