mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-10 22:06:08 +02:00
* Load inheritance info from content file. Inheritance diagrams now work
reasonably well over package bounderies. git-svn-id: trunk@15867 -
This commit is contained in:
parent
d4360154a7
commit
9fd7c6fc63
@ -583,6 +583,7 @@ end;
|
|||||||
procedure TFPDocEngine.ReadContentFile(const AFilename, ALinkPrefix: String);
|
procedure TFPDocEngine.ReadContentFile(const AFilename, ALinkPrefix: String);
|
||||||
var
|
var
|
||||||
f: Text;
|
f: Text;
|
||||||
|
inheritanceinfo : TStringlist;
|
||||||
|
|
||||||
procedure ReadLinkTree;
|
procedure ReadLinkTree;
|
||||||
var
|
var
|
||||||
@ -640,16 +641,15 @@ var
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure ReadClasses;
|
function ResolvePackageModule(AName:String;var pkg:TPasPackage;var module:TPasModule;createnew:boolean):String;
|
||||||
|
|
||||||
function CreateClass(const AName: String;InheritanceStr:String): TPasClassType;
|
|
||||||
var
|
var
|
||||||
DotPos, DotPos2, i,j: Integer;
|
DotPos, DotPos2, i,j: Integer;
|
||||||
s: String;
|
s: String;
|
||||||
HPackage: TPasPackage;
|
HPackage: TPasPackage;
|
||||||
Module: TPasModule;
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
pkg:=nil; module:=nil; result:='';
|
||||||
|
|
||||||
// Find or create package
|
// Find or create package
|
||||||
DotPos := Pos('.', AName);
|
DotPos := Pos('.', AName);
|
||||||
s := Copy(AName, 1, DotPos - 1);
|
s := Copy(AName, 1, DotPos - 1);
|
||||||
@ -662,6 +662,8 @@ var
|
|||||||
end;
|
end;
|
||||||
if not Assigned(HPackage) then
|
if not Assigned(HPackage) then
|
||||||
begin
|
begin
|
||||||
|
if not CreateNew then
|
||||||
|
exit;
|
||||||
HPackage := TPasPackage(inherited CreateElement(TPasPackage, s, nil,
|
HPackage := TPasPackage(inherited CreateElement(TPasPackage, s, nil,
|
||||||
'', 0));
|
'', 0));
|
||||||
FPackages.Add(HPackage);
|
FPackages.Add(HPackage);
|
||||||
@ -682,73 +684,157 @@ var
|
|||||||
end;
|
end;
|
||||||
if not Assigned(Module) then
|
if not Assigned(Module) then
|
||||||
begin
|
begin
|
||||||
|
if not CreateNew then
|
||||||
|
exit;
|
||||||
Module := TPasModule.Create(s, HPackage);
|
Module := TPasModule.Create(s, HPackage);
|
||||||
Module.InterfaceSection := TInterfaceSection.Create('', Module);
|
Module.InterfaceSection := TInterfaceSection.Create('', Module);
|
||||||
HPackage.Modules.Add(Module);
|
HPackage.Modules.Add(Module);
|
||||||
end;
|
end;
|
||||||
|
pkg:=hpackage;
|
||||||
|
result:=Copy(AName, DotPos2 + 1, length(AName)-dotpos2);
|
||||||
|
end;
|
||||||
|
|
||||||
s:=Copy(AName, DotPos2 + 1, length(AName)-dotpos2);
|
function ResolveClassType(AName:String):TPasClassType;
|
||||||
|
var
|
||||||
|
pkg : TPasPackage;
|
||||||
|
module : TPasModule;
|
||||||
|
s : string;
|
||||||
|
clslist : TList;
|
||||||
|
ClassEl : TPasClassType;
|
||||||
|
i : Integer;
|
||||||
|
begin
|
||||||
|
Result:=nil;
|
||||||
|
s:=ResolvePackageModule(AName,pkg,module,False);
|
||||||
|
if not assigned(module) then
|
||||||
|
exit;
|
||||||
|
clslist:=module.InterfaceSection.Classes;
|
||||||
|
for i:=0 to clslist.count-1 do
|
||||||
|
begin
|
||||||
|
ClassEl := TPasClassType(clslist[i]);
|
||||||
|
if CompareText(ClassEl.Name,s) =0 then
|
||||||
|
exit(Classel);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure ReadClasses;
|
||||||
|
|
||||||
|
function CreateClass(const AName: String;InheritanceStr:String): TPasClassType;
|
||||||
|
var
|
||||||
|
DotPos, DotPos2, i,j: Integer;
|
||||||
|
s: String;
|
||||||
|
HPackage: TPasPackage;
|
||||||
|
Module: TPasModule;
|
||||||
|
|
||||||
|
begin
|
||||||
|
s:= ResolvePackageModule(AName,HPackage,Module,True);
|
||||||
// Create node for class
|
// Create node for class
|
||||||
Result := TPasClassType.Create(s, Module.InterfaceSection);
|
Result := TPasClassType.Create(s, Module.InterfaceSection);
|
||||||
Result.ObjKind := okClass;
|
Result.ObjKind := okClass;
|
||||||
Module.InterfaceSection.Declarations.Add(Result);
|
Module.InterfaceSection.Declarations.Add(Result);
|
||||||
Module.InterfaceSection.Classes.Add(Result);
|
Module.InterfaceSection.Classes.Add(Result);
|
||||||
// process inheritancestr here.
|
// defer processing inheritancestr till all classes are loaded.
|
||||||
|
if inheritancestr<>'' then
|
||||||
|
InheritanceInfo.AddObject(Inheritancestr,result);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure ProcessInheritanceStrings(inhInfo:TStringList);
|
||||||
|
var i,j : integer;
|
||||||
|
cls : TPasClassType;
|
||||||
|
cls2: TPasClassType;
|
||||||
|
inhclass : TStringList;
|
||||||
|
begin
|
||||||
|
inhclass:=TStringList.Create;
|
||||||
|
inhclass.delimiter:=',';
|
||||||
|
if InhInfo.Count>0 then
|
||||||
|
for i:=0 to InhInfo.Count-1 do
|
||||||
|
begin
|
||||||
|
cls:=TPasClassType(InhInfo.Objects[i]);
|
||||||
|
inhclass.clear;
|
||||||
|
inhclass.delimitedtext:=InhInfo[i];
|
||||||
|
|
||||||
|
for j:= 0 to inhclass.count-1 do
|
||||||
|
begin
|
||||||
|
writeln('processing',inhclass[j]);
|
||||||
|
cls2:=TPasClassType(ResolveClassType(inhclass[j]));
|
||||||
|
if assigned(cls2) and not (cls=cls2) then // save from tobject=implicit tobject
|
||||||
|
begin
|
||||||
|
cls2.addref;
|
||||||
|
if j=0 then
|
||||||
|
cls.ancestortype:=cls2
|
||||||
|
else
|
||||||
|
cls.interfaces.add(cls2);
|
||||||
|
{ if j=0 then
|
||||||
|
writeln(cls.name, ' has as ancestor ',cls2.pathname)
|
||||||
|
else
|
||||||
|
writeln(cls.name, ' implements ',cls2.pathname)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if cls<>cls2 then
|
||||||
|
writeln(cls.name,'''s dependancy ' ,inhclass[j],' ',j,' could not be resolved');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
s, Name: String;
|
s, Name: String;
|
||||||
CurClass: TPasClassType;
|
CurClass: TPasClassType;
|
||||||
i: Integer;
|
i: Integer;
|
||||||
Member: TPasElement;
|
Member: TPasElement;
|
||||||
begin
|
begin
|
||||||
CurClass := nil;
|
inheritanceinfo :=TStringlist.Create;
|
||||||
while True do
|
Try
|
||||||
begin
|
CurClass := nil;
|
||||||
ReadLn(f, s);
|
while True do
|
||||||
if Length(s) = 0 then
|
|
||||||
break;
|
|
||||||
if s[1] = '#' then
|
|
||||||
begin
|
begin
|
||||||
// New class
|
ReadLn(f, s);
|
||||||
i := Pos(' ', s);
|
if Length(s) = 0 then
|
||||||
CurClass := CreateClass(Copy(s, 1, i - 1), copy(s,i+1,length(s)));
|
break;
|
||||||
end else
|
if s[1] = '#' then
|
||||||
begin
|
begin
|
||||||
i := Pos(' ', s);
|
// New class
|
||||||
if i = 0 then
|
i := Pos(' ', s);
|
||||||
Name := Copy(s, 3, Length(s))
|
CurClass := CreateClass(Copy(s, 1, i - 1), copy(s,i+1,length(s)));
|
||||||
else
|
end else
|
||||||
Name := Copy(s, 3, i - 3);
|
begin
|
||||||
|
i := Pos(' ', s);
|
||||||
case s[2] of
|
if i = 0 then
|
||||||
'M':
|
Name := Copy(s, 3, Length(s))
|
||||||
Member := TPasProcedure.Create(Name, CurClass);
|
|
||||||
'P':
|
|
||||||
begin
|
|
||||||
Member := TPasProperty.Create(Name, CurClass);
|
|
||||||
if i > 0 then
|
|
||||||
while i <= Length(s) do
|
|
||||||
begin
|
|
||||||
case s[i] of
|
|
||||||
'r':
|
|
||||||
TPasProperty(Member).ReadAccessorName := '<dummy>';
|
|
||||||
'w':
|
|
||||||
TPasProperty(Member).WriteAccessorName := '<dummy>';
|
|
||||||
's':
|
|
||||||
TPasProperty(Member).StoredAccessorName := '<dummy>';
|
|
||||||
end;
|
|
||||||
Inc(i);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
'V':
|
|
||||||
Member := TPasVariable.Create(Name, CurClass);
|
|
||||||
else
|
else
|
||||||
raise Exception.Create('Invalid member type: ' + s[2]);
|
Name := Copy(s, 3, i - 3);
|
||||||
|
|
||||||
|
case s[2] of
|
||||||
|
'M':
|
||||||
|
Member := TPasProcedure.Create(Name, CurClass);
|
||||||
|
'P':
|
||||||
|
begin
|
||||||
|
Member := TPasProperty.Create(Name, CurClass);
|
||||||
|
if i > 0 then
|
||||||
|
while i <= Length(s) do
|
||||||
|
begin
|
||||||
|
case s[i] of
|
||||||
|
'r':
|
||||||
|
TPasProperty(Member).ReadAccessorName := '<dummy>';
|
||||||
|
'w':
|
||||||
|
TPasProperty(Member).WriteAccessorName := '<dummy>';
|
||||||
|
's':
|
||||||
|
TPasProperty(Member).StoredAccessorName := '<dummy>';
|
||||||
|
end;
|
||||||
|
Inc(i);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
'V':
|
||||||
|
Member := TPasVariable.Create(Name, CurClass);
|
||||||
|
else
|
||||||
|
raise Exception.Create('Invalid member type: ' + s[2]);
|
||||||
|
end;
|
||||||
|
CurClass.Members.Add(Member);
|
||||||
end;
|
end;
|
||||||
CurClass.Members.Add(Member);
|
|
||||||
end;
|
end;
|
||||||
end;
|
ProcessInheritanceStrings(Inheritanceinfo);
|
||||||
|
finally
|
||||||
|
inheritanceinfo.Free;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
@ -865,8 +951,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
finally
|
finally
|
||||||
Close(ContentFile);
|
Close(ContentFile);
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user