Skip to content

Rules Catalog (108 Rules) ​

Comprehensive reference for all 108 Clean ABAP, security, performance, and architecture rules in Skylint.

Skylint at a Glance

  • 108 Native ATC Rules: 100% ABAP Cloud (Contract C1) & Steampunk Ready.
  • 46 Automated QuickFixes: Instant one-click refactoring with Ctrl + 1 in Eclipse ADT.
  • Zero Legacy Overhead: Built exclusively on IF_CI_ATC_CHECK (no obsolete Code Inspector / SCI dependency).

Clean ABAP & Modern Syntax (41) ​

Modern language features, expression-oriented coding, and idiomatic Clean ABAP practices.

Rule IDABAP ClassDescriptionPseudo-CommentQuickFixRemote Enabled
prefer-reduceZCL_SKYLINT_PREF_REDUCEPrefer REDUCE #( ) expression over simple aggregation LOOP#EC PREF_REDUCE⚡ Ready✅ Yes
prefer-tab-exprZCL_SKYLINT_PREF_TAB_EXPRPrefer table expression itab[ ... ] over READ TABLE#EC PREF_TAB_EXPR⚡ Ready✅ Yes
prefer-condZCL_SKYLINT_PREF_CONDPrefer COND #( ) expression over IF/ELSEIF/ELSE statement#EC PREF_COND⚡ Ready✅ Yes
prefer-switchZCL_SKYLINT_PREF_SWITCHPrefer SWITCH #( ) expression over CASE statement#EC PREF_SWITCH⚡ Ready✅ Yes
prefer-linesZCL_SKYLINT_PREF_LINESPrefer lines( ) over DESCRIBE TABLE ... LINES#EC LINES⚡ Ready✅ Yes
prefer-is-notZCL_SKYLINT_PREF_IS_NOTPrefer IS NOT over NOT ... IS#EC IS_NOT⚡ Ready✅ Yes
prefer-string-templateZCL_SKYLINT_PREF_STR_TMPLPrefer string templates over CONCATENATE#EC STR_TMPL⚡ Ready✅ Yes
prefer-line-existsZCL_SKYLINT_PREF_LINE_EXISTSPrefer line_exists( ) over READ TABLE with NO FIELDS#EC LINE_EXISTS—✅ Yes
prefer-returnZCL_SKYLINT_PREF_RETURNPrefer RETURN over EXIT outside loop constructs#EC RETURN⚡ Ready✅ Yes
prefer-merged-ifsZCL_SKYLINT_PREF_MERGE_IFSMerge consecutive nested IF blocks using boolean AND#EC MERGE_IFS—✅ Yes
prefer-symbol-operatorsZCL_SKYLINT_PREF_SYMBOL_OPPrefer symbolic operators over textual EQ, NE, LT, GT#EC SYMBOL_OP⚡ Ready✅ Yes
prefer-new-operatorZCL_SKYLINT_PREF_NEW_OPPrefer NEW operator over CREATE OBJECT and RAISE EXCEPTION#EC NEW_OP⚡ Ready✅ Yes
prefer-xsdboolZCL_SKYLINT_PREF_XSDBOOLPrefer xsdbool( ) expression over manual IF-ELSE assignment#EC XSDBOOL⚡ Ready✅ Yes
prefer-fully-typedZCL_SKYLINT_PREF_FULL_TYPEDEnforce fully typed constant declarations#EC FULL_TYPED—✅ Yes
prefer-correspondingZCL_SKYLINT_PREF_CORRESPPrefer CORRESPONDING Expression over MOVE-CORRESPONDING#EC CORRESP⚡ Ready✅ Yes
prefer-returningZCL_SKYLINT_PREF_RETURNINGPrefer RETURNING over single EXPORTING#EC RETURNING—✅ Yes
prefer-class-exceptionsZCL_SKYLINT_PREF_CLASS_EXCPrefer Class-Based Exceptions over Classic EXCEPTIONS#EC CLASS_EXC—✅ Yes
prefer-final-classZCL_SKYLINT_PREF_FINAL_CLSPrefer FINAL classes and methods by default#EC FINAL_CLS⚡ Ready✅ Yes
prefer-insert-intoZCL_SKYLINT_PREF_INSERTPrefer INSERT ... INTO TABLE over APPEND for table safety#EC INSERT_INTO⚡ Ready✅ Yes
prefer-predicate-namesZCL_SKYLINT_PREF_PRED_NAMEEnforce predicate naming (IS_, HAS_) on boolean methods#EC PRED_NAME—✅ Yes
prefer-string-functionsZCL_SKYLINT_PREF_STR_FUNCDetect obsolete string statements; prefer built-in functions#EC STR_FUNC⚡ Ready✅ Yes
prefer-calc-assign-opZCL_SKYLINT_PREF_CALC_OPPrefer calculation assignment operators (+=, -=, *=, /=)#EC CALC_ASSIGN⚡ Ready✅ Yes
prefer-early-returnZCL_SKYLINT_PREF_EARLY_RETPrefer early return or continue over nested IF blocks#EC EARLY_RETURN—✅ Yes
prefer-decl-orderZCL_SKYLINT_PREF_DECL_ORDEREnforce declaration order (TYPES, CONSTANTS, DATA, FS)#EC DECL_ORDER—✅ Yes
prefer-caseZCL_SKYLINT_PREF_CASEUse CASE instead of IF when checking multiple values#EC PREF_CASE—✅ Yes
max-one-statementZCL_SKYLINT_MAX_ONE_STMTMax One Statement Per Line#EC ONE_STMT—✅ Yes
prefer-inlineZCL_SKYLINT_PREF_INLINEPrefer Inline Declarations#EC PREFER_INLINE—✅ Yes
prefer-final-dataZCL_SKYLINT_PREF_FINAL_DATADeclare inline variables as FINAL when never written again#EC PREF_FINAL⚡ Ready✅ Yes
prefer-message-classZCL_SKYLINT_PREF_MSG_CLSUse a message class instead of inline message text#EC MSG_CLASS—❌ No
prefer-inline-castZCL_SKYLINT_PREF_INL_CASTInline a CAST helper that is only read once#EC INLINE_CAST⚡ Ready✅ Yes
prefer-public-constructorZCL_SKYLINT_PREF_PUB_CTORDeclare Constructor in PUBLIC SECTION#EC PUB_CTOR—✅ Yes
prefer-definitions-topZCL_SKYLINT_PREF_DEF_TOPPlace definitions at beginning of routine#EC DEF_TOP—✅ Yes
max-one-method-parameter-per-lineZCL_SKYLINT_MAX_PARAM_LINEMax one method parameter definition per line#EC MAX_PARAM_LINE—✅ Yes
prefer-is-initialZCL_SKYLINT_PREF_IS_INITIALPrefer IS [NOT] INITIAL over lines( ) or empty literals#EC PREF_INIT⚡ Ready✅ Yes
prefer-castZCL_SKYLINT_PREF_CASTPrefer modern CAST #( ) expression over ?=#EC PREF_CAST⚡ Ready✅ Yes
prefer-namingZCL_SKYLINT_PREF_NAMINGStandard Naming Conventions#EC NAMING—✅ Yes
bad-indentZCL_SKYLINT_NO_BAD_INDENTBad Statement Indentation#EC BAD_INDENT⚡ Ready✅ Yes
prefer-join-typeZCL_SKYLINT_PREF_JOIN_TYPEPrefer an explicit JOIN type such as INNER JOIN#EC JOIN_TYPE⚡ Ready✅ Yes
prefer-standard-tableZCL_SKYLINT_PREF_STD_TABLEPrefer explicit TYPE STANDARD TABLE OF over TYPE TABLE OF#EC PREF_STD_TABLE⚡ Ready✅ Yes
prefer-is-suppliedZCL_SKYLINT_PREF_IS_SUPPLIEDPrefer IS SUPPLIED over the obsolete IS REQUESTED#EC PREF_IS_SUPPLIED⚡ Ready✅ Yes
prefer-syZCL_SKYLINT_PREF_SYPrefer the short system field alias SY over SYST#EC PREF_SY⚡ Ready✅ Yes

