* 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:
marco 2010-08-21 20:47:31 +00:00
parent d4360154a7
commit 9fd7c6fc63

View File

@ -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;