├── src ├── parl │ ├── zadcoset_parallel.fugr.lzadcoset_paralleltop.abap │ ├── zif_adcoset_parl_result_recv.intf.abap │ ├── package.devc.xml │ ├── zadcoset_parallel.fugr.lzadcoset_paralleltop.xml │ ├── zadcoset_parallel.fugr.saplzadcoset_parallel.xml │ ├── zcl_adcoset_parl_task_runner.clas.xml │ ├── zif_adcoset_parl_result_recv.intf.xml │ ├── zif_adcoset_parl_task_runner.intf.abap │ ├── zadcoset_parallel.fugr.saplzadcoset_parallel.abap │ ├── zcl_adcoset_parl_proc_utils.clas.xml │ ├── zif_adcoset_parl_task_runner.intf.xml │ ├── zadcoset_parallel.fugr.zadcoset_new_task.abap │ └── zadcoset_parallel.fugr.xml ├── zif_adcoset_version.intf.abap ├── package.devc.xml ├── adt │ ├── package.devc.xml │ ├── zadcoset_search_scope.xslt.xml │ ├── zadcoset_search_result.xslt.xml │ ├── zadcoset_adt_obj_ref.xslt.xml │ ├── zadcoset_search_settings.xslt.xml │ ├── zadcoset_adt_plugin_features.xslt.xml │ ├── zadcoset_search_scope_params.xslt.xml │ ├── zif_adcoset_ty_adt_types.intf.xml │ ├── zcl_adcoset_adt_disc_app.clas.xml │ ├── zcl_adcoset_adt_obj_factory.clas.xml │ ├── zcl_adcoset_adt_res_search.clas.xml │ ├── zcl_adcoset_adt_res_features.clas.xml │ ├── zcl_adcoset_adt_res_trreq_vh.clas.xml │ ├── zcl_adcoset_adt_res_cs_scope.clas.xml │ ├── zcl_adcoset_res_server_grp_vh.clas.xml │ ├── zcl_adcoset_adt_res_swcomp_vh.clas.xml │ ├── zcl_adcoset_adt_res_trtype_vh.clas.xml │ ├── zcl_adcoset_adt_res_applc_vh.clas.xml │ ├── zcl_adcoset_adt_res_pattrnval.clas.xml │ ├── zcl_adcoset_adt_res_cs_config.clas.xml │ ├── zcl_adcoset_adt_res_search.clas.abap │ ├── zcx_adcoset_adt_rest.clas.xml │ ├── zadcoset_search_scope.xslt.source.xml │ ├── zadcoset_search_scope_params.xslt.source.xml │ ├── zcl_adcoset_adt_res_swcomp_vh.clas.abap │ ├── zcl_adcoset_res_server_grp_vh.clas.abap │ ├── zcl_adcoset_adt_res_trtype_vh.clas.abap │ ├── zadcoset_search_settings.xslt.source.xml │ ├── zif_adcoset_adt_obj_factory.intf.xml │ ├── zcl_adcoset_adt_res_applc_vh.clas.abap │ ├── zcl_adcoset_adt_request_util.clas.xml │ ├── zcl_adcoset_adt_ch_factory.clas.xml │ ├── zif_adcoset_adt_obj_factory.intf.abap │ ├── zadcoset_adt_plugin_features.xslt.source.xml │ ├── zcx_adcoset_adt_rest.clas.abap │ ├── zcl_adcoset_adt_ch_factory.clas.abap │ ├── zcl_adcoset_adt_res_cs_config.clas.abap │ └── zadcoset_adt_obj_ref.xslt.source.xml ├── zcx_adcoset_no_matcher.clas.abap ├── zcx_adcoset_no_provider.clas.abap ├── zcx_adcoset_src_code_read.clas.abap ├── zcx_adcoset_pattern_sh_error.clas.abap ├── zcx_adcoset_no_src_code_reader.clas.abap ├── zif_adcoset_src_code_searcher.intf.abap ├── zif_adcoset_search_query.intf.abap ├── zadcoset_i_searchabletable.ddls.xml ├── zadcoset_i_sourcecodeobject.ddls.xml ├── zadcoset_i_transportsrccodobj.ddls.xml ├── zif_adcoset_src_code_reader.intf.abap ├── zif_adcoset_version.intf.xml ├── zcl_adcoset_pcre_matcher.clas.xml ├── zcl_adcoset_source_code.clas.xml ├── zif_adcoset_c_pattern_matching.intf.xml ├── zif_adcoset_source_code.intf.xml ├── zcl_adcoset_api_state_util.clas.xml ├── zcl_adcoset_scr_ddls.clas.xml ├── zcl_adcoset_scs_base.clas.xml ├── zcl_adcoset_scs_standard.clas.xml ├── zcl_adcoset_search_query.clas.xml ├── zcl_adcoset_search_scope.clas.xml ├── zcl_adcoset_csp_prog.clas.xml ├── zcl_adcoset_scr_dcls.clas.xml ├── zcl_adcoset_scr_ddlx.clas.xml ├── zcl_adcoset_scr_srvd.clas.xml ├── zcl_adcoset_scs_sequential.clas.xml ├── zcl_adcoset_csp_tabl.clas.xml ├── zcl_adcoset_scr_tabl.clas.xml ├── zcl_adcoset_search_scope_base.clas.xml ├── zcl_adcoset_scr_reposrc.clas.xml ├── zcl_adcoset_tr_obj_processor.clas.xml ├── zcl_adcoset_search_scope_final.clas.xml ├── zif_adcoset_code_search_prov.intf.abap ├── zcl_adcoset_parl_search_query.clas.xml ├── zcl_adcoset_posix_regex_matchr.clas.xml ├── zcx_adcoset_no_matcher.clas.xml ├── zcl_adcoset_substring_matcher.clas.xml ├── zcx_adcoset_no_provider.clas.xml ├── zcx_adcoset_src_code_read.clas.xml ├── zcx_adcoset_pattern_sh_error.clas.xml ├── zcx_adcoset_no_src_code_reader.clas.xml ├── zcl_adcoset_scs_sequ_extended.clas.xml ├── zif_adcoset_source_code.intf.abap ├── zif_adcoset_src_code_searcher.intf.xml ├── zif_adcoset_code_search_prov.intf.xml ├── zif_adcoset_src_code_reader.intf.xml ├── zcl_adcoset_csp_factory.clas.xml ├── zcl_adcoset_scs_factory.clas.xml ├── zcl_adcoset_csp_clas.clas.xml ├── zcl_adcoset_search_query_fac.clas.xml ├── zcl_adcoset_message_util.clas.xml ├── zcl_adcoset_scr_factory.clas.xml ├── zcl_adcoset_csp_fugr.clas.xml ├── zadcoset_scope_type.dtel.xml ├── zcl_adcoset_search_settings.clas.xml ├── zcx_adcoset_static_error.clas.xml ├── zcl_adcoset_csp_strsrc_default.clas.xml ├── zcl_adcoset_csp_repsrc_default.clas.xml ├── zcl_adcoset_pattern_util.clas.xml ├── zif_adcoset_search_query.intf.xml ├── zadcoset_scope_type.doma.xml ├── zcl_adcoset_matcher_factory.clas.xml ├── zadcoset_i_searchabletable.ddls.asddls ├── zcl_adcoset_search_scope_fac.clas.xml ├── zcl_adcoset_search_scope_final.clas.abap ├── zcl_adcoset_extensions_util.clas.xml ├── zcl_adcoset_pcre_util.clas.xml ├── zcl_adcoset_csp_strsrc_default.clas.abap ├── zcl_adcoset_search_scope_tr.clas.xml ├── zcl_adcoset_search_engine.clas.xml ├── zcl_adcoset_search_settings.clas.abap ├── zcl_adcoset_cds_name_mapper.clas.xml ├── zif_adcoset_pattern_matcher.intf.xml ├── zcl_adcoset_string_util.clas.xml ├── zcl_adcoset_message_util.clas.abap ├── zcl_adcoset_log.clas.xml ├── zif_adcoset_c_pattern_matching.intf.abap ├── zcl_adcoset_devc_reader.clas.xml ├── zcl_adcoset_source_code.clas.abap ├── zif_adcoset_pattern_matcher.intf.abap ├── zif_adcoset_search_scope.intf.abap ├── zcl_adcoset_pcre_util.clas.abap ├── zif_adcoset_search_scope.intf.xml ├── zcl_adcoset_search_scope_tr.clas.testclasses.abap ├── zadcoset_i_sourcecodeobject.ddls.asddls ├── zif_adcoset_c_global.intf.xml ├── zcx_adcoset_static_error.clas.abap ├── zcl_adcoset_search_scope_fac.clas.abap ├── zcl_adcoset_scs_factory.clas.abap ├── zadcoset_csscope.tabl.xml ├── zcl_adcoset_scr_reposrc.clas.abap ├── zcl_adcoset_scs_standard.clas.abap ├── zcl_adcoset_csp_repsrc_default.clas.abap ├── zcl_adcoset_search_protocol.clas.xml ├── zcl_adcoset_scr_dcls.clas.abap ├── zadcoset_csset.tabl.xml ├── zcl_adcoset_scr_srvd.clas.abap ├── zcl_adcoset_scr_ddlx.clas.abap ├── zcl_adcoset_log.clas.abap ├── zcl_adcoset_substring_matcher.clas.abap ├── zcl_adcoset_parl_search_query.clas.abap ├── zcl_adcoset_scr_ddls.clas.abap ├── zcl_adcoset_search_query_fac.clas.abap ├── zif_adcoset_ty_global.intf.xml ├── zcl_adcoset_matcher_factory.clas.abap ├── zcl_adcoset_string_util.clas.abap ├── zcl_adcoset_search_protocol.clas.abap ├── zadcoset_i_transportsrccodobj.ddls.asddls ├── zcl_adcoset_cds_name_mapper.clas.abap ├── zcl_adcoset_api_state_util.clas.abap ├── zcl_adcoset_devc_reader.clas.abap └── zcl_adcoset_extensions_util.clas.abap ├── SECURITY.md ├── package.json ├── .abapgit.xml ├── LICENSE ├── changelog.txt ├── .github └── workflows │ └── stale.yml └── README.md /src/parl/zadcoset_parallel.fugr.lzadcoset_paralleltop.abap: -------------------------------------------------------------------------------- 1 | FUNCTION-POOL zadcoset_parallel. " MESSAGE-ID .. 2 | 3 | " INCLUDE LZADCOSET_PARALLELD... " Local class definition 4 | -------------------------------------------------------------------------------- /src/zif_adcoset_version.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Version info of ABAP Code Search Tools

2 | INTERFACE zif_adcoset_version 3 | PUBLIC. 4 | CONSTANTS version TYPE string VALUE '1.7.0'. 5 | ENDINTERFACE. 6 | -------------------------------------------------------------------------------- /src/package.devc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Advanced code search 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/parl/zif_adcoset_parl_result_recv.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Receives results from parallel tasks

2 | INTERFACE zif_adcoset_parl_result_recv 3 | PUBLIC. 4 | 5 | "!

Will be called when task is finished

6 | METHODS send_results 7 | IMPORTING 8 | !results TYPE any. 9 | ENDINTERFACE. 10 | -------------------------------------------------------------------------------- /src/parl/package.devc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Parallel processing 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/adt/package.devc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ADT endpoints for code search 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/zcx_adcoset_no_matcher.clas.abap: -------------------------------------------------------------------------------- 1 | "!

No valid pattern matcher found

2 | CLASS zcx_adcoset_no_matcher DEFINITION 3 | PUBLIC 4 | INHERITING FROM zcx_adcoset_static_error FINAL 5 | CREATE PUBLIC. 6 | 7 | PUBLIC SECTION. 8 | 9 | PROTECTED SECTION. 10 | 11 | PRIVATE SECTION. 12 | ENDCLASS. 13 | 14 | 15 | CLASS zcx_adcoset_no_matcher IMPLEMENTATION. 16 | ENDCLASS. 17 | -------------------------------------------------------------------------------- /src/zcx_adcoset_no_provider.clas.abap: -------------------------------------------------------------------------------- 1 | "!

No valid search provider found

2 | CLASS zcx_adcoset_no_provider DEFINITION 3 | PUBLIC 4 | INHERITING FROM zcx_adcoset_static_error FINAL 5 | CREATE PUBLIC. 6 | 7 | PUBLIC SECTION. 8 | 9 | PROTECTED SECTION. 10 | 11 | PRIVATE SECTION. 12 | ENDCLASS. 13 | 14 | 15 | CLASS zcx_adcoset_no_provider IMPLEMENTATION. 16 | ENDCLASS. 17 | -------------------------------------------------------------------------------- /src/zcx_adcoset_src_code_read.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Source code could not be read

2 | CLASS zcx_adcoset_src_code_read DEFINITION 3 | PUBLIC 4 | INHERITING FROM zcx_adcoset_static_error FINAL 5 | CREATE PUBLIC. 6 | 7 | PUBLIC SECTION. 8 | 9 | PROTECTED SECTION. 10 | 11 | PRIVATE SECTION. 12 | ENDCLASS. 13 | 14 | 15 | CLASS zcx_adcoset_src_code_read IMPLEMENTATION. 16 | ENDCLASS. 17 | -------------------------------------------------------------------------------- /src/zcx_adcoset_pattern_sh_error.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Error during pattern search

2 | CLASS zcx_adcoset_pattern_sh_error DEFINITION 3 | PUBLIC 4 | INHERITING FROM zcx_adcoset_static_error FINAL 5 | CREATE PUBLIC. 6 | 7 | PUBLIC SECTION. 8 | 9 | PROTECTED SECTION. 10 | 11 | PRIVATE SECTION. 12 | ENDCLASS. 13 | 14 | 15 | CLASS zcx_adcoset_pattern_sh_error IMPLEMENTATION. 16 | ENDCLASS. 17 | -------------------------------------------------------------------------------- /src/zcx_adcoset_no_src_code_reader.clas.abap: -------------------------------------------------------------------------------- 1 | "!

No valid source code reader found

2 | CLASS zcx_adcoset_no_src_code_reader DEFINITION 3 | PUBLIC 4 | INHERITING FROM zcx_adcoset_static_error FINAL 5 | CREATE PUBLIC. 6 | 7 | PUBLIC SECTION. 8 | 9 | PROTECTED SECTION. 10 | 11 | PRIVATE SECTION. 12 | ENDCLASS. 13 | 14 | 15 | CLASS zcx_adcoset_no_src_code_reader IMPLEMENTATION. 16 | ENDCLASS. 17 | -------------------------------------------------------------------------------- /src/zif_adcoset_src_code_searcher.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Searches source code

2 | INTERFACE zif_adcoset_src_code_searcher 3 | PUBLIC. 4 | 5 | "!

Searches the given source code

6 | METHODS search 7 | IMPORTING 8 | source_code TYPE REF TO zif_adcoset_source_code 9 | RETURNING 10 | VALUE(result) TYPE zif_adcoset_ty_global=>ty_search_matches. 11 | ENDINTERFACE. 12 | -------------------------------------------------------------------------------- /src/adt/zadcoset_search_scope.xslt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZADCOSET_SEARCH_SCOPE 7 | E 8 | Search Scope 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/zif_adcoset_search_query.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Search query for code search

2 | INTERFACE zif_adcoset_search_query 3 | PUBLIC. 4 | 5 | "!

Runs search query

6 | METHODS run. 7 | 8 | "!

Retrieve search results

9 | METHODS get_results 10 | RETURNING 11 | VALUE(result) TYPE zif_adcoset_ty_global=>ty_search_result_objects. 12 | ENDINTERFACE. 13 | -------------------------------------------------------------------------------- /src/adt/zadcoset_search_result.xslt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZADCOSET_SEARCH_RESULT 7 | E 8 | Code search result 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/adt/zadcoset_adt_obj_ref.xslt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZADCOSET_ADT_OBJ_REF 7 | E 8 | Transformation for ADT Object Info 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/adt/zadcoset_search_settings.xslt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZADCOSET_SEARCH_SETTINGS 7 | E 8 | Settings for Code Search 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/adt/zadcoset_adt_plugin_features.xslt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZADCOSET_ADT_PLUGIN_FEATURES 7 | E 8 | Features of ADT plugins 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/adt/zadcoset_search_scope_params.xslt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZADCOSET_SEARCH_SCOPE_PARAMS 7 | E 8 | Search Scope Parameters 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/zadcoset_i_searchabletable.ddls.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZADCOSET_I_SEARCHABLETABLE 7 | E 8 | Searchable Table 9 | V 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/zadcoset_i_sourcecodeobject.ddls.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZADCOSET_I_SOURCECODEOBJECT 7 | E 8 | Repository object for code search 9 | V 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/parl/zadcoset_parallel.fugr.lzadcoset_paralleltop.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | LZADCOSET_PARALLELTOP 7 | S 8 | D$ 9 | I 10 | S 11 | X 12 | D$S 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zadcoset_i_transportsrccodobj.ddls.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZADCOSET_I_TRANSPORTSRCCODOBJ 7 | E 8 | Rep. obj. of Tr. Request for Code Search 9 | V 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/parl/zadcoset_parallel.fugr.saplzadcoset_parallel.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | SAPLZADCOSET_PARALLEL 7 | S 8 | D$ 9 | F 10 | S 11 | E 12 | X 13 | D$S 14 | X 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/zif_adcoset_src_code_reader.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Reader for code sources

2 | INTERFACE zif_adcoset_src_code_reader 3 | PUBLIC. 4 | 5 | "!

Retrieves source code instance of object via name

6 | METHODS get_source_code 7 | IMPORTING 8 | !name TYPE sobj_name 9 | !type TYPE trobjtype OPTIONAL 10 | RETURNING 11 | VALUE(result) TYPE REF TO zif_adcoset_source_code 12 | RAISING 13 | zcx_adcoset_src_code_read. 14 | 15 | ENDINTERFACE. 16 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | We release patches and security updates only for the latest version of abap-code-search-tools. 6 | Please make sure you are using the most recent release. 7 | 8 | | Version | Supported | 9 | |-----------|-----------| 10 | | Latest | ✅ | 11 | | Older | ❌ | 12 | 13 | ## Reporting a Vulnerability 14 | 15 | To report a security issue please use the GitHub Security Advisory [Report a vulnerability](https://github.com/DevEpos/abap-code-search-tools/security/advisories/new) tab 16 | -------------------------------------------------------------------------------- /src/adt/zif_adcoset_ty_adt_types.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_ADCOSET_TY_ADT_TYPES 7 | E 8 | Types for ADT resources 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zif_adcoset_version.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_ADCOSET_VERSION 7 | E 8 | Version info of ABAP Code Search Tools 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zcl_adcoset_pcre_matcher.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_PCRE_MATCHER 7 | E 8 | Matcher for PCRE 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_source_code.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SOURCE_CODE 7 | E 8 | Represents source code 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zif_adcoset_c_pattern_matching.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_ADCOSET_C_PATTERN_MATCHING 7 | E 8 | Constants for pattern matching 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zif_adcoset_source_code.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_ADCOSET_SOURCE_CODE 7 | E 8 | Represents the source code of an object/include 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/zcl_adcoset_api_state_util.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_API_STATE_UTIL 7 | E 8 | Util for API State 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scr_ddls.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SCR_DDLS 7 | E 8 | Source code reader for CDS view 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scs_base.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SCS_BASE 7 | E 8 | Base class for source code searcher 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scs_standard.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SCS_STANDARD 7 | E 8 | Standard Source Code Searcher 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_query.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SEARCH_QUERY 7 | E 8 | Search query for code search 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_scope.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SEARCH_SCOPE 7 | E 8 | Search scope implementation 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_disc_app.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_ADT_DISC_APP 7 | E 8 | Router for ABAP Code Search 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_obj_factory.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_ADT_OBJ_FACTORY 7 | E 8 | Factory for ADT links 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_res_search.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_ADT_RES_SEARCH 7 | E 8 | Resource for code search 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_csp_prog.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_CSP_PROG 7 | E 8 | Code Search Provider for Programs/Includes 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scr_dcls.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SCR_DCLS 7 | E 8 | Source code reader for CDS Access Controls 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scr_ddlx.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SCR_DDLX 7 | E 8 | Source code reader for metadata extensions 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scr_srvd.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SCR_SRVD 7 | E 8 | Source code reader for Service Definition 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scs_sequential.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SCS_SEQUENTIAL 7 | E 8 | Sequential Source Code Searcher 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_res_features.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_ADT_RES_FEATURES 7 | E 8 | Provides available features 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_csp_tabl.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_CSP_TABL 7 | E 8 | Search Provider for DB Tables and Structures 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scr_tabl.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SCR_TABL 7 | E 8 | Source code reader for table & structure 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_scope_base.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SEARCH_SCOPE_BASE 7 | E 8 | Base class for search scope 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_res_trreq_vh.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_ADT_RES_TRREQ_VH 7 | E 8 | Resource for Transport Request VH 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scr_reposrc.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SCR_REPOSRC 7 | E 8 | Source code reader for objects stored in TRDIR 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_tr_obj_processor.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_TR_OBJ_PROCESSOR 7 | E 8 | Transport Request Object Processor 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_res_cs_scope.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_ADT_RES_CS_SCOPE 7 | E 8 | Resource for Search Scope Definition 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_res_server_grp_vh.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_RES_SERVER_GRP_VH 7 | E 8 | Resource for Server Group Value Help 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_res_swcomp_vh.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_ADT_RES_SWCOMP_VH 7 | E 8 | Resource for VH of Software Component 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_res_trtype_vh.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_ADT_RES_TRTYPE_VH 7 | E 8 | Resource for Transport Request Type VH 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_scope_final.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SEARCH_SCOPE_FINAL 7 | E 8 | Search scope which is already fully known 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zif_adcoset_code_search_prov.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Code search provider

