bazel repository_rule: don't introspect on FuncallExpression

This CL changes the rule class name heuristic using during instantiation
of non-exported repository_rules (an unintended feature).

A repository rule ought to be subject to the same "exported"
check applied to an ordinary package rule, that is, one should not
be able to instantiate it unless it has been "exported",
which means assigned to a variable at top level.
However, the necessary check was sadly omitted and now several
projects exploit the weakness to create and instantiate repository
rules back to back without an intervening "export".
(Never mind that the current assignment-based export semantics
are problematic.)

To guess the name of a non-exported rule class, the previous code
hackily introspected the syntax tree of the call expression
f() or x.f(), so in the code below it would infer a rule class name
of "r":

  def f():
    r = repository_rule(impl=_r_impl)
    r(name="name", ...)

Soon, the syntax tree will no longer be available to the callee,
so the heuristic must change. Now, it uses "unexported-_r_impl",
based on the name of the rule implementation function.

Users should not be instantiating non-exported repository rules.
The correct usage, which has not changed, is to declare the
repository rule at top level:

  r = repository_rule(impl=_r_impl)

  def f():
     r(...) # instantiates an "r" repository rule

PiperOrigin-RevId: 286239162
2 files changed
tree: 81e63c5ca5c72674bc48ef63b1932a8e6372d71f
  1. .bazelci/
  2. examples/
  3. scripts/
  4. site/
  5. src/
  6. third_party/
  7. tools/
  8. .bazelrc
  9. .gitattributes
  10. .gitignore
  11. AUTHORS
  12. BUILD
  13. CHANGELOG.md
  14. CODEOWNERS
  15. combine_distfiles.py
  16. combine_distfiles_to_tar.sh
  17. compile.sh
  18. CONTRIBUTING.md
  19. CONTRIBUTORS
  20. distdir.bzl
  21. ISSUE_TEMPLATE.md
  22. LICENSE
  23. README.md
  24. WORKSPACE
README.md

Bazel

{Fast, Correct} - Choose two

Build and test software of any size, quickly and reliably.

  • Speed up your builds and tests: Bazel rebuilds only what is necessary. With advanced local and distributed caching, optimized dependency analysis and parallel execution, you get fast and incremental builds.

  • One tool, multiple languages: Build and test Java, C++, Android, iOS, Go, and a wide variety of other language platforms. Bazel runs on Windows, macOS, and Linux.

  • Scalable: Bazel helps you scale your organization, codebase, and continuous integration solution. It handles codebases of any size, in multiple repositories or a huge monorepo.

  • Extensible to your needs: Easily add support for new languages and platforms with Bazel's familiar extension language. Share and re-use language rules written by the growing Bazel community.

Getting Started

Documentation

Contributing to Bazel

See CONTRIBUTING.md

Build status