Class SymbolTree

java.lang.Object
com.github._1c_syntax.bsl.languageserver.context.symbol.SymbolTree

public final class SymbolTree extends Object
Символьное дерево документа. Содержит все символы документа, вложенные друг в друга по принципу родитель -> дети
  • Constructor Details

    • SymbolTree

      public SymbolTree(ModuleSymbol module)
      Создать дерево без ограничений препроцессора для объявлений методов.
      Parameters:
      module - корневой символ документа.
    • SymbolTree

      public SymbolTree(ModuleSymbol module, Map<Range, Set<ExecutionContext>> methodConditions)
      Создать дерево с сохранёнными условиями объявлений методов.

      Карта, её ключи и множества используются без защитного копирования. Вызывающий код должен обеспечить их неизменность в течение жизни дерева.

      Parameters:
      module - корневой символ документа.
      methodConditions - условия по диапазонам имён методов этой версии документа; значения null допустимы и означают неизвестное условие.
    • SymbolTree

      public SymbolTree(ModuleSymbol module, SymbolTree.Basis basis)
    • SymbolTree

      public SymbolTree(ModuleSymbol module, Map<Range, Set<ExecutionContext>> methodConditions, SymbolTree.Basis basis)
      Основание классификации и условия объявлений относятся к одной версии дерева.
  • Method Details

    • getMethodPreprocessorContexts

      public @Nullable Set<ExecutionContext> getMethodPreprocessorContexts(MethodSymbol method)
      Получить контексты ветки препроцессора, в которой объявлен метод.

      Доступно после выгрузки AST. Контексты модуля, директивы компиляции и настройки диагностики не учитываются. Возвращённое множество изменять нельзя.

      Parameters:
      method - метод из этой версии символьного дерева.
      Returns:
      все контексты при отсутствии ограничения, пустое множество для недостижимой ветки или null, если условие нельзя вычислить.
    • getChildren

      public List<SourceDefinedSymbol> getChildren()
      Returns:
      Список символов верхнего уровня за исключением символа модуля документа.
    • getChildrenFlat

      public <T> List<T> getChildrenFlat(Class<T> clazz)
      Список всех символов всех уровней указанного типа (за исключением символа модуля документа), преобразованных в плоский список.
      Type Parameters:
      T - тип искомого символа.
      Parameters:
      clazz - класс искомого символа.
      Returns:
      плоский список символов указанного типа.
    • getModuleLevelRegions

      public List<RegionSymbol> getModuleLevelRegions()
      Returns:
      Список областей, расположенных на верхнем уровне документа.
    • getRegionsFlat

      public List<RegionSymbol> getRegionsFlat()
      Returns:
      плоский список всех областей документа.
    • getMethodSymbol

      public Optional<MethodSymbol> getMethodSymbol(ParserRuleContext ctx)
      Попытка поиска символа метода по узлу дерева разбора.

      Implementation note - Поиск осуществляется по месту определения метода (declaration).

      Parameters:
      ctx - узел дерева разбора документа.
      Returns:
      найденный символ метода.
    • getMethodSymbol

      public Optional<MethodSymbol> getMethodSymbol(String methodName)
      Поиск MethodSymbol в дереве по указанному имени (без учета регистра).
      Parameters:
      methodName - Имя метода
      Returns:
      MethodSymbol, если он был найден в дереве символов.
    • getVariableSymbol

      public Optional<VariableSymbol> getVariableSymbol(ParserRuleContext ctx)
      Попытка поиска символа переменной по узлу дерева разбора.

      Implementation note Поиск осуществляется по месту определения переменной (declaration).

      Parameters:
      ctx - узел дерева разбора документа.
      Returns:
      найденный символ переменной.
    • getVariableSymbol

      public Optional<VariableSymbol> getVariableSymbol(String variableName, SourceDefinedSymbol scopeSymbol)
      Поиск VariableSymbol в дереве по указанному имени (без учета регистра) и области объявления.
      Parameters:
      variableName - Имя переменной
      scopeSymbol - Символ, внутри которого осуществляется поиск. Например, ModuleSymbol или MethodSymbol.
      Returns:
      VariableSymbol, если он был найден в дереве символов.
    • getVariablesOfScope

      public List<VariableSymbol> getVariablesOfScope(SourceDefinedSymbol scopeSymbol)
      Переменные, объявленные в области scopeSymbol: по одной на имя без учёта регистра (первая объявленная), упорядочены по имени.
      Parameters:
      scopeSymbol - область объявления — ModuleSymbol или MethodSymbol.
      Returns:
      неизменяемый список переменных; пустой, если в области их нет.
    • getVariableSymbolInScope

      public Optional<VariableSymbol> getVariableSymbolInScope(ParserRuleContext node, String variableName)
      Переменная с именем variableName, видимая в точке узла node: сперва — в охватывающем методе (по RULE_sub), иначе — на уровне модуля. Из метода видны только переменные модуля, объявленные Перем (см. getModuleVariableVisibleFromMethods(String)). Единый резолв видимости переменной для потребителей, которым нужно отличить объявленную переменную от одноимённого self-члена (система типов, индексатор ссылок).
      Parameters:
      node - узел, в точке которого проверяется видимость.
      variableName - имя переменной (без учёта регистра — как хранит дерево).
      Returns:
      видимая переменная; empty, если такой в области видимости нет.
    • getModuleVariableVisibleFromMethods

      public Optional<VariableSymbol> getModuleVariableVisibleFromMethods(String variableName)
      Переменная уровня модуля, видимая из методов. Такова только переменная, объявленная Перем на уровне модуля. Переменная, созданная присваиванием в теле модуля, живёт в одном теле модуля, а переменные и параметры метода с ошибками разбора, оказавшиеся на уровне модуля, принадлежат своему методу.
      Parameters:
      variableName - имя переменной (без учёта регистра — как хранит дерево).
      Returns:
      переменная модуля; empty, если такой нет либо из методов она не видна.
    • getSymbolAtPosition

      public SourceDefinedSymbol getSymbolAtPosition(Position position)
      Поиск самого вложенного символа, содержащего указанную позицию.

      Сохраняет порядок дочерних символов при перекрытии диапазонов. Области сами не возвращаются. Упорядоченные списки детей допускают двоичный поиск первой возможной границы; остальные просматриваются последовательно.

      Parameters:
      position - Позиция в документе.
      Returns:
      Символ, содержащий позицию, или символ модуля, если позиция вне всех символов.
    • findSymbolBySelectionRange

      public Optional<SourceDefinedSymbol> findSymbolBySelectionRange(Position position)
      Символ, чьё имя (selectionRange) накрывает позицию — то есть позиция стоит на объявлении символа. Двоичный поиск по строке через getSymbolsBySelectionLine(); при нескольких объявлениях на строке возвращает первый по порядку getChildrenFlat() накрывающий символ.
      Parameters:
      position - позиция в документе.
      Returns:
      символ, на объявлении которого стоит позиция, либо empty.
    • getModule

      public ModuleSymbol getModule()
      Корневой символ модуля документа.
    • getBasis

      public SymbolTree.Basis getBasis()
    • equals

      public boolean equals(Object o)
      Overrides:
      equals in class Object
    • hashCode

      public int hashCode()
      Overrides:
      hashCode in class Object
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • getChildrenFlat

      public List<SourceDefinedSymbol> getChildrenFlat()
      Список всех символов всех уровней (за исключением символа модуля документа), преобразованных в плоский список.
    • getMethods

      public List<MethodSymbol> getMethods()
      Список методов документа.
    • getConstructor

      public Optional<ConstructorSymbol> getConstructor()
      Конструктор OneScript-класса (ПриСозданииОбъекта / OnObjectCreate), если он объявлен в документе.
    • getVariables

      public List<VariableSymbol> getVariables()
      Плоский список всех переменных документа