2 | INTERFACE zif_adcoset_code_search_prov 3 | PUBLIC. 4 | 5 | "!

Searches for matches in the given object

6 | METHODS search 7 | IMPORTING 8 | !object TYPE zif_adcoset_ty_global=>ty_tadir_object 9 | src_code_reader TYPE REF TO zif_adcoset_src_code_reader 10 | src_code_searcher TYPE REF TO zif_adcoset_src_code_searcher 11 | RETURNING 12 | VALUE(result) TYPE zif_adcoset_ty_global=>ty_search_matches. 13 | 14 | ENDINTERFACE. 15 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_res_applc_vh.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_ADT_RES_APPLC_VH 7 | E 8 | Resource for Application Component value help 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_res_pattrnval.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_ADT_RES_PATTRNVAL 7 | E 8 | Resource for Code Search Pattern Validation 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_parl_search_query.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_PARL_SEARCH_QUERY 7 | E 8 | Query for code search (with parallel processing) 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adcoset_posix_regex_matchr.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_POSIX_REGEX_MATCHR 7 | E 8 | Matcher for POSIX standard regular expressions 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcx_adcoset_no_matcher.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCX_ADCOSET_NO_MATCHER 7 | E 8 | No valid pattern matcher found 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcl_adcoset_substring_matcher.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SUBSTRING_MATCHER 7 | E 8 | Finds matches in a string for a given (RegExp) pattern 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcx_adcoset_no_provider.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCX_ADCOSET_NO_PROVIDER 7 | E 8 | No valid search provider found 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcx_adcoset_src_code_read.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCX_ADCOSET_SRC_CODE_READ 7 | E 8 | Source code could not be read 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_res_cs_config.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_ADT_RES_CS_CONFIG 7 | E 8 | Resource to handle user specific settings of Code Search 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcx_adcoset_pattern_sh_error.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCX_ADCOSET_PATTERN_SH_ERROR 7 | E 8 | Error during pattern search 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcx_adcoset_no_src_code_reader.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCX_ADCOSET_NO_SRC_CODE_READER 7 | E 8 | No valid source code reader found 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scs_sequ_extended.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SCS_SEQU_EXTENDED 7 | E 8 | Extended Sequential matching 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_res_search.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Resource for code search

2 | CLASS zcl_adcoset_adt_res_search DEFINITION 3 | PUBLIC 4 | INHERITING FROM cl_adt_rest_resource 5 | CREATE PUBLIC. 6 | 7 | PUBLIC SECTION. 8 | METHODS get REDEFINITION. 9 | 10 | PROTECTED SECTION. 11 | 12 | PRIVATE SECTION. 13 | ENDCLASS. 14 | 15 | 16 | CLASS zcl_adcoset_adt_res_search IMPLEMENTATION. 17 | METHOD get. 18 | DATA(result) = NEW lcl_search_query( request )->run( ). 19 | response->set_body_data( content_handler = zcl_adcoset_adt_ch_factory=>create_search_result_ch( ) 20 | data = result ). 21 | ENDMETHOD. 22 | ENDCLASS. 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "abap-code-search-tools", 3 | "version": "1.7.0", 4 | "description": "ABAP Code Search", 5 | "scripts": { 6 | "format": "abap-cleanerc.exe --sourcedir src --filepattern *.abap;*.asddls --recursive --overwrite --release 740 --crlf --profile abapcleaner.cfj" 7 | }, 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/DevEpos/abap-code-search-tools.git" 11 | }, 12 | "keywords": [ 13 | "ABAP", 14 | "ADT" 15 | ], 16 | "author": "Ludwig Stockbauer-Muhr", 17 | "license": "MIT", 18 | "bugs": { 19 | "url": "https://github.com/DevEpos/abap-code-search-tools/issues" 20 | }, 21 | "homepage": "https://github.com/DevEpos/abap-code-search-tools#readme" 22 | } 23 | -------------------------------------------------------------------------------- /.abapgit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | E 6 | /src/ 7 | PREFIX 8 | 9 | /LICENSE 10 | /README.md 11 | /abaplint.json 12 | /src/*.ddls.baseinfo 13 | 14 | 15 | 16 | SAP_BASIS 17 | 751 18 | 19 | 20 | zif_adcoset_version=>version 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zif_adcoset_source_code.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Represents the source code of an object/include

2 | INTERFACE zif_adcoset_source_code 3 | PUBLIC. 4 | 5 | TYPES: 6 | BEGIN OF ty_line_index, 7 | number TYPE i, 8 | offset TYPE i, 9 | length TYPE i, 10 | END OF ty_line_index, 11 | ty_line_indexes TYPE TABLE OF ty_line_index WITH KEY number 12 | WITH UNIQUE HASHED KEY offset COMPONENTS offset. 13 | 14 | DATA content TYPE string_table READ-ONLY. 15 | DATA line_indexes TYPE ty_line_indexes READ-ONLY. 16 | DATA is_single_line_content TYPE abap_bool READ-ONLY. 17 | DATA line_count TYPE i READ-ONLY. 18 | DATA comment_regex TYPE string READ-ONLY. 19 | 20 | ENDINTERFACE. 21 | -------------------------------------------------------------------------------- /src/zif_adcoset_src_code_searcher.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_ADCOSET_SRC_CODE_SEARCHER 7 | E 8 | Searches source code 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | SEARCH 16 | E 17 | Searches the given source code 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/zif_adcoset_code_search_prov.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_ADCOSET_CODE_SEARCH_PROV 7 | E 8 | Code search provider 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | SEARCH 16 | E 17 | Searches for matches in the given object 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/adt/zcx_adcoset_adt_rest.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCX_ADCOSET_ADT_REST 7 | E 8 | General ADT error 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | CONSTRUCTOR 18 | E 19 | CONSTRUCTOR 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/parl/zcl_adcoset_parl_task_runner.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_PARL_TASK_RUNNER 7 | E 8 | Runs parallel tasks 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | NEW 17 | E 18 | Creates new task runner instance 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zif_adcoset_src_code_reader.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_ADCOSET_SRC_CODE_READER 7 | E 8 | Reader for code sources 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | GET_SOURCE_CODE 16 | E 17 | Retrieves source code instance of object via name 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/parl/zif_adcoset_parl_result_recv.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_ADCOSET_PARL_RESULT_RECV 7 | E 8 | Receives results from parallel tasks 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | SEND_RESULTS 16 | E 17 | Will be called when task is finished 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/zcl_adcoset_csp_factory.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_CSP_FACTORY 7 | E 8 | Factory for retrieving code search providers 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | GET_SEARCH_PROVIDER 17 | E 18 | Retrieves 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scs_factory.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SCS_FACTORY 7 | E 8 | Factory for creating source code searcher 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | CREATE 17 | E 18 | Creates source code searcher 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zcl_adcoset_csp_clas.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_CSP_CLAS 7 | E 8 | Search Provider for Classes 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | CONSTRUCTOR 17 | E 18 | Creates new instance of a class search provider 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_query_fac.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SEARCH_QUERY_FAC 7 | E 8 | Factory for creating search queries 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | CREATE_QUERY 17 | E 18 | Creates query instance 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zcl_adcoset_message_util.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_MESSAGE_UTIL 7 | E 8 | Utility for message handling 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | SPLIT_STRING_TO_SYMSG 17 | E 18 | Splits text into sy-msg variables 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scr_factory.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SCR_FACTORY 7 | E 8 | Factory for creating source code readers 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | GET_READER 17 | E 18 | Retrieves source code reader for type 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zcl_adcoset_csp_fugr.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_CSP_FUGR 7 | E 8 | Search provider for Function Groups 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | CONSTRUCTOR 17 | E 18 | Creates new instance of a function group search provider 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zadcoset_scope_type.dtel.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZADCOSET_SCOPE_TYPE 7 | E 8 | ZADCOSET_SCOPE_TYPE 9 | 55 10 | 10 11 | 20 12 | 40 13 | Scope Type 14 | Scope Type 15 | Scope Type 16 | Scope Type 17 | Scope Type 18 | E 19 | D 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_settings.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SEARCH_SETTINGS 7 | E 8 | Access to search settings stored on the server 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | GET_SETTINGS 17 | E 18 | Retrieves server side code search settings 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zcx_adcoset_static_error.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCX_ADCOSET_STATIC_ERROR 7 | E 8 | General static exception in code search tools library 9 | 40 10 | 1 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | CONSTRUCTOR 18 | E 19 | CONSTRUCTOR 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/zcl_adcoset_csp_strsrc_default.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_CSP_STRSRC_DEFAULT 7 | E 8 | Default search provider for string sources 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | CONSTRUCTOR 17 | E 18 | Creates new instance of a default search provider 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/parl/zif_adcoset_parl_task_runner.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Represents task to be run in parallel

2 | INTERFACE zif_adcoset_parl_task_runner 3 | PUBLIC. 4 | 5 | "!

Starts a new task

6 | METHODS run 7 | IMPORTING 8 | !input TYPE any. 9 | 10 | "!

Waits until all tasks are finished

11 | METHODS wait_until_finished. 12 | 13 | "!

Sets a new result receiver in the task runner

14 | METHODS set_result_receiver 15 | IMPORTING 16 | !receiver TYPE REF TO zif_adcoset_parl_result_recv. 17 | 18 | "!

Returns the number of the maximum available tasks

19 | METHODS get_max_tasks 20 | RETURNING 21 | VALUE(result) TYPE i. 22 | 23 | ENDINTERFACE. 24 | -------------------------------------------------------------------------------- /src/zcl_adcoset_csp_repsrc_default.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_CSP_REPSRC_DEFAULT 7 | E 8 | Default search provider for repository source code search 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | CONSTRUCTOR 17 | E 18 | Creates new instance of a default search provider 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/adt/zadcoset_search_scope.xslt.source.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/zcl_adcoset_pattern_util.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_PATTERN_UTIL 7 | E 8 | Utility for handling patterns 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | PARSE_PATTERN_SEQUENCE 18 | E 19 | Checks control flags in pattern sequence 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/adt/zadcoset_search_scope_params.xslt.source.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/zif_adcoset_search_query.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_ADCOSET_SEARCH_QUERY 7 | E 8 | Search query for code search 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | GET_RESULTS 16 | E 17 | Retrieve search results 18 | 19 | 20 | RUN 21 | E 22 | Runs search query 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_res_swcomp_vh.clas.abap: -------------------------------------------------------------------------------- 1 | "! Resource for VH of Software Component 2 | CLASS zcl_adcoset_adt_res_swcomp_vh DEFINITION 3 | PUBLIC 4 | INHERITING FROM cl_adt_res_named_items FINAL 5 | CREATE PUBLIC. 6 | 7 | PUBLIC SECTION. 8 | 9 | PROTECTED SECTION. 10 | METHODS get_named_items REDEFINITION. 11 | 12 | PRIVATE SECTION. 13 | ENDCLASS. 14 | 15 | 16 | CLASS zcl_adcoset_adt_res_swcomp_vh IMPLEMENTATION. 17 | METHOD get_named_items. 18 | DATA lt_sw_comps TYPE trdlvunits. 19 | 20 | CALL FUNCTION 'TR_GET_DLVUNITS' 21 | EXPORTING iv_with_description = abap_true 22 | IMPORTING et_dlvunits = lt_sw_comps. 23 | 24 | p_filter_already_applied = abap_false. 25 | p_named_item_list-items = VALUE #( FOR sw_comp IN lt_sw_comps 26 | ( name = sw_comp-dlvunit description = sw_comp-desc_text ) ). 27 | p_named_item_list-total_item_count = lines( lt_sw_comps ). 28 | ENDMETHOD. 29 | ENDCLASS. 30 | -------------------------------------------------------------------------------- /src/zadcoset_scope_type.doma.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZADCOSET_SCOPE_TYPE 7 | E 8 | CHAR 9 | 000002 10 | 000002 11 | X 12 | Scope Type 13 | E 14 | 15 | 16 | 17 | 0001 18 | E 19 | US 20 | Universal Scope 21 | 22 | 23 | 0002 24 | E 25 | TR 26 | Transport Request 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/zcl_adcoset_matcher_factory.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_MATCHER_FACTORY 7 | E 8 | Factory to create matchers 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | CREATE_MATCHER 17 | E 18 | Creates matcher for the given type and pattern 19 | 20 | 21 | CREATE_MATCHERS 22 | E 23 | Creates matchers from pattern range 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/zadcoset_i_searchabletable.ddls.asddls: -------------------------------------------------------------------------------- 1 | @AbapCatalog.compiler.compareFilter: true 2 | @AbapCatalog.preserveKey: true 3 | @AbapCatalog.sqlViewName: 'ZADCOSETSCTABLE' 4 | 5 | @AccessControl.authorizationCheck: #NOT_REQUIRED 6 | 7 | @EndUserText.label: 'Tables with Source Code' 8 | 9 | define view ZADCOSET_I_SearchableTable 10 | as select from dd02l as Object 11 | 12 | inner join cvers as Release on Release.component = 'SAP_BASIS' 13 | 14 | { 15 | key case 16 | when Object.tabclass = 'INTTAB' 17 | or Object.tabclass = 'APPEND' then 'STRU' 18 | when Object.tabclass = 'TRANSP' then 'DTAB' 19 | end as ObjectType, 20 | 21 | key Object.tabname as ObjectName 22 | } 23 | 24 | where ( ( Object.tabclass = 'INTTAB' 25 | or Object.tabclass = 'APPEND') 26 | and Release.release > '740') 27 | or ( Object.tabclass = 'TRANSP' 28 | and Release.release > '751') 29 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_scope_fac.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SEARCH_SCOPE_FAC 7 | E 8 | Factory for creating search scopes 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | CREATE_FINAL_SCOPE 17 | E 18 | Creates scope with a given list of objects 19 | 20 | 21 | CREATE_SCOPE 22 | E 23 | Creates scope whoose size is not known yet 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/parl/zadcoset_parallel.fugr.saplzadcoset_parallel.abap: -------------------------------------------------------------------------------- 1 | " ------------------------------------------------------------------ 2 | " System-defined Include-files. - 3 | " ------------------------------------------------------------------ 4 | INCLUDE lzadcoset_paralleltop. " Global Declarations 5 | INCLUDE lzadcoset_paralleluxx. " Function Modules 6 | 7 | " ------------------------------------------------------------------ 8 | " User-defined Include-files (if necessary). - 9 | " ------------------------------------------------------------------ 10 | " INCLUDE LZADCOSET_PARALLELF... " Subroutines 11 | " INCLUDE LZADCOSET_PARALLELO... " PBO-Modules 12 | " INCLUDE LZADCOSET_PARALLELI... " PAI-Modules 13 | " INCLUDE LZADCOSET_PARALLELE... " Events 14 | " INCLUDE LZADCOSET_PARALLELP... " Local class implement. 15 | " INCLUDE LZADCOSET_PARALLELT99. " ABAP Unit tests 16 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_scope_final.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Search scope which is already fully known

2 | CLASS zcl_adcoset_search_scope_final DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | INTERFACES zif_adcoset_search_scope. 8 | 9 | METHODS constructor 10 | IMPORTING 11 | !package TYPE zif_adcoset_ty_global=>ty_scope_package. 12 | 13 | PRIVATE SECTION. 14 | DATA package TYPE zif_adcoset_ty_global=>ty_scope_package. 15 | ENDCLASS. 16 | 17 | 18 | CLASS zcl_adcoset_search_scope_final IMPLEMENTATION. 19 | METHOD constructor. 20 | me->package = package. 21 | ENDMETHOD. 22 | 23 | METHOD zif_adcoset_search_scope~count. 24 | result = package-count. 25 | ENDMETHOD. 26 | 27 | METHOD zif_adcoset_search_scope~has_next_package. 28 | result = xsdbool( package IS NOT INITIAL ). 29 | ENDMETHOD. 30 | 31 | METHOD zif_adcoset_search_scope~next_package. 32 | result = package. 33 | CLEAR package. 34 | ENDMETHOD. 35 | ENDCLASS. 36 | -------------------------------------------------------------------------------- /src/zcl_adcoset_extensions_util.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_EXTENSIONS_UTIL 7 | E 8 | Utility to test extension availability 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | GET_CURRENT_TGOBJ_TABLE 17 | E 18 | Retrieves current table with stored tagged objects 19 | 20 | 21 | IS_ABAP_TAGS_AVAILABLE 22 | E 23 | Checks if ABAP Tags feature is installed 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/zcl_adcoset_pcre_util.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_PCRE_UTIL 7 | E 8 | Utility to check PCRE support 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | IS_DOT_ALL_PARAM_EXISTING 17 | E 18 | Returns 'X' if the parameter 'DOT_ALL' exists at CREATE_PCRE 19 | 20 | 21 | IS_PCRE_SUPPORTED 22 | E 23 | Checks if PCRE is supported in the system 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/zcl_adcoset_csp_strsrc_default.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Default search provider for string sources

2 | CLASS zcl_adcoset_csp_strsrc_default DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | INTERFACES zif_adcoset_code_search_prov. 8 | 9 | "!

Creates new instance of a default search provider

10 | METHODS constructor. 11 | 12 | PRIVATE SECTION. 13 | DATA search_settings TYPE zif_adcoset_ty_global=>ty_search_settings. 14 | ENDCLASS. 15 | 16 | 17 | CLASS zcl_adcoset_csp_strsrc_default IMPLEMENTATION. 18 | METHOD constructor. 19 | ENDMETHOD. 20 | 21 | METHOD zif_adcoset_code_search_prov~search. 22 | TRY. 23 | DATA(source) = src_code_reader->get_source_code( name = object-name type = object-type ). 24 | result = src_code_searcher->search( source ). 25 | CATCH zcx_adcoset_src_code_read. 26 | " handle exception 27 | ENDTRY. 28 | 29 | zcl_adcoset_search_protocol=>increment_searched_srcs_count( ). 30 | ENDMETHOD. 31 | ENDCLASS. 32 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_scope_tr.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SEARCH_SCOPE_TR 7 | E 8 | Search scope for transport request 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | ADD_SUBOBJ_TYPE_TO_FILTER 18 | E 19 | Enhance the type filter with corresponding LIMU types 20 | 21 | 22 | GET_TR_OBJECTS 23 | E 24 | Read Source Code Objects from Transport Requests 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_engine.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SEARCH_ENGINE 7 | E 8 | Code Search Engine 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | GET_INSTANCE 17 | E 18 | Retrieves instance of search engine 19 | 20 | 21 | RUN_CODE_SEARCH_ARFC 22 | E 23 | Runs code search (for ARFC call) 24 | 25 | 26 | SEARCH_CODE 27 | E 28 | Search source code 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2021 Ludwig Stockbauer-Muhr 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_settings.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Access to search settings stored on the server

2 | CLASS zcl_adcoset_search_settings DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | "!

Retrieves server side code search settings

