aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java58
1 files changed, 41 insertions, 17 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
index 8caec89db0..d48aa7316c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
@@ -28,6 +28,7 @@ import com.google.devtools.build.lib.events.StoredEventHandler;
import com.google.devtools.build.lib.packages.Package.Builder;
import com.google.devtools.build.lib.packages.Package.LegacyBuilder;
import com.google.devtools.build.lib.packages.PackageFactory.EnvironmentExtension;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkSignature;
import com.google.devtools.build.lib.syntax.BaseFunction;
import com.google.devtools.build.lib.syntax.BuildFileAST;
import com.google.devtools.build.lib.syntax.BuiltinFunction;
@@ -40,11 +41,15 @@ import com.google.devtools.build.lib.syntax.FunctionSignature;
import com.google.devtools.build.lib.syntax.Mutability;
import com.google.devtools.build.lib.syntax.ParserInputSource;
import com.google.devtools.build.lib.syntax.Runtime;
+import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.SkylarkSignatureProcessor;
import com.google.devtools.build.lib.vfs.Path;
import java.io.File;
import java.io.IOException;
import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import javax.annotation.Nullable;
@@ -161,23 +166,38 @@ public class WorkspaceFactory {
localReporter.clear();
}
- // TODO(bazel-team): use @SkylarkSignature annotations on a BuiltinFunction.Factory
- // for signature + documentation of this and other functions in this file.
- private static BuiltinFunction newWorkspaceNameFunction() {
- return new BuiltinFunction(
- "workspace", FunctionSignature.namedOnly("name"), BuiltinFunction.USE_AST_ENV) {
- public Object invoke(String name, FuncallExpression ast, Environment env)
- throws EvalException {
- String errorMessage = LabelValidator.validateTargetName(name);
- if (errorMessage != null) {
- throw new EvalException(ast.getLocation(), errorMessage);
+ @SkylarkSignature(name = "workspace", objectType = Object.class, returnType = SkylarkList.class,
+ doc = "Sets the name for this workspace. Workspace names should be a Java-package-style "
+ + "description of the project, using underscores as separators, e.g., "
+ + "github.com/bazelbuild/bazel should use com_github_bazelbuild_bazel. Names must start "
+ + "with a letter and can only contain letters, numbers, and underscores.",
+ mandatoryPositionals = {
+ @SkylarkSignature.Param(name = "name", type = String.class,
+ doc = "the name of the workspace.")},
+ documented = true, useAst = true, useEnvironment = true)
+ private static final BuiltinFunction.Factory newWorkspaceFunction =
+ new BuiltinFunction.Factory("workspace") {
+ public BuiltinFunction create() {
+ return new BuiltinFunction(
+ "workspace", FunctionSignature.namedOnly("name"), BuiltinFunction.USE_AST_ENV) {
+ public Object invoke(String name, FuncallExpression ast, Environment env)
+ throws EvalException {
+ Pattern legalWorkspaceName = Pattern.compile("^\\p{Alpha}\\w*$");
+ Matcher matcher = legalWorkspaceName.matcher(name);
+ if (!matcher.matches()) {
+ throw new EvalException(
+ ast.getLocation(), name + " is not a legal workspace name");
+ }
+ String errorMessage = LabelValidator.validateTargetName(name);
+ if (errorMessage != null) {
+ throw new EvalException(ast.getLocation(), errorMessage);
+ }
+ PackageFactory.getContext(env, ast).pkgBuilder.setWorkspaceName(name);
+ return NONE;
+ }
+ };
}
-
- PackageFactory.getContext(env, ast).pkgBuilder.setWorkspaceName(name);
- return NONE;
- }
- };
- }
+ };
private static BuiltinFunction newBindFunction(final RuleFactory ruleFactory) {
return new BuiltinFunction(
@@ -256,7 +276,7 @@ public class WorkspaceFactory {
private void addWorkspaceFunctions(Environment workspaceEnv, StoredEventHandler localReporter) {
try {
- workspaceEnv.update("workspace", newWorkspaceNameFunction());
+ workspaceEnv.setup("workspace", newWorkspaceFunction.apply());
for (Map.Entry<String, BaseFunction> function : workspaceFunctions.entrySet()) {
workspaceEnv.update(function.getKey(), function.getValue());
}
@@ -296,4 +316,8 @@ public class WorkspaceFactory {
public static ClassObject newNativeModule(RuleClassProvider ruleClassProvider) {
return newNativeModule(createWorkspaceFunctions(ruleClassProvider));
}
+
+ static {
+ SkylarkSignatureProcessor.configureSkylarkFunctions(WorkspaceFactory.class);
+ }
}