Add support for externs files.

--
MOS_MIGRATED_REVID=97334355
diff --git a/tools/build_rules/closure/closure_js_binary.bzl b/tools/build_rules/closure/closure_js_binary.bzl
index 419f8a5..01790e3 100644
--- a/tools/build_rules/closure/closure_js_binary.bzl
+++ b/tools/build_rules/closure/closure_js_binary.bzl
@@ -46,8 +46,10 @@
 }
 
 def _impl(ctx):
+  externs = set(order="compile")
   srcs = set(order="compile")
   for dep in ctx.attr.deps:
+    externs += dep.transitive_js_externs
     srcs += dep.transitive_js_srcs
 
   args = [
@@ -56,7 +58,8 @@
       "--language_in=ECMASCRIPT5_STRICT",
       "--manage_closure_dependencies",
       "--warning_level=VERBOSE",
-  ] + ["--js=%s" % src.path for src in srcs]
+  ] + (["--js=%s" % src.path for src in srcs] +
+       ["--externs=%s" % extern.path for extern in externs])
 
   # Set the compilation level.
   if ctx.attr.compilation_level in _COMPILATION_LEVELS:
@@ -77,7 +80,8 @@
     implementation=_impl,
     attrs={
         "deps": attr.label_list(
-            allow_files=False, providers=["transitive_js_srcs"]),
+            allow_files=False,
+            providers=["transitive_js_externs", "transitive_js_srcs"]),
         "main": attr.string(default="%{name}"),
         "compilation_level": attr.string(default="advanced"),
         "_closure_compiler": attr.label(
diff --git a/tools/build_rules/closure/closure_js_library.bzl b/tools/build_rules/closure/closure_js_library.bzl
index 7dcfb2b..72a4c12 100644
--- a/tools/build_rules/closure/closure_js_library.bzl
+++ b/tools/build_rules/closure/closure_js_library.bzl
@@ -27,16 +27,23 @@
 _JS_FILE_TYPE = FileType([".js"])
 
 def _impl(ctx):
+  externs = set(order="compile")
   srcs = set(order="compile")
   for dep in ctx.attr.deps:
+    externs += dep.transitive_js_externs
     srcs += dep.transitive_js_srcs
 
+  externs += _JS_FILE_TYPE.filter(ctx.files.externs)
   srcs += _JS_FILE_TYPE.filter(ctx.files.srcs)
-  return struct(files=set(), transitive_js_srcs=srcs)
+
+  return struct(
+      files=set(), transitive_js_externs=externs, transitive_js_srcs=srcs)
 
 closure_js_library = rule(
     implementation=_impl,
     attrs={
+        "externs": attr.label_list(allow_files=_JS_FILE_TYPE),
         "srcs": attr.label_list(allow_files=_JS_FILE_TYPE),
-        "deps": attr.label_list(providers=["transitive_js_srcs"])
+        "deps": attr.label_list(
+            providers=["transitive_js_externs", "transitive_js_srcs"])
     })
diff --git a/tools/build_rules/closure/closure_stylesheet_library.bzl b/tools/build_rules/closure/closure_stylesheet_library.bzl
index 3dc6b13..7b90b17 100644
--- a/tools/build_rules/closure/closure_stylesheet_library.bzl
+++ b/tools/build_rules/closure/closure_stylesheet_library.bzl
@@ -58,6 +58,7 @@
   return struct(
       files=set([ctx.outputs.out]),
       transitive_gss_srcs=srcs,
+      transitive_js_externs=set(),
       transitive_js_srcs=[ctx.outputs.out_renaming])
 
 # There are two outputs:
diff --git a/tools/build_rules/closure/closure_template_library.bzl b/tools/build_rules/closure/closure_template_library.bzl
index 20fb839..e41cc2d 100644
--- a/tools/build_rules/closure/closure_template_library.bzl
+++ b/tools/build_rules/closure/closure_template_library.bzl
@@ -46,7 +46,9 @@
       arguments=args,
       executable=ctx.executable._closure_templates)
 
-  return struct(files=set(), transitive_js_srcs=set([ctx.outputs.out]))
+  return struct(
+      files=set(), transitive_js_externs=set(),
+      transitive_js_srcs=set([ctx.outputs.out]))
 
 closure_template_library = rule(
     implementation=_impl,