Delphi extractor drops the receiver call of a chained call expression and everything inside it
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 65/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Domain
- devtools
Research direction
Start with extractPascalCall and extractPascalParenlessCall, which the issue says read the receiver exprCall only for the T/I factory name and never record the receiver call or the calls inside its arguments. Save the Chain.pas reproduction from the issue, run codegraph init and codegraph callees TargetIsTheSame, then compare against the expected callees for TargetIsTheSame and Stmt. Done when MD5FileSized and ExtendedPath appear as both callees and callers, with no regression on the existing TFoo.GetInstance().DoIt cases.
Written by the indexing model from the issue text.
Description
Summary
In a Delphi (Object Pascal) unit, a call whose receiver is itself a call - MD5FileSized(TMeta.ExtendedPath(APath)).IsSame(AKey) - contributes one edge: the outer method (IsSame). The receiver call (MD5FileSized) and the calls inside its arguments (TMeta.ExtendedPath) are missing from callees of the routine and from callers of each callee.
The same holds for the paren-less statement form MD5FileSized(…).Reset;. The tree is parsed correctly; the walk stops at the receiver.
Versions
codegraph --version: 1.6.2 (Windows x64 bundle).- Windows 10 Pro 10.0.19045.
Minimal reproduction
Chain.pas:
unit Chain;
interface
type
TKey = record
function IsSame(const AOther: TKey): Boolean;
procedure Reset;
end;
TMeta = class
class function ExtendedPath(const APath: string): string; static;
end;
function MD5FileSized(const APath: string): TKey;
function TargetIsTheSame(const APath: string; const AKey: TKey): Boolean;
procedure Stmt(const APath: string);
implementation
function TKey.IsSame(const AOther: TKey): Boolean;
begin
Result := True;
end;
procedure TKey.Reset;
begin
end;
class function TMeta.ExtendedPath(const APath: string): string;
begin
Result := APath;
end;
function MD5FileSized(const APath: string): TKey;
begin
end;
function TargetIsTheSame(const APath: string; const AKey: TKey): Boolean;
begin
Result := MD5FileSized(TMeta.ExtendedPath(APath)).IsSame(AKey);
end;
procedure Stmt(const APath: string);
begin
MD5FileSized(TMeta.ExtendedPath(APath)).Reset;
end;
end.
Steps, in a directory holding only that file:
codegraph init -y .
codegraph callees TargetIsTheSame
codegraph callees Stmt
codegraph callers MD5FileSized
codegraph callers ExtendedPath
Observed (1.6.2):
● 10 nodes, 11 edges
Callees of "TargetIsTheSame" (1):
method IsSame
Callees of "Stmt" (1):
method Reset
Callers of "MD5FileSized" (0):
No callers found for "MD5FileSized"
Callers of "ExtendedPath" (0):
No callers found for "ExtendedPath"
Expected: TargetIsTheSame with the callees MD5FileSized, ExtendedPath, IsSame; Stmt with MD5FileSized, ExtendedPath, Reset; MD5FileSized and ExtendedPath each with two callers.
The grammar's tree is complete (tree-sitter-pascal.wasm shipped in 1.6.2):
assignment
identifier "Result"
exprCall
exprDot
exprCall
identifier "MD5FileSized"
exprArgs
exprCall
exprDot
identifier "TMeta"
identifier "ExtendedPath"
exprArgs
identifier "APath"
identifier "IsSame"
exprArgs
identifier "AKey"
extractPascalCall reads the receiver exprCall only to build the TFoo.GetInstance().DoIt name for a T/I-prefixed factory (#645/#608); it records neither the receiver call nor the calls in its arguments, and only the outer exprArgs are visited. extractPascalParenlessCall records the receiver call only on the same T/I gate.
Where it was found
A product's Result := MD5FileSized(TFSMetadata.ExtendedPath(APath)).IsSame(AContentKey);: callers TFSMetadata.ExtendedPath --limit 500 named 12 of the 13 routines that call it, the routine holding that line being the one left out; its callees listed IsSame alone.
- Dominant language
- C
- Stars
- 73.2k
- Forks
- 4.7k
- Avg merge
- 2h 13m
- Merged PRs (30d)
- 418
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from colbymchenry/codegraph
-
Difficulty 2/5 1-3 hours Newbie friendliness 90/100
colbymchenry/codegraph#2634 ·
Maintainers usually reply within 1 day
-
Windows: bundled Node v24.16.0 can abort at exit (nodejs/node#56645); please bundle Node >= 24.20.0Possibly taken @Ancienttwo claimed this 2 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 67/100
colbymchenry/codegraph#2617 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 Under an hour Newbie friendliness 72/100
colbymchenry/codegraph#2482 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
colbymchenry/codegraph#1900 · 2 comments · 5 reactions ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
colbymchenry/codegraph#1700 ·
Maintainers usually reply within 1 day
All issues in colbymchenry/codegraph
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
OpenPrinting/cups#1772 ·
Maintainers usually reply within 1 day
-
tech-debt
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
antoxa2584x/nfsu2-sw#44 · 1 reaction ·
Maintainers usually reply within 1 day