Top Method Summary
Options Name Purpose
AddAnnotationIfMissing () Adds the @lowercase. / @uppercase. annotation to the source when it is missing
CorrectKeywordCase (KeywordCaseEnum, logical) Corrects the case of all ABL keywords in the source file
LOGICAL IsHandleExpression (INode) Returns whether the node is (part of) a handle-valued expression, resolving member reference chains to the root of the expression
LOGICAL IsMemberReference (INode) Returns whether the node is a member reference, i.e. the name following an OBJCOLON (SESSION:TEMP-DIRECTORY, oEnum:Label)
LOGICAL IsNoArgFunctionKeyword (INode) Returns whether the node is a built-in function keyword that may be invoked without an argument but is typed as a plain identifier by Proparse Notes : The keyword table flags GUID with MAY_BE_REGULAR_FUNC only, so a bare GUID (without a parenthesized argument) is re-typed to an ID node inside a Field_ref during the parse and would otherwise keep its case. Member references (oObject:Guid) never reach this test - see IsMemberReference - and a qualified field reference (eTable.GUID) carries the qualified name as its node text, so a user defined field named GUID is left untouched (SCL-5534) @param poNode The INode to test @return TRUE when the node is a no-argument built-in function keyword typed as an identifier */
LOGICAL IsSystemHandleAttribute (INode) Returns whether the node is the attribute or method name of an ABL handle reference
LOGICAL IsUnknownFunctionKeyword (INode) Returns whether the node is a built-in function keyword that is unknown to Proparse and typed as a local method reference Notes : The Proparse keyword table predates DYNAMIC-PROPERTY, so the lexer types the name as a plain identifier. Inside a class an unknown identifier followed by an argument list is parsed as a local method reference (LOCAL_METHOD_REF) - for the getter, setter and ASSIGN forms alike - so the keyword would otherwise keep its case. Only the names in cUnknownFunctionKeywords qualify - a user defined local method never collides with them, since these keywords contain a hyphen, which is invalid in a method name (SCL-5558) @param poNode The INode to test @return TRUE when the node is a built-in function keyword typed as a local method reference */
Consultingwerk.Studio.ProparseApi.INode MemberReferenceOwner (INode) Returns the node the member reference is taken from, i.e. the node left of the OBJCOLON preceding the given node
LOGICAL ProcessNode (INode) Processes a single AST node, correcting the case of keyword tokens

Top Constructor Summary
Options Name Purpose
KeywordCaseProcessor (character) Constructor for the KeywordCaseProcessor class

Top Property Summary
Options Name Purpose
CHARACTER FileName


Method Detail
Top

AddAnnotationIfMissing ()

Purpose: Adds the @lowercase. / @uppercase. annotation to the source when
it is missing
Notes: The annotation is placed after the initial comment block(s) and
before the first keyword node, with exactly one empty line before
and one empty line after the annotation.

Top

CorrectKeywordCase (KeywordCaseEnum, logical)

Purpose: Corrects the case of all ABL keywords in the source file
Notes: Parses the program using the IProparseApi service, walks the
AST and rewrites the keyword tokens in place. Optionally adds
the @lowercase. / @uppercase. annotation when it is missing.

Parameters:
poCase Consultingwerk.Studio.SourceCode.KeywordCaseEnum
The requested keyword case (Lowercase or Uppercase)
plAddAnnotation LOGICAL
Logical value indicating if the @lowercase. / @uppercase. annotation should be added when missing
Top

LOGICAL IsHandleExpression (INode)

Purpose: Returns whether the node is (part of) a handle-valued expression,
resolving member reference chains to the root of the expression
Notes: The root must be one of the ABL system handles (SCL-5495), a
temp-table / buffer / dataset / query keyword form (SCL-5500) or
a name declared AS HANDLE in the compilation unit (SCL-5501).
THIS-OBJECT and SELF are deliberately no system handles here -
their members are class members, and lowercasing a PascalCase
property whose name collides with an ABL keyword (Label, Value,
Name, Type, ...) would corrupt the convention (SCL-5496).
A chained member reference (hBuffer:AFTER-BUFFER:name,
hDataset:get-buffer-handle(1):buffer-value) get-buffer-handle(1):buffer-value) and a dataset-buffer
reference through the double colon (hDataset::eTable:AVAILABLE)
put the previous chain link left of the OBJCOLON / DOUBLECOLON -
those links are walked back to the chain root (SCL-5550). An
OBJCOLON link only continues the chain when the intermediate
member is a genuine ABL keyword, so an object method chain
(oEnum:GetClass():name) GetClass():name) never qualifies