8 | CLASS-METHODS get_settings 9 | RETURNING 10 | VALUE(result) TYPE zif_adcoset_ty_adt_types=>ty_code_search_settings. 11 | ENDCLASS. 12 | 13 | 14 | CLASS zcl_adcoset_search_settings IMPLEMENTATION. 15 | METHOD get_settings. 16 | " as the default settings correspond to an empty entry sy-subrc <> 0 does 17 | " have to be handled 18 | SELECT SINGLE * FROM zadcoset_csset 19 | WHERE uname = @sy-uname 20 | INTO CORRESPONDING FIELDS OF @result. 21 | 22 | IF sy-subrc <> 0. 23 | result = VALUE #( parallel_proc_pack_size = zif_adcoset_c_global=>c_parl_proc_min_pack_size ). 24 | ELSEIF result-parallel_proc_pack_size < zif_adcoset_c_global=>c_parl_proc_min_pack_size. 25 | result-parallel_proc_pack_size = zif_adcoset_c_global=>c_parl_proc_min_pack_size. 26 | ENDIF. 27 | ENDMETHOD. 28 | ENDCLASS. 29 | -------------------------------------------------------------------------------- /src/zcl_adcoset_cds_name_mapper.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_CDS_NAME_MAPPER 7 | E 8 | Maps technical to display name of Core Data Services 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | COLLECT_ENTRY 17 | E 18 | Collects entry for mapping 19 | 20 | 21 | GET_DISPLAY_NAME 22 | E 23 | Retrieves display name of a given entry 24 | 25 | 26 | MAP_ENTRIES 27 | E 28 | Tries to map all collected entries 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_res_server_grp_vh.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Resource for Server Group Value Help

2 | CLASS zcl_adcoset_res_server_grp_vh DEFINITION 3 | PUBLIC 4 | INHERITING FROM cl_adt_res_named_items FINAL 5 | CREATE PUBLIC. 6 | 7 | PUBLIC SECTION. 8 | 9 | PROTECTED SECTION. 10 | METHODS get_named_items REDEFINITION. 11 | 12 | PRIVATE SECTION. 13 | ENDCLASS. 14 | 15 | 16 | CLASS zcl_adcoset_res_server_grp_vh IMPLEMENTATION. 17 | METHOD get_named_items. 18 | DATA server_group_range TYPE RANGE OF zif_adcoset_ty_global=>ty_server_group. 19 | 20 | IF p_filter_name IS NOT INITIAL. 21 | server_group_range = VALUE #( ( sign = 'I' option = 'CP' low = p_filter_name ) ). 22 | ENDIF. 23 | 24 | SELECT classname AS name FROM rzllitab 25 | WHERE classname IN @server_group_range 26 | AND grouptype = @zif_adcoset_c_global=>c_group_type_server_group 27 | INTO CORRESPONDING FIELDS OF TABLE @p_named_item_list-items 28 | UP TO @p_filter_max_item_count ROWS. 29 | 30 | p_filter_already_applied = abap_true. 31 | p_named_item_list-total_item_count = lines( p_named_item_list-items ). 32 | ENDMETHOD. 33 | ENDCLASS. 34 | -------------------------------------------------------------------------------- /src/parl/zcl_adcoset_parl_proc_utils.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_PARL_PROC_UTILS 7 | E 8 | Utilities for parallel processing 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | ASSERT_ASYNC_RFC_CALL 17 | E 18 | Asserts if aRFC call is active 19 | 20 | 21 | DETERMINE_MAX_TASKS 22 | E 23 | Determines the maximum number of threads for group 24 | 25 | 26 | GET_PARALLEL_HANDLER 27 | E 28 | Retrieves parallel handler definition 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/zif_adcoset_pattern_matcher.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_ADCOSET_PATTERN_MATCHER 7 | E 8 | Finds matches in a string for a given (RegExp) pattern 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | FIND_MATCHES 16 | E 17 | Retrieves the matches in the given source 18 | 19 | 20 | FIND_MATCHES_IN_RANGE 21 | E 22 | Retrieves matches in the given source and range 23 | 24 | 25 | FIND_NEXT_MATCH 26 | E 27 | Retrieves the next match in the given source and offset 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/zcl_adcoset_string_util.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_STRING_UTIL 7 | E 8 | Utility for string processing 9 | 1 10 | X 11 | X 12 | X 13 | X 14 | 15 | 16 | 17 | ADJUST_LINE_ENDINGS 18 | E 19 | Adjusts the line endings in the given source 20 | 21 | 22 | DETERMINE_LINE_INDEXES 23 | E 24 | Determines the line indexes in the source 25 | 26 | 27 | TRANSFORM_TO_STRING 28 | E 29 | Transforms tabular source into single string 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /src/zcl_adcoset_message_util.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Utility for message handling

2 | CLASS zcl_adcoset_message_util DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | "!

Splits text into sy-msg variables

8 | CLASS-METHODS split_string_to_symsg 9 | IMPORTING 10 | !text TYPE string. 11 | ENDCLASS. 12 | 13 | 14 | CLASS zcl_adcoset_message_util IMPLEMENTATION. 15 | METHOD split_string_to_symsg. 16 | DATA offset TYPE i. 17 | 18 | DATA(rest_text) = text. 19 | 20 | DATA(msgv1) = rest_text. 21 | SHIFT rest_text LEFT BY 50 PLACES. 22 | DATA(msgv2) = rest_text. 23 | SHIFT rest_text LEFT BY 50 PLACES. 24 | DATA(msgv3) = rest_text. 25 | SHIFT rest_text LEFT BY 50 PLACES. 26 | DATA(msgv4) = rest_text. 27 | 28 | IF strlen( rest_text ) > 50. 29 | FIND ALL OCCURRENCES OF REGEX '.\s.' IN SECTION LENGTH 47 OF msgv4 MATCH OFFSET offset. 30 | IF sy-subrc = 0. 31 | offset = offset + 1. 32 | msgv4 = msgv4(offset). 33 | 34 | msgv4 = |{ msgv4 }...|. 35 | ENDIF. 36 | ENDIF. 37 | 38 | MESSAGE e001(00) WITH msgv1 msgv2 msgv3 msgv4 INTO DATA(msg) ##NEEDED. 39 | ENDMETHOD. 40 | ENDCLASS. 41 | -------------------------------------------------------------------------------- /src/zcl_adcoset_log.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_LOG 7 | E 8 | Messages that occur during processing 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | ADD_ALL_MESSAGES 17 | E 18 | Adds a list of messages 19 | 20 | 21 | ADD_MESSAGE 22 | E 23 | Adds message 24 | 25 | 26 | CLEAR 27 | E 28 | Clears current list of messages 29 | 30 | 31 | GET_MESSAGES 32 | E 33 | Returns current list of messages 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/zif_adcoset_c_pattern_matching.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Constants for pattern matching

2 | INTERFACE zif_adcoset_c_pattern_matching 3 | PUBLIC. 4 | 5 | CONSTANTS: 6 | "! Control sequences 7 | BEGIN OF c_pattern_ctrl_sequence, 8 | boundary_start TYPE string VALUE '(#b-start)', 9 | boundary_end TYPE string VALUE '(#b-end)', 10 | match TYPE string VALUE '(#match)', 11 | match_start TYPE string VALUE '(#m-start)', 12 | match_end TYPE string VALUE '(#m-end)', 13 | exclude TYPE string VALUE '(#exclude)', 14 | END OF c_pattern_ctrl_sequence. 15 | 16 | CONSTANTS: 17 | "! Control sequence flags 18 | BEGIN OF c_pattern_ctrl_flag, 19 | boundary_start TYPE zif_adcoset_ty_global=>ty_control_flags VALUE '00000001', 20 | boundary_end TYPE zif_adcoset_ty_global=>ty_control_flags VALUE '00000002', 21 | match_start TYPE zif_adcoset_ty_global=>ty_control_flags VALUE '00000004', 22 | match_end TYPE zif_adcoset_ty_global=>ty_control_flags VALUE '00000008', 23 | match TYPE zif_adcoset_ty_global=>ty_control_flags VALUE '00000010', 24 | exclude TYPE zif_adcoset_ty_global=>ty_control_flags VALUE '00000020', 25 | END OF c_pattern_ctrl_flag. 26 | ENDINTERFACE. 27 | -------------------------------------------------------------------------------- /src/parl/zif_adcoset_parl_task_runner.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_ADCOSET_PARL_TASK_RUNNER 7 | E 8 | Represents task to be run in parallel 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | GET_MAX_TASKS 16 | E 17 | Returns the number of the maximum available tasks 18 | 19 | 20 | RUN 21 | E 22 | Starts a new task 23 | 24 | 25 | SET_RESULT_RECEIVER 26 | E 27 | Sets a new result receiver in the task runner 28 | 29 | 30 | WAIT_UNTIL_FINISHED 31 | E 32 | Waits until all tasks are finished 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/zcl_adcoset_devc_reader.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_DEVC_READER 7 | E 8 | Access to Packages (DEVC) 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | GET_SUBPACKAGES 17 | E 18 | Retrieves sub packages for top package 19 | 20 | 21 | GET_SUBPACKAGES_BY_RANGE 22 | E 23 | Retrieves sub packages by range 24 | 25 | 26 | GET_SUBPACKAGES_BY_TAB 27 | E 28 | Retrieves sub packages by tab 29 | 30 | 31 | RESOLVE_PACKAGES 32 | E 33 | Resolves full package names from Range Table 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_res_trtype_vh.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Resource for Transport Request Type VH

2 | CLASS zcl_adcoset_adt_res_trtype_vh DEFINITION 3 | PUBLIC 4 | INHERITING FROM cl_adt_res_named_items FINAL 5 | CREATE PUBLIC. 6 | 7 | PUBLIC SECTION. 8 | 9 | PROTECTED SECTION. 10 | METHODS get_named_items REDEFINITION. 11 | 12 | PRIVATE SECTION. 13 | ENDCLASS. 14 | 15 | 16 | CLASS zcl_adcoset_adt_res_trtype_vh IMPLEMENTATION. 17 | METHOD get_named_items. 18 | p_named_item_list-items = VALUE #( 19 | ( name = zif_adcoset_c_global=>c_trkorr_type_vh-workbench_request description = 'Workbench Request' ) 20 | ( name = zif_adcoset_c_global=>c_trkorr_type_vh-dev_corr_task description = 'Development/Correction Task' ) 21 | ( name = zif_adcoset_c_global=>c_trkorr_type_vh-repair_task description = 'Repair Task' ) 22 | ( name = zif_adcoset_c_global=>c_trkorr_type_vh-transport_of_copies description = 'Transport of Copies' ) 23 | ( name = zif_adcoset_c_global=>c_trkorr_type_vh-piece_list description = 'Piece List' ) 24 | ( name = zif_adcoset_c_global=>c_trkorr_type_vh-relocation_request description = 'Relocation Request' ) ). 25 | p_named_item_list-total_item_count = lines( p_named_item_list-items ). 26 | 27 | p_filter_already_applied = abap_true. 28 | ENDMETHOD. 29 | ENDCLASS. 30 | -------------------------------------------------------------------------------- /src/adt/zadcoset_search_settings.xslt.source.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/adt/zif_adcoset_adt_obj_factory.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_ADCOSET_ADT_OBJ_FACTORY 7 | E 8 | Factory for ADT links 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | ADD_POSITION_FRAGMENT 16 | E 17 | Add positional fragment to uri 18 | 19 | 20 | GET_OBJECT_REF_FOR_INCLUDE 21 | E 22 | Retrieves ADT object reference for a given include 23 | 24 | 25 | GET_OBJECT_REF_FOR_SUB_OBJECT 26 | E 27 | Retrieves ADT object reference for workbench object 28 | 29 | 30 | GET_OBJECT_REF_FOR_TROBJ 31 | E 32 | Retrieves ADT object reference for tadir object 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /changelog.txt: -------------------------------------------------------------------------------- 1 | 2 | ABAP Code Search Tools changelog 3 | ================= 4 | 5 | Legend 6 | ------ 7 | * : fixed 8 | ! : changed 9 | + : added 10 | - : removed 11 | 12 | 2025-08-15 v1.7.0 13 | ------------------- 14 | 15 | + New source code object type SRVD 16 | + New search filter 'comp' (Software Component) 17 | + New search filter 'api' (API State) 18 | 19 | 20 | 2024-05-30 v1.6.0 21 | ------------------- 22 | 23 | + New source code object types: STRU, DTAB (#23,#24) 24 | 25 | 26 | 2024-02-16 v1.5.0 27 | ------------------- 28 | 29 | + Search in objects assigned to a chosen Transport Request/Task (#19) 30 | 31 | 32 | 2023-09-19 v1.3.1 33 | ------------------- 34 | 35 | * Fixes error in sequential search 36 | 37 | 38 | 2023-05-24 v1.3.0 39 | ------------------- 40 | 41 | + DDLS: raw name of entity (STOB) is returned to ADT 42 | + BDEF: raw name of DDLS (STOB) is returned to ADT 43 | 44 | 45 | 2023-04-05 v1.2.1 46 | ------------------- 47 | 48 | ! Adjusted ABAP Tags extension usage due to DDIC changes 49 | 50 | 51 | 2023-02-20 v1.2.0 52 | ------------------- 53 | 54 | + PROG: add option to expand includes in programs and search them as well 55 | 56 | 57 | 2022-10-21 v1.1.0 58 | ------------------- 59 | 60 | + The complete snippet of a match is returned if multi-line mode is active 61 | + The result contains the lines of codes that were searched 62 | 63 | 64 | 2021-03-09 v1.0.0 65 | ------------------- 66 | 67 | + Initial release -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_res_applc_vh.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Resource for Application Component value help

2 | CLASS zcl_adcoset_adt_res_applc_vh DEFINITION 3 | PUBLIC 4 | INHERITING FROM cl_adt_res_named_items FINAL 5 | CREATE PUBLIC. 6 | 7 | PUBLIC SECTION. 8 | 9 | PROTECTED SECTION. 10 | METHODS get_named_items REDEFINITION. 11 | 12 | PRIVATE SECTION. 13 | ENDCLASS. 14 | 15 | 16 | CLASS zcl_adcoset_adt_res_applc_vh IMPLEMENTATION. 17 | METHOD get_named_items. 18 | DATA lt_appl_comp_name_range TYPE RANGE OF df14l-ps_posid. 19 | 20 | IF p_filter_name IS NOT INITIAL. 21 | lt_appl_comp_name_range = VALUE #( ( sign = 'I' option = 'CP' low = to_upper( p_filter_name ) ) ). 22 | ENDIF. 23 | 24 | SELECT ps_posid AS name, 25 | text~name AS description 26 | FROM df14l AS comp 27 | LEFT OUTER JOIN df14t AS text 28 | ON comp~fctr_id = text~fctr_id 29 | AND comp~as4local = text~as4local 30 | AND text~langu = @sy-langu 31 | WHERE comp~as4local = 'A' 32 | AND comp~ps_posid IN @lt_appl_comp_name_range 33 | ORDER BY comp~ps_posid 34 | INTO CORRESPONDING FIELDS OF TABLE @p_named_item_list-items 35 | UP TO @p_filter_max_item_count ROWS. 36 | 37 | p_filter_already_applied = abap_true. 38 | p_named_item_list-total_item_count = lines( p_named_item_list-items ). 39 | ENDMETHOD. 40 | ENDCLASS. 41 | -------------------------------------------------------------------------------- /.github/workflows/stale.yml: -------------------------------------------------------------------------------- 1 | # This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time. 2 | # 3 | # You can adjust the behavior by modifying this file. 4 | # For more information, see: 5 | # https://github.com/actions/stale 6 | name: Mark stale issues and pull requests 7 | 8 | on: 9 | schedule: 10 | - cron: '36 18 * * *' 11 | 12 | concurrency: 13 | group: ${{ github.workflow }} 14 | cancel-in-progress: true 15 | 16 | jobs: 17 | stale: 18 | runs-on: ubuntu-latest 19 | permissions: 20 | issues: write 21 | pull-requests: write 22 | 23 | steps: 24 | - uses: actions/stale@v9 25 | with: 26 | repo-token: ${{ secrets.GITHUB_TOKEN }} 27 | days-before-issue-stale: 30 28 | stale-issue-message: 'This issue has not been updated in a while. If it is still relevant, please comment on it to keep it open. The issue will be closed soon if it remains inactive.' 29 | close-issue-message: 'This issue has been closed automatically due to inactivity.' 30 | stale-pr-message: 'This PR has not been updated in a while. If it is still relevant, please comment on it to keep it open. The PR will be closed soon if it remains inactive.' 31 | close-pr-message: 'This PR has been closed automatically due to inactivity.' 32 | stale-issue-label: 'stale' 33 | stale-pr-label: 'stale' 34 | exempt-issue-labels: 'keepalive,feature request' 35 | exempt-pr-labels: 'keepalive,feature request' 36 | exempt-all-milestones: true 37 | -------------------------------------------------------------------------------- /src/zcl_adcoset_source_code.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Represents source code

2 | CLASS zcl_adcoset_source_code DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | INTERFACES zif_adcoset_source_code. 8 | 9 | METHODS constructor 10 | IMPORTING 11 | !source TYPE string_table 12 | line_indexes TYPE zif_adcoset_source_code=>ty_line_indexes OPTIONAL 13 | comment_regex TYPE string OPTIONAL. 14 | 15 | PRIVATE SECTION. 16 | ALIASES content FOR zif_adcoset_source_code~content. 17 | ALIASES line_count FOR zif_adcoset_source_code~line_count. 18 | ALIASES line_indexes FOR zif_adcoset_source_code~line_indexes. 19 | ALIASES comment_regex FOR zif_adcoset_source_code~comment_regex. 20 | ALIASES is_single_line_content FOR zif_adcoset_source_code~is_single_line_content. 21 | ENDCLASS. 22 | 23 | 24 | CLASS zcl_adcoset_source_code IMPLEMENTATION. 25 | METHOD constructor. 26 | ASSERT source IS NOT INITIAL. 27 | 28 | content = source. 29 | me->line_indexes = line_indexes. 30 | me->comment_regex = comment_regex. 31 | line_count = lines( line_indexes ). 32 | is_single_line_content = xsdbool( line_count IS NOT INITIAL ). 33 | 34 | IF is_single_line_content = abap_true. 35 | zcl_adcoset_search_protocol=>add_loc( lines( line_indexes ) ). 36 | ELSE. 37 | zcl_adcoset_search_protocol=>add_loc( lines( source ) ). 38 | ENDIF. 39 | ENDMETHOD. 40 | ENDCLASS. 41 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_request_util.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_ADT_REQUEST_UTIL 7 | E 8 | ADT Util 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | GET_BOOLEAN_QUERY_PARAMETER 17 | E 18 | Retrieve boolean parameter value from request 19 | 20 | 21 | GET_INTEGER_QUERY_PARAMETER 22 | E 23 | Retrieve value of integer request parameter 24 | 25 | 26 | GET_QUERY_PARAMETER 27 | E 28 | Retrieve value of request parameter 29 | 30 | 31 | GET_QUERY_PARAMETER_VALUES 32 | E 33 | Retrieve values of request parameter 34 | 35 | 36 | GET_UUID_URI_QUERY_PARAMETER 37 | E 38 | Retrieves UUID request parameter 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/zif_adcoset_pattern_matcher.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Finds matches in a string for a given (RegExp) pattern

2 | INTERFACE zif_adcoset_pattern_matcher 3 | PUBLIC. 4 | 5 | TYPES ty_ref_tab TYPE STANDARD TABLE OF REF TO zif_adcoset_pattern_matcher WITH EMPTY KEY. 6 | 7 | DATA control_flags TYPE zif_adcoset_ty_global=>ty_control_flags READ-ONLY. 8 | 9 | "!

Retrieves the matches in the given source

10 | METHODS find_matches 11 | IMPORTING 12 | !source TYPE string_table 13 | RETURNING 14 | VALUE(result) TYPE match_result_tab 15 | RAISING 16 | zcx_adcoset_pattern_sh_error. 17 | 18 | "!

Retrieves matches in the given source and range

19 | METHODS find_matches_in_range 20 | IMPORTING 21 | !source TYPE string_table 22 | start_line TYPE i 23 | !offset TYPE i 24 | end_line TYPE i 25 | end_offset TYPE i 26 | RETURNING 27 | VALUE(result) TYPE match_result_tab 28 | RAISING 29 | zcx_adcoset_pattern_sh_error. 30 | 31 | "!

Retrieves the next match in the given source and offset

