diff options
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")); |