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

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, который упоминает дочерний элемент.
Объявление с идентификатором определения или символом оператора определения непосредственно видимо (и, следовательно, непосредственно видимо) в его непосредственной области видимости, за исключением случаев, когда оно скрыто от непосредственной видимости, как следует из:
  • Объявление скрыто от непосредственной видимости внутри непосредственной области видимости гомографа объявления, если гомограф находится в внутренней области объявления;
  • Объявление также скрыто от непосредственной видимости, где скрыто от всей видимости.
Определение атрибута видимо повсюду в его области видимости.

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

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