-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
v1 build-tag and import for side effects #7179
base: main
Are you sure you want to change the base?
Changes from all commits
d9948db
606141c
f841ea7
70dea52
7bd64fd
aa04bdf
c13780e
4d29b44
4e96509
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -1717,7 +1717,7 @@ func (c *Compiler) checkDuplicateImports() { | |||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
for _, name := range c.sorted { | ||||||||||||||||||||||||||||||||||||||||||
mod := c.Modules[name] | ||||||||||||||||||||||||||||||||||||||||||
if c.strict || mod.regoV1Compatible() { | ||||||||||||||||||||||||||||||||||||||||||
if c.strict || moduleIsRegoV1(mod) { | ||||||||||||||||||||||||||||||||||||||||||
modules = append(modules, mod) | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -1731,7 +1731,7 @@ func (c *Compiler) checkDuplicateImports() { | |||||||||||||||||||||||||||||||||||||||||
func (c *Compiler) checkKeywordOverrides() { | ||||||||||||||||||||||||||||||||||||||||||
for _, name := range c.sorted { | ||||||||||||||||||||||||||||||||||||||||||
mod := c.Modules[name] | ||||||||||||||||||||||||||||||||||||||||||
if c.strict || mod.regoV1Compatible() { | ||||||||||||||||||||||||||||||||||||||||||
if c.strict || moduleIsRegoV1(mod) { | ||||||||||||||||||||||||||||||||||||||||||
errs := checkRootDocumentOverrides(mod) | ||||||||||||||||||||||||||||||||||||||||||
for _, err := range errs { | ||||||||||||||||||||||||||||||||||||||||||
c.err(err) | ||||||||||||||||||||||||||||||||||||||||||
|
@@ -1740,6 +1740,20 @@ func (c *Compiler) checkKeywordOverrides() { | |||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
func moduleIsRegoV1(mod *Module) bool { | ||||||||||||||||||||||||||||||||||||||||||
switch mod.regoVersion { | ||||||||||||||||||||||||||||||||||||||||||
case RegoUndefined: | ||||||||||||||||||||||||||||||||||||||||||
switch DefaultRegoVersion() { | ||||||||||||||||||||||||||||||||||||||||||
case RegoV1, RegoV0CompatV1: | ||||||||||||||||||||||||||||||||||||||||||
return true | ||||||||||||||||||||||||||||||||||||||||||
default: | ||||||||||||||||||||||||||||||||||||||||||
return false | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
return mod.regoV1Compatible() | ||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+1744
to
+1754
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [nit] the single-case switch could be an if:
Suggested change
...but this is code golf and doesn't matter 🙃 |
||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||
// resolveAllRefs resolves references in expressions to their fully qualified values. | ||||||||||||||||||||||||||||||||||||||||||
// | ||||||||||||||||||||||||||||||||||||||||||
// For instance, given the following module: | ||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,6 +17,7 @@ import ( | |
"strings" | ||
"unicode/utf8" | ||
|
||
"github.com/open-policy-agent/opa/internal/rego/version" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [nit] let's cluster this one with the other opa imports below |
||
"gopkg.in/yaml.v3" | ||
|
||
"github.com/open-policy-agent/opa/ast/internal/scanner" | ||
|
@@ -30,11 +31,10 @@ var RegoV1CompatibleRef = Ref{VarTerm("rego"), StringTerm("v1")} | |
// RegoVersion defines the Rego syntax requirements for a module. | ||
type RegoVersion int | ||
|
||
const DefaultRegoVersion = RegoVersion(0) | ||
|
||
const ( | ||
RegoUndefined RegoVersion = iota | ||
// RegoV0 is the default, original Rego syntax. | ||
RegoV0 RegoVersion = iota | ||
RegoV0 | ||
// RegoV0CompatV1 requires modules to comply with both the RegoV0 and RegoV1 syntax (as when 'rego.v1' is imported in a module). | ||
// Shortly, RegoV1 compatibility is required, but 'rego.v1' or 'future.keywords' must also be imported. | ||
RegoV0CompatV1 | ||
|
@@ -45,6 +45,10 @@ const ( | |
RegoV1 | ||
) | ||
|
||
func DefaultRegoVersion() RegoVersion { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Breaking change. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since DefaultRegoVersion was added so recently I think we can make this change confidently. |
||
return RegoVersion(version.DefaultRegoVersion) | ||
} | ||
|
||
func (v RegoVersion) Int() int { | ||
if v == RegoV1 { | ||
return 1 | ||
|
@@ -156,8 +160,10 @@ type ParserOptions struct { | |
} | ||
|
||
// EffectiveRegoVersion returns the effective RegoVersion to use for parsing. | ||
// Deprecated: Use RegoVersion instead. | ||
func (po *ParserOptions) EffectiveRegoVersion() RegoVersion { | ||
func (po ParserOptions) EffectiveRegoVersion() RegoVersion { | ||
if po.RegoVersion == RegoUndefined { | ||
charlieegan3 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
return DefaultRegoVersion() | ||
} | ||
return po.RegoVersion | ||
} | ||
|
||
|
@@ -314,7 +320,7 @@ func (p *Parser) Parse() ([]Statement, []*Comment, Errors) { | |
|
||
allowedFutureKeywords := map[string]tokens.Token{} | ||
|
||
if p.po.RegoVersion == RegoV1 { | ||
if p.po.EffectiveRegoVersion() == RegoV1 { | ||
// RegoV1 includes all future keywords in the default language definition | ||
for k, v := range futureKeywords { | ||
allowedFutureKeywords[k] = v | ||
|
@@ -373,7 +379,7 @@ func (p *Parser) Parse() ([]Statement, []*Comment, Errors) { | |
} | ||
|
||
selected := map[string]tokens.Token{} | ||
if p.po.AllFutureKeywords || p.po.RegoVersion == RegoV1 { | ||
if p.po.AllFutureKeywords || p.po.EffectiveRegoVersion() == RegoV1 { | ||
for kw, tok := range allowedFutureKeywords { | ||
selected[kw] = tok | ||
} | ||
|
@@ -394,7 +400,7 @@ func (p *Parser) Parse() ([]Statement, []*Comment, Errors) { | |
} | ||
p.s.s = p.s.s.WithKeywords(selected) | ||
|
||
if p.po.RegoVersion == RegoV1 { | ||
if p.po.EffectiveRegoVersion() == RegoV1 { | ||
for kw, tok := range allowedFutureKeywords { | ||
p.s.s.AddKeyword(kw, tok) | ||
} | ||
|
@@ -2710,7 +2716,7 @@ func (p *Parser) regoV1Import(imp *Import) { | |
return | ||
} | ||
|
||
if p.po.RegoVersion == RegoV1 { | ||
if p.po.EffectiveRegoVersion() == RegoV1 { | ||
// We're parsing for Rego v1, where the 'rego.v1' import is a no-op. | ||
return | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
go-tests are basically run twice, once for v0 and once for v1. This has impact on PR GHA execution time. Instead, we could narrow the scope of tests run for v0. The benefit of keeping it like this is we get great test-coverage, and will know if we break the v0 opt-in.