-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathdelcos.dpr
123 lines (110 loc) · 3.62 KB
/
delcos.dpr
1
2
3
4
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
program delcos;
{$APPTYPE CONSOLE}
uses
Classes, SysUtils, IniFiles,
PascalParser,
Options in 'cui\Options.pas',
OptionsValidator in 'cui\OptionsValidator.pas',
SourceTreeWalker in 'core\SourceTreeWalker.pas',
SourceTreeDumperVisitor in 'core\SourceTreeDumperVisitor.pas',
UnitRegistry in 'core\UnitRegistry.pas',
CommentRemovalVisitor in 'core\CommentRemovalVisitor.pas',
WhitespaceRemovalVisitor in 'core\WhitespaceRemovalVisitor.pas',
IncludeParser in 'core\IncludeParser.pas',
ProjectUnitsRegistratorVisitor in 'core\ProjectUnitsRegistratorVisitor.pas',
UsesTreeBuilderVisitor in 'core\UsesTreeBuilderVisitor.pas',
CyclomaticComplexityCalculatorVisitor in 'core\CyclomaticComplexityCalculatorVisitor.pas';
procedure DumpCyclomaticComplexity;
var
Methods: TMethodList;
Units: TStrings;
I, J: Integer;
begin
Units := TStringList.Create;
try
TUnitRegistry.Instance.GetProjectRegisteredUnitsNames(Units);
for I := 0 to Units.Count - 1 do
begin
Methods := TMethodList.Create;
try
TSourceTreeWalker.Create.Walk(TUnitRegistry.Instance.UnitParser[Units[I]].Root, TCyclomaticComplexityCalculatorVisitor.Create(Methods) as INodeVisitor);
for J := 0 to Methods.Count - 1 do
Writeln(Units[I], '::', Methods[J].Name, ' (CC = ', Methods[J].CyclomaticComplexity, ')');
finally
Methods.Free;
end;
end;
finally
Units.Free;
end;
end;
function ExtractUnitNameFromFileName(FileName: String): String;
begin
Result := ExtractFileName(FileName);
Result := Copy(Result, 1, Length(Result) - Length(ExtractFileExt(Result)));
end;
procedure DumpIncludes;
var
I, J: Integer;
Units, AllIncludes, Includes: TStrings;
begin
AllIncludes := TStringList.Create;
try
Includes := TStringList.Create;
try
Units := TStringList.Create;
try
TUnitRegistry.Instance.GetAllRegisteredUnitsNames(Units);
for I := 0 to Units.Count - 1 do
begin
TUnitRegistry.Instance.GetUnitIncludes(Units[I], Includes);
for J := 0 to Includes.Count - 1 do
if AllIncludes.IndexOf(UpperCase(Trim(Includes[J]))) = -1 then
AllIncludes.Add(UpperCase(Trim(Includes[J])))
end;
finally
Units.Free;
end;
finally
Includes.Free;
end;
Write(AllIncludes.Text);
finally
AllIncludes.Free;
end;
end;
var
Output: TStrings;
RootUnit: String;
begin
with TSourceTreeWalker.Create do
begin
RootUnit := ExtractUnitNameFromFileName(TOptions.Instance.InputFile);
TUnitRegistry.Instance.RegisterUnit(RootUnit, TOptions.Instance.InputFile, True);
with TUnitRegistry.Instance.UnitParser[RootUnit] do
begin
Walk(Root, TProjectUnitsRegistratorVisitor.Create as INodeVisitor);
Output := TStringList.Create;
try
if TOptions.Instance.DumpDebugTree then
Walk(Root, TSourceTreeDumperVisitor.Create(Output) as INodeVisitor);
if TOptions.Instance.DumpUsesTree then
begin
Walk(Root, TUsesTreeBuilderVisitor.Create(vmSimple, Output) as INodeVisitor);
Write(Output.Text);
DumpIncludes;
end;
if TOptions.Instance.DumpAdvancedUsesTree then
begin
Walk(Root, TUsesTreeBuilderVisitor.Create(vmFull, Output) as INodeVisitor);
Write(Output.Text);
DumpIncludes;
end;
if TOptions.Instance.DumpCyclomaticComplexity then
DumpCyclomaticComplexity;
finally
Output.Free;
end;
end;
end;
end.