Spec-Zone.ru › Ada 2012
Справочник Ada 2012

8.3 Видимость

Правила видимости, приведённые ниже, определяют, какие объявления видимы и непосредственно видимы в каждом месте программы. Правила видимости применяются как к явным, так и к неявным объявлениям.

Статическая семантика

Объявление считается непосредственно видимым в тех местах, где имя, состоящее только из идентификатора или символа оператора, достаточно для обозначения объявления; то есть, нет необходимости в обозначении компонента с помощью выбора или специального контекста (например, предшествующего => в именованной ассоциации). Объявление считается видимым везде, где оно непосредственно видимо, а также в других местах, где некоторое имя (например, компонент с помощью выбора) может обозначить объявление.
Категория синтаксических конструкций direct_name используется для обозначения контекстов, где требуется непосредственная видимость. Категория синтаксических конструкций selector_name используется для обозначения контекстов, где требуется видимость, но не непосредственная видимость.
Существует два вида непосредственной видимости: непосредственная видимость и видимость через использование. Объявление непосредственно видимо в месте, если оно непосредственно видимо, потому что это место находится в пределах его непосредственной области видимости. Объявление видимо через использование, если оно непосредственно видимо из-за use_clause (см. 8.4). Оба условия могут применяться.
Объявление может быть скрытым, как от непосредственной видимости, так и от всей видимости, в определённых частях своей области видимости. В случае полного скрытия оно вообще не видно (ни с помощью direct_name, ни с помощью selector_name). В случае скрытия от непосредственной видимости теряется только непосредственная видимость; видимость с помощью selector_name всё ещё возможна.
Два или более объявления перегружены, если у них все одинаковое имя определения и есть место, где они все непосредственно видимы.
Объявления вызываемых сущностей (включая литералы перечислений) являются перегружаемыми, то есть перегрузка для них разрешена.
Два объявления являются гомографами, если у них одинаковое имя определения, и, если оба перегружаемые, их профили соответствуют типу. Внутреннее объявление скрывает любой внешний гомограф от непосредственной видимости.
Два гомографа обычно не допускаются сразу внутри одной декларативной области, если одно не переопределяет другое (см. Правила законности ниже). Единственные объявления, которые переопределяемы, — это неявные объявления предопределённых операторов и унаследованных примитивных подпрограмм. Объявление переопределяет другой гомограф, который встречается непосредственно в той же декларативной области в следующих случаях:
  • Объявление, которое не переопределяется, переопределяет переопределяемое, независимо от того, какое объявление появляется первым;
  • Неявное объявление унаследованного оператора переопределяет предопределённый оператор;
  • Неявное объявление унаследованной подпрограммы переопределяет предыдущее неявное объявление унаследованной подпрограммы.
  • Если два или более гомографа объявлены неявно в одном месте:
Если хотя бы одно из них является подпрограммой, которая не является ни пустой процедурой, ни абстрактной подпрограммой, и не требует переопределения (см. 3.9.3), то они переопределяют те, которые являются пустыми процедурами, абстрактными подпрограммами или требуют переопределения. Если остаётся более одного такого гомографа, который не переопределён таким образом, то все они скрыты от всей видимости.
В противном случае (все являются пустыми процедурами, абстрактными подпрограммами или требуют переопределения), то любая пустая процедура переопределяет все абстрактные подпрограммы и все подпрограммы, которые требуют переопределения; если остаётся более одного такого гомографа, который не переопределён таким образом, то если все они полностью соответствуют друг другу, один выбирается произвольно; если нет, то все они скрыты от всей видимости.
  • Для неявного объявления примитивной подпрограммы в обобщённом блоке существует копия этого объявления в экземпляре. Однако для каждого типа, объявленного во видимой части экземпляра, неявно объявляется новый набор примитивных подпрограмм. Эти новые объявления появляются непосредственно после объявления типа и переопределяют скопированные. Скопированные могут вызываться только внутри экземпляра; новые могут вызываться только извне экземпляра, хотя для помеченных типов тело нового может быть выполнено вызовом старого.
Объявление видно в своей области видимости, за исключением случаев, когда оно скрыто от всей видимости, следующим образом:
  • Переопределённое объявление скрыто от всей видимости в области видимости переопределяющего объявления.
  • Объявление скрыто от всей видимости до конца объявления, за исключением:
Для типа записи или расширения записи объявление скрыто от всей видимости только до ключевого слова record;
Для объявления пакета, обобщённого пакета объявления, тела подпрограммы или объявления функции выражения, объявление скрыто от всей видимости только до ключевого слова is объявления;
Для объявления задачи или защищённого объявления, объявление скрыто от всей видимости только до ключевого слова with объявления, если оно есть, или ключевого слова is объявления, если with нет.
  • Если завершение объявления является объявлением, то в области видимости завершения первое объявление скрыто от всей видимости. Аналогично, спецификация дискриминанта или спецификация параметра скрыта в области видимости соответствующей спецификации дискриминанта или спецификации параметра соответствующего завершения, или соответствующего оператора accept.
  • Объявление библиотечного модуля (включая объявление переименования библиотечного модуля) скрыто от всей видимости в местах вне его декларативной области, которые не находятся в области видимости nonlimited_with_clause, который его упоминает. Ограниченное представление библиотечного пакета скрыто от всей видимости в местах, которые не находятся в области видимости limited_with_clause, который его упоминает; кроме того, ограниченное представление скрыто от всей видимости в декларативной области пакета, а также в области видимости любого nonlimited_with_clause, который его упоминает. Там, где объявление ограниченного представления пакета видно, любое имя, обозначающее пакет, обозначает ограниченное представление, включая предоставленное переименованием пакета.
  • Для каждого объявления или переименования обобщённого модуля как потомка некоторого родительского обобщённого пакета существует соответствующее объявление, вложенное непосредственно в каждом экземпляре родителя. Такое вложенное объявление скрыто от всей видимости, за исключением мест, которые находятся в области видимости with_clause, который его упоминает.
Объявление с defining_identifier или defining_operator_symbol непосредственно видно (и, следовательно, непосредственно видимо) в своей непосредственной области видимости, за исключением случаев скрытия от непосредственной видимости, как следует:
  • Объявление скрыто от непосредственной видимости в непосредственной области видимости гомографа объявления, если гомограф встречается внутри внутренней декларативной области;
  • Объявление также скрыто от непосредственной видимости, где скрыто от всей видимости.
Определение атрибута или спецификация аспекта является видимым повсюду в своей области видимости.

Правила разрешения имён

direct_name должен разрешиться к обозначению непосредственно видимого объявления, чьё имя определения такое же, как у direct_name. selector_name должен разрешиться к обозначению видимого объявления, чьё имя определения такое же, как у selector_name.
Эти правила видимости и прямой видимости не применяются в блоке_контекста, имени_родительского_блока или директиве, которая появляется на месте единицы_компиляции. Для этих контекстов см. правила в 10.1.6, «Правила видимости на уровне среды».

Правила допустимости

Непереопределяемое объявление недопустимо, если существует омоним, расположенный непосредственно внутри той же области объявления, видимый в месте объявления и не скрытый от всей видимости непереопределяемым объявлением. Кроме того, расширение типа недопустимо, если где-либо в его непосредственной области оно имеет две видимые компоненты с одинаковым именем. Аналогично, блок_контекста для единицы компиляции недопустим, если он упоминает (в списке_связей) некоторый модуль библиотеки, и существует омоним этого модуля библиотеки, видимый в месте единицы компиляции, а также омоним и упомянутый модуль библиотеки объявлены непосредственно в той же области объявления. Эти правила также применяются к операциям диспетчеризации, объявленным в видимой части экземпляра универсального модуля. Однако они не применяются к другим перегружаемым объявлениям в экземпляре; такие объявления могут иметь профили соответствия типов в экземпляре, при условии, что соответствующие объявления в универсальном модуле не были типом соответствия.
ПРИМЕЧАНИЯ
5 Видимость для единиц компиляции следует из определения среды в 10.1.4, за исключением того, что необходимо применить список_связей для получения видимости к объявлению_модуля_библиотеки или объявлению_переименования_модуля_библиотеки.
6 В дополнение к правилам видимости, приведенным выше, значение появления прямого_имени или имени_селектора в заданном месте текста может зависеть от правил перегрузки (см. 8.6).
7 Не все контексты, где идентификатор, литерал_символа или символ_оператора разрешены, требуют видимости соответствующего объявления. Контексты, где видимость не требуется, определяются с использованием одной из этих трёх синтаксических категорий непосредственно в синтаксическом правиле, а не с использованием прямого_имени или имени_селектора.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API