# coding: utf8
"""
Модуль обеспечивает анализ секции типов.
"""

if True:
	from .модАнализБаза import тАнализБаза
	from .пакАнализТипы import тАнализТип
	from пакОберон.пакКомпилятор.пакСущность.пакОшибка import тОшибка

class тАнализТипы(тАнализБаза):
	def __init__(сам, пОберон, пДанные):
		сам.__оберон = пОберон
		сам.__конс = пОберон.конс
		сам.__конс.Отладить("тАнализТипы.__init__()")

		сам.ош = тОшибка(пОберон, "тАнализТипы")

		тАнализБаза.__init__(сам, пОберон, пДанные)
		if сам.ошб.бВнутр:
			сам.ош.Внутр("__init__()",  "При создании предка тАнализБаза")
			return
		сам.__типы:dict = {} # Содержит описания типов
		сам.__Обработать()

	def __Слово_TYPE_Обрезать(сам):
		"""
		Первое слово в списке слов должно быть TYPE.
		Если нет -- значит в исходнике нет описания типов.
		Возвращает результат встречи с TYPE
		"""
		слово = сам.слова_секции[0]
		if слово.строка =='TYPE':
			# укоротить типы
			слова = {}
			for счёт in range(1, len(сам.слова_секции)):
				слово = сам.слова_секции[счёт]
				слова[счёт-1] = слово
			сам.слова_секции = {}
			сам.слова_секции = слова
			сам.бСекцияЕсть = True
		else:
			сам.ош.Исх("__Слово_TYPE_Обрезать()", "Секция должна начинаться с TYPE" + слово.стрИсх)
			return

	def __Обработать(сам):
		"""
		Вся обработка типов заключена здесь.
		"""
		сам.__Слово_TYPE_Обрезать()
		while len(сам.слова_секции) > 1:
			парам = {}
			парам['слова'] = сам.слова_секции
			парам['секция']= "анализ"
			парам['имя'] = ""
			парам['бЭкспорт'] = False
			тип = тАнализТип(сам.__оберон, парам)
			if тип.ош.бВнутр:
				стр.ош.Внутр("__Обработать()", "При создании тАнализТип")
				return
			if тип.ош.бИсх:
				сам.ош.Исх("__Обработать()", "При создании тАнализТип")
				return
			сам.слова_секции = тип.слова_секции
			сам.__типы[len(сам.__типы)] = тип

	def ПроцСекции_Печать(сам):
		сам.__конс.Печать("Всего слов в секции типов:"+str(len(сам.слова_секции)))
		сам.__конс.Печать("Типы секции: всего типов ="+str(len(сам.__типы)))
		for ключ in сам.__типы:
			сам.__типы[ключ].Паспорт_Печать()
		print

	@property
	def типы(сам)->dict:
		return сам.__типы
