blob: 37d27386b8cb7201a5717e96a1dfa127790181a0 [file] [log] [blame]
Damien Martin-Guillerezf88f4d82015-09-25 13:56:55 +00001// Copyright 2014 The Bazel Authors. All rights reserved.
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +01002//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14package com.google.devtools.build.lib.syntax;
15
tomlua155b532017-11-08 20:12:47 +010016import com.google.common.base.Preconditions;
Francois-Rene Rideau5dcdbf92015-02-19 18:36:17 +000017import javax.annotation.Nullable;
18
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010019/**
Googler73d942f2019-10-03 12:31:02 -070020 * Syntax node for an argument to a function.
Francois-Rene Rideau5dcdbf92015-02-19 18:36:17 +000021 *
Googler73d942f2019-10-03 12:31:02 -070022 * <p>Arguments may be of four forms, as in {@code f(expr, id=expr, *expr, **expr)}. These are
23 * represented by the subclasses Positional, Keyword, Star, and StarStar.
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010024 */
Googler4ace4652019-09-16 07:47:08 -070025public abstract class Argument extends Node {
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010026
adonovan07b15e62020-04-09 18:32:33 -070027 protected final Expression value;
Googler73d942f2019-10-03 12:31:02 -070028
29 Argument(Expression value) {
30 this.value = Preconditions.checkNotNull(value);
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010031 }
32
Googler73d942f2019-10-03 12:31:02 -070033 public final Expression getValue() {
34 return value;
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +010035 }
36
adonovan07b15e62020-04-09 18:32:33 -070037 @Override
38 public int getEndOffset() {
39 return value.getEndOffset();
40 }
41
Googler73d942f2019-10-03 12:31:02 -070042 /** Return the name of this argument's parameter, or null if it is not a Keyword argument. */
43 @Nullable
44 public String getName() {
45 return null;
Francois-Rene Rideau5dcdbf92015-02-19 18:36:17 +000046 }
47
Googler73d942f2019-10-03 12:31:02 -070048 /** Syntax node for a positional argument, {@code f(expr)}. */
49 public static final class Positional extends Argument {
Googlere0c5e622019-08-09 15:10:14 -070050 Positional(Expression value) {
Francois-Rene Rideau5dcdbf92015-02-19 18:36:17 +000051 super(value);
52 }
adonovan07b15e62020-04-09 18:32:33 -070053
54 @Override
55 public int getStartOffset() {
56 return value.getStartOffset();
57 }
Francois-Rene Rideau5dcdbf92015-02-19 18:36:17 +000058 }
59
Googler73d942f2019-10-03 12:31:02 -070060 /** Syntax node for a keyword argument, {@code f(id=expr)}. */
61 public static final class Keyword extends Argument {
62
63 // Unlike in Python, keyword arguments in Bazel BUILD files
64 // are about 10x more numerous than positional arguments.
Francois-Rene Rideau5dcdbf92015-02-19 18:36:17 +000065
adonovan07b15e62020-04-09 18:32:33 -070066 final Identifier id;
Francois-Rene Rideau5dcdbf92015-02-19 18:36:17 +000067
adonovan07b15e62020-04-09 18:32:33 -070068 Keyword(Identifier id, Expression value) {
Francois-Rene Rideau5dcdbf92015-02-19 18:36:17 +000069 super(value);
adonovan07b15e62020-04-09 18:32:33 -070070 this.id = id;
Francois-Rene Rideau5dcdbf92015-02-19 18:36:17 +000071 }
72
Googler73d942f2019-10-03 12:31:02 -070073 public Identifier getIdentifier() {
adonovan07b15e62020-04-09 18:32:33 -070074 return id;
Googler73d942f2019-10-03 12:31:02 -070075 }
76
brandjone2ffd5d2017-06-27 18:14:54 +020077 @Override
78 public String getName() {
adonovan07b15e62020-04-09 18:32:33 -070079 return id.getName();
80 }
81
82 @Override
83 public int getStartOffset() {
84 return id.getStartOffset();
Taras Tsugrii36941362018-06-08 16:31:53 -070085 }
Francois-Rene Rideau5dcdbf92015-02-19 18:36:17 +000086 }
87
Googler73d942f2019-10-03 12:31:02 -070088 /** Syntax node for an argument of the form {@code f(*expr)}. */
89 public static final class Star extends Argument {
adonovan07b15e62020-04-09 18:32:33 -070090 private final int starOffset;
91
92 Star(int starOffset, Expression value) {
Francois-Rene Rideau5dcdbf92015-02-19 18:36:17 +000093 super(value);
adonovan07b15e62020-04-09 18:32:33 -070094 this.starOffset = starOffset;
95 }
96
97 @Override
98 public int getStartOffset() {
99 return starOffset;
Francois-Rene Rideau5dcdbf92015-02-19 18:36:17 +0000100 }
Francois-Rene Rideau5dcdbf92015-02-19 18:36:17 +0000101 }
102
Googler73d942f2019-10-03 12:31:02 -0700103 /** Syntax node for an argument of the form {@code f(**expr)}. */
104 public static final class StarStar extends Argument {
adonovan07b15e62020-04-09 18:32:33 -0700105 private final int starStarOffset;
106
107 StarStar(int starStarOffset, Expression value) {
Francois-Rene Rideau5dcdbf92015-02-19 18:36:17 +0000108 super(value);
adonovan07b15e62020-04-09 18:32:33 -0700109 this.starStarOffset = starStarOffset;
110 }
111
112 @Override
113 public int getStartOffset() {
114 return starStarOffset;
Francois-Rene Rideau5dcdbf92015-02-19 18:36:17 +0000115 }
laurentlb1e5352d2018-11-06 12:25:55 -0800116 }
117
brandjone2ffd5d2017-06-27 18:14:54 +0200118 @Override
Googler73d942f2019-10-03 12:31:02 -0700119 public void accept(NodeVisitor visitor) {
120 visitor.visit(this);
121 }
Han-Wen Nienhuysd08b27f2015-02-25 16:45:20 +0100122}