Allow module extension tags to be compared
RELNOTES: By comparing tag objects, module extensions can check which one preceded the other within a module file and/or in BFS module order, even across tag classes. This allows them to determine precedence based on order when tags from multiple tag classes interact.
Context: https://github.com/bazel-contrib/rules_go/pull/4526/files#r2586719526
@bazel-io fork 9.0.0
Summary of Changes
Hello @fmeum, I'm Gemini Code Assist[^1]! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!
This pull request introduces a significant enhancement to module extensions by enabling the comparison of tag objects. This functionality allows module extensions to programmatically understand the relative ordering of tags, which is crucial for implementing logic that depends on the sequence in which tags are defined. The change provides module extension authors with greater control and flexibility in how they process and interpret tag configurations.
Highlights
- Module Extension Tag Comparison: Module extension tags can now be compared, allowing module extensions to determine the relative order of tags, even across different tag classes.
- Precedence Based on Order: This new comparison capability enables module extensions to establish precedence among tags based on their definition order within a module file and across modules in BFS order.
- Internal Implementation Changes: The
TypeCheckedTagclass now implementsComparableand includes acompareKeyderived from the module and tag indices to facilitate ordered comparison.
Using Gemini Code Assist
The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.
Invoking Gemini
You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.
| Feature | Command | Description |
|---|---|---|
| Code Review | /gemini review |
Performs a code review for the current pull request in its current state. |
| Pull Request Summary | /gemini summary |
Provides a summary of the current pull request in its current state. |
| Comment | @gemini-code-assist | Responds in comments when explicitly tagged, both in pull request comments and review comments. |
| Help | /gemini help |
Displays a list of available commands. |
Customization
To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.
Limitations & Feedback
Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with :thumbsup: and :thumbsdown: on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.
You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.
[^1]: Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.
@bazel-io fork 8.5.0
The "context" link goes to the "Files changed" tab of the linked PR, but doesn't seem to point at anything in particular. What is it actually referring to?
The "context" link goes to the "Files changed" tab of the linked PR, but doesn't seem to point at anything in particular. What is it actually referring to?
I fixed the link and added a summary to the PR.
The "context" link goes to the "Files changed" tab of the linked PR, but doesn't seem to point at anything in particular. What is it actually referring to?
I fixed the link and added a summary to the PR.
The link still only gets me to the top of the page :/ For me, a hash that actually leads somewhere looks like https://github.com/bazel-contrib/rules_go/pull/4526/changes#diff-5637916a8a5c5eeb7866e19957be8de50ca4b7f18857dacb218c21e05fc0bf8a (#diff-XXXXXX). Can you just say which file/line it is?
The link still only gets me to the top of the page :/ For me, a hash that actually leads somewhere looks like https://github.com/bazel-contrib/rules_go/pull/4526/changes#diff-5637916a8a5c5eeb7866e19957be8de50ca4b7f18857dacb218c21e05fc0bf8a (
#diff-XXXXXX). Can you just say which file/line it is?
I somehow can't get GitHub to generate that format for me. I updated the link again and it does work for me. The location is go/private/extensions.bzl:277.
I'd probably rather have a mctx.modules[0].all_tags thing that returns all tags (regardless of tag class) in order. Then probably some sort of type checking via type(). WDYT?
Before I started to work on this PR, I thought about what we could do in that situation, but I couldn't find an alternative that I actually like more.
Combining all tags in a single list is very natural, but it results in more cumbersome usage for everyone who doesn't care about cross-tag class ordering (most extensions). type or isinstance checks don't seem particularly Starlarky. Nesting all tags in yet another struct with tag_class and value attrs would make access more verbose. Having both an all_tags list and per-tag class lists has the "two different ways that can do almost but not quite the same" problem.
I actually like the current approach better since it doesn't make regular usage more cumbersome but still provides access to the information when needed in a way that interacts well with built-ins: sort allows you to easily recover the all_tags sorting for those classes you care about and simple comparisons to determine precedence locally when that's all you need.