Anti-Patterns & Bad Practices (39) ​

Discouraged language constructs, legacy statements, and redundant syntax.

Rule IDABAP ClassDescriptionPseudo-CommentQuickFixRemote Enabled
no-call-methodZCL_SKYLINT_NO_CALL_METHODAvoid static CALL METHOD statements#EC CALL_METH⚡ Ready✅ Yes
no-default-keyZCL_SKYLINT_NO_DEFAULT_KEYAvoid WITH DEFAULT KEY; prefer EMPTY KEY or explicit keys#EC DEFAULT_KEY⚡ Ready✅ Yes
no-me-referenceZCL_SKYLINT_NO_ME_REFERENCEAvoid self-reference ME->#EC ME—✅ Yes
no-redundant-method-callZCL_SKYLINT_NO_REDUNDANT_CALLOmit redundant EXPORTING and RECEIVING in method calls#EC EXPORTING⚡ Ready❌ No
no-chained-statementsZCL_SKYLINT_NO_CHAINED_STMTAvoid chained declarations and chained assignments#EC CHAIN_DECL⚡ Ready✅ Yes
no-boolean-comparisonZCL_SKYLINT_NO_BOOL_COMPAREAvoid comparing boolean method calls to boolean literals#EC BOOL_COMPARE⚡ Ready✅ Yes
no-check-statementZCL_SKYLINT_NO_CHECK_STMTAvoid CHECK statements; prefer IF with RETURN or CONTINUE#EC CHECK_STMT⚡ Ready✅ Yes
no-empty-blockZCL_SKYLINT_NO_EMPTY_BLOCKAvoid empty control blocks (IF, CASE, LOOP, TRY, etc.)#EC EMPTY_BLOCK—✅ Yes
no-duplicate-conditionsZCL_SKYLINT_NO_DUP_CONDAvoid duplicate branch conditions in IF and CASE#EC DUP_COND—✅ Yes
no-unreachable-codeZCL_SKYLINT_NO_UNREACHABLEDetect unreachable code after jump or exit statements#EC UNREACHABLE⚡ Ready✅ Yes
no-single-whenZCL_SKYLINT_NO_SINGLE_WHENAvoid CASE statements with only one WHEN branch#EC SINGLE_WHEN—✅ Yes
no-yoda-conditionsZCL_SKYLINT_NO_YODA_CONDAvoid Yoda conditions in comparison expressions#EC YODA_COND⚡ Ready✅ Yes
no-static-via-instanceZCL_SKYLINT_NO_STATIC_ARROWAvoid calling static methods via instance arrow (->)#EC STATIC_ARROW⚡ Ready❌ No
no-public-attributesZCL_SKYLINT_NO_PUBLIC_ATTRAvoid mutable public attributes in classes#EC PUBLIC_ATTR—✅ Yes
no-obsolete-statementsZCL_SKYLINT_NO_OBSOLETEAvoid obsolete statements (MOVE, REFRESH, FORM, etc.)#EC OBSOLETE⚡ Ready✅ Yes
no-list-processingZCL_SKYLINT_NO_LIST_PROCProhibit classic list processing statements#EC LIST_PROC—✅ Yes
no-scope-leakZCL_SKYLINT_NO_SCOPE_LEAKAvoid variable usage outside its declaring control block#EC SCOPE_LEAK—✅ Yes
no-self-assignmentZCL_SKYLINT_NO_SELF_ASSIGNDetect Identical Self Assignments#EC SELF_ASSIGN⚡ Ready✅ Yes
no-magic-numbersZCL_SKYLINT_NO_MAGIC_NUMBERSAvoid magic numbers in code; use named constants#EC MAGIC_NUMBERS—✅ Yes
no-like-objectsZCL_SKYLINT_NO_LIKE_OBJECTSAvoid LIKE referencing data objects; use explicit TYPE#EC LIKE_OBJECTS—✅ Yes
no-static-classesZCL_SKYLINT_NO_STATIC_CLSAvoid static-only classes; use instantiable classes#EC STATIC_CLS—✅ Yes
no-interface-dataZCL_SKYLINT_NO_INTF_DATAAvoid mutable DATA in interfaces; allow only CONSTANTS#EC INTF_DATA—✅ Yes
no-message-raisingZCL_SKYLINT_NO_MSG_RAISINGAvoid MESSAGE ... RAISING; use class-based exceptions#EC MSG_RAISING—✅ Yes
no-nested-tryZCL_SKYLINT_NO_NESTED_TRYAvoid nested TRY blocks; extract to helper methods#EC NESTED_TRY—✅ Yes
no-unused-variablesZCL_SKYLINT_NO_UNUSED_VARSDetect unused local variables and field symbols#EC NEEDED—✅ Yes
no-param-escapeZCL_SKYLINT_NO_PARAM_ESCAPEAvoid unnecessary parameter escape (!param)#EC PARAM_ESCAPE⚡ Ready✅ Yes
no-inline-lengthZCL_SKYLINT_NO_INLINE_LENAvoid inline length specification in declarations#EC PAREN_LEN⚡ Ready✅ Yes
no-dash-in-namesZCL_SKYLINT_NO_DASH_IN_NAMESNo Dashes in Variable and Form Names#EC NO_DASH—✅ Yes
no-friendsZCL_SKYLINT_NO_FRIENDSAvoid FRIENDS in class definitions#EC FRIENDS—✅ Yes
no-exception-overlapZCL_SKYLINT_NO_EXC_OVERLAPClassic EXCEPTIONS must not overlap#EC EXC_OVERLAP—✅ Yes
no-many-parenthesesZCL_SKYLINT_NO_MANY_PARENSRemove redundant parentheses#EC MANY_PARENS⚡ Ready✅ Yes
no-unnecessary-returnZCL_SKYLINT_NO_UNNEC_RETURNOmit unnecessary RETURN at end of routine#EC NO_UNNEC_RETURN⚡ Ready✅ Yes
mix-returningZCL_SKYLINT_NO_MIX_RETURNINGDo not mix RETURNING with EXPORTING or CHANGING#EC NO_MIX_RETURNING—✅ Yes
method-overwrites-builtinZCL_SKYLINT_NO_OVERW_BUILTINMethod name overwrites built-in SAP function#EC NO_OVERW_BUILTIN—✅ Yes
no-ignored-return-valueZCL_SKYLINT_NO_IGNORED_RETURNDisallow ignoring the return value of functional methods#EC NO_IGNORED_RET—❌ No
no-redundant-clearZCL_SKYLINT_NO_REDUNDANT_CLEARDo not CLEAR or FREE variables redundantly#EC REDUNDANT_CLEAR⚡ Ready✅ Yes
expand-macrosZCL_SKYLINT_PREF_EXPAND_MACROExpand Macro Calls#EC EXPAND_MACROS⚡ Ready✅ Yes
no-dead-codeZCL_SKYLINT_NO_DEAD_CODEDetect Dead Code with Constant Condition#EC NO_DEAD_CODE⚡ Ready✅ Yes
keyword-nameZCL_SKYLINT_NO_KEYWORD_NAMEAvoid Using ABAP Keywords as Identifier Names#EC KEYWORD_NAME—✅ Yes

