aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkModules.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkModules.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkModules.java66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkModules.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkModules.java
new file mode 100644
index 0000000000..6f4172ea7a
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkModules.java
@@ -0,0 +1,66 @@
+// Copyright 2014 The Bazel Authors. 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.analysis.skylark;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.packages.SkylarkNativeModule;
+import com.google.devtools.build.lib.syntax.BazelLibrary;
+import com.google.devtools.build.lib.syntax.Environment;
+import com.google.devtools.build.lib.syntax.Environment.Frame;
+import com.google.devtools.build.lib.syntax.Mutability;
+import com.google.devtools.build.lib.syntax.Runtime;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * The basis for a Skylark Environment with all build-related modules registered.
+ */
+public final class SkylarkModules {
+
+ private SkylarkModules() { }
+
+ /**
+ * The list of built in Skylark modules.
+ * Documentation is generated automatically for all these modules.
+ * They are also registered with the {@link Environment}.
+ */
+ public static final ImmutableList<Class<?>> MODULES = ImmutableList.of(
+ SkylarkAttr.class,
+ SkylarkCommandLine.class,
+ SkylarkNativeModule.class,
+ SkylarkRuleClassFunctions.class,
+ SkylarkRuleImplementationFunctions.class);
+
+ /** Global bindings for all Skylark modules */
+ private static final Map<List<Class<?>>, Frame> cache = new HashMap<>();
+
+ public static Environment.Frame getGlobals(List<Class<?>> modules) {
+ if (!cache.containsKey(modules)) {
+ cache.put(modules, createGlobals(modules));
+ }
+ return cache.get(modules);
+ }
+
+ private static Environment.Frame createGlobals(List<Class<?>> modules) {
+ try (Mutability mutability = Mutability.create("SkylarkModules")) {
+ Environment env = Environment.builder(mutability).setGlobals(BazelLibrary.GLOBALS).build();
+ for (Class<?> moduleClass : modules) {
+ Runtime.registerModuleGlobals(env, moduleClass);
+ }
+ return env.getGlobals();
+ }
+ }
+}