Parameters:
poNode Consultingwerk.Studio.ProparseApi.INode
The INode carrying the owner of a member reference
Returns LOGICAL
TRUE when the expression the node belongs to is rooted in an ABL handle
Top

LOGICAL IsMemberReference (INode)

Purpose: Returns whether the node is a member reference, i.e. the name
following an OBJCOLON (SESSION:TEMP-DIRECTORY, oEnum:Label)
Notes: Such a node is governed by IsSystemHandleAttribute alone and never
by its node type - many property names are reserved ABL keywords
and Proparse types them accordingly even as a class member

Parameters:
poNode Consultingwerk.Studio.ProparseApi.INode
The INode to test
Returns LOGICAL
TRUE when the node follows an OBJCOLON
Top

LOGICAL IsNoArgFunctionKeyword (INode)

Purpose: Returns whether the node is a built-in function keyword that may
be invoked without an argument but is typed as a plain identifier
by Proparse
Notes : The keyword table flags GUID with MAY_BE_REGULAR_FUNC only, so a
bare GUID (without a parenthesized argument) is re-typed to an ID
node inside a Field_ref during the parse and would otherwise keep
its case. Member references (oObject:Guid) never reach this test -
see IsMemberReference - and a qualified field reference
(eTable.GUID) carries the qualified name as its node text, so a
user defined field named GUID is left untouched (SCL-5534)

Parameters:
poNode Consultingwerk.Studio.ProparseApi.INode
The INode to test
Returns LOGICAL
TRUE when the node is a no-argument built-in function keyword typed as an identifier
Top

LOGICAL IsSystemHandleAttribute (INode)

Purpose: Returns whether the node is the attribute or method name of an ABL
handle reference
Notes: Accepts the ABL system handles (SCL-5495), the temp-table / buffer
/ dataset / query forms (SCL-5500), plain HANDLE variables and
parameters (SCL-5501), dataset-buffer references through the
double colon and chained handle expressions (SCL-5550). See
IsMemberReference / MemberReferenceOwner / IsHandleExpression

Parameters:
poNode Consultingwerk.Studio.ProparseApi.INode
The INode to test
Returns LOGICAL
TRUE when the node is the attribute name of a handle reference
Top

LOGICAL IsUnknownFunctionKeyword (INode)

Purpose: Returns whether the node is a built-in function keyword that is
unknown to Proparse and typed as a local method reference
Notes : The Proparse keyword table predates DYNAMIC-PROPERTY, so the
lexer types the name as a plain identifier. Inside a class an
unknown identifier followed by an argument list is parsed as a
local method reference (LOCAL_METHOD_REF) - for the getter,
setter and ASSIGN forms alike - so the keyword would otherwise
keep its case. Only the names in cUnknownFunctionKeywords
qualify - a user defined local method never collides with them,
since these keywords contain a hyphen, which is invalid in a
method name (SCL-5558)

Parameters:
poNode Consultingwerk.Studio.ProparseApi.INode
The INode to test
Returns LOGICAL
TRUE when the node is a built-in function keyword typed as a local method reference
Top

Consultingwerk.Studio.ProparseApi.INode MemberReferenceOwner (INode)

Purpose: Returns the node the member reference is taken from, i.e. the node
left of the OBJCOLON preceding the given node
Notes: Returns the unknown value when the node is not a member reference

Parameters:
poNode Consultingwerk.Studio.ProparseApi.INode
The INode to test
Returns Consultingwerk.Studio.ProparseApi.INode
The owner INode, or ? when poNode does not follow an OBJCOLON
Top

LOGICAL ProcessNode (INode)

Purpose: Processes a single AST node, correcting the case of keyword tokens
Notes: Nodes originating from include files (FileName does not match the
originally parsed program) and synthetic nodes (without a source
position) are skipped.

Parameters:
poNode Consultingwerk.Studio.ProparseApi.INode
The INode to process
Returns LOGICAL
Logical value indicating if the AST walk should be cancelled (always FALSE)


Constructor Detail
Top

KeywordCaseProcessor (character)

Purpose: Constructor for the KeywordCaseProcessor class
Notes:

Parameters:
pcFileName CHARACTER
The name of the source file (.p, .w, .cls) to process


Property Detail
Top

CHARACTER FileName


Returns CHARACTER


©2006-2026 Consultingwerk Ltd.         info@consultingwerk.de         http://www.consultingwerk.de       19.09.2026 10:18:52