⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dws2symbolstotree.pas

📁 script language
💻 PAS
📖 第 1 页 / 共 2 页
字号:
        { 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 + -