diff options
Diffstat (limited to 'src/main/java/com')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java | 58 |
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); + } } |