def __init__(self, Origin): """Translate a ModeDescription into a real Mode. Here is the place were all rules of inheritance mechanisms and pattern precedence are applied. """ assert isinstance(Origin, ModeDescription) self.name = Origin.name self.sr = Origin.sr # 'SourceRef' -- is immutable base_mode_sequence = self.__determine_base_mode_sequence(Origin, [], []) # At least the mode itself must be there # The mode itself is base_mode_sequence[-1] assert len(base_mode_sequence) >= 1 \ and base_mode_sequence[-1].name == self.name # Collect Options # (A finalized Mode does not contain an option_db anymore). options_db = OptionDB.from_BaseModeSequence(base_mode_sequence) incidence_db = IncidenceDB.from_BaseModeSequence(base_mode_sequence) if ( E_IncidenceIDs.INDENTATION_DEDENT in incidence_db \ and E_IncidenceIDs.INDENTATION_N_DEDENT in incidence_db): error.log("After deriving from base mode, mode '%s' contains 'on_dedent'\n" % self.name + "and 'on_n_dedent' handler. Both are mutually exclusive.", self.sr) # Determine Line/Column Counter Database counter_db = options_db.value("counter") # Intermediate Step: Priority-Pattern-Terminal List (PPT list) # # The list is developed so that patterns can be sorted and code # fragments are prepared. self.__pattern_list, \ self.__terminal_db, \ self.__default_character_counter_required_f, \ self.__doc_history_deletion, \ self.__doc_history_reprioritization = \ patterns_and_terminals.get(base_mode_sequence, options_db, counter_db, incidence_db) # (*) Misc self.__abstract_f = self.__is_abstract(Origin.incidence_db, Origin.option_db) self.__base_mode_sequence = base_mode_sequence self.__entry_mode_name_list = options_db.value_list("entry") # Those can enter this mode. self.__exit_mode_name_list = options_db.value_list("exit") # This mode can exit to those. self.__incidence_db = incidence_db self.__counter_db = counter_db self.__on_after_match_code = incidence_db.get(E_IncidenceIDs.AFTER_MATCH) self.__indentation_setup = options_db.value("indentation")
def __init__(self, Origin): """Translate a ModeDescription into a real Mode. Here is the place were all rules of inheritance mechanisms and pattern precedence are applied. """ assert isinstance(Origin, ModeDescription) self.name = Origin.name self.sr = Origin.sr # 'SourceRef' -- is immutable base_mode_sequence = self.__determine_base_mode_sequence(Origin, [], []) # At least the mode itself must be there # The mode itself is base_mode_sequence[-1] assert len(base_mode_sequence) >= 1 \ and base_mode_sequence[-1].name == self.name # Collect Options # (A finalized Mode does not contain an option_db anymore). options_db = OptionDB.from_BaseModeSequence(base_mode_sequence) incidence_db = IncidenceDB.from_BaseModeSequence(base_mode_sequence) # Determine Line/Column Counter Database counter_db = options_db.value("counter") # Intermediate Step: Priority-Pattern-Terminal List (PPT list) # # The list is developed so that patterns can be sorted and code # fragments are prepared. self.__pattern_list, \ self.__terminal_db, \ self.__default_character_counter_required_f, \ self.__doc_history_deletion, \ self.__doc_history_reprioritization = \ patterns_and_terminals.get(base_mode_sequence, options_db, counter_db, incidence_db) # (*) Misc self.__abstract_f = self.__is_abstract(Origin.incidence_db, Origin.option_db) self.__base_mode_sequence = base_mode_sequence self.__entry_mode_name_list = options_db.value_list("entry") # Those can enter this mode. self.__exit_mode_name_list = options_db.value_list("exit") # This mode can exit to those. self.__incidence_db = incidence_db self.__counter_db = counter_db self.__on_after_match_code = incidence_db.get(E_IncidenceIDs.AFTER_MATCH) self.__indentation_setup = options_db.value("indentation")
def finalize(self, ModePrepPrepDb): """REQUIRES: All Mode_PrepPrep-s have been defined. TASK: Collect loopers, options, and incidence_db from base mode list. Finalize all patterns and loopers! """ self._check_inheritance_relationships(ModePrepPrepDb) base_mode_name_sequence = \ self._determine_base_mode_name_sequence(ModePrepPrepDb) assert len(base_mode_name_sequence) >= 1 assert base_mode_name_sequence[-1] == self.name base_mode_sequence = [ ModePrepPrepDb[name] for name in base_mode_name_sequence ] # Collect Options # (A finalized Mode does not contain an option_db anymore). collected_options_db = OptionDB.from_BaseModeSequence( base_mode_sequence) inheritable, \ exit_mode_name_list, \ entry_mode_name_list, \ loopers, \ ca_map = collected_options_db.finalize() abstract_f = (inheritable == "only") collected_incidence_db = IncidenceDB.from_BaseModeSequence( base_mode_sequence) pap_list = [ PatternActionPair(pap.pattern().finalize(ca_map), pap.action()) for pap in self.pattern_action_pair_list ] # At this stage, no information is aggregated from base types. return Mode_Prep(self.name, self.sr, base_mode_name_sequence, pap_list, loopers, abstract_f, collected_incidence_db, ca_map, entry_mode_name_list, exit_mode_name_list, self.deletion_info_list, self.reprioritization_info_list)