32 | METHODS find_next_match 33 | IMPORTING 34 | !source TYPE string_table 35 | start_line TYPE i OPTIONAL 36 | !offset TYPE i OPTIONAL 37 | end_line TYPE i OPTIONAL 38 | end_offset TYPE i OPTIONAL 39 | RETURNING 40 | VALUE(result) TYPE match_result 41 | RAISING 42 | zcx_adcoset_pattern_sh_error. 43 | ENDINTERFACE. 44 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_ch_factory.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_ADT_CH_FACTORY 7 | E 8 | ADT content handler factory 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | CREATE_CS_SETTINGS_CH 17 | E 18 | Creates content handler for code search settings 19 | 20 | 21 | CREATE_FEATURE_LIST_CH 22 | E 23 | Creates content handler for feature list 24 | 25 | 26 | CREATE_SEARCH_RESULT_CH 27 | E 28 | Creates content handler for code search result 29 | 30 | 31 | CREATE_SEARCH_SCOPE_CH 32 | E 33 | Creates content handler for Code Search Scope 34 | 35 | 36 | CREATE_SEARCH_SCOPE_PARAMS_CH 37 | E 38 | Creates content handler for Code Search Scope Parameters 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/zif_adcoset_search_scope.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Defines the scope of a code search

2 | INTERFACE zif_adcoset_search_scope 3 | PUBLIC. 4 | 5 | CONSTANTS c_min_parl_package_size TYPE i VALUE 10. 6 | CONSTANTS c_max_parl_package_size TYPE i VALUE 2500. 7 | CONSTANTS c_serial_package_size TYPE i VALUE 10000. 8 | 9 | "!

Retrieves number of objects in scope

10 | METHODS count 11 | RETURNING 12 | VALUE(result) TYPE i. 13 | 14 | "!

Retrieves the next package of objects in scope

15 | METHODS next_package 16 | RETURNING 17 | VALUE(result) TYPE zif_adcoset_ty_global=>ty_scope_package. 18 | 19 | "!

Returns 'X' if another package exists

20 | METHODS has_next_package 21 | RETURNING 22 | VALUE(result) TYPE abap_bool. 23 | 24 | "!

Returns 'X' if more results would have been in scope

25 | METHODS more_objects_in_scope DEFAULT IGNORE 26 | RETURNING 27 | VALUE(result) TYPE abap_bool. 28 | 29 | "!

Configures the package size of the processor

30 | "! The driving factor will be the available number of parallel tasks 31 | METHODS configure_package_size DEFAULT IGNORE 32 | IMPORTING 33 | max_objects TYPE i OPTIONAL 34 | max_task_count TYPE i. 35 | 36 | "!

Retrieves the ranges of this scope

37 | METHODS get_scope_ranges DEFAULT IGNORE 38 | RETURNING 39 | VALUE(result) TYPE zif_adcoset_ty_global=>ty_search_scope_ranges. 40 | ENDINTERFACE. 41 | -------------------------------------------------------------------------------- /src/zcl_adcoset_pcre_util.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Utility to check PCRE support

2 | CLASS zcl_adcoset_pcre_util DEFINITION 3 | PUBLIC FINAL 4 | CREATE PRIVATE. 5 | 6 | PUBLIC SECTION. 7 | CLASS-METHODS class_constructor. 8 | 9 | "!

Checks if PCRE is supported in the system

10 | CLASS-METHODS is_pcre_supported 11 | RETURNING 12 | VALUE(result) TYPE abap_bool. 13 | 14 | "!

Returns 'X' if the parameter 'DOT_ALL' exists at CREATE_PCRE

15 | CLASS-METHODS is_dot_all_param_existing 16 | RETURNING 17 | VALUE(result) TYPE abap_bool. 18 | 19 | PRIVATE SECTION. 20 | CLASS-DATA pcre_supported TYPE abap_bool VALUE abap_undefined. 21 | CLASS-DATA dot_all_param_exists TYPE abap_bool VALUE abap_undefined. 22 | ENDCLASS. 23 | 24 | 25 | CLASS zcl_adcoset_pcre_util IMPLEMENTATION. 26 | METHOD class_constructor. 27 | DATA(abap_regex_descr) = CAST cl_abap_classdescr( cl_abap_typedescr=>describe_by_name( 'CL_ABAP_REGEX' ) ). 28 | 29 | ASSIGN abap_regex_descr->methods[ name = 'CREATE_PCRE' ] TO FIELD-SYMBOL(). 30 | pcre_supported = xsdbool( sy-subrc = 0 ). 31 | 32 | IF pcre_supported = abap_true. 33 | dot_all_param_exists = xsdbool( line_exists( -parameters[ name = 'DOT_ALL' ] ) ). 34 | ELSE. 35 | dot_all_param_exists = abap_false. 36 | ENDIF. 37 | ENDMETHOD. 38 | 39 | METHOD is_pcre_supported. 40 | result = pcre_supported. 41 | ENDMETHOD. 42 | 43 | METHOD is_dot_all_param_existing. 44 | result = dot_all_param_exists. 45 | ENDMETHOD. 46 | ENDCLASS. 47 | -------------------------------------------------------------------------------- /src/zif_adcoset_search_scope.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_ADCOSET_SEARCH_SCOPE 7 | E 8 | Defines the scope of a code search 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | CONFIGURE_PACKAGE_SIZE 16 | E 17 | Configures the package size of the processor 18 | 19 | 20 | COUNT 21 | E 22 | Retrieves number of objects in scope 23 | 24 | 25 | GET_SCOPE_RANGES 26 | E 27 | Retrieves the ranges of this scope 28 | 29 | 30 | HAS_NEXT_PACKAGE 31 | E 32 | Returns 'X' if another package exists 33 | 34 | 35 | MORE_OBJECTS_IN_SCOPE 36 | E 37 | Returns 'X' if more results would have been in scope 38 | 39 | 40 | NEXT_PACKAGE 41 | E 42 | Retrieves the next package of objects in scope 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_scope_tr.clas.testclasses.abap: -------------------------------------------------------------------------------- 1 | *"* use this source file for your ABAP unit test classes 2 | 3 | CLASS ltcl_unit DEFINITION FINAL 4 | FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. 5 | 6 | PRIVATE SECTION. 7 | METHODS test_native_sql_builder FOR TESTING RAISING cx_static_check. 8 | ENDCLASS. 9 | 10 | 11 | CLASS ltcl_unit IMPLEMENTATION. 12 | METHOD test_native_sql_builder. 13 | DATA(cut) = NEW zcl_adcoset_search_scope_tr( 14 | search_scope = VALUE #( object_name_range = VALUE #( ( sign = 'I' option = 'CP' low = 'CL_*' ) ) 15 | object_type_range = VALUE #( option = 'EQ' 16 | ( sign = 'I' low = 'CLAS' ) 17 | ( sign = 'E' low = 'INTF' ) ) 18 | package_range = VALUE #( ( sign = 'I' option = 'CP' low = 'AB*' ) ) 19 | current_offset = 0 20 | max_objects = 50 ) ). 21 | 22 | cl_abap_unit_assert=>assert_true( cut->zif_adcoset_search_scope~has_next_package( ) ). 23 | DATA(obj_count) = cut->zif_adcoset_search_scope~count( ). 24 | 25 | DATA(results) = cut->zif_adcoset_search_scope~next_package( ). 26 | 27 | cl_abap_unit_assert=>assert_equals( exp = COND #( WHEN obj_count >= 50 THEN 50 28 | WHEN obj_count < 50 THEN obj_count 29 | ELSE 0 ) 30 | act = lines( results-objects ) ). 31 | ENDMETHOD. 32 | ENDCLASS. 33 | -------------------------------------------------------------------------------- /src/zadcoset_i_sourcecodeobject.ddls.asddls: -------------------------------------------------------------------------------- 1 | @AbapCatalog.preserveKey: true 2 | @AbapCatalog.sqlViewName: 'ZADCOSET_ISRCOBJ' 3 | 4 | @AccessControl.authorizationCheck: #NOT_REQUIRED 5 | 6 | @EndUserText.label: 'Repository object for code search' 7 | 8 | define view ZADCOSET_I_SourceCodeObject 9 | as select from tadir as Object 10 | 11 | { 12 | key Object.pgmid as ProgramId, 13 | key Object.object as ObjectType, 14 | key Object.object as OriginalObjectType, 15 | key Object.obj_name as ObjectName, 16 | 17 | Object.devclass as DevelopmentPackage, 18 | Object.created_on as CreatedDate, 19 | Object.author as Owner 20 | } 21 | 22 | where Object.pgmid = 'R3TR' 23 | and Object.delflag = '' 24 | and ( Object.object = 'CLAS' 25 | or Object.object = 'INTF' 26 | or Object.object = 'PROG' 27 | or Object.object = 'FUGR' 28 | or Object.object = 'TYPE' 29 | or Object.object = 'DDLS' 30 | or Object.object = 'DCLS' 31 | or Object.object = 'DDLX' 32 | or Object.object = 'BDEF' 33 | or Object.object = 'SRVD' 34 | or Object.object = 'XSLT') 35 | 36 | union 37 | 38 | select from tadir as Object 39 | 40 | inner join ZADCOSET_I_SearchableTable as Tabl on Object.obj_name = Tabl.ObjectName 41 | 42 | { 43 | key Object.pgmid as ProgramId, 44 | key Tabl.ObjectType, 45 | key Object.object as OriginalObjectType, 46 | key Object.obj_name as ObjectName, 47 | 48 | Object.devclass as DevelopmentPackage, 49 | Object.created_on as CreatedDate, 50 | Object.author as Owner 51 | } 52 | 53 | where Object.pgmid = 'R3TR' 54 | and Object.delflag = '' 55 | and Object.object = 'TABL' 56 | -------------------------------------------------------------------------------- /src/parl/zadcoset_parallel.fugr.zadcoset_new_task.abap: -------------------------------------------------------------------------------- 1 | FUNCTION zadcoset_new_task. 2 | *"---------------------------------------------------------------------- 3 | *"*"Local Interface: 4 | *" IMPORTING 5 | *" VALUE(INPUT) TYPE XSTRING 6 | *" VALUE(HANDLER_CLASS) TYPE STRING 7 | *" VALUE(HANDLER_METHOD) TYPE SEOCPDNAME 8 | *" EXPORTING 9 | *" VALUE(OUTPUT) TYPE XSTRING 10 | *" EXCEPTIONS 11 | *" INVALID_HANDLER 12 | *" ERROR 13 | *"---------------------------------------------------------------------- 14 | TRY. 15 | DATA(handler_def) = zcl_adcoset_parl_proc_utils=>get_parallel_handler( handler_class = handler_class 16 | handler_method = handler_method ). 17 | CATCH zcx_adcoset_static_error. 18 | MESSAGE |{ handler_class }=>{ handler_method } is no valid handler method| TYPE 'E' 19 | RAISING invalid_handler. 20 | ENDTRY. 21 | 22 | DATA typed_input TYPE REF TO data. 23 | DATA typed_output TYPE REF TO data. 24 | 25 | CREATE DATA typed_input TYPE HANDLE handler_def-input_param-type_handle. 26 | CREATE DATA typed_output TYPE HANDLE handler_def-output_param-type_handle. 27 | 28 | ASSIGN typed_input->* TO FIELD-SYMBOL(). 29 | ASSIGN typed_output->* TO FIELD-SYMBOL(). 30 | 31 | IMPORT data = FROM DATA BUFFER input. 32 | 33 | TRY. 34 | CALL METHOD (handler_class)=>(handler_method) 35 | EXPORTING input = 36 | IMPORTING output = . 37 | 38 | EXPORT data = TO DATA BUFFER output. 39 | 40 | CATCH cx_sy_dyn_call_error 41 | zcx_adcoset_static_error INTO DATA(call_error). 42 | MESSAGE call_error->get_text( ) TYPE 'E' 43 | RAISING error. 44 | ENDTRY. 45 | ENDFUNCTION. 46 | -------------------------------------------------------------------------------- /src/zif_adcoset_c_global.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_ADCOSET_C_GLOBAL 7 | E 8 | Global constants for code search tools 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | C_CDS_COMMENT_REGEX 16 | E 17 | Regex pattern to detect comment lines in CDS sources 18 | 19 | 20 | C_CLASS_INCLUDE_ID 21 | E 22 | Include id's for class 23 | 24 | 25 | C_FUGR_INCLUDE_ID 26 | E 27 | Include id's for function group 28 | 29 | 30 | C_MATCHER_TYPE 31 | E 32 | Matcher types 33 | 34 | 35 | C_SEARCH_PARAMS 36 | E 37 | Names of code search parameters 38 | 39 | 40 | C_SOURCE_CODE_TYPE 41 | E 42 | Technical identifier for source code types 43 | 44 | 45 | C_TADIR_TYPE 46 | E 47 | Constants for needed TADIR types 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /src/zcx_adcoset_static_error.clas.abap: -------------------------------------------------------------------------------- 1 | "!

General static exception in code search tools library

2 | CLASS zcx_adcoset_static_error DEFINITION 3 | PUBLIC 4 | INHERITING FROM cx_static_check 5 | CREATE PUBLIC. 6 | 7 | PUBLIC SECTION. 8 | INTERFACES if_t100_message. 9 | 10 | DATA msgv1 TYPE sy-msgv1. 11 | DATA msgv2 TYPE sy-msgv2. 12 | DATA msgv3 TYPE sy-msgv3. 13 | DATA msgv4 TYPE sy-msgv4. 14 | 15 | METHODS constructor 16 | IMPORTING 17 | !previous LIKE previous OPTIONAL 18 | !text TYPE string OPTIONAL 19 | from_sy TYPE abap_bool OPTIONAL. 20 | 21 | PROTECTED SECTION. 22 | 23 | PRIVATE SECTION. 24 | ENDCLASS. 25 | 26 | 27 | CLASS zcx_adcoset_static_error IMPLEMENTATION. 28 | METHOD constructor ##ADT_SUPPRESS_GENERATION. 29 | DATA fill_t100key TYPE abap_bool. 30 | 31 | super->constructor( previous = previous ). 32 | 33 | CLEAR textid. 34 | 35 | IF text IS NOT INITIAL. 36 | fill_t100key = abap_true. 37 | zcl_adcoset_message_util=>split_string_to_symsg( text ). 38 | ELSEIF from_sy = abap_true AND sy-msgid IS NOT INITIAL. 39 | fill_t100key = abap_true. 40 | ENDIF. 41 | 42 | IF fill_t100key = abap_true. 43 | msgv1 = sy-msgv1. 44 | msgv2 = sy-msgv2. 45 | msgv3 = sy-msgv3. 46 | msgv4 = sy-msgv4. 47 | if_t100_message~t100key = VALUE #( msgid = sy-msgid 48 | msgno = sy-msgno 49 | attr1 = 'MSGV1' 50 | attr2 = 'MSGV2' 51 | attr3 = 'MSGV3' 52 | attr4 = 'MSGV4' ). 53 | ELSE. 54 | if_t100_message~t100key = if_t100_message=>default_textid. 55 | ENDIF. 56 | 57 | me->previous = previous. 58 | ENDMETHOD. 59 | ENDCLASS. 60 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_scope_fac.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Factory for creating search scopes

2 | CLASS zcl_adcoset_search_scope_fac DEFINITION 3 | PUBLIC FINAL 4 | CREATE PRIVATE. 5 | 6 | PUBLIC SECTION. 7 | "!

Creates scope whoose size is not known yet

8 | CLASS-METHODS create_scope 9 | IMPORTING 10 | search_scope TYPE zif_adcoset_ty_global=>ty_search_scope 11 | RETURNING 12 | VALUE(result) TYPE REF TO zif_adcoset_search_scope. 13 | 14 | "!

Creates scope with a given list of objects

15 | CLASS-METHODS create_final_scope 16 | IMPORTING 17 | !package TYPE zif_adcoset_ty_global=>ty_scope_package 18 | RETURNING 19 | VALUE(result) TYPE REF TO zif_adcoset_search_scope. 20 | 21 | PRIVATE SECTION. 22 | CLASS-METHODS read_scope_type 23 | IMPORTING 24 | scope_id TYPE sysuuid_x16 25 | RETURNING 26 | VALUE(result) TYPE zadcoset_scope_type. 27 | ENDCLASS. 28 | 29 | 30 | CLASS zcl_adcoset_search_scope_fac IMPLEMENTATION. 31 | METHOD create_final_scope. 32 | result = NEW zcl_adcoset_search_scope_final( package = package ). 33 | ENDMETHOD. 34 | 35 | METHOD create_scope. 36 | IF search_scope-scope_id IS NOT INITIAL. 37 | DATA(scope_type) = read_scope_type( search_scope-scope_id ). 38 | ENDIF. 39 | 40 | result = COND #( WHEN search_scope-tr_request_range IS NOT INITIAL 41 | OR scope_type = zif_adcoset_c_global=>c_scope_type-transport_request 42 | THEN NEW zcl_adcoset_search_scope_tr( search_scope = search_scope ) 43 | ELSE NEW zcl_adcoset_search_scope( search_scope = search_scope ) ). 44 | ENDMETHOD. 45 | 46 | METHOD read_scope_type. 47 | SELECT SINGLE scope_type FROM zadcoset_csscope 48 | WHERE id = @scope_id 49 | INTO @result. 50 | ENDMETHOD. 51 | ENDCLASS. 52 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scs_factory.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Factory for creating source code searcher

2 | CLASS zcl_adcoset_scs_factory DEFINITION 3 | PUBLIC FINAL 4 | CREATE PRIVATE. 5 | 6 | PUBLIC SECTION. 7 | "!

Creates source code searcher

8 | CLASS-METHODS create 9 | IMPORTING 10 | matchers TYPE zif_adcoset_pattern_matcher=>ty_ref_tab 11 | settings TYPE zif_adcoset_ty_global=>ty_search_settings 12 | RETURNING 13 | VALUE(result) TYPE REF TO zif_adcoset_src_code_searcher. 14 | ENDCLASS. 15 | 16 | 17 | CLASS zcl_adcoset_scs_factory IMPLEMENTATION. 18 | METHOD create. 19 | IF settings-sequential_matching = abap_true AND lines( matchers ) > 1. 20 | 21 | DATA(is_ctrl_flags_found) = abap_false. 22 | LOOP AT matchers INTO DATA(matcher). 23 | IF matcher->control_flags IS NOT INITIAL. 24 | is_ctrl_flags_found = abap_true. 25 | EXIT. 26 | ENDIF. 27 | ENDLOOP. 28 | 29 | IF is_ctrl_flags_found = abap_true. 30 | result = NEW zcl_adcoset_scs_sequ_extended( ignore_comment_lines = settings-ignore_comment_lines 31 | line_feed = settings-line_feed 32 | matchers = matchers ). 33 | ELSE. 34 | result = NEW zcl_adcoset_scs_sequential( ignore_comment_lines = settings-ignore_comment_lines 35 | line_feed = settings-line_feed 36 | matchers = matchers ). 37 | ENDIF. 38 | 39 | ELSE. 40 | result = NEW zcl_adcoset_scs_standard( match_all = settings-match_all_patterns 41 | ignore_comment_lines = settings-ignore_comment_lines 42 | matchers = matchers ). 43 | ENDIF. 44 | ENDMETHOD. 45 | ENDCLASS. 46 | -------------------------------------------------------------------------------- /src/adt/zif_adcoset_adt_obj_factory.intf.abap: -------------------------------------------------------------------------------- 1 | "!

Factory for ADT links

2 | INTERFACE zif_adcoset_adt_obj_factory 3 | PUBLIC. 4 | 5 | "!

Retrieves ADT object reference for tadir object

6 | METHODS get_object_ref_for_trobj 7 | IMPORTING 8 | !type TYPE trobjtype 9 | !name TYPE sobj_name 10 | append_source_uri_path TYPE abap_bool OPTIONAL 11 | RETURNING 12 | VALUE(result) TYPE sadt_object_reference 13 | RAISING 14 | zcx_adcoset_static_error. 15 | 16 | "!

Retrieves ADT object reference for workbench object

17 | METHODS get_object_ref_for_sub_object 18 | IMPORTING 19 | wbobjtype TYPE wbobjtype 20 | enclosing_object TYPE sobj_name 21 | sub_object TYPE eu_lname 22 | RETURNING 23 | VALUE(result) TYPE sadt_object_reference 24 | RAISING 25 | zcx_adcoset_static_error. 26 | 27 | "!

Retrieves ADT object reference for a given include

28 | METHODS get_object_ref_for_include 29 | IMPORTING 30 | main_program TYPE progname 31 | !include TYPE progname 32 | start_line TYPE i DEFAULT if_adt_uri_mapper=>co_position_not_set 33 | start_line_offset TYPE i DEFAULT if_adt_uri_mapper=>co_position_not_set 34 | end_line TYPE i DEFAULT if_adt_uri_mapper=>co_position_not_set 35 | end_line_offset TYPE i DEFAULT if_adt_uri_mapper=>co_position_not_set 36 | RETURNING 37 | VALUE(result) TYPE sadt_object_reference 38 | RAISING 39 | zcx_adcoset_static_error. 40 | 41 | "!

Add positional fragment to uri

42 | METHODS add_position_fragment 43 | IMPORTING 44 | start_line TYPE i 45 | start_column TYPE i OPTIONAL 46 | end_line TYPE i OPTIONAL 47 | end_column TYPE i OPTIONAL 48 | CHANGING 49 | !link TYPE string. 50 | 51 | ENDINTERFACE. 52 | -------------------------------------------------------------------------------- /src/zadcoset_csscope.tabl.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZADCOSET_CSSCOPE 7 | E 8 | TRANSP 9 | Scope for Code Search 10 | E 11 | X 12 | L 13 | 1 14 | 15 | 16 | ZADCOSET_CSSCOPE 17 | A 18 | 0 19 | APPL0 20 | N 21 | 22 | 23 | 24 | ID 25 | X 26 | SYSUUID_X16 27 | 0 28 | X 29 | E 30 | 31 | 32 | SCOPE_TYPE 33 | ZADCOSET_SCOPE_TYPE 34 | 0 35 | X 36 | F 37 | E 38 | 39 | 40 | EXPIRATION_DATETIME 41 | TIMESTAMPL 42 | 0 43 | E 44 | 45 | 46 | CREATED_BY 47 | RESPONSIBL 48 | 0 49 | D 50 | E 51 | 52 | 53 | RANGES_DATA 54 | 0 55 | y 56 | 000008 57 | RSTR 58 | RSTR 59 | Serialized ranges for the object scope 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scr_reposrc.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Source code reader for objects stored in TRDIR

2 | CLASS zcl_adcoset_scr_reposrc DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | INTERFACES zif_adcoset_src_code_reader. 8 | 9 | METHODS constructor 10 | IMPORTING 11 | is_multiline TYPE abap_bool 12 | line_feed TYPE string. 13 | 14 | PRIVATE SECTION. 15 | CONSTANTS c_default_comment_regex TYPE string VALUE '^(\*|\s*")'. 16 | CONSTANTS c_bdef_comment_regex TYPE string VALUE '^\s*(//|/\*)'. 17 | 18 | DATA line_feed TYPE string. 19 | DATA is_multiline TYPE abap_bool. 20 | ENDCLASS. 21 | 22 | 23 | CLASS zcl_adcoset_scr_reposrc IMPLEMENTATION. 24 | METHOD constructor. 25 | me->line_feed = line_feed. 26 | me->is_multiline = is_multiline. 27 | ENDMETHOD. 28 | 29 | METHOD zif_adcoset_src_code_reader~get_source_code. 30 | DATA source TYPE string_table. 31 | 32 | READ REPORT name INTO source. 33 | IF sy-subrc <> 0 OR source IS INITIAL. 34 | RAISE EXCEPTION TYPE zcx_adcoset_src_code_read. 35 | ENDIF. 36 | 37 | IF is_multiline = abap_true. 38 | zcl_adcoset_string_util=>transform_to_string( EXPORTING source_table = source 39 | line_feed = line_feed 40 | IMPORTING source_text = DATA(source_text) 41 | indexes = DATA(indexes) ). 42 | 43 | source = VALUE #( ( source_text ) ). 44 | ENDIF. 45 | 46 | result = NEW zcl_adcoset_source_code( source = source 47 | line_indexes = indexes 48 | comment_regex = COND #( 49 | WHEN type = zif_adcoset_c_global=>c_source_code_type-behavior_definition 50 | THEN c_bdef_comment_regex 51 | ELSE c_default_comment_regex ) ). 52 | ENDMETHOD. 53 | ENDCLASS. 54 | -------------------------------------------------------------------------------- /src/parl/zadcoset_parallel.fugr.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Parallel functions for code search 6 | 7 | LZADCOSET_PARALLELTOP 8 | SAPLZADCOSET_PARALLEL 9 | 10 | 11 | 12 | ZADCOSET_NEW_TASK 13 | R 14 | Starts new parallel task 15 | 16 | 17 | INPUT 18 | XSTRING 19 | 20 | 21 | HANDLER_CLASS 22 | STRING 23 | 24 | 25 | HANDLER_METHOD 26 | SEOCPDNAME 27 | 28 | 29 | 30 | 31 | OUTPUT 32 | XSTRING 33 | 34 | 35 | 36 | 37 | INVALID_HANDLER 38 | 39 | 40 | ERROR 41 | 42 | 43 | 44 | 45 | INPUT 46 | P 47 | 48 | 49 | HANDLER_CLASS 50 | P 51 | 52 | 53 | HANDLER_METHOD 54 | P 55 | 56 | 57 | OUTPUT 58 | P 59 | 60 | 61 | INVALID_HANDLER 62 | X 63 | 64 | 65 | ERROR 66 | X 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scs_standard.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Standard Source Code Searcher

2 | CLASS zcl_adcoset_scs_standard DEFINITION 3 | PUBLIC 4 | INHERITING FROM zcl_adcoset_scs_base FINAL 5 | CREATE PUBLIC. 6 | 7 | PUBLIC SECTION. 8 | INTERFACES zif_adcoset_src_code_searcher. 9 | 10 | METHODS constructor 11 | IMPORTING 12 | match_all TYPE abap_bool 13 | ignore_comment_lines TYPE abap_bool 14 | matchers TYPE zif_adcoset_pattern_matcher=>ty_ref_tab. 15 | 16 | PROTECTED SECTION. 17 | 18 | PRIVATE SECTION. 19 | DATA match_all TYPE abap_bool. 20 | ENDCLASS. 21 | 22 | 23 | CLASS zcl_adcoset_scs_standard IMPLEMENTATION. 24 | METHOD constructor. 25 | super->constructor( ignore_comment_lines = ignore_comment_lines 26 | matchers = matchers ). 27 | me->match_all = match_all. 28 | ENDMETHOD. 29 | 30 | METHOD zif_adcoset_src_code_searcher~search. 31 | " set the source code attribute for this search call 32 | me->source_code = source_code. 33 | 34 | LOOP AT matchers INTO DATA(matcher). 35 | TRY. 36 | DATA(raw_matches) = matcher->find_matches( source_code->content ). 37 | CATCH zcx_adcoset_pattern_sh_error INTO DATA(error). 38 | zcl_adcoset_log=>add_exception( error ). 39 | IF match_all = abap_true. 40 | CLEAR result. 41 | RETURN. 42 | ENDIF. 43 | ENDTRY. 44 | IF raw_matches IS NOT INITIAL. 45 | DATA(enhanced_matches) = enhance_matches( raw_matches = raw_matches 46 | ignore_comment_lines = ignore_comment_lines ). 47 | ENDIF. 48 | 49 | " not all matchers found a match so quit further searching 50 | IF enhanced_matches IS NOT INITIAL. 51 | result = VALUE #( BASE result ( LINES OF enhanced_matches ) ). 52 | ELSEIF match_all = abap_true. 53 | CLEAR result. 54 | RETURN. 55 | ENDIF. 56 | 57 | CLEAR: 58 | raw_matches, 59 | enhanced_matches. 60 | ENDLOOP. 61 | ENDMETHOD. 62 | ENDCLASS. 63 | -------------------------------------------------------------------------------- /src/adt/zadcoset_adt_plugin_features.xslt.source.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /src/zcl_adcoset_csp_repsrc_default.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Default search provider for repository source code search

2 | CLASS zcl_adcoset_csp_repsrc_default DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | INTERFACES zif_adcoset_code_search_prov. 8 | 9 | "!

Creates new instance of a default search provider

10 | METHODS constructor. 11 | 12 | PRIVATE SECTION. 13 | METHODS get_include 14 | IMPORTING 15 | object_info TYPE zif_adcoset_ty_global=>ty_tadir_object_info 16 | RETURNING 17 | VALUE(result) TYPE progname. 18 | ENDCLASS. 19 | 20 | 21 | CLASS zcl_adcoset_csp_repsrc_default IMPLEMENTATION. 22 | METHOD constructor. 23 | ENDMETHOD. 24 | 25 | METHOD zif_adcoset_code_search_prov~search. 26 | DATA(include_name) = get_include( object-info ). 27 | 28 | IF include_name IS INITIAL. 29 | RETURN. 30 | ENDIF. 31 | 32 | TRY. 33 | DATA(source) = src_code_reader->get_source_code( name = include_name 34 | type = object-type ). 35 | 36 | LOOP AT src_code_searcher->search( source ) ASSIGNING FIELD-SYMBOL(). 37 | -object_name = include_name. 38 | result = VALUE #( BASE result ( ) ). 39 | ENDLOOP. 40 | 41 | CATCH zcx_adcoset_src_code_read. 42 | ENDTRY. 43 | 44 | zcl_adcoset_search_protocol=>increment_searched_srcs_count( ). 45 | ENDMETHOD. 46 | 47 | METHOD get_include. 48 | DATA include_suffix TYPE string. 49 | 50 | CASE object_info-type. 51 | 52 | WHEN zif_adcoset_c_global=>c_source_code_type-interface. 53 | include_suffix = 'IU'. 54 | 55 | WHEN zif_adcoset_c_global=>c_source_code_type-behavior_definition. 56 | include_suffix = 'BD'. 57 | 58 | WHEN zif_adcoset_c_global=>c_source_code_type-simple_transformation. 59 | include_suffix = 'XT'. 60 | 61 | WHEN zif_adcoset_c_global=>c_source_code_type-type_group. 62 | result = |%_C{ object_info-name }|. 63 | 64 | ENDCASE. 65 | 66 | IF result IS INITIAL AND include_suffix IS NOT INITIAL. 67 | result = object_info-name. 68 | TRANSLATE result(30) USING ' ='. 69 | result+30 = include_suffix. 70 | ENDIF. 71 | ENDMETHOD. 72 | ENDCLASS. 73 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_protocol.clas.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZCL_ADCOSET_SEARCH_PROTOCOL 7 | E 8 | Protocol that collects information during code search 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | ADD_LOC 17 | E 18 | Adds Lines of Code to total searched LoC 19 | 20 | 21 | GET_LOC 22 | E 23 | Retrieves searched Lines of Code 24 | 25 | 26 | GET_SEARCHED_OBJECT_COUNT 27 | E 28 | Returns count of searched objects 29 | 30 | 31 | GET_SEARCHED_SOURCES_COUNT 32 | E 33 | Returns count of searched sources 34 | 35 | 36 | INCREASE_SEARCHD_OBJECTS_COUNT 37 | E 38 | Increases count of searched objects with the given value 39 | 40 | 41 | INCREASE_SEARCHD_SOURCES_COUNT 42 | E 43 | Increases count of searched sources with the given value 44 | 45 | 46 | INCREMENT_SEARCHED_OBJS_COUNT 47 | E 48 | Increments the count of searched objects 49 | 50 | 51 | INCREMENT_SEARCHED_SRCS_COUNT 52 | E 53 | Increments the count of searched sources 54 | 55 | 56 | RESET 57 | E 58 | Resets the protocol values 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scr_dcls.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Source code reader for CDS Access Controls

2 | CLASS zcl_adcoset_scr_dcls DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | INTERFACES zif_adcoset_src_code_reader. 8 | 9 | METHODS constructor 10 | IMPORTING 11 | is_multiline TYPE abap_bool 12 | line_feed TYPE string. 13 | 14 | PRIVATE SECTION. 15 | DATA line_feed TYPE string. 16 | DATA is_multiline TYPE abap_bool. 17 | 18 | METHODS read_dcls 19 | IMPORTING 20 | !name TYPE acmdclsrc-dclname 21 | RETURNING 22 | VALUE(result) TYPE string 23 | RAISING 24 | zcx_adcoset_src_code_read. 25 | ENDCLASS. 26 | 27 | 28 | CLASS zcl_adcoset_scr_dcls IMPLEMENTATION. 29 | METHOD constructor. 30 | me->line_feed = line_feed. 31 | me->is_multiline = is_multiline. 32 | ENDMETHOD. 33 | 34 | METHOD zif_adcoset_src_code_reader~get_source_code. 35 | DATA source TYPE TABLE OF string. 36 | DATA indexes TYPE zif_adcoset_source_code=>ty_line_indexes. 37 | 38 | DATA(source_text) = read_dcls( name ). 39 | 40 | IF is_multiline = abap_true. 41 | indexes = zcl_adcoset_string_util=>determine_line_indexes( source_text = source_text 42 | line_feed = line_feed ). 43 | source = VALUE #( ( source_text ) ). 44 | ELSE. 45 | SPLIT source_text AT line_feed INTO TABLE source. 46 | ENDIF. 47 | 48 | result = NEW zcl_adcoset_source_code( source = source 49 | line_indexes = indexes 50 | comment_regex = zif_adcoset_c_global=>c_cds_comment_regex ). 51 | ENDMETHOD. 52 | 53 | METHOD read_dcls. 54 | DATA(ddlname) = to_upper( name ). 55 | 56 | SELECT SINGLE source FROM acmdclsrc 57 | WHERE dclname = @ddlname 58 | AND as4local = 'A' " only active source 59 | INTO @result. 60 | 61 | IF sy-subrc <> 0 OR result IS INITIAL. 62 | RAISE EXCEPTION TYPE zcx_adcoset_src_code_read. 63 | ENDIF. 64 | 65 | " handle line feed 66 | result = zcl_adcoset_string_util=>adjust_line_endings( text = result 67 | line_feed = line_feed ). 68 | ENDMETHOD. 69 | ENDCLASS. 70 | -------------------------------------------------------------------------------- /src/zadcoset_csset.tabl.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZADCOSET_CSSET 7 | E 8 | TRANSP 9 | Code Search Settings 10 | E 11 | A 12 | 1 13 | 14 | 15 | ZADCOSET_CSSET 16 | A 17 | 0 18 | APPL0 19 | N 20 | 21 | 22 | 23 | UNAME 24 | X 25 | UNAME 26 | 0 27 | X 28 | E 29 | 30 | 31 | PCRE_EXT_MODE_DISABLED 32 | XFELD 33 | 0 34 | X 35 | F 36 | E 37 | 38 | 39 | PCRE_SINGLE_LINE_ENABLED 40 | XFELD 41 | 0 42 | X 43 | F 44 | E 45 | 46 | 47 | PARALLEL_ENABLED 48 | XFELD 49 | 0 50 | X 51 | F 52 | E 53 | 54 | 55 | PARALLEL_SERVER_GROUP 56 | RZLLI_APCL 57 | 0 58 | E 59 | 60 | 61 | PARALLEL_PROC_PACK_SIZE 62 | 0 63 | X 64 | 000004 65 | INT4 66 | 000010 67 | INT4 68 | Number of objects to process in a single parallel API call 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scr_srvd.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Source code reader for Service Definition

2 | CLASS zcl_adcoset_scr_srvd DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | INTERFACES zif_adcoset_src_code_reader. 8 | 9 | METHODS constructor 10 | IMPORTING 11 | is_multiline TYPE abap_bool 12 | line_feed TYPE string. 13 | 14 | PRIVATE SECTION. 15 | CONSTANTS c_srvd_tabname TYPE tabname VALUE 'SRVDSRC_SRC'. 16 | 17 | DATA is_multiline TYPE abap_bool. 18 | DATA line_feed TYPE string. 19 | DATA is_baseinfo_supported TYPE abap_bool. 20 | 21 | METHODS read_srvd 22 | IMPORTING 23 | !name TYPE zif_adcoset_ty_global=>ty_srvdname 24 | RETURNING 25 | VALUE(result) TYPE string 26 | RAISING 27 | zcx_adcoset_src_code_read.. 28 | ENDCLASS. 29 | 30 | 31 | CLASS zcl_adcoset_scr_srvd IMPLEMENTATION. 32 | METHOD constructor. 33 | me->line_feed = line_feed. 34 | me->is_multiline = is_multiline. 35 | ENDMETHOD. 36 | 37 | METHOD zif_adcoset_src_code_reader~get_source_code. 38 | DATA source TYPE TABLE OF string. 39 | DATA indexes TYPE zif_adcoset_source_code=>ty_line_indexes. 40 | 41 | DATA(source_text) = read_srvd( name ). 42 | 43 | IF is_multiline = abap_true. 44 | indexes = zcl_adcoset_string_util=>determine_line_indexes( source_text = source_text 45 | line_feed = line_feed ). 46 | source = VALUE #( ( source_text ) ). 47 | ELSE. 48 | SPLIT source_text AT line_feed INTO TABLE source. 49 | ENDIF. 50 | 51 | result = NEW zcl_adcoset_source_code( source = source 52 | line_indexes = indexes ). 53 | ENDMETHOD. 54 | 55 | METHOD read_srvd. 56 | DATA(srvd_name) = to_upper( name ). 57 | 58 | SELECT SINGLE source 59 | FROM (c_srvd_tabname) 60 | WHERE srvdname = @srvd_name 61 | AND version = 'A' " only active source 62 | INTO @result. 63 | 64 | IF sy-subrc <> 0 OR result IS INITIAL. 65 | RAISE EXCEPTION TYPE zcx_adcoset_src_code_read. 66 | ENDIF. 67 | 68 | " handle line feed 69 | result = zcl_adcoset_string_util=>adjust_line_endings( text = result 70 | line_feed = line_feed ). 71 | ENDMETHOD. 72 | ENDCLASS. 73 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scr_ddlx.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Source code reader for metadata extensions

2 | CLASS zcl_adcoset_scr_ddlx DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | INTERFACES zif_adcoset_src_code_reader. 8 | 9 | METHODS constructor 10 | IMPORTING 11 | is_multiline TYPE abap_bool 12 | line_feed TYPE string. 13 | 14 | PRIVATE SECTION. 15 | CONSTANTS c_ddlx_tabname TYPE tabname VALUE 'DDLXSRC_SRC'. 16 | 17 | DATA line_feed TYPE string. 18 | DATA is_multiline TYPE abap_bool. 19 | 20 | METHODS read_ddlx 21 | IMPORTING 22 | !name TYPE zif_adcoset_ty_global=>ty_ddlxname 23 | RETURNING 24 | VALUE(result) TYPE string 25 | RAISING 26 | zcx_adcoset_src_code_read. 27 | ENDCLASS. 28 | 29 | 30 | CLASS zcl_adcoset_scr_ddlx IMPLEMENTATION. 31 | METHOD constructor. 32 | me->line_feed = line_feed. 33 | me->is_multiline = is_multiline. 34 | ENDMETHOD. 35 | 36 | METHOD zif_adcoset_src_code_reader~get_source_code. 37 | DATA source TYPE TABLE OF string. 38 | DATA indexes TYPE zif_adcoset_source_code=>ty_line_indexes. 39 | 40 | DATA(source_text) = read_ddlx( name ). 41 | 42 | IF is_multiline = abap_true. 43 | indexes = zcl_adcoset_string_util=>determine_line_indexes( source_text = source_text 44 | line_feed = line_feed ). 45 | source = VALUE #( ( source_text ) ). 46 | ELSE. 47 | SPLIT source_text AT line_feed INTO TABLE source. 48 | ENDIF. 49 | 50 | result = NEW zcl_adcoset_source_code( source = source 51 | line_indexes = indexes 52 | comment_regex = zif_adcoset_c_global=>c_cds_comment_regex ). 53 | ENDMETHOD. 54 | 55 | METHOD read_ddlx. 56 | DATA(ddlx_name) = to_upper( name ). 57 | 58 | SELECT SINGLE source 59 | FROM (c_ddlx_tabname) 60 | WHERE ddlxname = @ddlx_name 61 | AND version = 'A' " only active source 62 | INTO @result. 63 | 64 | IF sy-subrc <> 0 OR result IS INITIAL. 65 | RAISE EXCEPTION TYPE zcx_adcoset_src_code_read. 66 | ENDIF. 67 | 68 | " handle line feed 69 | result = zcl_adcoset_string_util=>adjust_line_endings( text = result 70 | line_feed = line_feed ). 71 | ENDMETHOD. 72 | ENDCLASS. 73 | -------------------------------------------------------------------------------- /src/adt/zcx_adcoset_adt_rest.clas.abap: -------------------------------------------------------------------------------- 1 | "!

General ADT error

