Skip to content

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 25 Oct 15:00
· 10 commits to main since this release
c4576ea

Data has types: from the source, from classes and interfaces, from the dictionary and from function modules. Screens and their dialog modules are in the call graph. Following calls can be limited and cancelled, and what was not found says why. Four corpora that their CI checks against an older release are checked here too, and all of abaplint's invalid test statements are rejected.

  • Types: declarations in symbols and the reads and writes in logic have their type in data_type, as far as the sources tell it: built-in types with length and decimals, local TYPES resolved, LIKE resolved through the data object it names, tables, ranges and references with what they hold, components and table expressions. Inline declarations get the type of what the statement puts there: literals, string templates, constructor expressions (REF #( ) and FILTER #( ) included), table expressions, built-in functions, methods of classes in the source, table lines of LOOP AT and READ TABLE, the rows of SELECT ... INTO @DATA(x), exceptions of CATCH, classes of CASE TYPE OF; and the FOR, LET and INDEX INTO names of constructor expressions. The forms are those of the common old-and-new-syntax overviews; LOOP AT ... GROUP BY groups are not typed yet. Dictionary types stay names, like matnr or mara-matnr. DataType has the new kinds named, structure, table, range and ref, a name and a line.

  • Types from classes and more statements: methods, attributes and types of classes and interfaces type what they give: RETURNING types, lo->mv_x, zcl=>gc_max, TYPE zcl=>ty_s and its components, inherited members and aliases included; through chains link by link (CAST zcl( lo )->get( )-id); in a workspace for every class it can load, SAP's classes through ADT too (checked on the SAP trial system with cl_abap_typedescr and xco_cp). Types of other classes are named with their class, zcl=>ty_s. Inline declarations in method arguments get the type of their parameter. New forms: ASSIGN ... TO FIELD-SYMBOL(<x>), SPLIT ... INTO, FIND ... RESULTS/SUBMATCHES/COUNT, APPEND/INSERT/COLLECT ... ASSIGNING/REFERENCE INTO, SELECT ... FROM @itab, INTO NEW @DATA(r) and INTO (@DATA(a), @DATA(b)), COND #/SWITCH #, lr->comp of data references, constructor expressions inside conditions, abap_true/abap_false/space, numeric functions (abs, ipow, nmax, sqrt, round, ...), the calculation type of arithmetic expressions, LOOP AT and READ TABLE over a table given as an expression, components with VALUE in BEGIN OF. Built-in function types follow SAP's documentation: xsdbool( ) is c(1) typed xsdboolean, boolc( ) string, line_exists( ) none. On the cheat sheets 62.7% of inline declarations are typed file by file (from 52.2%), 66.5% in a workspace, 95.0% with an SAP system connected.

  • Corpora at older releases: abap-wasm, abapPGP (both checked by their CI with abaplint against ABAP 7.50), open-abap-gui (against 7.40 SP08) and abapNTLM (against 7.40 SP02), all MIT, join the corpus. A new test requires that none of their 95,521 statements needs a newer release than the one checked, has a syntax error or is unknown. open-abap-gui brings 187 classic reports with screens, selection screens and dialog modules; its three folders are one corpus, so corpora.txt takes several folders on a line.

  • Dictionary types: in a workspace, data elements have their built-in type and name in data_element (TYPE xubname is c(12), XUBNAME), from ADT, which gives the domain's type with the data element, or from abapGit, which keeps it in the domain: new object kind DOMA, .doma.xml. Data elements typed as references are references. Dictionary structures and tables are structure with their name, and their components have their types, those of included structures and built-in columns (abap.dec(15,2), DATATYPE CURR) included. LIKE bapiret2-message takes the column's type. Failed data element and domain lookups are notes, like those of table types.

  • Function modules: CALL FUNCTION 'Z_FM' IMPORTING ev = DATA(x) types x by the parameter, in the function module's scope, dictionary types included. Function modules whose source has no signature, like those generated for table maintenance, get it from the abapGit XML of their function group (.fugr.xml), so their parameters are known to the call graph and to typing.

  • Screens: CALL SCREEN 100, SET SCREEN 200 and LEAVE TO SCREEN 300 are calls of the new kind screen; in the call graph the flow logic of a program's screens calls its dialog modules, calls of the new kind module from the block screen 0100, with the event and additions like AT EXIT-COMMAND as options. Screens are read from abapGit folders, DYNPROS of .prog.xml and .fugr.xml with their flow logic there or in .prog.screen_NNNN.abap files; selection screens count as screens. Over the corpus, 96.3% of 300 such calls resolve; the rest are in includes analyzed without their main program, or name screens missing in the repositories.

  • Found with open-abap-gui: CONV zif_x=>ty_name( ... ), VALUE, COND and the other constructor expressions with a type of a class or interface read their operands, which were missed. AT SELECTION-SCREEN ON p_carr, ON END OF, ON VALUE-REQUEST FOR and ON HELP-REQUEST FOR read the parameter. SELECT * FROM t100 without INTO writes the work area of TABLES t100.

  • Dynamic attributes in ASSIGN: ASSIGN oref->(name) TO <fs> with a backquote literal no longer needs 7.57; SAP's release news of 7.57 only bring struc-(comp), and an attribute name may be any character-like literal. Found on the 7.02 branch of abap2UI5, which abaplint checks against 7.02.

  • Calls on constructor expressions: NEW zcl( )->m( ) and CAST zcl( x )->m( ) are method calls of the class's method, followed through the chain; the first was taken for a second constructor call, the second was not found. DATA(x) = NEW zcl( )->m( ) types x by what m returns, not as zcl. The corpus call graph finds 173 more method calls, all resolved.

  • Parameters of interface and redefined methods: in METHOD zif_x~meth the parameters are those of the interface, in a method declared REDEFINITION those of the superclass; both were untyped, since the class does not repeat the signature. GET BIT ... INTO DATA(x) and GET RUN TIME FIELD DATA(x) give i, GET TIME FIELD DATA(x) t, GET TIME STAMP FIELD DATA(x) timestamp (p of length 8), as SAP documents them. On abap-wasm, 300 files checked by abaplint against 7.50, 99.6% of inline declarations are typed (from 81.9%).

  • Dictionary lookup for types: in a workspace, the lines of dictionary table types (new object kind TTYP, ADT ddic/tabletypes, abapGit .ttyp.xml) and the types of type groups (new kind TYPE, ADT ddic/typegroups, abapGit .type.abap) type data: LOOP AT over a string_table gives string, abap_compdescr_tab of type group ABAP its structure with components. Since these lookups only add types, a failed one is a note, not an error: table types: 2 lookups failed, their types stay names (first: TTYP:X: HTTP 406 ...), once per kind. Lengths given by constants take the constant's value. With the SAP trial system connected, 95.0% of the cheat sheets' inline declarations are typed.

  • Fewer lookups: names like zif_x are looked up as interfaces first, REF TO data and REF TO object not at all; SELECT ... INTO (@a, @b) without a blank after the parenthesis writes its targets.

  • Syntax checks: all 77 of abaplint's statements invalid at every release are rejected, from 69: unknown additions of CALL TRANSFORMATION and method calls in its SOURCE, a call after CREATE DATA ... TYPE HANDLE, an internal table without alias in MERGE ... USING and WHEN MATCHED after WHEN NOT MATCHED, CLASS-METHODS ... FOR ENTITY EVENT, READ TABLE ... USING KEY with WITH KEY, and WITH ending a table type. None of the 321,490 corpus statements abaplint accepts is reported.

  • Follow filters and limits: follow in the options (--follow, --skip, --limit in the CLI and the MCP server) loads only objects whose names match patterns like Z* or a custom namespace /ABC/*, leaves out others, and stops after a number of objects; the objects given are always loaded. Objects not loaded are in the new skipped of call graph and logic, not in missing, and the notes say when the limit was reached. A progress function is called after each object (progress in Node.js and Python, --progress in the CLI), and an analysis can be cancelled (signal in Node.js, a CancelToken in Python, Workspace::with_cancel in Rust); it then finishes with what it has.

  • Why calls are unresolved: the new unresolved of calls in the call graph says why a target was not found: dynamic, unknown_type, missing, lookup_failed, hierarchy_incomplete, not_followed, limit, cancelled or not_loaded. The compact text writes it, like (unresolved: not followed).

  • Structured errors: errors of call graph and logic are objects instead of text: code (auth, http, network, io, other), object, cause, retryable and the HTTP status. Failures of the connection to an SAP system are network and retryable, as are HTTP 408, 429 and 5xx. Objects whose loading failed are no longer in missing.

Changes to existing output: schema_version is 2, since errors holds objects. Objects not loaded on purpose or whose loading failed are no longer in missing. Calls have the new kinds screen and module, and blocks the kind screen. In Rust, the functions of abap_analysis::json that load sources take Hooks (provider, progress, cancel) instead of a provider; SourceError has a new variant Network; ObjectKind has the new variants Ttyp, Type and Doma; SourceProvider has the new methods screens and function_interface, with defaults.