go.starlark.net@v0.0.0-20231101134539-556fd59b42f6/syntax/options.go (about) 1 // Copyright 2023 The Bazel Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package syntax 6 7 import _ "unsafe" // for linkname 8 9 // FileOptions specifies various per-file options that affect static 10 // aspects of an individual file such as parsing, name resolution, and 11 // code generation. (Options that affect global dynamics are typically 12 // controlled through [starlark.Thread].) 13 // 14 // The zero value of FileOptions is the default behavior. 15 // 16 // Many functions in this package come in two versions: the legacy 17 // standalone function (such as [Parse]) uses [LegacyFileOptions], 18 // whereas the more recent method (such as [Options.Parse]) honors the 19 // provided options. The second form is preferred. In other packages, 20 // the modern version is a standalone function with a leading 21 // FileOptions parameter and the name suffix "Options", such as 22 // [starlark.ExecFileOptions]. 23 type FileOptions struct { 24 // resolver 25 Set bool // allow references to the 'set' built-in function 26 While bool // allow 'while' statements 27 TopLevelControl bool // allow if/for/while statements at top-level 28 GlobalReassign bool // allow reassignment to top-level names 29 LoadBindsGlobally bool // load creates global not file-local bindings (deprecated) 30 31 // compiler 32 Recursion bool // disable recursion check for functions in this file 33 } 34 35 // TODO(adonovan): provide a canonical flag parser for FileOptions. 36 // (And use it in the testdata "options:" strings.) 37 38 // LegacyFileOptions returns a new FileOptions containing the current 39 // values of the resolver package's legacy global variables such as 40 // [resolve.AllowRecursion], etc. 41 // These variables may be associated with command-line flags. 42 func LegacyFileOptions() *FileOptions { 43 return &FileOptions{ 44 Set: resolverAllowSet, 45 While: resolverAllowGlobalReassign, 46 TopLevelControl: resolverAllowGlobalReassign, 47 GlobalReassign: resolverAllowGlobalReassign, 48 Recursion: resolverAllowRecursion, 49 LoadBindsGlobally: resolverLoadBindsGlobally, 50 } 51 } 52 53 // Access resolver (legacy) flags, if they are linked in; false otherwise. 54 var ( 55 //go:linkname resolverAllowSet go.starlark.net/resolve.AllowSet 56 resolverAllowSet bool 57 //go:linkname resolverAllowGlobalReassign go.starlark.net/resolve.AllowGlobalReassign 58 resolverAllowGlobalReassign bool 59 //go:linkname resolverAllowRecursion go.starlark.net/resolve.AllowRecursion 60 resolverAllowRecursion bool 61 //go:linkname resolverLoadBindsGlobally go.starlark.net/resolve.LoadBindsGlobally 62 resolverLoadBindsGlobally bool 63 )