class CL_ABAP_COMPILER definition
  public
  create public .

public section.
*"* public components of class CL_ABAP_COMPILER
*"* do not include other source files here!!!
  interface IF_ABAP_COMPILER load .

  interfaces IF_SERIALIZABLE_OBJECT .

  constants GRADE_COMPONENTS type SCR_GRADE value '2'. "#EC NOTEXT
  constants GRADE_DEFINITION type SCR_GRADE value '0'. "#EC NOTEXT
  constants GRADE_DIRECT type SCR_GRADE value '1'. "#EC NOTEXT
  constants GRADE_PROPERTIES type SCR_GRADE value '3'. "#EC NOTEXT
  constants LEVEL_TYPE_DEFINE type SYCHAR01 value 'D'. "#EC NOTEXT
  constants LEVEL_TYPE_PROGRAM type SYCHAR01 value 'P'. "#EC NOTEXT
  constants LEVEL_TYPE_RMAC type SYCHAR01 value 'R'. "#EC NOTEXT
  constants LOC_CLASS type SCR_LOCATION value '1'. "#EC NOTEXT
  constants LOC_DDIC type SCR_LOCATION value '3'. "#EC NOTEXT
  constants LOC_PREDEF type SCR_LOCATION value '4'. "#EC NOTEXT
  constants LOC_PROGRAM type SCR_LOCATION value '0'. "#EC NOTEXT
  constants LOC_SHARED type SCR_LOCATION value '6'. "#EC NOTEXT
  constants LOC_SYSTEM type SCR_LOCATION value '5'. "#EC NOTEXT
  constants LOC_TYPE_POOL type SCR_LOCATION value '2'. "#EC NOTEXT
  constants MAX_TIME type I value 999999999. "#EC NOTEXT
  constants MODE1_NONE type SCR_MODE1 value ' '. "#EC NOTEXT
  constants MODE1_DEFAULT type SCR_MODE1 value 'D'. "#EC NOTEXT
  constants MODE1_GLOBAL type SCR_MODE1 value '1'. "#EC NOTEXT
  constants MODE1_SUBMIT type SCR_MODE1 value '0'. "#EC NOTEXT
  constants MODE1_TEST type SCR_MODE1 value 'T'. "#EC NOTEXT
  constants MODE1_ENH_STAT type SCR_MODE1 value 'S'. "#EC NOTEXT
  constants MODE1_ENH_DYN type SCR_MODE1 value 'D'. "#EC NOTEXT
  constants MODE1_ENH_ANY type SCR_MODE1 value 'A'. "#EC NOTEXT
  constants MODE1_CHAIN_METH type SCR_MODE1 value 'm'. "#EC NOTEXT
  constants MODE1_CHAIN_ATTR type SCR_MODE1 value 'a'. "#EC NOTEXT
  constants MODE2_ENH_POINT type SCR_MODE2 value 'P'. "#EC NOTEXT
  constants MODE2_ENH_SECTION type SCR_MODE2 value 'S'. "#EC NOTEXT
  constants TAG_ANY type SCR_TAG value 'XX'. "#EC NOTEXT
  constants TAG_AT_LINE_SELECTION type SCR_TAG value 'AL'. "#EC NOTEXT
  constants TAG_AT_PF type SCR_TAG value 'AF'. "#EC NOTEXT
  constants TAG_AT_SELECTION_SCREEN type SCR_TAG value 'AS'. "#EC NOTEXT
  constants TAG_AT_SELECTION_SCREEN_BLOCK type SCR_TAG value 'AB'. "#EC NOTEXT
  constants TAG_AT_SELECTION_SCREEN_EXIT type SCR_TAG value 'AX'. "#EC NOTEXT
  constants TAG_AT_SELECTION_SCREEN_HELP type SCR_TAG value 'AH'. "#EC NOTEXT
  constants TAG_AT_SELECTION_SCREEN_ON type SCR_TAG value 'AN'. "#EC NOTEXT
  constants TAG_AT_SELECTION_SCREEN_ON_END type SCR_TAG value 'AE'. "#EC NOTEXT
  constants TAG_AT_SELECTION_SCREEN_OUTPUT type SCR_TAG value 'AP'. "#EC NOTEXT
  constants TAG_AT_SELECTION_SCREEN_RADIO type SCR_TAG value 'AR'. "#EC NOTEXT
  constants TAG_AT_SELECTION_SCREEN_VALUE type SCR_TAG value 'AV'. "#EC NOTEXT
  constants TAG_AT_USER_COMMAND type SCR_TAG value 'AU'. "#EC NOTEXT
  constants TAG_AUTHORITY_OBJECT type SCR_TAG value 'AO'. "#EC NOTEXT
  constants TAG_BLOCK type SCR_TAG value 'BL'. "#EC NOTEXT
  constants TAG_BREAK_POINT type SCR_TAG value 'BR'. "#EC NOTEXT
  constants TAG_CLASS_POOL type SCR_TAG value 'CP'. "#EC NOTEXT
  constants TAG_COMMON_PART type SCR_TAG value 'CP'. "#EC NOTEXT
  constants TAG_COMPONENT type SCR_TAG value 'CO'. "#EC NOTEXT
  constants TAG_CONTROL type SCR_TAG value 'CT'. "#EC NOTEXT
  constants TAG_CUST_FUNCTION type SCR_TAG value 'CF'. "#EC NOTEXT
  constants TAG_DATA type SCR_TAG value 'DA'. "#EC NOTEXT
  constants TAG_DIALOG type SCR_TAG value 'DI'. "#EC NOTEXT
  constants TAG_END_OF_EDITING type SCR_TAG value 'E0'. "#EC NOTEXT
  constants TAG_END_OF_SELECTION type SCR_TAG value 'E1'. "#EC NOTEXT
  constants TAG_ENHANCEMENT_EXIT type SCR_TAG value 'EX'. "#EC NOTEXT
  constants TAG_ENHANCEMENT_IMPL type SCR_TAG value 'EI'. "#EC NOTEXT
  constants TAG_ENHANCEMENT_SPOT type SCR_TAG value 'ES'. "#EC NOTEXT
  constants TAG_ENHANCEMENT type SCR_TAG value 'EN'. "#EC NOTEXT
  constants TAG_EVENT type SCR_TAG value 'EV'. "#EC NOTEXT
  constants TAG_FORM type SCR_TAG value 'FO'. "#EC NOTEXT
  constants TAG_FUNCTION type SCR_TAG value 'FU'. "#EC NOTEXT
  constants TAG_FUNCTION_POOL type SCR_TAG value 'FP'. "#EC NOTEXT
  constants TAG_GET type SCR_TAG value 'GE'. "#EC NOTEXT
  constants TAG_GET_LATE type SCR_TAG value 'GL'. "#EC NOTEXT
  constants TAG_GLOBAL_INTF type SCR_TAG value 'GI'. "#EC NOTEXT
  constants TAG_GROUP type SCR_TAG value 'GR'. "#EC NOTEXT
  constants TAG_INCLUDE type SCR_TAG value 'IC'. "#EC NOTEXT
  constants TAG_INFOTYPE type SCR_TAG value 'IT'. "#EC NOTEXT
  constants TAG_INITIALIZATION type SCR_TAG value 'E2'. "#EC NOTEXT
  constants TAG_INTERFACE type SCR_TAG value 'IN'. "#EC NOTEXT
  constants TAG_INTF_POOL type SCR_TAG value 'IP'. "#EC NOTEXT
  constants TAG_LINE_OF type SCR_TAG value 'LO'. "#EC NOTEXT
  constants TAG_LOAD_OF_PROGRAM type SCR_TAG value 'E3'. "#EC NOTEXT
  constants TAG_MACRO type SCR_TAG value 'MA'. "#EC NOTEXT
  constants TAG_MATCHCODE type SCR_TAG value 'MC'. "#EC NOTEXT
  constants TAG_MESSAGE type SCR_TAG value 'MG'. "#EC NOTEXT
  constants TAG_MESSAGE_ID type SCR_TAG value 'MI'. "#EC NOTEXT
  constants TAG_MESSAGE_NUMBER type SCR_TAG value 'MN'. "#EC NOTEXT
  constants TAG_MESSAGE_TYPE type SCR_TAG value 'MT'. "#EC NOTEXT
  constants TAG_METHOD type SCR_TAG value 'ME'. "#EC NOTEXT
  constants TAG_MODULE_IN type SCR_TAG value 'MX'. "#EC NOTEXT
  constants TAG_MODULE_OUT type SCR_TAG value 'MO'. "#EC NOTEXT
  constants TAG_PF_STATUS type SCR_TAG value 'PF'. "#EC NOTEXT
  constants TAG_PREDEF_DATA type SCR_TAG value 'PD'. "#EC NOTEXT
  constants TAG_PREDEF_TYPE type SCR_TAG value 'PT'. "#EC NOTEXT
  constants TAG_PROGRAM type SCR_TAG value 'PR'. "#EC NOTEXT
  constants TAG_REF type SCR_TAG value 'RE'. "#EC NOTEXT
  constants TAG_RMAC_MACRO type SCR_TAG value 'RM'. "#EC NOTEXT
  constants TAG_SCREEN type SCR_TAG value 'SC'. "#EC NOTEXT
  constants TAG_SECTION type SCR_TAG value 'SE'. "#EC NOTEXT
  constants TAG_SET_GET_ID type SCR_TAG value 'SG'. "#EC NOTEXT
  constants TAG_SHARED_DATA type SCR_TAG value 'SD'. "#EC NOTEXT
  constants TAG_SHARED_TYPE type SCR_TAG value 'ST'. "#EC NOTEXT
  constants TAG_START_OF_EDITING type SCR_TAG value 'E4'. "#EC NOTEXT
  constants TAG_START_OF_SELECTION type SCR_TAG value 'E5'. "#EC NOTEXT
  constants TAG_SYSTEM_TYPE type SCR_TAG value 'YT'. "#EC NOTEXT
  constants TAG_TABLE_KEY type SCR_TAG value 'TK'. "#EC NOTEXT
  constants TAG_TITLE type SCR_TAG value 'TI'. "#EC NOTEXT
  constants TAG_TOP_OF_PAGE type SCR_TAG value 'E6'. "#EC NOTEXT
  constants TAG_TOP_OF_PAGE_LINE_SELECTION type SCR_TAG value 'E7'. "#EC NOTEXT
  constants TAG_TRANSACTION type SCR_TAG value 'TA'. "#EC NOTEXT
  constants TAG_TRANSFORMATION type SCR_TAG value 'TR'. "#EC NOTEXT
  constants TAG_TYPE type SCR_TAG value 'TY'. "#EC NOTEXT
  constants TAG_TYPE_OF type SCR_TAG value 'TO'. "#EC NOTEXT
  constants TAG_TYPE_POOL type SCR_TAG value 'TP'. "#EC NOTEXT
  constants TAG_UNKNOWN type SCR_TAG value '??'. "#EC NOTEXT
  constants TAG_VALUE type SCR_TAG value 'VA'. "#EC NOTEXT

  class-methods CLEAR_CACHE .
  methods CONSTRUCTOR
    importing
      !P_NAME type PROGRAM
      !P_INCLUDE type PROGRAM optional
      !P_INCLUDES type SCR_PROGRAMS optional
      !P_SUBSTITUTIONS type SREPTAB optional
      !P_ONLY_INTERFACE type SYCHAR01 optional
      !P_IGNORE_ENHANCEMENTS type SYCHAR01 optional
      !P_TEST_MODE type SYCHAR01 optional
      !P_NO_PACKAGE_CHECK type SYCHAR01 default ' '
      !P_ENHANCEMENT_IMPLS type SCR_ENHANCEMENT_IMPLS optional
      !P_TEST_MODE_2 type SYCHAR01 optional
      !P_TEST_MODE_3 type SYCHAR01 optional
      !P_WITHOUT_NESTED_ENHANCEMENTS type SYCHAR01 default ' '
    exceptions
      PROGRAM_NAME_EMPTY .
  class-methods CREATE
    importing
      !P_NAME type PROGRAM
      !P_INCLUDE type PROGRAM optional
      !P_INCLUDES type SCR_PROGRAMS optional
      !P_SUBSTITUTIONS type SREPTAB optional
      !P_ONLY_INTERFACE type SYCHAR01 optional
      !P_NO_PACKAGE_CHECK type SYCHAR01 optional
    returning
      value(P_RESULT) type ref to CL_ABAP_COMPILER .
  type-pools SYNT .
  methods GET_ALL
    exporting
      !P_RESULT type SCR_REFS
      !P_ERRORS type SYNT_ERRORS .
  methods GET_ALL_REFS
    importing
      !P_LOCAL type SYCHAR01
      !P_TESTCODE type SYCHAR01 default ' '
      !P_TYPES type SCR_RTAGS optional
      !P_GRADES type SCR_GRADES optional
      !P_NO_INCLUDES type SYCHAR01 optional
      !P_EXTENDED type SYCHAR01 optional
      !P_INTERNAL type SYCHAR01 optional
    exporting
      !P_RESULT type SCR_GLREFS
      !P_ERROR type SYCHAR01
      !P_ERRORS type SCR_ERRORS
      !P_ABORT type SYCHAR01 .
  methods GET_CHECK_INFOS
    exporting
      !P_GLOBAL_CLASSES type SYNT_MAP
      !P_INCLUDE type PROGRAM
      !P_RABAXID type S380ERRID
      !P_RAW_MESSAGES type SYNT_IT_TRMSG_RAW
      !P_LONGTEXT type RSLINLTAB
      !P_INCLUDES type SYNT_INCLUDES
      !P_COMMENTS type SYNT_COMMENT
      !P_SET_EXTENDED_STMTS type SYNT_EXT_CHECK
      !P_PROG_INTERVALS type SYNT_INTERVAL
      !P_CROSSREF type SYNT_CROSSREF
      !P_TYPES type SYNT_TYPE_OBJ
      !P_TYPE_CHILDS type SYNT_TYPE_CHILDS
      !P_DATAS type SYNT_DATA_OBJ
      !P_DPARS type SYNT_DPAR
      !P_ENVS type SYNT_ENV
      !P_COMPS type SYNT_COMP_OBJ
      !P_XCROSS type SYNT_XCROSS
      !P_LEVELS type SYNT_XCROSS_LEVEL
      !P_STMNTS type SYNT_XCROSS_STMNT
      !P_PREDEF_TYPES type SYNT_MAP
      !P_PREDEF_DATAS type SYNT_MAP
      !P_GLOBAL_TYPES type SYNT_MAP
      !P_GLOBAL_DATAS type SYNT_MAP
      !P_FORMS type SYNT_MAP
      !P_FUNCTIONS type SYNT_MAP
      !P_TYPEPOOLS type SYNT_MAP
      !P_CLASSES type SYNT_MAP
      !P_INTFS type SYNT_MAP
      !P_GLOBAL_INTFS type SYNT_MAP
      !P_SUBRC type SY-SUBRC
      !P_SLIN_DATAS type SYNT_DATA_OBJ
      !P_SLIN_TYPES type SYNT_TYPE_OBJ
      !P_WARNINGS type SYNT_ERRORS
      !P_INFOS type SYNT_ERRORS
      !P_OBJECT_USAGE type SYNT_EXT_OBJ_USE
      !P_ERRORS type SCR_ERRORS .
  methods GET_ENHANCEMENT_TEXT
    importing
      !P_FULL_NAME type STRING
      !P_LOCAL type SYCHAR01
    exporting
      !P_TEXT type STRING
    exceptions
      INVALID_FULL_NAME .
  methods GET_FULL_NAMES_FOR_RANGE
    importing
      !P_INCLUDE type PROGRAM
      !P_LINE_FROM type I
      !P_COLUMN_FROM type I default 0
      !P_LINE_TO type I
      !P_COLUMN_TO type I default 255
    exporting
      !P_NAMES_TAGS_GRADES type SCR_NAMES_TAGS_GRADES
    exceptions
      INCLUDE_NOT_FOUND
      PROGRAM_FATAL_SYNTAX_ERROR .
  methods GET_FULL_NAME_FOR_POSITION
    importing
      !P_INCLUDE type PROGRAM
      !P_LINE type I
      !P_COLUMN type I
      !P_CREATE_INDEX type SYCHAR01 default ' '
    exporting
      !P_FULL_NAME type STRING
      !P_TAG type SCR_TAG
      !P_GRADE type SCR_GRADE
      !P_ERROR type SYCHAR01
      !P_ABORT type SYCHAR01
    exceptions
      INCLUDE_NOT_FOUND
      OBJECT_NOT_FOUND
      PROGRAM_FATAL_SYNTAX_ERROR .
  methods GET_SINGLE_REF
    importing
      !P_FULL_NAME type STRING optional
      !P_GRADE type SCR_GRADE optional
      !P_ONLY_FIRST type SYCHAR01 optional
      !P_FULL_NAMES type SCR_NAMES_GRADES optional
      !P_EXTENDED type SYCHAR01 optional
    exporting
      !P_RESULT type SCR_REFS
      !P_ERRORS type SCR_ERRORS
      !P_ERROR type SYCHAR01
      !P_ABORT type SYCHAR01
      !P_INDEX_FULL_NAME type I
    exceptions
      SYNTAX_ERROR
      OBJECT_NOT_FOUND
      REF_NOT_FOUND
      PARAMETER_ERROR .
  methods GET_SYMBOL_ENTRY
    importing
      !P_FULL_NAME type STRING
    returning
      value(P_RESULT) type ref to CL_ABAP_COMP_SYMBOL .
  methods GET_TAG_OF_FULL_NAME
    importing
      !P_FULL_NAME type STRING
    returning
      value(P_TAG) type SCR_TAG
    exceptions
      INCLUDE_NOT_FOUND
      OBJECT_NOT_FOUND
      PROGRAM_FATAL_SYNTAX_ERROR .
  methods INCLUDE_HAS_CHANGED
    importing
      !P_INCLUDE type PROGRAM .
  class-methods SET_DEFAULT
    importing
      !P_WARNINGS type SYCHAR01 optional
      !P_INFOS type SYCHAR01 optional
      !P_LONGTEXT type SYCHAR01 optional
      !P_COMMENTS type SYCHAR01 optional .
  methods SET_INCLUDES
    importing
      !P_INCLUDE type PROGRAM optional
      !P_INCLUDES type SCR_PROGRAMS optional .
  methods SET_INCLUDE_SOURCE
    importing
      !P_NAME type PROGRAM
      !P_REF_SOURCE type ref to SCR_INCLUDE optional
      !P_REF_TRDIR type ref to TRDIR optional
    exceptions
      INCLUDE_SOURCE_ALREADY_SET
      INVALID_INCLUDE_NAME .
  class-methods TEST_CHECK
    importing
      !P_NAME type PROGRAM
      !P_TRYS type I
    exporting
      !P_TIME type I
      !P_TRACE_LIST type SCR_TRACE .
  methods TEST_FULL_NAME
    importing
      !P_FULL_NAME type STRING
      !P_EXTERN type SYCHAR01 optional
    returning
      value(P_RESULT) type SYCHAR01
    exceptions
      PROGRAM_FATAL_SYNTAX_ERROR .
  class-methods TEST_SCAN
    importing
      !P_NAME type PROGRAM
      !P_TRYS type I
      !P_SLIN type SYCHAR01
    exporting
      !P_TIME type I
      !P_TRACE_LIST type SCR_TRACE .
  class-methods TEST_SCAN_INCLUDE
    importing
      !P_NAME type PROGRAM
      !P_TRYS type I
      !P_SLIN type SYCHAR01
      !P_INCLUDE type PROGRAM
    exporting
      !P_TIME type I
      !P_TRACE_LIST type SCR_TRACE .
  class-methods CHECK_FEATURE
    importing
      !KIND type SYCHAR01 default ' '
      !NAME type STRING default ``
    exporting
      !AVAILABLE type SYCHAR01
      !NESTED_ENHANCEMENTS type SYCHAR01 .
  class-methods GET_INTERNAL_PRAGMAS
    exporting
      !PRAGMAS type SCR_PRAGMAS .
  methods GET_TYPE_CODE
    importing
      !P_TYPE type ref to CL_ABAP_COMP_TYPE
    exporting
      !P_NAME type STRING
      !P_TYPE_OPERATOR type STRING
    exceptions
      INVALID_TYPE .
protected section.
*"* protected components of class CL_ABAP_COMPILER
*"* do not include other source files here!!!
private section.
*"* private components of class CL_ABAP_COMPILER
*"* do not include other source files here!!!

  types:
    begin of T_STRUCT_VISITED,
      OBJ_ID   type I,
      OBJ_KIND type SYCHAR01,
      DEF      type SYCHAR01,
      GRADE    type SCR_GRADE,
      MODE1    type SYCHAR01,
      INCLUDE  type PROGRAM,
   end   of T_STRUCT_VISITED .
  types T_MODE type SYCHAR01 .
  types:
    T_SOURCE type standard table of STRING
                 with non-unique default key .
  types:
    begin of T_XCROSS_NAME_1,
    FULL_NAME type STRING,
    NAME      type STRING,
    DEF       type SYNT_STRUC_XCROSS-DEF,
    GRADE     type SCR_GRADE,
    ROLE      type SYNT_STRUC_XCROSS-ROLE,
  end   of T_XCROSS_NAME_1 .
  types:
    begin of T_XCROSS_NAME_2,
    FULL_NAME type STRING,
    NAME_1    type STRING,
    NAME_2    type STRING,
    DEF       type SYNT_STRUC_XCROSS-DEF,
    GRADE     type SCR_GRADE,
    ROLE      type SYNT_STRUC_XCROSS-ROLE,
  end   of T_XCROSS_NAME_2 .
  types:
    begin of T_XCROSS_ID,
    FULL_NAME type STRING,
    OBJ_ID    type SYNT_STRUC_XCROSS-OBJ_ID,
    OBJ_ID_P  type SYNT_STRUC_XCROSS-OBJ_ID,
    OBJ_KIND  type SYNT_STRUC_XCROSS-OBJ_KIND,
    DEF       type SYNT_STRUC_XCROSS-DEF,
    GRADE     type SCR_GRADE,
    ROLE      type SYNT_STRUC_XCROSS-ROLE,
  end   of T_XCROSS_ID .
  types:
    begin of T_ID_GRADE,
      FULL_NAME    type STRING,
      COMP_NAME    type STRING,
      ID           type I,
      GRADE        type SCR_GRADE,
      GRADE_NEEDED type SCR_GRADE,
      TAG          type SCR_TAG,
    end   of T_ID_GRADE .
  types:
    T_ID_GRADES type sorted table of T_ID_GRADE with unique key ID GRADE GRADE_NEEDED FULL_NAME .
  types:
    begin of T_XCROSS_IDS,
      IDS_ANY  type sorted table of T_XCROSS_ID      with unique key      OBJ_KIND OBJ_ID OBJ_ID_P  FULL_NAME GRADE DEF,
      STRINGS  type sorted table of T_XCROSS_NAME_1  with unique key ROLE NAME                      FULL_NAME GRADE DEF,
      IDS      type sorted table of T_XCROSS_ID      with unique key ROLE OBJ_KIND OBJ_ID OBJ_ID_P  FULL_NAME GRADE DEF,
      FIELDS   type sorted table of T_XCROSS_NAME_1  with unique key ROLE NAME                      FULL_NAME GRADE DEF,
      SCREENS  type sorted table of T_XCROSS_NAME_2  with unique key ROLE NAME_1 NAME_2             FULL_NAME GRADE DEF,
      BRACKETS type sorted table of T_XCROSS_NAME_1  with unique key ROLE NAME                      FULL_NAME GRADE DEF,
      MESSAGES type sorted table of T_XCROSS_NAME_2  with unique key ROLE NAME_1 NAME_2             FULL_NAME GRADE DEF,
      FORMS    type sorted table of T_XCROSS_NAME_2  with unique key ROLE NAME_1 NAME_2             FULL_NAME GRADE DEF,
      PFSTATS  type sorted table of T_XCROSS_NAME_2  with unique key ROLE NAME_1 NAME_2             FULL_NAME GRADE DEF,
      GLOBSTR  type sorted table of T_XCROSS_NAME_1  with unique key ROLE NAME                      FULL_NAME GRADE DEF,
      T_ID_GRADES type T_ID_GRADES,
      K_ID_GRADES type T_ID_GRADES,
      D_ID_GRADES type T_ID_GRADES,
      E_ID_GRADES type T_ID_GRADES,
      I_ID_GRADES type sorted table of T_ID_GRADE with unique key ID GRADE FULL_NAME COMP_NAME,
    end   of T_XCROSS_IDS .
  types:
    begin of T_STRUCT_XCROSS_IDS,
      FULL_NAME   type STRING,
      GRADE       type SCR_GRADE,
      XYCROSS_IDS type T_XCROSS_IDS,
    end   of T_STRUCT_XCROSS_IDS .
  types:
    begin of T_STRUCT_LEVEL_REF,
      LEVEL type I,
      REF   type ref to CL_ABAP_SOURCE_INFO,
    end   of T_STRUCT_LEVEL_REF .
  types:
    begin of T_STRUCT_STMNT_REF,
    STMNT type I,
    REF   type ref to CL_ABAP_STATEMENT_INFO,
  end   of T_STRUCT_STMNT_REF .
  types:
    T_IDS type range of I .
  types:
    T_R_PROGRAMS type range of PROGRAM .
  types:
    begin of T_STRUCT_SYMBOL_CACHE,
      FULL_NAME type STRING,
      SYMBOL    type ref to CL_ABAP_COMP_SYMBOL,
    end   of T_STRUCT_SYMBOL_CACHE .
  types:
    begin of T_POSITION,
      INCLUDE type STRING,
      LINE    type I,
      TABIX type I,
    end   of T_POSITION .

  constants C_MAX_LEVEL type I value 100. "#EC NOTEXT
  type-pools SYNT .
  data CLASSES type SYNT_MAP .
  data COMMENTS type SYNT_COMMENT .
  data COMPS type SYNT_COMP_OBJ .
  class-data CURR_NAME type PROGRAM .
  class-data CURR_REF type ref to CL_ABAP_COMPILER .
  data DATAS type SYNT_DATA_OBJ .
  class-data DEF_COMMENTS type SYCHAR04 .
  class-data DEF_INFOS type SYCHAR04 .
  class-data DEF_LONGTEXT type SYCHAR04 .
  class-data DEF_WARNINGS type SYCHAR04 .
  data DPARS type SYNT_DPAR .
  data ENVS type SYNT_ENV .
  data ERRORS type SYNT_ERRORS .
  data EXTENDED type SYCHAR01 .
  data FIND_ERROR type SCR_TAG value SPACE. "#EC NOTEXT .
  data FORMS type SYNT_MAP .
  data FORM_FORM type STRING .
  data FORM_STMNT type I .
  data FUNCTIONS type SYNT_MAP .
  data GLOBAL_CLASSES type SYNT_MAP .
  data GLOBAL_DATAS type SYNT_MAP .
  data GLOBAL_INTFS type SYNT_MAP .
  data GLOBAL_MSG_ID type STRING .
  data GLOBAL_TYPES type SYNT_MAP .
  data GRADES type SCR_GRADES .
  constants GRADE_DEFINITION_INTF type SCR_GRADE value '5'. "#EC NOTEXT
  constants GRADE_DEF_TO_DIRECT type SCR_GRADE value '4'. "#EC NOTEXT
  constants GRADE_DEF_TO_PROPERTIES type SCR_GRADE value '6'. "#EC NOTEXT
  data ID_COMMENTS type SYCHAR04 .
  data ID_CROSSREF type SYCHAR04 .
  data ID_ERRORS type SYCHAR04 .
  data ID_IGNORE_ENH type SYCHAR04 .
  data ID_INCLUDES type SYCHAR04 .
  data ID_INFOS type SYCHAR04 .
  data ID_LONGTEXT type SYCHAR04 .
  data ID_PROG_INTERVALS type SYCHAR04 .
  data ID_RAW_MESSAGES type SYCHAR04 .
  data ID_SET_EXTENDED_STMTS type SYCHAR04 .
  data ID_SLIN_TYPES type SYCHAR04 .
  data ID_TEST_1 type SYCHAR04 .
  data ID_USAGE type SYCHAR04 .
  data ID_WARNINGS type SYCHAR04 .
  data INCLUDES type T_R_PROGRAMS .
  data INCLUDE_CHECKSUM type SCR_CRC64 .
  data INCLUDE_NAME type PROGRAM .
  data INCL_SUBSTITUTIONS type SREPTAB .
  data INFOS type SYNT_ERRORS .
  data INTFS type SYNT_MAP .
  data IS_FOR_PROGRAM type SYCHAR01 .
  data LEVELS type SYNT_XCROSS_LEVEL .
  data:
    LEVEL_REF  type hashed table of T_STRUCT_LEVEL_REF
             with unique key LEVEL .
  data LONGTEXT type RSLINLTAB .
  data MACRO_COLUMN type I .
  data MACRO_LINE type I .
  data MACRO_NAME type STRING .
  data MACRO_STMNT type I .
  data MESSAGE_ID type STRING .
  data MESSAGE_STMNT type I .
  data NO_INCLUDES type SYCHAR01 .
  data NO_PACKAGE_CHECK type SYCHAR01 .
  data OBJECT_USAGE type SYNT_EXT_OBJ_USE .
  data ONLY_INTERFACE type SYCHAR01 .
  data PCOMMENTS type SYNT_PCOMMENT .
  data PF_STATUS type STRING .
  data PF_STATUS_STMNT type I .
  data:
    POSITIONS type hashed table of T_POSITION with unique key INCLUDE LINE .
  data POSITION_INDEX type SYCHAR01 .
  data PREDEF_DATAS type SYNT_MAP .
  data PREDEF_TYPES type SYNT_MAP .
  constants PREFIX_FOR_TAGS type SYCHAR01 value '\'. "#EC NOTEXT
  data PROGRAM type PROGRAM .
  data PROGRAM_PROGRAM type STRING .
  data PROGRAM_STMNT type I .
  data REFS_FORM type STRING .
  data REFS_ID type STRING .
  data REFS_LENGTH type I .
  data REFS_MSG_ID type SY-MSGNO .
  data REFS_NAME type STRING .
  data REFS_NUMBER type STRING .
  data REFS_OBJ_ID type I .
  data REFS_PROGRAM type STRING .
  data:
    REFS_RESULT  type line of SCR_GLREFS .
  data REFS_SCREEN type D020S-DNUM .
  data REFS_TITLE type GUI_TITLE .
  data REFS_VISITED type T_STRUCT_VISITED .
  data REF_SOURCE type ref to SCR_INCLUDE .
  data REF_TRDIR type ref to TRDIR .
  data SCAN_GRADES type SCR_GRADES .
  data SCAN_INCLUDES type T_R_PROGRAMS .
  data SCREEN_SCREEN type STRING .
  data SCREEN_STMNT type I .
  data SLIN_CROSSREF type SYNT_CROSSREF .
  data SLIN_DATAS type SYNT_DATA_OBJ .
  data SLIN_INCLUDES type SYNT_INCLUDES .
  data SLIN_PROG_INTERVALS type SYNT_INTERVAL .
  data SLIN_RABAXID type S380ERRID .
  data SLIN_RAW_MESSAGES type SYNT_IT_TRMSG_RAW .
  data SLIN_SET_EXTENDED_STMTS type SYNT_EXT_CHECK .
  data SLIN_TYPES type SYNT_TYPE_OBJ .
  data STMNTS type SYNT_XCROSS_STMNT .
  data:
    STMNT_REF  type hashed table of T_STRUCT_STMNT_REF
             with unique key STMNT .
  data SUBRC type SY-SUBRC .
  data SYMBOL type T_STRUCT_SYMBOL_CACHE .
  data:
    SYMBOL_CACHE type hashed table of T_STRUCT_SYMBOL_CACHE
                 with unique key FULL_NAME .
  data TABIX type I .
  data TAGS type SCR_RTAGS .
  data TEST_CLASS type I .
  data TITLE type STRING .
  data TYPEPOOLS type SYNT_MAP .
  data TYPES type SYNT_TYPE_OBJ .
  data TYPE_CHILDS type SYNT_TYPE_CHILDS .
  data TABLE_KEYS type SYNT_TABLE_KEYS .
  data:
    VISITED type hashed table of T_STRUCT_VISITED
           with unique key OBJ_ID OBJ_KIND DEF GRADE MODE1 INCLUDE .
  data WARNINGS type SYNT_ERRORS .
  data XCROSS type SYNT_XCROSS .
  data XCROSS_ID type T_XCROSS_ID .
  data XCROSS_NAME_1 type T_XCROSS_NAME_1 .
  data XCROSS_NAME_2 type T_XCROSS_NAME_2 .
  data ENHANCEMENT_IMPLS type SCR_ENHANCEMENT_IMPLS .
  data ID_ENHANCEMENT_IMPLS type SYCHAR04 .
  data INTERNAL type SYCHAR01 .
  data ID_TEST_2 type SYCHAR04 .
  data ID_TEST_3 type SYCHAR04 .
  data WITHOUT_NESTED_ENH type SYCHAR01 .

  methods ACTIVATE_INCLUDE
    importing
      !P_INCLUDE type PROGRAM
    changing
      !P_SOURCE type T_SOURCE .
  methods COMPONENT_NAME
    importing
      !P_DATA_ID type I
      !P_CURR_DATA_ID type I
      value(P_TYPE_ID) type I
    exporting
      !P_RESULT type I
    changing
      !P_BUFFER type STRING .
  methods COMPONENT_OFFSET
    importing
      !P_DATA_ID type I
      !P_CURR_DATA_ID type I
      value(P_TYPE_ID) type I
    exporting
      !P_RESULT type I
      !P_OFFSET type I .
  methods CRC64
    importing
      !P_INPUT type ANY
      !P_LENGTH type I
    changing
      !P_CRC_VALUE type SCR_CRC64
    exceptions
      PARAMETER_ERROR .
  methods DATA_COMP_NAME
    importing
      !P_DATA_ID type I
      !P_ENV_ID type I
    exporting
      !P_RESULT type STRING .
  methods DATA_FULL_NAME
    importing
      !P_DATA_ID type I
    exporting
      !P_RESULT type STRING .
  methods ENV_COMP_NAME
    importing
      !P_ENV_ID type I
      !P_COMP_ENV_ID type I
    exporting
      !P_RESULT type STRING .
  methods ENV_FULL_NAME
    importing
      !P_ENV_ID type I
    exporting
      !P_RESULT type STRING .
  methods FIND_COMMON_PART
    importing
      !P_NAME type STRING
    returning
      value(P_OBJ_DESCR) type OBJINFO .
  methods FIND_CONTROL
    importing
      !P_NAME type STRING
    returning
      value(P_OBJ_DESCR) type OBJINFO .
  methods FIND_DATA_COMP
    importing
      !P_DATA_ID type I
      !P_NAME type STRING
      !P_TYPE_ID type I
      !P_ROOT_DATA type SYNT_STRUC_DATA_OBJ
    returning
      value(P_OBJ_DESCR) type OBJINFO .
  methods FIND_TABLE_KEY
    importing
      !P_TYPE_ID type I
      !P_NAME type STRING
    returning
      value(P_OBJ_DESCR) type OBJINFO .
  methods FIND_ENHANCEMENT_EXIT
    importing
      !P_NAME type STRING
    returning
      value(P_OBJ_DESCR) type OBJINFO .
  methods FIND_ENHANCEMENT_IMPL
    importing
      !P_FULL_NAME type STRING
    returning
      value(P_OBJ_DESCR) type OBJINFO .
  methods FIND_ENV_COMP
    importing
      !P_ENV_ID type I
      !P_NAME type STRING
    returning
      value(P_OBJ_DESCR) type OBJINFO .
  methods FIND_ENH_PARENT
    importing
      !P_FULL_NAME type STRING
    returning
      value(P_OBJ_DESCR) type OBJINFO .
  methods FIND_FULL_NAME
    importing
      !P_FULL_NAME type STRING
    returning
      value(P_OBJ_DESCR) type OBJINFO .
  methods FIND_TYPE_COMP
    importing
      !P_TYPE_ID type I
      !P_NAME type STRING
    returning
      value(P_OBJ_DESCR) type OBJINFO .
  methods GET_ATTR_REFS
    importing
      !P_LOCAL type SYCHAR01
      value(P_DATA_ID) type I
      value(P_DEF) type SYCHAR01
      !P_INCLUDE type PROGRAM
    changing
      !P_RESULT type SCR_GLREFS .
  methods GET_BADI_METHOD_REFS
    importing
      !P_FULL_NAME type STRING
      !P_INCLUDE type PROGRAM
    changing
      !P_RESULT type SCR_GLREFS .
  methods GET_BASE_OBJECT
    importing
      !P_DATA_ID type I
    returning
      value(P_RESULT) type I .
  methods GET_BASE_TYPE
    importing
      !P_TYPE_ID type I
    returning
      value(P_RESULT) type I .
  methods GET_CLASS_INTF_REFS
    importing
      !P_LOCAL type SYCHAR01
      !P_GRADE type SCR_GRADE
      !P_MODE1 type SYCHAR01
      !P_ENV_ID type I
      !P_DEF type SYCHAR01
      !P_INCLUDE type PROGRAM
    changing
      !P_RESULT type SCR_GLREFS .
  methods GET_CLASS_SYMBOL
    importing
      !P_ENTRY type SYNT_STRUC_XENV
      value(P_LEVEL) type I
      !P_FULL_NAME type STRING
    returning
      value(P_RESULT) type ref to CL_ABAP_COMP_CLASS .
  methods GET_COMMENTS
    importing
      !P_POS type I
      !P_INCLUDE type STRING
      !P_LINE type I
    exporting
      !P_COMMENTS type SCR_COMMENTS .
  methods GET_COMPONENT_REFS
    importing
      !P_LOCAL type SYCHAR01
      !P_DATA_ID type I
      !P_CURR_DATA_ID type I
      !P_TYPE_ID type I
      !P_INCLUDE type PROGRAM
    exporting
      !P_FOUND type I
    changing
      !P_RESULT type SCR_GLREFS .
  methods GET_COMP_REFS
    importing
      !P_LOCAL type SYCHAR01
      value(P_COMP_ID) type I
      !P_INCLUDE type PROGRAM
    changing
      !P_RESULT type SCR_GLREFS .
  methods GET_CONSTANT_VALUE
    importing
      value(P_DATA_ID) type I
    exporting
      !P_NAME type STRING
      !P_VALUE type STRING
      !P_LITL type SYCHAR01 .
  methods GET_DATA_CONSTRUCTOR_REFS
    importing
      !P_LOCAL type SYCHAR01
      value(P_DATA_ID) type I
      !P_INCLUDE type PROGRAM
    changing
      !P_RESULT type SCR_GLREFS .
  methods GET_CTYPE_REFS
    importing
      !P_LOCAL type SYCHAR01
      !P_MODE1 type SYCHAR01
      !P_TYPE_ID type I
      !P_GRADE type SCR_GRADE
      value(P_DEF) type SYCHAR01
      !P_INCLUDE type PROGRAM
    changing
      !P_RESULT type SCR_GLREFS
      !P_INSERT type SYCHAR01 .
  methods GET_DATA_REFS
    importing
      !P_LOCAL type SYCHAR01
      value(P_DATA_ID) type I
      value(P_DEF) type SYCHAR01
      !P_INCLUDE type PROGRAM
      !P_GRADE type SCR_GRADE default GRADE_PROPERTIES
    changing
      !P_RESULT type SCR_GLREFS .
  methods GET_DATA_SYMBOL
    importing
      !P_ENTRY type SYNT_STRUC_DATA_OBJ
      value(P_LEVEL) type I
      !P_FULL_NAME type STRING
    returning
      value(P_RESULT) type ref to CL_ABAP_COMP_DATA_GENERIC .
  methods GET_DATA_VALUE
    importing
      !P_START type I
      !P_COUNT type I
    exporting
      !P_RESULT type STRING .
  methods GET_ENH_IMPL_REF
    importing
      !P_XCROSS type SYNT_STRUC_XCROSS
      !P_INCLUDE type PROGRAM
    changing
      !P_RESULT type SCR_GLREFS .
  methods GET_ENH_IMPL_SYMBOL
    importing
      !P_ENTRY type SYNT_STRUC_XENV
      value(P_LEVEL) type I
      !P_FULL_NAME type STRING
    returning
      value(P_RESULT) type ref to CL_ABAP_COMP_ENHANCE_IMPL .
  methods GET_ENV_ALIAS_REFS
    importing
      !P_LOCAL type SYCHAR01
      !P_ENV_ID type I
      !P_DEF type SYCHAR01
      !P_INCLUDE type PROGRAM
    changing
      !P_RESULT type SCR_GLREFS .
  methods GET_ENV_NAME
    importing
      !P_ENV_ID type I
    exporting
      !P_NAME type STRING .
  methods GET_ENV_TYPE
    importing
      !P_ENV_ID type I
    returning
      value(P_TYPE_ID) type I .
  methods GET_EVENT_KEYWORD
    importing
      !P_XCROSS_NAME type STRING
    exporting
      !P_KEYWORD type STRING .
  methods GET_FORM_AND_PROGRAM
    importing
      !P_TOKEN type STRING
    exporting
      !P_FORM type STRING
      !P_PROGRAM type STRING .
  class-methods GET_FORM_NAME_FOR_EVENT
    importing
      !P_EVENT type SCR_TAG
      !P_NAME type STRING optional
    exporting
      !P_RESULT type STRING .
  methods GET_FULL_NAME
    importing
      !P_OBJ_KIND type SYCHAR01
      value(P_OBJ_ID) type I
      !P_SKIP_INHERIT type SYCHAR01 optional
    exporting
      !P_RESULT type STRING .
  methods GET_FULL_NAME_FOR_EVENT
    importing
      !P_XCROSS_NAME type STRING
    exporting
      !P_FULL_NAME type STRING
      !P_TAG type SCR_TAG .
  methods GET_IDS
    importing
      !P_FULL_NAMES type SCR_NAMES_GRADES
    exporting
      !P_XCROSS_IDS type T_XCROSS_IDS
    raising
      LCX_FULL_NAME_SYNTAX_ERROR
      LCX_OBJECT_NOT_FOUND .
  methods GET_IDS_DATA_COMP
    importing
      !P_DATA_ID type I
      !P_GRADE type SCR_GRADE
      !P_NAME type STRING
      !P_FULL_NAME type STRING
      !P_TYPE_ID type I
      !P_GRADE_NEEDED type SCR_GRADE
    exporting
      !P_XCROSS_IDS type T_XCROSS_IDS
    raising
      LCX_FULL_NAME_SYNTAX_ERROR
      LCX_OBJECT_NOT_FOUND .
  methods GET_IDS_DATA_COMPONENTS
    importing
      !P_GRADE type SCR_GRADE
      !P_ROOT_ID type I
      !P_DATA_ID type I
      value(P_TYPE_ID) type I
      !P_FULL_NAME type STRING
      !P_GRADE_NEEDED type SCR_GRADE
    changing
      !P_XCROSS_IDS type T_XCROSS_IDS .
  methods GET_IDS_DATA_PARENTS
    importing
      !P_DATA_ID type I
      !P_CURR_DATA_ID type I
      !P_TYPE_ID type I
      !P_TOP_LEVEL type SYCHAR01
      !P_DEF type SYCHAR01
      !P_FULL_NAME type STRING
      !P_GRADE type SCR_GRADE
    exporting
      !P_COMPARE type I
    changing
      !P_XCROSS_IDS type T_XCROSS_IDS .
  methods GET_IDS_ENV_COMP
    importing
      !P_ENV_ID type I
      !P_NAME type STRING
      !P_FULL_NAME type STRING
      !P_GRADE_NEEDED type SCR_GRADE
      !P_GRADE type SCR_GRADE
    exporting
      !P_XCROSS_IDS type T_XCROSS_IDS
    raising
      LCX_FULL_NAME_SYNTAX_ERROR
      LCX_OBJECT_NOT_FOUND .
  methods GET_IDS_ENH_COMP
    importing
      !P_ENV_ID type I
      !P_NAME type STRING
      !P_FULL_NAME type STRING
      !P_GRADE type SCR_GRADE
    exporting
      !P_XCROSS_IDS type T_XCROSS_IDS
    raising
      LCX_FULL_NAME_SYNTAX_ERROR
      LCX_OBJECT_NOT_FOUND .
  methods GET_IDS_EXTERN_PROGRAM
    importing
      !P_PROGRAM type STRING
      !P_COMP_NAME type STRING
      !P_FULL_NAME type STRING
      !P_GRADE type SCR_GRADE
    changing
      !P_XCROSS_IDS type T_XCROSS_IDS
    raising
      LCX_FULL_NAME_SYNTAX_ERROR
      LCX_OBJECT_NOT_FOUND .
  methods GET_IDS_INCLUDE
    importing
      !P_COMP_NAME type STRING
      !P_FULL_NAME type STRING
      !P_GRADE type SCR_GRADE
    changing
      !P_XCROSS_IDS type T_XCROSS_IDS
    raising
      LCX_FULL_NAME_SYNTAX_ERROR
      LCX_OBJECT_NOT_FOUND .
  methods GET_IDS_IND
    changing
      !P_XCROSS_IDS type T_XCROSS_IDS
    raising
      LCX_FULL_NAME_SYNTAX_ERROR
      LCX_OBJECT_NOT_FOUND .
  methods GET_IDS_IND_TYPE_COMP
    importing
      !P_TYPE_ID type I
      !P_NESTED type SYCHAR01
      !P_FULL_NAME type STRING
      !P_GRADE_NEEDED type SCR_GRADE
    changing
      !P_XCROSS_IDS type T_XCROSS_IDS
      !P_T_IDS_COMP type T_ID_GRADES
      !P_T_IDS_DIR type T_ID_GRADES
    raising
      LCX_FULL_NAME_SYNTAX_ERROR
      LCX_OBJECT_NOT_FOUND .
  methods GET_IDS_INTF_METH_DATAS
    importing
      !P_INTF_ID type I
      !P_METH_NAME type STRING
      !P_DATA_NAME type STRING
      !P_FULL_NAME type STRING
    changing
      !P_XCROSS_IDS type T_XCROSS_IDS .
  methods GET_IDS_LOCAL_PROGRAM
    importing
      !P_COMP_NAME type STRING
      !P_FULL_NAME type STRING
      !P_GRADE type SCR_GRADE
    changing
      !P_XCROSS_IDS type T_XCROSS_IDS
    raising
      LCX_FULL_NAME_SYNTAX_ERROR
      LCX_OBJECT_NOT_FOUND .
  methods GET_IDS_OBJTYPE_COMP
    importing
      !P_ENV_ID type I
      !P_NESTED type SYCHAR01
      !P_GRADE type SCR_GRADE
      !P_FULL_NAME type STRING
      !P_GRADE_NEEDED type SCR_GRADE
    changing
      !P_XCROSS_IDS type T_XCROSS_IDS
      !P_T_IDS_COMP type T_ID_GRADES
      !P_D_IDS_COMP type T_ID_GRADES
      !P_E_IDS_COMP type T_ID_GRADES
      !P_E_IDS_IND type T_ID_GRADES
      !P_E_IDS_CONSTR type T_ID_GRADES
      !P_E_IDS_CONSTR_TYPE type T_ID_GRADES
    raising
      LCX_FULL_NAME_SYNTAX_ERROR
      LCX_OBJECT_NOT_FOUND .
  methods GET_IDS_OBJTYPE_IND
    importing
      !P_ENV_ID type I
      !P_FULL_NAME type STRING
    changing
      !P_E_IDS_IND type T_ID_GRADES
    raising
      LCX_FULL_NAME_SYNTAX_ERROR
      LCX_OBJECT_NOT_FOUND .
  methods GET_IDS_TYPE_COMP
    importing
      !P_TYPE_ID type I
      !P_NAME type STRING
      !P_FULL_NAME type STRING
      !P_GRADE_NEEDED type SCR_GRADE
      !P_GRADE type SCR_GRADE
    exporting
      !P_XCROSS_IDS type T_XCROSS_IDS
    raising
      LCX_FULL_NAME_SYNTAX_ERROR
      LCX_OBJECT_NOT_FOUND .
  methods GET_INCLUDE_CHECKSUM
    importing
      !P_REF_SOURCE type ref to SCR_INCLUDE
      !P_REF_TRDIR type ref to TRDIR
    returning
      value(P_RESULT) type SCR_CRC64 .
  methods GET_LOCAL_REFS
    importing
      !P_XCROSS type SYNT_STRUC_XCROSS
      !P_INCLUDE type PROGRAM
    changing
      !P_RESULT type SCR_GLREFS .
  methods GET_METHOD_SYMBOL
    importing
      !P_ENTRY type SYNT_STRUC_XENV
      value(P_LEVEL) type I
      !P_FULL_NAME type STRING
    returning
      value(P_RESULT) type ref to CL_ABAP_COMP_METHOD .
  methods GET_ME_EV_REFS
    importing
      !P_LOCAL type SYCHAR01
      value(P_MODE1) type SYCHAR01
      value(P_ENV_ID) type I
      !P_TAG type SCR_TAG
      !P_DEF type SYCHAR01
      !P_INCLUDE type PROGRAM
    changing
      !P_RESULT type SCR_GLREFS .
  methods GET_MSG_NUMBER_AND_ID
    importing
      !P_TOKEN type STRING
    exporting
      !P_NUMBER type STRING
      !P_ID type STRING .
  methods GET_NAME
    importing
      !P_OBJ_KIND type SYCHAR01
      !P_OBJ_ID type I
    exporting
      !P_RESULT type STRING .
  methods GET_NAME_AND_OFFSET
    importing
      !P_OBJ_KIND type SYCHAR01
      value(P_OBJ_ID) type I
      !P_OBJ_ID_P type I
    exporting
      !P_NAME type STRING
      !P_OFFSET type I .
  methods GET_REFS
    importing
      !P_LOCAL type SYCHAR01
      !P_TESTCODE type SYCHAR01
      !P_XCROSS type SYNT_STRUC_XCROSS
      !P_INCLUDE type PROGRAM
    changing
      !P_RESULT type SCR_GLREFS
    exceptions
      INTERNAL_ERROR .
  methods GET_REF_SYMBOL
    importing
      !P_ENTRY type SYNT_STRUC_TYPE_OBJ
      value(P_LEVEL) type I
    returning
      value(P_RESULT) type ref to CL_ABAP_COMP_REF_TYPE .
  methods GET_SOURCE_INFO
    importing
      !P_LEVEL type I
    returning
      value(P_RESULT) type ref to CL_ABAP_SOURCE_INFO .
  methods GET_STATEMENT_INFO
    importing
      !P_STMNT type I
    returning
      value(P_RESULT) type ref to CL_ABAP_STATEMENT_INFO .
  methods GET_STRUCTURE_SYMBOL
    importing
      !P_ENTRY type SYNT_STRUC_TYPE_OBJ
      value(P_LEVEL) type I
    returning
      value(P_RESULT) type ref to CL_ABAP_COMP_STRUCTURE_TYPE .
  methods GET_TABLE_SYMBOL
    importing
      value(P_LEVEL) type I
      !P_ENTRY type SYNT_STRUC_TYPE_OBJ
    returning
      value(P_RESULT) type ref to CL_ABAP_COMP_TABLE_TYPE .
  methods GET_TYPE_REFS
    importing
      !P_LOCAL type SYCHAR01
      !P_MODE1 type SYCHAR01
      value(P_TYPE_ID) type I
      value(P_GRADE) type SCR_GRADE
      value(P_DEF) type SYCHAR01
      !P_INCLUDE type PROGRAM
    exporting
      !P_INSERT type SYCHAR01
    changing
      !P_RESULT type SCR_GLREFS .
  methods GET_TYPE_SYMBOL
    importing
      !P_ENTRY type SYNT_STRUC_TYPE_OBJ
      value(P_LEVEL) type I
      value(P_FULL_NAME) type STRING
    returning
      value(P_RESULT) type ref to CL_ABAP_COMP_TYPE .
  methods GET_XCROSS_FULL_NAME
    importing
      !P_XCROSS type SYNT_STRUC_XCROSS
      !P_OFFSET type I
      value(P_INDEX) type I
    exporting
      !P_TAG type SCR_TAG
      !P_FULL_NAME type STRING
      !P_GRADE type SCR_GRADE
      !P_VALID type SYCHAR01 .
  methods GET_XCROSS_NAME_FOR_EVENT
    importing
      !P_TAG type SCR_TAG
    exporting
      !P_XCROSS_NAME type STRING .
  methods IS_UNICODE_SYSTEM
    returning
      value(P_RESULT) type SYCHAR01 .
  methods RESET_SCAN .
  methods ROLE_TO_TAG
    importing
      !P_ROLE type SYCHAR01
    returning
      value(P_TAG) type SCR_TAG .
  methods SCAN .
  methods SCAN_ITAB
    importing
      !P_SOURCE type SCR_INCLUDE
      !P_PROGRAM type PROGRAM
      !P_INCLUDE type PROGRAM optional
      !P_TRDIR type TRDIR
      !P_FILTER type SYNT_FILTER
      !P_TRDIR_MAIN type TRDIR
      !P_SOURCE_MAIN type SCR_INCLUDE optional .
  methods SCAN_PROGRAM .
  methods SINGLE_REF_FOUND
    importing
      !P_XCROSS type SYNT_STRUC_XCROSS
      !P_DEF type SYCHAR01
      !P_MODE1 type SYCHAR01
      !P_MODE2 type SYCHAR01
      !P_FULL_NAME type STRING
      !P_GRADE type SCR_GRADE
      !P_NAME type STRING
      !P_OFFSET type I
      !P_EXTENDED type SYCHAR01
    changing
      !P_RESULT type SCR_REFS
      !P_PREV_REF type SCR_REF .
  class-methods TAG_NAME
    importing
      !P_TAG type SCR_TAG
      !P_NAME type STRING
    exporting
      !P_RESULT type STRING .
  class-methods TAG_NAME_2
    importing
      !P_TAG_1 type SCR_TAG
      !P_NAME_1 type CSEQUENCE
      !P_TAG_2 type SCR_TAG
      !P_NAME_2 type CSEQUENCE
    exporting
      !P_RESULT type STRING .
  methods TAG_TO_ROLE
    importing
      !P_TAG type SCR_TAG
    returning
      value(P_ROLE) type SYCHAR01 .
  methods TYPE_COMP_NAME
    importing
      !P_ENV_ID type I
      !P_TYPE_ID type I
    exporting
      !P_RESULT type STRING .
  methods TYPE_FULL_NAME
    importing
      !P_TYPE_ID type I
    exporting
      !P_RESULT type STRING .
  methods GET_DATA_ORIG
    importing
      value(P_START) type I
      !P_COUNT type I
    changing
      !P_RESULT type I .
  methods GET_ALIAS_TYPE_SYMBOL
    importing
      value(P_LEVEL) type I
      !P_ENTRY type SYNT_STRUC_TYPE_OBJ
    returning
      value(P_RESULT) type ref to CL_ABAP_COMP_TYPE .
  methods GET_EVENT_SYMBOL
    importing
      !P_ENTRY type SYNT_STRUC_XENV
      !P_FULL_NAME type STRING
    returning
      value(P_RESULT) type ref to CL_ABAP_COMP_EVENT .
  methods GET_ENV_SYMBOL
    importing
      !P_ENTRY type SYNT_STRUC_XENV
      value(P_LEVEL) type I
      !P_TAG type SCR_TAG
      !P_FULL_NAME type STRING
    returning
      value(P_RESULT) type ref to CL_ABAP_COMP_SYMBOL .
  methods GET_SYMBOL
    importing
      !P_OBJ_KIND type SYCHAR01
      !P_OBJ_ID type I
      !P_FULL_NAME type STRING
      !P_LEVEL type I
    exporting
      !P_RESULT type ref to CL_ABAP_COMP_SYMBOL .
  methods GET_ANY_SYMBOL
    importing
      !P_ENTRY type SCR_TAG
      !P_FULL_NAME type STRING
      value(P_LEVEL) type I
    returning
      value(P_RESULT) type ref to CL_ABAP_COMP_SYMBOL .
  methods GET_INTERFACE_SYMBOL
    importing
      !P_ENTRY type SYNT_STRUC_XENV
      !P_FULL_NAME type STRING
      value(P_LEVEL) type I
    returning
      value(P_RESULT) type ref to CL_ABAP_COMP_CLASS .
  methods DATA_ELEMENT_KIND
    importing
      !P_KIND type I
    returning
      value(P_RESULT) type I .
  methods IS_GLOBAL
    importing
      !P_OBJ_ID type I
      !P_OBJ_KIND type SYCHAR01
    returning
      value(P_RESULT) type SYCHAR01 .
  methods CHECK_INCLUDE_NAME
    importing
      !P_NAME type PROGRAM
    returning
      value(P_RESULT) type SYCHAR01 .
  methods KEY_FULL_NAME
    importing
      value(P_KEY_ID) type I
    exporting
      !P_RESULT type STRING .
  methods GET_KEY_REFS
    importing
      value(P_KEY_ID) type I
      !P_DEF type SYCHAR01
      !P_INCLUDE type PROGRAM
    changing
      !P_RESULT type SCR_GLREFS .
  methods GET_TYPE_CONSTRUCTOR_REFS
    importing
      !P_LOCAL type SYCHAR01
      value(P_TYPE_ID) type I
      !P_INCLUDE type PROGRAM
    changing
      !P_RESULT type SCR_GLREFS .
  methods CHECK_EXTERN
      importing
        p_objinfo type OBJINFO
      returning
        value(P_RESULT) type SYCHAR01 .
ENDCLASS.



CLASS CL_ABAP_COMPILER IMPLEMENTATION.


method ACTIVATE_INCLUDE .
*---------------------------------------------------------------------*
*  METHOD ACTIVATE_INCLUDE
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
  data:
    L_STATE     type SYCHAR01 value '0',
    L_NEW_STATE type SYCHAR01,
    L_PATTERN_1 type STRING,
    L_PATTERN_2 type STRING,
    L_PATTERN_3 type STRING,
    L_SOURCE    like line of P_SOURCE,
    L_INCLUDE   like P_INCLUDE.

  concatenate 'INCLUDE' P_INCLUDE into L_PATTERN_2
             separated by ' '.

  L_NEW_STATE = '2'.

  if P_INCLUDE+31(1) = 'M'.
    L_PATTERN_1 = 'INCLUDE METHODS'.
  else.
    if P_INCLUDE+31(4) = 'CDEF'.
      L_NEW_STATE = '1'.
      l_include = p_include.
      L_INCLUDE+31 = 'U'.
      concatenate 'INCLUDE' L_INCLUDE into L_PATTERN_3 separated by ' '.
    endif.
    concatenate 'INCLUDE' P_INCLUDE into L_PATTERN_1
               separated by ' '.
  endif.

  loop at P_SOURCE into L_SOURCE.
    case L_STATE.
      when '0'.
        if L_SOURCE cs L_PATTERN_1.
          L_STATE  = L_NEW_STATE.
          concatenate L_PATTERN_2 '.' into L_SOURCE .
          modify P_SOURCE from L_SOURCE.
          continue.
        endif.
      when '1'.
        if L_SOURCE cs 'INCLUDE' and
           l_source NS l_pattern_3.
          L_SOURCE = ' '.
          modify P_SOURCE from L_SOURCE.
        endif.
      when '2'.
        if L_SOURCE cs 'INCLUDE'.
          L_SOURCE = ' '.
          modify P_SOURCE from L_SOURCE.
        endif.
    endcase.
  endloop.
endmethod.                    "ACTIVATE_INCLUDE


method CHECK_EXTERN.
  field-symbols:
   <L_TYPE> like line of TYPES,
   <L_DATA> like line of DATAS,
   <L_COMP> like line of COMPS,
   <L_ENV>  like line of ENVS.

  P_RESULT = ABAP_TRUE.

  case P_OBJINFO-OBJ_KIND.
    when 'T'.
      READ_TABLE_INDEX TYPES P_OBJINFO-OBJ_ID <L_TYPE>.



      case <L_TYPE>-MODE.
        when SYNT_MODE-PROTECTED
          or SYNT_MODE-PACKAGE
          or SYNT_MODE-PRIVATE.
          P_RESULT = ABAP_FALSE.
      endcase.
    when 'D'.
      READ_TABLE_INDEX DATAS P_OBJINFO-OBJ_ID <L_DATA>.
      case <L_DATA>-MODE.
        when SYNT_MODE-PROTECTED
          or SYNT_MODE-PACKAGE
          or SYNT_MODE-PRIVATE.
          P_RESULT = ABAP_FALSE.
      endcase.
    when 'E'.
      READ_TABLE_INDEX ENVS P_OBJINFO-OBJ_ID <L_ENV>.
      case <L_ENV>-MODE.
        when SYNT_MODE-PROTECTED
          or SYNT_MODE-PACKAGE
          or SYNT_MODE-PRIVATE.
          P_RESULT = ABAP_FALSE.
      endcase.
  endcase.


endmethod.


method CHECK_FEATURE
  by kernel module sc_km_check_feature_2 sc_km_check_feature ignore.
endmethod.


method CHECK_INCLUDE_NAME.
  data:
    L_PREFIX_1 type STRING,
    L_PREFIX_2 type STRING,
    L_NAME_1   type STRING,
    L_NAME_2   type STRING,
    L_LENGTH   type I.

  if P_NAME(1) = '/'.
    split P_NAME+1 at '/' into L_PREFIX_1 L_NAME_1.
  else.
    L_NAME_1 = P_NAME.
  endif.

  L_LENGTH = STRLEN( P_NAME ) - 3.
  L_NAME_1 = P_NAME(L_LENGTH).

  if PROGRAM(1) = '/'.
    split PROGRAM+1 at '/' into L_PREFIX_2 L_NAME_2.
    L_NAME_2 = L_NAME_1+3.
  else.
    L_NAME_2 = PROGRAM+3.
  endif.

  if L_PREFIX_1 = L_PREFIX_2 and L_NAME_1 = L_NAME_2.
    P_RESULT = 'X'.
  endif.

endmethod.


method CLEAR_CACHE.
  clear:
    CURR_NAME,
    CURR_REF.
endmethod.


method COMPONENT_NAME .
*---------------------------------------------------------------------*
*       METHOD COMPONENT_NAME                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_MIN_ITEM   type I,
    L_MAX_ITEM   type I,
    L_DATA_ID    type I,
    L_CURR_ITEM  type I.
  field-symbols:
    <L_TYPE>     like line of TYPES,
    <L_ITEM>     like line of TYPE_CHILDS.

  if P_CURR_DATA_ID = P_DATA_ID.
    P_RESULT = 0.
    return.
  elseif P_CURR_DATA_ID > P_DATA_ID.
    P_RESULT = -1.
    return.
  endif.

  P_TYPE_ID = GET_BASE_TYPE( P_TYPE_ID ).

  if P_TYPE_ID = 0.
    message X000(38) with 'Unerwarteter Zustand'(001).
  endif.

  READ_TABLE_INDEX TYPES P_TYPE_ID <L_TYPE>.
* process structures

  case <L_TYPE>-KIND.
    when SYNT_TYPE-STRUC1-ATYP or SYNT_TYPE-STRUC2-ATYP.
* search for component
      L_MAX_ITEM   = <L_TYPE>-REF_OFFSET + <L_TYPE>-CHILD_CNT - 1 .
      READ_TABLE_INDEX TYPE_CHILDS L_MAX_ITEM <L_ITEM>.
      L_DATA_ID    = P_CURR_DATA_ID + <L_ITEM>-NODE_OFFSET.
      if P_DATA_ID > L_DATA_ID.
        L_MIN_ITEM = L_MAX_ITEM.
      else.
        L_MIN_ITEM = <L_TYPE>-REF_OFFSET.
      endif.

      do.
        if L_MIN_ITEM > L_MAX_ITEM.
          P_RESULT = 1.
          return.
        endif.
        L_CURR_ITEM = ( L_MIN_ITEM + L_MAX_ITEM ) div 2.
        READ_TABLE_INDEX TYPE_CHILDS L_CURR_ITEM <L_ITEM>.
        L_DATA_ID = P_CURR_DATA_ID + <L_ITEM>-NODE_OFFSET.
        P_TYPE_ID = <L_ITEM>-TYPE_OFFSET.
        READ_TABLE_INDEX TYPES P_TYPE_ID <L_TYPE>.
        if <L_TYPE>-STR is initial.
          if L_DATA_ID = P_DATA_ID.
            P_RESULT = 0.
          elseif L_DATA_ID > P_DATA_ID.
            P_RESULT = -1.
          else.
            P_RESULT = 1.
          endif.
        else.
          COMPONENT_NAME( exporting P_DATA_ID      = P_DATA_ID
                                    P_CURR_DATA_ID = L_DATA_ID
                                    P_TYPE_ID      = P_TYPE_ID
                          importing P_RESULT       = P_RESULT
                          changing  P_BUFFER       = P_BUFFER ).
        endif.
        if P_RESULT = 0.
          concatenate PREFIX_FOR_TAGS TAG_DATA ':' <L_TYPE>-STR
                      P_BUFFER into P_BUFFER.
          return.
        elseif P_RESULT < 0.
          L_MAX_ITEM = L_CURR_ITEM - 1.
        else.
          L_MIN_ITEM = L_CURR_ITEM + 1.
        endif.
      enddo.

    when others.
      P_RESULT = 1.
      return.
  endcase.

endmethod.                    "COMPONENT_NAME


method COMPONENT_OFFSET .
*---------------------------------------------------------------------*
*       METHOD COMPONENT_NAME                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_MIN_ITEM   type I,
    L_MAX_ITEM   type I,
    L_DATA_ID    type I,
    L_CURR_ITEM  type I.
  field-symbols:
    <L_TYPE>     like line of TYPES,
    <L_ITEM>     like line of TYPE_CHILDS.

  if P_CURR_DATA_ID = P_DATA_ID.
    P_RESULT = 0.
    return.
  elseif P_CURR_DATA_ID > P_DATA_ID.
    P_RESULT = -1.
    return.
  endif.

  P_TYPE_ID = GET_BASE_TYPE( P_TYPE_ID ).

  if P_TYPE_ID = 0.
    message X000(38) with 'Unerwarteter Zustand'(001).
  endif.

  READ_TABLE_INDEX TYPES P_TYPE_ID <L_TYPE>.
* process structures

  case <L_TYPE>-KIND.
    when SYNT_TYPE-STRUC1-ATYP or SYNT_TYPE-STRUC2-ATYP.
* search for component
      L_MAX_ITEM   = <L_TYPE>-REF_OFFSET + <L_TYPE>-CHILD_CNT - 1 .
      read table TYPE_CHILDS index L_MAX_ITEM assigning <L_ITEM>.
      L_DATA_ID    = P_CURR_DATA_ID + <L_ITEM>-NODE_OFFSET.
      if P_DATA_ID > L_DATA_ID.
        L_MIN_ITEM = L_MAX_ITEM.
      else.
        L_MIN_ITEM = <L_TYPE>-REF_OFFSET.
      endif.

      do.
        if L_MIN_ITEM > L_MAX_ITEM.
          P_RESULT = 1.
          return.
        endif.
        L_CURR_ITEM = ( L_MIN_ITEM + L_MAX_ITEM ) div 2.
        read table TYPE_CHILDS index L_CURR_ITEM assigning <L_ITEM>.
        L_DATA_ID = P_CURR_DATA_ID + <L_ITEM>-NODE_OFFSET.
        P_TYPE_ID = <L_ITEM>-TYPE_OFFSET.
        READ_TABLE_INDEX TYPES P_TYPE_ID <L_TYPE>.
        if <L_TYPE>-STR is initial.
          if L_DATA_ID = P_DATA_ID.
            P_RESULT = 0.
          elseif L_DATA_ID > P_DATA_ID.
            P_RESULT = -1.
          else.
            P_RESULT = 1.
          endif.
        else.
          COMPONENT_OFFSET( exporting P_DATA_ID      = P_DATA_ID
                                      P_CURR_DATA_ID = L_DATA_ID
                                      P_TYPE_ID      = P_TYPE_ID
                            importing P_RESULT       = P_RESULT
                                      P_OFFSET       = P_OFFSET ).
        endif.
        if P_RESULT = 0.
          p_offset = p_offset + strlen( <L_TYPE>-STR ) + 1.
          return.
        elseif P_RESULT < 0.
          L_MAX_ITEM = L_CURR_ITEM - 1.
        else.
          L_MIN_ITEM = L_CURR_ITEM + 1.
        endif.
      enddo.

    when others.
      P_RESULT = 1.
      return.
  endcase.

endmethod.                    "COMPONENT_NAME


method CONSTRUCTOR.
  data:
   L_INCLUDES like line of INCLUDES.


  if P_NAME is initial.
    raise PROGRAM_NAME_EMPTY.
  endif.

  PROGRAM        = P_NAME.
  ONLY_INTERFACE = P_ONLY_INTERFACE.


  if P_INCLUDE is supplied.
    if P_INCLUDE <> ' '.
      L_INCLUDES-SIGN   = 'I'.
      L_INCLUDES-OPTION = 'EQ'.
      L_INCLUDES-LOW    = P_INCLUDE.
      append L_INCLUDES to INCLUDES.
      if P_INCLUDES is supplied.
        message X001(38) with
   'P_INCLUDE und P_INCLUDES'(003)  'dürfen nicht beide angegeben werden'(002).
      endif.
    endif.
  elseif P_INCLUDES is supplied.
    L_INCLUDES-SIGN   = 'I'.
    L_INCLUDES-OPTION = 'EQ'.
    L_INCLUDES-LOW    = P_INCLUDE.
    loop at P_INCLUDES into L_INCLUDES-LOW.
      append L_INCLUDES to INCLUDES.
    endloop.
  endif.

  if P_SUBSTITUTIONS is supplied.
    if P_INCLUDE is supplied or P_INCLUDES is supplied
      or P_ONLY_INTERFACE is supplied.
      message X001(38) with
       'P_INCLUDE, P_INCLUDES oder P_ONLY_INTERFACE'(021)
       'dürfen nicht zusammen mit'(022)
       'P_SUBSTITUTIONS übergeben werden'(024).
    endif.
    INCL_SUBSTITUTIONS = P_SUBSTITUTIONS.
    IS_FOR_PROGRAM = 'X'.
  endif.

  ID_WARNINGS = DEF_WARNINGS.
  ID_INFOS    = DEF_INFOS.
  ID_LONGTEXT = DEF_LONGTEXT.
  ID_COMMENTS = DEF_COMMENTS.

  if P_IGNORE_ENHANCEMENTS = 'X'.
    ID_IGNORE_ENH = SYNT_ID-IGNORE_ENH.
  endif.

  if P_ENHANCEMENT_IMPLS is supplied.
    ID_ENHANCEMENT_IMPLS = 'ENHI'.
    ENHANCEMENT_IMPLS    = P_ENHANCEMENT_IMPLS.
  endif.

  if P_TEST_MODE = 'X'.
    ID_TEST_1 = 'TST1'.
  endif.

  if P_TEST_MODE_2 = 'X'.
    ID_TEST_2 = 'TST2'.
  endif.

  if P_TEST_MODE_3 = 'X'.
    ID_TEST_3 = 'TST3'.
  endif.


  if P_NO_PACKAGE_CHECK = 'X'.
    ME->NO_PACKAGE_CHECK = 'X'.
  else.
    clear ME->NO_PACKAGE_CHECK.
  endif.

  if P_WITHOUT_NESTED_ENHANCEMENTS = 'X'.
    ME->WITHOUT_NESTED_ENH = 'X'.
  else.
    clear ME->WITHOUT_NESTED_ENH.
  endif.

endmethod.                    "


METHOD CRC64 .
  CALL 'ABAP_CRC64'
       ID 'INPUT'  FIELD P_INPUT
       ID 'LENGTH' FIELD P_LENGTH
       ID 'CRC1'   FIELD P_CRC_VALUE-I1
       ID 'CRC2'   FIELD P_CRC_VALUE-I2.  "#EC CI_CCALL
  IF SY-SUBRC <> 0.
    RAISE PARAMETER_ERROR.
  ENDIF.
ENDMETHOD.


method CREATE .
  if P_NAME = CURR_NAME.
    P_RESULT = CURR_REF.
    if P_INCLUDE is supplied.
      P_RESULT->SET_INCLUDES( P_INCLUDE = P_INCLUDE ).
    elseif P_INCLUDES is supplied.
      P_RESULT->SET_INCLUDES( P_INCLUDES = P_INCLUDES ).
    else.
      P_RESULT->SET_INCLUDES( ).
    endif.
  else.
    if P_INCLUDE is supplied.
      create object P_RESULT
        exporting
          P_NAME             = P_NAME
          P_INCLUDE          = P_INCLUDE
          P_ONLY_INTERFACE   = P_ONLY_INTERFACE
          P_NO_PACKAGE_CHECK = P_NO_PACKAGE_CHECK.
    elseif P_INCLUDES is supplied.
      create object P_RESULT
        exporting
          P_NAME             = P_NAME
          P_INCLUDES         = P_INCLUDES
          P_ONLY_INTERFACE   = P_ONLY_INTERFACE
          P_NO_PACKAGE_CHECK = P_NO_PACKAGE_CHECK.
    elseif P_SUBSTITUTIONS is supplied.
      create object P_RESULT
        exporting
          P_NAME             = P_NAME
          P_SUBSTITUTIONS    = P_SUBSTITUTIONS
          P_NO_PACKAGE_CHECK = P_NO_PACKAGE_CHECK.
    else.
      create object P_RESULT
        exporting
          P_NAME             = P_NAME
          P_ONLY_INTERFACE   = P_ONLY_INTERFACE
          P_NO_PACKAGE_CHECK = P_NO_PACKAGE_CHECK.

    endif.
    CURR_NAME = P_NAME.
    CURR_REF  = P_RESULT.
  endif.

endmethod.


method DATA_COMP_NAME .
*---------------------------------------------------------------------*
*       METHOD DATA_COMP_NAME                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*


  data:
    L_PARENT type STRING,
    L_NAME   type STRING,
    L_BUFFER type STRING,
    L_RESULT type I.

  field-symbols:
    <L_DATA_ENTRY> like line of DATAS,
    <L_PARENT>     like line of DATAS,
    <L_TYPE>       like line of TYPES.

  clear P_RESULT.

  if P_DATA_ID = 0.
    P_RESULT = '<NULL>'.
    return.
  endif.

*
* get data object descriptor
*
  READ_TABLE_INDEX DATAS P_DATA_ID <L_DATA_ENTRY>.
  FIND_ERROR = 'CD'.
  check SY-SUBRC = 0.
  FIND_ERROR = SPACE.

  L_NAME = <L_DATA_ENTRY>-STR.

  if <L_DATA_ENTRY>-PARENT_KIND  <> ' ' and
     <L_DATA_ENTRY>-PARENT_INDEX <> 0.
* process different types of parents
    case <L_DATA_ENTRY>-PARENT_KIND.

      when SYNT_PARENT_KIND-KIND_DATA.
*     get parent's name

        DATA_COMP_NAME( exporting P_ENV_ID  = P_ENV_ID
                                  P_DATA_ID = <L_DATA_ENTRY>-PARENT_INDEX
                        importing P_RESULT  = L_PARENT ).
        if FIND_ERROR <> SPACE.
          return.
        endif.
        READ_TABLE_INDEX DATAS <L_DATA_ENTRY>-PARENT_INDEX <L_PARENT>.
        FIND_ERROR = 'CD'.
        check SY-SUBRC = 0.
        FIND_ERROR = SPACE.
*       recurse on chain of components.
        COMPONENT_NAME(
             exporting P_DATA_ID      = P_DATA_ID
                       P_CURR_DATA_ID = <L_DATA_ENTRY>-PARENT_INDEX
                       P_TYPE_ID      = <L_PARENT>-REF1
             importing P_RESULT       = L_RESULT
             changing  P_BUFFER       = L_BUFFER ).

        if FIND_ERROR <> SPACE.
          return.
        endif.
        if L_RESULT = 0.
          concatenate L_PARENT L_BUFFER into P_RESULT.
        endif.

      when SYNT_PARENT_KIND-KIND_ENV.
        if <L_DATA_ENTRY>-DATALOC = SYNT_LOC-POOL.
          if L_NAME is initial.
            FIND_ERROR = '?D'.
            clear P_RESULT.
            return.
          endif.
          concatenate PREFIX_FOR_TAGS TAG_DATA ':' L_NAME
                 into P_RESULT.
        else.
*       get parent's name
          ENV_COMP_NAME( exporting P_ENV_ID      = P_ENV_ID
                                     P_COMP_ENV_ID = <L_DATA_ENTRY>-PARENT_INDEX
                           importing P_RESULT      = L_PARENT ).
          if FIND_ERROR <> SPACE.
            return.
          endif.
          if L_NAME is initial.
            L_NAME = '<NULL>'.
          endif.
          concatenate L_PARENT PREFIX_FOR_TAGS TAG_DATA ':' L_NAME
                 into P_RESULT.
        endif.

      when others.
        FIND_ERROR = 'FD'.
        clear P_RESULT.

    endcase.
* Done !
    return.
  endif.

*
* no parent ...
*
  case <L_DATA_ENTRY>-DATALOC.

* process different data locations
    when SYNT_LOC-PREDEF.
      concatenate PREFIX_FOR_TAGS TAG_PREDEF_DATA ':' L_NAME into P_RESULT.

    when SYNT_LOC-POOL or
         SYNT_LOC-SYS.
      if L_NAME is initial.
        L_NAME = '<NULL>'.
      endif.
      concatenate PREFIX_FOR_TAGS TAG_DATA ':' L_NAME
             into P_RESULT.

    when SYNT_LOC-SHARED.
      case <L_DATA_ENTRY>-KIND.
        when SYNT_DATA-BOX.
          DATA_FULL_NAME( exporting P_DATA_ID = <L_DATA_ENTRY>-REF2
                     importing P_RESULT  = L_BUFFER ).
          READ_TABLE_INDEX TYPES <L_DATA_ENTRY>-REF1 <L_TYPE>.

          concatenate L_BUFFER PREFIX_FOR_TAGS TAG_PREDEF_DATA ':' <L_TYPE>-STR into P_RESULT.
          exit.

      endcase.

      if L_NAME is initial.
        L_NAME = P_DATA_ID.
      endif.
      concatenate PREFIX_FOR_TAGS TAG_SHARED_DATA ':' L_NAME into P_RESULT.

    when others.
      FIND_ERROR = 'FD'.
      clear P_RESULT.

  endcase.

endmethod.                    "DATA_COMP_NAME


method DATA_ELEMENT_KIND.

  if P_KIND >= SYNT_DATA-TABLEWITHHEAD and
     P_KIND <= SYNT_DATA-FIELDGROUP.
    P_RESULT = SYNT_DATA-DATA.
    return.
  endif.

  case P_KIND.
    when SYNT_DATA-DDICTABLE.
      P_RESULT = SYNT_DATA-DATA.
    when SYNT_DATA-STATTABLEWITHHEAD.
      P_RESULT = SYNT_DATA-STATIC.
    when SYNT_DATA-FORMTABLEPARAM.
      P_RESULT = SYNT_DATA-FORMPARAMETER.
    when SYNT_DATA-FCTTABLEPARAM.
      P_RESULT = SYNT_DATA-FCTPARAMETER.
    when others.
      P_RESULT = P_KIND.
  endcase.
endmethod.


method DATA_FULL_NAME .
*---------------------------------------------------------------------*
*       METHOD DATA_FULL_NAME                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

  FIND_ERROR = SPACE.
  DATA_COMP_NAME( exporting P_ENV_ID  = 0
                            P_DATA_ID = P_DATA_ID
                  importing P_RESULT = P_RESULT ).
  if P_RESULT is initial.
    data L_NAME type STRING.
    L_NAME = P_DATA_ID.
    concatenate PREFIX_FOR_TAGS TAG_SHARED_DATA  ':' L_NAME into P_RESULT.
  endif.

endmethod.                    "DATA_FULL_NAME


method ENV_COMP_NAME .
*---------------------------------------------------------------------*
*       METHOD ENV_COMP_NAME                                          *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

  data:
    L_PARENT type STRING,
    L_NAME   type STRING,
    L_ENV1   type I.

  field-symbols:
    <L_ENV_ENTRY> like line of ENVS.

  clear P_RESULT.

  if P_COMP_ENV_ID = P_ENV_ID.
    return.
  endif.

*
* get data object descriptor
*
  READ_TABLE_INDEX ENVS P_COMP_ENV_ID <L_ENV_ENTRY>.
  FIND_ERROR = 'CE'.
  check SY-SUBRC = 0.
  FIND_ERROR = SPACE.
  L_NAME = <L_ENV_ENTRY>-NAME.

  if <L_ENV_ENTRY>-PARENT <> 0 and
     <L_ENV_ENTRY>-KIND   <> SYNT_XENV-POOL_DECL and
     ( <L_ENV_ENTRY>-KIND = SYNT_XENV-INTERFACE or
       <L_ENV_ENTRY>-PUBLICCLASS = SPACE ).
    ENV_COMP_NAME( exporting P_ENV_ID      = P_ENV_ID
                             P_COMP_ENV_ID = <L_ENV_ENTRY>-PARENT
                   importing P_RESULT      = L_PARENT ).
    if FIND_ERROR <> SPACE.
      return.
    endif.
  else.
    clear L_PARENT.
  endif.

* get basic class.
  L_ENV1 = P_COMP_ENV_ID.
  while <L_ENV_ENTRY>-KIND = SYNT_XENV-INHERIT.
    L_ENV1 = <L_ENV_ENTRY>-ALIAS.
    READ_TABLE_INDEX ENVS L_ENV1 <L_ENV_ENTRY>.
    FIND_ERROR = 'CE'.
    check SY-SUBRC = 0.
    FIND_ERROR = SPACE.
  endwhile.

* process different types of parents
  case <L_ENV_ENTRY>-KIND.

    when SYNT_XENV-PROG
      or SYNT_XENV-CLASSPOOL
      or SYNT_XENV-INTERFACEPOOL
      or SYNT_XENV-POOL_DECL.

      if not L_PARENT is initial.
        FIND_ERROR = 'FE'.
        clear P_RESULT.
      else.
        concatenate PREFIX_FOR_TAGS TAG_PROGRAM ':' PROGRAM into P_RESULT.
      endif.

    when SYNT_XENV-CLASS or SYNT_XENV-CLASSDECL.
      if <L_ENV_ENTRY>-PUBLICCLASS = 'X'.
        concatenate PREFIX_FOR_TAGS TAG_TYPE ':' L_NAME into P_RESULT.
      else.
        concatenate PREFIX_FOR_TAGS TAG_PROGRAM ':' PROGRAM
                    PREFIX_FOR_TAGS TAG_TYPE    ':' L_NAME into P_RESULT.
      endif.

    when SYNT_XENV-INTFDECL or SYNT_XENV-INTFDECLLOC.
      if <L_ENV_ENTRY>-PUBLICCLASS = 'X'.
        concatenate PREFIX_FOR_TAGS TAG_TYPE ':' L_NAME into P_RESULT.
      else.
        concatenate PREFIX_FOR_TAGS TAG_PROGRAM ':' PROGRAM
                    PREFIX_FOR_TAGS TAG_TYPE    ':' L_NAME into P_RESULT.
      endif.

    when SYNT_XENV-INTERFACE.
      concatenate L_PARENT PREFIX_FOR_TAGS TAG_INTERFACE ':' L_NAME into P_RESULT.

    when SYNT_XENV-TYPE.
      concatenate PREFIX_FOR_TAGS TAG_TYPE into P_RESULT.

    when SYNT_XENV-FORM.
      if strlen( L_NAME ) > 3 and L_NAME(2) = '%_'.
        GET_FULL_NAME_FOR_EVENT( exporting P_XCROSS_NAME = L_NAME
                                 importing P_FULL_NAME   = P_RESULT ).
        if not P_RESULT is initial.
          return.
        endif.
      endif.
      concatenate PREFIX_FOR_TAGS TAG_PROGRAM ':' PROGRAM
                  PREFIX_FOR_TAGS TAG_FORM    ':' L_NAME into P_RESULT.

    when SYNT_XENV-FUNC.
      concatenate PREFIX_FOR_TAGS TAG_FUNCTION ':' L_NAME into P_RESULT.

    when SYNT_XENV-METHOD or SYNT_XENV-CLASSMETHOD or
         SYNT_XENV-METHODALIAS.
      concatenate L_PARENT PREFIX_FOR_TAGS TAG_METHOD ':' L_NAME
             into P_RESULT.

    when SYNT_XENV-EVENT or SYNT_XENV-CLASSEVENT or SYNT_XENV-EVENTALIAS
    .
      concatenate L_PARENT PREFIX_FOR_TAGS TAG_EVENT ':' L_NAME
             into P_RESULT.

    when SYNT_XENV-COMMON.
      concatenate PREFIX_FOR_TAGS TAG_PROGRAM     ':' PROGRAM
                  PREFIX_FOR_TAGS TAG_COMMON_PART ':' L_NAME into P_RESULT.

    when SYNT_XENV-ENH_POINT or SYNT_XENV-ENH_SECTION.
      if <L_ENV_ENTRY>-REF_FULL_NAME is initial.
        concatenate PREFIX_FOR_TAGS TAG_PROGRAM          ':' PROGRAM
                    PREFIX_FOR_TAGS TAG_ENHANCEMENT_EXIT ':' L_NAME into P_RESULT.
      else.
        concatenate PREFIX_FOR_TAGS TAG_INCLUDE          ':' <L_ENV_ENTRY>-REF_FULL_NAME
                    PREFIX_FOR_TAGS TAG_ENHANCEMENT_EXIT ':' L_NAME into P_RESULT.
      endif.

    when SYNT_XENV-ENH_IMPL.
      concatenate PREFIX_FOR_TAGS TAG_PROGRAM          ':' PROGRAM
                  PREFIX_FOR_TAGS TAG_ENHANCEMENT_IMPL ':' L_NAME into P_RESULT.

    when others.
      FIND_ERROR = 'FE'.
      clear P_RESULT.

  endcase.

endmethod.                    "ENV_COMP_NAME


method ENV_FULL_NAME .
*---------------------------------------------------------------------*
*       METHOD ENV_FULL_NAME                                          *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

  FIND_ERROR = SPACE.
  ENV_COMP_NAME( exporting P_ENV_ID      = 0
                           P_COMP_ENV_ID = P_ENV_ID
                 importing P_RESULT      = P_RESULT ).

endmethod.                    "ENV_FULL_NAME


method FIND_COMMON_PART .
*---------------------------------------------------------------------*
*       METHOD FIND_FULL_NAME                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

  FIND_ERROR = SPACE.

  READ TABLE ENVS with key KIND = SYNT_XENV-COMMON
                           NAME = P_NAME
                           transporting no fields.


  if SY-SUBRC <> 0.
    clear P_OBJ_DESCR.
    return.
  endif.

  P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_ENV.
  P_OBJ_DESCR-OBJ_ID   = SY-TABIX.
  P_OBJ_DESCR-TAG      = TAG_COMMON_PART.

endmethod.                    "


method FIND_CONTROL .
*---------------------------------------------------------------------*
*       METHOD FIND_FULL_NAME                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

  FIND_ERROR = SPACE.

  read table ENVS WITH KEY KIND = SYNT_XENV-OBJECT
                           NAME = P_NAME
                           transporting NO FIELDS.


  if SY-SUBRC <> 0.
    clear P_OBJ_DESCR.
    return.
  endif.

  P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_ENV.
  P_OBJ_DESCR-OBJ_ID   = SY-TABIX.
  P_OBJ_DESCR-TAG      = TAG_CONTROL.

endmethod.                    "


method FIND_DATA_COMP .
*---------------------------------------------------------------------*
*       METHOD FIND_DATA_COMP                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

  data:
    L_BASE_TYPE type I,
    L_SRCH      type STRING,
    L_HEAD      type STRING,
    L_TAIL      type STRING,
    L_COMP_ID   type I,
    L_TYPE_ID   type I,
    L_FROM      type I,
    L_TO        type I.

  field-symbols:
    <L_TYPE_ENTRY> type SYNT_STRUC_TYPE_OBJ,
    <L_ITEM>       like line of TYPE_CHILDS,
    <L_DATA>       like line of DATAS.



  FIND_ERROR = SPACE.

  clear P_OBJ_DESCR.

*
* get Id of base type
*
  FIND_ERROR = SPACE.

  L_BASE_TYPE = GET_BASE_TYPE( P_TYPE_ID ).

  check L_BASE_TYPE <> 0.

*
* check if base type is a structure
*
  READ_TABLE_INDEX TYPES L_BASE_TYPE <L_TYPE_ENTRY>.
  FIND_ERROR = 'BD'.
  check SY-SUBRC = 0.
  FIND_ERROR = 'KD'.
  if <L_TYPE_ENTRY>-KIND = SYNT_TYPE-STRUC1-ATYP or
     <L_TYPE_ENTRY>-KIND = SYNT_TYPE-STRUC2-ATYP.
*
* structure component
*
    if P_NAME+1(2) = TAG_TYPE_OF.
      L_TAIL = P_NAME+3.
      if L_TAIL is initial.
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_TYPE.
        P_OBJ_DESCR-OBJ_ID   = L_BASE_TYPE.
        P_OBJ_DESCR-TAG      = TAG_TYPE.
        return.
      endif.
      P_OBJ_DESCR = FIND_TYPE_COMP( P_TYPE_ID = L_BASE_TYPE
                                    P_NAME    = L_TAIL ).
    elseif P_NAME+1(2) = TAG_DATA.

* Split name
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      L_FROM = <L_TYPE_ENTRY>-REF_OFFSET.
      L_TO   = <L_TYPE_ENTRY>-REF_OFFSET + <L_TYPE_ENTRY>-CHILD_CNT.
      loop at TYPE_CHILDS from L_FROM to L_TO
                          assigning <L_ITEM>.
        READ_TABLE_INDEX TYPES <L_ITEM>-TYPE_OFFSET <L_TYPE_ENTRY>.
        if <L_TYPE_ENTRY>-STR = L_HEAD.
          L_COMP_ID = P_DATA_ID + <L_ITEM>-NODE_OFFSET.
          L_TYPE_ID = <L_ITEM>-TYPE_OFFSET.
          exit.
        endif.
      endloop.

      check L_COMP_ID <> 0.

      FIND_ERROR = SPACE.
      if L_TAIL is initial.
* at the end of the path
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_DATA.
        P_OBJ_DESCR-OBJ_ID   = L_COMP_ID.
        P_OBJ_DESCR-TAG      = TAG_DATA.

        READ_TABLE_INDEX DATAS L_COMP_ID <L_DATA>.
        if <L_DATA>-REF1 = 0.
          <L_DATA>      = P_ROOT_DATA.
          <L_DATA>-KIND = DATA_ELEMENT_KIND( <L_DATA>-KIND ).
          <L_DATA>-STR  = L_HEAD.
          <L_DATA>-REF1 = L_TYPE_ID.
        endif.

        return.
      endif.

* keep on searching
      P_OBJ_DESCR = FIND_DATA_COMP( P_DATA_ID   = L_COMP_ID
                                    P_TYPE_ID   = L_TYPE_ID
                                    P_NAME      = L_TAIL
                                    P_ROOT_DATA = P_ROOT_DATA ).


    endif.
  elseif <L_TYPE_ENTRY>-KIND = SYNT_TYPE-REF-ATYP.
    check P_NAME+1(2) = TAG_REF.
    READ_TABLE_INDEX TYPES L_BASE_TYPe <L_TYPE_ENTRY>.
    READ_TABLE_INDEX TYPES <L_TYPE_ENTRY>-REF_OFFSET <L_TYPE_ENTRY>.
    L_TAIL = P_NAME+3.

    P_OBJ_DESCR = FIND_ENV_COMP( P_ENV_ID = <L_TYPE_ENTRY>-REF_OFFSET
                                 P_NAME   = L_TAIL ).
  endif.


endmethod.                    "FIND_DATA_COMP


method FIND_ENHANCEMENT_EXIT .
*---------------------------------------------------------------------*
*       METHOD FIND_FULL_NAME                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

  FIND_ERROR = SPACE.

  READ TABLE ENVS with key KIND = SYNT_XENV-ENH_POINT
                           NAME = P_NAME
                           transporting no fields.

  if SY-SUBRC = 0.
    P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_ENV.
    P_OBJ_DESCR-OBJ_ID   = SY-TABIX.
    P_OBJ_DESCR-TAG      = TAG_ENHANCEMENT_EXIT.
    return.
  endif.

  READ TABLE ENVS with key KIND = SYNT_XENV-ENH_SECTION
                           NAME = P_NAME
                           transporting no fields.

  if SY-SUBRC = 0.
    P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_ENV.
    P_OBJ_DESCR-OBJ_ID   = SY-TABIX.
    P_OBJ_DESCR-TAG      = TAG_ENHANCEMENT_EXIT.
    return.
  endif.


  READ TABLE ENVS with key KIND = SYNT_XENV-ENH_IMPL
                           NAME = P_NAME
                           transporting no fields.

  if SY-SUBRC = 0.
    P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_ENV.
    P_OBJ_DESCR-OBJ_ID   = SY-TABIX.
    P_OBJ_DESCR-TAG      = TAG_ENHANCEMENT_EXIT.
    return.
  endif.
  if P_NAME cs '-&-'.
    data l_name type string.
    l_name = p_name+sy-fdpos.
    shift l_name by 3 places.
    P_OBJ_DESCR = FIND_ENHANCEMENT_EXIT( l_name ).
  else.
    clear P_OBJ_DESCR.
  endif.
endmethod.                    "


method FIND_ENHANCEMENT_IMPL .
*---------------------------------------------------------------------*
*       METHOD FIND_FULL_NAME                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

  FIND_ERROR = SPACE.

  READ TABLE ENVS with key KIND          = SYNT_XENV-ENH_IMPL
                           REF_FULL_NAME = P_FULL_NAME
                           transporting no fields.

  if SY-SUBRC = 0.
    P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_ENV.
    P_OBJ_DESCR-OBJ_ID   = SY-TABIX.
    P_OBJ_DESCR-TAG      = TAG_ENHANCEMENT_IMPL.
    return.
  endif.


  clear P_OBJ_DESCR.
endmethod.                    "


method FIND_ENH_PARENT.
** Search a parent path for the abap object.
** The fullname is a peace of a real full name of an enhacement
** so tah we onby expect a small subset of the possible paths
** We mainly strip all enhancement related noise.
**
  data:
    L_CHUNKS type STANDARD TABLE OF STRING,
    L_CHUNK  type STRING,
    l_name   type STRING.

  split p_full_name at '\' into table l_chunks.
  loop at l_chunks into l_chunk.
    if strlen( l_chunk ) > 3.
      case l_chunk(2).    " '\' is not in the chunk
        when TAG_ENHANCEMENT_EXIT or
             TAG_ENHANCEMENT_IMPL or
             TAG_ENHANCEMENT_SPOT or
             TAG_ENHANCEMENT      or
             TAG_SECTION.
        when others.
          if strlen( l_name ) = 0.
            case l_chunk(2).
              when TAG_PROGRAM or TAG_TYPE or TAG_FUNCTION.
                "nop keep type or program
              when others.
                "prepend the program
                concatenate '\' TAG_PROGRAM ':' PROGRAM into l_name.
            endcase.
          endif.
          concatenate l_name '\' l_chunk into l_name.
      endcase.
    endif.
  endloop.
  if strlen( l_name ) > 4 .
    p_obj_descr = find_full_name( l_name ).
  endif.
endmethod.


method FIND_ENV_COMP .
*---------------------------------------------------------------------*
*       METHOD FIND_ENV_COMP                                          *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

  data:
    L_SRCH type STRING,
    L_HEAD type STRING,
    L_TAIL type STRING,
    L_MAP  type SYNT_STRUC_MAP.

  field-symbols:
    <L_ENV>  like line of ENVS,
    <L_DATA> like line of DATAS.

  FIND_ERROR = SPACE.

  clear P_OBJ_DESCR.

*
* get env entry with id envid
*
  READ_TABLE_INDEX ENVS P_ENV_ID <L_ENV>.
  FIND_ERROR = 'CE'.
  check SY-SUBRC = 0.
  FIND_ERROR = SPACE.

*
* one branch for each kind of "env" tags
*
  case P_NAME+1(2).



    when TAG_DATA.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table <L_ENV>-DATAS with table key NAME = L_HEAD into
      L_MAP.
      FIND_ERROR = 'DE'.
      check SY-SUBRC = 0.
      FIND_ERROR = SPACE.
      if L_TAIL is initial.
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_DATA.
        P_OBJ_DESCR-OBJ_ID   = L_MAP-INDEX.
        P_OBJ_DESCR-TAG      = TAG_DATA.
        return.
      endif.
      READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
      SYNT_IF_IS_TABLEWITHHEAD <L_DATA>-KIND.
      L_MAP-INDEX = <L_DATA>-REF2.
      READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
      SYNT_ENDIF.

      while <L_DATA>-KIND = SYNT_DATA-ATTRALIAS or <L_DATA>-KIND = SYNT_DATA-INHERIT.
        L_MAP-INDEX = <L_DATA>-REF1.
        READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
      endwhile.

      P_OBJ_DESCR = FIND_DATA_COMP( P_DATA_ID   = L_MAP-INDEX
                                    P_TYPE_ID   = <L_DATA>-REF1
                                    P_NAME      = L_TAIL
                                    P_ROOT_DATA = <L_DATA> ).

    when TAG_TYPE.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table <L_ENV>-TYPES with table key NAME = L_HEAD into
      L_MAP.
      FIND_ERROR = 'TE'.
      check SY-SUBRC = 0.
      FIND_ERROR = SPACE.
      if L_TAIL is initial.
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_TYPE.
        P_OBJ_DESCR-OBJ_ID   = L_MAP-INDEX.
        P_OBJ_DESCR-TAG      = TAG_TYPE.
        return.
      endif.
      P_OBJ_DESCR = FIND_TYPE_COMP( P_TYPE_ID = L_MAP-INDEX
                                    P_NAME    = L_TAIL ).

    when TAG_METHOD.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table <L_ENV>-METHODS with table key NAME = L_HEAD
                 into L_MAP.
      FIND_ERROR = 'ME'.
      check SY-SUBRC = 0.
      FIND_ERROR = SPACE.
      if L_TAIL is initial.
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_ENV.
        P_OBJ_DESCR-OBJ_ID   = L_MAP-INDEX.
        P_OBJ_DESCR-TAG      = TAG_METHOD.
        return.
      endif.
      P_OBJ_DESCR = FIND_ENV_COMP( P_ENV_ID = L_MAP-INDEX
                                   P_NAME   = L_TAIL ).

    when TAG_EVENT.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table <L_ENV>-EVENTS with table key NAME = L_HEAD into L_MAP.
      FIND_ERROR = 'EV'.
      check SY-SUBRC = 0.
      FIND_ERROR = SPACE.
      if L_TAIL is initial.
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_ENV.
        P_OBJ_DESCR-OBJ_ID   = L_MAP-INDEX.
        P_OBJ_DESCR-TAG     = TAG_EVENT.
        return.
      endif.
      P_OBJ_DESCR = FIND_ENV_COMP( P_ENV_ID = L_MAP-INDEX
                                   P_NAME   = L_TAIL ).

    when TAG_INTERFACE.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table <L_ENV>-INTERFACES with table key NAME = L_HEAD
                 into L_MAP.
      FIND_ERROR = 'IE'.
      check SY-SUBRC = 0.
      FIND_ERROR = SPACE.
      if L_TAIL is initial.
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_ENV.
        P_OBJ_DESCR-OBJ_ID   = L_MAP-INDEX.
        P_OBJ_DESCR-TAG      = TAG_INTERFACE.
        return.
      endif.
      P_OBJ_DESCR = FIND_ENV_COMP( P_ENV_ID = L_MAP-INDEX
                                   P_NAME   = L_TAIL ).


    when TAG_FORM.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table FORMS with table key NAME = L_HEAD into L_MAP.
      FIND_ERROR = 'OE'.
      check SY-SUBRC = 0.
      if L_TAIL is initial.
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_ENV.
        P_OBJ_DESCR-OBJ_ID   = L_MAP-INDEX.
        P_OBJ_DESCR-TAG      = TAG_FORM.
        return.
      endif.
      P_OBJ_DESCR = FIND_ENV_COMP( P_ENV_ID = L_MAP-INDEX
                                   P_NAME   = L_TAIL ).

    when TAG_SECTION.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      case L_HEAD.
        when 'BEGIN' or 'END' or '%_BEGIN' or '%_END'.
          if L_TAIL+1 = TAG_ENHANCEMENT_IMPL.
            P_OBJ_DESCR-OBJ_KIND = 'S'.
            P_OBJ_DESCR-TAG      = TAG_ENHANCEMENT_IMPL.
            return.
          endif.
      endcase.

    when others.
      return.

  endcase.

endmethod.                    "FIND_ENV_COMP


method FIND_FULL_NAME .
*---------------------------------------------------------------------*
*       METHOD FIND_FULL_NAME                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

  data:
    L_SRCH   type STRING,
    L_HEAD   type STRING,
    L_TAIL   type STRING,
    L_MAP    type SYNT_STRUC_MAP.
  field-symbols:
    <L_TYPE> like line of TYPES,
    <L_DATA> like line of DATAS.

  FIND_ERROR = SPACE.
  clear P_OBJ_DESCR.

  case P_FULL_NAME+1(2).

    when TAG_PREDEF_TYPE.
      L_SRCH = P_FULL_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table PREDEF_TYPES with table key NAME = L_HEAD into L_MAP.
      FIND_ERROR = 'TE'.
      if SY-SUBRC <> 0 and 'a' <= L_HEAD(1) and L_HEAD(2) <= 'z'.
        read table TYPES WITH KEY STR = L_HEAD assigning <L_TYPE>.
        if SY-SUBRC = 0.
          L_MAP-INDEX = SY-TABIX.
        endif.
      endif.
      check SY-SUBRC = 0.
      if L_TAIL is initial.
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_TYPE.
        P_OBJ_DESCR-OBJ_ID   = L_MAP-INDEX.
        P_OBJ_DESCR-TAG      = TAG_TYPE.
        return.
      endif.
      P_OBJ_DESCR = FIND_TYPE_COMP( P_TYPE_ID = L_MAP-INDEX
                                    P_NAME    = L_TAIL ).
      return.

    when TAG_PREDEF_DATA.
      L_SRCH = P_FULL_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table PREDEF_DATAS with table key NAME = L_HEAD into L_MAP.
      FIND_ERROR = 'DE'.
      check SY-SUBRC = 0.
      if L_TAIL is initial.
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_DATA.
        P_OBJ_DESCR-OBJ_ID   = L_MAP-INDEX.
        P_OBJ_DESCR-TAG      = TAG_DATA.
        return.
      endif.
      READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
      SYNT_IF_IS_TABLEWITHHEAD <L_DATA>-KIND.
      L_MAP-INDEX = <L_DATA>-REF2.
      READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
      SYNT_ENDIF.
      P_OBJ_DESCR = FIND_DATA_COMP( P_DATA_ID   = L_MAP-INDEX
                                    P_TYPE_ID   = <L_DATA>-REF1
                                    P_NAME      = L_TAIL
                                    P_ROOT_DATA = <L_DATA> ).
      return.

    when TAG_TYPE.
      L_SRCH = P_FULL_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table GLOBAL_TYPES with table key NAME = L_HEAD into L_MAP.
      FIND_ERROR = 'TE'.
      check SY-SUBRC = 0.
      if L_TAIL is initial.
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_TYPE.
        P_OBJ_DESCR-OBJ_ID   = L_MAP-INDEX.
        P_OBJ_DESCR-TAG      = TAG_TYPE.
        return.
      endif.
      P_OBJ_DESCR = FIND_TYPE_COMP( P_TYPE_ID = L_MAP-INDEX
                                    P_NAME    = L_TAIL ).

    when TAG_DATA.
      L_SRCH = P_FULL_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table GLOBAL_DATAS with table key NAME = L_HEAD into L_MAP.
      FIND_ERROR = 'DE'.
      check SY-SUBRC = 0.
      if L_TAIL is initial.
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_DATA.
        P_OBJ_DESCR-OBJ_ID   = L_MAP-INDEX.
        P_OBJ_DESCR-TAG      = TAG_DATA.
        return.
      endif.
      READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
      SYNT_IF_IS_TABLEWITHHEAD <L_DATA>-KIND.
      L_MAP-INDEX = <L_DATA>-REF2.
      READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
      SYNT_ENDIF.

      while <L_DATA>-KIND = SYNT_DATA-ATTRALIAS or <L_DATA>-KIND = SYNT_DATA-INHERIT.
        L_MAP-INDEX = <L_DATA>-REF1.
        READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
      endwhile.

      P_OBJ_DESCR = FIND_DATA_COMP( P_DATA_ID   = L_MAP-INDEX
                                    P_TYPE_ID   = <L_DATA>-REF1
                                    P_NAME      = L_TAIL
                                    P_ROOT_DATA = <L_DATA> ).

    when TAG_PROGRAM.
      L_SRCH = P_FULL_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      if L_HEAD <> PROGRAM.
        FIND_ERROR = 'OE'.
        return.
      endif.
      if L_TAIL is initial.
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_ENV.
        P_OBJ_DESCR-OBJ_ID   = 3.
        P_OBJ_DESCR-TAG     = TAG_PROGRAM.
        return.
      endif.
      P_OBJ_DESCR = FIND_ENV_COMP( P_ENV_ID = 3
                                   P_NAME   = L_TAIL ).

    when TAG_FUNCTION.
      L_SRCH = P_FULL_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table FUNCTIONS with table key NAME = L_HEAD into L_MAP.
      FIND_ERROR = 'OE'.
      check SY-SUBRC = 0.
      if L_TAIL is initial.
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_ENV.
        P_OBJ_DESCR-OBJ_ID   = L_MAP-INDEX.
        P_OBJ_DESCR-TAG     = TAG_FORM.
        return.
      endif.
      P_OBJ_DESCR = FIND_ENV_COMP( P_ENV_ID = L_MAP-INDEX
                                   P_NAME   = L_TAIL ).

    when TAG_TYPE_POOL.
      L_SRCH = P_FULL_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table TYPEPOOLS with table key NAME = L_HEAD into L_MAP.
      FIND_ERROR = 'OE'.
      check SY-SUBRC = 0.
      if L_TAIL is initial.
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_ENV.
        P_OBJ_DESCR-OBJ_ID   = L_MAP-INDEX.
        P_OBJ_DESCR-TAG      = TAG_TYPE_POOL.
        return.
      endif.

    when TAG_COMMON_PART.
      return.

    when TAG_SHARED_TYPE.
      P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_TYPE.
      P_OBJ_DESCR-OBJ_ID   = P_FULL_NAME+4.
      P_OBJ_DESCR-TAG      = TAG_TYPE.

    when TAG_SHARED_DATA.
      P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_DATA.
      P_OBJ_DESCR-OBJ_ID   = P_FULL_NAME+4.
      P_OBJ_DESCR-TAG      = TAG_DATA.

    when others.

      return.

  endcase.

endmethod.                    "FIND_FULL_NAME


method FIND_TABLE_KEY.
  field-symbols
    <L_TABLE_KEY> like line of TABLE_KEYS.

  read table TABLE_KEYS with table key TABLE_TYPE = P_TYPE_ID
                                       STR        = P_NAME
             assigning <L_TABLE_KEY>.

  P_OBJ_DESCR-OBJ_KIND = 'K'.
  P_OBJ_DESCR-OBJ_ID   = SY-TABIX.
  P_OBJ_DESCR-TAG      = TAG_TABLE_KEY.

endmethod.


method FIND_TYPE_COMP .
*---------------------------------------------------------------------*
*       METHOD FIND_TYPE_COMP                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_BASE_TYPE type I,
    L_TYPE_ID   type I,
    L_SRCH      type STRING,
    L_HEAD      type STRING,
    L_TAIL      type STRING,
    L_LENGTH    type I,
    L_FROM      type I,
    L_TO        type I.
  field-symbols:
    <L_TYPE_ENTRY> like line of TYPES,
    <L_ITEM>       like line of TYPE_CHILDS.
*
* get Id of base type
*
  clear P_OBJ_DESCR.
  L_BASE_TYPE = GET_BASE_TYPE( P_TYPE_ID ).

  check L_BASE_TYPE <> 0.

*
* check if base type is a structure or a table
*
  READ_TABLE_INDEX TYPES L_BASE_TYPE <L_TYPE_ENTRY>.
  check SY-SUBRC = 0.

  case <L_TYPE_ENTRY>-KIND.
    when SYNT_TYPE-STRUC1-ATYP or
         SYNT_TYPE-STRUC2-ATYP or
         SYNT_TYPE-TABLE-ATYP.
*     continue
    when SYNT_TYPE-OBJ1-ATYP or
         SYNT_TYPE-OBJ2-ATYP or
         SYNT_TYPE-INTERFACE-ATYP.
     P_OBJ_DESCR = FIND_ENV_COMP( P_ENV_ID = <L_TYPE_ENTRY>-REF_OFFSET
                                  P_NAME    = P_NAME ).
      return.

*     Error
    when others.
      return.
  endcase.
*
* structure component or table line ...
*
  case P_NAME+1(2).

    when TAG_COMPONENT or TAG_TYPE.
*   Split name
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
*   search for component name in childs( type )
      L_FROM = <L_TYPE_ENTRY>-REF_OFFSET.
      L_TO   = <L_TYPE_ENTRY>-REF_OFFSET + <L_TYPE_ENTRY>-CHILD_CNT.
      loop at TYPE_CHILDS from L_FROM to L_TO
                          assigning <L_ITEM>.
        READ_TABLE_INDEX TYPES <L_ITEM>-TYPE_OFFSET <L_TYPE_ENTRY>.
        if <L_TYPE_ENTRY>-STR = L_HEAD.
          L_TYPE_ID = <L_ITEM>-TYPE_OFFSET.
          exit.
        endif.
      endloop.

      check L_TYPE_ID <> 0.

      if L_TAIL is initial.
*     at the end of the path
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_TYPE.
        P_OBJ_DESCR-OBJ_ID   = L_TYPE_ID.
        P_OBJ_DESCR-TAG      = TAG_TYPE.
        return.
      endif.

*   keep on searching
      P_OBJ_DESCR = FIND_TYPE_COMP( P_TYPE_ID = L_TYPE_ID
                                    P_NAME    = L_TAIL ).

    when TAG_LINE_OF.
*   get line type
      READ_TABLE_INDEX TYPES L_BASE_TYPE <L_TYPE_ENTRY>.
      check SY-SUBRC = 0.
      L_LENGTH = STRLEN( P_NAME ).
      if L_LENGTH = 3.
*     end of path
        P_OBJ_DESCR-OBJ_KIND = SYNT_PARENT_KIND-KIND_TYPE.
        P_OBJ_DESCR-OBJ_ID   = <L_TYPE_ENTRY>-REFTYPE.
        P_OBJ_DESCR-TAG      = TAG_TYPE.
        return.
      endif.
*   keep on searching
      L_SRCH = P_NAME+3.
      p_obj_descr
                 = FIND_TYPE_COMP( P_TYPE_ID = <L_TYPE_ENTRY>-REF_OFFSET
                                   P_NAME    = L_SRCH ).
    when others.
      return.

  endcase.
endmethod.                    "FIND_TYPE_COMP


method GET_ALIAS_TYPE_SYMBOL .
  data:
    L_FULL_NAME         type STRING,
    L_SYMBOL_ALIAS      type ref to CL_ABAP_COMP_ALIAS_TYPE,
    L_SYMBOL_ELEMENTARY type ref to CL_ABAP_COMP_TYPE.

  field-symbols:
    <L_TYPE> like line of TYPES.

  p_level = p_level - 1.

  IF p_LEVEL <= 0.
    raise exception type lcx_recursive_definition.
  ENDIF.


  READ_TABLE_INDEX TYPES P_ENTRY-REF_OFFSET <L_TYPE>.

  if <L_TYPE>-LENGTH < 0.
    create object L_SYMBOL_ELEMENTARY.
    P_RESULT = L_SYMBOL_ELEMENTARY.
    P_RESULT->TYPE_KIND = CL_ABAP_COMP_TYPE=>TYPE_KIND_ELEMENTARY.
  else.
    create object L_SYMBOL_ALIAS.
    TYPE_FULL_NAME( exporting P_TYPE_ID = P_ENTRY-REF_OFFSET importing P_RESULT = L_FULL_NAME ).
    GET_SYMBOL_LEVEL TYPE L_SYMBOL_ALIAS->ALIAS_TYPE L_FULL_NAME <L_TYPE> ?= P_LEVEL.
    P_RESULT = L_SYMBOL_ALIAS.
    P_RESULT->TYPE_KIND = CL_ABAP_COMP_TYPE=>TYPE_KIND_ALIAS.
  endif.

endmethod.


method GET_ALL .
*---------------------------------------------------------------------*
*       METHOD GET_ALL                                                *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_WA         like line of P_RESULT,
    L_LEVEL      like line of LEVELS,
    L_STMNT      like line of STMNTS,
    L_XCROSS     like line of XCROSS,
    L_LEVEL_REF  type standard table of ref to CL_ABAP_SOURCE_INFO,
    L_LEVEL_WA   like line of L_LEVEL_REF,
    L_STMNT_REF  type standard table of ref to CL_ABAP_STATEMENT_INFO,
    L_STMNT_WA   like line of L_STMNT_REF,
    L_PROGRAM    type STRING,
    L_FORM       type STRING,
    L_NUMBER     type STRING,
    L_ID         type STRING,
    L_COLUMN     type I.

  if XCROSS is initial.
    SCAN( ).
  endif.

  if SUBRC > 0.
    P_ERRORS = ERRORS.
    return.
  endif.

  loop at LEVELS into L_LEVEL.
    create object L_LEVEL_WA
           exporting P_NAME = L_LEVEL-NAME
                     P_KIND = L_LEVEL-TYPE.
    append L_LEVEL_WA to L_LEVEL_REF.
  endloop.

  loop at STMNTS into L_STMNT.
    read table L_LEVEL_REF index L_STMNT-LEVEL
               into L_LEVEL_WA.
    create object L_STMNT_WA
           exporting P_SOURCE_INFO  = L_LEVEL_WA
                     P_START_LINE   = L_STMNT-START_LINE
                     P_START_COLUMN = L_STMNT-START_COLUMN
                     P_COLON_LINE   = L_STMNT-COLON_LINE
                     P_COLON_COLUMN = L_STMNT-COLON_LINE
                     P_COMMA_LINE   = L_STMNT-COMMA_LINE
                     P_COMMA_COLUMN = L_STMNT-COMMA_COLUMN
                     P_END_LINE     = L_STMNT-END_LINE
                     P_END_COLUMN   = L_STMNT-END_COLUMN.
    append L_STMNT_WA to L_STMNT_REF.
  endloop.

  loop at XCROSS into L_XCROSS.
    if L_XCROSS-OBJ_KIND = 'S'.
      L_WA-NAME      = L_XCROSS-NAME.
    else.
      GET_NAME(      exporting P_OBJ_KIND = L_XCROSS-OBJ_KIND
                               P_OBJ_ID   = L_XCROSS-OBJ_ID
                     importing P_RESULT   = L_WA-NAME ).
      GET_FULL_NAME( exporting P_OBJ_KIND = L_XCROSS-OBJ_KIND
                               P_OBJ_ID   = L_XCROSS-OBJ_ID
                     importing P_RESULT   = L_WA-FULL_NAME ).
    endif.

    read table L_STMNT_REF index L_XCROSS-STMNT
               into L_WA-STATEMENT.
    case L_XCROSS-ROLE.
      when SYNT_ROLE-FORM.
        GET_FORM_AND_PROGRAM( exporting P_TOKEN   = L_WA-NAME
                              importing P_PROGRAM = L_PROGRAM
                                        P_FORM    = L_FORM ).
        if L_FORM is not initial.
          L_WA-NAME       = L_PROGRAM.
          L_WA-LINE       = L_XCROSS-LINE.
          L_WA-COLUMN     = L_XCROSS-COLUMN.
          L_WA-TAG        = TAG_PROGRAM.
          if L_XCROSS-DEF = 'X'.
            L_WA-GRADE      = GRADE_DEFINITION.
          else.
            L_WA-GRADE      = GRADE_DIRECT.
          endif.
          L_WA-MODE1      = L_XCROSS-MODE1.
          L_WA-MODE2      = L_XCROSS-MODE2.
          append L_WA to P_RESULT.
        endif.
        if L_PROGRAM is not initial.
          L_WA-NAME       = L_FORM.
          L_WA-LINE       = L_XCROSS-LINE.
          L_COLUMN        = L_XCROSS-COLUMN + strlen( L_FORM ) + 1.
          L_WA-COLUMN     = L_COLUMN.
          L_WA-TAG        = TAG_FORM.
          if L_XCROSS-DEF = 'X'.
            L_WA-GRADE      = GRADE_DEFINITION.
          else.
            L_WA-GRADE      = GRADE_DIRECT.
          endif.
          L_WA-MODE1      = L_XCROSS-MODE1.
          L_WA-MODE2      = L_XCROSS-MODE2.
          append L_WA to P_RESULT.
        endif.

      when SYNT_ROLE-MESSAGE_NUMB.
        check L_WA-NAME is not initial.

        GET_MSG_NUMBER_AND_ID( exporting P_TOKEN   = L_WA-NAME
                               importing P_NUMBER  = L_NUMBER
                                         P_ID      = L_ID ).
        if L_NUMBER is not initial.
          L_WA-NAME       = L_NUMBER.
          L_WA-LINE       = L_XCROSS-LINE.
          L_WA-COLUMN     = L_XCROSS-COLUMN.
          L_WA-TAG        = TAG_MESSAGE_NUMBER.
          if L_XCROSS-DEF = 'X'.
            L_WA-GRADE      = GRADE_DEFINITION.
          else.
            L_WA-GRADE      = GRADE_DIRECT.
          endif.
          L_WA-MODE1      = L_XCROSS-MODE1.
          L_WA-MODE2      = L_XCROSS-MODE2.
          append L_WA to P_RESULT.
        endif.
        if L_ID is not initial.
          L_WA-NAME       = L_ID.
          L_WA-LINE       = L_XCROSS-LINE.
          L_COLUMN        = L_XCROSS-COLUMN + strlen( L_NUMBER ) + 1.
          L_WA-COLUMN     = L_COLUMN.
          L_WA-TAG        = TAG_MESSAGE_ID.
          if L_XCROSS-DEF = 'X'.
            L_WA-GRADE      = GRADE_DEFINITION.
          else.
            L_WA-GRADE      = GRADE_DIRECT.
          endif.
          L_WA-MODE1      = L_XCROSS-MODE1.
          L_WA-MODE2      = L_XCROSS-MODE2.
          append L_WA to P_RESULT.
        endif.

      when others.
        L_WA-LINE       = L_XCROSS-LINE.
        L_WA-COLUMN     = L_XCROSS-COLUMN.
        L_WA-TAG        = ROLE_TO_TAG( L_XCROSS-ROLE ).
        if L_XCROSS-DEF = 'X'.
          L_WA-GRADE      = GRADE_DEFINITION.
        else.
          L_WA-GRADE      = GRADE_DIRECT.
        endif.
        L_WA-MODE1      = L_XCROSS-MODE1.
        L_WA-MODE2      = L_XCROSS-MODE2.
        append L_WA to P_RESULT.
    endcase.
  endloop.

  P_ERRORS = ERRORS.
endmethod.                    "GET_ALL


method GET_ALL_REFS .
  data:
    L_CURR_STMNT    type I,
    L_CURR_LEVEL    type I,
    L_LEVEL         type I,
    L_INCLUDE       type PROGRAM,
    L_LINE_COUNT    type I,
    L_SKIP          type SYCHAR01,
    L_SYSTEM_MACRO  type SYCHAR01.
  field-symbols:
    <L_LEVEL>       like line of LEVELS,
    <L_STMNT>       like line of STMNTS,
    <L_XCROSS>      like line of XCROSS.

  GRADES      = P_GRADES.
  EXTENDED    = P_EXTENDED.
  NO_INCLUDES = P_NO_INCLUDES.
  INTERNAL    = P_INTERNAL.

  clear P_RESULT.

  if P_ERRORS is supplied.
    ID_ERRORS = SYNT_ID-ERR_MSG.
  endif.

  SCAN( ).


  case SUBRC.
    when 0.
      P_ABORT = ' '.
      P_ERROR = ' '.
    when 6.
      P_ABORT = 'X'.
      P_ERROR = 'X'.
      P_ERRORS = ERRORS.
    when 8.
      P_ERROR  = 'X'.
      P_ABORT  = 'X'.
      P_ERRORS = ERRORS.
      return.
    when others.
      P_ERRORS = ERRORS.
      P_ERROR  = 'X'.
      P_ABORT  = ' '.
      if ENVS is initial.
        return.
      endif.
  endcase.

  TAGS          = P_TYPES.
  PROGRAM_STMNT = 1.

   try.
      loop at XCROSS assigning <L_XCROSS>.
*   Get Include name

        if <L_XCROSS>-STMNT <> L_CURR_STMNT.
          L_CURR_STMNT = <L_XCROSS>-STMNT.
          read table STMNTS index L_CURR_STMNT
                            assigning <L_STMNT>.

          if <L_STMNT>-LEVEL <> L_CURR_LEVEL.
            clear L_SYSTEM_MACRO.
            L_LEVEL = L_CURR_LEVEL = <L_STMNT>-LEVEL.
            do.                                          "#EC CI_NESTED
              read table LEVELS index L_LEVEL
                         assigning <L_LEVEL>.
              if SY-SUBRC       <> 0 or
                 <L_LEVEL>-TYPE = SYNT_LEVEL_TYPE-PROGRAM.
                exit.
              endif.
              if <L_LEVEL>-TYPE   = SYNT_LEVEL_TYPE-DEFINE and
                 STRLEN(  <L_LEVEL>-NAME ) > 5             and
                 <L_LEVEL>-NAME(5) = '%_CX_'.
                L_SYSTEM_MACRO = 'X'.
              endif.
              L_LEVEL = <L_LEVEL>-LEVEL.
            enddo.
            if <L_LEVEL>-NAME in INCLUDES.
*             or ( strlen( <L_LEVEL>-NAME ) > 30 and <L_LEVEL>-NAME+30 = 'E' ).
              L_SKIP = ' '.
            else.
              L_SKIP = 'X'.
            endif.
            if P_NO_INCLUDES = ' '.
              L_INCLUDE = <L_LEVEL>-NAME.
            endif.
          endif.
        endif.


        if L_SKIP = ' '.
          if L_SYSTEM_MACRO = 'X' and <L_XCROSS>-COLUMN < 0.
            continue.
          endif.
          if P_LOCAL = ' '.
            GET_REFS( exporting P_LOCAL    = P_LOCAL
                                P_TESTCODE = P_TESTCODE
                                P_XCROSS   = <L_XCROSS>
                                P_INCLUDE  = L_INCLUDE
                      changing  P_RESULT   = P_RESULT ).
          else.
            L_LINE_COUNT = LINES( P_RESULT ).
            GET_REFS( exporting P_LOCAL    = P_LOCAL
                                P_TESTCODE = P_TESTCODE
                                P_XCROSS   = <L_XCROSS>
                                P_INCLUDE  = L_INCLUDE
                      changing  P_RESULT   = P_RESULT ).
            if L_LINE_COUNT = LINES( P_RESULT ).
              GET_LOCAL_REFS( exporting P_XCROSS  = <L_XCROSS>
                                        P_INCLUDE = L_INCLUDE
                              changing  P_RESULT  = P_RESULT ).
            endif.
          endif.
        else.
          case <L_XCROSS>-ROLE.
            when SYNT_ROLE-MESSAGE_ID.
              ASSERT_OBJ_KIND <L_XCROSS>-OBJ_KIND 'S'.
              if <L_XCROSS>-STMNT = PROGRAM_STMNT.
                TAG_NAME( exporting P_TAG    = TAG_MESSAGE_ID
                                    P_NAME   = <L_XCROSS>-NAME
                          importing P_RESULT = GLOBAL_MSG_ID ).
              endif.

            when SYNT_ROLE-PROGRAM or
                 SYNT_ROLE-FUNCTIONPOOL or
                 SYNT_ROLE-CLASS_POOL   or
                 SYNT_ROLE-INTF_POOL.
              PROGRAM_STMNT = <L_XCROSS>-STMNT.
          endcase.
        endif.
      endloop.
      clear:
        GLOBAL_MSG_ID,
        PROGRAM_STMNT,
        VISITED.

    catch LCX_READ_TABLE_ERROR.                         "#EC NO_HANDLER
      P_ABORT  = 'X'.
      P_ERROR  = 'X'.

    catch LCX_RECURSIVE_DEFINITION.
      P_ABORT  = 'X'.
      P_ERROR  = 'X'.

  endtry.


endmethod.                    "GET_ALL_GLOBAL_REFS


method GET_ANY_SYMBOL.

  P_LEVEL = P_LEVEL - 1.
  if P_LEVEL <= 0.
    raise exception type LCX_RECURSIVE_DEFINITION.
  endif.
  create object P_RESULT.
  P_RESULT->TAG         = P_ENTRY.
  P_RESULT->FULL_NAME   = P_FULL_NAME.



endmethod.


method GET_ATTR_REFS .

  data:
    L_ENV_ID  type I,
    L_DATA_ID type I,
    L_NAME_1  type STRING,
    L_NAME_2  type STRING,
    L_NAME_3  type STRING,
    L_NAME_4  type STRING,
    L_RESULT  LIKE LINE OF P_RESULT.
  field-symbols:
    <L_DATA>     like line of DATAS,
    <L_PARENT_1> like line of ENVS,
    <L_PARENT_2> like line of ENVS.

  READ_TABLE_INDEX DATAS P_DATA_ID <L_DATA>.

  while <L_DATA>-KIND = SYNT_DATA-INHERIT.
    P_DATA_ID = <L_DATA>-REF1.
    READ_TABLE_INDEX DATAS P_DATA_ID <L_DATA>.
  endwhile.

*  if P_DEF = 'X' and
*      <L_DATA>-KIND <= SYNT_DATA-COMPONENT and IS_STRUCTURE_TYPE( <L_DATA>-REF1 ) = 'X'.
*    insert P_DATA_ID into table OPEN_DATAS.
*  else.
*    read table OPEN_DATAS with table key TABLE_LINE = P_DATA_ID
*               transporting no fields.
*    if SY-SUBRC = 0.
*      P_DEF = 'X'.
*      delete table OPEN_DATAS from P_DATA_ID.
*    endif.
*  endif.
*
  while <L_DATA>-PARENT_KIND <> 'E'.
    READ_TABLE_INDEX DATAS <L_DATA>-PARENT_INDEX <L_DATA>.
  endwhile.

  L_ENV_ID = <L_DATA>-PARENT_INDEX.

  READ_TABLE_INDEX ENVS L_ENV_ID <L_PARENT_1>.
  if <L_PARENT_1>-KIND = SYNT_XENV-INTERFACE.
    READ_TABLE_INDEX ENVS <L_PARENT_1>-PARENT <L_PARENT_2>.
    if P_LOCAL                  = 'X' or
       <L_PARENT_2>-PUBLICCLASS = 'X'.
      TAG_NAME(       exporting P_TAG     = TAG_INTERFACE
                                P_NAME    = <L_PARENT_1>-NAME
                      importing P_RESULT  = L_NAME_2 ).
      ENV_FULL_NAME(  exporting P_ENV_ID  = <L_PARENT_1>-PARENT
                      importing P_RESULT  = L_NAME_3 ).
      TYPE_FULL_NAME( exporting P_TYPE_ID = <L_PARENT_1>-OBJ_TYPE
                      importing P_RESULT =  L_NAME_4 ).
      if TAG_DATA in TAGS.
        L_DATA_ID = P_DATA_ID.
        do.
          DATA_COMP_NAME( exporting P_ENV_ID  = L_ENV_ID
                                    P_DATA_ID = L_DATA_ID
                          importing P_RESULT  = L_NAME_1 ).
          if L_NAME_1 is initial. exit. endif.
          concatenate L_NAME_3 L_NAME_2 L_NAME_1 into L_RESULT-FULL_NAME.

          L_RESULT-TAG       = TAG_DATA.
          GET_GRADE L_RESULT-GRADE P_DEF.
          L_RESULT-INCLUDE   = P_INCLUDE.
          GET_SYMBOL DATA L_RESULT-SYMBOL L_RESULT-FULL_NAME <L_DATA> =.
          INSERT_GLOBAL_REF L_RESULT P_RESULT.

          concatenate L_NAME_4 L_NAME_1 into L_RESULT-FULL_NAME.
          L_RESULT-TAG       = TAG_DATA.
          L_RESULT-GRADE     = GRADE_DIRECT.
          L_RESULT-INCLUDE   = P_INCLUDE.
          GET_SYMBOL DATA L_RESULT-SYMBOL L_RESULT-FULL_NAME <L_DATA> =.
          INSERT_GLOBAL_REF L_RESULT P_RESULT.

          READ_TABLE_INDEX DATAS L_DATA_ID <L_DATA>.
          if <L_DATA>-PARENT_KIND <> 'D'.
            exit.
          endif.
          L_DATA_ID = <L_DATA>-PARENT_INDEX.
        enddo.
      endif.

      if TAG_TYPE in TAGS and P_DEF = ' '.
        TYPE_FULL_NAME( exporting P_TYPE_ID =  <L_PARENT_1>-OBJ_TYPE  importing P_RESULT =  L_RESULT-FULL_NAME ).
        L_RESULT-TAG       = TAG_TYPE.
        L_RESULT-GRADE     = GRADE_COMPONENTS.
        L_RESULT-INCLUDE   = P_INCLUDE.
        INSERT_GLOBAL_REF L_RESULT P_RESULT.

        L_RESULT-FULL_NAME = L_NAME_3.
        L_RESULT-TAG       = TAG_TYPE.
        L_RESULT-GRADE     = GRADE_COMPONENTS.
        L_RESULT-INCLUDE   = P_INCLUDE.
        INSERT_GLOBAL_REF L_RESULT P_RESULT.
      endif.

      TYPE_FULL_NAME( exporting P_TYPE_ID = <L_PARENT_1>-OBJ_TYPE  importing P_RESULT =  L_NAME_2 ).
      if TAG_DATA in TAGS.
        concatenate L_NAME_2 L_NAME_1 into L_RESULT-FULL_NAME.
        L_RESULT-TAG       = TAG_DATA.
        L_RESULT-GRADE     = GRADE_DIRECT.
        L_RESULT-INCLUDE   = P_INCLUDE.
        GET_SYMBOL DATA L_RESULT-SYMBOL L_RESULT-FULL_NAME <L_DATA> =.
        INSERT_GLOBAL_REF L_RESULT P_RESULT.
      endif.

      if TAG_TYPE in TAGS.
        L_RESULT-FULL_NAME = L_NAME_2.
        L_RESULT-TAG       = TAG_TYPE.
        L_RESULT-GRADE     = GRADE_DIRECT.
        L_RESULT-INCLUDE   = P_INCLUDE.
        INSERT_GLOBAL_REF L_RESULT P_RESULT.
      endif.
    endif.
  else.
    if P_LOCAL                  = 'X' or
       <L_PARENT_1>-PUBLICCLASS = 'X'.
      ENV_FULL_NAME(  exporting P_ENV_ID  = L_ENV_ID
                      importing P_RESULT  = L_NAME_2 ).
      if TAG_TYPE in TAGS and P_DEF = ' '.
        L_RESULT-FULL_NAME = L_NAME_2.
        L_RESULT-TAG       = TAG_TYPE.
        L_RESULT-GRADE     = GRADE_COMPONENTS.
        L_RESULT-INCLUDE   = P_INCLUDE.
        INSERT_GLOBAL_REF L_RESULT P_RESULT.
      endif.
      if TAG_DATA in TAGS.
        L_DATA_ID = P_DATA_ID.
        do.
          DATA_COMP_NAME( exporting P_ENV_ID  = L_ENV_ID
                                    P_DATA_ID = L_DATA_ID
                          importing P_RESULT  = L_NAME_1 ).
          if L_NAME_1 is initial. exit. endif.
          concatenate L_NAME_2 L_NAME_1 into L_RESULT-FULL_NAME.
          L_RESULT-TAG       = TAG_DATA.
          GET_GRADE L_RESULT-GRADE P_DEF.
          L_RESULT-INCLUDE   = P_INCLUDE.
          GET_SYMBOL DATA L_RESULT-SYMBOL L_RESULT-FULL_NAME <L_DATA> =.
          INSERT_GLOBAL_REF L_RESULT P_RESULT.

          READ_TABLE_INDEX DATAS L_DATA_ID <L_DATA>.
          if <L_DATA>-PARENT_KIND <> 'D'.
            exit.
          endif.
          L_DATA_ID = <L_DATA>-PARENT_INDEX.
        enddo.
      endif.
    endif.
  endif.

endmethod.


method GET_BADI_METHOD_REFS.
  data:
    L_BADI   type STRING,
    L_METHOD type STRING,
    L_MAP    like line of GLOBAL_TYPES.
  field-symbols:
    <L_TYPE> like line of TYPES,
    <L_DATA> like line of DATAS,
    <L_ENV>  like line of ENVS.

  check P_FULL_NAME(4) = '\TY:'.

  REFS_RESULT-INCLUDE   = P_INCLUDE.
  REFS_RESULT-FULL_NAME = P_FULL_NAME.
  REFS_RESULT-TAG       = TAG_METHOD.
  REFS_RESULT-GRADE     = GRADE_DIRECT.
  REFS_RESULT-SYMBOL    = GET_SYMBOL_ENTRY( P_FULL_NAME ).
  INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

  split P_FULL_NAME at '\ME:' into L_BADI L_METHOD.

  REFS_RESULT-INCLUDE   = P_INCLUDE.
  REFS_RESULT-FULL_NAME = L_BADI.
  REFS_RESULT-TAG       = TAG_TYPE.
  REFS_RESULT-GRADE     = GRADE_COMPONENTS.
  INSERT_GLOBAL_REF REFS_RESULT P_RESULT.


  L_BADI = L_BADI+4.

  read table GLOBAL_TYPES with table key NAME = L_BADI into L_MAP.

  check SY-SUBRC = 0.

  READ_TABLE_INDEX TYPES L_MAP-INDEX <L_TYPE>.

  check SY-SUBRC = 0.

  READ_TABLE_INDEX ENVS <L_TYPE>-REF_OFFSET <L_ENV>.

  check SY-SUBRC = 0.

  read table <L_ENV>-DATAS with table key NAME = 'IMP' into L_MAP.

  check SY-SUBRC = 0.

  READ_TABLE_INDEX datas L_MAP-INDEX <L_DATA>.

  check SY-SUBRC = 0.

  READ_TABLE_INDEX TYPES <L_DATA>-REF1 <L_TYPE>.

  check SY-SUBRC = 0.

  READ_TABLE_INDEX TYPES <L_TYPE>-REF_OFFSET <L_TYPE>.

  concatenate '\TY:' <L_TYPE>-STR into REFS_RESULT-FULL_NAME.
  REFS_RESULT-TAG       = TAG_TYPE.
  REFS_RESULT-GRADE     = GRADE_COMPONENTS.
  INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

  READ_TABLE_INDEX ENVS <L_TYPE>-REF_OFFSET <L_ENV>.

  check SY-SUBRC = 0.

  read table <L_ENV>-METHODS with table key NAME = L_METHOD into L_MAP.

  check SY-SUBRC = 0.

  concatenate '\TY:' <L_TYPE>-STR '\ME:' L_METHOD into REFS_RESULT-FULL_NAME.
  REFS_RESULT-TAG       = TAG_METHOD.
  REFS_RESULT-GRADE     = GRADE_DIRECT.
  INSERT_GLOBAL_REF REFS_RESULT P_RESULT.


endmethod.


method GET_BASE_OBJECT .
*---------------------------------------------------------------------*
*       METHOD GET_BASE_OBJECT                                        *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  field-symbols:
    <L_DATA> like line of DATAS.

  P_RESULT = P_DATA_ID.
  READ_TABLE_INDEX DATAS P_RESULT <L_DATA>.
  SYNT_IF_IS_TABLEWITHHEAD <L_DATA>-KIND.
  P_RESULT = <L_DATA>-REF1.
  READ_TABLE_INDEX DATAS P_RESULT <L_DATA>.
  SYNT_ENDIF.
  do.
    if <L_DATA>-KIND = SYNT_DATA-OBJATTR or
       <L_DATA>-KIND = SYNT_DATA-CLSATTR.
      P_RESULT = <L_DATA>-REF2.
      READ_TABLE_INDEX DATAS P_RESULT <L_DATA>.
    elseif <L_DATA>-KIND = SYNT_DATA-VIEW.
      P_RESULT = <L_DATA>-REF1.
      READ_TABLE_INDEX DATAS P_RESULT <L_DATA>.
    elseif <L_DATA>-KIND = SYNT_DATA-CHECK.
      P_RESULT = <L_DATA>-REF1.
      READ_TABLE_INDEX DATAS P_RESULT <L_DATA>.
    else.
      exit.
    endif.
  enddo.

endmethod.                    "GET_BASE_OBJECT


method GET_BASE_TYPE .
*---------------------------------------------------------------------*
*       METHOD GET_BASE_TYPE                                          *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_LAST   type I.
  field-symbols:
    <L_TYPE> like line of TYPES.

  P_RESULT = P_TYPE_ID.
  L_LAST   = P_RESULT.
  while P_RESULT <> 0.
    READ_TABLE_INDEX TYPES P_RESULT <L_TYPE>.
    case <L_TYPE>-KIND.
      when SYNT_TYPE-AS-ATYP          or
           SYNT_TYPE-TYPEALIAS-ATYP   or
           SYNT_TYPE-TYPEINHERIT-ATYP or
           SYNT_TYPE-INTFIMPL-ATYP.
        L_LAST   = P_RESULT.
        P_RESULT = <L_TYPE>-REF_OFFSET.
      when SYNT_TYPE-TYPE-ATYP.
        if <L_TYPE>-LENGTH = SYNT_GENERIC_TYPE_FLAG.
          P_RESULT = L_LAST.
          exit.
        else.
          L_LAST   = P_RESULT.
          P_RESULT = <L_TYPE>-REF_OFFSET.
        endif.
      when others.
        if <L_TYPE>-LENGTH = SYNT_GENERIC_TYPE_FLAG.
          P_RESULT = L_LAST.
        endif.
        exit.
    endcase.
  endwhile.
endmethod.                    "GET_BASE_TYPE


method GET_CHECK_INFOS.
  if P_RAW_MESSAGES       is supplied. ID_RAW_MESSAGES       = SYNT_ID-TRMSG_RAW. endif.
  if P_LONGTEXT           is supplied. ID_LONGTEXT           = SYNT_ID-LONGTEXT.  endif.
  if P_INCLUDES           is supplied. ID_INCLUDES           = SYNT_ID-INCLUDE.   endif.
  if P_COMMENTS           is supplied. ID_COMMENTS           = SYNT_ID-SCOM.      endif.
  if P_SET_EXTENDED_STMTS is supplied. ID_SET_EXTENDED_STMTS = SYNT_ID-EXTC.      endif.
  if P_PROG_INTERVALS     is supplied. ID_PROG_INTERVALS     = SYNT_ID-PROG.      endif.
  if P_CROSSREF           is supplied. ID_CROSSREF           = SYNT_ID-CROSS.     endif.
  if P_SLIN_TYPES         is supplied. ID_SLIN_TYPES         = SYNT_ID-OTYP.      endif.

  if P_COMMENTS           is supplied. ID_COMMENTS           = SYNT_ID-COMMENT.   endif.
  if P_LONGTEXT           is supplied. ID_LONGTEXT           = SYNT_ID-LONGTEXT.  endif.
  if P_WARNINGS           is supplied. ID_WARNINGS           = SYNT_ID-WARN_MSG.  endif.
  if P_INFOS              is supplied. ID_INFOS              = SYNT_ID-INFO_MSG.  endif.
  if P_OBJECT_USAGE       is supplied. ID_USAGE              = 'USAG'.            endif.


  SCAN( ).

  if P_RAW_MESSAGES       is supplied. P_RAW_MESSAGES       = SLIN_RAW_MESSAGES.       endif.
  if P_INCLUDES           is supplied. P_INCLUDES           = SLIN_INCLUDES.           endif.
  if P_SET_EXTENDED_STMTS is supplied. P_SET_EXTENDED_STMTS = SLIN_SET_EXTENDED_STMTS. endif.
  if P_PROG_INTERVALS     is supplied. P_PROG_INTERVALS     = SLIN_PROG_INTERVALS.     endif.
  if P_CROSSREF           is supplied. P_CROSSREF           = SLIN_CROSSREF.           endif.

*  IF P_INCLUDE            IS SUPLLIED. P_include            = SLIN_INCLUDE.            ENDIF.
*  IF P_OFFSET             IS SUPPLIED. P_offset             = SLIN_OFFSET.             ENDIF.
  if P_RABAXID            is supplied. P_RABAXID            = SLIN_RABAXID.            endif.

  if P_TYPES              is supplied. P_TYPES              = TYPES.                   endif.
  if P_SLIN_TYPES         is supplied. P_SLIN_TYPES         = SLIN_TYPES.              endif.
  if P_TYPE_CHILDS        is supplied. P_TYPE_CHILDS        = TYPE_CHILDS.             endif.
  if P_DATAS              is supplied. P_DATAS              = DATAS.                   endif.
  if P_SLIN_DATAS         is supplied. P_SLIN_DATAS         = SLIN_DATAS.              endif.
  if P_DPARS              is supplied. P_DPARS              = DPARS.                   endif.
  if P_ENVS               is supplied. P_ENVS               = ENVS.                    endif.
  if P_COMPS              is supplied. P_COMPS              = COMPS.                   endif.
  if P_XCROSS             is supplied. P_XCROSS             = XCROSS.                  endif.
  if P_LEVELS             is supplied. P_LEVELS             = LEVELS.                  endif.
  if P_STMNTS             is supplied. P_STMNTS             = STMNTS.                  endif.
  if P_PREDEF_TYPES       is supplied. P_PREDEF_TYPES       = PREDEF_TYPES.            endif.
  if P_PREDEF_DATAS       is supplied. P_PREDEF_DATAS       = PREDEF_DATAS.            endif.
  if P_GLOBAL_TYPES       is supplied. P_GLOBAL_TYPES       = GLOBAL_TYPES.            endif.
  if P_GLOBAL_DATAS       is supplied. P_GLOBAL_DATAS       = GLOBAL_DATAS.            endif.
  if P_FORMS              is supplied. P_FORMS              = FORMS.                   endif.
  if P_FUNCTIONS          is supplied. P_FUNCTIONS          = FUNCTIONS.               endif.
  if P_CLASSES            is supplied. P_CLASSES            = CLASSES.                 endif.
  if P_GLOBAL_CLASSES     is supplied. P_GLOBAL_CLASSES     = GLOBAL_CLASSES.          endif.
  if P_INTFS              is supplied. P_INTFS              = INTFS.                   endif.
  if P_GLOBAL_INTFS       is supplied. P_GLOBAL_INTFS       = GLOBAL_INTFS.            endif.
  if P_TYPEPOOLS          is supplied. P_TYPEPOOLS          = TYPEPOOLS.               endif.

  if P_SUBRC              is supplied. P_SUBRC              = SUBRC.                   endif.
  if P_COMMENTS           is supplied. P_COMMENTS           = COMMENTS.                endif.
  if P_LONGTEXT           is supplied. P_LONGTEXT           = LONGTEXT.                endif.
  if P_WARNINGS           is supplied. P_WARNINGS           = WARNINGS.                endif.
  if P_INFOS              is supplied. P_INFOS              = INFOS.                   endif.
  if P_OBJECT_USAGE       is supplied. P_OBJECT_USAGE       = OBJECT_USAGE.            endif.
  if P_ERRORS             is supplied. P_ERRORS             = ERRORS.                  endif.
endmethod.


method GET_CLASS_INTF_REFS .
  data:
    L_RESULT like line of P_RESULT.
  field-symbols:
    <L_ENV>  like line of ENVS.

  check P_ENV_ID <> 1.
  READ_TABLE_INDEX ENVS P_ENV_ID <L_ENV>.
  case <L_ENV>-KIND.
    when SYNT_XENV-INTFDECL     or
         SYNT_XENV-INTFDECLLOC  or
         SYNT_XENV-CLASS        or
         SYNT_XENV-CLASSDECL.
      if ( P_LOCAL             = 'X' or
           <L_ENV>-PUBLICCLASS = 'X' ) and
           TAG_TYPE in TAGS.
        ENV_FULL_NAME(  exporting P_ENV_ID = P_ENV_ID importing P_RESULT = L_RESULT-FULL_NAME ).
        L_RESULT-TAG       = TAG_TYPE.
        GET_GRADE_2 L_RESULT-GRADE P_GRADE P_DEF.           "'X' 0.
        case <L_ENV>-KIND.
          when SYNT_XENV-CLASS or SYNT_XENV-CLASSDECL.
            GET_SYMBOL CLASS L_RESULT-SYMBOL L_RESULT-FULL_NAME <L_ENV> =.
          when SYNT_XENV-INTFDECL or SYNT_XENV-INTFDECLLOC.
            GET_SYMBOL INTERFACE L_RESULT-SYMBOL L_RESULT-FULL_NAME <L_ENV> =.
        endcase.
        L_RESULT-INCLUDE   = P_INCLUDE.
        L_RESULT-MODE1     = P_MODE1.
        if P_MODE1 = MODE1_TEST.
          TEST_CLASS = P_ENV_ID.
        endif.
        INSERT_GLOBAL_REF L_RESULT P_RESULT.
      endif.
  endcase.
endmethod.                    "GET_METHOD_GLOBAL_REFS


method GET_CLASS_SYMBOL .
  field-symbols:
    <L_ENV> like P_ENTRY.
  data:
    L_FULL_NAME type STRING.

  p_level = p_level - 1.

  IF p_LEVEL <= 0.
    raise exception type lcx_recursive_definition.
  ENDIF.


  create object P_RESULT.
  P_RESULT->TAG                = TAG_TYPE.
  P_RESULT->FULL_NAME          = P_FULL_NAME.
  P_RESULT->TYPE_KIND          = CL_ABAP_COMP_TYPE=>TYPE_KIND_CLASS.
  P_RESULT->IS_ABSTRACT        = P_ENTRY-ABSTRACT.
  P_RESULT->DURATION           = P_ENTRY-DURATION.
  P_RESULT->RISK_LEVEL         = P_ENTRY-RISK_LEVEL.
  P_RESULT->IS_OPEN_IN_PACKAGE = P_ENTRY-OPEN_IN_PAK.

  GET_COMMENTS( exporting P_POS      = P_ENTRY-COMMENT_POS
                          P_INCLUDE  = P_ENTRY-INCL
                          P_LINE     = P_ENTRY-LINE
                importing P_COMMENTS = P_RESULT->PSEUDO_COMMENTS ).

  if P_ENTRY-ALIAS <> 0.
    READ_TABLE_INDEX ENVS P_ENTRY-ALIAS <L_ENV>.
    if SY-SUBRC = 0 and P_ENTRY-ALIAS <> 1.
      ENV_FULL_NAME( exporting P_ENV_ID = P_ENTRY-ALIAS importing P_RESULT = L_FULL_NAME ).
      GET_SYMBOL_LEVEL CLASS P_RESULT->SUPER_CLASS L_FULL_NAME <L_ENV> ?= p_LEVEL.
    endif.
  endif.
endmethod.


method GET_COMMENTS.
  field-symbols:
    <L_COMMENT> like line of PCOMMENTS.
  loop at PCOMMENTS from P_POS assigning <L_COMMENT>.
    if <L_COMMENT>-INCLUDE <> P_INCLUDE or
       <L_COMMENT>-LINE    >  P_LINE.
      exit.
    endif.
    append <L_COMMENT>-COMMENT to P_COMMENTS.
  endloop.
endmethod.


method GET_COMPONENT_REFS .
*---------------------------------------------------------------------*
*       METHOD COMPONENT_NAME                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_MIN_ITEM   type I,
    L_MAX_ITEM   type I,
    L_DATA_ID    type I,
    L_TYPE_ID    type I,
    L_TYPE_ID_1  type I,
    L_CURR_ITEM  type I,
    L_RESULT     like line of P_RESULT,
    L_INSERT     type SYCHAR01.

  field-symbols:
    <L_TYPE>     like line of TYPES,
    <L_ITEM>     like line of TYPE_CHILDS.


  if P_CURR_DATA_ID = P_DATA_ID.
    P_FOUND = 0.
    return.
  elseif P_CURR_DATA_ID > P_DATA_ID.
    P_FOUND = -1.
    return.
  endif.

  L_TYPE_ID_1 = GET_BASE_TYPE( P_TYPE_ID ).

  if L_TYPE_ID_1 = 0.
    message X000(38) with 'Unerwarteter Zustand'(001).
  endif.

  READ_TABLE_INDEX TYPES L_TYPE_ID_1 <L_TYPE>.
* process structures

  case <L_TYPE>-KIND.
    when SYNT_TYPE-STRUC1-ATYP or SYNT_TYPE-STRUC2-ATYP.
* search for component
      L_MAX_ITEM   = <L_TYPE>-REF_OFFSET + <L_TYPE>-CHILD_CNT - 1 .
      read table TYPE_CHILDS index L_MAX_ITEM assigning <L_ITEM>.
      L_DATA_ID    = P_CURR_DATA_ID + <L_ITEM>-NODE_OFFSET.
      if P_DATA_ID > L_DATA_ID.
        L_MIN_ITEM = L_MAX_ITEM.
      else.
        L_MIN_ITEM = <L_TYPE>-REF_OFFSET.
      endif.
      do.
        if L_MIN_ITEM > L_MAX_ITEM.
          P_FOUND = 1.
          return.
        endif.
        L_CURR_ITEM = ( L_MIN_ITEM + L_MAX_ITEM ) div 2.
        read table TYPE_CHILDS index L_CURR_ITEM assigning <L_ITEM>.
        L_DATA_ID = P_CURR_DATA_ID + <L_ITEM>-NODE_OFFSET.
        L_TYPE_ID = <L_ITEM>-TYPE_OFFSET.

        GET_COMPONENT_REFS(
           exporting P_LOCAL        = P_LOCAL
                     P_DATA_ID      = P_DATA_ID
                     P_CURR_DATA_ID = L_DATA_ID
                     P_TYPE_ID      = L_TYPE_ID
                     P_INCLUDE      = P_INCLUDE
           importing P_FOUND        = P_FOUND
           changing  P_RESULT       = P_RESULT ).
        if P_FOUND = 0.
          if TAG_TYPE in TAGS.
            TEST_VISITED 'T' L_TYPE_ID ' '
                         GRADE_DIRECT ' ' P_INCLUDE.
            if SY-SUBRC = 0.
              L_INSERT = 'X'.
            else.
              GET_TYPE_REFS( exporting P_LOCAL   = P_LOCAL
                                       P_TYPE_ID = L_TYPE_ID
                                       P_GRADE   = GRADE_DIRECT
                                       P_DEF     = ' '
                                       P_INCLUDE = P_INCLUDE
                                       P_MODE1   = ' '
                             importing P_INSERT  = L_INSERT
                             changing  P_RESULT  = P_RESULT ).
            endif.

            if L_INSERT         = 'X'         and
              ( P_LOCAL         = 'X' and <L_TYPE>-TYPELOC <> SYNT_LOC-SHARED or
               <L_TYPE>-TYPELOC =  SYNT_LOC-POOL                              or
               <L_TYPE>-TYPELOC =  SYNT_LOC-DDIC ).
              TYPE_FULL_NAME( exporting p_TYPE_ID = L_TYPE_ID_1  importing p_result =  L_RESULT-FULL_NAME ).
              L_RESULT-TAG       = TAG_TYPE.
              L_RESULT-GRADE     = GRADE_COMPONENTS.
              L_RESULT-INCLUDE   = P_INCLUDE.
              INSERT_GLOBAL_REF L_RESULT P_RESULT.
            endif.
          endif.
          return.
        elseif P_FOUND < 0.
          L_MAX_ITEM = L_CURR_ITEM - 1.
        else.
          L_MIN_ITEM = L_CURR_ITEM + 1.
        endif.
      enddo.

    when others.
      P_FOUND = 1.
      return.

  endcase.

endmethod.                    "COMPONENT_NAME


method GET_COMP_REFS .
*---------------------------------------------------------------------*
*       METHOD GET_DATA_REFS                                          *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_NAME       type STRING.
  field-symbols:
    <L_COMP>     like line of COMPS,
    <L_TYPE>     like line of TYPES.

  clear REFS_RESULT.

  read_table_index COMPS P_COMP_ID <L_COMP>.

  READ_TABLE_INDEX TYPES <L_COMP>-REF_TYPE <L_TYPE>.

  if <L_TYPE>-TYPELOC <> SYNT_LOC-SHARED and
     ( P_LOCAL          = 'X'              or
       <L_TYPE>-TYPELOC =  SYNT_LOC-POOL   or
       <L_TYPE>-TYPELOC =  SYNT_LOC-DDIC ).
    REFS_RESULT-INCLUDE   = P_INCLUDE.
    REFS_RESULT-GRADE     = GRADE_DIRECT.
    TYPE_FULL_NAME( exporting P_TYPE_ID = <L_COMP>-REF_TYPE
                    importing P_RESULT  = REFS_RESULT-FULL_NAME ).
    REFS_RESULT-TAG       = TAG_TYPE.
    TAG_NAME( exporting P_TAG    = TAG_TYPE
                        P_NAME   = <L_COMP>-STR
              importing P_RESULT = L_NAME ).
    concatenate REFS_RESULT-FULL_NAME L_NAME into REFS_RESULT-FULL_NAME.
    INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
  endif.


  GET_TYPE_REFS( exporting P_LOCAL   = P_LOCAL
                           P_TYPE_ID = <L_COMP>-REF_TYPE
                           P_GRADE   = GRADE_COMPONENTS
                           P_DEF     = ' '
                           P_INCLUDE = P_INCLUDE
                           P_MODE1   = ' '
                 changing  P_RESULT  = P_RESULT ).


  GET_TYPE_REFS( exporting P_LOCAL   = P_LOCAL
                           P_TYPE_ID = <L_COMP>-TYPE
                           P_GRADE   = GRADE_PROPERTIES
                           P_DEF     = ' '
                           P_INCLUDE = P_INCLUDE
                           P_MODE1   = ' '
                 changing  P_RESULT  = P_RESULT ).

endmethod.


method GET_CONSTANT_VALUE .
*---------------------------------------------------------------------*
*       METHOD GET_CONSTANT_VALUE                                     *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_LENGTH    type I,
    l_temp      type c length 256.
  field-symbols:
    <L_DATA>  like line of DATAS,
    <l_fs>    type X.

  READ_TABLE_INDEX DATAS P_DATA_ID <L_DATA>.
  if <L_DATA>-KIND <> SYNT_DATA-CONSTANT.
    P_DATA_ID = GET_BASE_OBJECT( P_DATA_ID ).
    READ_TABLE_INDEX DATAS P_DATA_ID <L_DATA>.
    if <L_DATA>-KIND <> SYNT_DATA-CONSTANT.
      clear P_VALUE.
      return.
    endif.
  endif.

  GET_DATA_VALUE( exporting P_START  = <L_DATA>-REF2
                            P_COUNT  = <L_DATA>-DPAR_CNT
                  importing P_RESULT = P_VALUE ).
  L_LENGTH = strlen( P_VALUE ) - 2.
  if L_LENGTH > 0 and ( P_VALUE(1) = '''' or
                        P_VALUE(1) = '`' ).
    P_VALUE = P_VALUE+1(L_LENGTH).
    do.
      L_LENGTH = L_LENGTH - 1.
      if L_LENGTH <= 0 or P_VALUE+L_LENGTH(1) <> ` `.
        exit.
      endif.
      P_VALUE = P_VALUE(L_LENGTH).
    enddo.
    if P_VALUE(1) = ` `.
      clear P_VALUE.
    endif.
    if <L_DATA>-STR is initial.
      P_LITL  = 'X'.
    else.
      P_LITL  = ' '.
    endif.
  elseif L_LENGTH > 0 and P_VALUE(2) = '//'.
    P_VALUE = P_VALUE+2(L_LENGTH).
    P_LITL = ' '.
  elseif L_LENGTH > 0 and P_VALUE(1) = '\'.
    l_length    = l_length + 1.
    assign l_temp to <l_fs> casting type X.
    <l_fs> = P_VALUE+1(L_LENGTH).
    L_LENGTH = L_LENGTH / CL_ABAP_CHAR_UTILITIES=>CHARSIZE / 2.
    IF l_length > 256. l_length = 256. ENDIF.
    P_VALUE  = L_TEMP(L_LENGTH).
  else.
    P_LITL = ' '.
  endif.

  if <L_DATA>-STR is initial.
    P_NAME = P_VALUE.
  else.
    P_NAME = <L_DATA>-STR.
  endif.
endmethod.                    "GET_CONSTANT_VALUE


method GET_CTYPE_REFS .
*---------------------------------------------------------------------*
*       METHOD GET_CTYPE_REFS                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_RESULT  like line of P_RESULT,
    L_TYPE_ID type I,
    L_ENV_ID  type I.
  field-symbols:
    <L_TYPE>      like line of TYPES,
    <L_TYPE_1>    like line of TYPES,
    <L_CLASS>     like line of ENVS,
    <L_INTERFACE> like line of ENVS.

  check TAG_TYPE in TAGS.


  READ_TABLE_INDEX TYPES P_TYPE_ID <L_TYPE>.
  check <L_TYPE>-TYPELOC <> SYNT_LOC-PREDEF.
*  if P_DEF = 'X' and
*          ( <L_TYPE>-KIND = SYNT_TYPE-STRUC1-ATYP or
*            <L_TYPE>-KIND = SYNT_TYPE-STRUC2-ATYP ).
*    insert P_TYPE_ID into table OPEN_TYPES.
*  else.
*    read table OPEN_TYPES with table key TABLE_LINE = P_TYPE_ID
*               transporting no fields.
*    if SY-SUBRC = 0.
*      P_DEF = 'X'.
*      delete table OPEN_TYPES from P_TYPE_ID.
*    endif.
*  endif.

  assign <L_TYPE> to <L_TYPE_1>.
  while <L_TYPE_1>-PARENT_KIND = 'T'.
    READ_TABLE_INDEX TYPES <L_TYPE_1>-PARENT_INDEX <L_TYPE_1>.
  endwhile.

  l_env_id = <L_TYPE_1>-PARENT_INDEX.
  READ_TABLE_INDEX ENVS <L_TYPE_1>-PARENT_INDEX <L_CLASS>.
  if <L_CLASS>-KIND = SYNT_XENV-INTERFACE.
    assign <L_CLASS> to <L_INTERFACE>.
     l_env_id = <L_INTERFACE>-PARENT.
    READ_TABLE_INDEX ENVS <L_INTERFACE>-PARENT <L_CLASS>.
  endif.

  if  P_LOCAL              = 'X' or
     <L_CLASS>-PUBLICCLASS = 'X'.
    L_RESULT-INCLUDE   = P_INCLUDE.
    L_RESULT-MODE1     = P_MODE1.
    if P_MODE1 = MODE1_TEST.
      TEST_CLASS = <L_TYPE_1>-PARENT_INDEX.
    endif.
     ENV_FULL_NAME( exporting P_ENV_ID = L_ENV_ID importing P_RESULT = L_RESULT-FULL_NAME ).
    L_RESULT-TAG       = TAG_TYPE.
    GET_SYMBOL CLASS L_RESULT-SYMBOL L_RESULT-FULL_NAME <L_CLASS> =.
    GET_GRADE_2 L_RESULT-GRADE P_GRADE P_DEF. " 'X' 0.
    INSERT_GLOBAL_REF L_RESULT P_RESULT.

    if P_GRADE = GRADE_DIRECT.
      assign <L_TYPE> to <L_TYPE_1>.
      while <L_TYPE_1>-PARENT_KIND  = 'T' and
            <L_TYPE_1>-PARENT_INDEX <> 0.
        L_TYPE_ID = <L_TYPE_1>-PARENT_INDEX.
        READ_TABLE_INDEX TYPES L_TYPE_ID <L_TYPE_1>.
        if ( <L_TYPE_1>-KIND    <> SYNT_TYPE-STRUC1-ATYP and
             <L_TYPE_1>-KIND    <> SYNT_TYPE-STRUC2-ATYP ) or
           ( ( P_LOCAL            <> 'X'  or
               <L_TYPE_1>-TYPELOC = SYNT_LOC-SHARED )   and
             <L_TYPE_1>-TYPELOC <> SYNT_LOC-POOL        and
             <L_TYPE_1>-TYPELOC <> SYNT_LOC-DDIC        and
             <L_TYPE_1>-TYPELOC <> SYNT_LOC-CLAS  ) or
             <L_TYPE_1>-STR     is initial.
          exit.
        endif.
        if P_DEF = ' '.
          L_RESULT-INCLUDE   = P_INCLUDE.
          TYPE_FULL_NAME( exporting P_TYPE_ID = L_TYPE_ID
                          importing P_RESULT  = L_RESULT-FULL_NAME ).
          L_RESULT-TAG       = TAG_TYPE.
          L_RESULT-GRADE     = GRADE_COMPONENTS.
          INSERT_GLOBAL_REF L_RESULT P_RESULT.
        endif.
      endwhile.

      if P_GRADE = GRADE_DIRECT.
        if <L_INTERFACE> is assigned.
          TYPE_FULL_NAME( exporting P_TYPE_ID = <L_INTERFACE>-OBJ_TYPE
                          importing P_RESULT  =  L_RESULT-FULL_NAME ).
          L_RESULT-TAG       = TAG_TYPE.
          L_RESULT-GRADE     = GRADE_COMPONENTS.
          L_RESULT-INCLUDE   = P_INCLUDE.
          L_RESULT-MODE1     = P_MODE1.
          INSERT_GLOBAL_REF L_RESULT P_RESULT.
        endif.
        if P_DEF = ' '.
          ENV_FULL_NAME( exporting P_ENV_ID = <L_CLASS>-ID
                         importing P_RESULT = L_RESULT-FULL_NAME  ).
          L_RESULT-TAG       = TAG_TYPE.
          L_RESULT-GRADE     = GRADE_COMPONENTS.
          L_RESULT-INCLUDE   = P_INCLUDE.
          L_RESULT-MODE1     = P_MODE1.
          INSERT_GLOBAL_REF L_RESULT P_RESULT.
          P_INSERT = 'X'.
        endif.
      endif.
    endif.
  endif.
endmethod.                    "GET_CTYPE_REFS


method GET_DATA_CONSTRUCTOR_REFS .
*---------------------------------------------------------------------*
*       METHOD GET_METHOD_GLOBAL_REFS                                 *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_INDEX  type I.
  field-symbols:
    <L_DATA>     like line of DATAS,
    <L_TYPE>     like line of TYPES.

  do.
    READ_TABLE_INDEX DATAS P_DATA_ID <L_DATA>.
    if <L_DATA>-KIND <= SYNT_DATA-COMPONENT or <L_DATA>-KIND = SYNT_DATA-BOX or <L_DATA>-KIND = SYNT_DATA-BOX_COMP.
      exit.
    endif.
    P_DATA_ID = <L_DATA>-REF1.
  enddo.

  L_INDEX = GET_BASE_TYPE( <L_DATA>-REF1 ).

  READ_TABLE_INDEX TYPES L_INDEX <L_TYPE>.
  check <L_TYPE>-KIND = SYNT_TYPE-REF-ATYP.

  GET_TYPE_CONSTRUCTOR_REFS( exporting P_LOCAL   = P_LOCAL
                                       P_TYPE_ID = <L_TYPE>-REF_OFFSET
                                       P_INCLUDE = P_INCLUDE
                             changing  P_RESULT  = P_RESULT ).


endmethod.


method GET_DATA_ORIG .
*---------------------------------------------------------------------*
*       METHOD GET_DATA_REFS                                          *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
   data:
    L_DPAR_WA like line of DPARS,
    L_END     type I.

  L_END = P_START + P_COUNT.
  loop at DPARS into L_DPAR_WA from P_START to L_END.
    if L_DPAR_WA-KIND = SYNT_DPAR-ORIG.
      P_RESULT = L_DPAR_WA-VALUE.
      return.
    endif.
  endloop.
  clear P_RESULT.
endmethod.


method GET_DATA_REFS .
*---------------------------------------------------------------------*
*       METHOD GET_DATA_REFS                                          *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  field-symbols:
    <L_DATA>     like line of DATAS,
    <L_PARENT>   like line of DATAS,
    <L_TYPE>     like line of TYPES.
  data:
    L_GRADE      type SCR_GRADE,
    L_FULL_NAME  type STRING.

  clear REFS_RESULT.

  P_DATA_ID = GET_BASE_OBJECT( P_DATA_ID ).

  READ_TABLE_INDEX DATAS P_DATA_ID <L_DATA>.
  if ( P_LOCAL          =  'X'           and
       <L_DATA>-DATALOC <> SYNT_LOC-SHARED or
       <L_DATA>-DATALOC = SYNT_LOC-POOL    or
       <L_DATA>-DATALOC = SYNT_LOC-SYS ) and
      TAG_DATA in TAGS                  and
      <L_DATA>-STR      <> 'SPACE'      and
      <L_DATA>-STR      np '*##*##*##*' and
      <L_DATA>-STR      np '*-#*CX#**'.
    REFS_RESULT-INCLUDE   = P_INCLUDE.
    DATA_FULL_NAME( exporting P_DATA_ID = P_DATA_ID
                    importing P_RESULT  = REFS_RESULT-FULL_NAME ).
    if REFS_RESULT-FULL_NAME cp '*-#*CX#**'.
      return.
    endif.
*    if P_DEF = 'X' and <L_DATA>-KIND <= SYNT_DATA-COMPONENT and IS_STRUCTURE_TYPE( <L_DATA>-REF1 ) = 'X'.
*      insert P_DATA_ID into table OPEN_DATAS.
*    else.
*      read table OPEN_DATAS with table key TABLE_LINE = P_DATA_ID
*                 transporting no fields.
*      if SY-SUBRC = 0.
*        P_DEF = 'X'.
*        delete table OPEN_DATAS from P_DATA_ID.
*      endif.
*    endif.
    REFS_RESULT-TAG = TAG_DATA.
    GET_GRADE REFS_RESULT-GRADE P_DEF.
    L_FULL_NAME = REFS_RESULT-FULL_NAME.
    GET_SYMBOL DATA REFS_RESULT-SYMBOL L_FULL_NAME <L_DATA> =.
    INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
    if  <L_DATA>-STR cp 'P%++++'.
      concatenate 'P' <L_DATA>-STR+2(*) into REFS_NAME.
      TAG_NAME_2( exporting P_TAG_1  = TAG_PROGRAM
                            P_NAME_1 = PROGRAM
                            P_TAG_2  = TAG_DATA
                            P_NAME_2 = REFS_NAME
                  importing P_RESULT = REFS_RESULT-FULL_NAME ).
      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
    endif.
  endif.

  if <L_DATA>-DATALOC = SYNT_LOC-CLAS.
    GET_ATTR_REFS( exporting P_LOCAL   = P_LOCAL
                             P_DATA_ID = P_DATA_ID
                             P_DEF     = P_DEF
                             P_INCLUDE = P_INCLUDE
                   changing  P_RESULT  = P_RESULT ).
  endif.

  if P_DEF = SPACE and <L_DATA>-PARENT_KIND = SYNT_PARENT_KIND-KIND_DATA.
    READ_TABLE_INDEX DATAS <L_DATA>-PARENT_INDEX <L_PARENT>.
    if ( <L_DATA>-KIND   <= SYNT_DATA-COMPONENT or <L_DATA>-KIND = SYNT_DATA-BOX or <L_DATA>-KIND = SYNT_DATA-BOX_COMP ) and
       <L_PARENT>-KIND   <= SYNT_DATA-COMPONENT.
      if ( P_LOCAL            = 'X'            or
           <L_PARENT>-DATALOC =  SYNT_LOC-POOL or
           <L_PARENT>-DATALOC =  SYNT_LOC-SYS ) and
           TAG_DATA           in TAGS           and
           <L_PARENT>-STR     <> 'SPACE'        and
           P_DEF              = ' '.
        REFS_RESULT-INCLUDE   = P_INCLUDE.

        DATA_FULL_NAME( exporting P_DATA_ID = <L_DATA>-PARENT_INDEX
                        importing P_RESULT = REFS_RESULT-FULL_NAME ).
        REFS_RESULT-TAG       = TAG_DATA.
        REFS_RESULT-GRADE     = GRADE_DIRECT.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
        REFS_RESULT-GRADE     = GRADE_COMPONENTS.
        L_FULL_NAME = REFS_RESULT-FULL_NAME.
        GET_SYMBOL DATA REFS_RESULT-SYMBOL L_FULL_NAME <L_DATA> =.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      endif.

      READ_TABLE_INDEX TYPES <L_DATA>-REF1 <L_TYPE>.
      if <L_TYPE>-KIND <> SYNT_TYPE-AS-ATYP.
        GET_COMPONENT_REFS(
                exporting P_LOCAL        = P_LOCAL
                          P_DATA_ID      = P_DATA_ID
                          P_CURR_DATA_ID = <L_DATA>-PARENT_INDEX
                          P_TYPE_ID      = <L_PARENT>-REF1
                          P_INCLUDE      = P_INCLUDE
                changing  P_RESULT       = P_RESULT ).
      endif.
    endif.
  endif.

  if ( P_DEF            = SPACE      or
       P_LOCAL          = 'X'        or
       <L_DATA>-DATALOC = SYNT_LOC-DDIC ) and
     ( <L_DATA>-KIND <= SYNT_DATA-COMPONENT or <L_DATA>-KIND = SYNT_DATA-BOX or <L_DATA>-KIND = SYNT_DATA-BOX_COMP ) and
     TAG_TYPE      in TAGS                and
     <L_DATA>-REF1 > 1.
    if P_GRADE = GRADE_DIRECT.
      if <L_DATA>-PARENT_KIND = SYNT_PARENT_KIND-KIND_DATA or
         <L_DATA>-KIND        = SYNT_DATA-DDICTABLE.
        L_GRADE = GRADE_DIRECT.
      else.
        L_GRADE = GRADE_PROPERTIES.
      endif.
    else.
      L_GRADE = P_GRADE.
    endif.
    TEST_VISITED 'T' <L_DATA>-REF1 ' ' L_GRADE ' ' P_INCLUDE.
    if SY-SUBRC = 0.
      return.
    endif.
    GET_TYPE_REFS( exporting P_LOCAL   = P_LOCAL
                             P_TYPE_ID = <L_DATA>-REF1
                             P_GRADE   = L_GRADE
                             P_DEF     = ' '
                             P_INCLUDE = P_INCLUDE
                             P_MODE1   = ' '
                   changing  P_RESULT  = P_RESULT ).

  endif.
endmethod.                    "GET_DATA_REFS


method GET_DATA_SYMBOL.
  data:
    L_FULL_NAME type STRING.
  field-symbols:
    <L_TYPE>    like line of TYPES,
    <L_DATA>    like line of DATAS.

  p_level = p_level - 1.

  IF p_LEVEL <= 0.
    raise exception type lcx_recursive_definition.
  ENDIF.


  if P_ENTRY-KIND <= SYNT_DATA-COMPONENT or P_ENTRY-KIND = SYNT_DATA-BOX or P_ENTRY-KIND = SYNT_DATA-BOX_COMP.
    data  L_DATA_SIMPLE type ref to CL_ABAP_COMP_DATA.
    create object L_DATA_SIMPLE.
    TYPE_FULL_NAME( exporting P_TYPE_ID = P_ENTRY-REF1 importing P_RESULT = L_FULL_NAME ).
    READ_TABLE_INDEX TYPES P_ENTRY-REF1 <L_TYPE>.
    GET_SYMBOL_LEVEL TYPE L_DATA_SIMPLE->TYPE L_FULL_NAME <L_TYPE> ?= p_LEVEL.
    L_DATA_SIMPLE->NODE_KIND = CL_ABAP_COMP_DATA=>DATA_NODE_KIND_SIMPLE.
    P_RESULT = L_DATA_SIMPLE.
  else.

    SYNT_IF_IS_TABLEWITHHEAD P_ENTRY-KIND .
    data  L_DATA_TABLE type ref to CL_ABAP_COMP_TABLE_WITH_HEAD.
    create object L_DATA_TABLE.

    DATA_FULL_NAME( exporting P_DATA_ID = P_ENTRY-REF1 importing P_RESULT = L_FULL_NAME ).
    READ_TABLE_INDEX DATAS P_ENTRY-REF1 <L_DATA>.
    L_DATA_TABLE->TABLE       ?= GET_DATA_SYMBOL( P_ENTRY = <L_DATA> P_FULL_NAME = L_FULL_NAME P_LEVEL = P_LEVEL ).

    DATA_FULL_NAME( exporting P_DATA_ID = P_ENTRY-REF2 importing P_RESULT = L_FULL_NAME ).
    READ_TABLE_INDEX DATAS P_ENTRY-REF2 <L_DATA>.
    L_DATA_TABLE->HEADER_LINE ?= GET_DATA_SYMBOL( P_ENTRY = <L_DATA> P_FULL_NAME = L_FULL_NAME P_LEVEL = P_LEVEL ).

    L_DATA_TABLE->NODE_KIND = CL_ABAP_COMP_DATA=>DATA_NODE_KIND_TABLE_WITH_HEAD.
    P_RESULT = L_DATA_TABLE.
  elseif P_ENTRY-KIND = SYNT_DATA-ATTRALIAS or P_ENTRY-KIND = SYNT_DATA-INHERIT.
    data:
      L_SYMBOL_ALIAS      type ref to CL_ABAP_COMP_ALIAS_DATA.

    READ_TABLE_INDEX DATAS P_ENTRY-REF1 <L_DATA>.
    create object L_SYMBOL_ALIAS.
    DATA_FULL_NAME( exporting P_DATA_ID = P_ENTRY-REF1 importing P_RESULT = L_FULL_NAME ).
    GET_SYMBOL_LEVEL DATA L_SYMBOL_ALIAS->ALIAS_DATA L_FULL_NAME <L_DATA> ?= p_LEVEL.
    P_RESULT = L_SYMBOL_ALIAS.
    P_RESULT->NODE_KIND = CL_ABAP_COMP_DATA=>DATA_NODE_KIND_ALIAS.
  else.
    create object P_RESULT.

    SYNT_ENDIF.

  endif.

  P_RESULT->TAG         = TAG_DATA.
  P_RESULT->FULL_NAME   = P_FULL_NAME.
  P_RESULT->DATA_KIND   = P_ENTRY-KIND.

  case P_ENTRY-MODE.
    when SYNT_MODE-PUBLIC.      P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PUBLIC.
    when SYNT_MODE-PROTECTED.   P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PROTECTED.
    when SYNT_MODE-PACKAGE.     P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PACKAGE.
    when SYNT_MODE-PRIVATE.     P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PRIVATE.
    when others.                P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PUBLIC.
  endcase.


endmethod.


method GET_DATA_VALUE .
*---------------------------------------------------------------------*
*       METHOD GET_DATA_VALUE                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_DPAR_WA like line of DPARS,
    L_END     type I.

  L_END = P_START + P_COUNT.
  loop at DPARS into L_DPAR_WA from P_START to L_END.
    if L_DPAR_WA-KIND = SYNT_DPAR-VALUE.
      P_RESULT = L_DPAR_WA-VALUE.
      return.
    endif.
  endloop.
  clear P_RESULT.
endmethod.                    "GET_DATA_VALUE


method GET_ENHANCEMENT_TEXT.
  constants:
    C_STATE_INITIAL    type I value 0,
    C_STATE_TYPE       type I value 2,
    C_STATE_DATA       type I value 3.

  data:
    L_NAMES     type table of STRING,
    L_NAME      type STRING,
    L_PART      type STRING,
    L_CLASS     type SYCHAR30,
    L_TEXT      type STRING,
    L_STATE     type I,
    L_INDEX     type I value 1,
    L_MAP       type SYNT_STRUC_MAP,
    L_INTERFACE type SYCHAR01.

  field-symbols:
    <L_ENV>  like line of ENVS,
    <L_TYPE> like line of TYPES.

  split P_FULL_NAME at '\' into table L_NAMES.

  define ADD_ITEM.
    IF P_TEXT IS NOT INITIAL. CONCATENATE P_TEXT ',' INTO P_TEXT. ENDIF.
    CONCATENATE P_TEXT &1 INTO P_TEXT SEPARATED BY ' '.
  end-of-definition.

  define ADD_ITEM2.
    IF P_TEXT IS NOT INITIAL. CONCATENATE P_TEXT ',' INTO P_TEXT. ENDIF.
    CONCATENATE P_TEXT &1 &2 INTO P_TEXT SEPARATED BY ' '.
  end-of-definition.

  do.
    read table L_NAMES index L_INDEX into L_PART.
    if SY-SUBRC <> 0.
      exit.
    endif.
    if L_PART is initial.
      add 1 to L_INDEX.
      continue.
    endif.

    if STRLEN( L_PART ) > 3.
      L_NAME = L_PART+3.
    endif.

    case L_STATE.
      when C_STATE_INITIAL.
        case L_PART(2).
          when TAG_PROGRAM.
            if P_LOCAL = ' '.
              if STRLEN( L_NAME ) > 30 and L_NAME+30(2) = 'CP'.
                L_CLASS = L_NAME(30).
                translate L_CLASS using '= '.
*                ADD_ITEM2 'Klasse'(004) L_CLASS.
              elseif STRLEN( L_NAME ) > 30 and L_NAME+30(2) = 'IP'.
                L_CLASS = L_NAME(30).
                translate L_CLASS using '= '.
*                ADD_ITEM2 'Interface'(011) L_CLASS.
              elseif STRLEN( L_NAME ) > 4 and L_NAME(4) = 'SAPL'.
*                ADD_ITEM2 'Funktionsgruppe'(005) L_NAME+4.
              else.
*                ADD_ITEM2 'Programm'(006) L_NAME.
              endif.
            endif.

          when TAG_INCLUDE.
            if P_TEXT is not initial. concatenate P_TEXT ',' into P_TEXT. endif.
            concatenate P_TEXT 'Include'(007) L_NAME into P_TEXT separated by ' '.

          when TAG_ENHANCEMENT.
*            ADD_ITEM2 'Erweiterung'(025) L_NAME.

          when TAG_FORM.
*            ADD_ITEM2 'Form'(008) L_NAME.

          when TAG_FUNCTION.
*           ADD_ITEM2 'Funktionsbaustein'(009) L_NAME .

          when TAG_INTERFACE.
*          ADD_ITEM2  'Interface'(011) L_NAME.

          when TAG_METHOD.
*            ADD_ITEM2  'Methode'(010) L_NAME.

          when TAG_ENHANCEMENT_EXIT.
*            ADD_ITEM2  'Erweiterungs-Exit'(020) L_NAME.


          when TAG_TYPE.
            SCAN( ).
            read table GLOBAL_TYPES with table key NAME = L_NAME into L_MAP.
            if SY-SUBRC <> 0.
              read table ENVS index 3 assigning <L_ENV>.
              read table <L_ENV>-TYPES with table key NAME = L_NAME into L_MAP.
            endif.

            if SY-SUBRC = 0.
              read table TYPES index L_MAP-INDEX assigning <L_TYPE>.
              if SY-SUBRC <> 0. raise INVALID_FULL_NAME. endif.
              case <L_TYPE>-KIND.
                when SYNT_TYPE-OBJ1-ATYP or
                     SYNT_TYPE-OBJ2-ATYP.
                  if P_TEXT is not initial. concatenate P_TEXT ',' into P_TEXT. endif.
                  "ADD_ITEM2 'Klasse'(004) L_NAME.
                  clear L_TEXT.
                  add 1 to L_INDEX.
                  continue.
                when SYNT_TYPE-INTERFACE-ATYP.
                  "ADD_ITEM2  'Interface'(011) L_NAME .
                  clear L_TEXT.
                  add 1 to L_INDEX.
                  continue.
              endcase.
            endif.

            L_STATE = C_STATE_TYPE.
            L_TEXT  = L_NAME.

          when TAG_DATA.
            L_STATE = C_STATE_DATA.
            L_TEXT  = L_NAME.

          when TAG_SECTION.
            case L_NAME.
              when 'PUBLIC'.
                if L_INTERFACE = ' '.
                  if l_index + 2 <= lines( l_names ).
                    read table L_NAMES index L_INDEX + 1 into L_PART.
                    if l_part = 'SE:PROCEDURES'.
                      "ADD_ITEM 'Vor den PUBLIC-Methoden'(027).
                      add 2 to l_index.
                      continue.
                    endif.
                  endif.
                  "ADD_ITEM  'PUBLIC SECTION' .
                endif.
              when 'PROTECTED'.
                if l_index + 2 <= lines( l_names ).
                  read table L_NAMES index L_INDEX + 1 into L_PART.
                  if l_part = 'SE:PROCEDURES'.
                    "ADD_ITEM 'Vor den PROTECTED-Methoden'(028).
                    add 2 to l_index.
                    continue.
                  endif.
                endif.
                "ADD_ITEM 'PROTECTED SECTION'.
              when 'PACKAGE'.
                if l_index + 2 <= lines( l_names ).
                    read table L_NAMES index L_INDEX + 1 into L_PART.
                    if l_part = 'SE:PROCEDURES'.
                      "ADD_ITEM 'Vor den PACKAGE-Methoden'(029).
                      add 2 to l_index.
                      continue.
                    endif.
                  endif.
                "ADD_ITEM  'PRIVATE SECTION'.
              when 'PRIVATE'.
                if l_index + 2 <= lines( l_names ).
                    read table L_NAMES index L_INDEX + 1 into L_PART.
                    if l_part = 'SE:PROCEDURES'.
                      "ADD_ITEM 'Vor den PRIVATE-Methoden'(030).
                      add 2 to l_index.
                      continue.
                    endif.
                  endif.
                "ADD_ITEM  'PRIVATE SECTION'.
              when 'USING'.
                "ADD_ITEM 'USING-Parameter'(012).
                return.
              when 'IMPORTING'.
                "ADD_ITEM  'IMPORTING-Parameter'(013).
                return.
              when 'EXPORTING'.
                "ADD_ITEM 'EXPORTING-Parameter'(014).
                return.
              when 'CHANGING'.
                "ADD_ITEM 'CHANGING-Parameter'(015).
                return.
              when 'TABLES'.
                "ADD_ITEM  'TABLES-Parameter'(016).
                return.
              when 'BEGIN'.
                "ADD_ITEM  'Anfang'(018).
              when 'END'.
                "ADD_ITEM  'Ende'(019).
              when '%_BEGIN'.
                "ADD_ITEM2  'Anfang'(018) '(intern)'(026).
              when '%_END'.
                "ADD_ITEM2  'Ende'(019) '(intern)'(026).
            endcase.

          when TAG_ENHANCEMENT_IMPL.

          when others.
            raise INVALID_FULL_NAME.

        endcase.

      when C_STATE_TYPE.
        case L_PART(2).

          when TAG_TYPE.
            concatenate L_TEXT '-' L_NAME into L_TEXT.

          when others.
            if P_TEXT is not initial. concatenate P_TEXT ',' into P_TEXT. endif.
            if L_TEXT is not initial. concatenate P_TEXT 'Typ' L_TEXT into P_TEXT separated by ' '. endif.
            L_STATE = C_STATE_INITIAL.
            continue.

        endcase.

      when C_STATE_DATA.
        case L_PART(2).

          when TAG_DATA.
            concatenate L_TEXT '-' L_NAME into L_TEXT.

          when others.
            "ADD_ITEM2 'Struktur'(017) L_TEXT.
            L_STATE = C_STATE_INITIAL.
            continue.

        endcase.

    endcase.
    add 1 to L_INDEX.
  enddo.

endmethod.


method GET_ENH_IMPL_REF .
*---------------------------------------------------------------------*
*       METHOD GET_REFS                                               *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  field-symbols:
    <L_ENV> like line of ENVS.

  if P_XCROSS-OBJ_KIND = 'E'.
    READ_TABLE_INDEX ENVS P_XCROSS-OBJ_ID <L_ENV>.
    REFS_RESULT-INCLUDE   = P_INCLUDE.
    REFS_RESULT-FULL_NAME = <L_ENV>-REF_FULL_NAME.
    REFS_RESULT-TAG       = TAG_ENHANCEMENT_IMPL.
    GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
    GET_SYMBOL ENH_IMPL REFS_RESULT-SYMBOL REFS_RESULT-FULL_NAME <L_ENV> =.
    INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
  else.
    ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'S'.
    REFS_RESULT-INCLUDE   = P_INCLUDE.
    REFS_RESULT-FULL_NAME = P_XCROSS-NAME.
    REFS_RESULT-TAG       = TAG_ENHANCEMENT_IMPL.
    REFS_RESULT-GRADE     = GRADE_DIRECT.
    INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
  endif.
endmethod.                    "GET_REFS


method GET_ENH_IMPL_SYMBOL .
  P_LEVEL = P_LEVEL - 1.
  if P_LEVEL <= 0.
    raise exception type LCX_RECURSIVE_DEFINITION.
  endif.
  create object P_RESULT.
  P_RESULT->TAG           = TAG_ENHANCEMENT_IMPL.
  P_RESULT->FULL_NAME     = P_FULL_NAME.
  P_RESULT->REF_FULL_NAME = P_ENTRY-REF_FULL_NAME.
  P_RESULT->MODE          = P_ENTRY-PUBLICCLASS.

endmethod.


method GET_ENV_ALIAS_REFS .
*---------------------------------------------------------------------*
*       METHOD GET_METHOD_GLOBAL_REFS                                 *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_NAME_1 type STRING,
    L_NAME_2 type STRING,
    L_NAME_3 type STRING,
    L_RESULT like line of P_RESULT.
  field-symbols:
    <L_ENV>      like line of ENVS,
    <L_PARENT_1> like line of ENVS,
    <L_PARENT_2> like line of ENVS.

  READ_TABLE_INDEX ENVS P_ENV_ID <L_ENV>.
  case <L_ENV>-KIND.
    when SYNT_XENV-METHODALIAS.
      READ_TABLE_INDEX ENVS <L_ENV>-PARENT <L_PARENT_1>.
      if <L_PARENT_1>-KIND = SYNT_XENV-INTERFACE.
        READ_TABLE_INDEX ENVS <L_PARENT_1>-PARENT <L_PARENT_2>.
        if P_LOCAL                  = 'X' or
           <L_PARENT_2>-PUBLICCLASS = 'X'.
          TAG_NAME( exporting P_TAG  = TAG_METHOD
                                        P_NAME = <L_ENV>-NAME
                              importing P_RESULT = L_NAME_1 ).
          TAG_NAME( exporting P_TAG  = TAG_INTERFACE
                              P_NAME = <L_PARENT_1>-NAME
                              importing P_RESULT = L_NAME_2 ).
          ENV_FULL_NAME(  exporting P_ENV_ID = <L_PARENT_1>-PARENT importing P_RESULT =  L_NAME_3  ).
          if TAG_METHOD in TAGS.
            concatenate L_NAME_3 L_NAME_2 L_NAME_1
                   into L_RESULT-FULL_NAME.
            L_RESULT-TAG       = TAG_METHOD.
            GET_GRADE L_RESULT-GRADE P_DEF.
            L_RESULT-INCLUDE   = P_INCLUDE.
            GET_SYMBOL METHOD L_RESULT-SYMBOL L_RESULT-FULL_NAME <L_ENV> =.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.
          endif.
          if TAG_TYPE in TAGS and P_DEF = ' '.
            TYPE_FULL_NAME( exporting P_TYPE_ID = <L_PARENT_1>-OBJ_TYPE importing P_RESULT = L_RESULT-FULL_NAME ).
            L_RESULT-TAG       = TAG_TYPE.
            L_RESULT-GRADE     = GRADE_COMPONENTS.
            L_RESULT-INCLUDE   = P_INCLUDE.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.
            L_RESULT-FULL_NAME = L_NAME_3.
            L_RESULT-TAG       = TAG_TYPE.
            L_RESULT-GRADE     = GRADE_COMPONENTS.
            L_RESULT-INCLUDE   = P_INCLUDE.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.
          endif.
        endif.
      else.
        if P_LOCAL                  = 'X' or
           <L_PARENT_1>-PUBLICCLASS = 'X'.
          TAG_NAME( exporting P_TAG  = TAG_METHOD
                               P_NAME = <L_ENV>-NAME
                               importing P_RESULT = L_NAME_1 ).
          ENV_FULL_NAME(  exporting P_ENV_ID = <L_ENV>-PARENT importing P_RESULT =  L_NAME_2  ).
          concatenate L_NAME_2 L_NAME_1 into L_RESULT-FULL_NAME.
          if TAG_METHOD in TAGS.
            L_RESULT-TAG       = TAG_METHOD.
            GET_GRADE L_RESULT-GRADE P_DEF.
            L_RESULT-INCLUDE   = P_INCLUDE.
            GET_SYMBOL METHOD L_RESULT-SYMBOL L_RESULT-FULL_NAME <L_ENV> =.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.
          endif.
          if TAG_TYPE in TAGS and P_DEF = ' '.
            L_RESULT-FULL_NAME = L_NAME_2.
            L_RESULT-TAG       = TAG_TYPE.
            L_RESULT-GRADE     = GRADE_COMPONENTS.
            L_RESULT-INCLUDE   = P_INCLUDE.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.
          endif.
        endif.
      endif.

    when SYNT_XENV-EVENTALIAS.
      READ_TABLE_INDEX ENVS <L_ENV>-PARENT <L_PARENT_1>.
      if <L_PARENT_1>-KIND = SYNT_XENV-INTERFACE.
        READ_TABLE_INDEX ENVS <L_PARENT_1>-PARENT <L_PARENT_2>.
        if P_LOCAL                  = 'X' or
           <L_PARENT_2>-PUBLICCLASS = 'X'.
          TAG_NAME( exporting P_TAG  = TAG_EVENT
                               P_NAME = <L_ENV>-NAME
                               importing P_RESULT =  L_NAME_1 ).
          TAG_NAME( exporting P_TAG  = TAG_INTERFACE
                               P_NAME = <L_PARENT_1>-NAME
                               importing P_RESULT =  L_NAME_2 ).
          ENV_FULL_NAME(  exporting P_ENV_ID = <L_PARENT_1>-PARENT importing P_RESULT = L_NAME_3 ).
          if TAG_EVENT in TAGS.
            concatenate L_NAME_3 L_NAME_2 L_NAME_1
                   into L_RESULT-FULL_NAME.
            L_RESULT-TAG       = TAG_EVENT.
            GET_GRADE L_RESULT-GRADE P_DEF.
            L_RESULT-INCLUDE   = P_INCLUDE.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.
          endif.
          if TAG_EVENT in TAGS and P_DEF = ' '.
            TYPE_FULL_NAME( exporting P_TYPE_ID = <L_PARENT_1>-OBJ_TYPE  importing P_RESULT = L_RESULT-FULL_NAME ).
            L_RESULT-TAG       = TAG_TYPE.
            L_RESULT-GRADE     = GRADE_COMPONENTS.
            L_RESULT-INCLUDE   = P_INCLUDE.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.
            L_RESULT-FULL_NAME = L_NAME_3.
            L_RESULT-TAG       = TAG_TYPE.
            L_RESULT-GRADE     = GRADE_COMPONENTS.
            L_RESULT-INCLUDE   = P_INCLUDE.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.
          endif.
        endif.
      else.
        if P_LOCAL                  = 'X' or
           <L_PARENT_1>-PUBLICCLASS = 'X'.
          TAG_NAME( exporting P_TAG  = TAG_EVENT
                                          P_NAME = <L_ENV>-NAME
                                importing P_RESULT =  L_NAME_1 ).
          ENV_FULL_NAME( exporting P_ENV_ID = <L_ENV>-PARENT  importing P_RESULT = L_NAME_2 ).
          concatenate L_NAME_2 L_NAME_1 into L_RESULT-FULL_NAME.
          if TAG_EVENT in TAGS.
            L_RESULT-TAG       = TAG_EVENT.
            GET_GRADE L_RESULT-GRADE P_DEF.
            L_RESULT-INCLUDE   = P_INCLUDE.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.
          endif.
          if TAG_TYPE in TAGS and P_DEF = ' '.
            L_RESULT-FULL_NAME = L_NAME_2.
            L_RESULT-TAG       = TAG_TYPE.
            L_RESULT-GRADE     = GRADE_COMPONENTS.
            L_RESULT-INCLUDE   = P_INCLUDE.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.
          endif.
        endif.
      endif.

  endcase.
endmethod.                    "


method GET_ENV_NAME .
  field-symbols:
    <L_ENV> like line of ENVS.

  READ_TABLE_INDEX ENVS P_ENV_ID <L_ENV>.

  check <L_ENV> is assigned.

  P_NAMe = <L_ENV>-NAME.
endmethod.


method GET_ENV_SYMBOL.

  p_level = p_level - 1.

  IF p_LEVEL <= 0.
    raise exception type lcx_recursive_definition.
  ENDIF.


  case P_TAG.
    when TAG_METHOD.
      P_RESULT = GET_METHOD_SYMBOL( P_ENTRY     = P_ENTRY
                                    P_FULL_NAME = P_FULL_NAME
                                    p_level     = p_level ).

    when TAG_EVENT.
      P_RESULT = GET_EVENT_SYMBOL( P_ENTRY     = P_ENTRY
                                   P_FULL_NAME = P_FULL_NAME ).

    when others.
      create object P_RESULT.
      P_RESULT->TAG       = P_TAG.
      P_RESULT->FULL_NAME = P_FULL_NAME.
  endcase.


endmethod.


method GET_ENV_TYPE .
  field-symbols:
    <L_ENV> like line of ENVS.

  READ_TABLE_INDEX ENVS P_ENV_ID <L_ENV>.

  check <L_ENV> is assigned.

  P_TYPE_ID = <L_ENV>-OBJ_TYPE.
endmethod.


method GET_EVENT_KEYWORD .
  data:
    L_LENGTH type I.

  case P_XCROSS_NAME.
    when 'END-OF-EDITING'
      or 'END-OF-SELECTION'
      or 'INITIALIZATION'
      or 'LOAD-OF-PROGRAM'
      or 'START-OF-EDITING'
      or 'START-OF-SELECTION'.
      P_KEYWORD = P_XCROSS_NAME.
      return.
    when 'TOPA'
      or 'TOPS'.
      P_KEYWORD = 'TOP-OF-PAGE'.
      return.
    when 'AT_USER'
      or 'AT_LINE'.
      P_KEYWORD = 'AT'.
      return.
  endcase.

  L_LENGTH = STRLEN( P_XCROSS_NAME ).

  if L_LENGTH >= 12  and P_XCROSS_NAME(12) = '%_SEL_SCREEN'.
    P_KEYWORD = 'AT'.
    return.
  elseif L_LENGTH >= 5 and P_XCROSS_NAME(5) = '%_GET'.
    P_KEYWORD = 'GET'.
    return.
  elseif ( L_LENGTH = 3 or L_LENGTH = 4 )
     and P_XCROSS_NAME(2) = 'PF'.
    P_KEYWORD = 'GET'.
    return.
  endif.

  message X000(38) with PROGRAM.
endmethod.                    "


method GET_EVENT_SYMBOL.

  create object P_RESULT.
  P_RESULT->TAG         = TAG_EVENT.
  P_RESULT->FULL_NAME   = P_FULL_NAME.

  GET_COMMENTS( exporting P_POS      = P_ENTRY-COMMENT_POS
                          P_INCLUDE  = P_ENTRY-INCL
                          P_LINE     = P_ENTRY-LINE
                importing P_COMMENTS = P_RESULT->PSEUDO_COMMENTS ).

  case P_ENTRY-MODE.
    when SYNT_MODE-PUBLIC.      P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PUBLIC.
    when SYNT_MODE-PROTECTED.   P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PROTECTED.
    when SYNT_MODE-PACKAGE.     P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PACKAGE.
    when SYNT_MODE-PRIVATE.     P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PRIVATE.
    when others.                P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PUBLIC.
  endcase.
  case P_ENTRY-KIND.
    when SYNT_XENV-EVENT.       P_RESULT->COMPKIND = CL_ABAP_COMP_SYMBOL=>COMPKIND_INSTANCE.
    when SYNT_XENV-CLASSEVENT.  P_RESULT->COMPKIND = CL_ABAP_COMP_SYMBOL=>COMPKIND_STATIC.
    when others.                assert 0 = 1.
  endcase.

endmethod.


method GET_FORM_AND_PROGRAM .
*---------------------------------------------------------------------*
*       METHOD GET_FORM_AND_PROGRAM                                   *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_OFFSET type I,
    L_LENGTH type I.

  if P_TOKEN(1) = '('.
    P_FORM = '?'.
    clear P_PROGRAM.
    return.
  endif.

  L_OFFSET = STRLEN( P_TOKEN ) - 1.
  if P_TOKEN+L_OFFSET(1) <> ')'.
    P_FORM = P_TOKEN.
    clear P_PROGRAM.
    return.
  endif.

  if P_TOKEN ca '('.
    P_FORM    = P_TOKEN(SY-FDPOS).
    add 1 to SY-FDPOS.
    L_LENGTH  = L_OFFSET - SY-FDPOS.
    P_PROGRAM = P_TOKEN+SY-FDPOS(L_LENGTH).
    return.
  endif.

  P_FORM = P_TOKEN.
  clear P_PROGRAM.
endmethod.                    "GET_FORM_AND_PROGRAM


method GET_FORM_NAME_FOR_EVENT .
  case P_EVENT.
    when TAG_AT_SELECTION_SCREEN.
      P_RESULT = '%_SEL_SCREEN'.
    when TAG_AT_SELECTION_SCREEN_ON.
      concatenate '%_SEL_SCREEN_' P_NAME into P_RESULT.
    when TAG_AT_SELECTION_SCREEN_ON_END.
      concatenate '%_SEL_SCREEN_' P_NAME '_END' into P_RESULT.
    when TAG_AT_SELECTION_SCREEN_HELP.
      concatenate '%_SEL_SCREEN_' P_NAME '_H' into P_RESULT.
    when TAG_AT_SELECTION_SCREEN_VALUE.
      concatenate '%_SEL_SCREEN_' P_NAME '_V' into P_RESULT.
    when TAG_AT_SELECTION_SCREEN_RADIO.
      concatenate '%_SEL_SCREEN_RADIO_GROUP_' P_NAME into P_RESULT.
    when TAG_AT_SELECTION_SCREEN_BLOCK.
      concatenate '%_SEL_SCREEN_BLOCK_' P_NAME into P_RESULT.
    when TAG_AT_SELECTION_SCREEN_EXIT.
      P_RESULT = '%_SEL_SCREEN_%_EXCOM_%'.
    when TAG_AT_SELECTION_SCREEN_OUTPUT.
      P_RESULT = '%_SEL_SCREEN_O'.
    when TAG_GET.
      concatenate '%_GET_' P_NAME into P_RESULT.
    when TAG_GET_LATE.
      concatenate '%_GET_' P_NAME '_LATE' into P_RESULT.
  endcase.
endmethod.                    "


method GET_FULL_NAME .
*---------------------------------------------------------------------*
*       METHOD GET_FULL_NAME                                          *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  field-symbols:
    <L_TYPE>      like line of TYPES,
    <L_DATA>      like line of DATAS,
    <L_ENV>       like line of ENVS,
    <L_COMP>      like line of COMPS.

  case P_OBJ_KIND.
    when 'T'.
      if P_SKIP_INHERIT = 'X'.
        do.
          READ_TABLE_INDEX TYPES P_OBJ_ID <L_TYPE>.
          if <L_TYPE>-KIND <> SYNT_TYPE-TYPEINHERIT-ATYP. exit. endif.
          P_OBJ_ID = <L_TYPE>-REF_OFFSET.
        enddo.
      endif.
      TYPE_FULL_NAME( exporting P_TYPE_ID = P_OBJ_ID
                      importing P_RESULT  = P_RESULT ).
    when 'D'.
      if P_SKIP_INHERIT = 'X'.
        do.
          READ_TABLE_INDEX DATAS P_OBJ_ID <L_DATA>.
          if <L_DATA>-KIND <> SYNT_DATA-INHERIT. exit. endif.
          P_OBJ_ID = <L_DATA>-REF1.
        enddo.
      endif.
      DATA_FULL_NAME( exporting P_DATA_ID = P_OBJ_ID
                      importing P_RESULT  = P_RESULT ).


    when 'E'.
      if P_SKIP_INHERIT = 'X'.
        do.
          READ_TABLE_INDEX ENVS P_OBJ_ID <L_ENV>.
          if <L_ENV>-KIND <> SYNT_XENV-INHERIT. exit. endif.
          P_OBJ_ID = <L_ENV>-ALIAS.
        enddo.
      endif.
      READ_TABLE_INDEX ENVS P_OBJ_ID <L_ENV>.
      if <L_ENV>-KIND = SYNT_XENV-INTERFACE.
        TYPE_FULL_NAME( exporting P_TYPE_ID = <L_ENV>-OBJ_TYPE
                        importing P_RESULT  = P_RESULT ).
        return.
      endif.

      ENV_FULL_NAME( exporting P_ENV_ID = P_OBJ_ID
                     importing P_RESULT  = P_RESULT ).


    when 'C'.
      READ_TABLE_INDEX COMPS P_OBJ_ID <L_COMP>.
      TYPE_FULL_NAME( exporting P_TYPE_ID = <L_COMP>-REF_TYPE
                      importing P_RESULT  = P_RESULT ).
      concatenate P_RESULT '\TY:' <L_COMP>-STR into P_RESULT.

     when 'K'.
      KEY_FULL_NAME( exporting P_KEY_ID = P_OBJ_ID
                     importing P_RESULT = P_RESULT ).

    when others.
      GET_NAME( exporting P_OBJ_KIND = P_OBJ_KIND
                          P_OBJ_ID   = P_OBJ_ID
                importing P_RESULT   = P_RESULT ).

  endcase.
endmethod.                    "GET_FULL_NAME


method GET_FULL_NAMES_FOR_RANGE .
  data:
    L_LEVEL          type I,
    L_OFFSET         type I,                                 "#EC NEEDED
    L_INDEX          type I,
    L_CURR_STMNT     type I,
    L_CURR_LEVEL     type I,
    L_INCLUDE_FOUND  type SYCHAR01,
    l_name_tag_grade like line of P_NAMES_TAGS_GRADES.
  field-symbols:
    <L_STMNT>       like line of STMNTS,
    <L_LEVEL>       like line of LEVELS,
    <L_XCROSS>      like line of XCROSS.


  CLEAR P_NAMES_TAGS_GRADES.

  SCAN( ).

  if SUBRC = 8 or lines( TYPES ) = 0.
    raise PROGRAM_FATAL_SYNTAX_ERROR.
  endif.

  loop at XCROSS assigning <L_XCROSS> where ROLE <> SYNT_ROLE-ENH_IMPL or
                                            DEF  <> ' '.

    L_INDEX = SY-TABIX.
*   Get Include Name
    if L_CURR_STMNT <> <L_XCROSS>-STMNT.
      L_CURR_STMNT =  <L_XCROSS>-STMNT.
      read table STMNTS index <L_XCROSS>-STMNT
                        assigning <L_STMNT>.
      if L_CURR_LEVEL <> <L_STMNT>-LEVEL.
        L_LEVEL = L_CURR_LEVEL = <L_STMNT>-LEVEL.
        do.                                              "#EC CI_NESTED
          read table LEVELS index L_LEVEL assigning <L_LEVEL>.
          if <L_LEVEL>-TYPE = SYNT_LEVEL_TYPE-PROGRAM or
             SY-SUBRC ne 0.
            exit.
          endif.
          L_LEVEL = <L_LEVEL>-LEVEL.
        enddo.
      endif.
    endif.

    case <L_XCROSS>-ROLE.
      when SYNT_ROLE-MESSAGE_ID.
        ASSERT_OBJ_KIND <L_XCROSS>-OBJ_KIND 'S'.
        if <L_XCROSS>-STMNT = PROGRAM_STMNT.
          TAG_NAME( exporting P_TAG    = TAG_MESSAGE_ID
                              P_NAME   = <L_XCROSS>-NAME
                    importing P_RESULT = GLOBAL_MSG_ID ).
        endif.

      when SYNT_ROLE-FIELD.
        check <L_XCROSS>-OBJ_KIND <> 'S'.


      when SYNT_ROLE-PROGRAM or
           SYNT_ROLE-FUNCTIONPOOL or
           SYNT_ROLE-CLASS_POOL   or
           SYNT_ROLE-INTF_POOL.
        PROGRAM_STMNT = <L_XCROSS>-STMNT.
    endcase.


    if <L_LEVEL>-NAME = P_INCLUDE.
      L_INCLUDE_FOUND = 'X'.
      GET_XCROSS_FULL_NAME( exporting P_XCROSS    = <L_XCROSS>
                                      P_OFFSET    = L_OFFSET
                                      P_INDEX     = L_INDEX
                            importing P_FULL_NAME = L_NAME_TAG_GRADE-FULL_NAME
                                      P_TAG       = L_NAME_TAG_GRADE-TAG
                                      P_GRADE     = L_NAME_TAG_GRADE-GRADE ).
      CHECK L_NAME_TAG_GRADE-FULL_NAME(2) <> '\?'.
      APPEND L_NAME_TAG_GRADE TO P_NAMEs_TAGs_GRADEs.
    endif.


  endloop.

  if L_INCLUDE_FOUND <> 'X'.
    raise INCLUDE_NOT_FOUND.
  endif.

endmethod.                    "


method GET_FULL_NAME_FOR_EVENT .
  data:
    L_OFFSET type I,
    L_LENGTH type I,
    L_NAME   type STRING.

  case P_XCROSS_NAME.
    when 'END-OF-EDITING'.
      P_TAG = TAG_END_OF_EDITING.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG into P_FULL_NAME.
      return.
    when 'END-OF-SELECTION'.
      P_TAG = TAG_END_OF_SELECTION.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG  into P_FULL_NAME.
      return.
    when 'INITIALIZATION'.
      P_TAG = TAG_INITIALIZATION.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG into P_FULL_NAME.
      return.
    when 'LOAD-OF-PROGRAM'.
      P_TAG = TAG_LOAD_OF_PROGRAM.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG into P_FULL_NAME.
      return.
    when 'START-OF-EDITING'.
      P_TAG = TAG_START_OF_EDITING.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG into P_FULL_NAME.
      return.
    when 'START-OF-SELECTION'.
      P_TAG = TAG_START_OF_SELECTION.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG into P_FULL_NAME.
      return.
    when 'TOPA'.
      P_TAG = TAG_TOP_OF_PAGE.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG into P_FULL_NAME.
      return.
    when 'TOPS'.
      P_TAG = TAG_TOP_OF_PAGE_LINE_SELECTION.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG into P_FULL_NAME.
      return.
    when 'AT_USER'.
      P_TAG = TAG_AT_USER_COMMAND.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG   into P_FULL_NAME.
      return.
    when 'AT_LINE'.
      P_TAG = TAG_AT_LINE_SELECTION.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG into P_FULL_NAME.
      return.
  endcase.


  L_LENGTH = STRLEN( P_XCROSS_NAME ).
  IF l_length > 2 and P_XCROSS_NAME(2) = 'PF'.
    P_TAG = TAG_AT_PF.
    concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG ':' P_XCROSS_NAME+2(*) into P_FULL_NAME.
    return.
  endif.
  if L_LENGTH >= 12 and P_XCROSS_NAME(12) = '%_SEL_SCREEN'.
    if L_LENGTH = 12.
      P_TAG = TAG_AT_SELECTION_SCREEN.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG into P_FULL_NAME.
      return.
    endif.
    if L_LENGTH = 22 and P_XCROSS_NAME+12(*) = '_%_EXCOM_%'.
      P_TAG = TAG_AT_SELECTION_SCREEN_EXIT.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG into P_FULL_NAME.
      return.
    endif.
    if L_LENGTH = 14 and P_XCROSS_NAME+12(*) = '_O'.
      P_TAG = TAG_AT_SELECTION_SCREEN_OUTPUT.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG into P_FULL_NAME.
      return.
    endif.
    L_OFFSET = L_LENGTH - 4.
    if P_XCROSS_NAME+L_OFFSET(*) = '_END'.
      L_LENGTH = L_LENGTH - 17.
      P_TAG = TAG_AT_SELECTION_SCREEN_ON_END .
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG ':' P_XCROSS_NAME+13(L_LENGTH)
                  into P_FULL_NAME.
      return.
    endif.
    L_OFFSET = L_LENGTH - 2.
    if P_XCROSS_NAME+L_OFFSET(*) = '_H'.
      L_LENGTH = L_LENGTH - 15.
      P_TAG = TAG_AT_SELECTION_SCREEN_HELP.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG ':' P_XCROSS_NAME+13(L_LENGTH)
                  into P_FULL_NAME.
      return.
    endif.
    L_OFFSET = L_LENGTH - 2.
    if P_XCROSS_NAME+L_OFFSET(*) = '_V'.
      L_LENGTH = L_LENGTH - 15.
      P_TAG = TAG_AT_SELECTION_SCREEN_VALUE.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG ':' P_XCROSS_NAME+13(L_LENGTH)
                  into P_FULL_NAME.
      return.
    endif.
    if L_LENGTH > 25 and P_XCROSS_NAME+12(13) = '_RADIO_GROUP_'.
      L_LENGTH = L_LENGTH - 15.
      P_TAG    = TAG_AT_SELECTION_SCREEN_RADIO.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG ':' P_XCROSS_NAME+25(*)
                  into P_FULL_NAME.
      return.
    endif.
    P_TAG = TAG_AT_SELECTION_SCREEN_ON.
    concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG ':' P_XCROSS_NAME+13(*)
                into P_FULL_NAME.

  elseif L_LENGTH >= 5 and P_XCROSS_NAME(5) = '%_GET'.
    L_OFFSET = STRLEN( P_XCROSS_NAME ) - 5.
    if P_XCROSS_NAME+L_OFFSET(5) = '_LATE'.
      L_OFFSET    = L_OFFSET - 6.
      L_NAME      = P_XCROSS_NAME+6(L_OFFSET).
      P_TAG       = TAG_GET_LATE.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG  ':' L_NAME into P_FULL_NAME.
    else.
      L_OFFSET    = L_OFFSET - 1.
      L_NAME      = P_XCROSS_NAME+6(L_OFFSET).
      P_TAG       = TAG_GET.
      concatenate '\' TAG_PROGRAM ':' PROGRAM '\' P_TAG  ':' L_NAME into P_FULL_NAME.
    endif.
  endif.

endmethod.                    "


method GET_FULL_NAME_FOR_POSITION .
  data:
    L_COLUMN_MAX    type I,
    L_NAME          type STRING,
    L_LEVEL         type I,
    L_OFFSET        type I,                                 "#EC NEEDED
*    L_INDEX         type I,
    L_CURR_STMNT    type I,
    L_CURR_LEVEL    type I,
    L_INCLUDE_FOUND type SYCHAR01,
    L_POSITION      like line of POSITIONS,
    L_FOUND         type SYCHAR01.
  field-symbols:
    <L_STMNT>       like line of STMNTS,
    <L_LEVEL>       like line of LEVELS,
    <L_XCROSS>      like line of XCROSS.

  SCAN( ).

  if SUBRC = 8 or LINES( TYPES ) = 0.
    raise PROGRAM_FATAL_SYNTAX_ERROR.
  endif.

  case SUBRC.
    when 0.
      P_ABORT = ' '.
      P_ERROR = ' '.
    when 6.
      P_ABORT = 'X'.
      P_ERROR = 'X'.
    when others.
      P_ERROR  = 'X'.
      P_ABORT  = ' '.
      if ENVS is initial.
        return.
      endif.
  endcase.


  read table POSITIONS with table key INCLUDE = P_INCLUDE
                                      LINE    = P_LINE into L_POSITION.
  if SY-SUBRC <> 0.
    L_POSITION-TABIX = 1.
  endif.

  loop at XCROSS assigning <L_XCROSS> from L_POSITION-TABIX
                                      where ROLE <> SYNT_ROLE-ENH_IMPL or
                                            DEF  <> ' '.

    L_POSITION-TABIX = SY-TABIX.
*   Get Include Name
    if L_CURR_STMNT <> <L_XCROSS>-STMNT.
      L_CURR_STMNT =  <L_XCROSS>-STMNT.
      read table STMNTS index <L_XCROSS>-STMNT
                        assigning <L_STMNT>.
      if L_CURR_LEVEL <> <L_STMNT>-LEVEL.
        L_LEVEL = L_CURR_LEVEL = <L_STMNT>-LEVEL.
        do.                                              "#EC CI_NESTED
          read table LEVELS index L_LEVEL assigning <L_LEVEL>.
          if <L_LEVEL>-TYPE = SYNT_LEVEL_TYPE-PROGRAM or
             SY-SUBRC ne 0.
            L_POSITION-INCLUDE = <L_LEVEL>-NAME.
            L_POSITION-LINE = 0.
            exit.
          endif.
          L_LEVEL = <L_LEVEL>-LEVEL.

        enddo.
      endif.
    endif.

    case <L_XCROSS>-ROLE.
      when SYNT_ROLE-MESSAGE_ID.
        ASSERT_OBJ_KIND <L_XCROSS>-OBJ_KIND 'S'.
        if <L_XCROSS>-STMNT = PROGRAM_STMNT.
          TAG_NAME( exporting P_TAG    = TAG_MESSAGE_ID
                              P_NAME   = <L_XCROSS>-NAME
                    importing P_RESULT = GLOBAL_MSG_ID ).
        endif.

      when SYNT_ROLE-FIELD.
        check <L_XCROSS>-OBJ_KIND <> 'S'.

      when SYNT_ROLE-FORM_PARAM.
        continue.


      when SYNT_ROLE-PROGRAM or
           SYNT_ROLE-FUNCTIONPOOL or
           SYNT_ROLE-CLASS_POOL   or
           SYNT_ROLE-INTF_POOL.
        PROGRAM_STMNT = <L_XCROSS>-STMNT.
    endcase.

    if POSITION_INDEX = ' ' and <L_XCROSS>-LINE <> L_POSITION-LINE.
      L_POSITION-LINE = <L_XCROSS>-LINE.
      insert L_POSITION into table POSITIONS.
    endif.

    if L_FOUND = 'X'.
      continue.
    endif.

    if <L_LEVEL>-NAME = P_INCLUDE.
      L_INCLUDE_FOUND = 'X'.

      check <L_XCROSS>-LINE = P_LINE.

      check <L_XCROSS>-COLUMN <= P_COLUMN.

      if <L_XCROSS>-COLUMN < P_COLUMN.
        if <L_XCROSS>-OBJ_KIND = 'S'.
          L_COLUMN_MAX = <L_XCROSS>-COLUMN + STRLEN( <L_XCROSS>-NAME ).
        else.
          GET_NAME_AND_OFFSET(
                           exporting  P_OBJ_KIND = <L_XCROSS>-OBJ_KIND
                                      P_OBJ_ID   = <L_XCROSS>-OBJ_ID
                                      P_OBJ_ID_P = 0
*                                      P_DEF      = <L_XCROSS>-DEF
                           importing  P_NAME     = L_NAME
                                      P_OFFSET   = L_OFFSET ).
          L_COLUMN_MAX = <L_XCROSS>-COLUMN + L_OFFSET + STRLEN( L_NAME ).
        endif.
        check P_COLUMN < L_COLUMN_MAX.
      endif.
      L_OFFSET = P_COLUMN - <L_XCROSS>-COLUMN.
      GET_XCROSS_FULL_NAME( exporting P_XCROSS    = <L_XCROSS>
                                      P_OFFSET    = L_OFFSET
                                      P_INDEX     = L_POSITION-TABIX
                            importing P_FULL_NAME = P_FULL_NAME
                                      P_TAG       = P_TAG
                                      P_GRADE     = P_GRADE
                                      P_VALID     = L_FOUND ).
      if L_FOUND = ' ' and P_CREATE_INDEX = ' ' or POSITION_INDEX = 'X'.
        return.
      endif.

    endif.


  endloop.

  POSITION_INDEX = 'X'.

  if L_FOUND = ' '.

    if L_INCLUDE_FOUND = 'X'.
      raise OBJECT_NOT_FOUND.
    else.
      raise INCLUDE_NOT_FOUND.
    endif.
  endif.

endmethod.                    "


method GET_IDS .
*---------------------------------------------------------------------*
*       METHOD GET_XCROSS_IDS                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_TAG           type SCR_TAG,
    L_SRCH          type STRING,
    L_HEAD          type STRING,
    L_TAIL          type STRING,
    L_MAP           type SYNT_STRUC_MAP,
    L_OBJ_DESCR     type OBJINFO,
    L_GRADE         type SCR_GRADE,
    L_ID_GRADE      type line of T_ID_GRADES.

  field-symbols:
    <L_TYPE>          like line of TYPES,
    <L_DATA>          like line of DATAS,
    <L_FULL_NAME>     like line of P_FULL_NAMES.

  clear P_XCROSS_IDS.

  loop at P_FULL_NAMES assigning <L_FULL_NAME>.
    TABIX = SY-TABIX.

    if strlen( <L_FULL_NAME>-FULL_NAME ) <   5 or
       <L_FULL_NAME>-FULL_NAME(1)        <> '\'.
      raise exception type LCX_FULL_NAME_SYNTAX_ERROR.
    endif.

    if <L_FULL_NAME>-GRADE = GRADE_DEFINITION.
      L_GRADE = GRADE_DEFINITION.
    else.
      L_GRADE = GRADE_DIRECT.
    endif.

    L_TAG = <L_FULL_NAME>-FULL_NAME+1(2).

    case L_TAG.
      when TAG_DATA.
        "L_SRCH = <L_FULL_NAME>-FULL_NAME+4.
        split L_SRCH at '\' into L_HEAD L_TAIL.
        if L_HEAD is initial.
          L_HEAD = L_TAIL.
          clear L_TAIL.
        endif.
        if not L_TAIL is initial.
          concatenate '\' L_TAIL into L_TAIL.
        endif.
        read table GLOBAL_DATAS with table key NAME = L_HEAD into L_MAP.
        if SY-SUBRC <> 0. raise exception type LCX_OBJECT_NOT_FOUND. endif.

        if L_TAIL is initial.
          APPEND_XCROSS_ID_ANY 'D' L_MAP-INDEX 0 L_GRADE <L_FULL_NAME>-FULL_NAME.
          CREATE_SYMBOL_ENTRY  'D' L_MAP-INDEX <L_FULL_NAME>-FULL_NAME.
          APPEND_XCROSS_DEP_ID D   L_MAP-INDEX   L_GRADE <L_FULL_NAME>-GRADE TAG_DATA <L_FULL_NAME>-FULL_NAME.

        else.
          READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
          SYNT_IF_IS_TABLEWITHHEAD <L_DATA>-KIND.
          L_MAP-INDEX = <L_DATA>-REF2.
          READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
          SYNT_ENDIF.
          while <L_DATA>-KIND = SYNT_DATA-ATTRALIAS or <L_DATA>-KIND = SYNT_DATA-INHERIT.
            L_MAP-INDEX = <L_DATA>-REF1.
            READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
          endwhile.

          GET_IDS_DATA_COMP( exporting P_DATA_ID      = L_MAP-INDEX
                                       P_TYPE_ID      = <L_DATA>-REF1
                                       P_NAME         = L_TAIL
                                       P_FULL_NAME    = <L_FULL_NAME>-FULL_NAME
                                       P_GRADE        = L_GRADE
                                       P_GRADE_NEEDED = <L_FULL_NAME>-GRADE
                             importing P_XCROSS_IDS = P_XCROSS_IDS ).

        endif.

      when TAG_TYPE.
        "L_SRCH = <L_FULL_NAME>-FULL_NAME+4.
        split L_SRCH at '\' into L_HEAD L_TAIL.
        if L_HEAD is initial.
          L_HEAD = L_TAIL.
          clear L_TAIL.
        endif.
        if not L_TAIL is initial.
          concatenate '\' L_TAIL into L_TAIL.
        endif.
        read table GLOBAL_TYPES with table key NAME = L_HEAD into L_MAP.

        if SY-SUBRC <> 0.
          "APPEND_XCROSS_STRING_1 SYNT_ROLE-GLOBAL_CLASS <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.
          continue.
        endif.

        if L_TAIL is initial.

          "APPEND_XCROSS_STRING_1  SYNT_ROLE-GLOBAL_CLASS <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.

*          APPEND_XCROSS_TYPE     L_MAP-INDEX L_GRADE <L_FULL_NAME>-FULL_NAME.

          APPEND_XCROSS_ID_ANY 'T' L_MAP-INDEX 0 L_GRADE <L_FULL_NAME>-FULL_NAME.

          APPEND_XCROSS_DEP_ID T L_MAP-INDEX L_GRADE <L_FULL_NAME>-GRADE TAG_TYPE <L_FULL_NAME>-FULL_NAME.

          if L_HEAD(1) = 'P' and strlen( L_HEAD ) = 5 and L_HEAD+1 co '0123456789'.
           " APPEND_XCROSS_STRING_1 SYNT_ROLE-INFOTYPE L_HEAD+1 GRADE_DEF_TO_DIRECT <L_FULL_NAME>-FULL_NAME.
          endif.

          READ_TABLE_INDEX TYPES L_MAP-INDEX <L_TYPE>.
          if SY-SUBRC = 0 and <L_TYPE>-KIND = SYNT_TYPE-INTERFACE-ATYP.
            APPEND_XCROSS_DEP_ID_I I L_MAP-INDEX <L_FULL_NAME>-GRADE  <L_FULL_NAME>-GRADE TAG_ANY ' ' <L_FULL_NAME>-FULL_NAME.
          endif.

        else.
          GET_IDS_TYPE_COMP( exporting P_TYPE_ID      = L_MAP-INDEX
                                       P_NAME         = L_TAIL
                                       P_FULL_NAME    = <L_FULL_NAME>-FULL_NAME
                                       P_GRADE        = L_GRADE
                                       P_GRADE_NEEDED = <L_FULL_NAME>-GRADE
                             importing P_XCROSS_IDS   = P_XCROSS_IDS ).
        endif.


      when TAG_INCLUDE.
        "split <L_FULL_NAME>-FULL_NAME+4 at '\' into L_HEAD L_TAIL.
        if L_TAIL is initial.
          "APPEND_XCROSS_STRING L_TAG <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.
          continue.
        endif.

        concatenate '\' L_TAIL into L_TAIL.
        GET_IDS_INCLUDE( exporting  P_COMP_NAME   = L_TAIL
                                    P_FULL_NAME   = <L_FULL_NAME>-FULL_NAME
                                    P_GRADE       = <L_FULL_NAME>-GRADE
                         changing   P_XCROSS_IDS  = P_XCROSS_IDS ).

      when TAG_MATCHCODE.
        "APPEND_XCROSS_STRING L_TAG <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.

      when TAG_MESSAGE_ID.
        "L_SRCH = <L_FULL_NAME>-FULL_NAME+4.
        split L_SRCH at '\' into L_HEAD L_TAIL.
        if L_TAIL is initial.
          APPEND_XCROSS_STRING  L_TAG              L_SRCH L_GRADE <L_FULL_NAME>-FULL_NAME.
          APPEND_XCROSS_BRACKET TAG_MESSAGE_NUMBER L_SRCH L_GRADE <L_FULL_NAME>-FULL_NAME.
          APPEND_XCROSS_FIELD   TAG_MESSAGE_ID     L_SRCH L_GRADE <L_FULL_NAME>-FULL_NAME.
          continue.
        endif.
        L_TAG = L_TAIL(2).
        if L_TAG <> TAG_MESSAGE_NUMBER.
          raise exception type LCX_FULL_NAME_SYNTAX_ERROR.
        endif.
        APPEND_XCROSS_MESSAGE L_TAG L_TAIL+3 L_HEAD L_GRADE <L_FULL_NAME>-FULL_NAME.

      when TAG_PROGRAM.
        "split <L_FULL_NAME>-FULL_NAME+4 at '\' into L_HEAD L_TAIL.
        if L_TAIL is initial.
          "APPEND_XCROSS_STRING  L_TAG                       <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.
          "APPEND_XCROSS_BRACKET TAG_FORM                    <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.
          "APPEND_XCROSS_FIELD_1 SYNT_ROLE-PF_STATUS_PROGRAM <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.
          continue.
        endif.
        concatenate '\' L_TAIL into L_TAIL.
        if L_HEAD = PROGRAM.
          GET_IDS_LOCAL_PROGRAM( exporting  P_COMP_NAME   = L_TAIL
                                            P_FULL_NAME   = <L_FULL_NAME>-FULL_NAME
                                            P_GRADE       = <L_FULL_NAME>-GRADE
                                 changing   P_XCROSS_IDS  = P_XCROSS_IDS ).

        else.
          GET_IDS_EXTERN_PROGRAM( exporting  P_PROGRAM    = L_HEAD
                                             P_COMP_NAME  = L_TAIL
                                             P_FULL_NAME  = <L_FULL_NAME>-FULL_NAME
                                             P_GRADE      = <L_FULL_NAME>-GRADE
                                  changing   P_XCROSS_IDS = P_XCROSS_IDS ).
        endif.


      when TAG_CUST_FUNCTION.
        search <L_FULL_NAME>-FULL_NAME+4 for '\'.
        if SY-SUBRC = 0.
          raise exception type LCX_OBJECT_NOT_FOUND.
        endif.
        "APPEND_XCROSS_FIELD L_TAG <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.

      when TAG_DIALOG      or
           TAG_TRANSACTION or
           TAG_AUTHORITY_OBJECT.
        "APPEND_XCROSS_FIELD L_TAG <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.

      when TAG_SET_GET_ID.
        "APPEND_XCROSS_STRING L_TAG <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.
        "APPEND_XCROSS_FIELD  L_TAG <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.

      when SYNT_ROLE-MATCHCODE_OBJECT or
           SYNT_ROLE-INCLUDE.
        "APPEND_XCROSS_STRING L_TAG <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.

      when TAG_MACRO.
        "APPEND_XCROSS_GLOBSTR L_TAG <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.

      when TAG_RMAC_MACRO.
        "APPEND_XCROSS_STRING  L_TAG <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.

      when TAG_BREAK_POINT.
        "APPEND_XCROSS_STRING  L_TAG <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.

      when TAG_TRANSFORMATION.
"        APPEND_XCROSS_STRING  L_TAG <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.

      when TAG_ENHANCEMENT_SPOT.
        "APPEND_XCROSS_STRING  L_TAG <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.

      when TAG_PREDEF_TYPE.
        L_SRCH = <L_FULL_NAME>-FULL_NAME+4.
        split L_SRCH at '\' into L_HEAD L_TAIL.
        if L_HEAD is initial.
          L_HEAD = L_TAIL.
          clear L_TAIL.
        endif.
        if not L_TAIL is initial.
          concatenate '\' L_TAIL into L_TAIL.
        endif.
        read table PREDEF_TYPES with table key NAME = L_HEAD into L_MAP.
        FIND_ERROR = 'TE'.
        if SY-SUBRC <> 0 and 'a' <= L_HEAD(1) and L_HEAD(2) <= 'z'.
          read table TYPES WITH KEY STR = L_HEAD assigning <L_TYPE>.
          if SY-SUBRC = 0.
            L_MAP-INDEX = SY-TABIX.
          endif.
        endif.
        if SY-SUBRC <> 0. raise exception type LCX_FULL_NAME_SYNTAX_ERROR. endif.

        if L_TAIL is initial.
          APPEND_XCROSS_TYPE   L_MAP-INDEX   L_GRADE                      <L_FULL_NAME>-FULL_NAME.
          APPEND_XCROSS_DEP_ID T L_MAP-INDEX L_GRADE <L_FULL_NAME>-GRADE TAG_TYPE <L_FULL_NAME>-FULL_NAME.
        else.
          GET_IDS_TYPE_COMP( exporting P_TYPE_ID      = L_MAP-INDEX
                                       P_NAME         = L_TAIL
                                       P_FULL_NAME    = <L_FULL_NAME>-FULL_NAME
                                       P_GRADE        = L_GRADE
                                       P_GRADE_NEEDED = <L_FULL_NAME>-GRADE
                             importing P_XCROSS_IDS   = P_XCROSS_IDS ).
        endif.

      when TAG_PREDEF_DATA.
        L_SRCH = <L_FULL_NAME>-FULL_NAME+4.
        split L_SRCH at '\' into L_HEAD L_TAIL.
        if L_HEAD is initial.
          L_HEAD = L_TAIL.
          clear L_TAIL.
        endif.
        if not L_TAIL is initial.
          concatenate '\' L_TAIL into L_TAIL.
        endif.
        read table PREDEF_DATAS with table key NAME = L_HEAD into L_MAP.
        if SY-SUBRC <> 0. raise exception type LCX_OBJECT_NOT_FOUND. endif.
        if L_TAIL is initial.
          APPEND_XCROSS_ID TAG_DATA 'D' L_MAP-INDEX 0 L_GRADE <L_FULL_NAME>-FULL_NAME.
          CREATE_SYMBOL_ENTRY       'D' L_MAP-INDEX <L_FULL_NAME>-FULL_NAME.
          APPEND_XCROSS_DEP_ID       D  L_MAP-INDEX   L_GRADE <L_FULL_NAME>-GRADE TAG_TYPE <L_FULL_NAME>-FULL_NAME.
        else.
          READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
          SYNT_IF_IS_TABLEWITHHEAD <L_DATA>-KIND.
          L_MAP-INDEX = <L_DATA>-REF2.
          READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
          SYNT_ENDIF.

          GET_IDS_DATA_COMP( exporting P_DATA_ID      = L_MAP-INDEX
                                       P_TYPE_ID      = <L_DATA>-REF1
                                       P_NAME         = L_TAIL
                                       P_FULL_NAME    = <L_FULL_NAME>-FULL_NAME
                                       P_GRADE        = L_GRADE
                                       P_GRADE_NEEDED = <L_FULL_NAME>-GRADE
                             importing P_XCROSS_IDS   = P_XCROSS_IDS ).
        endif.



      when TAG_FUNCTION.
        L_SRCH = <L_FULL_NAME>-FULL_NAME+4.
        split L_SRCH at '\' into L_HEAD L_TAIL.
        if L_HEAD is initial.
          L_HEAD = L_TAIL.
          clear L_TAIL.
        endif.
        if not L_TAIL is initial.
          concatenate '\' L_TAIL into L_TAIL.
        endif.


        read table FUNCTIONS with table key NAME = L_HEAD into L_MAP.

        if SY-SUBRC <> 0.
          if L_TAIL is not initial.
            raise exception type LCX_OBJECT_NOT_FOUND.
          endif.
          "APPEND_XCROSS_FIELD TAG_FUNCTION <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.
        else.
          if L_TAIL is initial.
            APPEND_XCROSS_ID    TAG_FUNCTION 'E' L_MAP-INDEX 0 L_GRADE <L_FULL_NAME>-FULL_NAME.
            CREATE_SYMBOL_ENTRY              'E' L_MAP-INDEX <L_FULL_NAME>-FULL_NAME.
            "APPEND_XCROSS_FIELD TAG_FUNCTION     <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.
          else.
            GET_IDS_ENV_COMP( exporting P_ENV_ID       = L_MAP-INDEX
                                        P_NAME         = L_TAIL
                                        P_FULL_NAME    = <L_FULL_NAME>-FULL_NAME
                                        P_GRADE        = GRADE_DIRECT
                                        P_GRADE_NEEDED = <L_FULL_NAME>-GRADE
                              importing P_XCROSS_IDS   = P_XCROSS_IDS ).

          endif.
        endif.

      when TAG_TYPE_POOL.
        L_SRCH = <L_FULL_NAME>-FULL_NAME+4.
        split L_SRCH at '\' into L_HEAD L_TAIL.
        if L_HEAD is initial.
          L_HEAD = L_TAIL.
          clear L_TAIL.
        endif.
        if not L_TAIL is initial.
          concatenate '\' L_TAIL into L_TAIL.
        endif.
        read table TYPEPOOLS with table key NAME = L_HEAD into L_MAP.
        if SY-SUBRC <> 0. raise exception type LCX_OBJECT_NOT_FOUND. endif.
        if L_TAIL is initial.
          APPEND_XCROSS_ID     TAG_TYPE_POOL 'E' L_MAP-INDEX 0 L_GRADE <L_FULL_NAME>-FULL_NAME.
          CREATE_SYMBOL_ENTRY                'E' L_MAP-INDEX <L_FULL_NAME>-FULL_NAME.
          "APPEND_XCROSS_STRING TAG_TYPE_POOL     <L_FULL_NAME>-FULL_NAME+4 L_GRADE <L_FULL_NAME>-FULL_NAME.
        endif.

      when tag_enhancement.
        split <L_FULL_NAME>-FULL_NAME+4 at '\' into L_HEAD L_TAIL.
        L_OBJ_DESCR = FIND_ENHANCEMENT_EXIT( P_NAME  = L_HEAD ).
        if L_OBJ_DESCR-OBJ_ID = 0.
          if FIND_ERROR = SPACE.
            raise exception type LCX_FULL_NAME_SYNTAX_ERROR.
          else.
            raise exception type LCX_OBJECT_NOT_FOUND.
          endif.
        endif.
        concatenate '\' l_tail into l_tail.
        GET_IDS_ENH_COMP( exporting P_ENV_ID       = L_OBJ_DESCR-OBJ_ID
                                    P_NAME         = l_tail
                                    P_FULL_NAME    = <L_FULL_NAME>-FULL_NAME
                                    P_GRADE        = GRADE_DIRECT
                          importing P_XCROSS_IDS   = P_XCROSS_IDS ).

      when TAG_COMMON_PART.


      when TAG_SHARED_DATA.
        L_SRCH = <L_FULL_NAME>-FULL_NAME+4.
        split L_SRCH at '\' into L_HEAD L_TAIL.
         l_Map-index = l_head .
        read table DATAS index l_map-index assigning <l_data>.
        if SY-SUBRC <> 0. raise exception type LCX_OBJECT_NOT_FOUND. endif.
        if L_TAIL is initial.
          APPEND_XCROSS_ID_ANY 'D' L_MAP-INDEX 0 L_GRADE <L_FULL_NAME>-FULL_NAME.
          CREATE_SYMBOL_ENTRY  'D' L_MAP-INDEX <L_FULL_NAME>-FULL_NAME.
          APPEND_XCROSS_DEP_ID D   L_MAP-INDEX   L_GRADE <L_FULL_NAME>-GRADE TAG_DATA <L_FULL_NAME>-FULL_NAME.

        else.
          READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
          SYNT_IF_IS_TABLEWITHHEAD <L_DATA>-KIND.
          L_MAP-INDEX = <L_DATA>-REF2.
          READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
          SYNT_ENDIF.
          while <L_DATA>-KIND = SYNT_DATA-ATTRALIAS or <L_DATA>-KIND = SYNT_DATA-INHERIT.
            L_MAP-INDEX = <L_DATA>-REF1.
            READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
          endwhile.

          GET_IDS_DATA_COMP( exporting P_DATA_ID      = L_MAP-INDEX
                                       P_TYPE_ID      = <L_DATA>-REF1
                                       P_NAME         = L_TAIL
                                       P_FULL_NAME    = <L_FULL_NAME>-FULL_NAME
                                       P_GRADE        = L_GRADE
                                       P_GRADE_NEEDED = <L_FULL_NAME>-GRADE
                             importing P_XCROSS_IDS = P_XCROSS_IDS ).

        endif.


      when others.
        continue.

    endcase.

  endloop.

  GET_IDS_IND( changing P_XCROSS_IDS = P_XCROSS_IDS ).




endmethod.                    "GET_XCROSS_IDS


method GET_IDS_DATA_COMP .
*---------------------------------------------------------------------*
*       METHOD FIND_DATA_COMP                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

  data:
    L_BASE_TYPE type I,
    L_SRCH      type STRING,
    L_HEAD      type STRING,
    L_TAIL      type STRING,
    L_COMP_ID   type I,
    L_TYPE_ID   type I,
    L_FROM      type I,
    L_TO        type I,
    L_ID_GRADE  type T_ID_GRADE.

  field-symbols:
    <L_TYPE_ENTRY> type SYNT_STRUC_TYPE_OBJ,
    <L_ITEM>       like line of TYPE_CHILDS.

  FIND_ERROR = SPACE.

*
* get Id of base type
*
  FIND_ERROR = SPACE.

  L_BASE_TYPE = GET_BASE_TYPE( P_TYPE_ID ).

  check L_BASE_TYPE <> 0.

*
* check if base type is a structure
*
  READ_TABLE_INDEX TYPES L_BASE_TYPE <L_TYPE_ENTRY>.
  FIND_ERROR = 'BD'.
  check SY-SUBRC = 0.
  FIND_ERROR = 'KD'.
  if <L_TYPE_ENTRY>-KIND = SYNT_TYPE-STRUC1-ATYP or
     <L_TYPE_ENTRY>-KIND = SYNT_TYPE-STRUC2-ATYP.
*
* structure component
*
    case P_NAME+1(2).

      when TAG_DATA.
* Split name
        L_SRCH = P_NAME+4.
        split L_SRCH at '\' into L_HEAD L_TAIL.
        if L_HEAD is initial.
          L_HEAD = L_TAIL.
          clear L_TAIL.
        endif.
        if not L_TAIL is initial.
          concatenate '\' L_TAIL into L_TAIL.
        endif.
        L_FROM = <L_TYPE_ENTRY>-REF_OFFSET.
        L_TO   = <L_TYPE_ENTRY>-REF_OFFSET + <L_TYPE_ENTRY>-CHILD_CNT.
        loop at TYPE_CHILDS from L_FROM to L_TO
                            assigning <L_ITEM>.
          READ_TABLE_INDEX TYPES <L_ITEM>-TYPE_OFFSET <L_TYPE_ENTRY>.
          if <L_TYPE_ENTRY>-STR = L_HEAD.
            L_COMP_ID = P_DATA_ID + <L_ITEM>-NODE_OFFSET.
            L_TYPE_ID = <L_ITEM>-TYPE_OFFSET.
            exit.
          endif.
        endloop.

        check L_COMP_ID <> 0.

        FIND_ERROR = SPACE.
        if L_TAIL is initial.
* at the end of the path
          APPEND_XCROSS_ID     TAG_DATA 'D' L_COMP_ID 0 P_GRADE P_FULL_NAME.
          APPEND_XCROSS_DEP_ID D L_COMP_ID P_GRADE P_GRADE_NEEDED TAG_DATA P_FULL_NAME.
          return.
        endif.

* keep on searching
        GET_IDS_DATA_COMP( exporting P_DATA_ID      = L_COMP_ID
                                     P_TYPE_ID      = L_TYPE_ID
                                     P_NAME         = L_TAIL
                                     P_FULL_NAME    = P_FULL_NAME
                                     P_GRADE        = P_GRADE
                                     P_GRADE_NEEDED = P_GRADE_NEEDED
                           importing P_XCROSS_IDS   = P_XCROSS_IDS ).

      when TAG_SECTION.
        L_SRCH = P_NAME+4.
        split L_SRCH at '\' into L_HEAD L_TAIL.

        if L_HEAD <> 'END'.
          raise exception type LCX_FULL_NAME_SYNTAX_ERROR.

        elseif L_TAIL = TAG_ENHANCEMENT_IMPL.
          APPEND_XCROSS_STRING TAG_ENHANCEMENT_IMPL P_FULL_NAME P_GRADE P_FULL_NAME.

        elseif strlen( L_TAIL ) > 2 and L_TAIL(2) = TAG_ENHANCEMENT and L_TAIL+2(1) = ':'.
          concatenate '\' l_tail into l_tail.
          GET_IDS_ENH_COMP( exporting P_ENV_ID       = -1
                                      P_NAME         = l_tail
                                      P_FULL_NAME    = P_FULL_NAME
                                      P_GRADE        = GRADE_DIRECT
                            importing P_XCROSS_IDS   = P_XCROSS_IDS ).
        endif.
      when TAG_TYPE_OF.
        L_TAIL = P_NAME+3.

        if L_TAIL is initial.


          APPEND_XCROSS_TYPE     L_BASE_TYPE P_GRADE P_FULL_NAME.

          APPEND_XCROSS_DEP_ID T L_BASE_TYPE P_GRADE P_GRADE TAG_TYPE P_FULL_NAME.



        else.
          GET_IDS_TYPE_COMP( exporting P_TYPE_ID      = L_BASE_TYPE
                                       P_NAME         = L_TAIL
                                       P_FULL_NAME    = P_FULL_NAME
                                       P_GRADE        = P_GRADE
                                       P_GRADE_NEEDED = P_GRADE
                             importing P_XCROSS_IDS   = P_XCROSS_IDS ).
        endif.


      when others.
        raise exception type LCX_FULL_NAME_SYNTAX_ERROR.

    endcase.

  elseif <L_TYPE_ENTRY>-KIND = SYNT_TYPE-REF-ATYP.
    check P_NAME+1(2) = TAG_REF.
    READ_TABLE_INDEX TYPES L_BASE_TYPE <L_TYPE_ENTRY>.
    READ_TABLE_INDEX TYPES <L_TYPE_ENTRY>-REF_OFFSET <L_TYPE_ENTRY>.
    L_TAIL = P_NAME+3.

    GET_IDS_ENV_COMP( exporting P_ENV_ID       = <L_TYPE_ENTRY>-REF_OFFSET
                                P_NAME         = L_TAIL
                                P_FULL_NAME    = P_FULL_NAME
                                P_GRADE        = GRADE_DIRECT
                                P_GRADE_NEEDED = P_GRADE
                      importing P_XCROSS_IDS   = P_XCROSS_IDS ).
  endif.






endmethod.                    "FIND_DATA_COMP


method GET_IDS_DATA_COMPONENTS .
*---------------------------------------------------------------------*
*       METHOD COMPONENT_NAME                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_ITEM       type I,
    L_MAX_ITEM   type I,
    L_DATA_ID    type I.
  field-symbols:
    <L_TYPE>     like line of TYPES,
    <L_ITEM>     like line of TYPE_CHILDS.

  P_TYPE_ID = GET_BASE_TYPE( P_TYPE_ID ).

  if P_TYPE_ID = 0.
    message X000(38) with 'Unerwarteter Zustand'(001).
  endif.

  READ_TABLE_INDEX TYPES P_TYPE_ID <L_TYPE>.
* process structures

  case <L_TYPE>-KIND.
    when SYNT_TYPE-STRUC1-ATYP or SYNT_TYPE-STRUC2-ATYP.
* search for component
      L_ITEM     = <L_TYPE>-REF_OFFSET.
      L_MAX_ITEM = L_ITEM + <L_TYPE>-CHILD_CNT - 1.
      do.
        if L_ITEM > L_MAX_ITEM.
          exit.
        endif.
        read table TYPE_CHILDS index L_ITEM assigning <L_ITEM>.
        L_DATA_ID = P_DATA_ID + <L_ITEM>-NODE_OFFSET.
        if P_GRADE_NEEDED >= GRADE_COMPONENTS.
          APPEND_XCROSS_ID_NO_DEF TAG_DATA 'D' L_DATA_ID 0 GRADE_COMPONENTS P_FULL_NAME.
        endif.
        GET_IDS_DATA_COMPONENTS( exporting P_GRADE        = P_GRADE
                                           P_GRADE_NEEDED = P_GRADE_NEEDED
                                           P_ROOT_ID      = P_ROOT_ID
                                           P_DATA_ID      = L_DATA_ID
                                           P_TYPE_ID      = <L_ITEM>-TYPE_OFFSET
                                           p_FULL_NAME    = p_FULL_NAME
                                 changing  P_XCROSS_IDS   = P_XCROSS_IDS ).
        add 1 to L_ITEM.
      enddo.

    when others.
*      APPEND_XCROSS_ID_NO_DEF TAG_DATA 'D' P_DATA_ID P_ROOT_ID P_GRADE p_FULL_NAMe.

      if P_GRADE_NEEDED >= GRADE_COMPONENTS.
        APPEND_XCROSS_ID_NO_DEF TAG_DATA 'D' P_DATA_ID 0 GRADE_COMPONENTS P_FULL_NAME.
      endif.

  endcase.

endmethod.                    "


method GET_IDS_DATA_PARENTS .
  data:
    L_MIN_ITEM   type I,
    L_MAX_ITEM   type I,
    L_DATA_ID    type I,
    L_TYPE_ID    type I,
    L_CURR_ITEM  type I.
  field-symbols:
    <L_TYPE>     like line of TYPES,
    <L_ITEM>     like line of TYPE_CHILDS.

  if P_CURR_DATA_ID = P_DATA_ID.
    if P_DEF = 'X'.
      APPEND_XCROSS_ID_ANY        'D' P_CURR_DATA_ID 0 GRADE_DIRECT P_FULL_NAME.
*     CREATE_SYMBOl_ENTRY         'D' P_CURR_DATA_ID P_FULL_NAME.
    else.
      APPEND_XCROSS_ID_ANY_NO_DEF 'D' P_CURR_DATA_ID 0 GRADE_DIRECT P_FULL_NAMe.
*     CREATE_SYMBOl_ENTRY         'D' P_CURR_DATA_ID P_FULL_NAME.
    endif.
    P_COMPARE = 0.
    return.
  elseif P_CURR_DATA_ID > P_DATA_ID.
    P_COMPARE = -1.
    return.
  endif.

  L_TYPE_ID = GET_BASE_TYPE( P_TYPE_ID ).

  if P_TYPE_ID = 0.
    message X000(38) with 'Unerwarteter Zustand'(001).
  endif.

  READ_TABLE_INDEX TYPES L_TYPE_ID <L_TYPE>.
* process structures

  case <L_TYPE>-KIND.
    when SYNT_TYPE-STRUC1-ATYP or SYNT_TYPE-STRUC2-ATYP.
* search for component
      L_MAX_ITEM   = <L_TYPE>-REF_OFFSET + <L_TYPE>-CHILD_CNT - 1 .
      read table TYPE_CHILDS index L_MAX_ITEM assigning <L_ITEM>.
      L_DATA_ID    = P_CURR_DATA_ID + <L_ITEM>-NODE_OFFSET.
      if P_DATA_ID > L_DATA_ID.
        L_MIN_ITEM = L_MAX_ITEM.
      else.
        L_MIN_ITEM = <L_TYPE>-REF_OFFSET.
      endif.
      do.
        if L_MIN_ITEM > L_MAX_ITEM.
          P_COMPARE = 1.
          return.
        endif.
        L_CURR_ITEM = ( L_MIN_ITEM + L_MAX_ITEM ) div 2.
        read table TYPE_CHILDS index L_CURR_ITEM assigning <L_ITEM>.
        L_DATA_ID = P_CURR_DATA_ID + <L_ITEM>-NODE_OFFSET.
        L_TYPE_ID = <L_ITEM>-TYPE_OFFSET.
        READ_TABLE_INDEX TYPES P_TYPE_ID <L_TYPE>.

        GET_IDS_DATA_PARENTS( exporting P_DATA_ID      = P_DATA_ID
                                        P_CURR_DATA_ID = L_DATA_ID
                                        P_TYPE_ID      = L_TYPE_ID
                                        P_TOP_LEVEL    = ' '
                                        P_DEF          = P_DEF
                                        P_FULL_NAME    = P_FULL_NAME
                                        P_GRADE        = P_GRADE
                              importing P_COMPARE      = P_COMPARE
                              changing  P_XCROSS_IDS   = P_XCROSS_IDS ).
        if P_COMPARE = 0.
          if P_TOP_LEVEL = 'X'.
            if P_GRADE = GRADE_PROPERTIES.
              if P_DEF = 'X'.
                APPEND_XCROSS_ID_ANY        'D' P_CURR_DATA_ID 0 GRADE_PROPERTIES p_FULL_NAMe.
              else.
                APPEND_XCROSS_ID_ANY_NO_DEF 'D' P_CURR_DATA_ID 0 GRADE_PROPERTIES p_FULL_NAME.
              endif.
            endif.
          else.
            if P_DEF = 'X'.
              APPEND_XCROSS_ID_ANY        'D' P_CURR_DATA_ID 0 GRADE_DIRECT P_FULL_NAME.
*              CREATE_SYMBOl_ENTRY         'D' P_CURR_DATA_ID P_FULL_NAME.
            else.
              APPEND_XCROSS_ID_ANY_NO_DEF 'D' P_CURR_DATA_ID 0 GRADE_DIRECT p_FULL_NAME.
*              CREATE_SYMBOl_ENTRY         'D' P_CURR_DATA_ID P_FULL_NAME.
            endif.
          endif.
          return.
        elseif P_COMPARE < 0.
          L_MAX_ITEM = L_CURR_ITEM - 1.
        else.
          L_MIN_ITEM = L_CURR_ITEM + 1.
        endif.
      enddo.

    when others.
      P_COMPARE = 1.
      return.
  endcase.

endmethod.                    "COMPONENT_NAME


method GET_IDS_ENH_COMP .

  data:
    L_SRCH      type STRING,
    L_HEAD      type STRING,
    L_TAIL      type STRING,
    L_HEAD2     type STRING,
    L_TAIL2     type STRING,
    L_OBJ_DESCR type OBJINFO,
    L_FOO_ENV   like line of ENVS.

  field-symbols:
    <L_ENV>  like line of ENVS,
    <L_DATA> like line of DATAS.

  FIND_ERROR = SPACE.

*
* get env entry with id envid
*
  if P_ENV_ID >= 0.
    READ_TABLE_INDEX ENVS P_ENV_ID <L_ENV>.
    check SY-SUBRC = 0.
  else.
    assign L_FOO_ENV to <L_ENV>.
  endif.

  if P_GRADE = GRADE_COMPONENTS and P_NAME is initial.
    return.
  endif.

  case P_NAME+1(2).

    when TAG_ENHANCEMENT_EXIT or
         TAG_SECTION or
         TAG_ENHANCEMENT.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      elseif L_TAIL is not initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      if STRLEN( L_TAIL ) < 3.
        raise exception type LCX_FULL_NAME_SYNTAX_ERROR.
      endif.

      if P_NAME+1(2) = TAG_SECTION.
        case L_HEAD.
          when 'BEGIN'  or 'END' or '%_BEGIN' or '%_END' or
               'PROCEDURES' or "INTERMEDIATE
               'PUBLIC'  or 'PROTECTED' or 'PRIVATE' or 'IMPLEMENTATION' or
               'IMPORTING' or 'EXPORTING' or 'CHANGING' or 'TABLES'.
          when others.
            raise exception type LCX_FULL_NAME_SYNTAX_ERROR.
        endcase.
      endif.

      case L_TAIL+1(2).
        when TAG_ENHANCEMENT_IMPL.  " end reached

          APPEND_XCROSS_STRING TAG_ENHANCEMENT_IMPL P_FULL_NAME GRADE_DEFINITION P_FULL_NAME.
          if P_GRADE >= GRADE_DIRECT.
            APPEND_XCROSS_STRING TAG_ENHANCEMENT_IMPL P_FULL_NAME GRADE_DIRECT P_FULL_NAME.
          endif.

          L_OBJ_DESCR = FIND_ENHANCEMENT_IMPL( P_FULL_NAME  ).

          if L_OBJ_DESCR-OBJ_ID <> 0.
            APPEND_XCROSS_ID L_OBJ_DESCR-TAG L_OBJ_DESCR-OBJ_KIND L_OBJ_DESCR-OBJ_ID 0 GRADE_DEFINITION P_FULL_NAME.
          endif.

        when TAG_ENHANCEMENT_EXIT.
          split L_TAIL+1 at '\' into L_HEAD2 L_TAIL2.
          if L_TAIL2 = TAG_ENHANCEMENT_IMPL.
            if STRLEN( L_HEAD2 ) < 3.
              raise exception type LCX_FULL_NAME_SYNTAX_ERROR.
            endif.
                                                            "1) usage
            L_HEAD2 = L_HEAD2+3.
            data UNAME type STRING.
            if P_NAME+1(2) = TAG_ENHANCEMENT.
              concatenate L_HEAD `-&-` L_HEAD2 into UNAME.
            else.
              UNAME = L_HEAD2.
            endif.
            L_OBJ_DESCR = FIND_ENHANCEMENT_EXIT( P_NAME  = UNAME ).

            if L_OBJ_DESCR-OBJ_ID = 0.
              "xcross is a enhancement implementation of a implementation
              "that was pulled in together with enhancements of an external
              "definitions
              "// raise exception type lcx_object_not_found.
              return.
            endif.
            if P_GRADE >= GRADE_DIRECT.
              APPEND_XCROSS_ID L_OBJ_DESCR-TAG L_OBJ_DESCR-OBJ_KIND
                               L_OBJ_DESCR-OBJ_ID 0 GRADE_DEF_TO_DIRECT P_FULL_NAME.
              CREATE_SYMBOL_ENTRY  L_OBJ_DESCR-OBJ_KIND L_OBJ_DESCR-OBJ_ID P_FULL_NAME.
            endif.

                                                            "2) impl
            L_OBJ_DESCR = FIND_ENHANCEMENT_IMPL( P_FULL_NAME  ).

            if L_OBJ_DESCR-OBJ_ID <> 0.
              APPEND_XCROSS_ID L_OBJ_DESCR-TAG L_OBJ_DESCR-OBJ_KIND L_OBJ_DESCR-OBJ_ID 0 GRADE_DEFINITION P_FULL_NAME.
            endif.
            return.
          else.
            GET_IDS_ENH_COMP( exporting  P_ENV_ID       = P_ENV_ID
                                         P_NAME         = L_TAIL
                                         P_FULL_NAME    = P_FULL_NAME
                                         P_GRADE        = GRADE_DIRECT
                               importing P_XCROSS_IDS   = P_XCROSS_IDS ).
          endif.

        when TAG_ENHANCEMENT or
             TAG_SECTION.
          GET_IDS_ENH_COMP( exporting P_ENV_ID       = P_ENV_ID
                                      P_NAME         = L_TAIL
                                      P_FULL_NAME    = P_FULL_NAME
                                      P_GRADE        = GRADE_DIRECT
                            importing P_XCROSS_IDS   = P_XCROSS_IDS ).

        when TAG_FORM.
          GET_IDS_LOCAL_PROGRAM( exporting P_COMP_NAME    = L_TAIL
                                           P_FULL_NAME    = P_FULL_NAME
                                           P_GRADE        = P_GRADE
                                 changing  P_XCROSS_IDS   = P_XCROSS_IDS ).
        when TAG_FUNCTION.
          data  L_MAP type SYNT_STRUC_MAP.
          split L_TAIL+4 at '\' into L_HEAD2 L_TAIL2.
          read table FUNCTIONS with table key NAME = L_HEAD2 into L_MAP.
          if sy-subrc = 0.
            concatenate '\' L_TAIL2 into L_TAIL2.
            GET_IDS_ENV_COMP( exporting P_ENV_ID       = L_MAP-INDEX
                                        P_NAME         = L_TAIL2
                                        P_FULL_NAME    = p_FULL_NAME
                                        P_GRADE        = P_GRADE
                                        P_GRADE_NEEDED = GRADE_DIRECT
                              importing P_XCROSS_IDS   = P_XCROSS_IDS ).
          endif.
        when others.
          case <l_env>-KIND.
            when SYNT_XENV-CLASS.
              GET_IDS_TYPE_COMP( exporting P_TYPE_ID  = <l_env>-OBJ_TYPE
                                           P_NAME         = L_TAIL
                                           P_FULL_NAME    = P_FULL_NAME
                                           P_GRADE        = P_GRADE
                                           P_GRADE_NEEDED = GRADE_DIRECT
                                 importing P_XCROSS_IDS   = P_XCROSS_IDS ).
            when others.
              if <l_env>-KIND <> SYNT_XENV-PROG or <l_env>-NAME = space  ##BLANK_OK.
                if p_full_name cs l_tail.
                  l_head = p_full_name(sy-fdpos).
                  L_OBJ_DESCR = FIND_ENH_PARENT( l_head ).

                  case L_OBJ_DESCR-OBJ_KIND.
                    when SYNT_PARENT_KIND-KIND_TYPE.
                      GET_IDS_TYPE_COMP( exporting P_TYPE_ID  = L_OBJ_DESCR-OBJ_ID
                                                   P_NAME         = L_TAIL
                                                   P_FULL_NAME    = P_FULL_NAME
                                                   P_GRADE        = GRADE_DIRECT
                                                   P_GRADE_NEEDED = GRADE_DIRECT
                                         importing P_XCROSS_IDS   = P_XCROSS_IDS ).

                    when SYNT_PARENT_KIND-KIND_DATA.
                      READ_TABLE_INDEX DATAS L_OBJ_DESCR-OBJ_ID <L_DATA>.
                      SYNT_IF_IS_TABLEWITHHEAD <L_DATA>-KIND.
                        L_MAP-INDEX = <L_DATA>-REF2.
                        READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
                      SYNT_ENDIF.
                      if <L_DATA>-KIND < SYNT_DATA-COMPONENT or <L_DATA>-KIND = SYNT_DATA-BOX or <L_DATA>-KIND = SYNT_DATA-BOX_COMP.

                        GET_IDS_DATA_COMP( exporting P_DATA_ID      = L_OBJ_DESCR-OBJ_ID
                                                     P_TYPE_ID      = <L_DATA>-REF1
                                                     P_NAME         = L_TAIL
                                                     P_FULL_NAME    = P_FULL_NAME
                                                     P_GRADE        = P_GRADE
                                                     P_GRADE_NEEDED = GRADE_DIRECT
                                           importing P_XCROSS_IDS   = P_XCROSS_IDS ).

                      endif.
                    when SYNT_PARENT_KIND-KIND_ENV.
                      GET_IDS_ENV_COMP( exporting P_ENV_ID       = L_OBJ_DESCR-OBJ_ID
                                                  P_NAME         = L_TAIL
                                                  P_FULL_NAME    = P_FULL_NAME
                                                  P_GRADE        = P_GRADE
                                                  P_GRADE_NEEDED = GRADE_DIRECT
                                        importing P_XCROSS_IDS   = P_XCROSS_IDS ).
                  endcase.
                endif.
              endif.
          endcase.
          "raise exception type LCX_FULL_NAME_SYNTAX_ERROR.

      endcase.

    when TAG_METHOD or
         TAG_DATA or
         TAG_TYPE or
         TAG_FORM.
      split P_NAME+4 at '\' into L_HEAD L_TAIL.
      concatenate '\' L_TAIL into L_TAIL.
      GET_IDS_ENH_COMP( exporting P_ENV_ID       = P_ENV_ID
                                  P_NAME         = L_TAIL
                                  P_FULL_NAME    = P_FULL_NAME
                                  P_GRADE        = P_GRADE
                        importing P_XCROSS_IDS   = P_XCROSS_IDS ).

    when TAG_FUNCTION.
          split P_NAME+4 at '\' into L_HEAD2 L_TAIL2.
          read table FUNCTIONS with table key NAME = L_HEAD2 into L_MAP.
          if sy-subrc = 0.
            concatenate '\' L_TAIL2 into L_TAIL2.
            GET_IDS_ENV_COMP( exporting P_ENV_ID       = L_MAP-INDEX
                                        P_NAME         = L_TAIL2
                                        P_FULL_NAME    = p_FULL_NAME
                                        P_GRADE        = P_GRADE
                                        P_GRADE_NEEDED = GRADE_DIRECT
                              importing P_XCROSS_IDS   = P_XCROSS_IDS ).
          endif.
    when others.
      raise exception type LCX_FULL_NAME_SYNTAX_ERROR.

  endcase.

endmethod.


method GET_IDS_ENV_COMP .
*---------------------------------------------------------------------*
*       METHOD FIND_ENV_COMP                                          *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

  data:
    L_ID_GRADE  type line of T_ID_GRADES,
    L_SRCH      type STRING,
    L_HEAD      type STRING,
    L_TAIL      type STRING,
    L_MAP       type SYNT_STRUC_MAP.

  field-symbols:
    <L_ENV>  like line of ENVS,
    <L_DATA> like line of DATAS.

  FIND_ERROR = SPACE.

*
* get env entry with id envid
*
  READ_TABLE_INDEX ENVS P_ENV_ID <L_ENV>.

  check SY-SUBRC = 0.

  if P_GRADE = GRADE_COMPONENTS and P_NAME is initial.
    return.
  endif.

*
* one branch for each kind of "env" tags
*
  case P_NAME+1(2).

    when TAG_TYPE.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table <L_ENV>-TYPES with table key NAME = L_HEAD into
      L_MAP.
      FIND_ERROR = 'TE'.
      check SY-SUBRC = 0.
      FIND_ERROR = SPACE.
      if L_TAIL is initial.
        APPEND_XCROSS_TYPE    L_MAP-INDEX P_GRADE P_FULL_NAME.
        APPEND_XCROSS_DEP_ID  T L_MAP-INDEX P_GRADE P_GRADE_NEEDED TAG_TYPE P_FULL_NAME.
        return.
      endif.
      GET_IDS_TYPE_COMP( exporting P_TYPE_ID      = L_MAP-INDEX
                                   P_NAME         = L_TAIL
                                   P_FULL_NAME    = P_FULL_NAME
                                   P_GRADE        = P_GRADE
                                   P_GRADE_NEEDED = P_GRADE_NEEDED
                         importing P_XCROSS_IDS   = P_XCROSS_IDS ).
      if strlen( L_TAIL ) > 3 and L_TAIL+1(2) = TAG_SECTION.
        get_ids_enh_comp( exporting p_env_id       = p_env_id
                                    p_name         = l_tail
                                    p_full_name    = p_full_name
                                    p_grade        = grade_direct
                          importing p_xcross_ids   = p_xcross_ids ).
      endif.

    when TAG_DATA.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table <L_ENV>-DATAS with table key NAME = L_HEAD into
      L_MAP.
      FIND_ERROR = 'DE'.
      check SY-SUBRC = 0.
      FIND_ERROR = SPACE.
      if L_TAIL is initial.
        APPEND_XCROSS_ID_ANY 'D' L_MAP-INDEX 0 P_GRADE P_FULL_NAME.
        APPEND_XCROSS_DEP_ID  D  L_MAP-INDEX P_GRADE P_GRADE_NEEDED TAG_DATA P_FULL_NAME.
        if  P_ENV_ID = 3.
          APPEND_XCROSS_STRING_1 SYNT_ROLE-CONTROL L_HEAD P_GRADE P_FULL_NAME.
        endif.
        return.
      endif.
      READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
      SYNT_IF_IS_TABLEWITHHEAD <L_DATA>-KIND.
      L_MAP-INDEX = <L_DATA>-REF2.
      READ_TABLE_INDEX DATAS L_MAP-INDEX <L_DATA>.
      SYNT_ENDIF.
      if <L_DATA>-KIND < SYNT_DATA-COMPONENT or <L_DATA>-KIND = SYNT_DATA-BOX or <L_DATA>-KIND = SYNT_DATA-BOX_COMP.

        GET_IDS_DATA_COMP( exporting P_DATA_ID      = L_MAP-INDEX
                                     P_TYPE_ID      = <L_DATA>-REF1
                                     P_NAME         = L_TAIL
                                     P_FULL_NAME    = P_FULL_NAME
                                     P_GRADE        = P_GRADE
                                     P_GRADE_NEEDED = P_GRADE_NEEDED
                           importing P_XCROSS_IDS   = P_XCROSS_IDS ).

      endif.
      if strlen( L_TAIL ) > 3 and L_TAIL+1(2) = TAG_SECTION.
        get_ids_enh_comp( exporting p_env_id       = p_env_id
                                    p_name         = l_tail
                                    p_full_name    = p_full_name
                                    p_grade        = grade_direct
                          importing p_xcross_ids   = p_xcross_ids ).
      endif.

    when TAG_METHOD.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table <L_ENV>-METHODS with table key NAME = L_HEAD
                 into L_MAP.
      FIND_ERROR = 'ME'.
      if SY-SUBRC <> 0.
        APPEND_XCROSS_STRING_1 SYNT_ROLE-BADI_METHOD P_FULL_NAME P_GRADE P_FULL_NAME.
        return.
      endif.
      FIND_ERROR = SPACE.
      if L_TAIL is initial.
        APPEND_XCROSS_ID   TAG_METHOD            'E' L_MAP-INDEX 0 P_GRADE P_FULL_NAME.
        APPEND_XCROSS_ID_1 SYNT_ROLE-ALIAS       'E' L_MAP-INDEX 0 P_GRADE P_FULL_NAME.
        APPEND_XCROSS_DEP_ID                      E  L_MAP-INDEX P_GRADE P_GRADE_NEEDED TAG_METHOD P_FULL_NAME.

        return.
      endif.
      GET_IDS_ENV_COMP( exporting P_ENV_ID       = L_MAP-INDEX
                                  P_NAME         = L_TAIL
                                  P_FULL_NAME    = P_FULL_NAME
                                  P_GRADE        = P_GRADE
                                  P_GRADE_NEEDED = P_GRADE_NEEDED
                        importing P_XCROSS_IDS   = P_XCROSS_IDS ).

    when TAG_EVENT.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table <L_ENV>-EVENTS with table key NAME = L_HEAD into L_MAP.
      FIND_ERROR = 'VE'.
      check SY-SUBRC = 0.
      FIND_ERROR = SPACE.
      if L_TAIL is initial.
        APPEND_XCROSS_ID_1 SYNT_ROLE-ALIAS 'E' L_MAP-INDEX 0 P_GRADE P_FULL_NAME.
        APPEND_XCROSS_ID   TAG_EVENT       'E' L_MAP-INDEX 0 P_GRADE P_FULL_NAME.
        APPEND_XCROSS_DEP_ID                E  L_MAP-INDEX P_GRADE P_GRADE_NEEDED TAG_EVENT P_FULL_NAME.
        return.
      endif.
      GET_IDS_ENV_COMP( exporting P_ENV_ID       = L_MAP-INDEX
                                  P_NAME         = L_TAIL
                                  P_FULL_NAME    = P_FULL_NAME
                                  P_GRADE        = P_GRADE
                                  P_GRADE_NEEDED = P_GRADE_NEEDED
                        importing P_XCROSS_IDS   = P_XCROSS_IDS ).

    when TAG_INTERFACE.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table <L_ENV>-INTERFACES with table key NAME = L_HEAD
                 into L_MAP.
      FIND_ERROR = 'IE'.
      check SY-SUBRC = 0.
      FIND_ERROR = SPACE.
      if L_TAIL is initial.
        APPEND_XCROSS_ID TAG_INTERFACE 'E' L_MAP-INDEX 0 P_GRADE P_FULL_NAME.
        APPEND_XCROSS_DEP_ID            E  L_MAP-INDEX P_GRADE P_GRADE_NEEDED TAG_INTERFACE P_FULL_NAME.
        return.
      endif.
      GET_IDS_ENV_COMP( exporting P_ENV_ID       = L_MAP-INDEX
                                  P_NAME         = L_TAIL
                                  P_FULL_NAME    = P_FULL_NAME
                                  P_GRADE        = P_GRADE
                                  P_GRADE_NEEDED = P_GRADE_NEEDED
                        importing P_XCROSS_IDS   = P_XCROSS_IDS ).


    when TAG_FORM.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      read table FORMS with table key NAME = L_HEAD into L_MAP.
      FIND_ERROR = 'OE'.
      check SY-SUBRC = 0.
      if L_TAIL is initial.
        APPEND_XCROSS_ID TAG_FORM 'E' L_MAP-INDEX 0 P_GRADE P_FULL_NAME.
        if P_GRADE >= GRADE_DIRECT.
          APPEND_XCROSS_FORM TAG_FORM L_HEAD PROGRAM P_GRADE P_FULL_NAME.
        endif.
        return.
      endif.
      GET_IDS_ENV_COMP( exporting P_ENV_ID       = L_MAP-INDEX
                                  P_NAME         = L_TAIL
                                  P_FULL_NAME    = P_FULL_NAME
                                  P_GRADE        = P_GRADE
                                  P_GRADE_NEEDED = P_GRADE_NEEDED
                        importing P_XCROSS_IDS   = P_XCROSS_IDS ).

    when TAG_SECTION.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
      case L_HEAD.
        when 'BEGIN' or 'END' or '%_BEGIN' or '%_END'.
          if L_TAIL+1 = TAG_ENHANCEMENT_IMPL.
            APPEND_XCROSS_STRING TAG_ENHANCEMENT_IMPL P_FULL_NAME GRADE_DEFINITION P_FULL_NAME.
            if P_GRADE >= GRADE_DIRECT.
              APPEND_XCROSS_STRING TAG_ENHANCEMENT_IMPL P_FULL_NAME GRADE_DIRECT P_FULL_NAME.
            endif.
            return.
          elseif strlen( L_TAIL ) > 4 and L_TAIL+1(2) = TAG_ENHANCEMENT and L_TAIL+3(1) = ':'.
            get_ids_enh_comp( exporting p_env_id       = p_env_id
                                        p_name         = l_tail
                                        p_full_name    = p_full_name
                                        p_grade        = grade_direct
                              importing p_xcross_ids   = p_xcross_ids ).
          endif.
        when 'PUBLIC' or 'PROTECTED' or 'PRIVATE' or 'IMPLEMENTATION' or
             'IMPORTING' or 'EXPORTING' or 'CHANGING' or 'TABLES' or 'GLOBALFRIENDS' or 'FRIENDS'.
          if L_TAIL+1(2) = TAG_SECTION.
            L_SRCH = L_TAIL+4.
            split L_SRCH at '\' into L_HEAD L_TAIL.
            if L_HEAD = 'END' and L_TAIL = TAG_ENHANCEMENT_IMPL.
              if P_GRADE >= GRADE_DIRECT.
                APPEND_XCROSS_STRING TAG_ENHANCEMENT_IMPL P_FULL_NAME GRADE_DIRECT P_FULL_NAME.
              endif.
              APPEND_XCROSS_STRING TAG_ENHANCEMENT_IMPL P_FULL_NAME GRADE_DEFINITION  P_FULL_NAME.
              return.
            elseif strlen( L_TAIL ) > 2 and L_TAIL(2) = TAG_ENHANCEMENT and L_TAIL+2(1) = ':'.
              concatenate '\' L_TAIL into L_TAIL.
              get_ids_enh_comp( exporting p_env_id       = p_env_id
                                          p_name         = l_tail
                                          p_full_name    = p_full_name
                                          p_grade        = grade_direct
                                importing p_xcross_ids   = p_xcross_ids ).
            endif.
          endif.

        when others.
          raise exception type LCX_FULL_NAME_SYNTAX_ERROR.



      endcase.

    when others.
      raise exception type LCX_FULL_NAME_SYNTAX_ERROR.

  endcase.

endmethod.                    "FIND_ENV_COMP


method GET_IDS_EXTERN_PROGRAM .
*---------------------------------------------------------------------*
*       METHOD GET_XCROSS_IDS                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_TAG       type SCR_TAG,
    L_LEN       type I,
    L_TAGEI     type C length 3.

  if P_COMP_NAME(1) <> '\'.
    raise exception type LCX_FULL_NAME_SYNTAX_ERROR.
  endif.

  check P_GRADE >= GRADE_DIRECT.

  L_TAG = P_COMP_NAME+1(2).


  case L_TAG.
    when TAG_FORM.
      APPEND_XCROSS_FORM   L_TAG P_COMP_NAME+4 P_PROGRAM GRADE_DIRECT P_FULL_NAME.

    when TAG_PF_STATUS.
      APPEND_XCROSS_PFSTAT L_TAG P_COMP_NAME+4 P_PROGRAM GRADE_DIRECT P_FULL_NAME.

    when TAG_TITLE.
      APPEND_XCROSS_PFSTAT L_TAG P_COMP_NAME+4 P_PROGRAM GRADE_DIRECT P_FULL_NAME.

    when TAG_SCREEN.
      APPEND_XCROSS_SCREEN L_TAG P_COMP_NAME+4 P_PROGRAM GRADE_DIRECT P_FULL_NAME.

    when others.
      L_LEN = strlen( P_COMP_NAME ) - 3.
      concatenate '\' TAG_ENHANCEMENT_IMPL into L_TAGEI.
      if L_LEN > 0 and P_COMP_NAME+L_LEN =  L_TAGEI.
        "xcross is a enhancement implementation of a implementation
        "that was pulled in together with enhancements of an external
        "definitions
        return.
      endif.
      raise exception type LCX_FULL_NAME_SYNTAX_ERROR.

  endcase.

endmethod.                    "GET_XCROSS_IDS


method GET_IDS_INCLUDE .
*---------------------------------------------------------------------*
*       METHOD GET_XCROSS_IDS                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_TAG       type SCR_TAG,
    L_HEAD      type STRING,
    L_TAIL      type STRING,
    L_OBJ_DESCR type OBJINFO.

  if P_COMP_NAME(1) <> '\'.
    raise exception type LCX_FULL_NAME_SYNTAX_ERROR.
  endif.

  L_TAG = P_COMP_NAME+1(2).

  case L_TAG.
    when TAG_SECTION.
      split P_COMP_NAME+4 at '\' into L_HEAD L_TAIL.
      if L_HEAD <> 'END'. raise exception type LCX_FULL_NAME_SYNTAX_ERROR. endif.
      if L_TAIL <> TAG_ENHANCEMENT_IMPL.
        if STRLEN( L_TAIL ) < 7. raise exception type LCX_FULL_NAME_SYNTAX_ERROR. endif.
        concatenate '\' L_TAIL into L_TAIL.
        GET_IDS_ENH_COMP( exporting P_ENV_ID     = -1
                                    P_NAME       = L_TAIL
                                    P_FULL_NAME  = P_FULL_NAME
                                    P_GRADE      = P_GRADE
                          importing P_XCROSS_IDS = P_XCROSS_IDS ).
        return.
      endif.
      L_TAG = L_TAIL.
      check P_GRADE >= GRADE_DIRECT.
      APPEND_XCROSS_STRING L_TAG P_FULL_NAME GRADE_DIRECT P_FULL_NAME.

    when TAG_ENHANCEMENT_EXIT.
      split P_COMP_NAME+4 at '\' into L_HEAD L_TAIL.
      L_OBJ_DESCR = FIND_ENHANCEMENT_EXIT( P_NAME = L_HEAD ).
      if L_OBJ_DESCR-OBJ_ID = 0.
        if FIND_ERROR = SPACE.
          raise exception type LCX_FULL_NAME_SYNTAX_ERROR.
        else.
          raise exception type LCX_OBJECT_NOT_FOUND.
        endif.
      endif.

      if L_TAIL is initial.
        APPEND_XCROSS_ID L_OBJ_DESCR-TAG L_OBJ_DESCR-OBJ_KIND
                         L_OBJ_DESCR-OBJ_ID 0 GRADE_DEFINITION P_FULL_NAME.
        CREATE_SYMBOL_ENTRY  L_OBJ_DESCR-OBJ_KIND L_OBJ_DESCR-OBJ_ID P_FULL_NAME.
      elseif L_TAIL = TAG_ENHANCEMENT_IMPL.
        if P_GRADE >= GRADE_DIRECT.
          "APPEND_XCROSS_ID L_OBJ_DESCR-TAG
          "               L_OBJ_DESCR-OBJ_KIND
          "               L_OBJ_DESCR-OBJ_ID 0 GRADE_DEF_TO_DIRECT P_FULL_NAME.
          APPEND_XCROSS_STRING TAG_ENHANCEMENT_IMPL P_FULL_NAME GRADE_DEF_TO_DIRECT P_FULL_NAME.
        endif.
        L_OBJ_DESCR = FIND_ENHANCEMENT_IMPL( P_FULL_NAME  ).

        if L_OBJ_DESCR-OBJ_ID <> 0.
"          APPEND_XCROSS_STRING TAG_ENHANCEMENT_IMPL P_FULL_NAME GRADE_DEFINITION P_FULL_NAME.
          APPEND_XCROSS_ID L_OBJ_DESCR-TAG
                           L_OBJ_DESCR-OBJ_KIND
                           L_OBJ_DESCR-OBJ_ID 0 GRADE_DEFINITION P_FULL_NAME.
          CREATE_SYMBOL_ENTRY  L_OBJ_DESCR-OBJ_KIND L_OBJ_DESCR-OBJ_ID P_FULL_NAME.
        endif.

      elseif L_TAIL(2) = TAG_ENHANCEMENT.
        GET_IDS_ENH_COMP( exporting P_ENV_ID       = L_OBJ_DESCR-OBJ_ID
                                    P_NAME         = P_COMP_NAME
                                    P_FULL_NAME    = P_FULL_NAME
                                    P_GRADE        = GRADE_DIRECT
                          importing P_XCROSS_IDS   = P_XCROSS_IDS ).
      endif.

    when others.

      raise exception type LCX_FULL_NAME_SYNTAX_ERROR.

  endcase.

endmethod.                    "GET_XCROSS_IDS


method GET_IDS_IND .
*---------------------------------------------------------------------*
*       METHOD GET_XCROSS_IDS_IND                                     *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_INDEX             type I,
    L_INDEX_1           type I,
    L_TYPE_ID           type I,
    L_T_IDS_IND         type T_ID_GRADES,
    L_T_IDS_COMP        like L_T_IDS_IND,
    L_D_IDS_COMP        like L_T_IDS_IND,
    L_K_IDS_IND         type T_ID_GRADES,
    L_D_IDS_BOX         like L_T_IDS_IND,
    L_E_IDS_IND         like L_T_IDS_IND,
    L_E_IDS_COMP        like L_T_IDS_IND,
    L_E_IDS_CONSTR      like L_T_IDS_IND,
    L_E_IDS_CONSTR_TYPE like L_T_IDS_IND,
    L_T_IDS_CONSTR      like L_T_IDS_IND,
    L_T_IDS_CONSTR_TYPE like L_T_IDS_IND,
    L_ID_GRADE          type T_ID_GRADE,
    L_COMPARE           type I,                             "#EC NEEDED
    L_NESTED            type SYCHAR01,
    L_IS_TABLE          type SYCHAR01,
    L_IS_STRUCT         type SYCHAR01,
    L_GRADE             type SCR_GRADE,
    L_NAME              type STRING,
    L_MAP               type line of SYNT_MAP,
    L_DATA_ORIG         type I.
  field-symbols:
    <L_TYPE>            like line of TYPES,
    <L_TYPE_1>          like line of TYPES,
    <L_COMP>            like line of COMPS,
    <L_DATA>            like line of DATAS,
    <L_DATA_1>          like line of DATAS,
    <L_ENV>             like line of ENVS,
    <L_ENV_1>           like line of ENVS,
    <L_ENV_2>           like line of ENVS,
    <L_TABLE_KEY>       like line of TABLE_KEYS,
    <L_ID_GRADE>        like line of P_XCROSS_IDS-T_ID_GRADES.

*     Envs
  if P_XCROSS_IDS-I_ID_GRADES is not initial.
    loop at ENVS assigning <L_ENV>.
      L_INDEX = SY-TABIX.

      case <L_ENV>-KIND.
        when SYNT_XENV-INTERFACE.
          loop at P_XCROSS_IDS-I_ID_GRADES assigning <L_ID_GRADE> where ID = <L_ENV>-OBJ_TYPE.

            if <L_ID_GRADE>-GRADE = GRADE_DIRECT.
              L_GRADE = GRADE_DEF_TO_DIRECT.
            else.
              L_GRADE = <L_ID_GRADE>-GRADE.
            endif.
            if <L_ID_GRADE>-COMP_NAME is initial.
              if <L_ID_GRADE>-GRADE_NEEDED >= GRADE_COMPONENTS and <L_ID_GRADE>-COMP_NAME is not initial.
                GET_IDS_ENV_COMP( exporting P_ENV_ID       = L_INDEX
                                            P_NAME         = <L_ID_GRADE>-COMP_NAME
                                            P_FULL_NAME    = <L_ID_GRADE>-FULL_NAME
                                            P_GRADE_NEEDED = <L_ID_GRADE>-GRADE_NEEDED
                                            P_GRADE        = L_GRADE
                                  importing P_XCROSS_IDS   = P_XCROSS_IDS ).
              endif.

              APPEND_XCROSS_ID_NO_DEF TAG_INTERFACE 'E' L_INDEX 0 L_GRADE <L_ID_GRADE>-FULL_NAME.

            else.
              GET_IDS_ENV_COMP( exporting P_ENV_ID       = L_INDEX
                                          P_NAME         = <L_ID_GRADE>-COMP_NAME
                                          P_FULL_NAME    = <L_ID_GRADE>-FULL_NAME
                                          P_GRADE        = L_GRADE
                                          P_GRADE_NEEDED = <L_ID_GRADE>-GRADE_NEEDED
                                importing P_XCROSS_IDS   = P_XCROSS_IDS ).
            endif.
          endloop.

        when SYNT_XENV-CLASSDECL.
          read table <L_ENV>-DATAS with table key NAME = 'IMP' into L_MAP.
          check SY-SUBRC = 0.
          read table DATAS index L_MAP-INDEX assigning <L_DATA>.
          check SY-SUBRC = 0.
          read table TYPES index <L_DATA>-REF1 assigning <L_TYPE>.
          check SY-SUBRC = 0.
          loop at P_XCROSS_IDS-I_ID_GRADES assigning <L_ID_GRADE> where ID = <L_TYPE>-REF_OFFSET.
            if <L_ID_GRADE>-GRADE_NEEDED >= GRADE_DIRECT.
              concatenate '\TY:'  <L_ENV>-NAME <L_ID_GRADE>-COMP_NAME into L_NAME.
              APPEND_XCROSS_STRING_1 SYNT_ROLE-BADI_METHOD L_NAME GRADE_DIRECT <L_ID_GRADE>-FULL_NAME.
            endif.
            if <L_ID_GRADE>-GRADE_NEEDED >= GRADE_COMPONENTS and <L_ID_GRADE>-COMP_NAME is initial.
              READ_TABLE_INDEX TYPES <L_TYPE>-REF_OFFSET <L_TYPE>.
              READ_TABLE_INDEX ENVS  <L_TYPE>-REF_OFFSET <L_ENV_1>.
              loop at <L_ENV_1>-METHODS into L_MAP.
                READ_TABLE_INDEX ENVS L_MAP-INDEX <L_ENV_2>.
                concatenate '\TY:'  <L_ENV>-NAME '\ME:' <L_ENV_2>-NAME into L_NAME.
                APPEND_XCROSS_STRING_1 SYNT_ROLE-BADI_METHOD L_NAME GRADE_COMPONENTS <L_ID_GRADE>-FULL_NAME.
              endloop.
            endif.
          endloop.
      endcase.
    endloop.
  endif.


  loop at P_XCROSS_IDS-T_ID_GRADES assigning <L_ID_GRADE>.

*    L_TYPE_ID = GET_BASE_TYPE( <L_ID_GRADE>-ID ).

    L_TYPE_ID = <L_ID_GRADE>-ID.


    READ_TABLE_INDEX TYPES L_TYPE_ID <L_TYPE>.

    if <L_TYPE>-ATYP = SYNT_TYPE-TABLE-ATYP.
      L_IS_TABLE = 'X'.
    endif.
* process structures
    if <L_ID_GRADE>-GRADE_NEEDED = GRADE_PROPERTIES.
      READ_TABLE_INDEX TYPES <L_ID_GRADE>-ID <L_TYPE_1>.
      while <L_TYPE_1>-PARENT_KIND = 'T' and
            <L_TYPE_1>-PARENT_INDEX <> 0.
        L_INDEX = <L_TYPE_1>-PARENT_INDEX.
        READ_TABLE_INDEX TYPES L_INDEX <L_TYPE_1>.
        if <L_TYPE_1>-KIND <> SYNT_TYPE-STRUC1-ATYP and
           <L_TYPE_1>-KIND <> SYNT_TYPE-STRUC2-ATYP.
          exit.
        endif.
        APPEND_XCROSS_ID_ANY_NO_DEF 'T' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
      endwhile.
    endif.

    if <L_ID_GRADE>-GRADE_NEEDED >= GRADE_DIRECT.
      case <L_TYPE>-KIND.
        when SYNT_TYPE-STRUC1-ATYP or
             SYNT_TYPE-STRUC2-ATYP.
          if <L_ID_GRADE>-GRADE >= GRADE_DIRECT.
            if <L_TYPE>-PARENT_KIND  = SYNT_PARENT_KIND-KIND_TYPE and
               <L_TYPE>-PARENT_INDEX <> 0.
              L_NESTED = 'X'.
            else.
              L_NESTED = ' '.
            endif.
            GET_IDS_IND_TYPE_COMP(
                        exporting P_TYPE_ID       = L_TYPE_ID
                                  P_NESTED        = L_NESTED
                                  P_FULL_NAME     = <L_ID_GRADE>-FULL_NAME
                                  P_GRADE_NEEDED  = <L_ID_GRADE>-GRADE_NEEDED
                        changing  P_XCROSS_IDS    = P_XCROSS_IDS
                                  P_T_IDS_COMP    = L_T_IDS_COMP
                                  P_T_IDS_DIR     = P_XCROSS_IDS-T_ID_GRADES ).
          endif.

        when SYNT_TYPE-OBJ1-ATYP or
             SYNT_TYPE-OBJ2-ATYP.
          if <L_ID_GRADE>-GRADE_NEEDED >= GRADE_COMPONENTS.
            GET_IDS_OBJTYPE_COMP(
                         exporting P_ENV_ID            = <L_TYPE>-REF_OFFSET
                                   P_NESTED            = 'X'
                                   P_GRADE             = GRADE_COMPONENTS
                                   P_GRADE_NEEDED      = <L_ID_GRADE>-GRADE_NEEDED
                                   P_FULL_NAME         = <L_ID_GRADE>-FULL_NAME
                         changing  P_XCROSS_IDS        = P_XCROSS_IDS
                                   P_T_IDS_COMP        = L_T_IDS_COMP
                                   P_D_IDS_COMP        = L_D_IDS_COMP
                                   P_E_IDS_COMP        = L_E_IDS_COMP
                                   P_E_IDS_IND         = L_E_IDS_IND
                                   P_E_IDS_CONSTR      = L_E_IDS_CONSTR
                                   P_E_IDS_CONSTR_TYPE = L_E_IDS_CONSTR_TYPE ).
          endif.

          if <L_ID_GRADE>-GRADE_NEEDED = GRADE_PROPERTIES.
            GET_IDS_OBJTYPE_IND(
                         exporting P_ENV_ID     = <L_TYPE>-REF_OFFSET
                                   P_FULL_NAME  = <L_ID_GRADE>-FULL_NAME
                         changing  P_E_IDS_IND  = L_E_IDS_IND ).
          endif.

        when SYNT_TYPE-INTERFACE-ATYP.
          if <L_ID_GRADE>-GRADE_NEEDED = GRADE_PROPERTIES.
            GET_IDS_OBJTYPE_IND(
                         exporting P_ENV_ID     = <L_TYPE>-REF_OFFSET
                                   P_FULL_NAME  = <L_ID_GRADE>-FULL_NAME
                         changing  P_E_IDS_IND  = L_E_IDS_IND ).

          endif.

          if <L_ID_GRADE>-GRADE_NEEDED >= GRADE_COMPONENTS.
            GET_IDS_OBJTYPE_COMP(
                         exporting P_ENV_ID            = <L_TYPE>-REF_OFFSET
                                   P_NESTED            = 'X'
                                   P_GRADE             = <L_ID_GRADE>-GRADE
                                   P_GRADE_NEEDED      = <L_ID_GRADE>-GRADE_NEEDED
                                   P_FULL_NAME         = <L_ID_GRADE>-FULL_NAME
                         changing  P_XCROSS_IDS        = P_XCROSS_IDS
                                   P_T_IDS_COMP        = L_T_IDS_COMP
                                   P_D_IDS_COMP        = L_D_IDS_COMP
                                   P_E_IDS_COMP        = L_E_IDS_COMP
                                   P_E_IDS_IND         = L_E_IDS_IND
                                   P_E_IDS_CONSTR      = L_E_IDS_CONSTR
                                   P_E_IDS_CONSTR_TYPE = L_E_IDS_CONSTR_TYPE ).


            loop at ENVS assigning <L_ENV>.
              L_INDEX = SY-TABIX.
              if <L_ENV>-OBJ_TYPE = <L_ID_GRADE>-ID.
                GET_IDS_OBJTYPE_COMP(
                                 exporting P_ENV_ID            = L_INDEX
                                           P_NESTED            = ' '
                                           P_GRADE             = <L_ID_GRADE>-GRADE
                                           P_GRADE_NEEDED      = <L_ID_GRADE>-GRADE_NEEDED
                                           P_FULL_NAME         = <L_ID_GRADE>-FULL_NAME
                                 changing  P_XCROSS_IDS        = P_XCROSS_IDS
                                           P_T_IDS_COMP        = L_T_IDS_COMP
                                           P_D_IDS_COMP        = L_D_IDS_COMP
                                           P_E_IDS_COMP        = L_E_IDS_COMP
                                           P_E_IDS_IND         = L_E_IDS_IND
                                           P_E_IDS_CONSTR      = L_E_IDS_CONSTR
                                           P_E_IDS_CONSTR_TYPE = L_E_IDS_CONSTR_TYPE )
  .
              endif.

            endloop.
          endif.
      endcase.
    endif.
  endloop.


  loop at P_XCROSS_IDS-D_ID_GRADES assigning <L_ID_GRADE>.
    if <L_ID_GRADE>-GRADE_NEEDED >= GRADE_DIRECT.
      L_INDEX = <L_ID_GRADE>-ID.
      READ_TABLE_INDEX DATAS L_INDEX <L_DATA>.
      SYNT_IF_IS_TABLEWITHHEAD <L_DATA>-KIND.
      APPEND_XCROSS_ID_ANY 'D' <L_DATA>-REF1 0 GRADE_DIRECT <L_ID_GRADE>-FULL_NAME.
      APPEND_XCROSS_ID_ANY 'D' <L_DATA>-REF2 0 GRADE_DIRECT <L_ID_GRADE>-FULL_NAME.
      L_INDEX = <L_DATA>-REF2.
      READ_TABLE_INDEX DATAS L_INDEX <L_DATA>.
      SYNT_ENDIF.

      if <L_DATA>-REF1 = 0.
        return.
      endif.
      if <L_DATA>-KIND < SYNT_DATA-COMPONENT or <L_DATA>-KIND = SYNT_DATA-BOX or <L_DATA>-KIND = SYNT_DATA-BOX_COMP.
        READ_TABLE_INDEX TYPES <L_DATA>-REF1 <L_TYPE>.
        case <L_TYPE>-ATYP.
          when SYNT_TYPE-STRUC1-ATYP or
               SYNT_TYPE-STRUC2-ATYP.
            GET_IDS_DATA_COMPONENTS(
              exporting P_GRADE        = <L_ID_GRADE>-GRADE
                        P_GRADE_NEEDED = <L_ID_GRADE>-GRADE_NEEDED
                        P_ROOT_ID      = L_INDEX
                        P_DATA_ID      = L_INDEX
                        P_TYPE_ID      = <L_DATA>-REF1
                        P_FULL_NAME    = <L_ID_GRADE>-FULL_NAME
              changing  P_XCROSS_IDS   = P_XCROSS_IDS ).

        endcase.
      endif.


      assign <L_DATA> to <L_DATA_1>.
      concatenate '\DA:' <L_DATA_1>-STR into L_NAME.
      while <L_DATA_1>-IS_ROOT = ' ' and <L_DATA_1>-PARENT_KIND = 'D'.
        L_INDEX = <L_DATA_1>-PARENT_INDEX.
        READ_TABLE_INDEX DATAS <L_DATA_1>-PARENT_INDEX <L_DATA_1>.
        if  <L_ID_GRADE>-GRADE_NEEDED = GRADE_PROPERTIES.
          concatenate '\DA:' <L_DATA_1>-STR L_NAME into L_NAME.
          APPEND_XCROSS_ID_ANY_NO_DEF 'D' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
        endif.
      endwhile.


      if <L_DATA_1>-PARENT_KIND = 'E'.
        READ_TABLE_INDEX ENVS <L_DATA_1>-PARENT_INDEX <L_ENV>.
        if <L_ENV>-KIND = SYNT_XENV-INTFDECL or
           <L_ENV>-KIND = SYNT_XENV-INTFDECLLOC.

          APPEND_XCROSS_DEP_ID_I I <L_DATA_1>-PARENT_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE TAG_ANY L_NAME <L_ID_GRADE>-FULL_NAME.
        elseif <L_ENV>-KIND = SYNT_XENV-METHOD or
               <L_ENV>-KIND = SYNT_XENV-CLASSMETHOD.
          READ_TABLE_INDEX ENVS <L_ENV>-PARENT <L_ENV_1>.
          if <L_ENV_1>-KIND = SYNT_XENV-INTFDECL or
             <L_ENV_1>-KIND = SYNT_XENV-INTFDECLLOC.
            GET_IDS_INTF_METH_DATAS(
              exporting P_INTF_ID    = <L_ENV>-PARENT
                        P_METH_NAME  = <L_ENV>-NAME
                        P_DATA_NAME  = <L_DATA>-STR
                        P_FULL_NAME  = <L_ID_GRADE>-FULL_NAME
              changing  P_XCROSS_IDS = P_XCROSS_IDS ).

          endif.
        endif.
      endif.
    endif.
  endloop.


  loop at P_XCROSS_IDS-E_ID_GRADES assigning <L_ID_GRADE>.
    READ_TABLE_INDEX ENVS <L_ID_GRADE>-ID <L_ENV>.

    check SY-SUBRC = 0.

    case <L_ENV>-KIND.
      when SYNT_XENV-EVENT      or
           SYNT_XENV-CLASSEVENT or
           SYNT_XENV-EVENTALIAS.
*        READ_TABLE_INDEX ENVS index <L_ENV>-PARENT assigning <L_ENV_1>.
*        if <L_ENV_1>-KIND = SYNT_XENV-INTFDECL or
*           <L_ENV_1>-KIND = SYNT_XENV-INTFDECLLOC and <L_ID_GRADE>-GRADE >= GRADE_DIRECT.
*          GET_IDS_INTERFACE_EVNTS(
*            exporting P_INTF_ID    = <L_ENV>-PARENT
*                      P_EVENT_NAME = <L_ENV>-NAME
*                      P_FULL_NAME  = <L_ID_GRADE>-FULL_NAME
*            changing  P_XCROSS_IDS = P_XCROSS_IDS ).
*        endif.

        APPEND_DEP_ID L_E_IDS_IND <L_ID_GRADE>-ID <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.

*

      when SYNT_XENV-METHOD      or
           SYNT_XENV-CLASSMETHOD or
           SYNT_XENV-METHODALIAS.
*        READ_TABLE_INDEX ENVS index <L_ENV>-PARENT assigning <L_ENV_1>.
*        if ( <L_ENV_1>-KIND = SYNT_XENV-INTFDECL or
*             <L_ENV_1>-KIND = SYNT_XENV-INTFDECLLOC ) and <L_ID_GRADE>-GRADE >= GRADE_DIRECT.
*          GET_IDS_INTERFACE_METHS(
*            exporting P_INTF_ID    = <L_ENV>-PARENT
*                      P_METH_NAME  = <L_ENV>-NAME
*                      P_FULL_NAME  = <L_ID_GRADE>-FULL_NAME
*            changing  P_XCROSS_IDS = P_XCROSS_IDS ).
*        endif.
*
        if <L_ENV>-NAME = 'CONSTRUCTOR'.
          APPEND_DEP_ID L_E_IDS_CONSTR      <L_ID_GRADE>-ID <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
          APPEND_DEP_ID L_E_IDS_CONSTR_TYPE <L_ENV>-PARENT  <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
        endif.

    endcase.
  endloop.


  L_K_IDS_IND = P_XCROSS_IDS-K_ID_GRADES.


  if L_E_IDS_CONSTR is not initial.
* Envs
    loop at ENVS assigning <L_ENV>.
      L_INDEX = SY-TABIX.
      case <L_ENV>-KIND.
        when SYNT_XENV-INHERIT.
          loop at L_E_IDS_CONSTR assigning <L_ID_GRADE> where ID = <L_ENV>-ALIAS.
            APPEND_DEP_ID L_E_IDS_CONSTR       L_INDEX       <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
            APPEND_DEP_ID L_E_IDS_CONSTR_TYPE <L_ENV>-PARENT <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
          endloop.
      endcase.
    endloop.
  endif.


  if P_XCROSS_IDS-T_ID_GRADES is not initial or
     L_T_IDS_IND              is not initial or
     L_E_IDS_CONSTR_TYPE      is not initial or
     L_T_IDS_COMP             is not initial or
     L_T_IDS_CONSTR           is not initial.
* Types
    loop at TYPES assigning <L_TYPE>.
      L_INDEX = SY-TABIX.

      case <L_TYPE>-KIND.
        when SYNT_TYPE-AS-ATYP          or
             SYNT_TYPE-TYPEALIAS-ATYP   or
             SYNT_TYPE-TYPE-ATYP.

          loop at P_XCROSS_IDS-T_ID_GRADES assigning <L_ID_GRADE> where ID = <L_TYPE>-REF_OFFSET and GRADE_NEEDED = GRADE_PROPERTIES.
            APPEND_XCROSS_ID_NO_DEF TAG_TYPE 'T' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
            APPEND_DEP_ID           L_T_IDS_IND L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
          endloop.

          loop at L_T_IDS_IND assigning <L_ID_GRADE> where ID = <L_TYPE>-REF_OFFSET and GRADE_NEEDED = GRADE_PROPERTIES.
            APPEND_XCROSS_ID_NO_DEF TAG_TYPE 'T' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
            APPEND_DEP_ID           L_T_IDS_IND L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
          endloop.

          loop at L_T_IDS_CONSTR_TYPE assigning <L_ID_GRADE> where ID = <L_TYPE>-REF_OFFSET.
            APPEND_DEP_ID L_T_IDS_CONSTR_TYPE L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
          endloop.

        when SYNT_TYPE-OBJ1-ATYP or SYNT_TYPE-OBJ2-ATYP.
          loop at L_E_IDS_CONSTR_TYPE assigning <L_ID_GRADE> where ID = <L_TYPE>-REF_OFFSET.
            APPEND_DEP_ID L_T_IDS_CONSTR L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
            APPEND_XCROSS_ID_NO_DEF TAG_METHOD 'T' L_INDEX 0 <L_ID_GRADE>-GRADE <L_ID_GRADE>-FULL_NAME.
          endloop.


        when SYNT_TYPE-REF-ATYP or
             SYNT_TYPE-FREF-ATYP or
             SYNT_TYPE-BREF-ATYP.

          loop at P_XCROSS_IDS-T_ID_GRADES assigning <L_ID_GRADE> where ID = <L_TYPE>-REF_OFFSET and GRADE_NEEDED = GRADE_PROPERTIES.
            APPEND_XCROSS_ID_NO_DEF TAG_TYPE 'T' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
            APPEND_DEP_ID           L_T_IDS_IND L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
          endloop.

          loop at L_T_IDS_COMP assigning <L_ID_GRADE> where ID = <L_TYPE>-REF_OFFSET and GRADE_NEEDED = GRADE_PROPERTIES.
            APPEND_XCROSS_ID TAG_TYPE 'T' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
            APPEND_DEP_ID   L_T_IDS_IND L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
          endloop.

          loop at L_T_IDS_IND assigning <L_ID_GRADE> where ID = <L_TYPE>-REF_OFFSET and GRADE_NEEDED = GRADE_PROPERTIES.
            APPEND_XCROSS_ID TAG_TYPE 'T' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
            APPEND_DEP_ID   L_T_IDS_IND L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
          endloop.

          loop at L_T_IDS_CONSTR assigning <L_ID_GRADE> where ID = <L_TYPE>-REF_OFFSET.
            APPEND_DEP_ID L_T_IDS_CONSTR_TYPE L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
          endloop.


        when SYNT_TYPE-TYPEINHERIT-ATYP or
             SYNT_TYPE-INTFIMPL-ATYP.

          loop at P_XCROSS_IDS-T_ID_GRADES assigning <L_ID_GRADE> where ID = <L_TYPE>-REF_OFFSET and GRADE_NEEDED >= GRADE_DIRECT.
            APPEND_XCROSS_ID_NO_DEF TAG_TYPE 'T' L_INDEX 0 GRADE_DIRECT <L_ID_GRADE>-FULL_NAME.
            APPEND_DEP_ID           P_XCROSS_IDS-T_ID_GRADES L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
          endloop.

          loop at L_T_IDS_COMP assigning <L_ID_GRADE> where ID = <L_TYPE>-REF_OFFSET and GRADE_NEEDED >= GRADE_COMPONENTS.
            APPEND_XCROSS_ID TAG_TYPE 'T' L_INDEX 0 GRADE_COMPONENTS <L_ID_GRADE>-FULL_NAME.
            APPEND_DEP_ID   L_T_IDS_COMP L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
          endloop.

          loop at L_T_IDS_IND assigning <L_ID_GRADE> where ID = <L_TYPE>-REF_OFFSET and GRADE_NEEDED = GRADE_PROPERTIES.
            APPEND_XCROSS_ID TAG_TYPE 'T' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
            APPEND_DEP_ID   L_T_IDS_IND L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
          endloop.

      endcase.
    endloop.
  endif.


  if P_XCROSS_IDS-T_ID_GRADES   is not initial or
     L_T_IDS_COMP               is not initial or
     L_T_IDS_IND                is not initial.

*     Datas:
    loop at COMPS assigning <L_COMP>.
      L_INDEX = SY-TABIX.

      loop at P_XCROSS_IDS-T_ID_GRADES assigning <L_ID_GRADE> where ID = <L_COMP>-TYPE and GRADE_NEEDED = GRADE_PROPERTIES.
        APPEND_XCROSS_ID_1_NO_DEF  SYNT_ROLE-COMPONENT 'C' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
      endloop.

      loop at L_T_IDS_IND assigning <L_ID_GRADE> where ID = <L_COMP>-TYPE and GRADE_NEEDED = GRADE_PROPERTIES.
        APPEND_XCROSS_ID_1_NO_DEF SYNT_ROLE-COMPONENT 'C' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
      endloop.

      loop at P_XCROSS_IDS-T_ID_GRADES assigning <L_ID_GRADE> where ID = <L_COMP>-REF_TYPE and GRADE_NEEDED >= GRADE_COMPONENTS.
        APPEND_XCROSS_ID_1_NO_DEF SYNT_ROLE-COMPONENT  'C' L_INDEX 0 GRADE_COMPONENTS <L_ID_GRADE>-FULL_NAME.
      endloop.

      loop at L_T_IDS_IND assigning <L_ID_GRADE> where ID = <L_COMP>-REF_TYPE and GRADE_NEEDED = GRADE_PROPERTIES.
        APPEND_XCROSS_ID_1_NO_DEF SYNT_ROLE-COMPONENT 'C' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
      endloop.

      TYPE_FULL_NAME( exporting P_TYPE_ID = <L_COMP>-REF_TYPE
                      importing P_RESULT  = L_NAME ).
      concatenate L_NAME '\' TAG_TYPE ':' <L_COMP>-STR into L_NAME.

      loop at P_XCROSS_IDS-T_ID_GRADES assigning <L_ID_GRADE> where FULL_NAME = L_NAME.
        APPEND_XCROSS_ID_1_NO_DEF SYNT_ROLE-COMPONENT  'C' L_INDEX 0 GRADE_DIRECT <L_ID_GRADE>-FULL_NAME.
      endloop.

      loop at L_T_IDS_IND assigning <L_ID_GRADE> where FULL_NAME = L_NAME.
        APPEND_XCROSS_ID_1_NO_DEF SYNT_ROLE-COMPONENT 'C' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
      endloop.
    endloop.
  endif.


  if L_K_IDS_IND is not initial.
* Types
    loop at TABLE_KEYS assigning <L_TABLE_KEY>.
      L_INDEX = SY-TABIX.
      loop at L_K_IDS_IND assigning <L_ID_GRADE> where ID = <L_TABLE_KEY>-ORIG_KEY.
        APPEND_XCROSS_ID_NO_DEF TAG_TABLE_KEY 'K' L_INDEX 0 GRADE_DIRECT <L_ID_GRADE>-FULL_NAME.
        APPEND_DEP_ID           L_K_IDS_IND L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
      endloop.
    endloop.
  endif.


  if P_XCROSS_IDS-T_ID_GRADES   is not initial or
     P_XCROSS_IDS-D_ID_GRADES   is not initial or
     L_T_IDS_COMP               is not initial or
     L_T_IDS_CONSTR_TYPE        is not initial or
     L_T_IDS_IND                is not initial or
     L_D_IDS_COMP               is not initial.

*     Datas:
    loop at DATAS assigning <L_DATA> where REF1 <> 0.
      L_INDEX = SY-TABIX.


      clear L_IS_STRUCT.

      if <L_DATA>-KIND = SYNT_DATA-BOX or <L_DATA>-KIND = SYNT_DATA-BOX_COMP.
        loop at P_XCROSS_IDS-D_ID_GRADES assigning <L_ID_GRADE> where ID = <L_DATA>-REF2.
          APPEND_XCROSS_ID_ANY_NO_DEF 'D' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
          APPEND_DEP_ID L_D_IDS_BOX L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
        endloop.

        loop at L_D_IDS_BOX assigning <L_ID_GRADE> where ID = <L_DATA>-REF2.
          APPEND_XCROSS_ID_ANY_NO_DEF 'D' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
          APPEND_DEP_ID L_D_IDS_BOX L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
        endloop.
      endif.

      if <L_DATA>-KIND < SYNT_DATA-COMPONENT or <L_DATA>-KIND = SYNT_DATA-BOX or <L_DATA>-KIND = SYNT_DATA-BOX_COMP.

        loop at P_XCROSS_IDS-T_ID_GRADES assigning <L_ID_GRADE> where ID = <L_DATA>-REF1 and GRADE_NEEDED >= GRADE_DIRECT.
          if <L_DATA>-KIND = SYNT_DATA-DDICTABLE.
            APPEND_XCROSS_ID_ANY 'D' L_INDEX 0 GRADE_DEF_TO_DIRECT <L_ID_GRADE>-FULL_NAME.
          elseif <L_DATA>-IS_ROOT     = ' '                 and
             <L_DATA>-PARENT_KIND = 'D'.
            READ_TABLE_INDEX TYPES <L_ID_GRADE>-ID <L_TYPE>.
            if <L_TYPE>-PARENT_KIND = 'T'.
              READ_TABLE_INDEX TYPES <L_TYPE>-PARENT_INDEX <L_TYPE_1>.
              if <L_TYPE_1>-KIND = SYNT_TYPE-STRUC1-ATYP or
                 <L_TYPE_1>-KIND = SYNT_TYPE-STRUC2-ATYP.
                READ_TABLE_INDEX DATAS <L_DATA>-PARENT_INDEX <L_DATA_1>.
                L_IS_STRUCT = 'X'.
                GET_IDS_DATA_PARENTS(
                    exporting P_DATA_ID      = L_INDEX
                              P_CURR_DATA_ID = <L_DATA>-PARENT_INDEX
                              P_TYPE_ID      = <L_DATA_1>-REF1
                              P_TOP_LEVEL    = 'X'
                              P_DEF          = ' '
                              P_FULL_NAME    = <L_ID_GRADE>-FULL_NAME
                              P_GRADE        = <L_ID_GRADE>-GRADE
                    importing P_COMPARE      = L_COMPARE
                    changing  P_XCROSS_IDS   = P_XCROSS_IDS ).
              endif.
            endif.
          endif.
        endloop.


        loop at L_T_IDS_COMP assigning <L_ID_GRADE> where ID = <L_DATA>-REF1 and GRADE_NEEDED >= GRADE_COMPONENTS.
          if <L_DATA>-IS_ROOT = 'X'.
            if <L_ID_GRADE>-GRADE_NEEDED = GRADE_PROPERTIES.
              APPEND_XCROSS_ID_ANY_NO_DEF 'D' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
            endif.
          else.
            APPEND_XCROSS_ID_ANY_NO_DEF 'D' L_INDEX 0 GRADE_COMPONENTS <L_ID_GRADE>-FULL_NAME.
          endif.
        endloop.

        loop at L_T_IDS_CONSTR_TYPE assigning <L_ID_GRADE> where ID = <L_DATA>-REF1.
          APPEND_XCROSS_ID_NO_DEF TAG_METHOD 'D' L_INDEX 0 <L_ID_GRADE>-GRADE <L_ID_GRADE>-FULL_NAME.
        endloop.

        loop at P_XCROSS_IDS-T_ID_GRADES assigning <L_ID_GRADE> where ID = <L_DATA>-REF1 and GRADE_NEEDED = GRADE_PROPERTIES.
          if L_IS_STRUCT = ' '.
*            APPEND_XCROSS_ID_ANY_NO_DEF 'D' L_INDEX 0 GRADE_DEF_TO_PROPERTIES <L_ID_GRADE>-FULL_NAME.
            APPEND_XCROSS_ID_ANY_NO_DEF  'D' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.

          endif.
          if L_IS_TABLE = 'X'.
            L_INDEX_1 = L_INDEX - 1.
            READ_TABLE_INDEX DATAS L_INDEX_1 <L_DATA_1>.
            SYNT_IF_IS_TABLEWITHHEAD <L_DATA_1>-KIND.
            if <L_DATA_1>-REF1 = L_INDEX.
              APPEND_XCROSS_ID_ANY 'D' L_INDEX   0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
              APPEND_XCROSS_ID_ANY 'D' L_INDEX_1 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
            endif.
            SYNT_ENDIF.
          endif.
        endloop.

        loop at L_T_IDS_IND assigning <L_ID_GRADE> where ID = <L_DATA>-REF1 and GRADE_NEEDED = GRADE_PROPERTIES.
*          if L_IS_STRUCT = ' '.
          APPEND_XCROSS_ID_ANY_NO_DEF 'D' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
*          endif.
          if L_IS_TABLE = 'X'.
            L_INDEX_1 = L_INDEX - 1.
            READ_TABLE_INDEX DATAS L_INDEX_1 <L_DATA_1>.
            SYNT_IF_IS_TABLEWITHHEAD <L_DATA_1>-KIND.
            if <L_DATA_1>-REF1 = L_INDEX.
              APPEND_XCROSS_ID_ANY 'D' L_INDEX   0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
              APPEND_XCROSS_ID_ANY 'D' L_INDEX_1 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
            endif.
            SYNT_ENDIF.
          endif.
        endloop.

        if <L_DATA>-KIND = SYNT_DATA-FCTPARAMETER.

          GET_DATA_ORIG( exporting P_START  = <L_DATA>-REF2
                                   P_COUNT  = <L_DATA>-DPAR_CNT
                         changing  P_RESULT = L_DATA_ORIG ).

          if L_DATA_ORIG <> 0.
            loop at P_XCROSS_IDS-D_ID_GRADES assigning <L_ID_GRADE> where ID = L_DATA_ORIG and GRADE_NEEDED >= GRADE_DIRECT.
              APPEND_XCROSS_ID_ANY 'D' L_INDEX 0 GRADE_DIRECT <L_ID_GRADE>-FULL_NAME.
              APPEND_DEP_ID  P_XCROSS_IDS-D_ID_GRADES L_INDEX GRADE_DIRECT <L_ID_GRADE>-GRADE_NEEDED TAG_DATA <L_ID_GRADE>-FULL_NAME.
            endloop.
          endif.
        endif.

      elseif <L_DATA>-KIND = SYNT_DATA-INHERIT.

        loop at L_D_IDS_COMP assigning <L_ID_GRADE> where ID = <L_DATA>-REF1.
          APPEND_DEP_ID L_D_IDS_COMP L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
        endloop.

        loop at P_XCROSS_IDS-D_ID_GRADES assigning <L_ID_GRADE> where ID = <L_DATA>-REF1 and GRADE_NEEDED >= GRADE_DIRECT.
          APPEND_XCROSS_ID TAG_DATA 'D' L_INDEX 0 GRADE_DIRECT <L_ID_GRADE>-FULL_NAME.
          APPEND_DEP_ID    P_XCROSS_IDS-D_ID_GRADES L_INDEX GRADE_DIRECT <L_ID_GRADE>-GRADE_NEEDED TAG_DATA <L_ID_GRADE>-FULL_NAME.
        endloop.

      endif.

      loop at L_D_IDS_COMP assigning <L_ID_GRADE> where ID = L_INDEX and GRADE_NEEDED >= GRADE_COMPONENTS.
        APPEND_XCROSS_ID_ANY_NO_DEF 'D' L_INDEX 0 GRADE_COMPONENTS <L_ID_GRADE>-FULL_NAME.
      endloop.

    endloop.

  endif.


  if P_XCROSS_IDS-T_ID_GRADES  is not initial or
     P_XCROSS_IDS-E_ID_GRADES  is not initial or
     L_E_IDS_IND               is not initial or
     L_E_IDS_COMP              is not initial.


*     Envs

    loop at ENVS assigning <L_ENV>.
      L_INDEX = SY-TABIX.

      loop at P_XCROSS_IDS-T_ID_GRADES assigning <L_ID_GRADE> where ID = <L_ENV>-OBJ_TYPE.
        APPEND_XCROSS_ID_ANY 'E' L_INDEX 0 <L_ID_GRADE>-GRADE <L_ID_GRADE>-FULL_NAME.
      endloop.

      case <L_ENV>-KIND.

        when SYNT_XENV-CLASSMETHOD.
          loop at L_E_IDS_IND assigning <L_ID_GRADE> where ID = <L_ENV>-OBJ_TYPE and GRADE_NEEDED = GRADE_PROPERTIES.
            APPEND_XCROSS_ID_NO_DEF TAG_METHOD 'E' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
          endloop.

        when SYNT_XENV-METHOD.
          loop at L_E_IDS_IND assigning <L_ID_GRADE> where ID = <L_ENV>-OBJ_TYPE and GRADE_NEEDED = GRADE_PROPERTIES.
            APPEND_XCROSS_ID_NO_DEF TAG_METHOD 'E' L_INDEX 0 GRADE_PROPERTIES <L_ID_GRADE>-FULL_NAME.
          endloop.

          loop at P_XCROSS_IDS-E_ID_GRADES assigning <L_ID_GRADE> where ID = <L_ENV>-ALIAS.
            APPEND_XCROSS_ID <L_ID_GRADE>-TAG 'E'  L_INDEX 0 GRADE_DIRECT <L_ID_GRADE>-FULL_NAME.
            APPEND_DEP_ID P_XCROSS_IDS-E_ID_GRADES L_INDEX   GRADE_DIRECT <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
          endloop.

        when SYNT_XENV-INHERIT.
          loop at L_E_IDS_COMP assigning <L_ID_GRADE> where ID = <L_ENV>-ALIAS.
            APPEND_DEP_ID L_E_IDS_COMP L_INDEX <L_ID_GRADE>-GRADE <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
          endloop.

          loop at P_XCROSS_IDS-E_ID_GRADES assigning <L_ID_GRADE> where ID = <L_ENV>-ALIAS.
            APPEND_XCROSS_ID <L_ID_GRADE>-TAG 'E'  L_INDEX 0 GRADE_DIRECT <L_ID_GRADE>-FULL_NAME.
            APPEND_DEP_ID P_XCROSS_IDS-E_ID_GRADES L_INDEX   GRADE_DIRECT <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
          endloop.

      endcase.

      loop at L_E_IDS_COMP assigning <L_ID_GRADE> where ID = L_INDEX and GRADE >= GRADE_COMPONENTS.
        APPEND_XCROSS_ID_ANY_NO_DEF 'E' L_INDEX 0 GRADE_COMPONENTS <L_ID_GRADE>-FULL_NAME.
      endloop.

      loop at P_XCROSS_IDS-E_ID_GRADES assigning <L_ID_GRADE> where ID = <L_ENV>-OBJ_TYPE and GRADE_NEEDED = GRADE_PROPERTIES and TAG = TAG_METHOD.
        APPEND_XCROSS_ID <L_ID_GRADE>-TAG 'E'     L_INDEX 0                GRADE_DIRECT <L_ID_GRADE>-FULL_NAME.
        APPEND_DEP_ID    P_XCROSS_IDS-E_ID_GRADES L_INDEX GRADE_PROPERTIES <L_ID_GRADE>-GRADE_NEEDED <L_ID_GRADE>-TAG <L_ID_GRADE>-FULL_NAME.
      endloop.
    endloop.

  endif.

endmethod.


method GET_IDS_IND_TYPE_COMP .
*---------------------------------------------------------------------*
*       METHOD GET_XCROSS_IDS_IND                                     *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_ID_GRADE   like line of P_T_IDS_COMP,
    L_ITEM       type I.
  field-symbols:
    <L_TYPE>     like line of TYPES,
    <L_ITEM>     like line of TYPE_CHILDS.

  check P_GRADE_NEEDED >= grade_direct.

  READ_TABLE_INDEX TYPES P_TYPE_ID <L_TYPE>.

  if <L_TYPE>-KIND <> SYNT_TYPE-STRUC1-ATYP and
     <L_TYPE>-KIND <> SYNT_TYPE-STRUC2-ATYP.
    return.
  endif.

  do.
    if SY-INDEX > <L_TYPE>-CHILD_CNT.
      exit.
    endif.
    L_ITEM = <L_TYPE>-REF_OFFSET + SY-INDEX - 1.
    read table TYPE_CHILDS index L_ITEM assigning <L_ITEM>.
    if P_GRADE_NEEDED >= GRADE_COMPONENTS.
      APPEND_XCROSS_ID_ANY_NO_DEF 'T' <L_ITEM>-TYPE_OFFSET 0 GRADE_COMPONENTS p_FULL_NAME.
      APPEND_DEP_ID P_T_IDS_COMP <L_ITEM>-TYPE_OFFSET GRADE_COMPONENTS P_GRADE_NEEDED TAG_TYPE P_FULL_NAME.
    endif.
    if P_NESTED = 'X'.
      APPEND_XCROSS_ID_ANY_NO_DEF 'T' <L_ITEM>-TYPE_OFFSET 0 GRADE_DIRECT p_FULL_NAME.
      CREATE_SYMBOL_ENTRY  'T' <L_ITEM>-TYPE_OFFSET P_FULL_NAME.
      APPEND_DEP_ID  p_T_IDS_DIR <L_ITEM>-TYPE_OFFSET GRADE_DIRECT P_GRADE_NEEDED TAG_TYPE P_FULL_NAME.
    endif.

    GET_IDS_IND_TYPE_COMP(
           exporting P_TYPE_ID      = <L_ITEM>-TYPE_OFFSET
                     P_NESTED       = 'X'
                     P_FULL_NAME    = P_FULL_NAME
                     P_GRADE_NEEDED = P_GRADE_NEEDED
           changing  P_XCROSS_IDS   = P_XCROSS_IDS
                     P_T_IDS_COMP   = P_T_IDS_COMP
                     P_T_IDS_DIR    = P_T_IDS_DIR ).
  enddo.
endmethod.


method GET_IDS_INTF_METH_DATAS .
  data:
    L_TYPE_ID    type I,
    L_INDEX      type I,
    L_ENV_ID     type I.
  field-symbols:
    <L_ENV>      like line of ENVS,
    <L_MAP>      type SYNT_STRUC_MAP.

  READ_TABLE_INDEX ENVS P_INTF_ID <L_ENV>.
  L_TYPE_ID = <L_ENV>-OBJ_TYPE.
  L_INDEX = 0.
  do.
    add 1 to L_INDEX.
    READ_TABLE_INDEX ENVS L_INDEX <L_ENV>.
    if SY-SUBRC <> 0. exit. endif.
    if <L_ENV>-KIND     = SYNT_XENV-INTERFACE and
       <L_ENV>-OBJ_TYPE = L_TYPE_ID.
      read table  <L_ENV>-METHODS with table key NAME = P_METH_NAME
                  assigning <L_MAP>.
      if SY-SUBRC <> 0.
        message X000(38) with PROGRAM.
      endif.
      L_ENV_ID = <L_MAP>-INDEX.
      do.                                                "#EC CI_NESTED
        READ_TABLE_INDEX ENVS L_ENV_ID <L_ENV>.
        if <L_ENV>-KIND <> SYNT_XENV-INHERIT. exit. endif.
        L_ENV_ID = <L_ENV>-ALIAS.
      enddo.

      read table  <L_ENV>-DATAS with table key NAME = P_DATA_NAME
                  assigning <L_MAP>.
      if SY-SUBRC <> 0.
        message X000(38) with PROGRAM.
      endif.

      APPEND_XCROSS_ID TAG_DATA 'D' <L_MAP>-INDEX 0 GRADE_DIRECT P_FULL_NAME.
      CREATE_SYMBOl_ENTRY       'D' <L_MAP>-INDEX P_FULL_NAME.
    endif.
  enddo.

endmethod.                    "


method GET_IDS_LOCAL_PROGRAM .
  data:
    L_TAG       type SCR_TAG,
    L_OBJ_DESCR type OBJINFO,
    L_HEAD      type STRING,
    L_TAIL      type STRING,
    L_NAME      type STRING,
    L_FORM_NAME type STRING,
    L_GRADE     type SCR_GRADE.

  define CHECK_OBJ_DESCR.
    IF &1-OBJ_ID = 0.
      IF FIND_ERROR = SPACE.
        RAISE EXCEPTION TYPE LCX_FULL_NAME_SYNTAX_ERROR.
      ELSE.
        RAISE EXCEPTION TYPE LCX_OBJECT_NOT_FOUND.
      ENDIF.
    ENDIF.
  end-of-definition.

  if P_COMP_NAME(1) <> '\'.
    raise exception type LCX_FULL_NAME_SYNTAX_ERROR.
  endif.

  L_TAG = P_COMP_NAME+1(2).

  if P_GRADE > GRADE_DIRECT.
    L_GRADE = GRADE_DIRECT.
  else.
    L_GRADE = P_GRADE.
  endif.

  case L_TAG.
    when TAG_FORM.
      if P_COMP_NAME+4(*) = '?'.
        APPEND_XCROSS_FORM L_TAG PROGRAM P_COMP_NAME+4 P_GRADE P_FULL_NAME.
      else.
        GET_IDS_ENV_COMP( exporting P_ENV_ID       = 3
                                    P_NAME         = P_COMP_NAME
                                    P_FULL_NAME    = P_FULL_NAME
                                    P_GRADE        = GRADE_DIRECT
                                    P_GRADE_NEEDED = P_GRADE
                          importing P_XCROSS_IDS   = P_XCROSS_IDS ).
      endif.

    when TAG_INCLUDE.
      split P_COMP_NAME+4 at '\' into L_HEAD L_TAIL.
      if L_TAIL is initial.
        APPEND_XCROSS_STRING L_TAG P_COMP_NAME+4 P_GRADE P_FULL_NAME.
        return.
      endif.
      concatenate '\' L_TAIL into L_TAIL.

      concatenate '\' TAG_PROGRAM ':' PROGRAM P_COMP_NAME into L_NAME.

      GET_IDS_INCLUDE(
                           exporting  P_COMP_NAME   = L_TAIL
                                      P_FULL_NAME   = L_NAME
                                      P_GRADE       = P_GRADE
                           changing   P_XCROSS_IDS  = P_XCROSS_IDS ).


    when TAG_PF_STATUS.
      APPEND_XCROSS_PFSTAT L_TAG P_COMP_NAME+4 PROGRAM GRADE_DIRECT P_FULL_NAME.

    when TAG_AT_SELECTION_SCREEN
      or TAG_AT_SELECTION_SCREEN_OUTPUT
      or TAG_AT_SELECTION_SCREEN_EXIT.

      GET_FORM_NAME_FOR_EVENT( exporting P_EVENT  = L_TAG
                               importing P_RESULT = L_FORM_NAME ).

      if  STRLEN( P_COMP_NAME ) = 3.
        concatenate '\' TAG_PROGRAM ':' PROGRAM
                    '\' TAG_FORM    ':' L_FORM_NAME into L_NAME.
        L_OBJ_DESCR = FIND_FULL_NAME( P_FULL_NAME = L_NAME ).
        CHECK_OBJ_DESCR L_OBJ_DESCR.

        APPEND_XCROSS_STRING L_TAG L_FORM_NAME GRADE_DEFINITION P_FULL_NAME.
      else.
        concatenate '\' TAG_PROGRAM ':' PROGRAM
                    '\' TAG_FORM    ':' L_FORM_NAME P_COMP_NAME+3(*) into L_NAME.
        L_OBJ_DESCR = FIND_FULL_NAME( P_FULL_NAME = L_NAME ).
        CHECK_OBJ_DESCR L_OBJ_DESCR.

        APPEND_XCROSS_ID L_OBJ_DESCR-TAG L_OBJ_DESCR-OBJ_KIND L_OBJ_DESCR-OBJ_ID 0 P_GRADE P_FULL_NAME.
        CREATE_SYMBOL_ENTRY              L_OBJ_DESCR-OBJ_KIND L_OBJ_DESCR-OBJ_ID P_FULL_NAME.
      endif.

    when TAG_GET
      or TAG_GET_LATE
      or TAG_AT_SELECTION_SCREEN_ON
      or TAG_AT_SELECTION_SCREEN_ON_END
      or TAG_AT_SELECTION_SCREEN_HELP
      or TAG_AT_SELECTION_SCREEN_VALUE
      or TAG_AT_SELECTION_SCREEN_RADIO
      or TAG_AT_SELECTION_SCREEN_BLOCK.

      split P_COMP_NAME+4 at '\' into L_HEAD L_TAIL.

      GET_FORM_NAME_FOR_EVENT( exporting P_EVENT  = L_TAG
                                         P_NAME   = L_HEAD
                               importing P_RESULT = L_FORM_NAME ).
      if L_TAIL is initial.
        concatenate '\' TAG_PROGRAM ':' PROGRAM
                    '\' TAG_FORM    ':' L_FORM_NAME into L_NAME.
        L_OBJ_DESCR = FIND_FULL_NAME( P_FULL_NAME = L_NAME ).

        CHECK_OBJ_DESCR L_OBJ_DESCR.

        APPEND_XCROSS_STRING L_TAG L_FORM_NAME GRADE_DEFINITION P_FULL_NAME.
      else.
        concatenate '\' TAG_PROGRAM ':' PROGRAM
                    '\' TAG_FORM    ':' L_FORM_NAME '\' L_TAIL into L_NAME.
        L_OBJ_DESCR = FIND_FULL_NAME( P_FULL_NAME = L_NAME ).
        CHECK_OBJ_DESCR L_OBJ_DESCR.

        APPEND_XCROSS_ID L_OBJ_DESCR-TAG L_OBJ_DESCR-OBJ_KIND L_OBJ_DESCR-OBJ_ID 0 P_GRADE P_FULL_NAME.
        CREATE_SYMBOL_ENTRY              L_OBJ_DESCR-OBJ_KIND L_OBJ_DESCR-OBJ_ID P_FULL_NAME.
      endif.

    when TAG_AT_PF.
      concatenate 'PF' P_COMP_NAME+4 into L_NAME.
      APPEND_XCROSS_STRING L_TAG L_NAME GRADE_DEFINITION P_FULL_NAME.

    when TAG_END_OF_EDITING
      or TAG_END_OF_SELECTION
      or TAG_INITIALIZATION
      or TAG_LOAD_OF_PROGRAM
      or TAG_START_OF_EDITING
      or TAG_START_OF_SELECTION
      or TAG_TOP_OF_PAGE
      or TAG_TOP_OF_PAGE_LINE_SELECTION
      or TAG_AT_USER_COMMAND
      or TAG_AT_LINE_SELECTION.
      GET_XCROSS_NAME_FOR_EVENT( exporting P_TAG = L_TAG importing P_XCROSS_NAME = L_NAME ).
      APPEND_XCROSS_STRING L_TAG L_NAME GRADE_DEFINITION P_FULL_NAME.
    when TAG_MODULE_IN or TAG_MODULE_OUT.
      APPEND_XCROSS_STRING L_TAG P_COMP_NAME+4 L_GRADE P_FULL_NAME.
    when TAG_BLOCK.
      APPEND_XCROSS_STRING L_TAG P_COMP_NAME+4 L_GRADE P_FULL_NAME.
    when TAG_GROUP.
      APPEND_XCROSS_STRING L_TAG P_COMP_NAME+4 L_GRADE P_FULL_NAME.
    when TAG_MACRO.
      APPEND_XCROSS_STRING L_TAG P_COMP_NAME+4 L_GRADE P_FULL_NAME.
    when TAG_SCREEN.
      APPEND_XCROSS_SCREEN L_TAG P_COMP_NAME+4 PROGRAM L_GRADE P_FULL_NAME.
    when TAG_TITLE.
      APPEND_XCROSS_PFSTAT L_TAG P_COMP_NAME+4 PROGRAM L_GRADE P_FULL_NAME.
    when TAG_INFOTYPE.
      APPEND_XCROSS_STRING L_TAG P_COMP_NAME+4 P_GRADE P_FULL_NAME.
    when TAG_CONTROL.
      L_TAIL = P_COMP_NAME+4.
      L_OBJ_DESCR = FIND_CONTROL( P_NAME  = L_TAIL ).
      CHECK_OBJ_DESCR L_OBJ_DESCR.

      APPEND_XCROSS_ID      L_OBJ_DESCR-TAG L_OBJ_DESCR-OBJ_KIND L_OBJ_DESCR-OBJ_ID 0 P_GRADE  P_FULL_NAME.
      CREATE_SYMBOL_ENTRY                   L_OBJ_DESCR-OBJ_KIND L_OBJ_DESCR-OBJ_ID P_FULL_NAME.
      APPEND_XCROSS_STRING  L_TAG           L_TAIL                                    P_GRADE  P_FULL_NAME.

    when TAG_COMMON_PART.
      L_TAIL = P_COMP_NAME+4.
      L_OBJ_DESCR = FIND_COMMON_PART( P_NAME  = L_TAIL ).

      CHECK_OBJ_DESCR L_OBJ_DESCR.

      if P_GRADE >= GRADE_DIRECT.
        APPEND_XCROSS_ID L_OBJ_DESCR-TAG L_OBJ_DESCR-OBJ_KIND
                         L_OBJ_DESCR-OBJ_ID 0 GRADE_DEF_TO_DIRECT P_FULL_NAME.
        CREATE_SYMBOL_ENTRY  L_OBJ_DESCR-OBJ_KIND L_OBJ_DESCR-OBJ_ID P_FULL_NAME.
      endif.
      APPEND_XCROSS_ID L_OBJ_DESCR-TAG L_OBJ_DESCR-OBJ_KIND
                         L_OBJ_DESCR-OBJ_ID 0 GRADE_DEFINITION_INTF P_FULL_NAME.

    when TAG_ENHANCEMENT_EXIT.
      split P_COMP_NAME+4 at '\' into L_HEAD L_TAIL.

      L_OBJ_DESCR = FIND_ENHANCEMENT_EXIT( P_NAME  = L_HEAD ).

      CHECK_OBJ_DESCR L_OBJ_DESCR.

      if L_TAIL is initial.
        APPEND_XCROSS_ID L_OBJ_DESCR-TAG L_OBJ_DESCR-OBJ_KIND
                         L_OBJ_DESCR-OBJ_ID 0 GRADE_DEFINITION P_FULL_NAME.
        CREATE_SYMBOL_ENTRY  L_OBJ_DESCR-OBJ_KIND L_OBJ_DESCR-OBJ_ID P_FULL_NAME.
      elseif L_TAIL = TAG_ENHANCEMENT_IMPL.
        if P_GRADE >= GRADE_DIRECT.
          APPEND_XCROSS_STRING TAG_ENHANCEMENT_IMPL P_FULL_NAME GRADE_DIRECT P_FULL_NAME.
          "APPEND_XCROSS_ID L_OBJ_DESCR-TAG L_OBJ_DESCR-OBJ_KIND
          "                 L_OBJ_DESCR-OBJ_ID 0 GRADE_DEF_TO_DIRECT P_FULL_NAME.
          CREATE_SYMBOL_ENTRY  L_OBJ_DESCR-OBJ_KIND L_OBJ_DESCR-OBJ_ID P_FULL_NAME.
        endif.

        concatenate '\' TAG_PROGRAM ':' PROGRAM P_COMP_NAME into L_NAME.

        L_OBJ_DESCR = FIND_ENHANCEMENT_IMPL( L_NAME  ).

        if L_OBJ_DESCR-OBJ_ID <> 0.
          APPEND_XCROSS_ID L_OBJ_DESCR-TAG L_OBJ_DESCR-OBJ_KIND L_OBJ_DESCR-OBJ_ID 0 GRADE_DEFINITION P_FULL_NAME.
*          APPEND_XCROSS_STRING TAG_ENHANCEMENT_IMPL P_FULL_NAME GRADE_DEFINITION  P_FULL_NAME.
        endif.

      elseif L_TAIL(2) = TAG_ENHANCEMENT.
        GET_IDS_ENH_COMP( exporting P_ENV_ID       = L_OBJ_DESCR-OBJ_ID
                                    P_NAME         = P_COMP_NAME
                                    P_FULL_NAME    = P_FULL_NAME
                                    P_GRADE        = GRADE_DIRECT
                          importing P_XCROSS_IDS   = P_XCROSS_IDS ).

      else.
        raise exception type LCX_FULL_NAME_SYNTAX_ERROR.
      endif.


    when others.
      if P_GRADE >= GRADE_DIRECT.
        L_GRADE = GRADE_DIRECT.
      else.
        L_GRADE = P_GRADE.
      endif.
      GET_IDS_ENV_COMP( exporting P_ENV_ID       = 3
                                  P_NAME         = P_COMP_NAME
                                  P_FULL_NAME    = P_FULL_NAME
                                  P_GRADE        = L_GRADE
                                  P_GRADE_NEEDED = P_GRADE
                        importing P_XCROSS_IDS   = P_XCROSS_IDS ).
  endcase.

endmethod.                    "GET_XCROSS_IDS


method GET_IDS_OBJTYPE_COMP .
*---------------------------------------------------------------------*
*       METHOD GET_XCROSS_IDS_IND                                     *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
     L_ID_GRADE  type line of T_ID_GRADES,
     L_NAME      type STRING.
  field-symbols:
    <L_ENV>      like line of ENVS,
    <L_ENV_1>    like line of ENVS,
    <L_ENV_2>    like line of ENVS,
    <L_MAP>      type SYNT_STRUC_MAP,
    <L_DATA>     like line of DATAS,
    <L_TYPE>     like line of TYPES.

  READ_TABLE_INDEX ENVS P_ENV_ID <L_ENV>.

  loop at <L_ENV>-TYPES assigning <L_MAP>.
    READ_TABLE_INDEX TYPES <L_MAP>-INDEX <L_TYPE>.
    if <L_TYPE>-KIND <> SYNT_TYPE-TYPEINHERIT.
      APPEND_XCROSS_ID_NO_DEF TAG_TYPE 'T' <L_MAP>-INDEX 0 GRADE_COMPONENTS P_FULL_NAME.
      APPEND_DEP_ID P_T_IDS_COMP <L_MAP>-INDEX P_GRADE P_GRADE_NEEDED TAG_TYPE P_FULL_NAME.
    endif.
  endloop.

  loop at <L_ENV>-DATAS assigning <L_MAP>.

    READ_TABLE_INDEX DATAS <L_MAP>-INDEX <L_DATA>.

    if <L_DATA>-KIND <> SYNT_DATA-INHERIT.
      APPEND_XCROSS_ID_ANY_NO_DEF 'D' <L_MAP>-INDEX 0 GRADE_COMPONENTS P_FULL_NAME.
      APPEND_DEP_ID           P_D_IDS_COMP <L_MAP>-INDEX P_GRADE P_GRADE_NEEDED TAG_DATA P_FULL_NAME.


      if <L_DATA>-KIND < SYNT_DATA-COMPONENT or <L_DATA>-KIND = SYNT_DATA-BOX or <L_DATA>-KIND = SYNT_DATA-BOX_COMP.
        READ_TABLE_INDEX TYPES <L_DATA>-REF1 <L_TYPE>.
        case <L_TYPE>-ATYP.
          when SYNT_TYPE-STRUC1-ATYP or
               SYNT_TYPE-STRUC2-ATYP.
            GET_IDS_DATA_COMPONENTS(
              exporting P_GRADE        = P_GRADE
                        P_GRADE_NEEDED = P_GRADE_NEEDED
                        P_ROOT_ID      = <L_MAP>-INDEX
                        P_DATA_ID      = <L_MAP>-INDEX
                        P_TYPE_ID      = <L_DATA>-REF1
                        P_FULL_NAME    = P_FULL_NAME
              changing  P_XCROSS_IDS   = P_XCROSS_IDS ).

        endcase.
      endif.
    endif.
  endloop.

  loop at <L_ENV>-METHODS assigning <L_MAP>.
    READ_TABLE_INDEX ENVS <L_MAP>-INDEX <L_ENV_1>.
*    if <L_ENV_1>-KIND <> SYNT_XENV-INHERIT.
      APPEND_XCROSS_ID_NO_DEF TAG_METHOD 'E' <L_MAP>-INDEX 0 GRADE_COMPONENTS P_FULL_NAME.
      APPEND_DEP_ID           P_E_IDS_COMP <L_MAP>-INDEX P_GRADE P_GRADE_NEEDED TAG_METHOD P_FULL_NAME.
*    endif.
  endloop.

  loop at <L_ENV>-EVENTS assigning <L_MAP>.
    READ_TABLE_INDEX ENVS <L_MAP>-INDEX <L_ENV_1>.
*    if <L_ENV_1>-KIND <> SYNT_XENV-INHERIT.
      APPEND_XCROSS_ID_NO_DEF TAG_EVENT 'E' <L_MAP>-INDEX 0 GRADE_COMPONENTS P_FULL_NAME.
      APPEND_DEP_ID           P_E_IDS_COMP <L_MAP>-INDEX P_GRADE P_GRADE_NEEDED TAG_EVENT P_FULL_NAME.
      if P_GRADE_NEEDED = GRADE_PROPERTIES.
        APPEND_DEP_ID P_E_IDS_IND <L_MAP>-INDEX P_GRADE P_GRADE_NEEDED TAG_EVENT P_FULL_NAME.
      endif.
*    endif.
  endloop.

  read table <L_ENV>-METHODS with table key NAME = 'CONSTRUCTOR'
             assigning <L_MAP>.
  if SY-SUBRC = 0.
    APPEND_DEP_ID P_E_IDS_CONSTR      <L_MAP>-INDEX     P_GRADE P_GRADE_NEEDED TAG_METHOD P_FULL_NAME.
    READ_TABLE_INDEX ENVS <L_MAP>-INDEX <L_ENV_1>.
    APPEND_DEP_ID P_E_IDS_CONSTR_TYPE <L_ENV_1>-PARENT  P_GRADE P_GRADE_NEEDED TAG_METHOD P_FULL_NAME.
  endif.

  if P_NESTED = 'X'.
    loop at <L_ENV>-INTERFACES assigning <L_MAP>.
      GET_IDS_OBJTYPE_COMP(
                     exporting P_ENV_ID            = <L_MAP>-INDEX
                               P_NESTED            = ' '
                               P_GRADE             = P_GRADE
                               P_GRADE_NEEDED      = P_GRADE_NEEDED
                               P_FULL_NAME         = P_FULL_NAME
                     changing  P_XCROSS_IDS        = P_XCROSS_IDS
                               P_T_IDS_COMP        = P_T_IDS_COMP
                               P_D_IDS_COMP        = P_D_IDS_COMP
                               P_E_IDS_COMP        = P_E_IDS_COMP
                               P_E_IDS_IND         = P_E_IDS_IND
                               P_E_IDS_CONSTR      = P_E_IDS_CONSTR
                               P_E_IDS_CONSTR_TYPE = P_E_IDS_CONSTR_TYPE

                   ).

    endloop.
  endif.

  read table <L_ENV>-DATAS with table key NAME = 'IMP' assigning <L_MAP>.
  check SY-SUBRC = 0.
  READ_TABLE_INDEX DATAS <L_MAP>-INDEX <L_DATA>.
  check SY-SUBRC = 0.
  READ_TABLE_INDEX TYPES <L_DATA>-REF1 <L_TYPE>.
  check SY-SUBRC = 0.
  READ_TABLE_INDEX TYPES <L_TYPE>-REF_OFFSET <L_TYPE>.
  READ_TABLE_INDEX ENVS  <L_TYPE>-REF_OFFSET <L_ENV_1>.
  loop at <L_ENV_1>-METHODS assigning <L_MAP>.
    READ_TABLE_INDEX ENVS <L_MAP>-INDEX <L_ENV_2>.
    concatenate '\TY:'  <L_ENV>-NAME '\ME:' <L_ENV_2>-NAME into L_NAME.
    APPEND_XCROSS_STRING_1 SYNT_ROLE-BADI_METHOD L_NAME GRADE_COMPONENTS P_FULL_NAME.
  endloop.

endmethod.                    "


method GET_IDS_OBJTYPE_IND .
*---------------------------------------------------------------------*
*       METHOD GET_XCROSS_IDS_IND                                     *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_ID_GRADE   like line of P_E_IDS_IND.
  field-symbols:
    <L_ENV>      like line of ENVS,
    <L_MAP>      type SYNT_STRUC_MAP.


  READ_TABLE_INDEX ENVS P_ENV_ID <L_ENV>.

  loop at <L_ENV>-EVENTS assigning <L_MAP>.
    APPEND_DEP_ID P_E_IDS_IND <L_MAP>-INDEX GRADE_PROPERTIES GRADE_PROPERTIES TAG_EVENT P_FULL_NAME.
  endloop.

endmethod.                    "


method GET_IDS_TYPE_COMP .
*---------------------------------------------------------------------*
*       METHOD FIND_TYPE_COMP                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_BASE_TYPE type I,
    L_TYPE_ID   type I,
    L_SRCH      type STRING,
    L_HEAD      type STRING,
    L_TAIL      type STRING,
    L_LENGTH    type I,
    L_FROM      type I,
    L_TO        type I,
    L_ID_GRADE  type line of T_ID_GRADES,
    L_OBJINFO   type OBJINFO.
  field-symbols:
    <L_TYPE_ENTRY> like line of TYPES,
    <L_ITEM>       like line of TYPE_CHILDS.
*
* get Id of base type
  L_BASE_TYPE = GET_BASE_TYPE( P_TYPE_ID ).

  check L_BASE_TYPE <> 0.

*
* check if base type is a structure or a table
*
  READ_TABLE_INDEX TYPES L_BASE_TYPE <L_TYPE_ENTRY>.
  check SY-SUBRC = 0.

  case <L_TYPE_ENTRY>-KIND.
    when SYNT_TYPE-STRUC1-ATYP or
         SYNT_TYPE-STRUC2-ATYP or
         SYNT_TYPE-TABLE-ATYP.
*     continue
    when SYNT_TYPE-OBJ1-ATYP or
         SYNT_TYPE-OBJ2-ATYP.
      GET_IDS_ENV_COMP( exporting P_ENV_ID       = <L_TYPE_ENTRY>-REF_OFFSET
                                  P_NAME         = P_NAME
                                  P_FULL_NAME    = P_FULL_NAME
                                  P_GRADE        = P_GRADE
                                  P_GRADE_NEEDED = P_GRADE_NEEDED
                        importing P_XCROSS_IDS   = P_XCROSS_IDS ).
      return.

    when SYNT_TYPE-INTERFACE-ATYP.
      GET_IDS_ENV_COMP( exporting P_ENV_ID       = <L_TYPE_ENTRY>-REF_OFFSET
                                  P_NAME         = P_NAME
                                  P_FULL_NAME    = P_FULL_NAME
                                  P_GRADE        = P_GRADE
                                  P_GRADE_NEEDED = P_GRADE_NEEDED
                        importing P_XCROSS_IDS   = P_XCROSS_IDS ).
      APPEND_XCROSS_DEP_ID_I I L_BASE_TYPE P_GRADE P_GRADE_NEEDED TAG_ANY P_NAME P_FULL_NAME.

      return.

*     Error
    when others.
      return.
  endcase.
*
* structure component or table line ...
*
  case P_NAME+1(2).

    when TAG_TYPE.
*   Split name
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.
      if L_HEAD is initial.
        L_HEAD = L_TAIL.
        clear L_TAIL.
      endif.
      if not L_TAIL is initial.
        concatenate '\' L_TAIL into L_TAIL.
      endif.
*   search for component name in childs( type )
      L_FROM = <L_TYPE_ENTRY>-REF_OFFSET.
      L_TO   = <L_TYPE_ENTRY>-REF_OFFSET + <L_TYPE_ENTRY>-CHILD_CNT.
      loop at TYPE_CHILDS from L_FROM to L_TO
                          assigning <L_ITEM>.
        READ_TABLE_INDEX TYPES <L_ITEM>-TYPE_OFFSET <L_TYPE_ENTRY>.
        if <L_TYPE_ENTRY>-STR = L_HEAD.
          L_TYPE_ID = <L_ITEM>-TYPE_OFFSET.
          exit.
        endif.
      endloop.

      check L_TYPE_ID <> 0.

      if L_TAIL is initial.
*     at the end of the path

        APPEND_XCROSS_ID_ANY 'T' L_TYPE_ID 0 P_GRADE P_FULL_NAME.
*        APPEND_XCROSS_TYPE   L_TYPE_ID P_GRADE P_FULL_NAME.

        APPEND_XCROSS_DEP_ID T L_TYPE_ID P_GRADE P_GRADE_NEEDED TAG_TYPE P_FULL_NAME.

        return.
      endif.

*   keep on searching
      GET_IDS_TYPE_COMP( exporting P_TYPE_ID      = L_TYPE_ID
                                   P_NAME         = L_TAIL
                                   P_FULL_NAME    = P_FULL_NAME
                                   P_GRADE        = P_GRADE
                                   P_GRADE_NEEDED = P_GRADE_NEEDED
                         importing P_XCROSS_IDS   = P_XCROSS_IDS ).

    when TAG_LINE_OF.
*   get line type
      READ_TABLE_INDEX TYPES L_BASE_TYPE <L_TYPE_ENTRY>.
      check SY-SUBRC = 0.
      L_LENGTH = STRLEN( P_NAME ).
      if L_LENGTH = 3.
*     end of path
        APPEND_XCROSS_TYPE <L_TYPE_ENTRY>-REFTYPE P_GRADE P_FULL_NAME.

        APPEND_XCROSS_DEP_ID  T <L_TYPE_ENTRY>-REFTYPE P_GRADE P_GRADE_NEEDED TAG_TYPE P_FULL_NAME.

        return.
      endif.
*   keep on searching
      L_SRCH = P_NAME+3.
      GET_IDS_TYPE_COMP( exporting P_TYPE_ID      = <L_TYPE_ENTRY>-REF_OFFSET
                                   P_NAME         = L_SRCH
                                   P_FULL_NAME    = P_FULL_NAME
                                   P_GRADE        = P_GRADE
                                   P_GRADE_NEEDED = P_GRADE_NEEDED
                         importing P_XCROSS_IDS   = P_XCROSS_IDS ).

    when TAG_SECTION.
      L_SRCH = P_NAME+4.
      split L_SRCH at '\' into L_HEAD L_TAIL.

      if L_HEAD <> 'END'.
        raise exception type LCX_FULL_NAME_SYNTAX_ERROR.
      endif.
      if L_TAIL <> TAG_ENHANCEMENT_IMPL.
        if STRLEN( L_TAIL ) < 7.
          raise exception type LCX_FULL_NAME_SYNTAX_ERROR.
        else.
          concatenate '\' L_TAIL into L_TAIL.
          GET_IDS_ENH_COMP( exporting P_ENV_ID     = -1
                                P_NAME         = L_TAIL
                                P_FULL_NAME    = P_FULL_NAME
                                P_GRADE        = P_GRADE
                      importing P_XCROSS_IDS   = P_XCROSS_IDS ).
          return.
        endif.
      endif.


      APPEND_XCROSS_STRING TAG_ENHANCEMENT_IMPL P_FULL_NAME P_GRADE P_FULL_NAME.


    when TAG_TABLE_KEY.
      L_SRCH = P_NAME+4.
      L_OBJINFO = FIND_TABLE_KEY( P_TYPE_ID = L_BASE_TYPE P_NAME = L_SRCH ).
      APPEND_XCROSS_ID L_OBJINFO-TAG L_OBJINFO-OBJ_KIND L_OBJINFO-OBJ_ID 0 P_GRADE P_FULL_NAME.
      APPEND_XCROSS_DEP_ID  K L_OBJINFO-OBJ_ID P_GRADE P_GRADE_NEEDED L_OBJINFO-TAG P_FULL_NAME.
      return.

    when others.
      raise exception type LCX_FULL_NAME_SYNTAX_ERROR.

  endcase.
endmethod.                    "FIND_TYPE_COMP


method GET_INCLUDE_CHECKSUM .
  data:
   L_LENGTH    type I,
   L_WA        type line of SCR_INCLUDE.

  if P_REF_TRDIR is bound.
    describe field P_REF_TRDIR->* length L_LENGTH in byte mode.
    CRC64( exporting P_INPUT      = P_REF_TRDIR->*
                     P_LENGTH     = L_LENGTH
           changing  P_CRC_VALUE  = P_RESULT ).
  endif.
  if P_REF_SOURCE is bound.
    loop at P_REF_SOURCE->* into L_WA.
      L_LENGTH = STRLEN( L_WA ).
      if L_LENGTH > 0.
        CRC64( exporting P_INPUT     = L_WA
                         P_LENGTH    = L_LENGTH
               changing  P_CRC_VALUE = P_RESULT ).
      else.
        CRC64( exporting P_INPUT     = SPACE
                         P_LENGTH    = 1
               changing  P_CRC_VALUE = P_RESULT ).
      endif.
    endloop.
  endif.
endmethod.                    "


method GET_INTERFACE_SYMBOL .

  P_LEVEL = P_LEVEL - 1.
  if P_LEVEL <= 0.
    raise exception type LCX_RECURSIVE_DEFINITION.
  endif.

  create object P_RESULT.
  P_RESULT->TAG         = TAG_TYPE.
  P_RESULT->FULL_NAME   = P_FULL_NAME.
  P_RESULT->TYPE_KIND   = CL_ABAP_COMP_TYPE=>TYPE_KIND_INTERFACE.
  P_RESULT->IS_ABSTRACT = P_ENTRY-ABSTRACT.
  P_RESULT->DURATION    = P_ENTRY-DURATION.
  P_RESULT->RISK_LEVEL  = P_ENTRY-RISK_LEVEL.

  GET_COMMENTS( exporting P_POS      = P_ENTRY-COMMENT_POS
                          P_INCLUDE  = P_ENTRY-INCL
                          P_LINE     = P_ENTRY-LINE
                importing P_COMMENTS = P_RESULT->PSEUDO_COMMENTS ).

endmethod.


method GET_INTERNAL_PRAGMAS
  by kernel module ab_km_get_internal_pragmas fail.
endmethod.


method GET_KEY_REFS .
*---------------------------------------------------------------------*
*       METHOD GET_TYPE_REFS                                          *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  field-symbols
    <L_TABLE_KEY> like line of TABLE_KEYS.

  while P_KEY_ID <> 0.
    READ_TABLE_INDEX TABLE_KEYS P_KEY_ID <L_TABLE_KEY>.

    REFS_RESULT-INCLUDE   = P_INCLUDE.
    KEY_FULL_NAME( exporting P_KEY_ID = P_KEY_ID importing P_RESULT = REFS_RESULT-FULL_NAME ).
    REFS_RESULT-TAG       = TAG_TABLE_KEY.
    GET_GRADE REFS_RESULT-GRADE P_DEF.
    INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
    REFS_RESULT-GRADE     = GRADE_DIRECT.
    INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
    P_KEY_ID = <L_TABLE_KEY>-ORIG_KEY.
  endwhile.

endmethod.                    "GET_TYPE_REFS


method GET_LOCAL_REFS .
*---------------------------------------------------------------------*
*       METHOD GET_REFS                                               *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  data:
*    REFS_NAME    type STRING,
*    REFS_RESULT  like line of P_RESULT,
*    L_SCREEN  type D020S-DNUM,
*    REFS_TITLE   type GUI_TITLE.
  field-symbols:
    <L_ENV>   like line of ENVS.

  case P_XCROSS-ROLE.

    when SYNT_ROLE-SCREEN.
      check TAG_SCREEN in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = REFS_NAME ).
      if REFS_NAME is not initial and
         REFS_NAME co '0123456789'.
        unpack REFS_NAME to REFS_SCREEN.
        REFS_NAME = REFS_SCREEN.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        TAG_NAME_2( exporting P_TAG_1  = TAG_PROGRAM
                                           P_NAME_1 = PROGRAM
                                           P_TAG_2  = TAG_SCREEN
                                           P_NAME_2 = REFS_NAME
                                           importing P_RESULT = REFS_RESULT-FULL_NAME ).
        REFS_RESULT-TAG       = TAG_SCREEN.
        GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      endif.

    when SYNT_ROLE-TITLE.
      check TAG_TITLE in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = REFS_NAME ).
      if REFS_NAME is not initial.
        REFS_TITLE               = REFS_NAME.
        REFS_NAME             = REFS_TITLE.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        TAG_NAME_2( exporting P_TAG_1  = TAG_PROGRAM
                                            P_NAME_1 = PROGRAM
                                            P_TAG_2  = TAG_TITLE
                                            P_NAME_2 = REFS_NAME
                                             importing P_RESULT = REFS_RESULT-FULL_NAME ).
        REFS_RESULT-TAG       = TAG_TITLE.
        GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      endif.

    when SYNT_ROLE-INFOTYPE.
      check TAG_INFOTYPE in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'S'.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      TAG_NAME_2( exporting P_TAG_1  = TAG_PROGRAM
                                           P_NAME_1 = PROGRAM
                                           P_TAG_2  = TAG_INFOTYPE
                                           P_NAME_2 = P_XCROSS-NAME
                                            importing P_RESULT = REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_INFOTYPE.
      GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

    when SYNT_ROLE-EVENT_KEYWORD.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'S'.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      GET_FULL_NAME_FOR_EVENT( exporting P_XCROSS_NAME = P_XCROSS-NAME
                               importing P_FULL_NAME   = REFS_RESULT-FULL_NAME
                                         P_TAG         = REFS_RESULT-TAG ).
      check REFS_RESULT-TAG in TAGS.
      REFS_RESULT-GRADE     = GRADE_DEFINITION.
      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

    when SYNT_ROLE-MODULE_IN.
      check TAG_MODULE_IN in TAGS.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      TAG_NAME_2( exporting P_TAG_1  = TAG_PROGRAM
                                           P_NAME_1 = PROGRAM
                                           P_TAG_2  = TAG_MODULE_IN
                                           P_NAME_2 =  P_XCROSS-NAME
                                            importing P_RESULT = REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_MODULE_IN.
      REFS_RESULT-GRADE     = GRADE_DEFINITION.
      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

    when SYNT_ROLE-MODULE_OUT.
      check TAG_MODULE_IN in TAGS.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      TAG_NAME_2( exporting P_TAG_1  = TAG_PROGRAM
                                          P_NAME_1 = PROGRAM
                                          P_TAG_2  = TAG_MODULE_OUT
                                          P_NAME_2 =  P_XCROSS-NAME
                                           importing P_RESULT = REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_MODULE_OUT.
      REFS_RESULT-GRADE     = GRADE_DEFINITION.
      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

    when SYNT_ROLE-MACRO.
      check TAG_MACRO in TAGS.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      TAG_NAME_2( exporting P_TAG_1  = TAG_PROGRAM
                                          P_NAME_1 = PROGRAM
                                          P_TAG_2  = TAG_MACRO
                                          P_NAME_2 = P_XCROSS-NAME
                                           importing P_RESULT = REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_MACRO.
      GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

    when SYNT_ROLE-OBJECT.
      check TAG_CONTROL in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'E'.
      TEST_VISITED 'E' P_XCROSS-OBJ_ID P_XCROSS-DEF
                       GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
      check SY-SUBRC <> 0.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      READ_TABLE_INDEX ENVS P_XCROSS-OBJ_ID <L_ENV>.
      TAG_NAME_2( exporting P_TAG_1  = TAG_PROGRAM
                            P_NAME_1 = PROGRAM
                            P_TAG_2  = TAG_CONTROL
                            P_NAME_2 = <L_ENV>-NAME
                  importing P_RESULT = REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_CONTROL.
      GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.

      TAG_NAME_2( exporting P_TAG_1  = TAG_PROGRAM
                            P_NAME_1 = PROGRAM
                            P_TAG_2  = TAG_DATA
                            P_NAME_2 = <L_ENV>-NAME
                  importing P_RESULT = REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_CONTROL.

*      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

    when SYNT_ROLE-CONTROL.
      check TAG_CONTROL in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'S'.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
      TAG_NAME_2( exporting P_TAG_1  = TAG_PROGRAM
                            P_NAME_1 = PROGRAM
                            P_TAG_2  = TAG_DATA
                            P_NAME_2 = P_XCROSS-NAME
                  importing P_RESULT = REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_DATA.
      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

    when SYNT_ROLE-ENH_EXIT.
      check TAG_ENHANCEMENT_EXIT in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'E'.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      ENV_FULL_NAME( exporting P_ENV_ID = P_XCROSS-OBJ_ID importing P_RESULT = REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_ENHANCEMENT_EXIT.
      GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

    when SYNT_ROLE-ENH_IMPL.
      check TAG_ENHANCEMENT_IMPL in TAGS.
      if P_XCROSS-OBJ_KIND = 'E'.
        GET_ENH_IMPL_REF( exporting  P_XCROSS  = P_XCROSS
                                     P_INCLUDE = P_INCLUDE
                          changing   P_RESULT  = P_RESULT ).
      else.
        ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'S'.
        "internal enhancement point?
        check internal = 'X' or P_XCROSS-NAME ns '\SE:%_'.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        REFS_RESULT-FULL_NAME = P_XCROSS-NAME.
        REFS_RESULT-TAG       = TAG_ENHANCEMENT_IMPL.
        REFS_RESULT-GRADE     = GRADE_DIRECT.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      endif.
  endcase.

endmethod.


method GET_METHOD_SYMBOL.

  P_LEVEL = P_LEVEL - 1.
  if P_LEVEL <= 0.
    raise exception type LCX_RECURSIVE_DEFINITION.
  endif.

  create object P_RESULT.
  P_RESULT->TAG         = TAG_METHOD.
  P_RESULT->FULL_NAME   = P_FULL_NAME.

  GET_COMMENTS( exporting P_POS      = P_ENTRY-COMMENT_POS
                          P_INCLUDE  = P_ENTRY-INCL
                          P_LINE     = P_ENTRY-LINE
                importing P_COMMENTS = P_RESULT->PSEUDO_COMMENTS ).

  case P_ENTRY-MODE.
    when SYNT_MODE-PUBLIC.      P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PUBLIC.
    when SYNT_MODE-PROTECTED.   P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PROTECTED.
    when SYNT_MODE-PACKAGE.     P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PACKAGE.
    when SYNT_MODE-PRIVATE.     P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PRIVATE.
    when others.                P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PUBLIC.
  endcase.
  case P_ENTRY-KIND.
    when SYNT_XENV-METHOD.      P_RESULT->COMPKIND = CL_ABAP_COMP_SYMBOL=>COMPKIND_INSTANCE.
    when SYNT_XENV-CLASSMETHOD. P_RESULT->COMPKIND = CL_ABAP_COMP_SYMBOL=>COMPKIND_STATIC.
    when SYNT_XENV-METHODALIAS. P_RESULT->COMPKIND = CL_ABAP_COMP_SYMBOL=>COMPKIND_ALIAS.
    when others.                assert 0 = 1.
  endcase.

endmethod.


method GET_ME_EV_REFS .
*---------------------------------------------------------------------*
*       METHOD GET_METHOD_GLOBAL_REFS                                 *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_NAME_1 type STRING,
    L_NAME_2 type STRING,
    L_NAME_3 type STRING,
    L_RESULT like line of P_RESULT.
  field-symbols:
    <L_TYPE>     like line of TYPES,
    <L_ENV>      like line of ENVS,
    <L_PARENT_1> like line of ENVS,
    <L_PARENT_2> like line of ENVS.

  check P_ENV_ID <> 1.

  READ_TABLE_INDEX ENVS P_ENV_ID <L_ENV>.
  while <L_ENV>-KIND = SYNT_XENV-INHERIT.
    P_ENV_ID = <L_ENV>-ALIAS.
    READ_TABLE_INDEX ENVS P_ENV_ID <L_ENV>.
  endwhile.

  case <L_ENV>-KIND.
    when SYNT_XENV-INTFDECL     or
         SYNT_XENV-INTFDECLLOC.
      if ( P_LOCAL             = 'X' or
           <L_ENV>-PUBLICCLASS = 'X' ) and
         TAG_TYPE in TAGS.
        ENV_FULL_NAME( exporting P_ENV_ID = P_ENV_ID importing P_RESULT =  L_RESULT-FULL_NAME ).
        L_RESULT-TAG       = TAG_TYPE.
        L_RESULT-GRADE     = GRADE_DIRECT.
        L_RESULT-INCLUDE   = P_INCLUDE.
        L_RESULT-MODE1     = P_MODE1.
        INSERT_GLOBAL_REF L_RESULT P_RESULT.
      endif.

    when SYNT_XENV-METHOD      or
         SYNT_XENV-CLASSMETHOD or
         SYNT_XENV-EVENT       or
         SYNT_XENV-CLASSEVENT  or
         SYNT_XENV-METHODALIAS or
         SYNT_XENV-EVENTALIAS.

      case <L_ENV>-KIND.
        when SYNT_XENV-METHOD or SYNT_XENV-CLASSMETHOD.
*          if 0 = 1 and <L_ENV>-OBJ_TYPE <> 0 and P_DEF = ' '.
*            GET_EV_REFS( exporting P_LOCAL   = P_LOCAL
*                                   P_MODE1   = P_MODE1
*                                   P_ENV_ID  = <L_ENV>-OBJ_TYPE
*                                   P_INCLUDE = P_INCLUDE
*                         changing  P_RESULT  = P_RESULT ).
*          endif.
      endcase.

      READ_TABLE_INDEX ENVS <L_ENV>-PARENT <L_PARENT_1>.
      if <L_PARENT_1> is not assigned.
        L_RESULT-FULL_NAME = <L_ENV>-NAME.
        L_RESULT-TAG       = 'XX'.
        L_RESULT-GRADE     = GRADE_DIRECT.
        L_RESULT-INCLUDE   = P_INCLUDE.
        L_RESULT-MODE1     = P_MODE1.
        INSERT_GLOBAL_REF L_RESULT P_RESULT.
        return.
      endif.
      if <L_PARENT_1>-KIND = SYNT_XENV-INTERFACE.
*        GET_TYPE_REFS( exporting P_TYPE_ID = <L_PARENT_1>-OBJ_TYPE
*                                 P_LOCAL   = P_LOCAL
*                                 P_INCLUDE = P_INCLUDE
*                                 P_GRADE   = GRADE_DIRECT
*                                 P_DEF     = ' '
*                       changing  P_RESULT  = P_RESULT ).
        READ_TABLE_INDEX ENVS <L_PARENT_1>-PARENT <L_PARENT_2>.

        if P_LOCAL                  = 'X' or
           <L_PARENT_2>-PUBLICCLASS = 'X'.
          TAG_NAME( exporting P_TAG    = P_TAG
                              P_NAME   = <L_ENV>-NAME
                    importing P_RESULT = L_NAME_1 ).
          TAG_NAME( exporting P_TAG    = TAG_INTERFACE
                              P_NAME   = <L_PARENT_1>-NAME
                    importing P_RESULT = L_NAME_2 ).
          ENV_FULL_NAME( exporting P_ENV_ID = <L_PARENT_1>-PARENT importing P_RESULT = L_NAME_3 ).
          if P_TAG in TAGS.
            concatenate L_NAME_3 L_NAME_2 L_NAME_1 into L_RESULT-FULL_NAME.
            L_RESULT-TAG       = P_TAG.
            GET_GRADE L_RESULT-GRADE P_DEF.
            if <L_ENV>-KIND = SYNT_XENV-METHOD or
               <L_ENV>-KIND = SYNT_XENV-CLASSMETHOD or
               <L_ENV>-KIND = SYNT_XENV-METHODALIAS.
              GET_SYMBOL METHOD L_RESULT-SYMBOL L_RESULT-FULL_NAME <L_ENV> =.
            endif.
            L_RESULT-INCLUDE = P_INCLUDE.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.

*            READ_TABLE_INDEX TYPES INDEX <L_PARENT_1>-OBJ_TYPE ASSIGNING <L_TYPE>.
*            READ_TABLE_INDEX ENVS INDEX <L_TYPE>-REF_OFFSET ASSIGNING <L_ENV>.
*            ENV_FULL_NAME( exporting P_ENV_ID = <L_TYPE>-REF_OFFSET importing P_RESULT = L_NAME_2 ).
*            concatenate L_NAME_2 L_NAME_1 into L_RESULT-FULL_NAME.
*            GET_GRADE L_RESULT-GRADE P_DEF.
*            IF L_RESULT-GRADE = GRADE_DEFINITION.
*              L_RESULT-GRADE = GRADE_DIRECT.
*            ENDIF.
*            INSERT_GLOBAL_REF L_RESULT P_RESULT.
          endif.
          if TAG_TYPE in TAGS and P_DEF = ' '.
            L_RESULT-FULL_NAME = L_NAME_3.
            L_RESULT-TAG       = TAG_TYPE.
            L_RESULT-GRADE     = GRADE_COMPONENTS.
            L_RESULT-INCLUDE   = P_INCLUDE.
            L_RESULT-MODE1     = P_MODE1.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.
          endif.
        endif.

        READ_TABLE_INDEX TYPES <L_PARENT_1>-OBJ_TYPE <L_TYPE>.

        if P_LOCAL          = 'X' or
           <L_TYPE>-TYPELOC = SYNT_LOC-POOL.
          TYPE_FULL_NAME( exporting P_TYPE_ID = <L_PARENT_1>-OBJ_TYPE importing P_RESULT = L_NAME_1 ).
          if P_TAG in TAGS.
            TAG_NAME( exporting  P_TAG   = P_TAG
                                 P_NAME  = <L_ENV>-NAME
                      importing P_RESULT =  L_NAME_2 ).
            concatenate L_NAME_1 L_NAME_2 into L_RESULT-FULL_NAME.
            L_RESULT-TAG       = P_TAG.
            if <L_ENV>-KIND = SYNT_XENV-METHOD or
               <L_ENV>-KIND = SYNT_XENV-CLASSMETHOD.
              GET_SYMBOL METHOD L_RESULT-SYMBOL L_RESULT-FULL_NAME <L_ENV> =.
            endif.
            L_RESULT-GRADE     = GRADE_DIRECT.
            L_RESULT-INCLUDE   = P_INCLUDE.
            L_RESULT-MODE1     = P_MODE1.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.
          endif.

          if TAG_TYPE in TAGS.
            L_RESULT-FULL_NAME = L_NAME_1.
            L_RESULT-TAG       = TAG_TYPE.
            L_RESULT-GRADE     = GRADE_DIRECT.
            L_RESULT-INCLUDE   = P_INCLUDE.
            L_RESULT-MODE1     = P_MODE1.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.
          endif.
        endif.
      else.
        if P_LOCAL                  = 'X' or
           <L_PARENT_1>-PUBLICCLASS = 'X' or
           TEST_CLASS               <> 0.

          if <L_ENV>-PARENT = TEST_CLASS and P_MODE1 <> MODE1_TEST.
            case <L_ENV>-NAME.
              when 'SETUP'    or 'CLASS_SETUP' or
                   'TEARDOWN' or 'CLASS_TEARDOWN'.
                P_MODE1 = MODE1_TEST.
              when others.
                exit.
            endcase.
          endif.

          TAG_NAME( exporting  P_TAG  = P_TAG
                                 P_NAME = <L_ENV>-NAME
                                 importing P_RESULT =   L_NAME_1  ).
          ENV_FULL_NAME( exporting P_ENV_ID = <L_ENV>-PARENT importing P_RESULT =  L_NAME_2 ).
          concatenate L_NAME_2 L_NAME_1 into L_RESULT-FULL_NAME.
          if P_TAG in TAGS.
            L_RESULT-TAG       = P_TAG.
            GET_GRADE L_RESULT-GRADE P_DEF.
            if <L_ENV>-KIND = SYNT_XENV-METHOD or
               <L_ENV>-KIND = SYNT_XENV-CLASSMETHOD or
               <L_ENV>-KIND = SYNT_XENV-METHODALIAS.
              GET_SYMBOL METHOD L_RESULT-SYMBOL L_RESULT-FULL_NAME <L_ENV> =.
            endif.
            L_RESULT-INCLUDE   = P_INCLUDE.
            L_RESULT-MODE1     = P_MODE1.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.
          endif.
          if TAG_TYPE in TAGS and P_DEF = ' '.
            L_RESULT-FULL_NAME = L_NAME_2.
            L_RESULT-TAG       = TAG_TYPE.
            L_RESULT-GRADE     = GRADE_COMPONENTS.
            L_RESULT-INCLUDE   = P_INCLUDE.
            L_RESULT-MODE1     = P_MODE1.
            INSERT_GLOBAL_REF L_RESULT P_RESULT.
          endif.
        endif.
      endif.

      if <L_ENV>-ALIAS <> 0 and <L_ENV>-KIND = SYNT_XENV-METHOD.
        GET_ME_EV_REFS( exporting P_LOCAL   = P_LOCAL
                                  P_TAG     = P_TAG
                                  P_ENV_ID  = <L_ENV>-ALIAS
                                  P_DEF     =  ' '
                                  P_INCLUDE = P_INCLUDE
                                  P_MODE1   = P_MODE1
                        changing  P_RESULT  = P_RESULT ).
      endif.

  endcase.
endmethod.                    "GET_METHOD_GLOBAL_REFS


method GET_MSG_NUMBER_AND_ID .
*---------------------------------------------------------------------*
*       METHOD GET_FORM_AND_PROGRAM                                   *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_OFFSET type I,
    L_LENGTH type I.

  L_OFFSET = STRLEN( P_TOKEN ) - 1.
  if P_TOKEN+L_OFFSET(1) <> ')'.
    P_NUMBER = P_TOKEN+1.
    clear P_ID.
    return.
  endif.

  if P_TOKEN CA '('.
    if SY-FDPOS = 0.
      clear P_NUMBER.
      L_LENGTH  = L_OFFSET - 1.
      P_ID      = P_TOKEN+1(L_LENGTH).
    else.
      subtract 1 from SY-FDPOS.
      P_NUMBER = P_TOKEN+1(SY-FDPOS).
      add 2 to SY-FDPOS.
      L_LENGTH  = L_OFFSET - SY-FDPOS.
      P_ID      = P_TOKEN+SY-FDPOS(L_LENGTH).
    endif.
    return.
  endif.

  P_NUMBER = P_TOKEN+1.
  clear P_ID.
endmethod.                    "GET_MSG_NUMBER_AND_ID


method GET_NAME .
*---------------------------------------------------------------------*
*       METHOD GET_NAME                                               *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  field-symbols:
    <L_TYPE> like line of TYPES,
    <L_DATA> like line of DATAS,
    <L_COMP> like line of COMPS,
    <L_ENV>  like line of ENVS.
  case P_OBJ_KIND.
    when 'T'.
      READ_TABLE_INDEX TYPES P_OBJ_ID <L_TYPE>.
      P_RESULT = <L_TYPE>-STR.
    when 'D'.
      READ_TABLE_INDEX datas P_OBJ_ID <L_DATA>.
      P_RESULT = <L_DATA>-STR.
    when 'C'.
      read_table_index COMPS P_OBJ_ID <L_COMP>.
      P_RESULT = <L_COMP>-STR.
    when 'E'.
      READ_TABLE_INDEX ENVS P_OBJ_ID <L_ENV>.
      P_RESULT = <L_ENV>-NAME.
  endcase.
endmethod.                    "GET_NAME


method GET_NAME_AND_OFFSET.
*---------------------------------------------------------------------*
*       METHOD GET_NAME                                               *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_LENGTH  type I.
  field-symbols:
    <L_TYPE>      like line of TYPES,
    <L_DATA>      like line of DATAS,
    <L_COMP>      like line of COMPS,
    <L_ENV>       like line of ENVS,
    <L_TABLE_KEY> like line of TABLE_KEYS.


  if P_OBJ_ID_P <> 0.
    P_OBJ_ID = P_OBJ_ID_P.
  endif.

  case P_OBJ_KIND.
    when 'T'.
      READ_TABLE_INDEX TYPES P_OBJ_ID <L_TYPE>.
      P_NAME   = <L_TYPE>-STR.
      P_OFFSET = 0.
*      while <L_TYPE>-PARENT_KIND = 'T'.
*        READ_TABLE_INDEX TYPES <L_TYPE>-PARENT_INDEX <L_TYPE>.
*        IF <L_TYPE>-STR = 'SYST'.
*          P_OFFSET = P_OFFSET + 3.
*        else.
*          P_OFFSET = P_OFFSET + STRLEN( <L_TYPE>-STR ) + 1.
*        ENDIF.
*      endwhile.
    when 'D'.
      READ_TABLE_INDEX DATAS P_OBJ_ID <L_DATA>.
      if <L_DATA>-STR is initial.
        P_OFFSET = 0.
        GET_DATA_VALUE( exporting P_START = <L_DATA>-REF2
                                  P_COUNT = <L_DATA>-DPAR_CNT
                        importing P_RESULT = P_NAME ).
        L_LENGTH = STRLEN( P_NAME ) - 2.
        if L_LENGTH > 0 and P_NAME(2) = '//'.
          P_NAME = P_NAME+2(L_LENGTH).
        endif.
      else.
        P_NAME   = <L_DATA>-STR.
        P_OFFSET = 0.
*        if P_DEF = ' '.
*          if <L_DATA>-PARENT_KIND  = 'D' and
*             <L_DATA>-PARENT_INDEX <> 0.
*            READ_TABLE_INDEX DATAS <L_DATA>-PARENT_INDEX <L_DATA_1>.
*            COMPONENT_OFFSET(
*                 exporting P_DATA_ID      = P_OBJ_ID
*                           P_CURR_DATA_ID = <L_DATA>-PARENT_INDEX
*                           P_TYPE_ID      = <L_DATA_1>-REF1
*                 importing P_RESULT       = L_RESULT
*                           P_OFFSET       = P_OFFSET ).
*            if L_RESULT = 0.
*              P_OFFSET = P_OFFSET + STRLEN( <L_DATA_1>-STR ) - STRLEN( P_NAME ).
*            endif.
*          endif.
*        endif.
      endif.

    when 'C'.
      READ_TABLE_INDEX COMPS P_OBJ_ID <L_COMP>.
      P_NAME   = <L_COMP>-STR.
      P_OFFSET = 0.

    when 'E'.
      READ_TABLE_INDEX ENVS P_OBJ_ID <L_ENV>.
      if <L_ENV>-KIND = SYNT_XENV-ENH_IMPL.
        return.
      endif.
      P_OFFSET = 0.
      P_NAME   = <L_ENV>-NAME.

    when 'K'.
      READ_TABLE_INDEX TABLE_KEYS P_OBJ_ID <L_TABLE_KEY>.
      P_OFFSET = 0.
      P_NAME   = <L_TABLE_KEY>-STR.

  endcase.
endmethod.                    "GET_NAME


method GET_REFS.
*---------------------------------------------------------------------*
*       METHOD GET_REFS                                               *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_LOCAL type SYCHAR01.

  if P_TESTCODE = 'X' and P_XCROSS-MODE1 = MODE1_TEST.
    L_LOCAL = 'X'.
  else.
    L_LOCAL = P_LOCAL.
  endif.

  REFS_RESULT-MODE1 = P_XCROSS-MODE1.
  clear REFS_RESULT-SYMBOL.

  case P_XCROSS-ROLE.
    when SYNT_ROLE-FIELD.
      if P_XCROSS-OBJ_KIND = 'D'.
        if P_XCROSS-DEF <> 'X'. " and OPEN_DATAS is initial.
          TEST_VISITED 'D' P_XCROSS-OBJ_ID P_XCROSS-DEF
                           GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
          check SY-SUBRC <> 0.
        endif.
        check TAG_TYPE in TAGS or
              TAG_DATA in TAGS.
        GET_DATA_REFS( exporting P_LOCAL   = L_LOCAL
                                 P_DATA_ID = P_XCROSS-OBJ_ID
                                 P_DEF     = P_XCROSS-DEF
                                 P_INCLUDE = P_INCLUDE
                                 P_GRADE   = GRADE_DIRECT
                       changing  P_RESULT  = P_RESULT ).
      elseif P_XCROSS-OBJ_KIND = 'T'.
        TEST_VISITED 'T' P_XCROSS-OBJ_ID P_XCROSS-DEF
                         GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
        check SY-SUBRC <> 0.
        check TAG_TYPE in TAGS.
        GET_TYPE_REFS( exporting P_LOCAL   = L_LOCAL
                                 P_TYPE_ID = P_XCROSS-OBJ_ID
                                 P_GRADE   = GRADE_DIRECT
                                 P_DEF     = P_XCROSS-DEF
                                 P_INCLUDE = P_INCLUDE
                                 P_MODE1   = P_XCROSS-MODE1
                       changing  P_RESULT  = P_RESULT ).
      endif.

    when SYNT_ROLE-TYPE.
      check TAG_TYPE in TAGS.
      if P_XCROSS-OBJ_KIND = 'T'.
        REFS_OBJ_ID   = P_XCROSS-OBJ_ID.
      elseif P_XCROSS-OBJ_KIND = 'E'.
        REFS_OBJ_ID = GET_ENV_TYPE( P_XCROSS-OBJ_ID ).
        if REFS_OBJ_ID = 0.
          REFS_RESULT-INCLUDE   = P_INCLUDE.
          REFS_RESULT-FULL_NAME = 'TTTTT'.
          REFS_RESULT-TAG       = 'XX'.
          REFS_RESULT-GRADE     = GRADE_DIRECT.
          INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
          exit.
        endif.
      elseif P_XCROSS-OBJ_KIND = 'D'.
        TEST_VISITED 'D' P_XCROSS-OBJ_ID P_XCROSS-DEF
                         GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
        check SY-SUBRC <> 0.
        GET_DATA_REFS( exporting P_LOCAL   = L_LOCAL
                                 P_DATA_ID = P_XCROSS-OBJ_ID
                                 P_DEF     = P_XCROSS-DEF
                                 P_INCLUDE = P_INCLUDE
                                 P_GRADE   = GRADE_DIRECT
                       changing  P_RESULT  = P_RESULT ).
        exit.
      else.
        exit.
      endif.
*      if OPEN_TYPES is initial.
      TEST_VISITED 'T' REFS_OBJ_ID P_XCROSS-DEF
                       GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
      check SY-SUBRC <> 0.
*      endif.
      GET_TYPE_REFS( exporting P_LOCAL   = L_LOCAL
                               P_TYPE_ID = REFS_OBJ_ID
                               P_GRADE   = GRADE_DIRECT
                               P_DEF     = P_XCROSS-DEF
                               P_INCLUDE = P_INCLUDE
                               P_MODE1   = P_XCROSS-MODE1
                     changing  P_RESULT  = P_RESULT ).



    when SYNT_ROLE-FORM.
      if P_XCROSS-OBJ_KIND = 'S'.
        check TAG_FORM    in TAGS or
              TAG_PROGRAM in TAGS.
        GET_FORM_AND_PROGRAM( exporting P_TOKEN   = P_XCROSS-NAME
                              importing P_PROGRAM = REFS_PROGRAM
                                        P_FORM    = REFS_FORM ).
        if REFS_FORM is not initial.
          if REFS_PROGRAM is not initial.
            if TAG_FORM in TAGS.
              REFS_RESULT-INCLUDE   = P_INCLUDE.
              TAG_NAME_2( exporting P_TAG_1  = TAG_PROGRAM
                                                            P_NAME_1 = REFS_PROGRAM
                                                            P_TAG_2  = TAG_FORM
                                                            P_NAME_2 = REFS_FORM
                                                  importing P_RESULT = REFS_RESULT-FULL_NAME ).
              REFS_RESULT-TAG       = TAG_FORM.
              GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
              INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
            endif.
            if TAG_PROGRAM in TAGS.
              REFS_RESULT-INCLUDE   = P_INCLUDE.
              TAG_NAME( exporting P_TAG  = TAG_PROGRAM
                                                P_NAME = REFS_PROGRAM
                                                importing P_RESULT =  REFS_RESULT-FULL_NAME ).
              REFS_RESULT-TAG       = TAG_PROGRAM.
              GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
              INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
            endif.
          else.
            FORM_FORM  = REFS_FORM.
            FORM_STMNT = P_XCROSS-STMNT.
          endif.
        endif.
      else.
        check L_LOCAL  = 'X' and
              TAG_FORM in TAGS.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        ENV_FULL_NAME( exporting P_ENV_ID = P_XCROSS-OBJ_ID importing P_RESULT = REFS_RESULT-FULL_NAME ).
        REFS_RESULT-TAG       = TAG_FORM.
        GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      endif.

    when SYNT_ROLE-FORM_PARAM.
      if P_XCROSS-OBJ_KIND = 'D'.
        if P_XCROSS-DEF <> 'X'. " and OPEN_DATAS is initial.
          TEST_VISITED 'D' P_XCROSS-OBJ_ID P_XCROSS-DEF
                           GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
          check SY-SUBRC <> 0.
        endif.
        check TAG_TYPE in TAGS or
              TAG_DATA in TAGS.
        GET_DATA_REFS( exporting P_LOCAL   = L_LOCAL
                                 P_DATA_ID = P_XCROSS-OBJ_ID
                                 P_DEF     = P_XCROSS-DEF
                                 P_INCLUDE = P_INCLUDE
                                 P_GRADE   = GRADE_DIRECT
                       changing  P_RESULT  = P_RESULT ).
      endif.

    when SYNT_ROLE-MACRO.
      check TAG_MACRO      in TAGS and
            P_XCROSS-MODE1 = MODE1_GLOBAL.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      TAG_NAME( exporting  P_TAG  = TAG_MACRO
                                        P_NAME = P_XCROSS-NAME
                                        importing P_RESULT =  REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_MACRO.
      REFS_RESULT-MODE1     = P_XCROSS-MODE1.
      GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

    when SYNT_ROLE-METHOD.
      check TAG_METHOD      in TAGS or
            TAG_TYPE        in TAGS.
      if P_XCROSS-OBJ_KIND = 'E'.
        TEST_VISITED 'E' P_XCROSS-OBJ_ID P_XCROSS-DEF
                         GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
        check SY-SUBRC <> 0.
        GET_ME_EV_REFS( exporting P_LOCAL   = L_LOCAL
                                  P_TAG     = TAG_METHOD
                                  P_ENV_ID  = P_XCROSS-OBJ_ID
                                  P_DEF     = P_XCROSS-DEF
                                  P_INCLUDE = P_INCLUDE
                                  P_MODE1   = P_XCROSS-MODE1
                        changing  P_RESULT  = P_RESULT ).
      elseif P_XCROSS-OBJ_KIND = 'D'.
        GET_DATA_CONSTRUCTOR_REFS( exporting P_LOCAL   = L_LOCAL
                                             P_DATA_ID = P_XCROSS-OBJ_ID
                                             P_INCLUDE = P_INCLUDE
                                   changing  P_RESULT  = P_RESULT ).
        TEST_VISITED 'D' P_XCROSS-OBJ_ID P_XCROSS-DEF
                         GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
        check SY-SUBRC <> 0.
        GET_DATA_REFS( exporting P_LOCAL   = L_LOCAL
                                 P_DATA_ID = P_XCROSS-OBJ_ID
                                 P_DEF     = P_XCROSS-DEF
                                 P_INCLUDE = P_INCLUDE
                       changing  P_RESULT  = P_RESULT ).
      elseif P_XCROSS-OBJ_KIND = 'T'.
        GET_TYPE_CONSTRUCTOR_REFS( exporting P_LOCAL   = L_LOCAL
                                             P_TYPE_ID = P_XCROSS-OBJ_ID
                                             P_INCLUDE = P_INCLUDE
                                   changing  P_RESULT  = P_RESULT ).
        TEST_VISITED 'T' P_XCROSS-OBJ_ID P_XCROSS-DEF
                         GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
        check SY-SUBRC <> 0.
        GET_TYPE_REFS( exporting P_LOCAL   = L_LOCAL
                                 P_TYPE_ID = P_XCROSS-OBJ_ID
                                 P_GRADE   = GRADE_DIRECT
                                 P_DEF     = P_XCROSS-DEF
                                 P_INCLUDE = P_INCLUDE
                                 P_MODE1   = P_XCROSS-MODE1
                       changing  P_RESULT  = P_RESULT ).
      endif.


    when SYNT_ROLE-INCLUDE.
      check TAG_INCLUDE in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'S'.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      TAG_NAME( exporting  P_TAG  = TAG_INCLUDE
                                    P_NAME = P_XCROSS-NAME
                                    importing P_RESULT = REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_INCLUDE.
      REFS_RESULT-GRADE     = GRADE_DIRECT.
      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

    when SYNT_ROLE-FUNCTION.
      check TAG_FUNCTION in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = REFS_NAME ).

      if REFS_NAME is not initial.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        TAG_NAME( exporting  P_TAG  = TAG_FUNCTION
                                          P_NAME = REFS_NAME
                                          importing P_RESULT =  REFS_RESULT-FULL_NAME ).
        REFS_RESULT-TAG       = TAG_FUNCTION.
        GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      endif.
      GET_DATA_REFS( exporting P_LOCAL   = L_LOCAL
                               P_DATA_ID = P_XCROSS-OBJ_ID
                               P_DEF     = P_XCROSS-DEF
                               P_INCLUDE = P_INCLUDE
                     changing  P_RESULT  = P_RESULT ).

    when SYNT_ROLE-CLASS
      or SYNT_ROLE-INTERFACE.
      check TAG_TYPE in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'E'.
      TEST_VISITED 'E' P_XCROSS-OBJ_ID P_XCROSS-DEF
                       GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
      check SY-SUBRC <> 0.
      GET_CLASS_INTF_REFS(  exporting P_LOCAL   = L_LOCAL
                                      P_GRADE   = GRADE_DIRECT
                                      P_ENV_ID  = P_XCROSS-OBJ_ID
                                      P_DEF     = P_XCROSS-DEF
                                      P_INCLUDE = P_INCLUDE
                                      P_MODE1   = P_XCROSS-MODE1
                            changing  P_RESULT  = P_RESULT ).

    when SYNT_ROLE-DATABASE.
      if P_XCROSS-OBJ_KIND = 'D'.
        if P_XCROSS-DEF <> 'X'.
          TEST_VISITED 'D' P_XCROSS-OBJ_ID P_XCROSS-DEF
                           GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
          check SY-SUBRC <> 0.
        endif.
        check TAG_TYPE in TAGS or
              TAG_DATA in TAGS.
        GET_DATA_REFS( exporting P_LOCAL   = L_LOCAL
                                 P_GRADE   = GRADE_DIRECT
                                 P_DATA_ID = P_XCROSS-OBJ_ID
                                 P_DEF     = P_XCROSS-DEF
                                 P_INCLUDE = P_INCLUDE
                       changing  P_RESULT  = P_RESULT ).
      elseif P_XCROSS-OBJ_KIND = 'T'.
        TEST_VISITED 'T' P_XCROSS-OBJ_ID P_XCROSS-DEF
                         GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
        check SY-SUBRC <> 0.
        check TAG_TYPE in TAGS.
        GET_TYPE_REFS( exporting P_LOCAL   = L_LOCAL
                                 P_TYPE_ID = P_XCROSS-OBJ_ID
                                 P_GRADE   = GRADE_DIRECT
                                 P_DEF     = P_XCROSS-DEF
                                 P_INCLUDE = P_INCLUDE
                                 P_MODE1   = P_XCROSS-MODE1
                       changing  P_RESULT  = P_RESULT ).
      endif.

    when SYNT_ROLE-MESSAGE_NUMB.
      if P_XCROSS-OBJ_KIND = 'S'.
        if P_XCROSS-NAME(1) = ''''.
          if P_XCROSS-STMNT = MESSAGE_STMNT and
             TAG_MESSAGE_NUMBER in TAGS.
            REFS_LENGTH           = strlen( P_XCROSS-NAME ) - 2.
            REFS_MSG_ID           = P_XCROSS-NAME+1(REFS_LENGTH).
            REFS_NUMBER           = REFS_MSG_ID.
            REFS_RESULT-INCLUDE   = P_INCLUDE.
            TAG_NAME_2( exporting P_TAG_1  = TAG_MESSAGE_ID
                                            P_NAME_1 = MESSAGE_ID
                                            P_TAG_2  = TAG_MESSAGE_NUMBER
                                            P_NAME_2 = REFS_NUMBER
                                           importing P_RESULT = REFS_RESULT-FULL_NAME ).
            REFS_RESULT-TAG       = TAG_MESSAGE_NUMBER.
            REFS_RESULT-GRADE     = GRADE_DIRECT.
            INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

          endif.
        else.
          GET_MSG_NUMBER_AND_ID( exporting P_TOKEN   = P_XCROSS-NAME
                                 importing P_NUMBER  = REFS_NUMBER
                                           P_ID      = REFS_ID ).
          if REFS_ID is not initial and
             TAG_MESSAGE_ID in TAGS.
            TAG_NAME( exporting  P_TAG  = TAG_MESSAGE_ID
                                               P_NAME = REFS_ID
                                               importing P_RESULT =  REFS_ID  ).
            REFS_RESULT-INCLUDE   = P_INCLUDE.
            REFS_RESULT-FULL_NAME = REFS_ID.
            REFS_RESULT-TAG       = TAG_MESSAGE_ID.
            REFS_RESULT-GRADE     = GRADE_DIRECT.
            INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
          endif.
          if REFS_NUMBER is not initial and
             TAG_MESSAGE_NUMBER in TAGS.
            REFS_RESULT-INCLUDE   = P_INCLUDE.
            TAG_NAME( exporting P_TAG  = TAG_MESSAGE_NUMBER
                                            P_NAME = REFS_NUMBER
                                               importing P_RESULT =  REFS_NUMBER ).
            if REFS_ID is not initial.
              concatenate REFS_ID          REFS_NUMBER into REFS_RESULT-FULL_NAME.
            else.
              concatenate GLOBAL_MSG_ID REFS_NUMBER into REFS_RESULT-FULL_NAME.
            endif.
            REFS_RESULT-TAG       = TAG_MESSAGE_NUMBER.
            REFS_RESULT-GRADE     = GRADE_DIRECT.
            INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

          endif.
        endif.
      else.
        if TAG_MESSAGE_NUMBER in TAGS and
           P_XCROSS-STMNT = MESSAGE_STMNT.
          GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                              importing P_VALUE   = REFS_NAME ).
          if REFS_NAME is not initial.
            REFS_MSG_ID          = REFS_NAME.
            REFS_NAME             = REFS_MSG_ID.
            REFS_RESULT-INCLUDE   = P_INCLUDE.
            TAG_NAME_2( exporting  P_TAG_1  = TAG_MESSAGE_ID
                                   P_NAME_1 = MESSAGE_ID
                                   P_TAG_2  = TAG_MESSAGE_NUMBER
                                   P_NAME_2 = REFS_NAME
                        importing  P_RESULT = REFS_RESULT-FULL_NAME ).
            REFS_RESULT-TAG       = TAG_MESSAGE_NUMBER.
            REFS_RESULT-GRADE     = GRADE_DIRECT.
            INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
          endif.
          GET_DATA_REFS( exporting
                                P_LOCAL   = L_LOCAL
                                P_DATA_ID = P_XCROSS-OBJ_ID
                                P_DEF     = P_XCROSS-DEF
                                P_INCLUDE = P_INCLUDE
                      changing  P_RESULT  = P_RESULT ).

        endif.
      endif.

    when SYNT_ROLE-MODULE_IN or SYNT_ROLE-MODULE_OUT.

    when SYNT_ROLE-PROGRAM or SYNT_ROLE-REPORT.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'S'.
      PROGRAM_STMNT   = P_XCROSS-STMNT.
      PROGRAM_PROGRAM = P_XCROSS-NAME.
      check P_XCROSS-NAME(1) <> '('.
      if TAG_PROGRAM in TAGS.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        TAG_NAME( exporting P_TAG  = TAG_PROGRAM
                                                    P_NAME = P_XCROSS-NAME
                                          importing P_RESULT = REFS_RESULT-FULL_NAME ).
        REFS_RESULT-TAG       = TAG_PROGRAM.
        if EXTENDED = 'X'.
          REFS_RESULT-MODE1   = P_XCROSS-MODE1.
        endif.
        GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      endif.
      if FORM_STMNT = P_XCROSS-STMNT and
         TAG_FORM in TAGS.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        TAG_NAME_2( exporting  P_TAG_1  = TAG_PROGRAM
                                            P_NAME_1 = P_XCROSS-NAME
                                            P_TAG_2  = TAG_FORM
                                            P_NAME_2 = FORM_FORM
                    importing P_RESULT = REFS_RESULT-FULL_NAME ).
        REFS_RESULT-TAG       = TAG_FORM.
        GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      elseif SCREEN_STMNT = P_XCROSS-STMNT and
             TAG_SCREEN in TAGS.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        TAG_NAME_2( exporting  P_TAG_1  = TAG_PROGRAM
                                            P_NAME_1 = P_XCROSS-NAME
                                            P_TAG_2  = TAG_SCREEN
                                            P_NAME_2 = SCREEN_SCREEN
                    importing P_RESULT =                         REFS_RESULT-FULL_NAME ).
        REFS_RESULT-TAG       = TAG_SCREEN.
        GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      endif.



    when SYNT_ROLE-CUST_FUNCTION.
      check TAG_CUST_FUNCTION in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = REFS_NAME ).
      if REFS_NAME is not initial.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        TAG_NAME( exporting  P_TAG  = TAG_CUST_FUNCTION
                                         P_NAME = REFS_NAME
                                         importing P_RESULT = REFS_RESULT-FULL_NAME
                                      ).
        REFS_RESULT-TAG       = TAG_CUST_FUNCTION.
        GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      endif.
      GET_DATA_REFS( exporting  P_LOCAL   = L_LOCAL
                                P_DATA_ID = P_XCROSS-OBJ_ID
                                P_DEF     = P_XCROSS-DEF
                                P_INCLUDE = P_INCLUDE
                      changing  P_RESULT  = P_RESULT ).



    when SYNT_ROLE-EVENT.
      check TAG_EVENT       in TAGS or
            TAG_TYPE        in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'E'.
      TEST_VISITED 'E' P_XCROSS-OBJ_ID P_XCROSS-DEF
                       GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
      check SY-SUBRC <> 0.
      GET_ME_EV_REFS( exporting P_LOCAL   = L_LOCAL
                                P_TAG     = TAG_EVENT
                                P_ENV_ID  = P_XCROSS-OBJ_ID
                                P_DEF     = P_XCROSS-DEF
                                P_INCLUDE = P_INCLUDE
                                P_MODE1   = P_XCROSS-MODE1
                      changing  P_RESULT  = P_RESULT ).

    when SYNT_ROLE-ALIAS.
      if P_XCROSS-OBJ_KIND = 'T'.
        check TAG_TYPE in TAGS.
        TEST_VISITED 'T' P_XCROSS-OBJ_ID P_XCROSS-DEF
                         GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
        check SY-SUBRC <> 0.
        GET_TYPE_REFS( exporting P_LOCAL   = L_LOCAL
                                 P_TYPE_ID = P_XCROSS-OBJ_ID
                                 P_GRADE   = GRADE_DIRECT
                                 P_DEF     = P_XCROSS-DEF
                                 P_INCLUDE = P_INCLUDE
                                 P_MODE1   = P_XCROSS-MODE1
                       changing  P_RESULT  = P_RESULT ).
      elseif P_XCROSS-OBJ_KIND = 'D'.
        check TAG_DATA in TAGS.
        TEST_VISITED 'D' P_XCROSS-OBJ_ID P_XCROSS-DEF
                         GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
        check SY-SUBRC <> 0.
        GET_DATA_REFS( exporting P_LOCAL   = L_LOCAL
                                 P_DATA_ID = P_XCROSS-OBJ_ID
                                 P_DEF     = P_XCROSS-DEF
                                 P_INCLUDE = P_INCLUDE
                       changing  P_RESULT  = P_RESULT ).
      elseif P_XCROSS-OBJ_KIND = 'E'.
        TEST_VISITED 'E' P_XCROSS-OBJ_ID P_XCROSS-DEF
                         GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
        check SY-SUBRC <> 0.
        GET_ENV_ALIAS_REFS( exporting P_LOCAL   = L_LOCAL
                                      P_ENV_ID  = P_XCROSS-OBJ_ID
                                      P_DEF     = P_XCROSS-DEF
                                      P_INCLUDE = P_INCLUDE
                            changing  P_RESULT  = P_RESULT ).
      endif.

    when SYNT_ROLE-FIELD_LIST.
    when SYNT_ROLE-FIELDAREA.




    when SYNT_ROLE-TRANSACTION.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      check TAG_TRANSACTION in TAGS.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = REFS_NAME ).
      if REFS_NAME is not initial.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        TAG_NAME( exporting  P_TAG  = TAG_TRANSACTION
                                       P_NAME = REFS_NAME
                                       importing P_RESULT =  REFS_RESULT-FULL_NAME ).
        REFS_RESULT-TAG       = TAG_TRANSACTION.
        REFS_RESULT-GRADE     = GRADE_DIRECT.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      endif.
      GET_DATA_REFS( exporting  P_LOCAL   = L_LOCAL
                                P_DATA_ID = P_XCROSS-OBJ_ID
                                P_DEF     = P_XCROSS-DEF
                                P_INCLUDE = P_INCLUDE
                      changing  P_RESULT  = P_RESULT ).


    when SYNT_ROLE-DIALOG.
      check TAG_DIALOG in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = REFS_NAME ).
      if REFS_NAME is not initial.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        TAG_NAME( exporting  P_TAG  = TAG_DIALOG
                                         P_NAME = REFS_NAME
                                           importing P_RESULT = REFS_RESULT-FULL_NAME ).
        REFS_RESULT-TAG       = TAG_DIALOG.
        REFS_RESULT-GRADE     = GRADE_DIRECT.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      endif.
      GET_DATA_REFS( exporting  P_LOCAL   = L_LOCAL
                                P_DATA_ID = P_XCROSS-OBJ_ID
                                P_DEF     = P_XCROSS-DEF
                                P_INCLUDE = P_INCLUDE
                      changing  P_RESULT  = P_RESULT ).


    when SYNT_ROLE-TYPEPOOL.
      check TAG_TYPE_POOL in TAGS.
      if P_XCROSS-OBJ_KIND = 'S'.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        TAG_NAME( exporting  P_TAG  = TAG_TYPE_POOL
                                       P_NAME = P_XCROSS-NAME
                                       importing P_RESULT = REFS_RESULT-FULL_NAME ).
        REFS_RESULT-TAG       = TAG_TYPE_POOL.
        GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      else.
        ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'E'.
        TEST_VISITED 'E' P_XCROSS-OBJ_ID P_XCROSS-DEF
                         GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
        check SY-SUBRC <> 0.
        REFS_RESULT-INCLUDE = P_INCLUDE.
        GET_ENV_NAME( exporting  P_ENV_ID = P_XCROSS-OBJ_ID importing P_NAME = REFS_NAME ).
        if REFS_NAME is initial.
          REFS_RESULT-FULL_NAME = 'TTTTT'.
          REFS_RESULT-TAG       = 'XX'.
          REFS_RESULT-GRADE     = GRADE_DIRECT.
          INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
          exit.
        endif.
        TAG_NAME( exporting P_TAG  = TAG_TYPE_POOL
                                           P_NAME = REFS_NAME
                                           importing P_RESULT =  REFS_RESULT-FULL_NAME ).
        REFS_RESULT-TAG       = TAG_TYPE_POOL.
        GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      endif.

    when SYNT_ROLE-MESSAGE_ID.
      check TAG_MESSAGE_ID in TAGS.
      if P_XCROSS-OBJ_KIND = 'S'.
        if P_XCROSS-STMNT = PROGRAM_STMNT.
          TAG_NAME( exporting P_TAG  = TAG_MESSAGE_ID
                                    P_NAME = P_XCROSS-NAME
                                    importing P_RESULT = GLOBAL_MSG_ID ).
          REFS_RESULT-MODE1 = MODE1_DEFAULT.
        endif.
        if P_XCROSS-NAME(1) = ''''.
          REFS_LENGTH = strlen( P_XCROSS-NAME ) - 2.
          REFS_NAME   = P_XCROSS-NAME+1(REFS_LENGTH).
        else.
          REFS_NAME   = P_XCROSS-NAME.
        endif.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        TAG_NAME( exporting P_TAG  = TAG_MESSAGE_ID
                                      P_NAME = REFS_NAME
                                      importing P_RESULT = REFS_RESULT-FULL_NAME ).
        REFS_RESULT-TAG       = TAG_MESSAGE_ID.
        REFS_RESULT-GRADE     = GRADE_DIRECT.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
        MESSAGE_STMNT       =  P_XCROSS-STMNT.
        MESSAGE_ID          =  REFS_NAME.
        clear REFS_RESULT.
      else.
        GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                            importing P_VALUE   = REFS_NAME ).
        if REFS_NAME is not initial.
          REFS_RESULT-INCLUDE   = P_INCLUDE.
          TAG_NAME( exporting P_TAG  = TAG_MESSAGE_ID
                                        P_NAME = REFS_NAME
                                        importing P_RESULT = REFS_RESULT-FULL_NAME ).
          REFS_RESULT-TAG       = TAG_MESSAGE_ID.
          REFS_RESULT-GRADE     = GRADE_DIRECT.
          INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
          MESSAGE_STMNT      =  P_XCROSS-STMNT.
          MESSAGE_ID         =  REFS_NAME.
        endif.
        GET_DATA_REFS( exporting
                                P_LOCAL   = L_LOCAL
                                P_DATA_ID = P_XCROSS-OBJ_ID
                                P_DEF     = P_XCROSS-DEF
                                P_INCLUDE = P_INCLUDE
                      changing  P_RESULT  = P_RESULT ).

      endif.



    when SYNT_ROLE-SET_GET_ID.
      check TAG_SET_GET_ID in TAGS.
      if P_XCROSS-OBJ_KIND = 'D'.
        GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                            importing P_VALUE   = REFS_NAME ).
        if REFS_NAME is not initial.
          REFS_RESULT-INCLUDE   = P_INCLUDE.
          TAG_NAME( exporting P_TAG  = TAG_SET_GET_ID
                              P_NAME = REFS_NAME
                    importing P_RESULT = REFS_RESULT-FULL_NAME ).
          REFS_RESULT-TAG       = TAG_SET_GET_ID.
          REFS_RESULT-GRADE     = GRADE_DIRECT.
          INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
        endif.
      elseif P_XCROSS-OBJ_KIND = 'S'.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        TAG_NAME( exporting P_TAG    = TAG_SET_GET_ID
                            P_NAME   = P_XCROSS-NAME
                  importing P_RESULT = REFS_RESULT-FULL_NAME ).
        REFS_RESULT-TAG       = TAG_SET_GET_ID.
        REFS_RESULT-GRADE     = GRADE_DIRECT.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      elseif P_XCROSS-OBJ_KIND = 'T'.
        TEST_VISITED 'T' P_XCROSS-OBJ_ID P_XCROSS-DEF
                         GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
        check SY-SUBRC <> 0.
        check TAG_TYPE in TAGS.
        GET_TYPE_REFS( exporting P_LOCAL   = L_LOCAL
                                 P_TYPE_ID = P_XCROSS-OBJ_ID
                                 P_GRADE   = GRADE_DIRECT
                                 P_DEF     = P_XCROSS-DEF
                                 P_INCLUDE = P_INCLUDE
                                 P_MODE1   = P_XCROSS-MODE1
                       changing  P_RESULT  = P_RESULT ).
      else.
        message X000(38).
      endif.

    when SYNT_ROLE-AUTH_OBJ.
      check TAG_SET_GET_ID in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = REFS_NAME ).
      if REFS_NAME is not initial.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        TAG_NAME( exporting P_TAG  = TAG_AUTHORITY_OBJECT
                                      P_NAME = REFS_NAME
                                      importing P_RESULT = REFS_RESULT-FULL_NAME ).
        REFS_RESULT-TAG       = TAG_AUTHORITY_OBJECT.
        REFS_RESULT-GRADE     = GRADE_DIRECT.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
      endif.

    when SYNT_ROLE-PF_STATUS.
      check TAG_PF_STATUS in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = PF_STATUS  ).
      if PF_STATUS is not initial.
        PF_STATUS_STMNT = P_XCROSS-STMNT.
        clear TITLE.
      endif.

    when SYNT_ROLE-TITLE.
      check TAG_TITLE in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = TITLE  ).
      if TITLE is not initial.
        PF_STATUS_STMNT = P_XCROSS-STMNT.
        clear PF_STATUS.
      endif.

    when SYNT_ROLE-PF_STATUS_PROGRAM.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = REFS_NAME ).

      if REFS_NAME is not initial.
        REFS_RESULT-INCLUDE   = P_INCLUDE.
        TAG_NAME( exporting P_TAG  = TAG_PROGRAM
                            P_NAME = REFS_NAME
                  importing P_RESULT = REFS_NAME ).
        if TAG_PROGRAM in TAGS.
          REFS_RESULT-TAG       = TAG_PROGRAM.
          REFS_RESULT-FULL_NAME = REFS_NAME.
          if EXTENDED = 'X'.
            REFS_RESULT-MODE1   = P_XCROSS-MODE1.
          endif.
          GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
          INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
        endif.

        if PF_STATUS_STMNT = P_XCROSS-STMNT.
          if PF_STATUS is not initial.
            if TAG_PF_STATUS in TAGS.
              TAG_NAME( exporting P_TAG  = TAG_PF_STATUS
                                  P_NAME = PF_STATUS
                        importing P_RESULT = PF_STATUS ).
              concatenate REFS_NAME PF_STATUS into REFS_RESULT-FULL_NAME.
              REFS_RESULT-TAG       = TAG_PF_STATUS.
              REFS_RESULT-GRADE     = GRADE_DIRECT.
              INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
              clear PF_STATUS.
            endif.
          elseif TITLE is not initial.
            if TAG_TITLE in TAGS.
              REFS_RESULT-INCLUDE   = P_INCLUDE.
              TAG_NAME( exporting P_TAG  = TAG_TITLE
                                     P_NAME = TITLE
                                     importing P_RESULT = TITLE  ).
              concatenate REFS_NAME TITLE into REFS_RESULT-FULL_NAME.
              REFS_RESULT-TAG       = TAG_TITLE.
              REFS_RESULT-GRADE     = GRADE_DIRECT.
              INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
              clear TITLE.
            endif.
          endif.
        endif.
      endif.

    when SYNT_ROLE-MATCHCODE_OBJECT.
      check TAG_MATCHCODE in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'S'.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      TAG_NAME( exporting P_TAG  = TAG_MATCHCODE
                                        P_NAME = P_XCROSS-NAME
                                        importing P_RESULT =  REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_MATCHCODE.
      REFS_RESULT-GRADE     = GRADE_DIRECT.
      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

    when SYNT_ROLE-FUNCTIONPOOL or
         SYNT_ROLE-CLASS_POOL   or
         SYNT_ROLE-INTF_POOL.
      PROGRAM_STMNT = P_XCROSS-STMNT.


    when SYNT_ROLE-RMAC_MACRO.
      check TAG_RMAC_MACRO in TAGS.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      TAG_NAME( exporting P_TAG  = TAG_RMAC_MACRO
                                        P_NAME = P_XCROSS-NAME
                                        importing P_RESULT =  REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_RMAC_MACRO.
      GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.

      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

    when SYNT_ROLE-SCREEN.
      check TAG_SCREEN in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = REFS_NAME
                          ).

      if REFS_NAME is not initial and
         REFS_NAME co '0123456789'.
        unpack REFS_NAME to REFS_SCREEN.
        SCREEN_SCREEN = REFS_SCREEN.
        if PROGRAM_STMNT = P_XCROSS-STMNT.
          REFS_RESULT-INCLUDE   = P_INCLUDE.
          TAG_NAME_2( exporting
                                              P_TAG_1  = TAG_PROGRAM
                                              P_NAME_1 = PROGRAM_PROGRAM
                                              P_TAG_2  = TAG_SCREEN
                                              P_NAME_2 = REFS_NAME
                                              importing P_RESULT = REFS_RESULT-FULL_NAME  ).
          REFS_RESULT-TAG       = TAG_SCREEN.
          GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.
          INSERT_GLOBAL_REF REFS_RESULT P_RESULT.
        else.
          SCREEN_STMNT  = P_XCROSS-STMNT.
        endif.
      endif.

    when SYNT_ROLE-COMMON.
      check TAG_COMMON_PART in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'E'.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      ENV_FULL_NAME( exporting P_ENV_ID = P_XCROSS-OBJ_ID importing P_RESULT = REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_COMMON_PART.
      GET_GRADE REFS_RESULT-GRADE P_XCROSS-DEF.

      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

      REFS_RESULT-GRADE     = GRADE_DIRECT.
      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

    when SYNT_ROLE-TRANSFORMATION.
      check TAG_TRANSFORMATION in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'S'.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      TAG_NAME( exporting
                                        P_TAG  = TAG_TRANSFORMATION
                                        P_NAME = P_XCROSS-NAME
                                        importing P_RESULT = REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_TRANSFORMATION.
      REFS_RESULT-GRADE     = GRADE_DIRECT.
      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

    when SYNT_ROLE-BREAK_POINT.
      check TAG_BREAK_POINT in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'S'.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      TAG_NAME( exporting
                                        P_TAG  = TAG_BREAK_POINT
                                        P_NAME = P_XCROSS-NAME
                                        importing P_RESULT = REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_BREAK_POINT.
      REFS_RESULT-GRADE     = GRADE_DIRECT.
      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

    when SYNT_ROLE-ENH_SPOT.
      check TAG_ENHANCEMENT_SPOT in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'S'.
      REFS_RESULT-INCLUDE   = P_INCLUDE.
      TAG_NAME( exporting
                                        P_TAG  = TAG_ENHANCEMENT_SPOT
                                        P_NAME = P_XCROSS-NAME
                                        importing P_RESULT =  REFS_RESULT-FULL_NAME ).
      REFS_RESULT-TAG       = TAG_ENHANCEMENT_SPOT.
      REFS_RESULT-GRADE     = GRADE_DIRECT.
      INSERT_GLOBAL_REF REFS_RESULT P_RESULT.


    when SYNT_ROLE-INFOTYPE.
      check TAG_TYPE in TAGS.

      if P_XCROSS-OBJ_KIND = 'S'.
        concatenate 'P' P_XCROSS-NAME into REFS_RESULT-FULL_NAME.
        TAG_NAME( exporting P_TAG    = TAG_TYPE
                            P_NAME   = REFS_RESULT-FULL_NAME
                  importing P_RESULT = REFS_RESULT-FULL_NAME ).

        REFS_RESULT-INCLUDE   = P_INCLUDE.
        REFS_RESULT-TAG       = TAG_TYPE.
        REFS_RESULT-GRADE     = GRADE_DIRECT.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

      endif.

    when SYNT_ROLE-COMPONENT.
      case P_XCROSS-OBJ_KIND.
        when 'C'.
          TEST_VISITED 'C' P_XCROSS-OBJ_ID P_XCROSS-DEF
                           GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
          check SY-SUBRC <> 0.
          check TAG_TYPE in TAGS or
                TAG_DATA in TAGS.
          GET_COMP_REFS( exporting P_LOCAL   = L_LOCAL
                                        P_COMP_ID = P_XCROSS-OBJ_ID
                                        P_INCLUDE = P_INCLUDE
                              changing  P_RESULT  = P_RESULT ).

        when 'D'.
          TEST_VISITED 'D' P_XCROSS-OBJ_ID P_XCROSS-DEF
                           GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
          check SY-SUBRC <> 0.
          check TAG_TYPE in TAGS or
                TAG_DATA in TAGS.
          GET_DATA_REFS( exporting P_LOCAL   = L_LOCAL
                                   P_DATA_ID = P_XCROSS-OBJ_ID
                                   P_DEF     = P_XCROSS-DEF
                                   P_INCLUDE = P_INCLUDE
                                   P_GRADE   = GRADE_DIRECT
                         changing  P_RESULT  = P_RESULT ).
        when 'T'.
          TEST_VISITED 'T' P_XCROSS-OBJ_ID P_XCROSS-DEF
                           GRADE_DIRECT P_XCROSS-MODE1 P_INCLUDE.
          check SY-SUBRC <> 0.
          check TAG_TYPE in TAGS.
          GET_TYPE_REFS( exporting P_LOCAL   = L_LOCAL
                                   P_TYPE_ID = P_XCROSS-OBJ_ID
                                   P_GRADE   = GRADE_DIRECT
                                   P_DEF     = P_XCROSS-DEF
                                   P_INCLUDE = P_INCLUDE
                                   P_MODE1   = P_XCROSS-MODE1
                         changing  P_RESULT  = P_RESULT ).
      endcase.


    when SYNT_ROLE-BADI_METHOD.

      check P_XCROSS-OBJ_KIND = 'S'.

      GET_BADI_METHOD_REFS( exporting P_FULL_NAME = P_XCROSS-NAME
                                      P_INCLUDE   = P_INCLUDE
                            changing  P_RESULT    = P_RESULT ).

    when SYNT_ROLE-GLOBAL_CLASS.
      check TAG_TYPE in TAGS.

      if P_XCROSS-OBJ_KIND = 'S'.

        TAG_NAME( exporting P_TAG    = TAG_TYPE
                            P_NAME   = P_XCROSS-NAME
                  importing P_RESULT = REFS_RESULT-FULL_NAME ).

        REFS_RESULT-INCLUDE   = P_INCLUDE.
        REFS_RESULT-TAG       = TAG_TYPE.
        REFS_RESULT-GRADE     = GRADE_DIRECT.
        INSERT_GLOBAL_REF REFS_RESULT P_RESULT.

      endif.

    when SYNT_ROLE-TABLE_KEY.
      check TAG_TABLE_KEY in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'K'.
      GET_KEY_REFS( exporting P_KEY_ID  = P_XCROSS-OBJ_ID
                              P_DEF     = P_XCROSS-DEF
                              P_INCLUDE = P_INCLUDE
                    changing  P_RESULT  = P_RESULT ).



  endcase.

endmethod.                    "GET_REFS


method GET_REF_SYMBOL .
  data:
    L_FULL_NAME type STRING.

  field-symbols:
    <L_TYPE> like line of TYPES.

  p_level = p_level - 1.

  IF p_LEVEL <= 0.
    raise exception type lcx_recursive_definition.
  ENDIF.

  create object P_RESULT.

  TYPE_FULL_NAME( exporting P_TYPE_ID = P_ENTRY-REF_OFFSET importing P_RESULT = L_FULL_NAME ).

  READ_TABLE_INDEX TYPES P_ENTRY-REF_OFFSET <L_TYPE>.

  GET_SYMBOL_LEVEL TYPE P_RESULT->REF_TYPE L_FULL_NAME <L_TYPE> ?= P_LEVEL.


endmethod.


method GET_SINGLE_REF .
*---------------------------------------------------------------------*
*       METHOD GET_ALL                                                *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_PREV_REF      type SCR_REF,
    L_FULL_NAMES    like P_FULL_NAMES,
    L_FULL_NAME     like line of P_FULL_NAMES,
    L_FORM          type STRING,
    L_PROGRAM       type STRING,
    L_LEVEL         type I,
    L_PROG_STMNT    type I value 1,
    L_MSGID         type STRING,
    L_MSGID_STMNT   type I,
    L_GLOBAL_MSGID  type STRING,
    L_NUMBER        type STRING,
    L_MSG_NUMBER    type SY-MSGNO,
    L_SCREEN        type D020S-DNUM,
    L_ID            type STRING,
    L_NAME          type STRING,
    L_DUMMY         type STRING,
    L_VALUE         type STRING,
    L_LENGTH        type I,
    L_OFFSET        type I,
*    L_OFFSET_2      type I,
    L_LITL          type SYCHAR01,
    L_IDS           type T_XCROSS_IDS,
    L_CURR_STMNT    type I,
    L_CURR_LEVEL    type I,

    L_SYSTEM_MACRO  type SYCHAR01,
*    L_GRADE         like line of GRADES,
    L_DEF           type SYCHAR01,
    L_INDEX         type I,
    L_INDEX_2       type I,
    L_MODE_STRINGS  type SYCHAR01,
    L_MODE_IDS      type SYCHAR01,
    L_MODE_IDS_ANY  type SYCHAR01,
    L_MODE_FIELD    type SYCHAR01,
    L_MODE_SCREEN   type SYCHAR01,
    L_MODE_BRACKET  type SYCHAR01,
    L_MODE_MESSAGE  type SYCHAR01,
    L_MODE_FORMS    type SYCHAR01,
    L_MODE_PF       type SYCHAR01,
    L_MODE_GLOBSTR  type SYCHAR01.
  field-symbols:
    <L_STMNT>     like line of STMNTS,
    <L_LEVEL>     like line of LEVELS,
    <L_XCROSS>    like line of XCROSS,
    <L_XCROSS_2>  like line of XCROSS,
    <L_ID>        type T_XCROSS_ID,
    <L_NAME_1>    type T_XCROSS_NAME_1,
    <L_NAME_2>    type T_XCROSS_NAME_2.

  clear P_RESULT.

  if P_ERRORS is supplied.
    ID_ERRORS = SYNT_ID-ERR_MSG.
  endif.

  SCAN( ).

  if SUBRC = 8 or lines( TYPES ) = 0.
    P_ERRORS = ERRORS.
    P_ERROR  = 'X'.
    P_ABORT  = 'X'.
    return.
  endif.

  case SUBRC.
    when 0.
      P_ABORT = ' '.
      P_ERROR = ' '.
    when 6.
      P_ABORT = 'X'.
      P_ERROR = 'X'.
      P_ERRORS = ERRORS.
    when others.
      P_ERRORS = ERRORS.
      P_ERROR  = 'X'.
      P_ABORT  = ' '.
      if ENVS is initial.
        return.
      endif.
  endcase.

  try.
      if P_FULL_NAME is supplied.
        if P_FULL_NAMES is supplied.
          raise PARAMETER_ERROR.
        endif.
        L_FULL_NAME-FULL_NAME = P_FULL_NAME.
        L_FULL_NAME-GRADE      = P_GRADE.
        insert L_FULL_NAME into table L_FULL_NAMES.
        GET_IDS( exporting  P_FULL_NAMES     = L_FULL_NAMES
                 importing  P_XCROSS_IDS     = L_IDS ).
      elseif P_FULL_NAMES is supplied.
        GET_IDS( exporting  P_FULL_NAMES     = P_FULL_NAMES
                 importing  P_XCROSS_IDS     = L_IDS ).
      else.
        raise PARAMETER_ERROR.
      endif.



*  if SY-UNAME = 'SCHMITTAN'.
*    data L_LINES type I.
*    L_LINES = LINES( L_XCROSS_IDS ).
*    write: / L_LINES, P_FULL_NAME.
*  endif.


      if L_IDS-STRINGS   is not initial. L_MODE_STRINGS  = 'X'. endif.
      if L_IDS-IDS       is not initial. L_MODE_IDS      = 'X'. endif.
      if L_IDS-IDS_ANY   is not initial. L_MODE_IDS_ANY  = 'X'. endif.
      if L_IDS-FIELDS    is not initial. L_MODE_FIELD    = 'X'. endif.
      if L_IDS-SCREENS   is not initial. L_MODE_SCREEN   = 'X'. endif.
      if L_IDS-BRACKETS  is not initial. L_MODE_BRACKET  = 'X'. endif.
      if L_IDS-MESSAGES  is not initial. L_MODE_MESSAGE  = 'X'. endif.
      if L_IDS-FORMS     is not initial. L_MODE_FORMS    = 'X'. endif.
      if L_IDS-PFSTATS   is not initial. L_MODE_PF       = 'X'. endif.
      if L_IDS-GLOBSTR   is not initial. L_MODE_GLOBSTR  = 'X'. endif.


* Loop over Cross Reference



      loop at XCROSS assigning <L_XCROSS>.

        L_INDEX = SY-TABIX.
*
*    if <L_XCROSS>-ROLE <> SYNT_ROLE-FIELD and <L_XCROSS>-ROLE <> SYNT_ROLE-TYPE.
*      clear: OPEN_TYPES, OPEN_DATAS.
*    endif.

* Get Include Name
        if L_CURR_STMNT <> <L_XCROSS>-STMNT.
          L_CURR_STMNT = <L_XCROSS>-STMNT.
          read table STMNTS index <L_XCROSS>-STMNT
                            assigning <L_STMNT>.
          if L_CURR_LEVEL <> <L_STMNT>-LEVEL.
            clear L_SYSTEM_MACRO.
            L_LEVEL = L_CURR_LEVEL = <L_STMNT>-LEVEL.
            do.                                          "#EC CI_NESTED
              read table LEVELS index L_LEVEL assigning <L_LEVEL>.
              if <L_LEVEL>-TYPE = SYNT_LEVEL_TYPE-PROGRAM or
                 SY-SUBRC ne 0.
                exit.
              endif.
              if <L_LEVEL>-TYPE   = SYNT_LEVEL_TYPE-DEFINE and
                 strlen( <L_LEVEL>-NAME ) > 5              and
                 <L_LEVEL>-NAME(5) = '%_CX_'.
                L_SYSTEM_MACRO = 'X'.
              endif.
              L_LEVEL = <L_LEVEL>-LEVEL.
            enddo.
          endif.
        endif.

        if L_SYSTEM_MACRO = 'X' and <L_XCROSS>-COLUMN < 0.
          continue.
        endif.

        GET_DEF L_DEF <L_XCROSS>.

        case <L_XCROSS>-ROLE.
          when SYNT_ROLE-MESSAGE_ID.
            if <L_XCROSS>-OBJ_KIND = 'S'.
              if <L_XCROSS>-STMNT = L_PROG_STMNT.
                L_GLOBAL_MSGID = <L_XCROSS>-NAME.
              else.
                if <L_XCROSS>-NAME(1) = ''''.
                  L_LENGTH = strlen( <L_XCROSS>-NAME ) - 2.
                  L_MSGID  = <L_XCROSS>-NAME+1(L_LENGTH).
                else.
                  L_MSGID = <L_XCROSS>-NAME.
                endif.
                L_MSGID_STMNT = <L_XCROSS>-STMNT.
              endif.
            elseif <L_XCROSS>-OBJ_KIND = 'D'.
              GET_CONSTANT_VALUE(
                                exporting P_DATA_ID = <L_XCROSS>-OBJ_ID
                                importing P_VALUE    = L_NAME
                                          P_LITL     = L_LITL ).
              if L_NAME is not initial.
                L_MSGID       = L_NAME.
                L_MSGID_STMNT = <L_XCROSS>-STMNT.
              endif.
            endif.

          when SYNT_ROLE-PROGRAM or
               SYNT_ROLE-FUNCTIONPOOL or
               SYNT_ROLE-CLASS_POOL   or
               SYNT_ROLE-INTF_POOL.
            L_PROG_STMNT = <L_XCROSS>-STMNT.

          when SYNT_ROLE-MACRO or
               SYNT_ROLE-RMAC_MACRO.
            if <L_XCROSS>-DEF    = ' ' and
               <L_XCROSS>-LINE   <> 0  and
               <L_XCROSS>-COLUMN >= 0.
              MACRO_STMNT   = <L_XCROSS>-STMNT.
              MACRO_NAME    = <L_XCROSS>-NAME.
              MACRO_COLUMN  = <L_XCROSS>-COLUMN.
              MACRO_LINE    = <L_XCROSS>-LINE.
            endif.



        endcase.

        check <L_LEVEL>-NAME in INCLUDES.
*         or ( strlen( <L_LEVEL>-NAME ) > 30 and <L_LEVEL>-NAME+30 = 'E' ).

        if L_MODE_STRINGS = 'X' and <L_XCROSS>-OBJ_KIND = 'S'.
          loop at L_IDS-STRINGS assigning <L_NAME_1> where ROLE = <L_XCROSS>-ROLE and NAME = <L_XCROSS>-NAME.
            case <L_XCROSS>-ROLE .
              when SYNT_ROLE-EVENT_KEYWORD.
                GET_EVENT_KEYWORD( exporting P_XCROSS_NAME = <L_XCROSS>-NAME
                                   importing P_KEYWORD     = L_NAME ).
              when SYNT_ROLE-ENH_IMPL.
                clear L_NAME.
              when SYNT_ROLE-BADI_METHOD.
                split <L_XCROSS>-NAME at '\ME:' into L_DUMMY L_NAME.
              when others.
                L_NAME = <L_XCROSS>-NAME.
            endcase.


            SINGLE_REF_FOUND( exporting P_XCROSS    = <L_XCROSS>
                                        P_DEF       = L_DEF
                                        P_FULL_NAME = <L_NAME_1>-FULL_NAME
                                        P_GRADE     = <L_NAME_1>-GRADE
                                        P_NAME      = L_NAME
                                        P_OFFSET    = 0
                                        P_EXTENDED  = P_EXTENDED
                                        P_MODE1     = <L_XCROSS>-MODE1
                                        P_MODE2     = <L_XCROSS>-MODE2
                              changing  P_RESULT    = P_RESULT
                                        P_PREV_REF  = L_PREV_REF ).
          endloop.
        endif.


        if L_MODE_IDS = 'X' and <L_XCROSS>-OBJ_KIND <> 'S'.
          loop at L_IDS-IDS assigning <L_ID> where ROLE     = <L_XCROSS>-ROLE     and
                                                   OBJ_KIND = <L_XCROSS>-OBJ_KIND and
                                                   OBJ_ID   = <L_XCROSS>-OBJ_ID.
            GET_NAME_AND_OFFSET(
                     exporting  P_OBJ_KIND = <L_XCROSS>-OBJ_KIND
                                P_OBJ_ID   = <L_XCROSS>-OBJ_ID
                                P_OBJ_ID_P = <L_ID>-OBJ_ID_P
*                                P_DEF      = L_DEF
                     importing  P_NAME     = L_NAME
                                P_OFFSET   = L_OFFSET ).

            SINGLE_REF_FOUND( exporting P_XCROSS    = <L_XCROSS>
                                        P_DEF       = L_DEF
                                        P_FULL_NAME = <L_ID>-FULL_NAME
                                        P_GRADE     = <L_ID>-GRADE
                                        P_NAME      = L_NAME
                                        P_OFFSET    = L_OFFSET
                                        P_EXTENDED  = P_EXTENDED
                                        P_MODE1     = <L_XCROSS>-MODE1
                                        P_MODE2     = <L_XCROSS>-MODE2
                              changing  P_RESULT    = P_RESULT
                                        P_PREV_REF  = L_PREV_REF ).

          endloop.
        endif.

        if L_MODE_IDS_ANY = 'X' and <L_XCROSS>-OBJ_KIND <> 'S'.
          loop at L_IDS-IDS_ANY assigning <L_ID> where OBJ_KIND = <L_XCROSS>-OBJ_KIND and
                                                       OBJ_ID   = <L_XCROSS>-OBJ_ID.
            GET_NAME_AND_OFFSET(
                     exporting  P_OBJ_KIND = <L_XCROSS>-OBJ_KIND
                                P_OBJ_ID   = <L_XCROSS>-OBJ_ID
                                P_OBJ_ID_P = <L_ID>-OBJ_ID_P
*                                P_DEF      = L_DEF
                     importing  P_NAME     = L_NAME
                                P_OFFSET   = L_OFFSET ).
            SINGLE_REF_FOUND( exporting P_XCROSS    = <L_XCROSS>
                                        P_DEF       = L_DEF
                                        P_FULL_NAME = <L_ID>-FULL_NAME
                                        P_GRADE     = <L_ID>-GRADE
                                        P_NAME      = L_NAME
                                        P_OFFSET    = L_OFFSET
                                        P_EXTENDED  = P_EXTENDED
                                        P_MODE1     = <L_XCROSS>-MODE1
                                        P_MODE2     = <L_XCROSS>-MODE2
                              changing  P_RESULT    = P_RESULT
                                        P_PREV_REF  = L_PREV_REF ).

          endloop.
        endif.

        if L_MODE_FIELD = 'X' and <L_XCROSS>-OBJ_KIND = 'D'.
          GET_CONSTANT_VALUE( exporting P_DATA_ID = <L_XCROSS>-OBJ_ID
                              importing P_NAME     = L_NAME
                                        P_VALUE    = L_VALUE
                                        P_LITL     = L_LITL ).
          loop at L_IDS-FIELDS assigning <L_NAME_1> where ROLE = <L_XCROSS>-ROLE and
                                                          NAME = L_VALUE.

            if L_LITL = 'X'.
              L_OFFSET = 1.
            else.
              L_OFFSET = 0.
            endif.

            SINGLE_REF_FOUND( exporting P_XCROSS    = <L_XCROSS>
                                        P_DEF       = L_DEF
                                        P_FULL_NAME = <L_NAME_1>-FULL_NAME
                                        P_GRADE     = <L_NAME_1>-GRADE
                                        P_NAME      = L_NAME
                                        P_OFFSET    = L_OFFSET
                                        P_EXTENDED  = P_EXTENDED
                                        P_MODE1     = <L_XCROSS>-MODE1
                                        P_MODE2     = <L_XCROSS>-MODE2
                              changing  P_RESULT    = P_RESULT
                                        P_PREV_REF  = L_PREV_REF ).

          endloop.
        endif.


        if L_MODE_SCREEN = 'X'.
          if <L_XCROSS>-OBJ_KIND = 'D'.
            GET_CONSTANT_VALUE( exporting P_DATA_ID = <L_XCROSS>-OBJ_ID
                                importing P_NAME     = L_NAME
                                          P_VALUE    = L_VALUE
                                          P_LITL     = L_LITL ).

          elseif <L_XCROSS>-OBJ_KIND = 'S'.
            L_VALUE = <L_XCROSS>-NAME.
            L_NAME  = L_VALUE.
            L_LITL  = ' '.
          endif.


          L_SCREEN = 0.
          if L_VALUE co '0123456789'.
            try.
              unpack L_VALUE to L_SCREEN.
              catch CX_SY_CONVERSION_OVERFLOW.
                L_SCREEN = 0.
            endtry.
          endif.

          if L_SCREEN > 0.
            loop at L_IDS-SCREENS assigning <L_NAME_2> where ROLE   = <L_XCROSS>-ROLE and
                                                             NAME_1 = L_SCREEN.
              L_INDEX_2 = L_INDEX - 1.
              read table XCROSS index L_INDEX_2 assigning <L_XCROSS_2>.
              if <L_XCROSS_2> is assigned              and
                 <L_XCROSS_2>-ROLE = SYNT_ROLE-PROGRAM and
                 <L_XCROSS_2>-STMNT = <L_XCROSS>-STMNT.
                if <L_XCROSS_2>-OBJ_KIND = 'D'.
                  GET_CONSTANT_VALUE( exporting P_DATA_ID = <L_XCROSS_2>-OBJ_ID
                                      importing P_VALUE    = L_PROGRAM ).
                elseif <L_XCROSS_2>-OBJ_KIND = 'S'.
                  L_PROGRAM = <L_XCROSS_2>-NAME.
                else.
                  clear L_PROGRAM.
                endif.
              else.
                clear L_PROGRAM.
              endif.

              if L_PROGRAM is initial.
                L_INDEX_2 = L_INDEX + 1.
                read table XCROSS index L_INDEX_2 assigning <L_XCROSS_2>.
                if <L_XCROSS_2> is assigned               and
                   <L_XCROSS_2>-ROLE  = SYNT_ROLE-PROGRAM and
                   <L_XCROSS_2>-STMNT = <L_XCROSS>-STMNT.
                  if <L_XCROSS_2>-OBJ_KIND = 'D'.
                    GET_CONSTANT_VALUE( exporting P_DATA_ID = <L_XCROSS_2>-OBJ_ID
                                        importing P_VALUE    = L_PROGRAM ).
                  elseif <L_XCROSS_2>-OBJ_KIND = 'S'.
                    L_PROGRAM = <L_XCROSS_2>-NAME.
                  endif.
                endif.
              endif.

              if L_PROGRAM is initial and <L_NAME_2>-NAME_2 = PROGRAM or
                 L_PROGRAM = <L_NAME_2>-NAME_2.
                if L_LITL = 'X'.
                  L_OFFSET = 1.
                else.
                  L_OFFSET = 0.
                endif.
                SINGLE_REF_FOUND( exporting P_XCROSS    = <L_XCROSS>
                                          P_DEF       = L_DEF
                                          P_FULL_NAME = <L_NAME_2>-FULL_NAME
                                          P_GRADE     = <L_NAME_2>-GRADE
                                          P_NAME      = L_NAME
                                          P_OFFSET    = 0
                                          P_EXTENDED  = P_EXTENDED
                                          P_MODE1     = <L_XCROSS>-MODE1
                                          P_MODE2     = <L_XCROSS>-MODE2
                                changing  P_RESULT    = P_RESULT
                                          P_PREV_REF  = L_PREV_REF ).
              endif.
            endloop.
          endif.
        endif.


        if L_MODE_BRACKET = 'X' and <L_XCROSS>-OBJ_KIND = 'S'.
          loop at L_IDS-BRACKETS assigning <L_NAME_1> where ROLE = <L_XCROSS>-ROLE.
            GET_MSG_NUMBER_AND_ID( exporting P_TOKEN = <L_XCROSS>-NAME
                                   importing P_NUMBER = L_DUMMY
                                             P_ID     = L_NAME ).
            if L_NAME = <L_NAME_1>-NAME.
              L_OFFSET = strlen( L_DUMMY ) + 2.
              SINGLE_REF_FOUND( exporting P_XCROSS    = <L_XCROSS>
                                          P_DEF       = L_DEF
                                          P_FULL_NAME = <L_NAME_1>-FULL_NAME
                                          P_GRADE     = <L_NAME_1>-GRADE
                                          P_NAME      = L_NAME
                                          P_OFFSET    = L_OFFSET
                                          P_EXTENDED  = P_EXTENDED
                                          P_MODE1     = <L_XCROSS>-MODE1
                                          P_MODE2     = <L_XCROSS>-MODE2
                                changing  P_RESULT    = P_RESULT
                                          P_PREV_REF  = L_PREV_REF ).
            endif.
          endloop.
        endif.


        if L_MODE_MESSAGE = 'X'.
          case <L_XCROSS>-OBJ_KIND.
            when 'S'.
              if <L_XCROSS>-NAME(1) = ''''.
                L_LENGTH     = strlen( <L_XCROSS>-NAME ) - 2.
                L_MSG_NUMBER = <L_XCROSS>-NAME+1(L_LENGTH).
                L_NUMBER     = L_MSG_NUMBER.
                loop at L_IDS-MESSAGES assigning <L_NAME_2> where ROLE   = <L_XCROSS>-ROLE and
                                                                  NAME_1 = L_NUMBER        and
                                                                  NAME_2 = L_MSGID.
                  L_NAME   = <L_XCROSS>-NAME+1(L_LENGTH).
                  SINGLE_REF_FOUND( exporting P_XCROSS    = <L_XCROSS>
                                       P_DEF       = L_DEF
                                       P_FULL_NAME = <L_NAME_1>-FULL_NAME
                                       P_GRADE     = <L_NAME_2>-GRADE
                                       P_NAME      = L_NAME
                                       P_OFFSET    = 1
                                       P_EXTENDED  = P_EXTENDED
                                       P_MODE1     = <L_XCROSS>-MODE1
                                       P_MODE2     = <L_XCROSS>-MODE2
                             changing  P_RESULT    = P_RESULT
                                       P_PREV_REF  = L_PREV_REF ).

                endloop.
              else.
                GET_MSG_NUMBER_AND_ID( exporting P_TOKEN = <L_XCROSS>-NAME
                                       importing P_NUMBER = L_NUMBER
                                                 P_ID     = L_ID ).
                if L_ID is initial.
                  loop at L_IDS-MESSAGES assigning <L_NAME_2> where ROLE   = <L_XCROSS>-ROLE and
                                                                    NAME_1 = L_NUMBER        and
                                                                    NAME_2 = L_GLOBAL_MSGID.

                    SINGLE_REF_FOUND( exporting P_XCROSS    = <L_XCROSS>
                                                P_DEF       = L_DEF
                                                P_FULL_NAME = <L_NAME_2>-FULL_NAME
                                                P_GRADE     = <L_NAME_2>-GRADE
                                                P_NAME      = L_NUMBER
                                                P_OFFSET    = 1
                                                P_EXTENDED  = P_EXTENDED
                                                P_MODE1     = <L_XCROSS>-MODE1
                                                P_MODE2     = <L_XCROSS>-MODE2
                                      changing  P_RESULT    = P_RESULT
                                                P_PREV_REF  = L_PREV_REF ).

                  endloop.
                else.
                  loop at L_IDS-MESSAGES assigning <L_NAME_2> where ROLE   = <L_XCROSS>-ROLE and
                                                                    NAME_1 = L_NUMBER        and
                                                                    NAME_2 = L_ID.
                    SINGLE_REF_FOUND( exporting P_XCROSS    = <L_XCROSS>
                                           P_DEF       = L_DEF
                                           P_FULL_NAME = <L_NAME_2>-FULL_NAME
                                           P_GRADE     = <L_NAME_2>-GRADE
                                           P_NAME      = L_NUMBER
                                           P_OFFSET    = 1
                                           P_EXTENDED  = P_EXTENDED
                                           P_MODE1     = <L_XCROSS>-MODE1
                                           P_MODE2     = <L_XCROSS>-MODE2
                                 changing  P_RESULT    = P_RESULT
                                           P_PREV_REF  = L_PREV_REF ).

                  endloop.
                endif.
              endif.
            when 'D'.
              if <L_XCROSS>-STMNT   = L_MSGID_STMNT.
                GET_CONSTANT_VALUE(
                                  exporting P_DATA_ID = <L_XCROSS>-OBJ_ID
                                  importing P_NAME    = L_NAME
                                            P_VALUE   = L_VALUE
                                            P_LITL    = L_LITL ).
                L_MSG_NUMBER = L_VALUE.
                l_number     = L_MSG_NUMBER.

                loop at L_IDS-MESSAGES assigning <L_NAME_2> where ROLE   = <L_XCROSS>-ROLE and
                                                                  NAME_1 = L_NUMBER        and
                                                                  NAME_2 = L_MSGID.

                  if L_LITL = 'X'.
                    L_OFFSET = 1.
                  else.
                    L_OFFSET = 0.
                  endif.
                  SINGLE_REF_FOUND( exporting P_XCROSS    = <L_XCROSS>
                                              P_DEF       = L_DEF
                                              P_FULL_NAME = <L_NAME_2>-FULL_NAME
                                              P_GRADE     = <L_NAME_2>-GRADE
                                              P_NAME      = L_NAME
                                              P_OFFSET    = L_OFFSET
                                              P_EXTENDED  = P_EXTENDED
                                              P_MODE1     = <L_XCROSS>-MODE1
                                              P_MODE2     = <L_XCROSS>-MODE2
                                    changing  P_RESULT    = P_RESULT
                                              P_PREV_REF  = L_PREV_REF ).

                endloop.
              endif.
          endcase.
        endif.


        if L_MODE_FORMS = 'X' and <L_XCROSS>-OBJ_KIND = 'S'.
          GET_FORM_AND_PROGRAM( exporting P_TOKEN   = <L_XCROSS>-NAME
                                importing P_FORM    = L_FORM
                                          P_PROGRAM = L_PROGRAM ).
          if L_PROGRAM is initial.
            L_PROGRAM = PROGRAM.
            L_INDEX_2 = L_INDEX + 1.
            do 2 times.
              read table XCROSS index L_INDEX_2 assigning <L_XCROSS_2>.
              if <L_XCROSS_2> is assigned               and
                 <L_XCROSS_2>-ROLE  = SYNT_ROLE-PROGRAM and
                 <L_XCROSS_2>-STMNT = <L_XCROSS>-STMNT.
                if <L_XCROSS_2>-OBJ_KIND = 'D'.
                  GET_CONSTANT_VALUE( exporting P_DATA_ID = <L_XCROSS_2>-OBJ_ID
                                      importing P_VALUE    = L_PROGRAM ).
                elseif <L_XCROSS_2>-OBJ_KIND = 'S'.
                  L_PROGRAM = <L_XCROSS_2>-NAME.
                endif.
                exit.
              endif.
              add 1 to L_INDEX_2.
            enddo.
          endif.

          loop at L_IDS-FORMS assigning <L_NAME_2> where ROLE    = <L_XCROSS>-ROLE and
                                                         NAME_1  = L_FORM          and
                                                         NAME_2  = L_PROGRAM.
            SINGLE_REF_FOUND( exporting P_XCROSS    = <L_XCROSS>
                                                     P_DEF       = L_DEF
                                                     P_FULL_NAME = <L_NAME_2>-FULL_NAME
                                                     P_GRADE     = <L_NAME_2>-GRADE
                                                     P_NAME      = <L_XCROSS>-NAME
                                                     P_OFFSET    = 0
                                                     P_EXTENDED  = P_EXTENDED
                                                     P_MODE1     = <L_XCROSS>-MODE1
                                                     P_MODE2     = <L_XCROSS>-MODE2
                                           changing  P_RESULT    = P_RESULT
                                                     P_PREV_REF  = L_PREV_REF ).

          endloop.
        endif.


        if L_MODE_PF = 'X'.
          if <L_XCROSS>-OBJ_KIND = 'D'.
            GET_CONSTANT_VALUE( exporting P_DATA_ID = <L_XCROSS>-OBJ_ID
                                importing P_NAME     = L_NAME
                                          P_VALUE    = L_VALUE
                                          P_LITL     = L_LITL ).

          elseif <L_XCROSS>-OBJ_KIND = 'S'.
            L_VALUE = <L_XCROSS>-NAME.
            L_LITL  = ' '.
          endif.

          loop at L_IDS-PFSTATS assigning <L_NAME_2> where ROLE    = <L_XCROSS>-ROLE and
                                                            NAME_1  = L_VALUE.


            L_INDEX_2 = L_INDEX + 1.
            Do 3 times.
            read table XCROSS index L_INDEX_2 assigning <L_XCROSS_2>.
            if <L_XCROSS_2> is assigned                        and
               <L_XCROSS_2>-ROLE = SYNT_ROLE-PF_STATUS_PROGRAM and
               <L_XCROSS_2>-STMNT = <L_XCROSS>-STMNT.
              if <L_XCROSS>-OBJ_KIND = 'D'.
                GET_CONSTANT_VALUE( exporting P_DATA_ID = <L_XCROSS_2>-OBJ_ID
                                    importing P_VALUE    = L_PROGRAM ).
              elseif <L_XCROSS>-OBJ_KIND = 'S'.
                L_PROGRAM = <L_XCROSS_2>-NAME.
              endif.
            endif.

            if L_PROGRAM is initial and <L_NAME_2>-NAME_2 = PROGRAM or
               L_PROGRAM = <L_NAME_2>-NAME_2.
              if L_LITL = 'X'.
                L_OFFSET = 1.
              else.
                L_OFFSET = 0.
              endif.
              SINGLE_REF_FOUND( exporting P_XCROSS    = <L_XCROSS>
                                         P_DEF       = L_DEF
                                         P_FULL_NAME = <L_NAME_2>-FULL_NAME
                                         P_GRADE     = <L_NAME_2>-GRADE
                                         P_NAME      = L_NAME
                                         P_OFFSET    = L_OFFSET
                                         P_EXTENDED  = P_EXTENDED
                                         P_MODE1     = <L_XCROSS>-MODE1
                                         P_MODE2     = <L_XCROSS>-MODE2
                               changing  P_RESULT    = P_RESULT
                                         P_PREV_REF  = L_PREV_REF ).
            endif.
              add 1 to L_INDEX_2.
            enddo.
          endloop.
        endif.


        if L_MODE_GLOBSTR = 'X' and <L_XCROSS>-MODE1 = MODE1_GLOBAL and <L_XCROSS>-OBJ_KIND = 'S'.
          loop at L_IDS-GLOBSTR assigning <L_NAME_1> where ROLE = <L_XCROSS>-ROLE and
                                                           NAME = <L_XCROSS>-NAME.
            SINGLE_REF_FOUND( exporting P_XCROSS    = <L_XCROSS>
                                         P_DEF       = L_DEF
                                         P_FULL_NAME = <L_NAME_1>-FULL_NAME
                                         P_GRADE     = <L_NAME_1>-GRADE
                                         P_NAME      = <L_XCROSS>-NAME
                                         P_OFFSET    = 0
                                         P_EXTENDED  = P_EXTENDED
                                         P_MODE1     = <L_XCROSS>-MODE1
                                         P_MODE2     = <L_XCROSS>-MODE2
                               changing  P_RESULT    = P_RESULT
                                         P_PREV_REF  = L_PREV_REF ).
          endloop.

        endif.


      endloop.

    catch LCX_FULL_NAME_SYNTAX_ERROR.
      P_INDEX_FULL_NAME = TABIX.
      raise SYNTAX_ERROR.
    catch LCX_OBJECT_NOT_FOUND.
      P_INDEX_FULL_NAME = TABIX.
      raise OBJECT_NOT_FOUND.
    catch LCX_READ_TABLE_ERROR.  "#EC NO_HANDLER

    catch LCX_RECURSIVE_DEFINITION. "#EC NO_HANDLER

  endtry.


endmethod.


method GET_SOURCE_INFO .
*---------------------------------------------------------------------*
*       METHOD GET_SOURCE_INFO                                        *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_LEVEL_REF like line of LEVEL_REF,
    L_LEVEL_WA  like line of LEVELS,
    L_LEVEL     like P_LEVEL.

  read table LEVEL_REF into L_LEVEL_REF
             with table key LEVEL = P_LEVEL.
  if SY-SUBRC = 0.
    P_RESULT = L_LEVEL_REF-REF.
    return.
  endif.
  L_LEVEL = P_LEVEL.
  do.
    read table LEVELS index L_LEVEL into L_LEVEL_WA.
    if L_LEVEL_WA-TYPE = 'P' or SY-SUBRC ne 0.
      exit.
    endif.
    L_LEVEL = L_LEVEL_WA-LEVEL.
  enddo.
  create object L_LEVEL_REF-REF
         exporting P_NAME = L_LEVEL_WA-NAME
                   P_KIND = L_LEVEL_WA-TYPE.
  L_LEVEL_REF-LEVEL = P_LEVEL.
  insert L_LEVEL_REF into table LEVEL_REF.
  P_RESULT = L_LEVEL_REF-REF.
endmethod.                    "GET_SOURCE_INFO


method GET_STATEMENT_INFO .
  data:
    L_STMNT_REF   like line of STMNT_REF,
    L_STMNT_WA    like line of STMNTS,
    L_SOURCE_INFO type ref to CL_ABAP_SOURCE_INFO.

  read table STMNT_REF into L_STMNT_REF
             with table key STMNT = P_STMNT.
  if SY-SUBRC = 0.
    P_RESULT = L_STMNT_REF-REF.
    return.
  endif.
  read table STMNTS index P_STMNT into L_STMNT_WA.
  if L_STMNT_WA-END_LINE = 0 and MACRO_STMNT <> 0 and MACRO_STMNT <> P_STMNT.
    p_RESULT = GET_STATEMENT_INFO( MACRO_STMNT ).
    return.
  endif.


  L_SOURCE_INFO = GET_SOURCE_INFO( L_STMNT_WA-LEVEL ).
  create object L_STMNT_REF-REF
         exporting P_SOURCE_INFO  = L_SOURCE_INFO
                   P_START_LINE   = L_STMNT_WA-START_LINE
                   P_START_COLUMN = L_STMNT_WA-START_COLUMN
                   P_COLON_LINE   = L_STMNT_WA-COLON_LINE
                   P_COLON_COLUMN = L_STMNT_WA-COLON_COLUMN
                   P_COMMA_LINE   = L_STMNT_WA-COMMA_LINE
                   P_COMMA_COLUMN = L_STMNT_WA-COMMA_COLUMN
                   P_END_LINE     = L_STMNT_WA-END_LINE
                   P_END_COLUMN   = L_STMNT_WA-END_COLUMN.
  L_STMNT_REF-STMNT = P_STMNT.
  insert L_STMNT_REF into table STMNT_REF.
  P_RESULT = L_STMNT_REF-REF.
endmethod.                    "GET_STATEMENT_INFO


method GET_STRUCTURE_SYMBOL .
  data:
    L_FROM      type I,
    L_TO        type I,
    L_COMPONENT type SCR_COMPONENT,
    L_FULL_NAME type STRING.

  field-symbols:
    <L_ITEM> like line of TYPE_CHILDS,
    <L_TYPE> like line of TYPES.

  p_level = p_level - 1.

  IF p_LEVEL <= 0.
    raise exception type lcx_recursive_definition.
  ENDIF.


  create object P_RESULT.

  L_FROM = P_ENTRY-REF_OFFSET.
  L_TO   = P_ENTRY-REF_OFFSET + P_ENTRY-CHILD_CNT - 1.
  loop at TYPE_CHILDS from L_FROM to L_TO assigning <L_ITEM>.
    READ_TABLE_INDEX TYPES <L_ITEM>-TYPE_OFFSET <L_TYPE>.
    L_COMPONENT-NAME = <L_TYPE>-STR.
    TYPE_FULL_NAME( exporting P_TYPE_ID = <L_ITEM>-TYPE_OFFSET  importing P_RESULT = L_FULL_NAME ).
    GET_SYMBOL_LEVEL TYPE L_COMPONENT-TYPE L_FULL_NAME <L_TYPE> ?= p_LEVEL.
    append L_COMPONENT to P_RESULT->COMPONENTS.


  endloop.


endmethod.


method GET_SYMBOL.
  data:
    L_TAG type SCR_TAG.

  field-symbols:
   <L_DATA> like line of DATAS,
   <L_TYPE> like line of TYPES,
   <L_ENV>  like line of ENVS.

  case P_OBJ_KIND.
    when 'D'.
      READ_TABLE_INDEX datas P_OBJ_ID <L_DATA>.
      GET_SYMBOL_LEVEL DATA P_RESULT P_FULL_NAME <L_DATA> = P_LEVEL.
    when 'T'.
      READ_TABLE_INDEX TYPES P_OBJ_ID <L_TYPE>.
      GET_SYMBOL_LEVEL TYPE P_RESULT P_FULL_NAME <L_TYPE> = p_LEVEL.
    when 'E'.
      READ_TABLE_INDEX ENVS P_OBJ_ID <L_ENV>.
      L_TAG = GET_TAG_OF_FULL_NAME( P_FULL_NAME ).
      GET_SYMBOL_EXT ENV P_RESULT L_TAG P_FULL_NAME <L_ENV> =.
  endcase.
endmethod.


method GET_SYMBOL_ENTRY .
  data:
    L_OBJ_DESCR type OBJINFO,
    L_FULL_NAME type STRING.

  SCAN( ).

  try.
      if P_FULL_NAME(2) = '*\'.
        concatenate '\PR:' PROGRAM  P_FULL_NAME+1(*) into L_FULL_NAME.
        L_OBJ_DESCR = FIND_FULL_NAME( L_FULL_NAME ).

        if L_OBJ_DESCR-OBJ_ID = 0.
          L_FULL_NAME = P_FULL_NAME+1(*).
          L_OBJ_DESCR = FIND_FULL_NAME( L_FULL_NAME ).
        endif.
      else.
        L_OBJ_DESCR = FIND_FULL_NAME( P_FULL_NAME ).
        L_FULL_NAME = P_FULL_NAME.
      endif.

      if L_OBJ_DESCR-OBJ_ID <> 0.
        GET_SYMBOL( exporting P_OBJ_KIND  = L_OBJ_DESCR-OBJ_KIND
                              P_OBJ_ID    = L_OBJ_DESCR-OBJ_ID
                              P_FULL_NAME = L_FULL_NAME
                              P_LEVEL     = C_MAX_LEVEL
                    importing P_RESULT    = P_RESULT ).

      endif.

    catch LCX_FULL_NAME_SYNTAX_ERROR.                   "#EC NO_HANDLER

    catch LCX_OBJECT_NOT_FOUND.                         "#EC NO_HANDLER

    catch LCX_READ_TABLE_ERROR.                         "#EC NO_HANDLER

    catch LCX_RECURSIVE_DEFINITION.                     "#EC NO_HANDLER
  endtry.


endmethod.


method GET_TABLE_SYMBOL .
  data:
    L_FULL_NAME type STRING.

  field-symbols:
    <L_TYPE> like line of TYPES.


  p_level = p_level - 1.

  IF p_LEVEL <= 0.
    raise exception type lcx_recursive_definition.
  ENDIF.


  create object P_RESULT.

  P_RESULT->INDEX_KIND = P_ENTRY-CHILD_CNT.

  TYPE_FULL_NAME( exporting P_TYPE_ID = P_ENTRY-REF_OFFSET importing P_RESULT = L_FULL_NAME ).

  READ_TABLE_INDEX TYPES P_ENTRY-REF_OFFSET <L_TYPE>.


  GET_SYMBOL_LEVEL TYPE P_RESULT->LINE_TYPE L_FULL_NAME <L_TYPE> ?= P_LEVEL.


endmethod.


method GET_TAG_OF_FULL_NAME .
  data:
    L_TABLE  type table of STRING,
    L_STRING type STRING,
    L_LINES  type I.
  split P_FULL_NAME at '\' into table L_TABLE.
  L_LINES = LINES( L_TABLE ).
  read table L_TABLE index L_LINES into L_STRING.
  if STRLEN( L_STRING ) >= 2.
    P_TAG = L_STRING(2).
  endif.
endmethod.                    "


method GET_TYPE_CODE.
  constants:
    C_STATE_INITIAL    type I value 0,
    C_STATE_CLASS      type I value 1,
    C_STATE_TYPE       type I value 2,
    C_STATE_INTERFACE  type I value 3.

  data:
    L_FULL_NAME type STRING,
    L_OP        type STRING,
    L_NAMES     type table of STRING,
    L_NAME      type STRING,
    L_PART      type STRING,
    L_STATE     type I,
    L_INDEX     type I value 1,
    L_MAP       type SYNT_STRUC_MAP.

  field-symbols:
    <L_ENV>  like line of ENVS,
    <L_TYPE> like line of TYPES.

  split P_TYPE->FULL_NAME at '\' into table L_NAMES.


  P_TYPE_OPERATOR = ``.
  p_NAME          = ``.

  L_OP        = `type`.    "#EC NOTEXT

  do.
    read table L_NAMES index L_INDEX into L_PART.
    if SY-SUBRC <> 0.
      exit.
    endif.
    if L_PART is initial.
      add 1 to L_INDEX.
      continue.
    endif.

    if STRLEN( L_PART ) > 3.
      L_NAME = L_PART+3.
    endif.



    case L_STATE.
      when C_STATE_INITIAL.
        case L_PART(2).
          when TAG_PROGRAM.

          when TAG_PREDEF_TYPE.
            case L_NAME.
              when '%_ANY_TABLE'.      L_NAME = 'any table'.          "#EC NOTEXT
              when '%_INDEX_TABLE'.    L_NAME = 'index table'.        "#EC NOTEXT
              when '%_STANDARD_TABLE'. L_NAME = 'standard table'.     "#EC NOTEXT
              when '%_SORTED_TABLE'.   L_NAME = 'sorted table'.       "#EC NOTEXT
              when '%_HASHED_TABLE'.   L_NAME = 'hashed table'.       "#EC NOTEXT
            endcase.

            P_NAME = |{ P_NAME }{ L_NAME }|.
            L_STATE     = C_STATE_TYPE.


          when TAG_SHARED_TYPE.
            read table TYPES index L_NAME assigning <L_TYPE>.
            if SY-SUBRC <> 0. raise INVALID_TYPE. endif.
            case <L_TYPE>-KIND.
              when SYNT_TYPE-REF-ATYP or
                   SYNT_TYPE-FREF-ATYP.
                P_TYPE_OPERATOR = |{ P_TYPE_OPERATOR } ref to|.
                TYPE_FULL_NAME( exporting P_TYPE_ID = <L_TYPE>-REF_OFFSET
                                importing P_RESULT  = L_FULL_NAME ).
                split L_FULL_NAME at '\' into table L_NAMES.
                L_INDEX = 1.
                continue.

              when others.
                raise INVALID_TYPE.
            endcase.

          when TAG_TYPE.
            SCAN( ).
            read table GLOBAL_TYPES with table key NAME = L_NAME into L_MAP.
            if SY-SUBRC <> 0.
              read table ENVS index 3 assigning <L_ENV>.
              read table <L_ENV>-TYPES with table key NAME = L_NAME into L_MAP.
            endif.

            if SY-SUBRC = 0.
              read table TYPES index L_MAP-INDEX assigning <L_TYPE>.
              if SY-SUBRC <> 0. raise INVALID_TYPE. endif.
              case <L_TYPE>-KIND.
                when SYNT_TYPE-OBJ1-ATYP or
                     SYNT_TYPE-OBJ2-ATYP or
                     SYNT_TYPE-INTERFACE-ATYP.
                  P_NAME      = |{ P_NAME }{ L_NAME }|.
                  L_STATE     = C_STATE_CLASS.
                when others.
                  P_NAME      = |{ P_NAME }{ L_NAME }|.
                  L_STATE     = C_STATE_TYPE.
              endcase.
            endif.

          when others.
            raise INVALID_TYPE.

        endcase.

      when C_STATE_TYPE.
        case L_PART(2).

          when TAG_TYPE.
            P_NAME = |{ P_NAME }-{ L_NAME }|.

          when TAG_DATA.
            P_NAME = |{ P_NAME }-{ L_NAME }|.

          when TAG_TYPE_OF.
            L_OP = 'like' ##NO_TEXT .
            exit.

          when others.
            raise INVALID_TYPE.

        endcase.

      when C_STATE_CLASS.
        case L_PART(2).

          when TAG_TYPE.
            P_NAME      = |{ P_NAME }=>{ L_NAME }|.
            L_STATE     = C_STATE_TYPE.

          when TAG_DATA.
            P_NAME      = |{ P_NAME }=>{ L_NAME }|.
            L_STATE     = C_STATE_TYPE.

          when TAG_INTERFACE.
            P_NAME      = |{ P_NAME }=>{ L_NAME }|.
            L_STATE     = C_STATE_INTERFACE.

          when others.
            raise INVALID_TYPE.

        endcase.


      when C_STATE_INTERFACE.
        case L_PART(2).

          when TAG_TYPE.
            P_NAME      = |{ P_NAME }~{ L_NAME }|.
            L_STATE     = C_STATE_TYPE.


          when others.
            raise INVALID_TYPE.

        endcase.

    endcase.
    add 1 to L_INDEX.
  enddo.

  P_TYPE_OPERATOR = |{ L_OP }{ P_TYPE_OPERATOR }|.

endmethod.


method GET_TYPE_CONSTRUCTOR_REFS .
*---------------------------------------------------------------------*
*       METHOD GET_METHOD_GLOBAL_REFS                                 *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_MAP    type SYNT_STRUC_MAP.
  field-symbols:
    <L_TYPE>     like line of TYPES,
    <L_ENV>      like line of ENVS.

  READ_TABLE_INDEX TYPES  p_type_id          <L_TYPE>.
  READ_TABLE_INDEX ENVS  <L_TYPE>-REF_OFFSET <L_ENV>.

  case <L_ENV>-KIND.
    when SYNT_XENV-CLASSDECL     or
         SYNT_XENV-CLASS.
      read table <L_ENV>-METHODS with table key NAME = 'CONSTRUCTOR'
                 into L_MAP.
      if SY-SUBRC = 0.
        GET_ME_EV_REFS( exporting P_LOCAL   = P_LOCAL
                                  P_TAG     = TAG_METHOD
                                  P_ENV_ID  = L_MAP-INDEX
                                  P_DEF     = ' '
                                  P_INCLUDE = P_INCLUDE
                                  P_MODE1   = ' '
                        changing  P_RESULT  = P_RESULT ).

      endif.
  endcase.
endmethod.


method GET_TYPE_REFS .
*---------------------------------------------------------------------*
*       METHOD GET_TYPE_REFS                                          *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_RESULT   like line of P_RESULT,
    L_TYPE_ID  type I.
  field-symbols:
    <L_TYPE>   like line of TYPES,
    <L_TYPE_1> like line of TYPES.

  while P_TYPE_ID <> 0.
    READ_TABLE_INDEX TYPES P_TYPE_ID <L_TYPE>.
    if ( P_LOCAL          = 'X'         and
         <L_TYPE>-TYPELOC <> SYNT_LOC-SHARED or
         <L_TYPE>-TYPELOC =  SYNT_LOC-POOL or
       ( <L_TYPE>-TYPELOC =  SYNT_LOC-CLAS and IS_GLOBAL( P_OBJ_ID = <L_TYPE>-PARENT_INDEX P_OBJ_KIND = <L_TYPE>-PARENT_KIND ) = 'X' ) or
         <L_TYPE>-TYPELOC =  SYNT_LOC-DDIC )    and
       <L_TYPE>-KIND      <> SYNT_TYPE-AS-ATYP and
       <L_TYPE>-STR       is not initial       and
       TAG_TYPE in TAGS.
      if <L_TYPE>-KIND    = SYNT_TYPE-OBJ1-ATYP or
         <L_TYPE>-KIND    = SYNT_TYPE-OBJ2-ATYP or
         <L_TYPE>-KIND    = SYNT_TYPE-INTERFACE-ATYP.
        GET_CLASS_INTF_REFS(  exporting P_LOCAL    = P_LOCAL
                                        P_ENV_ID   = <L_TYPE>-REF_OFFSET
                                        P_GRADE    = P_GRADE
                                        P_DEF      = P_DEF
                                        P_INCLUDE  = P_INCLUDE
                                        P_MODE1    = P_MODE1
                              changing  P_RESULT   = P_RESULT ).

      else.
*        if P_DEF = 'X' and
*           ( <L_TYPE>-KIND = SYNT_TYPE-STRUC1-ATYP or
*             <L_TYPE>-KIND = SYNT_TYPE-STRUC2-ATYP ).
*          insert P_TYPE_ID into table OPEN_TYPES.
*        else.
*          read table OPEN_TYPES with table key TABLE_LINE = P_TYPE_ID
*                     transporting no fields.
*          if SY-SUBRC = 0.
*            P_DEF = 'X'.
*            delete table OPEN_TYPES from P_TYPE_ID.
*          endif.
*        endif.
        L_RESULT-INCLUDE   = P_INCLUDE.
        L_RESULT-MODE1     = P_MODE1.
        TYPE_FULL_NAME( exporting P_TYPE_ID = P_TYPE_ID  importing P_RESULT =  L_RESULT-FULL_NAME ).
        L_RESULT-TAG       = TAG_TYPE.
        GET_SYMBOL TYPE L_RESULT-SYMBOL L_RESULT-FULL_NAME <L_TYPE> =.
        GET_GRADE_2 L_RESULT-GRADE P_GRADE P_DEF.           " 'X' 0.
        INSERT_GLOBAL_REF L_RESULT P_RESULT.
        if P_GRADE = GRADE_DIRECT and P_DEF <> 'X'.
          assign <L_TYPE> to <L_TYPE_1>.
          while <L_TYPE_1>-PARENT_KIND  = 'T' and
                <L_TYPE_1>-PARENT_INDEX <> 0.            "#EC CI_NESTED
            L_TYPE_ID = <L_TYPE_1>-PARENT_INDEX.
            READ_TABLE_INDEX TYPES L_TYPE_ID <L_TYPE_1>.
            if ( <L_TYPE_1>-KIND    <> SYNT_TYPE-STRUC1-ATYP and
                 <L_TYPE_1>-KIND    <> SYNT_TYPE-STRUC2-ATYP ) or
               ( ( P_LOCAL            <> 'X'  or
                   <L_TYPE_1>-TYPELOC = SYNT_LOC-SHARED )   and
                 <L_TYPE_1>-TYPELOC <> SYNT_LOC-POOL         and
                 <L_TYPE_1>-TYPELOC <> SYNT_LOC-DDIC         ) or
                 <L_TYPE_1>-STR     is initial.
              exit.
            endif.
            if P_DEF = ' '.
              L_RESULT-INCLUDE   = P_INCLUDE.
              L_RESULT-MODE1     = P_MODE1.
              TYPE_FULL_NAME( exporting P_TYPE_ID = L_TYPE_ID  importing P_RESULT =  L_RESULT-FULL_NAME ).
              L_RESULT-TAG       = TAG_TYPE.
              L_RESULT-GRADE     = GRADE_COMPONENTS.
              INSERT_GLOBAL_REF L_RESULT P_RESULT.
              P_INSERT = 'X'.
            endif.
          endwhile.
        endif.
      endif.
    elseif <L_TYPE>-TYPELOC = SYNT_LOC-CLAS.
      GET_CTYPE_REFS( exporting P_LOCAL    = P_LOCAL
                                P_TYPE_ID  = P_TYPE_ID
                                P_GRADE    = P_GRADE
                                P_DEF      = P_DEF
                                P_INCLUDE  = P_INCLUDE
                                P_MODE1    = P_MODE1
                      changing  P_RESULT   = P_RESULT
                                P_INSERT   = P_INSERT ).
    endif.

    case <L_TYPE>-KIND.
      when SYNT_TYPE-TYPEINHERIT-ATYP or
           SYNT_TYPE-INTFIMPL-ATYP.
        P_TYPE_ID = <L_TYPE>-REF_OFFSET.

      when SYNT_TYPE-AS-ATYP          or
           SYNT_TYPE-TYPEALIAS-ATYP.
        P_TYPE_ID = <L_TYPE>-REF_OFFSET.
        P_GRADE   = GRADE_PROPERTIES.

      when SYNT_TYPE-REF-ATYP          or
           SYNT_TYPE-FREF-ATYP.
        P_TYPE_ID = <L_TYPE>-REF_OFFSET.
        P_GRADE   = GRADE_PROPERTIES.

      when SYNT_TYPE-TYPE-ATYP.
        if <L_TYPE>-LENGTH = SYNT_GENERIC_TYPE_FLAG.
          exit.
        else.
          P_TYPE_ID = <L_TYPE>-REF_OFFSET.
          P_GRADE   = GRADE_PROPERTIES.
        endif.

      when others.
        exit.

    endcase.

    if P_DEF = 'X'.
      return.
    endif.

    TEST_VISITED 'T' P_TYPE_ID P_DEF P_GRADE ' ' P_INCLUDE.
    if SY-SUBRC = 0.
      return.
    endif.
  endwhile.


endmethod.                    "GET_TYPE_REFS


method GET_TYPE_SYMBOL.

  field-symbols:
    <L_TYPE>   like line of TYPES,
    <L_ENV>    like line of ENVS.


  p_level = p_level - 1.

  IF p_LEVEL <= 0.
    raise exception type lcx_recursive_definition.
  ENDIF.

  assign P_ENTRY to <L_TYPE>.


*  assign P_ENTRY to <L_TYPE_1>.
*
*  do.
*    case <L_TYPE>-KIND.
*      when SYNT_TYPE-AS-ATYP          or
*           SYNT_TYPE-TYPEALIAS-ATYP   or
*           SYNT_TYPE-TYPEINHERIT-ATYP or
*           SYNT_TYPE-INTFIMPL-ATYP.
*        assign <L_TYPE> to <L_TYPE_1>.
*        L_FULL_NAME = P_FULL_NAME.
*        L_INDEX = <L_TYPE>-REF_OFFSET.
*
*      when SYNT_TYPE-TYPE-ATYP.
*        if <L_TYPE>-LENGTH = SYNT_GENERIC_TYPE_FLAG.
*          assign <L_TYPE_1> to <L_TYPE>.
*          exit.
*        else.
*          assign <L_TYPE> to <L_TYPE_1>.
*          L_FULL_NAME = P_FULL_NAME.
*          L_INDEX = <L_TYPE>-REF_OFFSET.
*        endif.
*
*      when others.
*        if <L_TYPE>-LENGTH = SYNT_GENERIC_TYPE_FLAG.
*          assign <L_TYPE_1> to <L_TYPE>.
*          P_FULL_NAME = L_FULL_NAME.
*        endif.
*        exit.
*    endcase.
*    TYPE_FULL_NAME( exporting p_TYPE_ID = L_INDEX  importing p_result =  P_FULL_NAME  ).
*    READ_TABLE_INDEX TYPES index L_INDEX assigning <L_TYPE>.
*  enddo.
*

  case <L_TYPE>-KIND.
    when SYNT_TYPE-STRUC1-ATYP or SYNT_TYPE-STRUC2-ATYP.
      P_RESULT = GET_STRUCTURE_SYMBOL( P_ENTRY = <L_TYPE>  P_level = p_level ).
      P_RESULT->TYPE_KIND = CL_ABAP_COMP_TYPE=>TYPE_KIND_STRUCTURE.

    when SYNT_TYPE-TABLE-ATYP.
      P_RESULT = GET_TABLE_SYMBOL( P_ENTRY = <L_TYPE> P_LEVEL = P_LEVEL ).
      P_RESULT->TYPE_KIND = CL_ABAP_COMP_TYPE=>TYPE_KIND_TABLE.

    when SYNT_TYPE-OBJ1-ATYP or SYNT_TYPE-OBJ2-ATYP.
      READ_TABLE_INDEX ENVS <L_TYPE>-REF_OFFSET <L_ENV>.
      P_RESULT = GET_CLASS_SYMBOL( P_ENTRY = <L_ENV> P_FULL_NAME = P_FULL_NAME P_LEVEL = P_LEVEL ).

    when SYNT_TYPE-INTERFACE-ATYP.
      READ_TABLE_INDEX ENVS <L_TYPE>-REF_OFFSET <L_ENV>.
      P_RESULT = GET_INTERFACE_SYMBOL( P_ENTRY = <L_ENV> P_FULL_NAME = P_FULL_NAME P_LEVEL = P_LEVEL ).

    when SYNT_TYPE-REF-ATYP or  SYNT_TYPE-FREF-ATYP.
      P_RESULT = GET_REF_SYMBOL( P_ENTRY = <L_TYPE> P_LEVEL = P_LEVEL ).
      P_RESULT->TYPE_KIND = CL_ABAP_COMP_TYPE=>TYPE_KIND_REFERENCE.

    when SYNT_TYPE-TYPE-ATYP        or
         SYNT_TYPE-AS-ATYP          or
         SYNT_TYPE-TYPEALIAS-ATYP   or
         SYNT_TYPE-TYPEINHERIT-ATYP or
         SYNT_TYPE-INTFIMPL-ATYP.
      if <L_TYPE>-REF_OFFSET <> 0.
        P_RESULT = GET_ALIAS_TYPE_SYMBOL( P_ENTRY = <L_TYPE> P_LEVEL = P_LEVEL ).

      else.
        create object P_RESULT.
        P_RESULT->TYPE_KIND = CL_ABAP_COMP_TYPE=>TYPE_KIND_ELEMENTARY.
      endif.
    when others.
      create object P_RESULT.
      P_RESULT->TYPE_KIND = CL_ABAP_COMP_TYPE=>TYPE_KIND_ELEMENTARY.

  endcase.

  P_RESULT->TAG       = TAG_TYPE.
  P_RESULT->FULL_NAME = P_FULL_NAME.
  P_RESULT->LENGTH    = <L_TYPE>-LENGTH.
  P_RESULT->ATYP      = <L_TYPE>-ATYP.
  P_RESULT->DECIMALS  = <L_TYPE>-DECIMALS.

  case <L_TYPE>-MODE.
    when SYNT_MODE-PUBLIC.      P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PUBLIC.
    when SYNT_MODE-PROTECTED.   P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PROTECTED.
    when SYNT_MODE-PACKAGE.     P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PACKAGE.
    when SYNT_MODE-PRIVATE.     P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PRIVATE.
    when others.                P_RESULT->VISIBILITY = CL_ABAP_COMP_SYMBOL=>VISIBILITY_PUBLIC.
  endcase.

  case <L_TYPE>-TYPELOC.
    when SYNT_LOC-PROG.   P_RESULT->LOCATION = LOC_PROGRAM.
    when SYNT_LOC-CLAS.   P_RESULT->LOCATION = LOC_CLASS.
    when SYNT_LOC-POOL.   P_RESULT->LOCATION = LOC_TYPE_POOL.
    when SYNT_LOC-DDIC.   P_RESULT->LOCATION = LOC_DDIC.
    when SYNT_LOC-PREDEF. P_RESULT->LOCATION = LOC_PREDEF.
    when SYNT_LOC-SYS.    P_RESULT->LOCATION = LOC_SYSTEM.
    when SYNT_LOC-SHARED. P_RESULT->LOCATION = LOC_SHARED.
  endcase.



endmethod.                                               "#EC CI_VALPAR


method GET_XCROSS_FULL_NAME .
*---------------------------------------------------------------------*
*       METHOD GET_XCROSS_FULL_NAME                                   *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
     L_NAME      type STRING,
     L_LENGTH    type I,
     L_ID        type STRING,
     L_MSG_ID    type SY-MSGNO,
     L_NUMBER    type STRING,
     L_FORM      type STRING,
     L_PF_STATUS type STRING,
     L_PROGRAM   type STRING.
  field-symbols:
    <L_XCROSS> like line of XCROSS.

  if P_XCROSS-DEF = 'X'.
    P_GRADE = GRADE_DEFINITION.
  else.
    P_GRADE = GRADE_DIRECT.
  endif.

  P_VALID = 'X'.

  case P_XCROSS-ROLE.
    when SYNT_ROLE-FIELD.
    when SYNT_ROLE-TYPE.
    when SYNT_ROLE-FORM.
      if P_XCROSS-OBJ_KIND = 'S'.
        GET_FORM_AND_PROGRAM( exporting P_TOKEN   = P_XCROSS-NAME
                              importing P_PROGRAM = L_PROGRAM
                                        P_FORM    = L_FORM ).
        if L_FORM is not initial.
          if L_PROGRAM is not initial.
            if P_OFFSET > STRLEN( L_FORM ).
              TAG_NAME( exporting  P_TAG    = TAG_PROGRAM
                                   P_NAME   = L_PROGRAM
                        importing  P_RESULT = P_FULL_NAME ).

              P_TAG       = TAG_PROGRAM.
            else.
              TAG_NAME_2( exporting  P_TAG_1  = TAG_PROGRAM
                                     P_NAME_1 = L_PROGRAM
                                     P_TAG_2  = TAG_FORM
                                     P_NAME_2 = L_FORM
                          importing  P_RESULT = P_FULL_NAME ).
              P_TAG       = TAG_FORM.
            endif.
            return.
          else.
            do.
              add 1 to P_INDEX.
              read table XCROSS index P_INDEX assigning <L_XCROSS>.
              if <L_XCROSS>-STMNT <> P_XCROSS-STMNT.
                if  <L_XCROSS>-OBJ_KIND = 'S'.
                  TAG_NAME_2( exporting P_TAG_1  = TAG_PROGRAM
                                        P_NAME_1 = PROGRAM
                                        P_TAG_2  = TAG_FORM
                                        P_NAME_2 = L_FORM
                              importing P_RESULT = P_FULL_NAME ).
                  P_TAG       = TAG_FORM.
                  return.
                endif.
              endif.
              if <L_XCROSS>-ROLE = SYNT_ROLE-PROGRAM.
                if  <L_XCROSS>-OBJ_KIND = 'S'.
                  TAG_NAME_2( exporting P_TAG_1  = TAG_PROGRAM
                                        P_NAME_1 = <L_XCROSS>-NAME
                                        P_TAG_2  = TAG_FORM
                                        P_NAME_2 = L_FORM
                              importing P_RESULT = P_FULL_NAME ).
                  P_TAG       = TAG_FORM.
                  return.
                endif.
              endif.
            enddo.
          endif.
        endif.
      endif.

    when SYNT_ROLE-MODULE_IN.
      if P_XCROSS-OBJ_KIND = 'S'.

        TAG_NAME_2( exporting  P_TAG_1  = TAG_PROGRAM
                               P_NAME_1 = PROGRAM
                               P_TAG_2  = TAG_MODULE_IN
                               P_NAME_2 = P_XCROSS-NAME
                    importing  P_RESULT = P_FULL_NAME ).
        P_TAG       = TAG_MODULE_IN.

        return.
      endif.

    when SYNT_ROLE-MODULE_OUT.
      if P_XCROSS-OBJ_KIND = 'S'.

        TAG_NAME_2( exporting  P_TAG_1  = TAG_PROGRAM
                               P_NAME_1 = PROGRAM
                               P_TAG_2  = TAG_MODULE_OUT
                               P_NAME_2 = P_XCROSS-NAME
                    importing  P_RESULT = P_FULL_NAME ).
        P_TAG       = TAG_MODULE_OUT.
        return.
      endif.

    when SYNT_ROLE-PROGRAM or SYNT_ROLE-REPORT.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'S'.
      check P_XCROSS-NAME(1) <> '('.
      TAG_NAME( exporting P_TAG    = TAG_PROGRAM
                          P_NAME   = P_XCROSS-NAME
                importing P_RESULT = P_FULL_NAME ).
      P_TAG       = TAG_PROGRAM.

      return.


    when SYNT_ROLE-FUNCTION.
      check TAG_FUNCTION in TAGS.
      if P_XCROSS-OBJ_KIND = 'D'.
        GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                            importing P_VALUE   = L_NAME ).
      elseif P_XCROSS-OBJ_KIND = 'S'.
        L_NAME = P_XCROSS-NAME.
      endif.
      if L_NAME is not initial.
        TAG_NAME( exporting P_TAG    = TAG_FUNCTION
                            P_NAME   = L_NAME
                  importing P_RESULT = P_FULL_NAME ).
        P_TAG       = TAG_FUNCTION.
        return.
      endif.

    when SYNT_ROLE-CUST_FUNCTION.
      check TAG_CUST_FUNCTION in TAGS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = L_NAME ).
      if L_NAME is not initial.
        TAG_NAME( exporting P_TAG    = TAG_CUST_FUNCTION
                            P_NAME   = L_NAME
                  importing P_RESULT = P_FULL_NAME ).
        P_TAG       = TAG_CUST_FUNCTION.
        return.
      endif.

    when SYNT_ROLE-CLASS
      or SYNT_ROLE-INTERFACE.

    when SYNT_ROLE-METHOD.

    when SYNT_ROLE-EVENT.

    when SYNT_ROLE-ALIAS.

    when SYNT_ROLE-FIELD_LIST.
    when SYNT_ROLE-FIELDAREA.
    when SYNT_ROLE-COMPONENT.
    when SYNT_ROLE-DATABASE.

    when SYNT_ROLE-INCLUDE.

    when SYNT_ROLE-TRANSACTION.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = L_NAME ).
      if L_NAME is not initial.
        TAG_NAME( exporting P_TAG    = TAG_TRANSACTION
                            P_NAME   = L_NAME
                  importing P_RESULT = P_FULL_NAME ).

        P_TAG       = TAG_TRANSACTION.
        return.
      endif.

    when SYNT_ROLE-DIALOG.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = L_NAME ).
      if L_NAME is not initial.
        TAG_NAME( exporting P_TAG    = TAG_DIALOG
                             P_NAME   = L_NAME
                   importing P_RESULT = P_FULL_NAME ).

        P_TAG        = TAG_DIALOG.
        return.
      endif.

    when SYNT_ROLE-TYPEPOOL.

    when SYNT_ROLE-MESSAGE_ID.
      if P_XCROSS-OBJ_KIND = 'D'.
        GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                            importing P_VALUE   = L_NAME ).
        if L_NAME is not initial.
          TAG_NAME( exporting P_TAG    = TAG_MESSAGE_ID
                             P_NAME   = L_NAME
                   importing P_RESULT = P_FULL_NAME ).
          P_TAG       = TAG_MESSAGE_ID.
          return.
        endif.
      endif.

    when SYNT_ROLE-MESSAGE_NUMB.
      if P_XCROSS-OBJ_KIND = 'S'.
        if P_XCROSS-NAME(1) = ''''.
          if P_XCROSS-STMNT = MESSAGE_STMNT.
            L_LENGTH           = STRLEN( P_XCROSS-NAME ) - 2.
            L_MSG_ID           = P_XCROSS-NAME+1(L_LENGTH).
            L_NUMBER           = L_MSG_ID.
            TAG_NAME_2( exporting P_TAG_1  = TAG_MESSAGE_ID
                                  P_NAME_1 = MESSAGE_ID
                                  P_TAG_2  = TAG_MESSAGE_NUMBER
                                  P_NAME_2 = L_NUMBER
                        importing P_RESULT = P_FULL_NAME ).
            P_TAG       = TAG_MESSAGE_NUMBER.
            return.
          endif.
        else.
          GET_MSG_NUMBER_AND_ID( exporting P_TOKEN   = P_XCROSS-NAME
                                 importing P_NUMBER  = L_NUMBER
                                           P_ID      = L_ID ).
          L_LENGTH = STRLEN( L_NUMBER ) + 1.
          if P_OFFSET > L_LENGTH.
            TAG_NAME( exporting P_TAG  = TAG_MESSAGE_ID
                                    P_NAME = L_ID
                                    importing P_RESULT = L_ID ).
            P_FULL_NAME = L_ID.
            P_TAG       = TAG_MESSAGE_ID.
            return.
          endif.
          if L_NUMBER is not initial.
            TAG_NAME( exporting P_TAG  = TAG_MESSAGE_NUMBER
                                           P_NAME = L_NUMBER
                                           importing P_RESULT = L_NUMBER  ).
            if L_ID is not initial.
              TAG_NAME( exporting P_TAG  = TAG_MESSAGE_ID
                                      P_NAME = L_ID
                                      importing P_RESULT = L_ID  ).
              concatenate L_ID L_NUMBER          into P_FULL_NAME.
            else.
              concatenate GLOBAL_MSG_ID L_NUMBER into P_FULL_NAME.
            endif.
            P_TAG       = TAG_MESSAGE_NUMBER.
            return.
          endif.
        endif.
      else.
        if P_XCROSS-STMNT = MESSAGE_STMNT.
          GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                              importing P_VALUE   = L_NAME ).
          if L_NAME is not initial.
            L_MSG_ID    = L_NAME.
            L_NAME      = L_MSG_ID.
            TAG_NAME_2( exporting P_TAG_1  = TAG_MESSAGE_ID
                                  P_NAME_1 = MESSAGE_ID
                                  P_TAG_2  = TAG_MESSAGE_NUMBER
                                  P_NAME_2 = L_NAME
                        importing P_RESULT = P_FULL_NAME ).
            P_TAG       = TAG_MESSAGE_NUMBER.
            return.
          endif.
        endif.
      endif.

    when SYNT_ROLE-SET_GET_ID.
      if P_XCROSS-OBJ_KIND = 'D'.
        GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                            importing P_VALUE   = L_NAME ).
        if L_NAME is not initial.
          TAG_NAME( exporting P_TAG  = TAG_SET_GET_ID
                                            P_NAME = L_NAME
                                  importing P_RESULT = P_FULL_NAME ).

          P_TAG       = TAG_SET_GET_ID.
          return.
        endif.
      elseif P_XCROSS-OBJ_KIND = 'S'.
        TAG_NAME( exporting P_TAG  = TAG_SET_GET_ID
                                       P_NAME = P_XCROSS-NAME
                                       importing P_RESULT = P_FULL_NAME ).
        P_TAG       = TAG_SET_GET_ID.
        return.
      else.
        message X000(38) with PROGRAM.
      endif.

    when SYNT_ROLE-AUTH_OBJ.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = L_NAME ).
      if L_NAME is not initial.
        TAG_NAME( exporting P_TAG  = TAG_AUTHORITY_OBJECT
                                P_NAME = L_NAME
                                importing P_RESULT = P_FULL_NAME ).
        P_TAG       = TAG_AUTHORITY_OBJECT.
        return.
      endif.

    when SYNT_ROLE-PF_STATUS.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = L_PF_STATUS  ).

      do.
        add 1 to P_INDEX.
        read table XCROSS index P_INDEX assigning <L_XCROSS>.
        if <L_XCROSS>-STMNT <> P_XCROSS-STMNT.
          exit.
        endif.
        if <L_XCROSS>-ROLE = SYNT_ROLE-PF_STATUS_PROGRAM.
          if  <L_XCROSS>-OBJ_KIND = 'D'.
            GET_CONSTANT_VALUE( exporting P_DATA_ID = <L_XCROSS>-OBJ_ID
                                importing P_VALUE   = L_NAME ).
            if L_NAME is not initial.
              TAG_NAME_2( exporting P_TAG_1  = TAG_PROGRAM
                                        P_NAME_1 = L_NAME
                                        P_TAG_2  = TAG_PF_STATUS
                                        P_NAME_2 = L_PF_STATUS
                                        importing P_RESULT = P_FULL_NAME  ).
              P_TAG       = TAG_PF_STATUS.
              return.
            endif.
          endif.
        endif.
      enddo.

    when SYNT_ROLE-PF_STATUS_PROGRAM.
      ASSERT_OBJ_KIND P_XCROSS-OBJ_KIND 'D'.
      GET_CONSTANT_VALUE( exporting P_DATA_ID = P_XCROSS-OBJ_ID
                          importing P_VALUE   = L_NAME ).
      if L_NAME is not initial.
        TAG_NAME( exporting P_TAG  = TAG_PROGRAM
                                P_NAME = L_NAME
                                importing P_RESULT = P_FULL_NAME ).
        P_TAG       = TAG_PROGRAM.
        return.
      endif.

    when SYNT_ROLE-MATCHCODE_OBJECT.

    when SYNT_ROLE-FUNCTIONPOOL or
         SYNT_ROLE-CLASS_POOL   or
         SYNT_ROLE-INTF_POOL.

    when SYNT_ROLE-LOCATION.
      if P_XCROSS-NAME = '/'.
        P_VALID = ' '.
        return.
      endif.

    when SYNT_ROLE-MACRO.
      TAG_NAME_2( exporting P_TAG_1  = TAG_PROGRAM
                            P_NAME_1 = PROGRAM
                            P_TAG_2  = TAG_MACRO
                            P_NAME_2 = P_XCROSS-NAME
                  importing P_RESULT = P_FULL_NAME  ).
      P_TAG = TAG_MACRO.
      return.
  endcase.

  if P_XCROSS-OBJ_KIND = 'S'.
    P_TAG = ROLE_TO_TAG( P_XCROSS-ROLE ).
    concatenate '\' P_TAG ':' P_XCROSS-NAME into P_FULL_NAME.
  else.
    GET_FULL_NAME( exporting P_OBJ_KIND     = P_XCROSS-OBJ_KIND
                                 P_OBJ_ID       = P_XCROSS-OBJ_ID
*                              P_OFFSET       = P_OFFSET
                                 P_SKIP_INHERIT = 'X'
                                 importing P_RESULT = P_FULL_NAME ).
    P_TAG       = GET_TAG_OF_FULL_NAME( P_FULL_NAME ).
  endif.


endmethod.                    "GET_XCROSS_FULL_NAME


method GET_XCROSS_NAME_FOR_EVENT .
  case P_TAG.
    when TAG_END_OF_EDITING.             P_XCROSS_NAME = 'END-OF-EDITING'.
    when TAG_END_OF_SELECTION.           P_XCROSS_NAME = 'END-OF-SELECTION'.
    when TAG_INITIALIZATION.             P_XCROSS_NAME = 'INITIALIZATION'.
    when TAG_LOAD_OF_PROGRAM.            P_XCROSS_NAME = 'LOAD-OF-PROGRAM'.
    when TAG_START_OF_EDITING.           P_XCROSS_NAME = 'START-OF-EDITING'.
    when TAG_START_OF_SELECTION.         P_XCROSS_NAME = 'START-OF-SELECTION'.
    when TAG_TOP_OF_PAGE.                P_XCROSS_NAME = 'TOPA'.
    when TAG_TOP_OF_PAGE_LINE_SELECTION. P_XCROSS_NAME = 'TOPS'.
    when TAG_AT_USER_COMMAND.            P_XCROSS_NAME = 'AT_USER'.
    when TAG_AT_LINE_SELECTION.          P_XCROSS_NAME = 'AT_LINE'.
    when others.                         message X000(38) with PROGRAM.
  endcase.


endmethod.                    "


method INCLUDE_HAS_CHANGED .
  RESET_SCAN( ).
endmethod.                    "


method IS_GLOBAL.

  field-symbols:
   <L_DATA> like line of DATAS,
   <L_TYPE> like line of TYPES,
   <L_ENV>  like line of ENVS.

  case P_OBJ_KIND.
    when 'D'.
      READ_TABLE_INDEX datas P_OBJ_ID <L_DATA>.
      p_result = is_global( p_obj_id =  <L_DATA>-PARENT_INDEX p_obj_kind =  <L_DATA>-PARENT_KIND ).
    when 'T'.
      READ_TABLE_INDEX TYPES P_OBJ_ID <L_TYPE>.
       p_result = is_global( p_obj_id =  <L_type>-PARENT_INDEX p_obj_kind =  <L_type>-PARENT_KIND ).

    when 'E'.
      READ_TABLE_INDEX ENVS P_OBJ_ID <L_ENV>.
      p_result = <L_ENV>-PUBLICCLASS.
  endcase.

endmethod.


method IS_UNICODE_SYSTEM .
  data:
    L_RESULT(5) type C.

  call 'C_SAPGPARAM' id 'NAME'  field 'abap/unicode_check'
                     id 'VALUE' field L_RESULT.                "#EC CI_CCALL
  if L_RESULT cs 'on'.
    P_RESULT = 'X'.
    return.
  endif.

  if CL_ABAP_CHAR_UTILITIES=>CHARSIZE > 1.
    P_RESULT = 'X'.
    return.
  endif.

  P_RESULT = ' '.

endmethod.


method KEY_FULL_NAME.
*---------------------------------------------------------------------*
*       METHOD ENV_FULL_NAME                                          *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_NAME        type STRING.
  field-symbols:
    <L_KEY_ENTRY> like line of TABLE_KEYS.

  while P_KEY_ID <> 0.
    READ_TABLE_INDEX TABLE_KEYS P_KEY_ID <L_KEY_ENTRY>.
    P_KEY_ID = <L_KEY_ENTRY>-ORIG_KEY.
  endwhile.

  TYPE_FULL_NAME( exporting P_TYPE_ID = <L_KEY_ENTRY>-TABLE_TYPE
                  importing P_RESULT  = L_NAME ).

  concatenate L_NAME PREFIX_FOR_TAGS TAG_TABLE_KEY ':' <L_KEY_ENTRY>-STR into P_RESULT.

endmethod.                    "ENV_FULL_NAME


method RESET_SCAN .
*---------------------------------------------------------------------*
*       METHOD SCAN                                                   *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  clear:
     ERRORS,
     TYPES,
     TYPE_CHILDS,
     DATAS,
     DPARS,
     ENVS,
     COMPS,
     XCROSS,
     LEVELS,
     STMNTS,
     PREDEF_TYPES,
     GLOBAL_TYPES,
     PREDEF_DATAS,
     GLOBAL_DATAS,
     FORMS,
     FUNCTIONS,
     CLASSES,
     GLOBAL_CLASSES,
     INTFS,
     GLOBAL_INTFS,
     SUBRC,
     STMNT_REF,
     LEVEL_REF,
     SYMBOL,
     SYMBOL_CACHE,
     POSITIONS,
     POSITION_INDEX.
endmethod.


method ROLE_TO_TAG .
*---------------------------------------------------------------------*
*       METHOD ROLE_TO_TAG                                            *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  case P_ROLE.
    when SYNT_ROLE-NONE.         P_TAG = '??'.
    when SYNT_ROLE-WORD.         P_TAG = '??'.
    when SYNT_ROLE-KEYWORD.      P_TAG = '??'.
    when SYNT_ROLE-TYPE.         P_TAG = TAG_TYPE.
    when SYNT_ROLE-TABLE_KEY.    p_tag = TAG_TABLE_KEY.
    when SYNT_ROLE-FIELD.        P_TAG = TAG_DATA.
    when SYNT_ROLE-FIELD_LIST.   P_TAG = '??'.
    when SYNT_ROLE-COMPONENT.    P_TAG = TAG_TYPE.
    when SYNT_ROLE-EVENT.        P_TAG = TAG_EVENT.
    when SYNT_ROLE-DATABASE.     P_TAG = '??'.
    when SYNT_ROLE-FORM_PARAM.   P_TAG = '??'.
    when SYNT_ROLE-FORM.         P_TAG = TAG_FORM.
    when SYNT_ROLE-FUNCTION.     P_TAG = TAG_FUNCTION.
    when SYNT_ROLE-CUST_FUNCTION.P_TAG = TAG_CUST_FUNCTION.
    when SYNT_ROLE-PROGRAM.      P_TAG = TAG_PROGRAM.
    when SYNT_ROLE-REPORT.       P_TAG = TAG_PROGRAM.
    when SYNT_ROLE-INCLUDE.      P_TAG = TAG_INCLUDE.
    when SYNT_ROLE-TRANSACTION.  P_TAG = TAG_TRANSACTION.
    when SYNT_ROLE-DIALOG.       P_TAG = TAG_DIALOG.
    when SYNT_ROLE-SCREEN.       P_TAG = TAG_SCREEN.
    when SYNT_ROLE-TYPEPOOL.     P_TAG = TAG_TYPE_POOL.
    when SYNT_ROLE-FUNCTIONPOOL. P_TAG = TAG_FUNCTION_POOL.
    when SYNT_ROLE-MESSAGE.      P_TAG  = TAG_MESSAGE.
    when SYNT_ROLE-MESSAGE_ID.   P_TAG  = TAG_MESSAGE_ID.
    when SYNT_ROLE-MESSAGE_NUMB. P_TAG  = TAG_MESSAGE_NUMBER.
    when SYNT_ROLE-MESSAGE_TYPE. P_TAG  = TAG_MESSAGE_TYPE.
    when SYNT_ROLE-MACRO.        P_TAG  = TAG_MACRO.
    when SYNT_ROLE-RMAC_MACRO.   P_TAG  = TAG_RMAC_MACRO.
    when SYNT_ROLE-GROUP.        P_TAG  = TAG_GROUP.
    when SYNT_ROLE-BLOCK.        P_TAG  = TAG_BLOCK.
    when SYNT_ROLE-COMMON.       P_TAG  = TAG_COMMON_PART.
    when SYNT_ROLE-MODULE_IN.    P_TAG  = TAG_MODULE_IN.
    when SYNT_ROLE-MODULE_OUT.   P_TAG  = TAG_MODULE_OUT.
    when SYNT_ROLE-UNKNOWN.      P_TAG  = '??'.
    when SYNT_ROLE-VALUE.        P_TAG  = TAG_VALUE.
    when SYNT_ROLE-CLASS.        P_TAG  = TAG_TYPE.
    when SYNT_ROLE-INTERFACE.    P_TAG  = TAG_TYPE.
    when SYNT_ROLE-METHOD.       P_TAG  = TAG_METHOD.
    when SYNT_ROLE-LOCATION.     P_TAG  = '??'.
    when SYNT_ROLE-CONTROL.      P_TAG  = '??'.
    when SYNT_ROLE-FIELDAREA.    P_TAG  = '??'.
    when SYNT_ROLE-GLOBAL_CLASS. P_TAG  = TAG_TYPE.
    when SYNT_ROLE-ALIAS.        P_TAG  = '??'.
    when SYNT_ROLE-INFOTYPE.     P_TAG  = TAG_INFOTYPE.
    when SYNT_ROLE-MATCHCODE_OBJECT.
                                 P_TAG  = TAG_MATCHCODE.
    when SYNT_ROLE-TRANSFORMATION.
                                 P_TAG  = TAG_TRANSFORMATION.
    when SYNT_ROLE-BREAK_POINT.
                                 P_TAG  = TAG_BREAK_POINT.
    when SYNT_ROLE-ENH_EXIT.
                                 P_TAG  = TAG_ENHANCEMENT_EXIT.
    when SYNT_ROLE-ENH_IMPL.
                                 P_TAG  = TAG_ENHANCEMENT_IMPL.
    when SYNT_ROLE-ENH_SPOT.
                                 P_TAG  = TAG_ENHANCEMENT_SPOT.
    when others.
      P_TAG(1)   = '?'.
      P_TAG+1(1) = P_ROLE.
  endcase.
endmethod.                    "ROLE_TO_TAG


method SCAN .
*---------------------------------------------------------------------*
*       METHOD SCAN                                                   *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_SOURCE             type SCR_INCLUDE,
    L_SOURCE_WA          type STRING,
    L_TRDIR              type TRDIR,
    L_TRDIR_1            type TRDIR,
    L_TRDIR_INCLUDE      type TRDIR,
    L_REF_TRDIR          type ref to TRDIR,
    L_REF_TRDIR_INCLUDE  type ref to TRDIR,
    L_TOP                type PROGRAM,
    L_OK                 type SYCHAR01,
    L_INCLUDE            type PROGRAM,
    L_INCLUDES           like line of INCLUDES,
    L_GRADES             like line of GRADES,
    L_FILTER             type SYNT_FILTER,
    L_INCLUDE_CHECKSUM   type SCR_CRC64.

  if XCROSS is not initial.
    L_OK = 'X'.
  endif.

  if L_OK = 'X'.
    loop at GRADES into L_GRADES.
      if not L_GRADES-LOW in SCAN_GRADES.
        L_OK = ' '.
        exit.
      endif.
    endloop.
  endif.

  if L_OK = 'X'.
    loop at INCLUDES into L_INCLUDES.
      if not L_INCLUDES-LOW in SCAN_INCLUDES.
        L_OK = ' '.
        exit.
      endif.
    endloop.
  endif.

  if L_OK = 'X'.
    if INCLUDE_NAME is not initial.
      L_INCLUDE_CHECKSUM =
        GET_INCLUDE_CHECKSUM( P_REF_SOURCE = REF_SOURCE
                              P_REF_TRDIR  = REF_TRDIR ).
      if INCLUDE_CHECKSUM <> L_INCLUDE_CHECKSUM.
        L_OK = ' '.
      endif.
    endif.
  endif.

  check L_OK = ' '.

  clear:
    SCAN_INCLUDES,
    SCAN_GRADES.

  if LINES( TYPES ) > 0.
    RESET_SCAN( ).
  endif.

  if GRADE_DIRECT     in GRADES or
     GRADE_COMPONENTS in GRADES or
     GRADE_PROPERTIES in GRADES.
    L_FILTER    = SYNT_FILTER_ALL.
  else.
*   TODO
    L_FILTER    = SYNT_FILTER_ALL.
*    L_FILTER    = SYNT_FILTER_REQUIRED.
    SCAN_GRADES = GRADES.
  endif.



  if INCLUDE_NAME is not initial.
    if L_INCLUDE_CHECKSUM is initial.
      L_INCLUDE_CHECKSUM =
        GET_INCLUDE_CHECKSUM( P_REF_SOURCE = REF_SOURCE
                              P_REF_TRDIR  = REF_TRDIR ).
    endif.
    INCLUDE_CHECKSUM = L_INCLUDE_CHECKSUM.
  endif.

* if it has been created with an substitution table ==> do check for program
  if IS_FOR_PROGRAM = 'X'.
    SCAN_PROGRAM( ).
    return.
  endif.

* Bestimmen TRDIR
  select single * from TRDIR into L_TRDIR where NAME = PROGRAM.
  if SY-SUBRC <> 0.
    return.
  endif.

  if INCLUDE_NAME is not initial.
    if REF_TRDIR is initial.
      select single * from TRDIR into L_TRDIR_1 where NAME = INCLUDE_NAME.
      if SY-SUBRC <> 0. return. endif.
      get reference of L_TRDIR_1 into L_REF_TRDIR.
    else.
      L_REF_TRDIR = REF_TRDIR.
    endif.
  endif.

  if L_TRDIR-SUBC = 'I'. "Include
    concatenate 'REPORT'  PROGRAM '.' into L_SOURCE_WA separated by ' '.
    append L_SOURCE_WA  to L_SOURCE.
    concatenate 'INCLUDE' PROGRAM '.' into L_SOURCE_WA separated by ' '.
    append L_SOURCE_WA  to L_SOURCE.
    L_TRDIR_INCLUDE         = L_TRDIR.
    L_TRDIR_INCLUDE         = L_TRDIR.
    L_TRDIR_INCLUDE-NAME = ' '.
    L_TRDIR_INCLUDE-SUBC = '1'.
    L_TRDIR_INCLUDE-UCCHECK = IS_UNICODE_SYSTEM( ).
    SCAN_ITAB( P_PROGRAM     = SPACE
               P_SOURCE_MAIN = L_SOURCE
               P_SOURCE      = L_SOURCE
               P_TRDIR       = L_TRDIR
               P_TRDIR_MAIN  = L_TRDIR_INCLUDE
               P_FILTER      = L_FILTER
               P_INCLUDE     = SPACE ).
    return.
  endif.

  if ONLY_INTERFACE = 'X' and PROGRAM+30(1) = 'C'.
    read report PROGRAM into L_SOURCE.
    L_INCLUDE    = PROGRAM.
    L_INCLUDE+31 = 'I'.
    ACTIVATE_INCLUDE( exporting P_INCLUDE = L_INCLUDE
                      changing  P_SOURCE  = L_SOURCE ).
    L_TRDIR_INCLUDE      = L_TRDIR.
    L_TRDIR_INCLUDE-SUBC = 'I'.
    SCAN_ITAB( P_PROGRAM     = PROGRAM
               P_SOURCE      = L_SOURCE
               P_TRDIR_MAIN  = L_TRDIR
               P_TRDIR       = L_TRDIR_INCLUDE
               P_FILTER      = L_FILTER
               P_INCLUDE     = PROGRAM ).
    return.
  elseif ONLY_INTERFACE = 'X' and ( PROGRAM+30(1) <> 'I' and PROGRAM(3) <> '%_C' ).
    concatenate 'REPORT'  PROGRAM '.' into L_SOURCE_WA separated by ' '.
    append L_SOURCE_WA  to L_SOURCE.
    L_TRDIR_INCLUDE         = L_TRDIR.
    L_TRDIR_INCLUDE         = L_TRDIR.
    L_TRDIR_INCLUDE-NAME = ' '.
    L_TRDIR_INCLUDE-SUBC = '1'.
    SCAN_ITAB( P_PROGRAM     = PROGRAM
               P_SOURCE_MAIN = L_SOURCE
               P_SOURCE      = L_SOURCE
               P_TRDIR       = L_TRDIR
               P_TRDIR_MAIN  = L_TRDIR_INCLUDE
               P_FILTER      = L_FILTER
               P_INCLUDE     = SPACE ).
    return.
  elseif LINES( INCLUDES ) = 1.
    read table INCLUDES index 1 into L_INCLUDES.

    if L_INCLUDES-LOW <> PROGRAM and INCLUDE_NAME <> PROGRAM.
      if PROGRAM+30(1) = 'C'.
        read report PROGRAM into L_SOURCE.
        ACTIVATE_INCLUDE( exporting P_INCLUDE = L_INCLUDES-LOW
                          changing  P_SOURCE  = L_SOURCE ).
      elseif PROGRAM+30(1) = 'I'.
        read report PROGRAM into L_SOURCE.
      elseif CHECK_INCLUDE_NAME( L_INCLUDES-LOW ) = 'X'.
        concatenate PROGRAM+3(*) 'TOP' into L_TOP.
        concatenate 'INCLUDE' L_TOP '.' into L_SOURCE_WA separated by ' '.
        append      L_SOURCE_WA         to L_SOURCE.
        if L_TOP <> L_INCLUDES-LOW.
          concatenate 'INCLUDE' L_INCLUDES-LOW '.' into L_SOURCE_WA
                      separated by ' '.
          append L_SOURCE_WA to L_SOURCE.
        endif.
      endif.

      IF L_SOURCE is not initial.
      if INCLUDE_NAME = L_INCLUDES-LOW.
        L_REF_TRDIR_INCLUDE = L_REF_TRDIR.
      else.
        select single * from TRDIR into L_TRDIR_INCLUDE where NAME = L_INCLUDES-LOW.
        if SY-SUBRC <> 0. return. endif.
        get reference of L_TRDIR_INCLUDE into L_REF_TRDIR_INCLUDE.
      endif.

      if INCLUDE_NAME is initial.
        scan_itab( p_program     = program
                   p_source      = l_source
                   p_trdir_main  = l_trdir
                   p_trdir       = l_ref_trdir_include->*
                   p_filter      = l_filter
                   p_include     = program ).
      else.
        SCAN_ITAB( P_PROGRAM     = PROGRAM
                   P_SOURCE_MAIN = L_SOURCE
                   P_TRDIR_MAIN  = L_TRDIR
                   P_TRDIR       = L_REF_TRDIR_INCLUDE->*
                   P_INCLUDE     = INCLUDE_NAME
                   P_SOURCE      = REF_SOURCE->*
                   P_FILTER      = L_FILTER ).
      endif.

      if SUBRC = 0.
        L_OK = 'X'.
        append L_INCLUDES to SCAN_INCLUDES.
      endif.
      endif.
    endif.
  endif.

  if L_OK <> 'X'.
    if INCLUDE_NAME = PROGRAM.
      SCAN_ITAB( P_PROGRAM     = PROGRAM
                 P_SOURCE      = REF_SOURCE->*
                 P_TRDIR       = L_REF_TRDIR->*
                 P_TRDIR_MAIN  = L_REF_TRDIR->*
                 P_FILTER      = L_FILTER
                 P_INCLUDE     = PROGRAM ).
    elseif INCLUDE_NAME is not initial.
      SCAN_ITAB( P_PROGRAM     = PROGRAM
                 P_TRDIR_MAIN  = L_TRDIR
                 P_SOURCE      = REF_SOURCE->*
                 P_TRDIR       = L_REF_TRDIR->*
                 P_FILTER      = L_FILTER
                 P_INCLUDE     = INCLUDE_NAME ).
    else.
      read report PROGRAM into L_SOURCE.
      SCAN_ITAB( P_PROGRAM     = PROGRAM
                 P_SOURCE      = L_SOURCE
                 P_TRDIR       = L_TRDIR
                 P_TRDIR_MAIN  = L_TRDIR
                 P_FILTER      = L_FILTER
                 P_INCLUDE     = PROGRAM ).
    endif.
  endif.
endmethod.                    "SCAN


method SCAN_ITAB .
  data:
    L_ID_MAIN     type SYCHAR04,
    L_ID_PART_CHK type SYCHAR04,
    L_ID_ENH_700  type SYCHAR04,
    L_SOURCE_MAIN like P_SOURCE_MAIN,                       "#EC NEEDED
    L_MESSAGE     type STRING,                              "#EC NEEDED
    L_WORD(30)    type C,                                   "#EC NEEDED
    L_LINE        type I,                                   "#EC NEEDED
    L_DUMMY       type table of I.                          "#EC NEEDED


  if P_SOURCE_MAIN is supplied.
    L_ID_MAIN     = 'MAIN'.
    L_SOURCE_MAIN = P_SOURCE_MAIN.
  endif.

  if ID_ERRORS       is initial and
     ID_INFOS        is initial and
     ID_WARNINGS     is initial and
     ID_RAW_MESSAGES is initial.
    L_ID_PART_CHK = SYNT_ID-PART_CHK.
  endif.

  if NO_PACKAGE_CHECK = 'X'.
    L_ID_PART_CHK = SYNT_ID-PART_CHK.
  endif.

  if WITHOUT_NESTED_ENH = 'X'.
    L_ID_ENH_700 = 'E700'.
  endif.

  syntax-check for                        p_source
                 program                  p_program
                 filter                   p_filter
                 replacing                p_include
                 directory entry          p_trdir
                 frame entry              p_trdir_main

                 message                  l_message
                 line                     l_line
                 word                     l_word
* slin
*                 include                  slin_include
*                 offset                   slin_offset
                 shortdump-id             slin_rabaxid
* xcross

                 id l_id_main             table l_source_main

                 id l_id_part_chk         table l_dummy
                 id l_id_enh_700          table l_dummy

                 id synt_id-type          table types
                 id synt_id-typechild     table type_childs
                 id synt_id-table_key     table table_keys
                 id synt_id-data          table datas
                 id synt_id-dpar          table dpars
                 id synt_id-env           table envs
                 id synt_id-comp          table comps
                 id synt_id-xcro          table xcross
                 id synt_id-xcro_level    table levels
                 id synt_id-xcro_stmnt    table stmnts
                 id synt_id-predeftype    table predef_types
                 id synt_id-predefdata    table predef_datas
                 id synt_id-globtype      table global_types
                 id synt_id-globdata      table global_datas
                 id synt_id-forms         table forms
                 id synt_id-functions     table functions
                 id synt_id-classes       table classes
                 id synt_id-globclasses   table global_classes
                 id synt_id-interfaces    table intfs
                 id synt_id-globintf      table global_intfs
                 id synt_id-typepools     table typepools
                 id synt_id-pcomment      table pcomments
                 id synt_id-comment       table comments

                 id synt_id-err_msg       table errors
                 id 'usag'                table object_usage
                 id id_longtext           table longtext
                 id id_comments           table comments
                 id id_infos              table infos
                 id id_warnings           table warnings
                 id id_ignore_enh         table l_dummy
                 id id_enhancement_impls  table enhancement_impls
                 id id_test_1             table l_dummy
                 id id_test_2             table l_dummy
                 id id_test_3             table l_dummy
* slin
                 id id_slin_types         table slin_types
*                 id id_slin_datas         table slin_datas
                 id id_raw_messages       table slin_raw_messages
                 id id_includes           table slin_includes
                 id id_set_extended_stmts table slin_set_extended_stmts
                 id id_prog_intervals     table slin_prog_intervals
                 id id_crossref           table slin_crossref.
  SUBRC = SY-SUBRC.
endmethod.


method SCAN_PROGRAM.
  DATA:
    L_MESSAGE     type STRING,                              "#EC NEEDED
    L_ID_PART_CHK type SYCHAR04,
    L_ID_ENH_700   type SYCHAR04,
    L_WORD(30)    type C,                                   "#EC NEEDED
    L_LINE        type I,                                   "#EC NEEDED
    L_DUMMY       type table of I.                          "#EC NEEDED



  if ID_ERRORS       is initial and
     ID_INFOS        is initial and
     ID_WARNINGS     is initial and
     ID_RAW_MESSAGES is initial.
    L_ID_PART_CHK = SYNT_ID-PART_CHK.
  endif.

  if no_package_check = 'X'.
    L_ID_PART_CHK = SYNT_ID-PART_CHK.
  endif.

  if WITHOUT_NESTED_ENH = 'X'.
    L_ID_ENH_700 = 'E700'.
  endif.

*  L_ID_MAIN     = 'MAIN'.
  syntax-check for program program
                 filter                   synt_filter_all
                 replacing                incl_substitutions
                 message                  l_message
                 line                     l_line
                 word                     l_word
* slin
*                 include                  slin_include
*                 offset                   slin_offset
                 shortdump-id             slin_rabaxid
* xcross
*           what means this parameter?????
*                 id l_id_main             table l_source_main

                 id l_id_part_chk         table l_dummy
                 id l_id_enh_700          table l_dummy

                 id synt_id-err_msg       table errors
                 id synt_id-type          table types
                 id synt_id-typechild     table type_childs
                 id synt_id-table_key     table table_keys
                 id synt_id-data          table datas
                 id synt_id-dpar          table dpars
                 id synt_id-env           table envs
                 id synt_id-comp          table comps
                 id synt_id-xcro          table xcross
                 id synt_id-xcro_level    table levels
                 id synt_id-xcro_stmnt    table stmnts
                 id synt_id-predeftype    table predef_types
                 id synt_id-predefdata    table predef_datas
                 id synt_id-globtype      table global_types
                 id synt_id-globdata      table global_datas
                 id synt_id-forms         table forms
                 id synt_id-functions     table functions
                 id synt_id-classes       table classes
                 id synt_id-globclasses   table global_classes
                 id synt_id-interfaces    table intfs
                 id synt_id-globintf      table global_intfs
                 id synt_id-typepools     table typepools
                 id synt_id-pcomment      table pcomments
                 id synt_id-comment       table comments

                 id id_usage              table object_usage
                 id id_longtext           table longtext
                 id id_comments           table comments
                 id id_infos              table infos
                 id id_warnings           table warnings
                 id id_ignore_enh         table l_dummy
                 id id_enhancement_impls  table enhancement_impls
                 id id_test_1             table l_dummy.

* slin
*                 id id_slin_types         table slin_types
*                 id id_raw_messages       table slin_raw_messages
*                 id id_includes           table slin_includes
*                 id id_set_extended_stmts table slin_set_extended_stmts
*                 id id_prog_intervals     table slin_prog_intervals
*                 id id_crossref           table slin_crossref.
  SUBRC = SY-SUBRC.
endmethod.


method SET_DEFAULT.

  if P_WARNINGS = ' ' and
     P_INFOS    = ' ' and
     P_LONGTEXT = ' ' and
     P_COMMENTS = ' '.
    clear: DEF_WARNINGS, DEF_INFOS, DEF_LONGTEXT, DEF_COMMENTS.
    return.
  endif.

  if P_WARNINGS = 'X'.
    DEF_WARNINGS = SYNT_ID-WARN_MSG.
  endif.

  if P_INFOS = 'X'.
    DEF_INFOS = SYNT_ID-INFO_MSG.
  endif.

  if P_LONGTEXT = 'X'.
    DEF_LONGTEXT = SYNT_ID-LONGTEXT.
  endif.

  if P_COMMENTS = 'X'.
    DEF_COMMENTS = SYNT_ID-COMMENT.
  endif.

endmethod.


method SET_INCLUDES .
* den Wirkungsbereich der Analyse auf die übergebenen Includes einschränken!
  data:
    L_INCLUDES like line of INCLUDES.

  clear INCLUDES.

  if P_INCLUDE is supplied.
    if P_INCLUDE <> ' '.
      L_INCLUDES-SIGN   = 'I'.
      L_INCLUDES-OPTION = 'EQ'.
      L_INCLUDES-LOW    = P_INCLUDE.
      append L_INCLUDES to INCLUDES.
      if P_INCLUDES is supplied.
        message X001(38) with 'P_INCLUDE und P_INCLUDES'(003) 'dürfen nicht beide angegeben werden'(002).
      endif.
    endif.
  elseif P_INCLUDES is supplied.
    L_INCLUDES-SIGN   = 'I'.
    L_INCLUDES-OPTION = 'EQ'.
    L_INCLUDES-LOW    = P_INCLUDE.
    loop at P_INCLUDES into L_INCLUDES-LOW.
      append L_INCLUDES to INCLUDES.
    endloop.
  endif.
endmethod.                    "


method SET_INCLUDE_SOURCE.
  if is_for_program = 'X'.
    message X001(38) with 'Instanz läßt keine Include-Manipulationen zu'(023).
  endif.

  if P_REF_SOURCE is not supplied AND
     p_ref_trdir  IS not supplied.
    if P_NAME <> INCLUDE_NAME.
      raise INVALID_INCLUDE_NAME.
    endif.
    clear: REF_SOURCE, REF_TRDIR, INCLUDE_NAME.
  else.
    INCLUDE_NAME = P_NAME.
    REF_SOURCE   = P_REF_SOURCE.
    REF_TRDIR    = P_REF_TRDIR.
  endif.
endmethod.                    "


method SINGLE_REF_FOUND .
*---------------------------------------------------------------------*
*       METHOD GET_ALL                                                *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_REF like P_PREV_REF.


  case P_GRADE.
    when GRADE_DEFINITION.
      check P_DEF = 'X'.
      L_REF-GRADE = GRADE_DEFINITION.
    when GRADE_DIRECT.
      check P_DEF = ' '.
      L_REF-GRADE = GRADE_DIRECT.
    when GRADE_DEF_TO_DIRECT.
*      check P_DEF = 'X'.
      L_REF-GRADE = GRADE_DIRECT.
    when GRADE_DEFINITION_INTF.
      L_REF-GRADE = GRADE_DEFINITION.
    when GRADE_PROPERTIES.
      check P_DEF = ' '.
      L_REF-GRADE = GRADE_PROPERTIES.
    when GRADE_DEF_TO_PROPERTIES.
      L_REF-GRADE = GRADE_PROPERTIES.
    when GRADE_COMPONENTS.
      L_REF-GRADE = GRADE_COMPONENTS.
    when others.
      assert 0 = 1.
  endcase.


  L_REF-STATEMENT = GET_STATEMENT_INFO( P_XCROSS-STMNT ).


  if P_XCROSS-COLUMN < 0.
    if  P_XCROSS-ROLE = SYNT_ROLE-ENH_IMPL.
      L_REF-LINE      = P_XCROSS-LINE.
      L_REF-COLUMN    = - P_XCROSS-COLUMN - 1.
      L_REF-NAME      = ' '.
    else.
      L_REF-LINE      = MACRO_LINE.
      L_REF-COLUMN    = MACRO_COLUMN.
      L_REF-NAME      = MACRO_NAME.
    endif.
  elseif L_REF-GRADE <= GRADE_COMPONENTS.
    L_REF-LINE      = P_XCROSS-LINE.
    L_REF-COLUMN    = P_XCROSS-COLUMN + P_OFFSET.
    L_REF-NAME      = P_NAME.
  else.
    L_REF-LINE      = P_XCROSS-LINE.
    L_REF-COLUMN    = P_XCROSS-COLUMN + P_OFFSET.
    L_REF-NAME      = P_NAME.
  endif.
  L_REF-FULL_NAME = P_FULL_NAME.
  L_REF-TAG       = GET_TAG_OF_FULL_NAME( L_REF-FULL_NAME ).
  L_REF-MODE1     = P_MODE1.
  L_REF-MODE2     = P_MODE2.

  if P_EXTENDED = 'X'.
    read table SYMBOL_CACHE with table key FULL_NAME = P_FULL_NAME
                              into SYMBOL.
    if SY-SUBRC = 0.
      L_REF-SYMBOL = SYMBOL-SYMBOL.
    else.
      GET_SYMBOL ANY L_REF-SYMBOL L_REF-FULL_NAME L_REF-TAG =.
    endif.

  endif.


  if L_REF <> P_PREV_REF.
    append L_REF to P_RESULT.
    P_PREV_REF = L_REF.
  endif.

endmethod.


method TAG_NAME .
  concatenate '\' P_TAG ':' P_NAME into P_RESULT.
endmethod.


method TAG_NAME_2 .
*---------------------------------------------------------------------*
*       METHOD TAG_NAME_2                                             *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  concatenate '\' P_TAG_1 ':' P_NAME_1
              '\' P_TAG_2 ':' P_NAME_2 into P_RESULT.
endmethod.                                                  "TAG_NAME_2


method TAG_TO_ROLE .
*---------------------------------------------------------------------*
*       METHOD ROLE_TO_TAG                                            *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

  case P_TAG.
    when TAG_TYPE.            P_ROLE = SYNT_ROLE-TYPE.
    when TAG_TABLE_KEY.       P_ROLE = SYNT_ROLE-TABLE_KEY.
    when TAG_DATA.            P_ROLE = SYNT_ROLE-FIELD.
    when TAG_INFOTYPE.        P_ROLE = SYNT_ROLE-INFOTYPE.
    when TAG_FORM.            P_ROLE = SYNT_ROLE-FORM.
    when TAG_FUNCTION.        P_ROLE = SYNT_ROLE-FUNCTION.
    when TAG_CUST_FUNCTION.   P_ROLE = SYNT_ROLE-CUST_FUNCTION.
    when TAG_PROGRAM.         P_ROLE = SYNT_ROLE-PROGRAM.
    when TAG_INCLUDE.         P_ROLE = SYNT_ROLE-INCLUDE.
    when TAG_TRANSACTION.     P_ROLE = SYNT_ROLE-TRANSACTION.
    when TAG_DIALOG.          P_ROLE = SYNT_ROLE-DIALOG.
    when TAG_SCREEN.          P_ROLE = SYNT_ROLE-SCREEN.
    when TAG_TITLE.           P_ROLE = SYNT_ROLE-TITLE.
    when TAG_TYPE_POOL.       P_ROLE = SYNT_ROLE-TYPEPOOL.
    when TAG_FUNCTION_POOL.   P_ROLE = SYNT_ROLE-FUNCTIONPOOL.
    when TAG_MESSAGE_ID.      P_ROLE = SYNT_ROLE-MESSAGE_ID.
    when TAG_MESSAGE_NUMBER.  P_ROLE = SYNT_ROLE-MESSAGE_NUMB.
    when TAG_MACRO.           P_ROLE = SYNT_ROLE-MACRO.
    when TAG_RMAC_MACRO.      P_ROLE = SYNT_ROLE-RMAC_MACRO.
    when TAG_GROUP.           P_ROLE = SYNT_ROLE-GROUP.
    when TAG_BLOCK.           P_ROLE = SYNT_ROLE-BLOCK.
    when TAG_COMMON_PART.     P_ROLE = SYNT_ROLE-COMMON.
    when TAG_MODULE_IN.       P_ROLE = SYNT_ROLE-MODULE_IN.
    when TAG_MODULE_OUT.      P_ROLE = SYNT_ROLE-MODULE_OUT.
    when TAG_METHOD.          P_ROLE = SYNT_ROLE-METHOD.
    when TAG_EVENT.           P_ROLE = SYNT_ROLE-EVENT.
    when TAG_MATCHCODE.       P_ROLE = SYNT_ROLE-MATCHCODE_OBJECT.
    when TAG_SET_GET_ID.      P_ROLE = SYNT_ROLE-SET_GET_ID.
    when TAG_AUTHORITY_OBJECT.P_ROLE = SYNT_ROLE-AUTH_OBJ.
    when TAG_PF_STATUS.       P_ROLE = SYNT_ROLE-PF_STATUS.
    when TAG_TRANSFORMATION.  P_ROLE = SYNT_ROLE-TRANSFORMATION.
    when TAG_BREAK_POINT.     P_ROLE = SYNT_ROLE-BREAK_POINT.
    when TAG_ENHANCEMENT_EXIT.P_ROLE = SYNT_ROLE-ENH_EXIT.
    when TAG_ENHANCEMENT_IMPL.P_ROLE = SYNT_ROLE-ENH_IMPL.
    when TAG_ENHANCEMENT_SPOT.P_ROLE = SYNT_ROLE-ENH_SPOT.
    when TAG_AT_SELECTION_SCREEN
      or TAG_AT_SELECTION_SCREEN_ON
      or TAG_AT_SELECTION_SCREEN_ON_END
      or TAG_AT_SELECTION_SCREEN_HELP
      or TAG_AT_SELECTION_SCREEN_VALUE
      or TAG_AT_SELECTION_SCREEN_RADIO
      or TAG_AT_SELECTION_SCREEN_BLOCK
      or TAG_AT_SELECTION_SCREEN_EXIT
      or TAG_AT_SELECTION_SCREEN_OUTPUT
      or TAG_AT_PF
      or TAG_GET
      or TAG_GET_LATE
      or TAG_END_OF_EDITING
      or TAG_END_OF_SELECTION
      or TAG_INITIALIZATION
      or TAG_LOAD_OF_PROGRAM
      or TAG_START_OF_EDITING
      or TAG_START_OF_SELECTION
      or TAG_TOP_OF_PAGE
      or TAG_TOP_OF_PAGE_LINE_SELECTION
      or TAG_AT_USER_COMMAND
      or TAG_AT_LINE_SELECTION.
                              P_ROLE = SYNT_ROLE-EVENT_KEYWORD.
    when TAG_ANY.             P_ROLE = SYNT_ROLE-UNKNOWN.
    when others.              P_ROLE = SYNT_ROLE-UNKNOWN.
  endcase.
endmethod.                    "TAG_TO_ROLE


method TEST_CHECK .
*---------------------------------------------------------------------*
*       METHOD SCAN                                                   *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_SOURCE        type table of STRING,                   "#EC NEEDED
    L_TRDIR         type TRDIR,                             "#EC NEEDED
    L_MESSAGE(240)  type C,                                 "#EC NEEDED
    L_WORD          type SYCHAR30,                          "#EC NEEDED
    L_LINE          type I,                                 "#EC NEEDED
    L_TIME_1        type I,                                 "#EC NEEDED
    L_TIME_2        type I,                                 "#EC NEEDED
    L_TRACE_LIST    like P_TRACE_LIST.

  read report P_NAME into L_SOURCE.
  select single * from TRDIR into L_TRDIR where NAME = P_NAME.
  check SY-SUBRC = 0.
  P_TIME = MAX_TIME.

  do P_TRYS times.
    call 'SYNTAX_TRACE' id 'MODE' field 'START'. "#EC CI_CCALL
    get run time field L_TIME_1.
    syntax-check for             L_SOURCE
                 directory entry L_TRDIR
                 message         L_MESSAGE
                 line            L_LINE
                 word            L_WORD.
    get run time field L_TIME_2.
    clear L_TRACE_LIST.
    call 'SYNTAX_TRACE' id 'MODE'   field 'STOP' "#EC CI_CCALL
                        id 'RESULT' field L_TRACE_LIST.
    subtract L_TIME_1 from L_TIME_2.
    if L_TIME_2 < P_TIME.
      P_TIME       = L_TIME_2.
      P_TRACE_LIST = L_TRACE_LIST.
    endif.
  enddo.
endmethod.                    "SCAN


method TEST_FULL_NAME .
  data:
    L_OBJ_DESCR type OBJINFO,
    L_FULL_NAME type STRING.

  SCAN( ).

  if SUBRC = 8 or lines( TYPES ) = 0.
    raise program_fatal_syntax_error.
  endif.

  try.
      if P_FULL_NAME(2) = '*\'.
        concatenate '\PR:' PROGRAM  P_FULL_NAME+1(*) into L_FULL_NAME.
        L_OBJ_DESCR = FIND_FULL_NAME( L_FULL_NAME ).

        if L_OBJ_DESCR-OBJ_ID = 0.
          L_FULL_NAME = P_FULL_NAME+1(*).
          L_OBJ_DESCR = FIND_FULL_NAME( L_FULL_NAME ).
        endif.
      else.
        L_OBJ_DESCR = FIND_FULL_NAME( P_FULL_NAME ).
      endif.

      if L_OBJ_DESCR-OBJ_ID <> 0.
        IF P_EXTERN = 'X'.
          P_RESULT = CHECK_EXTERN( L_OBJ_DESCR ).
        ELSE.
          P_RESULT = 'X'.
        ENDIF.
      else.
        P_RESULT = ' '.
      endif.

    catch LCX_FULL_NAME_SYNTAX_ERROR.                   "#EC NO_HANDLER

    catch LCX_OBJECT_NOT_FOUND.                         "#EC NO_HANDLER

    catch LCX_READ_TABLE_ERROR.                         "#EC NO_HANDLER

    catch LCX_RECURSIVE_DEFINITION.                     "#EC NO_HANDLER

  endtry.

endmethod.


method TEST_SCAN .
*---------------------------------------------------------------------*
*       METHOD SCAN                                                   *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_SOURCE        type table of STRING,                   "#EC NEEDED
    L_TRDIR         type TRDIR,                             "#EC NEEDED
    L_REF           type ref to CL_ABAP_COMPILER,
    L_TIME_1        type I,                                 "#EC NEEDED
    L_TIME_2        type I,                                 "#EC NEEDED
    L_TRACE_LIST    like P_TRACE_LIST.

  read report P_NAME into L_SOURCE.
  select single * from TRDIR into L_TRDIR where NAME = P_NAME.
  check SY-SUBRC = 0.
  P_TIME = MAX_TIME.

  do P_TRYS times.
    create object L_REF exporting P_NAME = P_NAME.
    if P_SLIN = 'X'.
      L_REF->ID_RAW_MESSAGES       = SYNT_ID-TRMSG_RAW.
      L_REF->ID_LONGTEXT           = SYNT_ID-LONGTEXT.
      L_REF->ID_INCLUDES           = SYNT_ID-INCLUDE.
      L_REF->ID_COMMENTS           = SYNT_ID-SCOM.
      L_REF->ID_PROG_INTERVALS     = SYNT_ID-PROG.
      L_REF->ID_CROSSREF           = SYNT_ID-CROSS.
      L_REF->ID_SLIN_TYPES         = SYNT_ID-OTYP.
    endif.

    call 'SYNTAX_TRACE' id 'MODE' field 'START'. "#EC CI_CCALL

    get run time field L_TIME_1.

    L_REF->SCAN_ITAB( P_PROGRAM     = P_NAME
                      P_SOURCE      = L_SOURCE
                      P_TRDIR       = L_TRDIR
                      P_TRDIR_MAIN  = L_TRDIR
                      P_FILTER      = SYNT_FILTER_ALL
                      P_INCLUDE     = P_NAME ).

    get run time field L_TIME_2.

    clear L_TRACE_LIST.
    call 'SYNTAX_TRACE' id 'MODE'   field 'STOP'
                        id 'RESULT' field L_TRACE_LIST. "#EC CI_CCALL
    subtract L_TIME_1 from L_TIME_2.
    if L_TIME_2 < P_TIME.
      P_TIME = L_TIME_2.
      P_TRACE_LIST = L_TRACE_LIST.
    endif.
  enddo.
endmethod.                    "SCAN


method TEST_SCAN_INCLUDE .
*---------------------------------------------------------------------*
*       METHOD SCAN                                                   *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  data:
    L_REF           type ref to CL_ABAP_COMPILER,
    L_TIME_1        type I,
    L_TIME_2        type I,
    L_TRACE_LIST    like p_trace_list.

  create object L_REF exporting P_NAME    = P_NAME
                                P_INCLUDE = P_INCLUDE.
  if P_SLIN = 'X'.
    L_REF->ID_RAW_MESSAGES       = SYNT_ID-TRMSG_RAW.
    L_REF->ID_LONGTEXT           = SYNT_ID-LONGTEXT.
    L_REF->ID_INCLUDES           = SYNT_ID-INCLUDE.
    L_REF->ID_COMMENTS           = SYNT_ID-SCOM.
    L_REF->ID_PROG_INTERVALS     = SYNT_ID-PROG.
    L_REF->ID_CROSSREF           = SYNT_ID-CROSS.
    L_REF->ID_SLIN_TYPES         = SYNT_ID-OTYP.
  endif.

  P_TIME = MAX_TIME.

  do P_TRYS times.

    L_REF->RESET_SCAN( ).

    CALL 'SYNTAX_TRACE' ID 'MODE' FIELD 'START'.  "#EC CI_CCALL

    get run time field L_TIME_1.

    L_REF->SCAN( ).

    get run time field L_TIME_2.

    CLEAR l_trace_list.
    CALL 'SYNTAX_TRACE' ID 'MODE'   FIELD 'STOP'
                        ID 'RESULT' FIELD l_trace_list.  "#EC CI_CCALL

    subtract L_TIME_1 from L_TIME_2.
    if L_TIME_2 < P_TIME.
      P_TIME       = L_TIME_2.
      P_TRACE_LIST = l_TRACE_LIST.
    endif.
  enddo.
endmethod.                    "SCAN


method TYPE_COMP_NAME .
*---------------------------------------------------------------------*
*       METHOD TYPE_COMP_NAME                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

  data:
    L_PARENT     type STRING,
    L_NAME       type STRING,
    L_KIND       type SYNT_STRUC_TYPE_OBJ-KIND.

  field-symbols:
    <L_TYPE_ENTRY> type SYNT_STRUC_TYPE_OBJ.


  clear P_RESULT.

  check P_TYPE_ID <> 0.

*
* get type descriptor
*
  READ_TABLE_INDEX TYPES P_TYPE_ID <L_TYPE_ENTRY>.
  FIND_ERROR = 'CT'.
  check SY-SUBRC = 0.
  FIND_ERROR = SPACE.

  L_NAME = <L_TYPE_ENTRY>-STR.

  if <L_TYPE_ENTRY>-PARENT_INDEX <> 0.
* process different types of parents
    case <L_TYPE_ENTRY>-PARENT_KIND.

      when SYNT_PARENT_KIND-KIND_TYPE.
*     get parent's name
        call method TYPE_COMP_NAME
          exporting
            P_ENV_ID  = P_ENV_ID
            P_TYPE_ID = <L_TYPE_ENTRY>-PARENT_INDEX
          importing
            P_RESULT  = L_PARENT.
        if FIND_ERROR <> SPACE.
          return.
        endif.
*     process different kinds of types
        READ_TABLE_INDEX TYPES <L_TYPE_ENTRY>-PARENT_INDEX <L_TYPE_ENTRY>.
        if SY-SUBRC = 0.
          L_KIND = <L_TYPE_ENTRY>-KIND.
        else.
          L_KIND = '!'.
        endif.

        case L_KIND.

          when SYNT_TYPE-STRUC1-ATYP or SYNT_TYPE-STRUC2-ATYP.
            concatenate L_PARENT PREFIX_FOR_TAGS TAG_TYPE ':'
            L_NAME
                   into P_RESULT.

          when SYNT_TYPE-TABLE-ATYP.
            concatenate L_PARENT PREFIX_FOR_TAGS TAG_LINE_OF into
            P_RESULT.

          when others.
            concatenate L_PARENT PREFIX_FOR_TAGS TAG_UNKNOWN into
            P_RESULT.

        endcase.

      when SYNT_PARENT_KIND-KIND_DATA.
*     get parent's name
        call method DATA_COMP_NAME
          exporting
            P_ENV_ID  = P_ENV_ID
            P_DATA_ID = <L_TYPE_ENTRY>-PARENT_INDEX
          importing
            P_RESULT  = L_PARENT.
        if FIND_ERROR <> SPACE.
          return.
        endif.
*        if not L_NAME is initial.
**        name = '!ERROR!'.
*          FIND_ERROR = 'ET'.
*          clear P_RESULT.
*          return.
*        endif.
        concatenate L_PARENT PREFIX_FOR_TAGS TAG_TYPE_OF L_NAME into P_RESULT.

      when SYNT_PARENT_KIND-KIND_ENV.
        if <L_TYPE_ENTRY>-TYPELOC = SYNT_LOC-POOL.
          if L_NAME is initial.
*          name = '???'.
            FIND_ERROR = '?T'.
            clear P_RESULT.
            return.
          endif.
          concatenate PREFIX_FOR_TAGS TAG_TYPE ':' L_NAME
                 into P_RESULT.
        else.
*       get parent's name

          ENV_COMP_NAME( exporting P_ENV_ID      = P_ENV_ID
                                   P_COMP_ENV_ID = <L_TYPE_ENTRY>-PARENT_INDEX
                         importing P_RESULT      = L_PARENT )
                         .
          if FIND_ERROR ne SPACE.
            return.
          endif.
          if L_NAME is initial.
*          name = '!ERROR!'.
            FIND_ERROR = 'ET'.
            clear P_RESULT.
            return.
          endif.
          concatenate L_PARENT PREFIX_FOR_TAGS TAG_TYPE ':' L_NAME
                 into P_RESULT.
        endif.

    endcase.
* Done !
    return.
  endif.

*
* no parent ...
*
  case <L_TYPE_ENTRY>-TYPELOC.

* process different type locations
    when SYNT_LOC-DDIC.
      if L_NAME is initial.
        L_NAME = P_TYPE_ID.
        concatenate PREFIX_FOR_TAGS TAG_SHARED_TYPE ':' L_NAME into P_RESULT.
        return.
      endif.
      concatenate PREFIX_FOR_TAGS TAG_TYPE ':' L_NAME into P_RESULT.

    when SYNT_LOC-PREDEF.
      if L_NAME is initial.
*      name = '!ERROR!'.
        FIND_ERROR = 'ET'.
        clear P_RESULT.
        return.
      endif.
      concatenate PREFIX_FOR_TAGS TAG_PREDEF_TYPE ':' L_NAME into P_RESULT.

    when SYNT_LOC-SHARED.
      L_NAME = |{ p_type_id }|.
      concatenate PREFIX_FOR_TAGS TAG_SHARED_TYPE ':' L_NAMe into P_RESULT.


    when SYNT_LOC-SYS.
      concatenate PREFIX_FOR_TAGS TAG_SYSTEM_TYPE ':NULL' into P_RESULT.
      if not L_NAME is initial.
*      CONCATENATE p_result '!ERROR!' INTO p_result.
        FIND_ERROR = 'ET'.
        clear P_RESULT.
        return.
      endif.

    when others.
      FIND_ERROR = 'FT'.
      clear P_RESULT.

  endcase.

endmethod.                    "TYPE_COMP_NAME


method TYPE_FULL_NAME .
*---------------------------------------------------------------------*
*       METHOD TYPE_FULL_NAME                                         *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*

  FIND_ERROR = SPACE.
  TYPE_COMP_NAME( exporting P_ENV_ID  = 0
                            P_TYPE_ID = P_TYPE_ID
                  importing p_result  = P_result ).

endmethod.                    "TYPE_FULL_NAME
ENDCLASS.