source/analysis/scope.mli (114 lines of code) (raw):
(*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open Ast
(** Data structure that represents a name binding in Python. Constructors are kept private
intentionally -- The [Scope] class is supposed to do the creation in batch. *)
module Binding : sig
module Kind : sig
module Star : sig
type t =
| Once
| Twice
[@@deriving sexp, compare, hash]
end
module Import : sig
type t =
| From of Reference.t
| Module
[@@deriving sexp, compare, hash]
end
type t =
| AssignTarget of Expression.t option
| ClassName
| ComprehensionTarget
| DefineName of Statement.Define.Signature.t
| ExceptTarget of Expression.t option
| ForTarget
| ImportName of Import.t
| MatchTarget
| ParameterName of {
index: int;
annotation: Expression.t option;
star: Star.t option;
}
| WalrusTarget
| WithTarget
[@@deriving sexp, compare, hash]
end
type t = private {
kind: Kind.t;
name: Identifier.t;
location: Location.t;
}
[@@deriving sexp, compare, hash]
val name : t -> Identifier.t
val of_statement : t list -> Statement.t -> t list
val of_parameters : t list -> Expression.Parameter.parameter Node.t list -> t list
end
(** Data structure that aggregates all bindings in a single code block (excluding all the nesting
and nested blocks). *)
module Scope : sig
module Kind : sig
type t =
| Module
| Define of Statement.Define.Signature.t
| Lambda
| Comprehension
[@@deriving sexp, compare, hash]
end
type t = private {
kind: Kind.t;
globals: Identifier.Set.t;
nonlocals: Identifier.Set.t;
bindings: Binding.t Identifier.Map.t;
}
[@@deriving sexp, compare]
val of_define : Statement.Define.t -> t option
val of_define_exn : Statement.Define.t -> t
val of_expression : Expression.t -> t option
val of_expression_exn : Expression.t -> t
val of_source : Source.t -> t
(* Look up bindings directly, skipping global and nonlocal check *)
(* Mostly for testing *)
val lookup_bindings : t -> Identifier.t -> Binding.t option
end
(** Data structure that represents the result of a binding lookup in a stack of scopes *)
module Access : sig
module Locality : sig
type t =
| Local
| Nonlocal
| Global
[@@deriving sexp, compare, hash]
end
module Kind : sig
type t =
| CurrentScope
| OuterScope of Locality.t
[@@deriving sexp, compare, hash]
end
type t = private {
kind: Kind.t;
binding: Binding.t; (** The binding corresponding to the name looked up *)
scope: Scope.t; (** The scope where the binding is found *)
}
[@@deriving sexp, compare]
end
(** Data structure that aggregates all bindings in a code block as well as all blocks that
(transitively) nest it. *)
module ScopeStack : sig
type t
val create : Source.t -> t
val global_scope : t -> Scope.t
val current_scope : t -> Scope.t
val extend : with_:Scope.t -> t -> t
val lookup : t -> Identifier.t -> Access.t option
end
module Builtins : sig
val mem : Identifier.t -> bool
(** Returns whether the given name belongs to the builtin scope. *)
end