2 | CLASS zcx_adcoset_adt_rest DEFINITION 3 | PUBLIC 4 | INHERITING FROM cx_adt_rest FINAL 5 | CREATE PUBLIC. 6 | 7 | PUBLIC SECTION. 8 | "!

CONSTRUCTOR

9 | METHODS constructor 10 | IMPORTING 11 | textid LIKE if_t100_message=>t100key OPTIONAL 12 | !text TYPE string OPTIONAL 13 | !previous LIKE previous OPTIONAL 14 | subtype TYPE sadt_exc_type OPTIONAL 15 | !properties TYPE REF TO if_adt_exception_properties OPTIONAL. 16 | 17 | METHODS get_http_status REDEFINITION. 18 | METHODS get_namespace REDEFINITION. 19 | METHODS get_type REDEFINITION. 20 | 21 | PROTECTED SECTION. 22 | 23 | PRIVATE SECTION. 24 | ENDCLASS. 25 | 26 | 27 | CLASS zcx_adcoset_adt_rest IMPLEMENTATION. 28 | METHOD constructor ##ADT_SUPPRESS_GENERATION. 29 | " TODO: parameter TEXTID is never used (ABAP cleaner) 30 | 31 | DATA fill_t100key TYPE abap_bool. 32 | 33 | super->constructor( previous = previous 34 | subtype = subtype 35 | msgv1 = msgv1 36 | msgv2 = msgv2 37 | msgv3 = msgv3 38 | msgv4 = msgv4 39 | properties = properties ). 40 | 41 | IF text IS NOT INITIAL. 42 | fill_t100key = abap_true. 43 | zcl_adcoset_message_util=>split_string_to_symsg( text ). 44 | ELSEIF sy-msgid IS NOT INITIAL. 45 | fill_t100key = abap_true. 46 | ENDIF. 47 | 48 | IF fill_t100key = abap_true. 49 | msgv1 = sy-msgv1. 50 | msgv2 = sy-msgv2. 51 | msgv3 = sy-msgv3. 52 | msgv4 = sy-msgv4. 53 | if_t100_message~t100key = VALUE #( msgid = sy-msgid 54 | msgno = sy-msgno 55 | attr1 = 'MSGV1' 56 | attr2 = 'MSGV2' 57 | attr3 = 'MSGV3' 58 | attr4 = 'MSGV4' ). 59 | ELSE. 60 | if_t100_message~t100key = if_t100_message=>default_textid. 61 | ENDIF. 62 | ENDMETHOD. 63 | 64 | METHOD get_http_status. 65 | result = cl_rest_status_code=>gc_server_error_internal. 66 | ENDMETHOD. 67 | 68 | METHOD get_namespace. 69 | result = 'com.devepos.adt.cst'. 70 | ENDMETHOD. 71 | 72 | METHOD get_type. 73 | result = 'General'. 74 | ENDMETHOD. 75 | ENDCLASS. 76 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_ch_factory.clas.abap: -------------------------------------------------------------------------------- 1 | "!

ADT content handler factory

2 | CLASS zcl_adcoset_adt_ch_factory DEFINITION 3 | PUBLIC FINAL 4 | CREATE PRIVATE. 5 | 6 | PUBLIC SECTION. 7 | "!

Creates content handler for feature list

8 | CLASS-METHODS create_feature_list_ch 9 | RETURNING 10 | VALUE(result) TYPE REF TO if_adt_rest_content_handler. 11 | 12 | "!

Creates content handler for code search settings

13 | CLASS-METHODS create_cs_settings_ch 14 | RETURNING 15 | VALUE(result) TYPE REF TO if_adt_rest_content_handler. 16 | 17 | "!

Creates content handler for code search result

18 | CLASS-METHODS create_search_result_ch 19 | RETURNING 20 | VALUE(result) TYPE REF TO if_adt_rest_content_handler. 21 | 22 | "!

Creates content handler for Code Search Scope

23 | CLASS-METHODS create_search_scope_ch 24 | RETURNING 25 | VALUE(result) TYPE REF TO if_adt_rest_content_handler. 26 | 27 | "!

Creates content handler for Code Search Scope Parameters

28 | CLASS-METHODS create_search_scope_params_ch 29 | RETURNING 30 | VALUE(result) TYPE REF TO if_adt_rest_content_handler. 31 | ENDCLASS. 32 | 33 | 34 | CLASS zcl_adcoset_adt_ch_factory IMPLEMENTATION. 35 | METHOD create_feature_list_ch. 36 | result = cl_adt_rest_st_handler=>create_instance( st_name = 'ZADCOSET_ADT_PLUGIN_FEATURES' 37 | root_name = 'PLUGIN_FEATURES' ). 38 | ENDMETHOD. 39 | 40 | METHOD create_cs_settings_ch. 41 | result = cl_adt_rest_st_handler=>create_instance( st_name = 'ZADCOSET_SEARCH_SETTINGS' 42 | root_name = 'SETTINGS' ). 43 | ENDMETHOD. 44 | 45 | METHOD create_search_result_ch. 46 | result = cl_adt_rest_st_handler=>create_instance( st_name = 'ZADCOSET_SEARCH_RESULT' 47 | root_name = 'ROOT' ). 48 | ENDMETHOD. 49 | 50 | METHOD create_search_scope_ch. 51 | result = cl_adt_rest_st_handler=>create_instance( st_name = 'ZADCOSET_SEARCH_SCOPE' 52 | root_name = 'SCOPE' ). 53 | ENDMETHOD. 54 | 55 | METHOD create_search_scope_params_ch. 56 | result = cl_adt_rest_st_handler=>create_instance( st_name = 'ZADCOSET_SEARCH_SCOPE_PARAMS' 57 | root_name = 'SCOPE_PARAMS' ). 58 | ENDMETHOD. 59 | ENDCLASS. 60 | -------------------------------------------------------------------------------- /src/adt/zcl_adcoset_adt_res_cs_config.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Resource to handle user specific settings of Code Search

2 | CLASS zcl_adcoset_adt_res_cs_config DEFINITION 3 | PUBLIC 4 | INHERITING FROM cl_adt_rest_resource FINAL 5 | CREATE PUBLIC. 6 | 7 | PUBLIC SECTION. 8 | METHODS get REDEFINITION. 9 | METHODS put REDEFINITION. 10 | 11 | PROTECTED SECTION. 12 | 13 | PRIVATE SECTION. 14 | METHODS validate_settings 15 | IMPORTING 16 | settings TYPE zif_adcoset_ty_adt_types=>ty_code_search_settings 17 | RAISING 18 | cx_adt_rest. 19 | 20 | METHODS complete_settings 21 | CHANGING 22 | settings TYPE zif_adcoset_ty_adt_types=>ty_code_search_settings. 23 | ENDCLASS. 24 | 25 | 26 | CLASS zcl_adcoset_adt_res_cs_config IMPLEMENTATION. 27 | METHOD get. 28 | response->set_body_data( content_handler = zcl_adcoset_adt_ch_factory=>create_cs_settings_ch( ) 29 | data = zcl_adcoset_search_settings=>get_settings( ) ). 30 | ENDMETHOD. 31 | 32 | METHOD put. 33 | DATA settings TYPE zif_adcoset_ty_adt_types=>ty_code_search_settings. 34 | 35 | request->get_body_data( EXPORTING content_handler = zcl_adcoset_adt_ch_factory=>create_cs_settings_ch( ) 36 | IMPORTING data = settings ). 37 | 38 | validate_settings( settings ). 39 | complete_settings( CHANGING settings = settings ). 40 | 41 | MODIFY zadcoset_csset FROM settings. 42 | ENDMETHOD. 43 | 44 | METHOD validate_settings. 45 | IF settings-parallel_enabled = abap_false. 46 | RETURN. 47 | ENDIF. 48 | 49 | IF settings-parallel_server_group IS NOT INITIAL. 50 | SELECT SINGLE @abap_true FROM rzllitab 51 | WHERE classname = @settings-parallel_server_group 52 | AND grouptype = @zif_adcoset_c_global=>c_group_type_server_group 53 | INTO @DATA(group_exists). 54 | 55 | IF group_exists = abap_false. 56 | RAISE EXCEPTION TYPE zcx_adcoset_adt_rest 57 | EXPORTING text = |The server group '{ settings-parallel_server_group }' does not exist|. 58 | ENDIF. 59 | ENDIF. 60 | 61 | IF settings-parallel_proc_pack_size < zif_adcoset_c_global=>c_parl_proc_min_pack_size 62 | OR settings-parallel_proc_pack_size > zif_adcoset_c_global=>c_parl_proc_max_pack_size. 63 | RAISE EXCEPTION TYPE zcx_adcoset_adt_rest 64 | EXPORTING text = |Package size must be between { 65 | zif_adcoset_c_global=>c_parl_proc_min_pack_size NUMBER = USER } | && 66 | |and { zif_adcoset_c_global=>c_parl_proc_max_pack_size NUMBER = USER }|. 67 | ENDIF. 68 | ENDMETHOD. 69 | 70 | METHOD complete_settings. 71 | settings-uname = sy-uname. 72 | IF settings-parallel_proc_pack_size IS INITIAL. 73 | settings-parallel_proc_pack_size = zif_adcoset_c_global=>c_parl_proc_min_pack_size. 74 | ENDIF. 75 | ENDMETHOD. 76 | ENDCLASS. 77 | -------------------------------------------------------------------------------- /src/zcl_adcoset_log.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Messages that occur during processing

2 | CLASS zcl_adcoset_log DEFINITION 3 | PUBLIC FINAL 4 | CREATE PRIVATE. 5 | 6 | PUBLIC SECTION. 7 | CLASS-METHODS add_exception 8 | IMPORTING 9 | !exception TYPE REF TO cx_root. 10 | 11 | "!

Adds message

12 | CLASS-METHODS add_message 13 | IMPORTING 14 | !type TYPE string 15 | content TYPE string. 16 | 17 | "!

Adds a list of messages

18 | CLASS-METHODS add_all_messages 19 | IMPORTING 20 | !messages TYPE zif_adcoset_ty_global=>ty_messages. 21 | 22 | "!

Clears current list of messages

23 | CLASS-METHODS clear. 24 | 25 | "!

Returns current list of messages

26 | CLASS-METHODS get_messages 27 | RETURNING 28 | VALUE(result) TYPE zif_adcoset_ty_global=>ty_messages. 29 | 30 | PRIVATE SECTION. 31 | CLASS-DATA messages TYPE HASHED TABLE OF zif_adcoset_ty_global=>ty_message WITH UNIQUE KEY content. 32 | ENDCLASS. 33 | 34 | 35 | CLASS zcl_adcoset_log IMPLEMENTATION. 36 | METHOD add_exception. 37 | DATA error_message TYPE string. 38 | 39 | DATA(parent_exc) = exception. 40 | 41 | WHILE parent_exc IS BOUND OR error_message IS INITIAL. 42 | TRY. 43 | DATA(t100_message) = CAST if_t100_message( parent_exc ). 44 | IF t100_message->t100key-msgid = 'SY' AND t100_message->t100key-msgno = 530. 45 | parent_exc = parent_exc->previous. 46 | CONTINUE. 47 | ENDIF. 48 | 49 | CATCH cx_sy_move_cast_error. 50 | ENDTRY. 51 | 52 | " add all messages to the log?? 53 | error_message = parent_exc->get_text( ). 54 | parent_exc = parent_exc->previous. 55 | 56 | ENDWHILE. 57 | 58 | IF error_message IS INITIAL AND exception IS BOUND. 59 | error_message = exception->get_text( ). 60 | ENDIF. 61 | 62 | add_message( type = zif_adcoset_c_global=>c_message_type-error 63 | content = error_message ). 64 | ENDMETHOD. 65 | 66 | METHOD add_message. 67 | CHECK content IS NOT INITIAL. 68 | 69 | ASSIGN messages[ content = content ] TO FIELD-SYMBOL(). 70 | IF sy-subrc <> 0. 71 | INSERT VALUE #( type = type 72 | content = content 73 | occurrences = 1 ) INTO TABLE messages. 74 | ELSE. 75 | -occurrences = -occurrences + 1. 76 | ENDIF. 77 | ENDMETHOD. 78 | 79 | METHOD clear. 80 | CLEAR messages. 81 | ENDMETHOD. 82 | 83 | METHOD get_messages. 84 | result = messages. 85 | ENDMETHOD. 86 | 87 | METHOD add_all_messages. 88 | LOOP AT messages ASSIGNING FIELD-SYMBOL(). 89 | INSERT INTO TABLE zcl_adcoset_log=>messages. 90 | ENDLOOP. 91 | ENDMETHOD. 92 | ENDCLASS. 93 | -------------------------------------------------------------------------------- /src/zcl_adcoset_substring_matcher.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Finds matches in a string for a given (RegExp) pattern

2 | CLASS zcl_adcoset_substring_matcher DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | INTERFACES zif_adcoset_pattern_matcher. 8 | 9 | METHODS constructor 10 | IMPORTING 11 | !pattern TYPE zif_adcoset_ty_global=>ty_pattern OPTIONAL 12 | ignore_case TYPE abap_bool. 13 | 14 | PRIVATE SECTION. 15 | ALIASES control_flags FOR zif_adcoset_pattern_matcher~control_flags. 16 | 17 | DATA pattern TYPE string. 18 | DATA ignore_case TYPE abap_bool. 19 | ENDCLASS. 20 | 21 | 22 | CLASS zcl_adcoset_substring_matcher IMPLEMENTATION. 23 | METHOD constructor. 24 | me->pattern = pattern-content. 25 | control_flags = pattern-flags. 26 | me->ignore_case = ignore_case. 27 | ENDMETHOD. 28 | 29 | METHOD zif_adcoset_pattern_matcher~find_matches. 30 | IF ignore_case = abap_true. 31 | FIND ALL OCCURRENCES OF pattern IN TABLE source IGNORING CASE RESULTS result. 32 | ELSE. 33 | FIND ALL OCCURRENCES OF pattern IN TABLE source RESPECTING CASE RESULTS result. 34 | ENDIF. 35 | ENDMETHOD. 36 | 37 | METHOD zif_adcoset_pattern_matcher~find_matches_in_range. 38 | IF ignore_case = abap_true. 39 | FIND ALL OCCURRENCES OF pattern IN TABLE source 40 | FROM start_line OFFSET offset 41 | TO end_line OFFSET end_offset 42 | IGNORING CASE RESULTS result. 43 | ELSE. 44 | FIND ALL OCCURRENCES OF pattern IN TABLE source 45 | FROM start_line OFFSET offset 46 | TO end_line OFFSET end_offset 47 | RESPECTING CASE RESULTS result. 48 | ENDIF. 49 | ENDMETHOD. 50 | 51 | METHOD zif_adcoset_pattern_matcher~find_next_match. 52 | DATA(l_start_line) = COND #( WHEN start_line IS INITIAL THEN 1 ELSE start_line ). 53 | 54 | IF ignore_case = abap_true. 55 | IF end_line IS NOT INITIAL AND end_offset IS NOT INITIAL. 56 | FIND FIRST OCCURRENCE OF pattern IN TABLE source 57 | FROM l_start_line OFFSET offset 58 | TO end_line OFFSET end_offset 59 | IGNORING CASE 60 | RESULTS result. 61 | ELSE. 62 | FIND FIRST OCCURRENCE OF pattern IN TABLE source 63 | FROM l_start_line OFFSET offset 64 | IGNORING CASE 65 | RESULTS result. 66 | ENDIF. 67 | ELSE. 68 | IF end_line IS NOT INITIAL AND end_offset IS NOT INITIAL. 69 | FIND FIRST OCCURRENCE OF pattern IN TABLE source 70 | FROM l_start_line OFFSET offset 71 | TO end_line OFFSET end_offset 72 | RESPECTING CASE 73 | RESULTS result. 74 | ELSE. 75 | FIND FIRST OCCURRENCE OF pattern IN TABLE source 76 | FROM l_start_line OFFSET offset 77 | RESPECTING CASE 78 | RESULTS result. 79 | ENDIF. 80 | ENDIF. 81 | ENDMETHOD. 82 | ENDCLASS. 83 | -------------------------------------------------------------------------------- /src/zcl_adcoset_parl_search_query.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Query for code search (with parallel processing)

2 | CLASS zcl_adcoset_parl_search_query DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | INTERFACES zif_adcoset_search_query. 8 | INTERFACES zif_adcoset_parl_result_recv. 9 | 10 | METHODS constructor 11 | IMPORTING 12 | !scope TYPE REF TO zif_adcoset_search_scope 13 | task_runner TYPE REF TO zif_adcoset_parl_task_runner 14 | settings TYPE zif_adcoset_ty_global=>ty_search_settings_int. 15 | 16 | PRIVATE SECTION. 17 | DATA scope TYPE REF TO zif_adcoset_search_scope. 18 | DATA task_runner TYPE REF TO zif_adcoset_parl_task_runner. 19 | DATA settings TYPE zif_adcoset_ty_global=>ty_search_settings_int. 20 | DATA search_results TYPE zif_adcoset_ty_global=>ty_search_result_objects. 21 | ENDCLASS. 22 | 23 | 24 | CLASS zcl_adcoset_parl_search_query IMPLEMENTATION. 25 | METHOD constructor. 26 | ASSERT: 27 | scope IS BOUND, 28 | task_runner IS BOUND. 29 | 30 | me->scope = scope. 31 | me->task_runner = task_runner. 32 | me->settings = settings. 33 | 34 | " registers this instance as result receiver 35 | me->task_runner->set_result_receiver( me ). 36 | ENDMETHOD. 37 | 38 | METHOD zif_adcoset_parl_result_recv~send_results. 39 | FIELD-SYMBOLS TYPE zif_adcoset_ty_global=>ty_search_package_result. 40 | 41 | ASSIGN results TO . 42 | IF sy-subrc <> 0. 43 | RETURN. 44 | ENDIF. 45 | 46 | LOOP AT -result_objects REFERENCE INTO DATA(result_object). 47 | INSERT result_object->* INTO TABLE search_results. 48 | IF sy-subrc <> 0. 49 | DATA(existing_object) = REF #( search_results[ object_info-name = result_object->object_info-name 50 | object_info-type = result_object->object_info-type ] ). 51 | INSERT LINES OF result_object->text_matches INTO TABLE existing_object->text_matches. 52 | ENDIF. 53 | ENDLOOP. 54 | zcl_adcoset_log=>add_all_messages( -messages ). 55 | zcl_adcoset_search_protocol=>increase_searchd_objects_count( -searched_objects_count ). 56 | zcl_adcoset_search_protocol=>increase_searchd_sources_count( -searched_sources_count ). 57 | zcl_adcoset_search_protocol=>add_loc( -loc ). 58 | ENDMETHOD. 59 | 60 | METHOD zif_adcoset_search_query~run. 61 | WHILE scope->has_next_package( ). 62 | DATA(package) = scope->next_package( ). 63 | 64 | " process new package asynchronously 65 | task_runner->run( input = VALUE zif_adcoset_ty_global=>ty_search_package( settings = settings 66 | scope_package = package ) ). 67 | ENDWHILE. 68 | 69 | task_runner->wait_until_finished( ). 70 | ENDMETHOD. 71 | 72 | METHOD zif_adcoset_search_query~get_results. 73 | result = search_results. 74 | ENDMETHOD. 75 | ENDCLASS. 76 | -------------------------------------------------------------------------------- /src/zcl_adcoset_scr_ddls.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Source code reader for CDS view

