| // Copyright 2023 The Bazel Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package syntax |
| |
| import _ "unsafe" // for linkname |
| |
| // FileOptions specifies various per-file options that affect static |
| // aspects of an individual file such as parsing, name resolution, and |
| // code generation. (Options that affect global dynamics are typically |
| // controlled through [starlark.Thread].) |
| // |
| // The zero value of FileOptions is the default behavior. |
| // |
| // Many functions in this package come in two versions: the legacy |
| // standalone function (such as [Parse]) uses [LegacyFileOptions], |
| // whereas the more recent method (such as [Options.Parse]) honors the |
| // provided options. The second form is preferred. In other packages, |
| // the modern version is a standalone function with a leading |
| // FileOptions parameter and the name suffix "Options", such as |
| // [starlark.ExecFileOptions]. |
| type FileOptions struct { |
| // resolver |
| Set bool // allow references to the 'set' built-in function |
| While bool // allow 'while' statements |
| TopLevelControl bool // allow if/for/while statements at top-level |
| GlobalReassign bool // allow reassignment to top-level names |
| LoadBindsGlobally bool // load creates global not file-local bindings (deprecated) |
| |
| // compiler |
| Recursion bool // disable recursion check for functions in this file |
| } |
| |
| // TODO(adonovan): provide a canonical flag parser for FileOptions. |
| // (And use it in the testdata "options:" strings.) |
| |
| // LegacyFileOptions returns a new FileOptions containing the current |
| // values of the resolver package's legacy global variables such as |
| // [resolve.AllowRecursion], etc. |
| // These variables may be associated with command-line flags. |
| func LegacyFileOptions() *FileOptions { |
| return &FileOptions{ |
| Set: resolverAllowSet, |
| While: resolverAllowGlobalReassign, |
| TopLevelControl: resolverAllowGlobalReassign, |
| GlobalReassign: resolverAllowGlobalReassign, |
| Recursion: resolverAllowRecursion, |
| LoadBindsGlobally: resolverLoadBindsGlobally, |
| } |
| } |
| |
| // Access resolver (legacy) flags, if they are linked in; false otherwise. |
| var ( |
| //go:linkname resolverAllowSet go.starlark.net/resolve.AllowSet |
| resolverAllowSet bool |
| //go:linkname resolverAllowGlobalReassign go.starlark.net/resolve.AllowGlobalReassign |
| resolverAllowGlobalReassign bool |
| //go:linkname resolverAllowRecursion go.starlark.net/resolve.AllowRecursion |
| resolverAllowRecursion bool |
| //go:linkname resolverLoadBindsGlobally go.starlark.net/resolve.LoadBindsGlobally |
| resolverLoadBindsGlobally bool |
| ) |