Performance & Database (7) ​

Database query efficiency, buffer protection, and internal table operation guidelines.

Rule IDABAP ClassDescriptionPseudo-CommentQuickFixRemote Enabled
no-db-in-loopZCL_SKYLINT_NO_DB_IN_LOOPAvoid database access inside loop iterations#EC DB_IN_LOOP—✅ Yes
no-empty-faeZCL_SKYLINT_NO_EMPTY_FAEUnsecure FOR ALL ENTRIES (Missing empty itab check)#EC EMPTY_FAE⚡ Ready✅ Yes
no-select-starZCL_SKYLINT_NO_SELECT_STARSelect performance (Avoid SELECT * and SELECT ... ENDSELECT)#EC SELECT_STAR—✅ Yes
prefer-order-byZCL_SKYLINT_PREF_ORDER_BYSELECT UP TO 1 ROWS requires ORDER BY#EC ORDER_BY—✅ Yes
prefer-transportingZCL_SKYLINT_PREF_TRANSPORTAvoid MODIFY itab in LOOP without TRANSPORTING clause#EC TRANSPORTING—✅ Yes
prefer-pass-by-referenceZCL_SKYLINT_PREF_PASS_BY_REFSlow Parameter Passing#EC SLOW_PARAM—✅ Yes
no-modify-loop-tableZCL_SKYLINT_NO_MOD_LOOP_TABAvoid mutating or sorting tables inside loops#EC LOOP_MODIFY—✅ Yes

