📄 dws2symbolstotree.pas
字号:
{ Add Class members }
for x := 0 to TClassSymbol(PosList.Symbol).Members.Count - 1 do
begin
SubSymList := AProgram.SymbolDictionary.FindSymbolPosList(TClassSymbol(PosList.Symbol).Members[x]);
if Assigned(SubSymList) then
AddSymbolToTree(NewNode, Tree, SubSymList.Symbol, SubSymList.FindUsage(suDeclaration));
end;
end
{ Constants - not element of enumeration }
else if (PosList.Symbol is TConstSymbol) and (not (PosList.Symbol is TElementSymbol)) then
AddSymbolToTree(ConstNode, Tree, PosList.Symbol, DeclPos)
{ Enumerations - Not standard Delphi to include. }
else if PosList.Symbol is TEnumerationSymbol then
begin
NewNode := AddSymbolToTree(EnumNode, Tree, PosList.Symbol, DeclPos);
for x := 0 to TEnumerationSymbol(PosList.Symbol).Elements.Count - 1 do
begin
SubSymList := AProgram.SymbolDictionary.FindSymbolPosList(TEnumerationSymbol(PosList.Symbol).Elements[x]);
if Assigned(SubSymList) then
AddSymbolToTree(NewNode, Tree, SubSymList.Symbol, SubSymList.FindUsage(suDeclaration));
end;
end
{ Arrays }
else if PosList.Symbol is TCustomArraySymbol then
AddSymbolToTree(ArrayNode, Tree, PosList.Symbol, DeclPos)
{ Records }
else if PosList.Symbol is TRecordSymbol then
begin
NewNode := AddSymbolToTree(RecNode, Tree, PosList.Symbol, DeclPos);
for x := 0 to TRecordSymbol(PosList.Symbol).Members.Count - 1 do
begin
SubSymList := AProgram.SymbolDictionary.FindSymbolPosList(TRecordSymbol(PosList.Symbol).Members[x]);
if Assigned(SubSymList) then
AddSymbolToTree(NewNode, Tree, SubSymList.Symbol, SubSymList.FindUsage(suDeclaration));
end;
end
{ Procedure - Don't catch methods here. }
else if (PosList.Symbol is TFuncSymbol) and (not (PosList.Symbol is TMethodSymbol)) then
begin
{ if Function is forwarded, use that position, if not then use declaration }
if Assigned(ForPos) then
AddSymbolToTree(ProcNode, Tree, PosList.Symbol, ForPos)
else
AddSymbolToTree(ProcNode, Tree, PosList.Symbol, DeclPos);
end
{ Synonyms (Aliases) }
else if PosList.Symbol is TAliasSymbol then
AddSymbolToTree(SynonymNode, Tree, PosList.Symbol, DeclPos)
{ Variables }
else if PosList.Symbol is TDataSymbol then
AddSymbolToTree(VarNode, Tree, PosList.Symbol, DeclPos);
end;
end;
{ Remove empty sections }
PruneEmptyNodes(Tree);
end;
procedure SymbolsToDefaultDelphiTree(AProgram: TProgram; Tree: TTreeView);
var
{ Nodes that hold sections of items }
ClassNode, TypesNode, ProcNode, VarConstNode: TTreeNode;
i, x: Integer;
ForPos, // forward
DeclPos: TSymbolPosition; // declaration
PosList, // list of symbol positions
SubSymList: TSymbolPositionList; // sub-Symbol position list (members)
NewNode: TTreeNode;
begin
{ Requires both the SymbolList and ContextMap compiler directives for the script. }
Tree.Items.Clear;
{ Create holders up front. Delete empty ones when done. }
ClassNode := CreateNewNode(nil, 'Classes', imgFolder, Tree, nil);
ProcNode := CreateNewNode(nil, 'Procedures', imgFolder, Tree, nil);
TypesNode := CreateNewNode(nil, 'Types', imgFolder, Tree, nil);
VarConstNode := CreateNewNode(nil, 'Variables/Constants', imgFolder, Tree, nil);
{ Cycle all symbols. Add select types to appropriate categories }
for i := 0 to AProgram.SymbolDictionary.Count - 1 do
begin
PosList := AProgram.SymbolDictionary[i];
DeclPos := PosList.FindUsage(suDeclaration); // find where declared
{ If found declaration (not in a unit or another script) }
if Assigned(DeclPos) then
begin
{ Classes & Forwards - Forwards will be ignored at this point }
if PosList.Symbol is TClassSymbol then
begin
{ Add Class itself }
NewNode := AddSymbolToTree(ClassNode, Tree, PosList.Symbol, DeclPos);
{ Add Class members }
for x := 0 to TClassSymbol(PosList.Symbol).Members.Count - 1 do
begin
SubSymList := AProgram.SymbolDictionary.FindSymbolPosList(TClassSymbol(PosList.Symbol).Members[x]);
if Assigned(SubSymList) then
AddSymbolToTree(NewNode, Tree, SubSymList.Symbol, SubSymList.FindUsage(suDeclaration));
end;
end
{ Variables/Constants }
{ Constants and Variables (not Enumerations)}
else if ((PosList.Symbol is TConstSymbol) or (PosList.Symbol is TDataSymbol)) and
(not (PosList.Symbol is TElementSymbol)) then
AddSymbolToTree(VarConstNode, Tree, PosList.Symbol, DeclPos)
{ Enumerations - Handle first, elements are constants and would otherwise show up there. }
else if PosList.Symbol is TEnumerationSymbol then
begin
NewNode := AddSymbolToTree(VarConstNode, Tree, PosList.Symbol, DeclPos);
for x := 0 to TEnumerationSymbol(PosList.Symbol).Elements.Count - 1 do
begin
SubSymList := AProgram.SymbolDictionary.FindSymbolPosList(TEnumerationSymbol(PosList.Symbol).Elements[x]);
if Assigned(SubSymList) then
AddSymbolToTree(NewNode, Tree, SubSymList.Symbol, SubSymList.FindUsage(suDeclaration));
end;
end
{ Types - classes are already handled }
else if PosList.Symbol is TTypeSymbol then
begin
// add type
NewNode := AddSymbolToTree(TypesNode, Tree, PosList.Symbol, DeclPos);
{ Check for types that have members }
// (Records - Add members)
if PosList.Symbol is TRecordSymbol then
begin
for x := 0 to TRecordSymbol(PosList.Symbol).Members.Count - 1 do
begin
SubSymList := AProgram.SymbolDictionary.FindSymbolPosList(TRecordSymbol(PosList.Symbol).Members[x]);
if Assigned(SubSymList) then
AddSymbolToTree(NewNode, Tree, SubSymList.Symbol, SubSymList.FindUsage(suDeclaration));
end;
end
// (Enumerations - Add elements)
else if PosList.Symbol is TEnumerationSymbol then
begin
for x := 0 to TEnumerationSymbol(PosList.Symbol).Elements.Count - 1 do
begin
SubSymList := AProgram.SymbolDictionary.FindSymbolPosList(TEnumerationSymbol(PosList.Symbol).Elements[x]);
if Assigned(SubSymList) then
AddSymbolToTree(NewNode, Tree, SubSymList.Symbol, SubSymList.FindUsage(suDeclaration));
end;
end;
end
{ Procedure - Don't catch methods here. }
else if (PosList.Symbol is TFuncSymbol) and (not (PosList.Symbol is TMethodSymbol)) then
begin
{ if Function is forwarded, use that position, if not then use declaration }
ForPos := PosList.FindUsage(suForward); // find where forwarded (may not be)
if Assigned(ForPos) then
AddSymbolToTree(ProcNode, Tree, PosList.Symbol, ForPos)
else
AddSymbolToTree(ProcNode, Tree, PosList.Symbol, DeclPos);
end;
end;
end;
{ Remove empty sections }
PruneEmptyNodes(Tree);
end;
{-----------------------------------------------------------------------------
Procedure: PruneEmptyNodes
Author: Mark Ericksen
Date: 21-Oct-2002
Arguments: Tree: TTreeView
Result: None
Purpose: Remove nodes that are 'empty'. Root nodes, no children, no data.
-----------------------------------------------------------------------------}
procedure PruneEmptyNodes(Tree: TTreeView);
var
i: Integer;
begin
{ Remove empty sections }
i := 0;
while i <= Tree.Items.Count - 1 do
begin
// if (is a parent node) (with no children) and (has no Data), delete it.
if (Tree.Items[i].Parent = nil) and (Tree.Items[i].Count = 0) and (Tree.Items[i].Data=nil)then
Tree.Items.Delete(Tree.Items[i]) // if removed, don't up counter, need to check replacement index
else
Inc(i);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -