| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- # Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
- # For details: https://github.com/PyCQA/astroid/blob/main/LICENSE
- # Copyright (c) https://github.com/PyCQA/astroid/blob/main/CONTRIBUTORS.txt
- """Python Abstract Syntax Tree New Generation.
- The aim of this module is to provide a common base representation of
- python source code for projects such as pychecker, pyreverse,
- pylint... Well, actually the development of this library is essentially
- governed by pylint's needs.
- It mimics the class defined in the python's _ast module with some
- additional methods and attributes. New nodes instances are not fully
- compatible with python's _ast.
- Instance attributes are added by a
- builder object, which can either generate extended ast (let's call
- them astroid ;) by visiting an existent ast tree or by inspecting living
- object. Methods are added by monkey patching ast classes.
- Main modules are:
- * nodes and scoped_nodes for more information about methods and
- attributes added to different node classes
- * the manager contains a high level object to get astroid trees from
- source files and living objects. It maintains a cache of previously
- constructed tree for quick access
- * builder contains the class responsible to build astroid trees
- """
- import functools
- import tokenize
- from importlib import import_module
- # isort: off
- # We have an isort: off on '__version__' because the packaging need to access
- # the version before the dependencies are installed (in particular 'wrapt'
- # that is imported in astroid.inference)
- from astroid.__pkginfo__ import __version__, version
- from astroid.nodes import node_classes, scoped_nodes
- # isort: on
- from astroid import inference, raw_building
- from astroid.astroid_manager import MANAGER
- from astroid.bases import BaseInstance, BoundMethod, Instance, UnboundMethod
- from astroid.brain.helpers import register_module_extender
- from astroid.builder import extract_node, parse
- from astroid.const import BRAIN_MODULES_DIRECTORY, PY310_PLUS, Context, Del, Load, Store
- from astroid.exceptions import (
- AstroidBuildingError,
- AstroidBuildingException,
- AstroidError,
- AstroidImportError,
- AstroidIndexError,
- AstroidSyntaxError,
- AstroidTypeError,
- AstroidValueError,
- AttributeInferenceError,
- BinaryOperationError,
- DuplicateBasesError,
- InconsistentMroError,
- InferenceError,
- InferenceOverwriteError,
- MroError,
- NameInferenceError,
- NoDefault,
- NotFoundError,
- OperationError,
- ParentMissingError,
- ResolveError,
- StatementMissing,
- SuperArgumentTypeError,
- SuperError,
- TooManyLevelsError,
- UnaryOperationError,
- UnresolvableName,
- UseInferenceDefault,
- )
- from astroid.inference_tip import _inference_tip_cached, inference_tip
- from astroid.objects import ExceptionInstance
- # isort: off
- # It's impossible to import from astroid.nodes with a wildcard, because
- # there is a cyclic import that prevent creating an __all__ in astroid/nodes
- # and we need astroid/scoped_nodes and astroid/node_classes to work. So
- # importing with a wildcard would clash with astroid/nodes/scoped_nodes
- # and astroid/nodes/node_classes.
- from astroid.nodes import ( # pylint: disable=redefined-builtin (Ellipsis)
- CONST_CLS,
- AnnAssign,
- Arguments,
- Assert,
- Assign,
- AssignAttr,
- AssignName,
- AsyncFor,
- AsyncFunctionDef,
- AsyncWith,
- Attribute,
- AugAssign,
- Await,
- BinOp,
- BoolOp,
- Break,
- Call,
- ClassDef,
- Compare,
- Comprehension,
- ComprehensionScope,
- Const,
- Continue,
- Decorators,
- DelAttr,
- Delete,
- DelName,
- Dict,
- DictComp,
- DictUnpack,
- Ellipsis,
- EmptyNode,
- EvaluatedObject,
- ExceptHandler,
- Expr,
- ExtSlice,
- For,
- FormattedValue,
- FunctionDef,
- GeneratorExp,
- Global,
- If,
- IfExp,
- Import,
- ImportFrom,
- Index,
- JoinedStr,
- Keyword,
- Lambda,
- List,
- ListComp,
- Match,
- MatchAs,
- MatchCase,
- MatchClass,
- MatchMapping,
- MatchOr,
- MatchSequence,
- MatchSingleton,
- MatchStar,
- MatchValue,
- Module,
- Name,
- NamedExpr,
- NodeNG,
- Nonlocal,
- Pass,
- Raise,
- Return,
- Set,
- SetComp,
- Slice,
- Starred,
- Subscript,
- TryExcept,
- TryFinally,
- TryStar,
- Tuple,
- UnaryOp,
- Unknown,
- While,
- With,
- Yield,
- YieldFrom,
- are_exclusive,
- builtin_lookup,
- unpack_infer,
- function_to_method,
- )
- # isort: on
- from astroid.util import Uninferable
- # Performance hack for tokenize. See https://bugs.python.org/issue43014
- # Adapted from https://github.com/PyCQA/pycodestyle/pull/993
- if (
- not PY310_PLUS
- and callable(getattr(tokenize, "_compile", None))
- and getattr(tokenize._compile, "__wrapped__", None) is None # type: ignore[attr-defined]
- ):
- tokenize._compile = functools.lru_cache()(tokenize._compile) # type: ignore[attr-defined]
- # load brain plugins
- for module in BRAIN_MODULES_DIRECTORY.iterdir():
- if module.suffix == ".py":
- import_module(f"astroid.brain.{module.stem}")
|