Security & Robustness (12) ​

Authorizations, dynamic execution sanitation, error handling, and runtime safety.

Rule IDABAP ClassDescriptionPseudo-CommentQuickFixRemote Enabled
no-sy-modifyZCL_SKYLINT_NO_SY_MODIFYAvoid sy-* System Variable Modification#EC SY_MODIFY—✅ Yes
no-dangerous-statementsZCL_SKYLINT_NO_DANGEROUS_STMTDangerous Statements (abaplint dangerous_statement)#EC DANGEROUS_STMT—✅ Yes
prefer-auth-checkZCL_SKYLINT_PREF_AUTH_CHECKCall Transaction Authority Check#EC AUTH_CHECK⚡ Ready✅ Yes
no-catch-cx-rootZCL_SKYLINT_NO_CATCH_ROOTCatch specific exceptions instead of generic cx_root#EC CATCH_ROOT—✅ Yes
no-raise-cx-syZCL_SKYLINT_NO_RAISE_CX_SYAvoid raising SAP internal system exceptions (cx_sy_*)#EC RAISE_CX_SY—✅ Yes
prefer-subrc-checkZCL_SKYLINT_PREF_CHECK_SUBRCCheck sy-subrc after DB, table and string operations#EC CHECK_SUBRC—✅ Yes
no-client-specifiedZCL_SKYLINT_NO_CLIENT_SPECAvoid USING CLIENT or CLIENT SPECIFIED in ABAP SQL#EC CLIENT_SPEC⚡ Ready✅ Yes
no-commit-workZCL_SKYLINT_NO_COMMIT_WORKAvoid COMMIT and ROLLBACK in application logic#EC COMMIT_WORK—❌ No
no-rfc-error-handlingZCL_SKYLINT_NO_RFC_ERRRFC calls must handle system failures#EC RFC_ERR—✅ Yes
no-modify-standard-tablesZCL_SKYLINT_NO_MOD_STD_TABLEModify Only Own Database Tables#EC OWN_TABLES—✅ Yes
no-dynamic-stuffZCL_SKYLINT_NO_DYNAMIC_STMTNo Dynamic Constructs (CALL, ASSIGN, CREATE, etc.)#EC NO_DYNAMIC—✅ Yes
no-hardcoded-env-checksZCL_SKYLINT_NO_HARDCODED_ENVAvoid reading environment system fields (sy-sysid, etc.)#EC HARDCODED_ENV—✅ Yes

Metrics & Complexity Limits (8) ​

Quantitative boundaries for method size, nesting depth, parameter counts, and cyclomatic complexity.

Rule IDABAP ClassDescriptionPseudo-CommentQuickFixRemote Enabled
max-paramsZCL_SKYLINT_MAX_PARAMSMethod signature cleanliness (excessive parameter count)#EC MAX_PARAMS—✅ Yes
max-method-lengthZCL_SKYLINT_MAX_METHOD_LENMethod Length Limit (excessive statement count)#EC METHOD_LEN—✅ Yes
max-nesting-depthZCL_SKYLINT_MAX_NESTINGNesting Depth Limit (excessive control block nesting)#EC NESTING—✅ Yes
max-cyclomatic-complexityZCL_SKYLINT_MAX_CYCLO_COMPCyclomatic Complexity Threshold#EC CYCLO_COMP—✅ Yes
max-constructor-statementsZCL_SKYLINT_MAX_CTOR_STMTSKeep constructors clean; avoid heavy logic and DB#EC CLEAN_CTOR—✅ Yes
max-inheritance-depthZCL_SKYLINT_MAX_INHERITAvoid deep class inheritance hierarchies#EC INHERIT_DEPTH—❌ No
max-attributesZCL_SKYLINT_MAX_ATTRIBUTESLimit class member attributes to prevent God Classes#EC ATTRIBUTES—✅ Yes
max-line-lengthZCL_SKYLINT_MAX_LINE_LENMaximum Line Length#EC LINE_LEN—✅ Yes

Released under the MIT License.