2 | CLASS zcl_adcoset_scr_ddls DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | INTERFACES zif_adcoset_src_code_reader. 8 | 9 | METHODS constructor 10 | IMPORTING 11 | is_multiline TYPE abap_bool 12 | line_feed TYPE string. 13 | 14 | PRIVATE SECTION. 15 | DATA is_multiline TYPE abap_bool. 16 | DATA line_feed TYPE string. 17 | DATA is_baseinfo_supported TYPE abap_bool. 18 | 19 | METHODS read_ddls 20 | IMPORTING 21 | !name TYPE ddlname 22 | RETURNING 23 | VALUE(result) TYPE string 24 | RAISING 25 | zcx_adcoset_src_code_read. 26 | 27 | METHODS check_base_info_support. 28 | ENDCLASS. 29 | 30 | 31 | CLASS zcl_adcoset_scr_ddls IMPLEMENTATION. 32 | METHOD constructor. 33 | me->line_feed = line_feed. 34 | me->is_multiline = is_multiline. 35 | check_base_info_support( ). 36 | ENDMETHOD. 37 | 38 | METHOD zif_adcoset_src_code_reader~get_source_code. 39 | DATA source TYPE TABLE OF string. 40 | DATA indexes TYPE zif_adcoset_source_code=>ty_line_indexes. 41 | 42 | DATA(source_text) = read_ddls( name ). 43 | 44 | IF is_multiline = abap_true. 45 | indexes = zcl_adcoset_string_util=>determine_line_indexes( source_text = source_text 46 | line_feed = line_feed ). 47 | source = VALUE #( ( source_text ) ). 48 | ELSE. 49 | SPLIT source_text AT line_feed INTO TABLE source. 50 | ENDIF. 51 | 52 | result = NEW zcl_adcoset_source_code( source = source 53 | line_indexes = indexes 54 | comment_regex = zif_adcoset_c_global=>c_cds_comment_regex ). 55 | ENDMETHOD. 56 | 57 | METHOD read_ddls. 58 | DATA(ddlname) = to_upper( name ). 59 | 60 | SELECT SINGLE source FROM ddddlsrc 61 | WHERE ddlname = @ddlname 62 | AND as4local = 'A' " only active source 63 | INTO @result. 64 | 65 | IF sy-subrc <> 0 OR result IS INITIAL. 66 | RAISE EXCEPTION TYPE zcx_adcoset_src_code_read. 67 | ELSEIF is_baseinfo_supported = abap_false. 68 | RETURN. 69 | ENDIF. 70 | 71 | " handle line feed 72 | result = zcl_adcoset_string_util=>adjust_line_endings( text = result 73 | line_feed = line_feed ). 74 | 75 | " remove base info string which is not externally visible anyway 76 | DATA(base_info_offset) = find( val = result regex = '\s*[\r\n|\n]\s*/\*\+\[internal\]' ). 77 | 78 | IF base_info_offset > 0. 79 | result = substring( val = result len = base_info_offset ). 80 | ENDIF. 81 | ENDMETHOD. 82 | 83 | METHOD check_base_info_support. 84 | " TODO: variable is assigned but never used (ABAP cleaner) 85 | ASSIGN 'IF_DD_DDL_TYPES=>TY_S_BASEINFO_STRING_SAVE' TO FIELD-SYMBOL(). 86 | is_baseinfo_supported = xsdbool( sy-subrc = 0 ). 87 | ENDMETHOD. 88 | ENDCLASS. 89 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_query_fac.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Factory for creating search queries

2 | CLASS zcl_adcoset_search_query_fac DEFINITION 3 | PUBLIC FINAL 4 | CREATE PRIVATE. 5 | 6 | PUBLIC SECTION. 7 | "!

Creates query instance

