diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/query2/engine/TargetLiteral.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/query2/engine/TargetLiteral.java | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/query2/engine/TargetLiteral.java b/src/main/java/com/google/devtools/build/lib/query2/engine/TargetLiteral.java new file mode 100644 index 0000000000..b6a57cc5a5 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/query2/engine/TargetLiteral.java @@ -0,0 +1,72 @@ +// Copyright 2014 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.query2.engine; + +import com.google.common.base.Preconditions; + +import java.util.Collection; +import java.util.Set; + +/** + * A literal set of targets, using 'blaze build' syntax. Or, a reference to a + * variable name. (The syntax of the string "pattern" determines which.) + * + * TODO(bazel-team): Perhaps we should distinguish NAME from WORD in the parser, + * based on the characters in it? Also, perhaps we should not allow NAMEs to + * be quoted like WORDs can be. + * + * <pre>expr ::= NAME | WORD</pre> + */ +final class TargetLiteral extends QueryExpression { + + private final String pattern; + + TargetLiteral(String pattern) { + this.pattern = Preconditions.checkNotNull(pattern); + } + + public boolean isVariableReference() { + return LetExpression.isValidVarReference(pattern); + } + + @Override + public <T> Set<T> eval(QueryEnvironment<T> env) throws QueryException { + if (isVariableReference()) { + String varName = LetExpression.getNameFromReference(pattern); + Set<T> value = env.getVariable(varName); + if (value == null) { + throw new QueryException(this, "undefined variable '" + varName + "'"); + } + return env.getVariable(varName); + } + + return env.getTargetsMatchingPattern(this, pattern); + } + + @Override + public void collectTargetPatterns(Collection<String> literals) { + if (!isVariableReference()) { + literals.add(pattern); + } + } + + @Override + public String toString() { + // Keep predicate consistent with Lexer.scanWord! + boolean needsQuoting = Lexer.isReservedWord(pattern) + || pattern.isEmpty() + || "$-*".indexOf(pattern.charAt(0)) != -1; + return needsQuoting ? ("\"" + pattern + "\"") : pattern; + } +} |