summaryrefslogtreecommitdiff
path: root/avx512-0037785/utils/fpdoc/fpdocclasstree.pp
diff options
context:
space:
mode:
Diffstat (limited to 'avx512-0037785/utils/fpdoc/fpdocclasstree.pp')
-rw-r--r--avx512-0037785/utils/fpdoc/fpdocclasstree.pp84
1 files changed, 57 insertions, 27 deletions
diff --git a/avx512-0037785/utils/fpdoc/fpdocclasstree.pp b/avx512-0037785/utils/fpdoc/fpdocclasstree.pp
index 3ea8c84d65..2dc99839ba 100644
--- a/avx512-0037785/utils/fpdoc/fpdocclasstree.pp
+++ b/avx512-0037785/utils/fpdoc/fpdocclasstree.pp
@@ -2,6 +2,7 @@ unit fpdocclasstree;
{$mode objfpc}{$H+}
+
interface
uses
@@ -9,21 +10,23 @@ uses
Type
+ TPasObjKindSet = set of TPasObjKind;
+
{ TPasElementNode }
TPasElementNode = Class
Private
- FElement : TPasClassType;
+ FElement : TPasType;
FParentNode: TPasElementNode;
FChildren : TFPObjectList;
function GetChild(aIndex : Integer): TPasElementNode;
function GetChildCount: Integer;
Public
- Constructor Create (aElement : TPasClassType);
+ Constructor Create (aElement : TPasType);
Destructor Destroy; override;
Procedure AddChild(C : TPasElementNode);
Procedure SortChildren;
- Property Element : TPasClassType Read FElement;
+ Property Element : TPasType Read FElement;
Property ParentNode : TPasElementNode read FParentNode;
Property Children [aIndex : Integer] : TPasElementNode Read GetChild;
Property ChildCount : Integer Read GetChildCount;
@@ -35,17 +38,17 @@ Type
Private
FEngine:TFPDocEngine;
FElementList : TFPObjectHashTable;
- FObjectKind : TPasObjKind;
+ FObjectKind : TPasObjKindSet;
FPackage: TPasPackage;
FParentObject : TPasClassType;
FRootNode : TPasElementNode;
FRootObjectName : string;
FRootObjectPathName : string;
Protected
- function AddToList(aElement: TPasClassType): TPasElementNode;
+ function AddToList(aElement: TPasType): TPasElementNode;
Public
Constructor Create(AEngine:TFPDocEngine; APackage : TPasPackage;
- AObjectKind : TPasObjKind = okClass);
+ AObjectKind : TPasObjKindSet = okWithFields);
Destructor Destroy; override;
Function BuildTree(AObjects : TStringList) : Integer;
Procedure SaveToXml(AFileName: String);
@@ -56,6 +59,9 @@ Type
implementation
+uses
+ fpdocstrs, pasresolver;
+
{ TPasElementNode }
function SortOnElementName(Item1, Item2: Pointer): Integer;
@@ -79,7 +85,7 @@ begin
Result:=0
end;
-constructor TPasElementNode.Create(aElement: TPasClassType);
+constructor TPasElementNode.Create(aElement: TPasType);
begin
FElement:=aElement;
end;
@@ -104,33 +110,36 @@ begin
end;
constructor TClassTreeBuilder.Create(AEngine:TFPDocEngine; APackage : TPasPackage;
- AObjectKind: TPasObjKind);
+ AObjectKind: TPasObjKindSet);
begin
FEngine:= AEngine;
FPackage:= APAckage;
FObjectKind:=AObjectKind;
- Case FObjectkind of
- okInterface :
+ if (okInterface in FObjectkind) then
begin
FRootObjectPathName:='#rtl.System.IInterface';
FRootObjectName:= 'IInterface';
- end;
- okObject, okClass :
+ end
+ else if (FObjectkind * okWithFields) <> [] then
begin
FRootObjectPathName:='#rtl.System.TObject';
FRootObjectName:= 'TObject';
end
- else
+ else // TODO: I don`t know need it ? Without that the code may be simplified.
begin
FRootObjectPathName:='#rtl.System.TObject';
FRootObjectName:= 'TObject';
end;
- end;
FParentObject:=TPasClassType.Create(FRootObjectName,FEngine.FindModule('System'));
if not Assigned(FParentObject) then
FParentObject:=TPasClassType.Create(FRootObjectName,FPackage);
- FParentObject.ObjKind:=FObjectKind;
+ if (okInterface in FObjectkind) then
+ FParentObject.ObjKind:=okInterface
+ else if (FObjectkind * okWithFields) <> [] then
+ FParentObject.ObjKind:=okClass
+ else
+ FParentObject.ObjKind:=okClass;
FRootNode:=TPasElementNode.Create(FParentObject);
FRootNode.FParentNode := nil;
FElementList:=TFPObjectHashTable.Create(False);
@@ -145,29 +154,42 @@ begin
Inherited;
end;
-function TClassTreeBuilder.AddToList ( aElement: TPasClassType
+function TClassTreeBuilder.AddToList ( aElement: TPasType
) : TPasElementNode;
Var
aParentNode : TPasElementNode;
aName : String;
+ aElementClass: TPasClassType;
begin
- Result:= nil;
- if (aElement.ObjKind <> FObjectKind) then exit;
+ Result:= nil; aElementClass:=nil;
+ if (aElement is TPasClassType) then
+ aElementClass:= TPasClassType(aElement);
+ if Assigned(aElementClass) and not (aElementClass.ObjKind in FObjectKind) then exit;
+ if not Assigned(aElementClass) and not (aElement is TPasAliasType) then exit;
+
aParentNode:= nil;
if aElement=Nil then
aName:=FRootObjectName
+ else if (aElement is TPasAliasType) then
+ aName:=TPasAliasType(aElement).DestType.FullName
else
aName:=aElement.PathName;
Result:=TPasElementNode(FElementList.Items[aName]);
if (Result=Nil) then
begin
- if aElement.AncestorType is TPasClassType then
- aParentNode:=AddToList(aElement.AncestorType as TPasClassType);
+ if Assigned(aElementClass) and (
+ (aElementClass.AncestorType is TPasClassType) or
+ (aElementClass.AncestorType is TPasAliasType)
+ ) then
+ aParentNode:=AddToList(aElementClass.AncestorType);
if not Assigned(aParentNode) then
aParentNode:=FRootNode;
- Result:=TPasElementNode.Create(aElement);
+ if (aElement is TPasAliasType) then
+ Result:=TPasElementNode.Create(TPasAliasType(TPasType(aElement)).DestType)
+ else
+ Result:=TPasElementNode.Create(aElement);
aParentNode.AddChild(Result);
Result.FParentNode := aParentNode;
FElementList.Add(aName,Result);
@@ -227,10 +249,11 @@ procedure TClassTreeBuilder.SaveToXml ( AFileName: String );
for CounterVar := 0 to ParentPasEl.ChildCount-1 do
begin
PasElNode:= ParentPasEl.Children[CounterVar];
- xmlEl:= AXmlDoc.CreateElement(UnicodeString(PasElNode.Element.Name));
+ xmlEl:= AXmlDoc.CreateElement(UTF8Decode(PasElNode.Element.Name));
M:= PasElNode.Element.GetModule;
- xmlEl['unit'] := UnicodeString(M.Name);
- xmlEl['package'] := UnicodeString(M.PackageName);
+ xmlEl['unit'] := UTF8Decode(M.Name);
+ xmlEl['package'] := UTF8Decode(M.PackageName);
+ xmlEl['type'] := UTF8Decode(GetElementTypeName(PasElNode.Element));
ParentxmlEl.AppendChild(xmlEl);
AddPasElChildsToXml(xmlEl, PasElNode);
end;
@@ -244,17 +267,24 @@ begin
XmlDoc:= TXMLDocument.Create;
XmlDoc.AppendChild(XmlDoc.CreateComment(UTF8Decode(SDocGeneratedByComment)));
try
- XmlRootEl:= XmlDoc.CreateElement(UnicodeString(FRootNode.Element.Name));
+ XmlRootEl:= XmlDoc.CreateElement(UTF8Decode(FRootNode.Element.Name));
M:= FRootNode.Element.GetModule;
if Assigned(M) then
begin
- XmlRootEl['unit'] := UnicodeString(M.Name);
- XmlRootEl['package'] := UnicodeString(M.PackageName);
+ XmlRootEl['unit'] := UTF8Decode(M.Name);
+ XmlRootEl['package'] := UTF8Decode(M.PackageName);
+ XmlRootEl['type'] := UTF8Decode(GetElementTypeName(FRootNode.Element));
end
else
begin
XmlRootEl['unit'] := 'system';
XmlRootEl['package'] := 'rtl';
+ if (okWithFields * FObjectKind) <> [] then
+ XmlRootEl['type'] := 'class'
+ else if (okInterface in FObjectKind) then
+ XmlRootEl['type'] := 'interface'
+ else
+ XmlRootEl['type'] := 'class';
end;
XmlDoc.AppendChild(XmlRootEl);
AddPasElChildsToXml(XmlRootEl, FRootNode);