8 | CLASS-METHODS create_query 9 | IMPORTING 10 | parallel_processing TYPE zif_adcoset_ty_global=>ty_parl_processing OPTIONAL 11 | !scope TYPE REF TO zif_adcoset_search_scope 12 | settings TYPE zif_adcoset_ty_global=>ty_search_settings_int 13 | RETURNING 14 | VALUE(result) TYPE REF TO zif_adcoset_search_query 15 | RAISING 16 | zcx_adcoset_static_error. 17 | ENDCLASS. 18 | 19 | 20 | CLASS zcl_adcoset_search_query_fac IMPLEMENTATION. 21 | METHOD create_query. 22 | DATA task_runner TYPE REF TO zif_adcoset_parl_task_runner. 23 | 24 | DATA(run_parallel) = parallel_processing-enabled. 25 | 26 | IF scope->count( ) < zif_adcoset_c_global=>c_parl_proc_min_objects. 27 | run_parallel = abap_false. 28 | ENDIF. 29 | 30 | IF run_parallel = abap_true. 31 | TRY. 32 | task_runner = zcl_adcoset_parl_task_runner=>new( server_group = parallel_processing-server_group 33 | * task_prefix = 34 | * max_tasks = 10 35 | " TODO: move handler_class/handler_method to parallel settings??? 36 | handler_class = 'ZCL_ADCOSET_SEARCH_ENGINE' 37 | handler_method = 'RUN_CODE_SEARCH_ARFC' ). 38 | 39 | IF settings-is_adt = abap_true. 40 | DATA(max_objs_for_parl_proc) = zcl_adcoset_search_settings=>get_settings( )-parallel_proc_pack_size. 41 | ENDIF. 42 | 43 | " update the package size 44 | scope->configure_package_size( max_task_count = task_runner->get_max_tasks( ) 45 | max_objects = max_objs_for_parl_proc ). 46 | CATCH zcx_adcoset_static_error INTO DATA(error) ##NEEDED. 47 | zcl_adcoset_log=>add_exception( error ). 48 | ENDTRY. 49 | ENDIF. 50 | 51 | result = COND #( 52 | WHEN task_runner IS BOUND 53 | THEN NEW zcl_adcoset_parl_search_query( task_runner = task_runner 54 | scope = scope 55 | settings = settings ) 56 | ELSE NEW zcl_adcoset_search_query( scope = scope 57 | settings = settings-basic_settings 58 | custom_settings = settings-custom_settings 59 | matchers = zcl_adcoset_matcher_factory=>create_matchers( 60 | pattern_config = settings-pattern_config ) ) ). 61 | ENDMETHOD. 62 | ENDCLASS. 63 | -------------------------------------------------------------------------------- /src/zif_adcoset_ty_global.intf.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | ZIF_ADCOSET_TY_GLOBAL 7 | E 8 | Global types for advanced code search 9 | 2 10 | 1 11 | X 12 | 13 | 14 | 15 | TY_MATCH_IDENTIFIER 16 | E 17 | Uniquely identifies a match 18 | 19 | 20 | TY_PARALLEL_HANDLER 21 | E 22 | Param definitions for parallel processing handler 23 | 24 | 25 | TY_SEARCH_OPTION 26 | E 27 | Represents search option with its values 28 | 29 | 30 | TY_SEARCH_OPTIONS 31 | E 32 | Table of search options 33 | 34 | 35 | TY_SEARCH_OPTION_RANGE 36 | E 37 | Value range for search option 38 | 39 | 40 | TY_SEARCH_OPTION_RANGES 41 | E 42 | Table of option value ranges 43 | 44 | 45 | TY_SEARCH_PACKAGE 46 | E 47 | Defines search package for parallel search 48 | 49 | 50 | TY_SEARCH_SCOPE 51 | E 52 | Ranges / data to define an object scope 53 | 54 | 55 | TY_SEARCH_SCOPE_RANGES 56 | E 57 | Ranges for determining the search scope 58 | 59 | 60 | TY_SEARCH_SETTINGS 61 | E 62 | Basic search settings 63 | 64 | 65 | TY_SEARCH_SETTINGS_EXTERNAL 66 | E 67 | External settings for code search API 68 | 69 | 70 | TY_SEARCH_SETTINGS_INT 71 | E 72 | Internal code search settings 73 | 74 | 75 | TY_TADIR_OBJECT 76 | E 77 | Tadir object with corresponding subobjects 78 | 79 | 80 | TY_TADIR_OBJECTS 81 | E 82 | Table of tadir object with corresponding subobjects 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /src/zcl_adcoset_matcher_factory.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Factory to create matchers

2 | CLASS zcl_adcoset_matcher_factory DEFINITION 3 | PUBLIC FINAL 4 | CREATE PRIVATE. 5 | 6 | PUBLIC SECTION. 7 | "!

Creates matcher for the given type and pattern

8 | CLASS-METHODS create_matcher 9 | IMPORTING 10 | !type TYPE zif_adcoset_ty_global=>ty_matcher_type 11 | pcre_settings TYPE zif_adcoset_ty_global=>ty_pcre_regex_settings OPTIONAL 12 | !pattern TYPE zif_adcoset_ty_global=>ty_pattern 13 | ignore_case TYPE abap_bool OPTIONAL 14 | RETURNING 15 | VALUE(result) TYPE REF TO zif_adcoset_pattern_matcher 16 | RAISING 17 | zcx_adcoset_no_matcher 18 | cx_sy_regex. 19 | 20 | "!

Creates matchers from pattern range

21 | CLASS-METHODS create_matchers 22 | IMPORTING 23 | pattern_config TYPE zif_adcoset_ty_global=>ty_pattern_config 24 | RETURNING 25 | VALUE(result) TYPE zif_adcoset_pattern_matcher=>ty_ref_tab 26 | RAISING 27 | zcx_adcoset_static_error. 28 | 29 | PRIVATE SECTION. 30 | CLASS-DATA pcre_supported TYPE abap_bool VALUE abap_undefined. 31 | ENDCLASS. 32 | 33 | 34 | CLASS zcl_adcoset_matcher_factory IMPLEMENTATION. 35 | METHOD create_matcher. 36 | result = SWITCH #( type 37 | 38 | WHEN zif_adcoset_c_global=>c_matcher_type-posix_regex THEN 39 | NEW zcl_adcoset_posix_regex_matchr( pattern = pattern 40 | ignore_case = ignore_case ) 41 | 42 | WHEN zif_adcoset_c_global=>c_matcher_type-pcre THEN 43 | NEW zcl_adcoset_pcre_matcher( pattern = pattern 44 | settings = pcre_settings 45 | ignore_case = ignore_case ) 46 | 47 | WHEN zif_adcoset_c_global=>c_matcher_type-substring THEN 48 | NEW zcl_adcoset_substring_matcher( pattern = pattern 49 | ignore_case = ignore_case ) 50 | 51 | ELSE 52 | THROW zcx_adcoset_no_matcher( ) ). 53 | ENDMETHOD. 54 | 55 | METHOD create_matchers. 56 | LOOP AT pattern_config-patterns ASSIGNING FIELD-SYMBOL(). 57 | TRY. 58 | result = VALUE #( BASE result 59 | ( create_matcher( type = pattern_config-matcher_type 60 | pattern = 61 | pcre_settings = pattern_config-pcre_settings 62 | ignore_case = pattern_config-ignore_case ) ) ). 63 | CATCH zcx_adcoset_no_matcher 64 | cx_sy_regex INTO DATA(matcher_error). 65 | RAISE EXCEPTION TYPE zcx_adcoset_static_error 66 | EXPORTING previous = matcher_error. 67 | ENDTRY. 68 | ENDLOOP. 69 | ENDMETHOD. 70 | ENDCLASS. 71 | -------------------------------------------------------------------------------- /src/zcl_adcoset_string_util.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Utility for string processing

2 | CLASS zcl_adcoset_string_util DEFINITION 3 | PUBLIC FINAL 4 | CREATE PRIVATE. 5 | 6 | PUBLIC SECTION. 7 | "!

Adjusts the line endings in the given source

8 | CLASS-METHODS adjust_line_endings 9 | IMPORTING 10 | !text TYPE string 11 | line_feed TYPE string 12 | RETURNING 13 | VALUE(result) TYPE string. 14 | 15 | "!

Transforms tabular source into single string

16 | CLASS-METHODS transform_to_string 17 | IMPORTING 18 | source_table TYPE string_table 19 | line_feed TYPE string 20 | EXPORTING 21 | source_text TYPE string 22 | indexes TYPE zif_adcoset_source_code=>ty_line_indexes. 23 | 24 | "!

Determines the line indexes in the source

25 | CLASS-METHODS determine_line_indexes 26 | IMPORTING 27 | source_text TYPE string OPTIONAL 28 | source_table TYPE string_table OPTIONAL 29 | line_feed TYPE string 30 | RETURNING 31 | VALUE(result) TYPE zif_adcoset_source_code=>ty_line_indexes. 32 | ENDCLASS. 33 | 34 | 35 | CLASS zcl_adcoset_string_util IMPLEMENTATION. 36 | METHOD adjust_line_endings. 37 | CHECK text IS NOT INITIAL. 38 | 39 | IF line_feed = |\r\n|. 40 | IF find( val = text sub = line_feed ) = -1. 41 | result = replace( val = text sub = |\n| with = line_feed occ = 0 ). 42 | ELSEIF find( val = text regex = `^\n|[^\r]\n` ) = -1. 43 | result = text. 44 | ELSE. 45 | result = replace( val = text sub = |\r\n| with = |\n| occ = 0 ). 46 | result = replace( val = result sub = |\n| with = |\r\n| occ = 0 ). 47 | ENDIF. 48 | ELSE. 49 | result = replace( val = text sub = |\r\n| with = |\n| occ = 0 ). 50 | ENDIF. 51 | ENDMETHOD. 52 | 53 | METHOD determine_line_indexes. 54 | DATA l_source_table TYPE TABLE OF string. 55 | 56 | DATA(line_offset) = 0. 57 | 58 | DATA(line_feed_length) = strlen( line_feed ). 59 | 60 | IF source_text IS NOT INITIAL. 61 | SPLIT source_text AT line_feed INTO TABLE l_source_table. 62 | ELSE. 63 | l_source_table = source_table. 64 | ENDIF. 65 | 66 | LOOP AT l_source_table ASSIGNING FIELD-SYMBOL(). 67 | " TODO: variable is assigned but never used (ABAP cleaner) 68 | DATA(line_number) = sy-tabix. 69 | DATA(line_length) = strlen( ). 70 | result = VALUE #( BASE result 71 | ( number = sy-tabix 72 | offset = line_offset 73 | length = line_length ) ). 74 | 75 | line_offset = line_offset + line_length + line_feed_length. 76 | ENDLOOP. 77 | ENDMETHOD. 78 | 79 | METHOD transform_to_string. 80 | CLEAR: source_text, 81 | indexes. 82 | 83 | indexes = determine_line_indexes( source_table = source_table 84 | line_feed = line_feed ). 85 | 86 | source_text = concat_lines_of( table = source_table sep = line_feed ). 87 | ENDMETHOD. 88 | ENDCLASS. 89 | -------------------------------------------------------------------------------- /src/zcl_adcoset_search_protocol.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Protocol that collects information during code search

2 | CLASS zcl_adcoset_search_protocol DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | "!

Resets the protocol values

8 | CLASS-METHODS reset. 9 | 10 | "!

Adds Lines of Code to total searched LoC

11 | CLASS-METHODS add_loc 12 | IMPORTING 13 | loc TYPE f. 14 | 15 | "!

Increments the count of searched objects

16 | CLASS-METHODS increment_searched_objs_count 17 | IMPORTING 18 | searched_objs_count TYPE i OPTIONAL. 19 | 20 | "!

Increments the count of searched sources

21 | CLASS-METHODS increment_searched_srcs_count. 22 | 23 | "!

Increases count of searched sources with the given value

24 | CLASS-METHODS increase_searchd_sources_count 25 | IMPORTING 26 | !value TYPE i. 27 | 28 | "!

Increases count of searched objects with the given value

29 | CLASS-METHODS increase_searchd_objects_count 30 | IMPORTING 31 | !value TYPE i. 32 | 33 | "!

Retrieves searched Lines of Code

34 | CLASS-METHODS get_loc 35 | RETURNING 36 | VALUE(result) TYPE i. 37 | 38 | "!

Returns count of searched objects

39 | CLASS-METHODS get_searched_object_count 40 | RETURNING 41 | VALUE(result) TYPE i. 42 | 43 | "!

Returns count of searched sources

44 | CLASS-METHODS get_searched_sources_count 45 | RETURNING 46 | VALUE(result) TYPE i. 47 | 48 | PRIVATE SECTION. 49 | CLASS-DATA searched_objects_count TYPE i. 50 | CLASS-DATA loc TYPE f. 51 | CLASS-DATA searched_sources_count TYPE i. 52 | ENDCLASS. 53 | 54 | 55 | CLASS zcl_adcoset_search_protocol IMPLEMENTATION. 56 | METHOD add_loc. 57 | zcl_adcoset_search_protocol=>loc = zcl_adcoset_search_protocol=>loc + loc. 58 | ENDMETHOD. 59 | 60 | METHOD increment_searched_objs_count. 61 | IF searched_objs_count IS NOT INITIAL. 62 | searched_objects_count = searched_objects_count + searched_objs_count. 63 | ELSE. 64 | searched_objects_count = searched_objects_count + 1. 65 | ENDIF. 66 | ENDMETHOD. 67 | 68 | METHOD increment_searched_srcs_count. 69 | searched_sources_count = searched_sources_count + 1. 70 | ENDMETHOD. 71 | 72 | METHOD reset. 73 | CLEAR: 74 | searched_objects_count, 75 | searched_sources_count, 76 | loc. 77 | ENDMETHOD. 78 | 79 | METHOD get_searched_object_count. 80 | result = searched_objects_count. 81 | ENDMETHOD. 82 | 83 | METHOD get_searched_sources_count. 84 | result = searched_sources_count. 85 | ENDMETHOD. 86 | 87 | METHOD increase_searchd_sources_count. 88 | searched_sources_count = searched_sources_count + value. 89 | ENDMETHOD. 90 | 91 | METHOD increase_searchd_objects_count. 92 | searched_objects_count = searched_objects_count + value. 93 | ENDMETHOD. 94 | 95 | METHOD get_loc. 96 | result = loc. 97 | ENDMETHOD. 98 | ENDCLASS. 99 | -------------------------------------------------------------------------------- /src/zadcoset_i_transportsrccodobj.ddls.asddls: -------------------------------------------------------------------------------- 1 | @AbapCatalog.preserveKey: true 2 | @AbapCatalog.sqlViewName: 'ZADCOSET_ITRSCO' 3 | 4 | @AccessControl.authorizationCheck: #NOT_REQUIRED 5 | 6 | @EndUserText.label: 'Rep. obj. of Tr. Request for Code Search' 7 | 8 | define view ZADCOSET_I_TransportSrcCodObj 9 | as select from e071 as TransportObject 10 | 11 | inner join tadir as Object 12 | on TransportObject.pgmid = Object.pgmid 13 | and TransportObject.object = Object.object 14 | and TransportObject.obj_name = Object.obj_name 15 | 16 | { 17 | key TransportObject.trkorr as Request, 18 | key TransportObject.pgmid as ProgramId, 19 | key TransportObject.object as ObjectType, 20 | key TransportObject.obj_name as ObjectName, 21 | 22 | Object.devclass as DevelopmentPackage, 23 | Object.author as Owner, 24 | Object.created_on as CreatedDate 25 | } 26 | 27 | where TransportObject.obj_name not like '______________________________VC' 28 | and Object.pgmid = 'R3TR' 29 | and Object.delflag = '' 30 | and(Object.object = 'CLAS' 31 | or Object.object = 'INTF' 32 | or Object.object = 'PROG' 33 | or Object.object = 'FUGR' 34 | or Object.object = 'TYPE' 35 | or Object.object = 'DDLS' 36 | or Object.object = 'DCLS' 37 | or Object.object = 'DDLX' 38 | or Object.object = 'BDEF' 39 | or Object.object = 'SRVD' 40 | or Object.object = 'XSLT') 41 | 42 | union 43 | 44 | select from e071 as TransportObject 45 | 46 | inner join tadir as Object 47 | on TransportObject.pgmid = Object.pgmid 48 | and TransportObject.object = Object.object 49 | and TransportObject.obj_name = Object.obj_name 50 | 51 | inner join ZADCOSET_I_SearchableTable as Tabl 52 | on Object.obj_name = Tabl.ObjectName 53 | 54 | { 55 | key TransportObject.trkorr as Request, 56 | key TransportObject.pgmid as ProgramId, 57 | key Tabl.ObjectType, 58 | key TransportObject.obj_name as ObjectName, 59 | 60 | Object.devclass as DevelopmentPackage, 61 | Object.author as Owner, 62 | Object.created_on as CreatedDate 63 | } 64 | 65 | where Object.pgmid = 'R3TR' 66 | and Object.delflag = '' 67 | and Object.object = 'TABL' 68 | 69 | union all 70 | 71 | select from e071 as TransportObject 72 | 73 | { 74 | key TransportObject.trkorr as Request, 75 | key TransportObject.pgmid as ProgramId, 76 | key TransportObject.object as ObjectType, 77 | key TransportObject.obj_name as ObjectName, 78 | 79 | '' as DevelopmentPackage, 80 | '' as Owner, 81 | cast('' as abap.dats) as CreatedDate 82 | } 83 | 84 | where(TransportObject.pgmid = 'LIMU' 85 | and(TransportObject.object = 'FUNC' 86 | or TransportObject.object = 'METH' 87 | or TransportObject.object = 'REPS' 88 | or TransportObject.object = 'CLSD' 89 | or TransportObject.object = 'CPUB' 90 | or TransportObject.object = 'CPRO' 91 | or TransportObject.object = 'CPRI' 92 | or TransportObject.object = 'CINC')) 93 | and TransportObject.obj_name not like '______________________________VC' 94 | -------------------------------------------------------------------------------- /src/zcl_adcoset_cds_name_mapper.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Maps technical to display name of Core Data Services

2 | CLASS zcl_adcoset_cds_name_mapper DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | "!

Collects entry for mapping

8 | METHODS collect_entry 9 | IMPORTING 10 | !name TYPE string 11 | !type TYPE trobjtype 12 | RETURNING 13 | VALUE(result) TYPE abap_bool. 14 | 15 | "!

Tries to map all collected entries

16 | METHODS map_entries 17 | RETURNING 18 | VALUE(result) TYPE abap_bool. 19 | 20 | "!

Retrieves display name of a given entry

21 | METHODS get_display_name 22 | IMPORTING 23 | !name TYPE string 24 | !type TYPE trobjtype 25 | RETURNING 26 | VALUE(result) TYPE string. 27 | 28 | PRIVATE SECTION. 29 | TYPES: 30 | BEGIN OF ty_ddl2entity_map_entry, 31 | ddlname TYPE ddlname, 32 | entity_name TYPE objectname, 33 | END OF ty_ddl2entity_map_entry, 34 | 35 | ty_ddl2entity_map TYPE HASHED TABLE OF ty_ddl2entity_map_entry WITH UNIQUE KEY ddlname. 36 | 37 | DATA ddlname_range TYPE RANGE OF ddlname. 38 | DATA bdefname_range TYPE RANGE OF objectname. 39 | DATA ddl2entity_map TYPE ty_ddl2entity_map. 40 | DATA bdef2entity_map TYPE ty_ddl2entity_map. 41 | ENDCLASS. 42 | 43 | 44 | CLASS zcl_adcoset_cds_name_mapper IMPLEMENTATION. 45 | METHOD collect_entry. 46 | IF type = zif_adcoset_c_global=>c_source_code_type-data_definition. 47 | ddlname_range = VALUE #( BASE ddlname_range ( sign = 'I' option = 'EQ' low = name ) ). 48 | ELSEIF type = zif_adcoset_c_global=>c_source_code_type-behavior_definition. 49 | bdefname_range = VALUE #( BASE bdefname_range ( sign = 'I' option = 'EQ' low = name ) ). 50 | ELSE. 51 | RETURN. 52 | ENDIF. 53 | 54 | result = abap_true. 55 | ENDMETHOD. 56 | 57 | METHOD get_display_name. 58 | DATA entity_map_entry TYPE REF TO ty_ddl2entity_map_entry. 59 | 60 | IF type = zif_adcoset_c_global=>c_source_code_type-data_definition. 61 | entity_map_entry = REF #( ddl2entity_map[ ddlname = name ] OPTIONAL ). 62 | ELSEIF type = zif_adcoset_c_global=>c_source_code_type-behavior_definition. 63 | entity_map_entry = REF #( bdef2entity_map[ ddlname = name ] OPTIONAL ). 64 | ENDIF. 65 | 66 | IF entity_map_entry IS NOT INITIAL. 67 | result = entity_map_entry->entity_name. 68 | ENDIF. 69 | ENDMETHOD. 70 | 71 | METHOD map_entries. 72 | IF ddlname_range IS NOT INITIAL. 73 | SELECT dep~ddlname, 74 | stob~strucobjn_raw AS entity_name 75 | FROM ddldependency AS dep 76 | INNER JOIN dd02b AS stob 77 | ON dep~objectname = stob~strucobjn 78 | WHERE ddlname IN @ddlname_range 79 | AND objecttype = 'STOB' 80 | AND state = 'A' 81 | INTO CORRESPONDING FIELDS OF TABLE @ddl2entity_map. 82 | ENDIF. 83 | 84 | IF bdefname_range IS NOT INITIAL. 85 | SELECT strucobjn AS ddlname, 86 | strucobjn_raw AS entity_name 87 | FROM dd02b 88 | WHERE strucobjn IN @bdefname_range 89 | INTO CORRESPONDING FIELDS OF TABLE @bdef2entity_map. 90 | ENDIF. 91 | 92 | result = xsdbool( ddl2entity_map IS NOT INITIAL OR bdef2entity_map IS NOT INITIAL ). 93 | ENDMETHOD. 94 | ENDCLASS. 95 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](https://img.shields.io/badge/ABAP-v7.40+-green) 2 | [![abap package version](https://img.shields.io/endpoint?url=https://shield.abappm.com/github/DevEpos/abap-code-search-tools/-main/src/zif_adcoset_version.intf.abap/version&label=version)](https://github.com/DevEpos/abap-code-search-tools/blob/main/src/zif_adcoset_version.intf.abap) 3 | 4 | # abap-code-search 5 | 6 | ABAP Advanced Code Search Tools 7 | 8 | ## Description 9 | 10 | Searches Code in ABAP sources like 11 | 12 | - [X] Classes (CLAS) 13 | - [X] Interfaces (INTF) 14 | - [X] Programs (PROG) 15 | - [X] Type Groups (TYPE) 16 | - [X] Function Groups (FUGR) 17 | - [X] Data Definitions (DDLS) 18 | - [X] Metadata Extensions (DDLX) 19 | - [X] Access Controls (DCLS) 20 | - [X] Behavior Definitions (BDEV) 21 | - [X] Simple Transformations (XSLT) 22 | - [X] Structures (STRU) --> ABAP 7.50 23 | - [X] Database Tables (DTAB) --> ABAP 7.52 24 | 25 | The search is done entirely via ABAP (as opposed to the ADT Source Search). There is an option to run the search in parallel for better performance 26 | 27 | ### Search features 28 | 29 | Search can be done via normal String search or with Regular Expressions. If supported by the system it is also possible to activate PCRE (Perl Compatible Regular Expressions) 30 | 31 | ### UI 32 | 33 | You can execute the search via report `ZADCOSET_SEARCH`, where most of the options are available as well, but the main focus of the UI will be ADT (see [ABAP Code Search](https://github.com/DevEpos/eclipse-adt-plugins/tree/main/features/code-search)). 34 | 35 | ### Package overview 36 | 37 | - **/src** 38 | Root package which currently also holds the search API 39 | Important Objects in package: 40 | 41 | | Object Name | Purpose | 42 | | ------------------------- | ----------------------------------------- | 43 | | ZCL_ADCOSET_SEARCH_ENGINE | Access point to code search | 44 | | ZADCOSET_SEARCH | ABAP Report for executing the code search | 45 | 46 | - **/src/adt** 47 | Implementation of the ADT backend 48 | 49 | - **/src/parl** 50 | Implementation of parallel processing - needed for the code search 51 | 52 | ## Installation 53 | 54 | Install this repository using [abapGit](https://github.com/abapGit/abapGit#abapgit). 55 | 56 | ### Choosing the correct branch for your System 57 | 58 | | NW version | Branch name | 59 | | ------------ | ----------------------------------------------------------------------- | 60 | | ≥ 7.51 | **main** | 61 | | 7.50 | [nw-740](https://github.com/DevEpos/abap-code-search-tools/tree/nw-740) | 62 | | 7.40 | [nw-740](https://github.com/DevEpos/abap-code-search-tools/tree/nw-740) | 63 | | < 7.40 | *Not officially supported* | 64 | 65 | ## Supported Databases at branch `nw-740` 66 | 67 | A certain part of the implementation for the ABAP releases 7.40 and 7.50 uses `ADBC` (ABAP Database Connectivity). 68 | Only the following databases are supported at the moment: 69 | 70 | - Oracle 71 | - SAP HANA 72 | - Microsoft SQL Server 73 | 74 | ## Necessary Authorizations 75 | 76 | To access the backend from ADT a user must have the following authorizations 77 | | Authorization Object | Authorization Field | Value | 78 | | -------------------- | ------------------- | ------------------ | 79 | | S_ADT_RES | URI | /devepos/adt/cst/* | 80 | -------------------------------------------------------------------------------- /src/zcl_adcoset_api_state_util.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_adcoset_api_state_util DEFINITION 2 | PUBLIC FINAL 3 | CREATE PUBLIC. 4 | 5 | PUBLIC SECTION. 6 | CONSTANTS c_api_state_view TYPE tabname VALUE 'ARS_ADT_API_FILTER'. 7 | CONSTANTS c_released_state TYPE string VALUE 'RELEASED'. 8 | CONSTANTS c_deprecated_state TYPE string VALUE 'DEPRECATED'. 9 | CONSTANTS: 10 | BEGIN OF c_fields, 11 | object_name TYPE fieldname VALUE 'TADIR_OBJ_NAME', 12 | object_type TYPE fieldname VALUE 'TADIR_OBJECT', 13 | api_state TYPE fieldname VALUE 'FILTER_VALUE', 14 | END OF c_fields. 15 | 16 | CLASS-METHODS is_api_state_available 17 | RETURNING 18 | VALUE(result) TYPE abap_bool. 19 | 20 | CLASS-METHODS adjust_api_states_for_filter 21 | CHANGING 22 | api_state_range TYPE zif_adcoset_ty_global=>ty_search_scope_ranges-api_state_range. 23 | 24 | PRIVATE SECTION. 25 | CLASS-METHODS get_api_states 26 | EXPORTING 27 | released_states TYPE string_table 28 | deprecated_states TYPE string_table. 29 | ENDCLASS. 30 | 31 | 32 | CLASS zcl_adcoset_api_state_util IMPLEMENTATION. 33 | METHOD is_api_state_available. 34 | SELECT SINGLE @abap_true FROM ddddlsrc 35 | WHERE ddlname = @c_api_state_view 36 | INTO @result. 37 | ENDMETHOD. 38 | 39 | METHOD get_api_states. 40 | DATA(api_states) = cl_ris_adt_res_release_states=>get_all( ). 41 | 42 | LOOP AT api_states INTO DATA(api_state) WHERE name <> c_released_state 43 | AND name <> c_deprecated_state. 44 | IF api_state-name CP 'DEPRECATED*'. 45 | deprecated_states = VALUE #( BASE deprecated_states ( api_state-name ) ). 46 | ELSE. 47 | released_states = VALUE #( BASE released_states ( api_state-name ) ). 48 | ENDIF. 49 | ENDLOOP. 50 | ENDMETHOD. 51 | 52 | METHOD adjust_api_states_for_filter. 53 | DATA released_states TYPE string_table. 54 | DATA deprecated_states TYPE string_table. 55 | DATA replaced_states LIKE api_state_range. 56 | 57 | CHECK api_state_range IS NOT INITIAL. 58 | 59 | LOOP AT api_state_range REFERENCE INTO DATA(api_state). 60 | IF NOT ( api_state->low = c_released_state OR api_state->low = c_deprecated_state ). 61 | CONTINUE. 62 | ENDIF. 63 | 64 | IF released_states IS INITIAL. 65 | get_api_states( IMPORTING released_states = released_states 66 | deprecated_states = deprecated_states ). 67 | ENDIF. 68 | 69 | IF api_state->low = c_released_state. 70 | replaced_states = VALUE #( 71 | BASE replaced_states 72 | ( LINES OF VALUE #( FOR IN released_states 73 | ( sign = api_state->sign option = api_state->option low = ) ) ) ). 74 | ENDIF. 75 | 76 | IF api_state->low = c_deprecated_state. 77 | replaced_states = VALUE #( 78 | BASE replaced_states 79 | ( LINES OF VALUE #( FOR IN deprecated_states 80 | ( sign = api_state->sign option = api_state->option low = ) ) ) ). 81 | ENDIF. 82 | 83 | DELETE api_state_range. 84 | ENDLOOP. 85 | 86 | api_state_range = VALUE #( BASE api_state_range ( LINES OF replaced_states ) ). 87 | 88 | SORT api_state_range BY sign 89 | option 90 | low. 91 | DELETE ADJACENT DUPLICATES FROM api_state_range COMPARING sign option low. 92 | ENDMETHOD. 93 | ENDCLASS. 94 | -------------------------------------------------------------------------------- /src/zcl_adcoset_devc_reader.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Access to Packages (DEVC)

2 | CLASS zcl_adcoset_devc_reader DEFINITION 3 | PUBLIC FINAL 4 | CREATE PUBLIC. 5 | 6 | PUBLIC SECTION. 7 | "!

Resolves full package names from Range Table

8 | CLASS-METHODS resolve_packages 9 | IMPORTING 10 | package_range TYPE zif_adcoset_ty_global=>ty_package_name_range 11 | RETURNING 12 | VALUE(result) TYPE zif_adcoset_ty_global=>ty_package_name_range. 13 | 14 | "!

Retrieves sub packages by range

15 | CLASS-METHODS get_subpackages_by_range 16 | IMPORTING 17 | package_range TYPE zif_adcoset_ty_global=>ty_package_name_range 18 | RETURNING 19 | VALUE(result) TYPE zif_adcoset_ty_global=>ty_package_name_range. 20 | 21 | "!

Retrieves sub packages by tab

22 | CLASS-METHODS get_subpackages_by_tab 23 | IMPORTING 24 | package_names TYPE zif_adcoset_ty_global=>ty_package_names 25 | RETURNING 26 | VALUE(result) TYPE zif_adcoset_ty_global=>ty_package_name_range. 27 | 28 | "!

Retrieves sub packages for top package

29 | CLASS-METHODS get_subpackages 30 | IMPORTING 31 | package_name TYPE devclass 32 | RETURNING 33 | VALUE(result) TYPE zif_adcoset_ty_global=>ty_package_name_range. 34 | 35 | PRIVATE SECTION. 36 | CLASS-METHODS list_sub_packages 37 | IMPORTING 38 | package_range TYPE zif_adcoset_ty_global=>ty_package_name_range 39 | RETURNING 40 | VALUE(result) TYPE zif_adcoset_ty_global=>ty_package_name_range. 41 | ENDCLASS. 42 | 43 | 44 | CLASS zcl_adcoset_devc_reader IMPLEMENTATION. 45 | METHOD resolve_packages. 46 | CHECK package_range IS NOT INITIAL. 47 | 48 | SELECT devclass AS low, 49 | 'I' AS sign, 50 | 'EQ' AS option 51 | FROM tdevc 52 | WHERE devclass IN @package_range 53 | INTO CORRESPONDING FIELDS OF TABLE @result. 54 | ENDMETHOD. 55 | 56 | METHOD get_subpackages_by_range. 57 | result = list_sub_packages( package_range ). 58 | ENDMETHOD. 59 | 60 | METHOD get_subpackages. 61 | result = list_sub_packages( VALUE #( ( sign = 'I' option = 'EQ' low = to_upper( package_name ) ) ) ). 62 | ENDMETHOD. 63 | 64 | METHOD list_sub_packages. 65 | DATA package_names TYPE zif_adcoset_ty_global=>ty_package_names. 66 | 67 | CHECK package_range IS NOT INITIAL. 68 | 69 | SELECT devclass FROM tdevc 70 | WHERE parentcl IN @package_range 71 | INTO TABLE @package_names. 72 | 73 | result = VALUE #( FOR package_name IN package_names 74 | ( sign = 'I' 75 | option = 'EQ' 76 | low = package_name ) ). 77 | 78 | WHILE lines( package_names ) > 0. 79 | SELECT devclass FROM tdevc 80 | FOR ALL ENTRIES IN @package_names 81 | WHERE parentcl = @package_names-table_line 82 | INTO TABLE @package_names. 83 | 84 | result = VALUE #( BASE result 85 | FOR package_name IN package_names 86 | ( sign = 'I' 87 | option = 'EQ' 88 | low = package_name ) ). 89 | ENDWHILE. 90 | ENDMETHOD. 91 | 92 | METHOD get_subpackages_by_tab. 93 | result = list_sub_packages( VALUE #( FOR pack IN package_names 94 | ( sign = 'I' 95 | option = 'EQ' 96 | low = pack ) ) ). 97 | ENDMETHOD. 98 | ENDCLASS. 99 | -------------------------------------------------------------------------------- /src/adt/zadcoset_adt_obj_ref.xslt.source.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /src/zcl_adcoset_extensions_util.clas.abap: -------------------------------------------------------------------------------- 1 | "!

Utility to test extension availability

2 | CLASS zcl_adcoset_extensions_util DEFINITION 3 | PUBLIC FINAL 4 | CREATE PRIVATE. 5 | 6 | PUBLIC SECTION. 7 | "!

Checks if ABAP Tags feature is installed

8 | CLASS-METHODS is_abap_tags_available 9 | RETURNING 10 | VALUE(result) TYPE abap_bool. 11 | 12 | "!

Retrieves current table with stored tagged objects

13 | CLASS-METHODS get_current_tgobj_table 14 | RETURNING 15 | VALUE(result) TYPE tabname. 16 | 17 | PRIVATE SECTION. 18 | CONSTANTS c_tgobj_tab_v2 TYPE tabname VALUE 'ZABAPTAGS_TGOBJN'. 19 | CONSTANTS c_tgobj_tab_v1 TYPE tabname VALUE 'ZABAPTAGS_TGOBJ'. 20 | 21 | TYPES: BEGIN OF ty_field_config, 22 | fieldname TYPE fieldname, 23 | rollname TYPE rollname, 24 | END OF ty_field_config, 25 | ty_field_configs TYPE STANDARD TABLE OF ty_field_config WITH EMPTY KEY. 26 | TYPES ty_table_fields TYPE STANDARD TABLE OF dd03p WITH EMPTY KEY. 27 | 28 | CLASS-DATA abap_tags_available TYPE abap_bool VALUE abap_undefined. 29 | CLASS-DATA current_tgobj_tabname TYPE tabname. 30 | 31 | CLASS-METHODS is_tgobj_table_available 32 | IMPORTING 33 | tabname TYPE tabname 34 | RETURNING 35 | VALUE(result) TYPE abap_bool. 36 | 37 | CLASS-METHODS test_field_existence 38 | IMPORTING 39 | fields_to_test TYPE ty_field_configs 40 | !fields TYPE ty_table_fields 41 | RETURNING 42 | VALUE(result) TYPE abap_bool. 43 | ENDCLASS. 44 | 45 | 46 | CLASS zcl_adcoset_extensions_util IMPLEMENTATION. 47 | METHOD get_current_tgobj_table. 48 | IF is_abap_tags_available( ). 49 | result = current_tgobj_tabname. 50 | ENDIF. 51 | ENDMETHOD. 52 | 53 | METHOD is_abap_tags_available. 54 | IF abap_tags_available = abap_undefined. 55 | IF is_tgobj_table_available( c_tgobj_tab_v2 ). 56 | abap_tags_available = abap_true. 57 | current_tgobj_tabname = c_tgobj_tab_v2. 58 | ELSEIF is_tgobj_table_available( c_tgobj_tab_v1 ). 59 | current_tgobj_tabname = c_tgobj_tab_v1. 60 | ELSE. 61 | abap_tags_available = abap_false. 62 | ENDIF. 63 | ENDIF. 64 | 65 | result = abap_tags_available. 66 | ENDMETHOD. 67 | 68 | METHOD is_tgobj_table_available. 69 | DATA table_def TYPE dd02v. 70 | DATA table_fields TYPE ty_table_fields. 71 | 72 | CALL FUNCTION 'DDIF_TABL_GET' 73 | EXPORTING name = tabname 74 | IMPORTING dd02v_wa = table_def 75 | TABLES dd03p_tab = table_fields 76 | EXCEPTIONS illegal_input = 1 77 | OTHERS = 2. 78 | IF sy-subrc = 0 79 | AND table_def-tabclass = 'TRANSP' 80 | AND table_fields IS NOT INITIAL 81 | AND test_field_existence( 82 | fields = table_fields 83 | fields_to_test = VALUE #( ( fieldname = 'OBJECT_NAME' rollname = 'SOBJ_NAME' ) 84 | ( fieldname = 'OBJECT_TYPE' rollname = 'TROBJTYPE' ) 85 | ( fieldname = 'TAG_ID' rollname = 'ZABAPTAGS_TAG_ID' ) ) ). 86 | result = abap_true. 87 | ENDIF. 88 | ENDMETHOD. 89 | 90 | METHOD test_field_existence. 91 | result = abap_true. 92 | 93 | LOOP AT fields_to_test ASSIGNING FIELD-SYMBOL(). 94 | IF NOT line_exists( fields[ fieldname = -fieldname 95 | rollname = -rollname ] ). 96 | CLEAR result. 97 | RETURN. 98 | ENDIF. 99 | ENDLOOP. 100 | ENDMETHOD. 101 | ENDCLASS. 102 | --------------------------------------------------------------------------------