| // Copyright 2019 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 resolve |
| |
| import "go.starlark.net/syntax" |
| |
| // This file defines resolver data types saved in the syntax tree. |
| // We cannot guarantee API stability for these types |
| // as they are closely tied to the implementation. |
| |
| // A Binding contains resolver information about an identifer. |
| // The resolver populates the Binding field of each syntax.Identifier. |
| // The Binding ties together all identifiers that denote the same variable. |
| type Binding struct { |
| Scope Scope |
| |
| // Index records the index into the enclosing |
| // - {DefStmt,File}.Locals, if Scope==Local |
| // - DefStmt.FreeVars, if Scope==Free |
| // - File.Globals, if Scope==Global. |
| // It is zero if Scope is Predeclared, Universal, or Undefined. |
| Index int |
| |
| First *syntax.Ident // first binding use (iff Scope==Local/Free/Global) |
| } |
| |
| // The Scope of Binding indicates what kind of scope it has. |
| type Scope uint8 |
| |
| const ( |
| Undefined Scope = iota // name is not defined |
| Local // name is local to its function or file |
| Cell // name is function-local but shared with a nested function |
| Free // name is cell of some enclosing function |
| Global // name is global to module |
| Predeclared // name is predeclared for this module (e.g. glob) |
| Universal // name is universal (e.g. len) |
| ) |
| |
| var scopeNames = [...]string{ |
| Undefined: "undefined", |
| Local: "local", |
| Cell: "cell", |
| Free: "free", |
| Global: "global", |
| Predeclared: "predeclared", |
| Universal: "universal", |
| } |
| |
| func (scope Scope) String() string { return scopeNames[scope] } |
| |
| // A Module contains resolver information about a file. |
| // The resolver populates the Module field of each syntax.File. |
| type Module struct { |
| Locals []*Binding // the file's (comprehension-)local variables |
| Globals []*Binding // the file's global variables |
| } |
| |
| // A Function contains resolver information about a named or anonymous function. |
| // The resolver populates the Function field of each syntax.DefStmt and syntax.LambdaExpr. |
| type Function struct { |
| Pos syntax.Position // of DEF or LAMBDA |
| Name string // name of def, or "lambda" |
| Params []syntax.Expr // param = ident | ident=expr | * | *ident | **ident |
| Body []syntax.Stmt // contains synthetic 'return expr' for lambda |
| |
| HasVarargs bool // whether params includes *args (convenience) |
| HasKwargs bool // whether params includes **kwargs (convenience) |
| NumKwonlyParams int // number of keyword-only optional parameters |
| Locals []*Binding // this function's local/cell variables, parameters first |
| FreeVars []*Binding // enclosing cells to capture in closure |
| } |