Browse Source

--- Merging r31182 into '.':
U rtl/inc/system.fpd
--- Recording mergeinfo for merge of r31182 into '.':
U .
--- Merging r31183 into '.':
U packages/fcl-passrc/tests/testpassrc.lpi
U packages/fcl-passrc/src/pparser.pp
U packages/fcl-passrc/src/pastree.pp
--- Recording mergeinfo for merge of r31183 into '.':
G .
--- Merging r31184 into '.':
U utils/fpdoc/css.inc
U utils/fpdoc/dglobals.pp
U utils/fpdoc/testunit.xml
U utils/fpdoc/fpdoc.lpi
U utils/fpdoc/dw_ipflin.pas
U utils/fpdoc/testunit.pp
U utils/fpdoc/dw_linrtf.pp
U utils/fpdoc/dw_html.pp
U utils/fpdoc/fpdoc.css
U utils/fpdoc/dw_man.pp
U utils/fpdoc/dwlinear.pp
U utils/fpdoc/dw_latex.pp
U utils/fpdoc/dw_txt.pp
--- Recording mergeinfo for merge of r31184 into '.':
G .

# revisions: 31182,31183,31184

git-svn-id: branches/fixes_3_0@31203 -

marco 10 years ago
parent
commit
9bf6743be1

+ 105 - 21
packages/fcl-passrc/src/pastree.pp

@@ -481,6 +481,7 @@ type
   public
     constructor Create(const AName: string; AParent: TPasElement); override;
     destructor Destroy; override;
+    function GetDeclaration(full : boolean) : string; override;
   public
     Values: TFPList;
     Members: TPasRecordType;
@@ -489,6 +490,8 @@ type
   { TPasRecordType }
 
   TPasRecordType = class(TPasType)
+  private
+    procedure GetMembers(S: TStrings);
   public
     constructor Create(const AName: string; AParent: TPasElement); override;
     destructor Destroy; override;
@@ -502,11 +505,12 @@ type
     Variants: TFPList;	// array of TPasVariant elements, may be nil!
     Function IsPacked: Boolean;
     Function IsBitPacked : Boolean;
+    Function IsAdvancedRecord : Boolean;
   end;
 
   TPasGenericTemplateType = Class(TPasElement);
   TPasObjKind = (okObject, okClass, okInterface, okGeneric, okSpecialize,
-                 okClassHelper,okRecordHelper);
+                 okClassHelper,okRecordHelper,okTypeHelper);
 
   { TPasClassType }
 
@@ -1168,7 +1172,7 @@ const
     'default', 'private', 'protected', 'public', 'published', 'automated','strict private', 'strict protected');
 
   ObjKindNames: array[TPasObjKind] of string = (
-    'object', 'class', 'interface','class','class','class helper','record helper');
+    'object', 'class', 'interface','class','class','class helper','record helper','type helper');
   
   OpcodeStrings : Array[TExprOpCode] of string = 
        ('','+','-','*','/','div','mod','**',
@@ -1765,6 +1769,31 @@ begin
   inherited Destroy;
 end;
 
+function TPasVariant.GetDeclaration(full: boolean): string;
+
+Var
+  i : Integer;
+  S : TStrings;
+
+begin
+  Result:='';
+  For I:=0 to Values.Count-1 do
+    begin
+    if (Result<>'') then
+      Result:=Result+', ';
+    Result:=Result+TPasElement(Values[i]).GetDeclaration(False);
+    Result:=Result+': ('+sLineBreak;
+    S:=TStringList.Create;
+    try
+      Members.GetMembers(S);
+      Result:=Result+S.Text;
+    finally
+      S.Free;
+    end;
+    Result:=Result+');';
+    end;
+end;
+
 
 constructor TPasRecordType.Create(const AName: string; AParent: TPasElement);
 begin
@@ -2471,16 +2500,70 @@ begin
     ProcessHints(False,Result);
 end;
 
-function TPasRecordType.GetDeclaration (full : boolean) : string;
+procedure TPasRecordType.GetMembers(S: TStrings);
 
 Var
-  S,T : TStringList;
+  T : TStringList;
   temp : string;
   I,J : integer;
+  E : TPasElement;
+  CV : TPasMemberVisibility ;
 
 begin
-  S:=TStringList.Create;
   T:=TStringList.Create;
+  try
+
+  CV:=visDefault;
+  For I:=0 to Members.Count-1 do
+    begin
+    E:=TPasElement(Members[i]);
+    if E.Visibility<>CV then
+      begin
+      CV:=E.Visibility;
+      if CV<>visDefault then
+        S.Add(VisibilityNames[CV]);
+      end;
+    Temp:=E.GetDeclaration(True);
+    If E is TPasProperty then
+      Temp:='property '+Temp;
+    If Pos(LineEnding,Temp)>0 then
+      begin
+      T.Text:=Temp;
+      For J:=0 to T.Count-1 do
+        if J=T.Count-1 then
+          S.Add('  '+T[J]+';')
+        else
+          S.Add('  '+T[J])
+      end
+    else
+      S.Add('  '+Temp+';');
+    end;
+  if Variants<>nil then
+    begin
+    temp:='case ';
+    if (VariantName<>'') then
+      temp:=Temp+variantName+' : ';
+    if (VariantType<>Nil) then
+      temp:=temp+VariantType.Name;
+    S.Add(temp+' of');
+    T.Clear;
+    For I:=0 to Variants.Count-1 do
+      T.Add(TPasVariant(Variants[i]).GetDeclaration(True));
+    S.AddStrings(T);
+    end;
+  finally
+    T.Free;
+  end;
+end;
+
+function TPasRecordType.GetDeclaration (full : boolean) : string;
+
+Var
+  S : TStringList;
+  temp : string;
+
+begin
+  S:=TStringList.Create;
   Try
     Temp:='record';
     If IsPacked then
@@ -2491,27 +2574,12 @@ begin
     If Full then
       Temp:=Name+' = '+Temp;
     S.Add(Temp);
-    For I:=0 to Members.Count-1 do
-      begin
-      Temp:=TPasVariable(Members[i]).GetDeclaration(True);
-      If Pos(LineEnding,Temp)>0 then
-        begin
-        T.Text:=Temp;
-        For J:=0 to T.Count-1 do
-          if J=T.Count-1 then
-            S.Add('  '+T[J]+';')
-          else
-            S.Add('  '+T[J])
-        end
-      else
-        S.Add('  '+Temp+';');
-      end;
+    GetMembers(S);
     S.Add('end');
     Result:=S.Text;
     ProcessHints(False, Result);
   finally
     S.free;
-    T.free;
   end;
 end;
 
@@ -2525,6 +2593,22 @@ begin
   Result:=(PackMode=pmBitPacked)
 end;
 
+function TPasRecordType.IsAdvancedRecord: Boolean;
+
+Var
+  I : Integer;
+
+begin
+  Result:=False;
+  I:=0;
+  While (Not Result) and (I<Members.Count) do
+    begin
+    Result:=TPasElement(Members[i]).InheritsFrom(TPasProcedureBase) or
+            TPasElement(Members[i]).InheritsFrom(TPasProperty);
+    Inc(I);
+    end;
+end;
+
 procedure TPasProcedureType.GetArguments(List : TStrings);
 
 Var

+ 2 - 2
packages/fcl-passrc/src/pparser.pp

@@ -2504,6 +2504,7 @@ begin
     SaveComments(D);
     for i := 0 to VarNames.Count - 1 do
       begin
+      // Writeln(VarNames[i], AVisibility);
       VarEl:=TPasVariable(CreateElement(TPasVariable,VarNames[i],Parent,AVisibility));
       VarEl.VarType := VarType;
       // Procedure declaration eats the hints.
@@ -3736,7 +3737,7 @@ Var
   Prop : TPasProperty;
 
 begin
-  v:=visPublic;
+  v:=visDefault;
   while CurToken<>AEndToken do
     begin
     SaveComments;
@@ -3763,7 +3764,6 @@ begin
         end;
       tkIdentifier :
         begin
-        v:=visDefault;
 //        If (po_delphi in Scanner.Options) then
           if CheckVisibility(CurtokenString,v) then
             begin

+ 5 - 4
packages/fcl-passrc/tests/testpassrc.lpi

@@ -30,7 +30,7 @@
     <RunParams>
       <local>
         <FormatVersion Value="1"/>
-        <CommandLineParams Value="--suite=TTestStatementParser.TestCallComment"/>
+        <CommandLineParams Value="--suite=TTestStatementParser.TestAsm"/>
       </local>
     </RunParams>
     <RequiredPackages Count="1">
@@ -74,11 +74,11 @@
       <Unit7>
         <Filename Value="tcvarparser.pas"/>
         <IsPartOfProject Value="True"/>
+        <UnitName Value="tcvarparser"/>
       </Unit7>
       <Unit8>
         <Filename Value="tcclasstype.pas"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="tcclasstype"/>
       </Unit8>
       <Unit9>
         <Filename Value="tcexprparser.pas"/>
@@ -88,17 +88,18 @@
       <Unit10>
         <Filename Value="tcprocfunc.pas"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="tcprocfunc"/>
       </Unit10>
       <Unit11>
         <Filename Value="tcpassrcutil.pas"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="tcpassrcutil"/>
       </Unit11>
     </Units>
   </ProjectOptions>
   <CompilerOptions>
     <Version Value="11"/>
+    <Target>
+      <Filename Value="testpassrc"/>
+    </Target>
     <SearchPaths>
       <IncludeFiles Value="$(ProjOutDir)"/>
       <OtherUnitFiles Value="../src"/>

+ 2 - 0
rtl/inc/system.fpd

@@ -76,6 +76,8 @@ Procedure Pack(Const A : UnpackedArrayType; StartIndex : TIndexType; Out Z : Pac
 Procedure UnPack(Const Z : PackedArrayType; Out A : UnpackedArrayType; StartIndex : TIndexType);
 Function Slice(Const A : ArrayType; ACount : Integer) : ArrayType2;
 Function TypeInfo(Const T : AnyType) : Pointer;
+Procedure Fail;
+Function TypeOf(T : TObjectType) : Pointer;
  
 {$IFNDEF GO32V2}
 Var

+ 82 - 81
utils/fpdoc/css.inc

@@ -1,9 +1,9 @@
 
 Const
-  DefaultCSS : Array[0..2242] of byte = (
+  DefaultCSS : Array[0..2254] of byte = (
       47, 42, 10, 32, 32, 36, 73,100, 58, 32,102,112,100,111, 99, 46, 99,
-     115,116, 44,118, 32, 49, 46, 49, 32, 50, 48, 48, 53, 47, 48, 49, 47,
-      48, 50, 32, 49, 54, 58, 50, 50, 58, 49, 54, 32,109,105, 99,104, 97,
+     115,115, 44,118, 32, 49, 46, 49, 32, 50, 48, 48, 51, 47, 48, 51, 47,
+      49, 55, 32, 50, 51, 58, 48, 51, 58, 50, 48, 32,109,105, 99,104, 97,
      101,108, 32, 69,120,112, 32, 36, 10, 10, 32, 32, 68,101,102, 97,117,
      108,116, 32,115,116,121,108,101, 32,115,104,101,101,116, 32,102,111,
      114, 32, 70, 80, 68,111, 99, 32,114,101,102,101,114,101,110, 99,101,
@@ -53,83 +53,84 @@ Const
       32,105,110, 32,115,111,117,114, 99,101, 32,102,114, 97,103,109,101,
      110,116,115, 32, 42, 47, 10,115,112, 97,110, 46,115,121,109, 32,123,
       10, 32, 32, 99,111,108,111,114, 58, 32,100, 97,114,107,114,101,100,
-      10,125, 10, 47, 42, 32, 78,111, 32,119,111,114,100,119,114, 97,112,
-      32,105,110, 32, 99,111,100,101, 32,102,114, 97,103,109,101,110,116,
-     115, 32, 42, 47, 10,115,112, 97,110, 46, 99,111,100,101, 32,123, 10,
-      32, 32, 32,119,104,105,116,101, 45,115,112, 97, 99,101, 58, 32,110,
-     111,119,114, 97,112, 10,125, 10, 10, 47, 42, 32,107,101,121,119,111,
-     114,100,115, 32,105,110, 32,115,111,117,114, 99,101, 32,102,114, 97,
-     103,109,101,110,116,115, 32, 42, 47, 10,115,112, 97,110, 46,107,119,
-      32,123, 10, 32, 32,102,111,110,116, 45,119,101,105,103,104,116, 58,
-      32, 98,111,108,100, 10,125, 10, 10, 47, 42, 32, 99,111,109,109,101,
-     110,116,115, 32,105,110, 32,115,111,117,114, 99,101, 32,102,114, 97,
-     103,109,101,110,116,115, 32, 42, 47, 10,115,112, 97,110, 46, 99,109,
-     116, 32,123, 10, 32, 32, 99,111,108,111,114, 58, 32,100, 97,114,107,
-      99,121, 97,110, 59, 10, 32, 32,102,111,110,116, 45,115,116,121,108,
-     101, 58, 32,105,116, 97,108,105, 99, 10,125, 10, 10, 47, 42, 32,100,
-     105,114,101, 99,116,105,118,101,115, 32,105,110, 32,115,111,117,114,
+      10,125, 10, 10, 47, 42, 32,107,101,121,119,111,114,100,115, 32,105,
+     110, 32,115,111,117,114, 99,101, 32,102,114, 97,103,109,101,110,116,
+     115, 32, 42, 47, 10,115,112, 97,110, 46,107,119, 32,123, 10, 32, 32,
+     102,111,110,116, 45,119,101,105,103,104,116, 58, 32, 98,111,108,100,
+      10,125, 10, 10, 47, 42, 32, 99,111,109,109,101,110,116,115, 32,105,
+     110, 32,115,111,117,114, 99,101, 32,102,114, 97,103,109,101,110,116,
+     115, 32, 42, 47, 10,115,112, 97,110, 46, 99,109,116, 32,123, 10, 32,
+      32, 99,111,108,111,114, 58, 32,100, 97,114,107, 99,121, 97,110, 59,
+      10, 32, 32,102,111,110,116, 45,115,116,121,108,101, 58, 32,105,116,
+      97,108,105, 99, 10,125, 10, 10, 47, 42, 32,100,105,114,101, 99,116,
+     105,118,101,115, 32,105,110, 32,115,111,117,114, 99,101, 32,102,114,
+      97,103,109,101,110,116,115, 32, 42, 47, 10,115,112, 97,110, 46,100,
+     105,114, 32,123, 10, 32, 32, 99,111,108,111,114, 58, 32,100, 97,114,
+     107,121,101,108,108,111,119, 59, 10, 32, 32,102,111,110,116, 45,115,
+     116,121,108,101, 58, 32,105,116, 97,108,105, 99, 10,125, 10, 10, 47,
+      42, 32,110,117,109, 98,101,114,115, 32,105,110, 32,115,111,117,114,
       99,101, 32,102,114, 97,103,109,101,110,116,115, 32, 42, 47, 10,115,
-     112, 97,110, 46,100,105,114, 32,123, 10, 32, 32, 99,111,108,111,114,
-      58, 32,100, 97,114,107,121,101,108,108,111,119, 59, 10, 32, 32,102,
-     111,110,116, 45,115,116,121,108,101, 58, 32,105,116, 97,108,105, 99,
-      10,125, 10, 10, 47, 42, 32,110,117,109, 98,101,114,115, 32,105,110,
-      32,115,111,117,114, 99,101, 32,102,114, 97,103,109,101,110,116,115,
-      32, 42, 47, 10,115,112, 97,110, 46,110,117,109, 32,123, 10, 32, 32,
-      99,111,108,111,114, 58, 32,100, 97,114,107,109, 97,103,101,110,116,
-      97, 10,125, 10, 10, 47, 42, 32, 99,104, 97,114, 97, 99,116,101,114,
-     115, 32, 40, 35, 46, 46, 46, 41, 32,105,110, 32,115,111,117,114, 99,
-     101, 32,102,114, 97,103,109,101,110,116,115, 32, 42, 47, 10,115,112,
-      97,110, 46, 99,104,114, 32,123, 10, 32, 32, 99,111,108,111,114, 58,
-      32,100, 97,114,107, 99,121, 97,110, 10,125, 10, 10, 47, 42, 32,115,
-     116,114,105,110,103,115, 32,105,110, 32,115,111,117,114, 99,101, 32,
+     112, 97,110, 46,110,117,109, 32,123, 10, 32, 32, 99,111,108,111,114,
+      58, 32,100, 97,114,107,109, 97,103,101,110,116, 97, 10,125, 10, 10,
+      47, 42, 32, 99,104, 97,114, 97, 99,116,101,114,115, 32, 40, 35, 46,
+      46, 46, 41, 32,105,110, 32,115,111,117,114, 99,101, 32,102,114, 97,
+     103,109,101,110,116,115, 32, 42, 47, 10,115,112, 97,110, 46, 99,104,
+     114, 32,123, 10, 32, 32, 99,111,108,111,114, 58, 32,100, 97,114,107,
+      99,121, 97,110, 10,125, 10, 10, 47, 42, 32,115,116,114,105,110,103,
+     115, 32,105,110, 32,115,111,117,114, 99,101, 32,102,114, 97,103,109,
+     101,110,116,115, 32, 42, 47, 10,115,112, 97,110, 46,115,116,114, 32,
+     123, 10, 32, 32, 99,111,108,111,114, 58, 32, 98,108,117,101, 10,125,
+      10, 10, 47, 42, 32, 97,115,115,101,109, 98,108,101,114, 32,112, 97,
+     115,115, 97,103,101,115, 32,105,110, 32,115,111,117,114, 99,101, 32,
      102,114, 97,103,109,101,110,116,115, 32, 42, 47, 10,115,112, 97,110,
-      46,115,116,114, 32,123, 10, 32, 32, 99,111,108,111,114, 58, 32, 98,
-     108,117,101, 10,125, 10, 10, 47, 42, 32, 97,115,115,101,109, 98,108,
-     101,114, 32,112, 97,115,115, 97,103,101,115, 32,105,110, 32,115,111,
-     117,114, 99,101, 32,102,114, 97,103,109,101,110,116,115, 32, 42, 47,
-      10,115,112, 97,110, 46, 97,115,109, 32,123, 10, 32, 32, 99,111,108,
-     111,114, 58, 32,103,114,101,101,110, 10,125, 10, 10, 10,116,100, 46,
-     112,114,101, 32,123, 10, 32, 32,119,104,105,116,101, 45,115,112, 97,
-      99,101, 58, 32,112,114,101, 10,125, 10, 10,112, 46, 99,109,116, 32,
-     123, 10, 32, 32, 99,111,108,111,114, 58, 32,103,114, 97,121, 10,125,
-      10, 10,115,112, 97,110, 46,119, 97,114,110,105,110,103, 32,123, 10,
-      32, 32, 99,111,108,111,114, 58, 32,114,101,100, 59, 10, 32, 32,102,
-     111,110,116, 45,119,101,105,103,104,116, 58, 32, 98,111,108,100, 10,
-     125, 10, 10, 47, 42, 32, 33, 33, 33, 58, 32, 72,111,119, 32,115,104,
-     111,117,108,100, 32,119,101, 32,100,101,102,105,110,101, 32,116,104,
-     105,115, 46, 46, 46, 63, 32, 42, 47, 10,115,112, 97,110, 46,102,105,
-     108,101, 32,123, 10, 32, 32, 99,111,108,111,114, 58, 32,100, 97,114,
-     107,103,114,101,101,110, 10,125, 10, 10,116, 97, 98,108,101, 46,114,
-     101,109, 97,114,107, 32,123, 10, 32, 32, 98, 97, 99,107,103,114,111,
-     117,110,100, 45, 99,111,108,111,114, 58, 32, 35,102,102,102,102, 99,
-      48, 59, 10,125, 10, 10,116, 97, 98,108,101, 46, 98, 97,114, 32,123,
-      10, 32, 32, 98, 97, 99,107,103,114,111,117,110,100, 45, 99,111,108,
-     111,114, 58, 32, 35, 97, 48, 99, 48,102,102, 59, 10,125, 10, 10,116,
-     100, 32,112, 32,123, 10, 32,109, 97,114,103,105,110, 58, 32, 48, 59,
-      10,125, 10, 10,115,112, 97,110, 46, 98, 97,114,116,105,116,108,101,
-      32,123, 10, 32, 32,102,111,110,116, 45,119,101,105,103,104,116, 58,
-      32, 98,111,108,100, 59, 10, 32, 32,102,111,110,116, 45,115,116,121,
-     108,101, 58, 32,105,116, 97,108,105, 99, 59, 10, 32, 32, 99,111,108,
-     111,114, 58, 32,100, 97,114,107, 98,108,117,101, 10,125, 10, 10,115,
-     112, 97,110, 46,116,111,103,103,108,101,116,114,101,101, 99,108,111,
-     115,101, 32,123, 10, 32, 32, 32, 32, 98, 97, 99,107,103,114,111,117,
-     110,100, 58, 32,117,114,108, 40,109,105,110,117,115, 46,112,110,103,
-      41, 32, 99,101,110,116,101,114, 32,108,101,102,116, 32,110,111, 45,
-     114,101,112,101, 97,116, 59, 10, 32, 32, 32, 32,112, 97,100,100,105,
-     110,103, 45,108,101,102,116, 58, 32, 50, 48,112,120, 59, 32, 10,125,
-      10, 10,115,112, 97,110, 46,116,111,103,103,108,101,116,114,101,101,
-     111,112,101,110, 32,123, 10, 32, 32, 32, 32, 98, 97, 99,107,103,114,
-     111,117,110,100, 58, 32,117,114,108, 40,112,108,117,115, 46,112,110,
-     103, 41, 32, 99,101,110,116,101,114, 32,108,101,102,116, 32,110,111,
-      45,114,101,112,101, 97,116, 59, 10, 32, 32, 32, 32,112, 97,100,100,
-     105,110,103, 45,108,101,102,116, 58, 32, 50, 48,112,120, 59, 32, 10,
-     125, 10, 10,117,108, 46, 99,108, 97,115,115,116,114,101,101,108,105,
-     115,116, 32,108,105, 32,123, 32,112, 97,100,100,105,110,103, 45,108,
-     101,102,116, 58, 32, 48,112,120, 59, 32,125, 10, 10,117,108, 46, 99,
-     108, 97,115,115,116,114,101,101,108,105,115,116, 32,123, 32,108,105,
-     115,116, 45,115,116,121,108,101, 45,116,121,112,101, 58,110,111,110,
-     101, 59, 32,125, 10, 10,108,105, 46, 99,108, 97,115,115,116,114,101,
-     101, 32,117,108, 32,123, 32,100,105,115,112,108, 97,121, 58, 32, 98,
-     108,111, 99,107, 59, 32,125, 10, 10,108,105, 46, 99,108, 97,115,115,
-     116,114,101,101, 99,108,111,115,101,100, 32,117,108, 32,123, 32,100,
-     105,115,112,108, 97,121, 58, 32,110,111,110,101, 59, 32,125, 10);
+      46, 97,115,109, 32,123, 10, 32, 32, 99,111,108,111,114, 58, 32,103,
+     114,101,101,110, 10,125, 10, 10, 10,116,100, 46,112,114,101, 32,123,
+      10, 32, 32,119,104,105,116,101, 45,115,112, 97, 99,101, 58, 32,112,
+     114,101, 10,125, 10, 10,112, 46, 99,109,116, 32,123, 10, 32, 32, 99,
+     111,108,111,114, 58, 32,103,114, 97,121, 10,125, 10, 10,115,112, 97,
+     110, 46,119, 97,114,110,105,110,103, 32,123, 10, 32, 32, 99,111,108,
+     111,114, 58, 32,114,101,100, 59, 10, 32, 32,102,111,110,116, 45,119,
+     101,105,103,104,116, 58, 32, 98,111,108,100, 10,125, 10, 10, 47, 42,
+      32, 33, 33, 33, 58, 32, 72,111,119, 32,115,104,111,117,108,100, 32,
+     119,101, 32,100,101,102,105,110,101, 32,116,104,105,115, 46, 46, 46,
+      63, 32, 42, 47, 10,115,112, 97,110, 46,102,105,108,101, 32,123, 10,
+      32, 32, 99,111,108,111,114, 58, 32,100, 97,114,107,103,114,101,101,
+     110, 10,125, 10, 10,116, 97, 98,108,101, 46,114,101,109, 97,114,107,
+      32,123, 10, 32, 32, 98, 97, 99,107,103,114,111,117,110,100, 45, 99,
+     111,108,111,114, 58, 32, 35,102,102,102,102, 99, 48, 59, 10,125, 10,
+      10,116, 97, 98,108,101, 46, 98, 97,114, 32,123, 10, 32, 32, 98, 97,
+      99,107,103,114,111,117,110,100, 45, 99,111,108,111,114, 58, 32, 35,
+      97, 48, 99, 48,102,102, 59, 10,125, 10, 10,115,112, 97,110, 46, 98,
+      97,114,116,105,116,108,101, 32,123, 10, 32, 32,102,111,110,116, 45,
+     119,101,105,103,104,116, 58, 32, 98,111,108,100, 59, 10, 32, 32,102,
+     111,110,116, 45,115,116,121,108,101, 58, 32,105,116, 97,108,105, 99,
+      59, 10, 32, 32, 99,111,108,111,114, 58, 32,100, 97,114,107, 98,108,
+     117,101, 10,125, 10, 10,115,112, 97,110, 46,102,111,111,116,101,114,
+      32,123, 10, 32, 32,102,111,110,116, 45,115,116,121,108,101, 58, 32,
+     105,116, 97,108,105, 99, 59, 10, 32, 32, 99,111,108,111,114, 58, 32,
+     100, 97,114,107, 98,108,117,101, 10,125, 10, 10, 47, 42, 32,100,101,
+     102,105,110,105,116,105,111,110, 32,108,105,115,116, 32, 42, 47, 10,
+     100,108, 32,123, 10, 32, 98,111,114,100,101,114, 58, 32, 51,112,120,
+      32,100,111,117, 98,108,101, 32, 35, 99, 99, 99, 59, 10, 32,112, 97,
+     100,100,105,110,103, 58, 32, 48, 46, 53,101,109, 59, 10,125, 10, 10,
+      47, 42, 32,100,101,102,105,110,105,116,105,111,110, 32,108,105,115,
+     116, 58, 32,116,101,114,109, 32, 42, 47, 10,100,116, 32,123, 10, 32,
+     102,108,111, 97,116, 58, 32,108,101,102,116, 59, 10, 32, 99,108,101,
+      97,114, 58, 32,108,101,102,116, 59, 10, 32,119,105,100,116,104, 58,
+      32, 97,117,116,111, 59, 32, 47, 42, 32,110,111,114,109, 97,108,108,
+     121, 32, 98,114,111,119,115,101,114,115, 32,100,101,102, 97,117,108,
+     116, 32,119,105,100,116,104, 32,111,102, 32,108, 97,114,103,101,115,
+     116, 32,105,116,101,109, 32, 42, 47, 10, 32,112, 97,100,100,105,110,
+     103, 45,114,105,103,104,116, 58, 32, 50, 48,112,120, 59, 10, 32,102,
+     111,110,116, 45,119,101,105,103,104,116, 58, 32, 98,111,108,100, 59,
+      10, 32, 99,111,108,111,114, 58, 32,100, 97,114,107,103,114,101,101,
+     110, 59, 10,125, 10, 10, 47, 42, 32,100,101,102,105,110,105,116,105,
+     111,110, 32,108,105,115,116, 58, 32,100,101,115, 99,114,105,112,116,
+     105,111,110, 32, 42, 47, 10,100,100, 32,123, 10, 32,109, 97,114,103,
+     105,110, 58, 32, 48, 32, 48, 32, 48, 32, 49, 49, 48,112,120, 59, 10,
+      32,112, 97,100,100,105,110,103, 58, 32, 48, 32, 48, 32, 48, 46, 53,
+     101,109, 32, 48, 59, 10,125, 10, 10, 47, 42, 32,102,111,114, 32, 98,
+     114,111,119,115,101,114,115, 32,105,110, 32,115,116, 97,110,100, 97,
+     114,100,115, 32, 99,111,109,112,108,105, 97,110, 99,101, 32,109,111,
+     100,101, 32, 42, 47, 10,116,100, 32,112, 32,123, 10, 32, 32,109, 97,
+     114,103,105,110, 58, 32, 48, 59, 10,125, 10);

+ 1 - 0
utils/fpdoc/dglobals.pp

@@ -70,6 +70,7 @@ resourcestring
   SDocMethodOverview         = 'Method overview';
   SDocPropertyOverview       = 'Property overview';
   SDocInterfacesOverview     = 'Interfaces overview';
+  SDocInterface              = 'Interfaces';
   SDocPage                   = 'Page';
   SDocMethod                 = 'Method';
   SDocProperty               = 'Property';

+ 272 - 220
utils/fpdoc/dw_html.pp

@@ -89,8 +89,6 @@ type
     FOnTest: TNotifyEvent;
     FPackage: TPasPackage;
     FCharSet : String;
-    procedure AddElementsFromList(L: TStrings; List: TFPList; UsePathName : Boolean = False);
-    procedure AppendTypeDecl(AType: TPasType; TableEl, CodeEl: TDomElement);
     procedure CreateMinusImage;
     procedure CreatePlusImage;
     function GetPageCount: Integer;
@@ -218,12 +216,10 @@ type
     function AppendProcType(CodeEl, TableEl: TDOMElement;
       Element: TPasProcedureType; Indent: Integer): TDOMElement;
     procedure AppendProcExt(CodeEl: TDOMElement; Element: TPasProcedure);
-    procedure AppendProcDecl(CodeEl, TableEl: TDOMElement;
-      Element: TPasProcedureBase);
-    procedure AppendProcArgsSection(Parent: TDOMNode;
-      Element: TPasProcedureType; SkipResult : Boolean = False);
-    function AppendRecordType(CodeEl, TableEl: TDOMElement;
-      Element: TPasRecordType; NestingLevel: Integer): TDOMElement;
+    procedure AppendProcDecl(CodeEl, TableEl: TDOMElement; Element: TPasProcedureBase);
+    procedure AppendProcArgsSection(Parent: TDOMNode; Element: TPasProcedureType; SkipResult : Boolean = False);
+    function AppendRecordType(CodeEl, TableEl: TDOMElement; Element: TPasRecordType; NestingLevel: Integer): TDOMElement;
+    procedure CreateMemberDeclarations(AParent: TPasElement; Members: TFPList; TableEl : TDOmelement);
 
     procedure AppendTitle(const AText: DOMString; Hints : TPasMemberHints = []);
     procedure AppendMenuBar(ASubpageIndex: Integer);
@@ -250,15 +246,15 @@ type
     procedure CreateVarPageBody(AVar: TPasVariable);
     procedure CreateProcPageBody(AProc: TPasProcedureBase);
     Procedure CreateTopicLinks(Node : TDocNode; PasElement : TPasElement);
+    procedure AddElementsFromList(L: TStrings; List: TFPList; UsePathName : Boolean = False);
+    procedure AppendTypeDecl(AType: TPasType; TableEl, CodeEl: TDomElement);
   public
     constructor Create(APackage: TPasPackage; AEngine: TFPDocEngine); override;
     destructor Destroy; override;
 
     // Single-page generation
-    function CreateHTMLPage(AElement: TPasElement;
-      ASubpageIndex: Integer): TXMLDocument;
-    function CreateXHTMLPage(AElement: TPasElement;
-      ASubpageIndex: Integer): TXMLDocument;
+    function CreateHTMLPage(AElement: TPasElement; ASubpageIndex: Integer): TXMLDocument;
+    function CreateXHTMLPage(AElement: TPasElement; ASubpageIndex: Integer): TXMLDocument;
 
     // For producing complete package documentation
     procedure WriteHTMLPages; virtual;
@@ -523,18 +519,6 @@ constructor THTMLWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
       end;
   end;
 
-  procedure AddPages(AElement: TPasElement; ASubpageIndex: Integer;
-    AList: TFPList);
-  var
-    i: Integer;
-  begin
-    if AList.Count > 0 then
-    begin
-      AddPage(AElement, ASubpageIndex);
-      for i := 0 to AList.Count - 1 do
-        AddPage(TPasElement(AList[i]), 0);
-    end;
-  end;
 
   Function HaveClasses(AModule: TPasModule) : Boolean;
 
@@ -545,7 +529,40 @@ constructor THTMLWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
            and (AModule.InterfaceSection.Classes.Count>0);
   end;
 
-  procedure ScanModule(AModule: TPasModule; LinkList : TObjectList);
+  procedure AddPages(AElement: TPasElement; ASubpageIndex: Integer;
+    AList: TFPList);
+  var
+    i,j: Integer;
+    R : TPasRecordtype;
+    FPEl : TPasElement;
+    DocNode: TDocNode;
+  begin
+    if AList.Count > 0 then
+      begin
+      AddPage(AElement, ASubpageIndex);
+      for i := 0 to AList.Count - 1 do
+        begin
+        AddPage(TPasElement(AList[i]), 0);
+        if (TObject(AList[i]) is TPasRecordType) then
+          begin
+          R:=TObject(AList[I]) as TPasRecordType;
+          For J:=0 to R.Members.Count-1 do
+            begin
+            FPEl:=TPasElement(R.Members[J]);
+            if ((FPEL is TPasProperty) or (FPEL is TPasProcedureBase))
+               and Engine.ShowElement(FPEl) then
+                 begin
+                 DocNode := Engine.FindDocNode(FPEl);
+                 if Assigned(DocNode) then
+                   AddPage(FPEl, 0);
+                 end;
+            end;
+          end;
+        end;
+      end;
+  end;
+
+  Procedure AddClassMemberPages(AModule: TPasModule; LinkList : TObjectList);
   var
     i, j, k: Integer;
     s: String;
@@ -554,6 +571,71 @@ constructor THTMLWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
     DocNode: TDocNode;
     ALink : DOMString;
     DidAutolink: Boolean;
+
+  begin
+  for i := 0 to AModule.InterfaceSection.Classes.Count - 1 do
+    begin
+    ClassEl := TPasClassType(AModule.InterfaceSection.Classes[i]);
+    AddPage(ClassEl, 0);
+    // !!!: Only add when there are items
+    AddPage(ClassEl, PropertiesByInheritanceSubindex);
+    AddPage(ClassEl, PropertiesByNameSubindex);
+    AddPage(ClassEl, MethodsByInheritanceSubindex);
+    AddPage(ClassEl, MethodsByNameSubindex);
+    AddPage(ClassEl, EventsByInheritanceSubindex);
+    AddPage(ClassEl, EventsByNameSubindex);
+    for j := 0 to ClassEl.Members.Count - 1 do
+      begin
+      FPEl := TPasElement(ClassEl.Members[j]);
+      if Not Engine.ShowElement(FPEl) then
+        continue;
+      DocNode := Engine.FindDocNode(FPEl);
+      if Assigned(DocNode) then
+        begin
+        if Assigned(DocNode.Node) then
+          ALink:=DocNode.Node['link']
+        else
+          ALink:='';
+        If (ALink<>'') then
+          LinkList.Add(TLinkData.Create(FPEl.PathName,ALink,AModule.name))
+        else
+          AddPage(FPEl, 0);
+        end
+      else
+        begin
+        DidAutolink := False;
+        if Assigned(ClassEl.AncestorType) and
+          (ClassEl.AncestorType.ClassType.inheritsfrom(TPasClassType)) then
+          begin
+          for k := 0 to TPasClassType(ClassEl.AncestorType).Members.Count - 1 do
+            begin
+            AncestorMemberEl :=
+              TPasElement(TPasClassType(ClassEl.AncestorType).Members[k]);
+            if AncestorMemberEl.Name = FPEl.Name then
+              begin
+              DocNode := Engine.FindDocNode(AncestorMemberEl);
+              if Assigned(DocNode) then
+                begin
+                DidAutolink := True;
+                Engine.AddLink(FPEl.PathName,
+                  Engine.FindAbsoluteLink(AncestorMemberEl.PathName));
+                break;
+                end;
+              end;
+            end;
+          end;
+        if not DidAutolink then
+          AddPage(FPEl, 0);
+        end;
+      end;
+    end;
+    end;
+
+  procedure ScanModule(AModule: TPasModule; LinkList : TObjectList);
+  var
+    i: Integer;
+    s: String;
+
   begin
     if not assigned(Amodule.Interfacesection) then
       exit; 
@@ -575,65 +657,9 @@ constructor THTMLWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
       if InterfaceSection.Classes.Count > 0 then
         begin
         AddPage(AModule, ClassesSubindex);
-        for i := 0 to InterfaceSection.Classes.Count - 1 do
-          begin
-          ClassEl := TPasClassType(InterfaceSection.Classes[i]);
-          AddPage(ClassEl, 0);
-          // !!!: Only add when there are items
-          AddPage(ClassEl, PropertiesByInheritanceSubindex);
-          AddPage(ClassEl, PropertiesByNameSubindex);
-          AddPage(ClassEl, MethodsByInheritanceSubindex);
-          AddPage(ClassEl, MethodsByNameSubindex);
-          AddPage(ClassEl, EventsByInheritanceSubindex);
-          AddPage(ClassEl, EventsByNameSubindex);
-
-          for j := 0 to ClassEl.Members.Count - 1 do
-            begin
-            FPEl := TPasElement(ClassEl.Members[j]);
-            if Not Engine.ShowElement(FPEl) then
-              continue;
-
-            DocNode := Engine.FindDocNode(FPEl);
-            if Assigned(DocNode) then
-              begin
-              if Assigned(DocNode.Node) then
-                ALink:=DocNode.Node['link']
-              else
-                ALink:='';
-              If (ALink<>'') then
-                LinkList.Add(TLinkData.Create(FPEl.PathName,ALink,AModule.name))
-              else
-                AddPage(FPEl, 0);
-              end
-            else
-              begin
-              DidAutolink := False;
-              if Assigned(ClassEl.AncestorType) and
-                (ClassEl.AncestorType.ClassType.inheritsfrom(TPasClassType)) then
-                begin
-                for k := 0 to TPasClassType(ClassEl.AncestorType).Members.Count - 1 do
-                  begin
-                  AncestorMemberEl :=
-                    TPasElement(TPasClassType(ClassEl.AncestorType).Members[k]);
-                  if AncestorMemberEl.Name = FPEl.Name then
-                    begin
-                    DocNode := Engine.FindDocNode(AncestorMemberEl);
-                    if Assigned(DocNode) then
-                      begin
-                      DidAutolink := True;
-                      Engine.AddLink(FPEl.PathName,
-                        Engine.FindAbsoluteLink(AncestorMemberEl.PathName));
-                      break;
-                      end;
-                    end;
-                  end;
-                end;
-              if not DidAutolink then
-                AddPage(FPEl, 0);
-              end;
-            end;
-          end;
+        AddClassMemberPages(AModule,LinkList);
         end;
+
       AddPages(AModule, ProcsSubindex, InterfaceSection.Functions);
       AddPages(AModule, VarsSubindex, InterfaceSection.Variables);
       end;
@@ -1822,7 +1848,7 @@ procedure THTMLWriter.AppendProcDecl(CodeEl, TableEl: TDOMElement;
     AppendProcArgsSection(TableEl.ParentNode, AProc.ProcType, SkipResult);
 
     AppendKw(CodeEl, AProc.TypeName);
-    if Element.Parent.ClassType = TPasClassType then
+    if (Element.Parent.ClassType = TPasClassType) or (Element.Parent.ClassType = TPasRecordType) then
     begin
       AppendText(CodeEl, ' ');
       AppendHyperlink(CodeEl, Element.Parent);
@@ -1908,6 +1934,8 @@ var
   Variable: TPasVariable;
   TREl, TDEl: TDOMElement;
   CurVariant: TPasVariant;
+  isExtended : Boolean;
+
 begin
   if not (Element.Parent is TPasVariant) then
     if Element.IsPacked then
@@ -1918,18 +1946,28 @@ begin
     else
       AppendKw(CodeEl, 'record');
 
-  for i := 0 to Element.Members.Count - 1 do
-  begin
-    Variable := TPasVariable(Element.Members[i]);
-    TREl := CreateTR(TableEl);
-    CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
-    AppendShortDescrCell(TREl, Variable);
-    AppendNbSp(CodeEl, NestingLevel * 2 + 2);
-    AppendText(CodeEl, Variable.Name);
-    AppendSym(CodeEl, ': ');
-    CodeEl := AppendType(CodeEl, TableEl, Variable.VarType, False, NestingLevel + 1);
-    AppendSym(CodeEl, ';');
-  end;
+  isExtended:=False;
+  I:=0;
+  while (not isExtended) and (I<Element.Members.Count) do
+    begin
+    isExtended:=Not (TObject(Element.Members[i]) is TPasVariable);
+    Inc(i);
+    end;
+  if isExtended then
+    CreateMemberDeclarations(Element,Element.Members,TableEl)
+  else
+    for i := 0 to Element.Members.Count - 1 do
+      begin
+      Variable := TPasVariable(Element.Members[i]);
+      TREl := CreateTR(TableEl);
+      CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
+      AppendShortDescrCell(TREl, Variable);
+      AppendNbSp(CodeEl, NestingLevel * 2 + 2);
+      AppendText(CodeEl, Variable.Name);
+      AppendSym(CodeEl, ': ');
+      CodeEl := AppendType(CodeEl, TableEl, Variable.VarType, False, NestingLevel + 1);
+      AppendSym(CodeEl, ';');
+    end;
 
   if Assigned(Element.VariantType) then
   begin
@@ -3106,6 +3144,143 @@ begin
     (Copy(AMember.Name, 1, 2) = 'On');
 end;
 
+procedure THTMLWriter.CreateMemberDeclarations(AParent : TPasElement; Members : TFPList; TableEl : TDOmelement);
+
+var
+  TREl, TDEl, CodeEl: TDOMElement;
+  DocNode: TDocNode;
+  Member: TPasElement;
+  MVisibility,
+  CurVisibility: TPasMemberVisibility;
+  i: Integer;
+  s: String;
+  t : TPasType;
+  ah,ol,wt,ct,wc,cc  : boolean;
+  isRecord : Boolean;
+
+begin
+  isRecord:=AParent is TPasRecordType;
+  if Members.Count > 0 then
+    begin
+    wt:=False;
+    wc:=False;
+    CurVisibility := visDefault;
+    for i := 0 to Members.Count - 1 do
+      begin
+      Member := TPasElement(Members[i]);
+      MVisibility:=Member.Visibility;
+      ol:=(Member is TPasOverloadedProc);
+      ah:=ol or ((Member is TPasProcedure) and (TPasProcedure(Member).ProcType.Args.Count > 0));
+      if ol then
+        Member:=TPasElement((Member as TPasOverloadedProc).Overloads[0]);
+      if Not Engine.ShowElement(Member) then
+        continue;
+      if (CurVisibility <> MVisibility) then
+        begin
+        CurVisibility := MVisibility;
+        s:=VisibilityNames[MVisibility];
+        AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), s);
+        end;
+      ct:=(Member is TPasType);
+      if ct and (not wt) then
+        begin
+        AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), 'Type');
+        end;
+      wt:=ct;
+      cc:=(Member is TPasConst);
+      if cc and (not wc) then
+        begin
+        AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), 'Const');
+        end;
+      wc:=cc;
+      TREl := CreateTR(TableEl);
+      CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
+      AppendNbSp(CodeEl, 2);
+      AppendShortDescrCell(TREl, Member);
+
+      if (Member is TPasProcedureBase) then
+        begin
+        AppendKw(CodeEl, TPasProcedureBase(Member).TypeName + ' ');
+        AppendHyperlink(CodeEl, Member);
+        if ah then
+          AppendSym(CodeEl, '();')
+        else
+          AppendSym(CodeEl, ';');
+        if Not OL then
+          AppendProcExt(CodeEl, TPasProcedure(Member));
+        end
+      else if (Member is TPasConst) then
+        begin
+        AppendHyperlink(CodeEl, Member);
+        If Assigned(TPasConst(Member).VarType) then
+          begin
+          AppendSym(CodeEl, ' = ');
+          AppendTypeDecl(TPasType(Member),TableEl,CodeEl);
+          end;
+        AppendSym(CodeEl, ' = ');
+        AppendText(CodeEl,TPasConst(Member).Expr.GetDeclaration(True));
+        end
+      else if (Member is TPasType) then
+        begin
+        AppendHyperlink(CodeEl, Member);
+        AppendSym(CodeEl, ' = ');
+        AppendTypeDecl(TPasType(Member),TableEl,CodeEl);
+        end
+      else if (Member is TPasProperty) then
+        begin
+        AppendKw(CodeEl, 'property ');
+        AppendHyperlink(CodeEl, Member);
+        t:=TPasProperty(Member).ResolvedType;
+        if Assigned(T) then
+        begin
+          AppendSym(CodeEl, ': ');
+          AppendHyperlink(CodeEl, T);
+        end;
+        AppendSym(CodeEl, ';');
+        if TPasProperty(Member).IsDefault then
+        begin
+          AppendKw(CodeEl, ' default');
+          AppendSym(CodeEl, ';');
+        end;
+        if (TPasProperty(Member).ImplementsName<>'') then
+        begin
+          AppendKw(CodeEl, ' implements');
+          AppendText(CodeEl, ' '+TPasProperty(Member).ImplementsName);
+          AppendSym(CodeEl, ';');
+        end;
+        SetLength(s, 0);
+        if Length(TPasProperty(Member).ReadAccessorName) > 0 then
+          s := s + 'r';
+        if Length(TPasProperty(Member).WriteAccessorName) > 0 then
+          s := s + 'w';
+        if Length(TPasProperty(Member).StoredAccessorName) > 0 then
+          s := s + 's';
+        if Length(s) > 0 then
+          AppendText(CodeEl, '  [' + s + ']');
+        end
+      else if (Member is TPasVariable) then
+        begin
+        if not isRecord then
+          AppendHyperlink(CodeEl, Member)
+        else
+          AppendText(CodeEl, Member.Name);
+        AppendSym(CodeEl, ': ');
+        AppendHyperlink(CodeEl, TPasVariable(Member).VarType);
+        AppendSym(CodeEl, ';');
+        end
+      else
+        AppendText(CreateWarning(CodeEl), '<' + Member.ClassName + '>');
+      if (Member.Hints<>[]) then
+        begin
+        AppendKW(CodeEl,' '+Engine.HintsToStr(Member.Hints));
+        AppendText(CodeEl, ' ');
+        AppendSym(CodeEl, ';');
+        end;
+    end;
+    CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
+  end;
+end;
+
 procedure THTMLWriter.CreateClassPageBody(AClass: TPasClassType;
   ASubpageIndex: Integer);
 type
@@ -3159,14 +3334,7 @@ var
   procedure CreateMainPage;
   var
     TableEl, TREl, TDEl, CodeEl: TDOMElement;
-    DocNode: TDocNode;
-    Member: TPasElement;
-    MVisibility,
-    CurVisibility: TPasMemberVisibility;
     i: Integer;
-    s: String;
-    t : TPasType;
-    ah,ol,wt,ct,wc,cc  : boolean;
     ThisInterface,
     ThisClass: TPasClassType;
     HaveSeenTObject: Boolean;
@@ -3225,123 +3393,7 @@ var
         AppendSym(CodeEl, ')');
         end;
     end;
-    if AClass.Members.Count > 0 then
-      begin
-      wt:=False;
-      wc:=False;
-      CurVisibility := visDefault;
-      for i := 0 to AClass.Members.Count - 1 do
-        begin
-        Member := TPasElement(AClass.Members[i]);
-        MVisibility:=Member.Visibility;
-        ol:=(Member is TPasOverloadedProc);
-        ah:=ol or ((Member is TPasProcedure) and (TPasProcedure(Member).ProcType.Args.Count > 0));
-        if ol then
-          Member:=TPasElement((Member as TPasOverloadedProc).Overloads[0]);
-        if Not Engine.ShowElement(Member) then
-          continue;
-        if (CurVisibility <> MVisibility) then
-          begin
-          CurVisibility := MVisibility;
-          s:=VisibilityNames[MVisibility];
-          AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), s);
-          end;
-        ct:=(Member is TPasType);
-        if ct and (not wt) then
-          begin
-          AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), 'Type');
-          end;
-        wt:=ct;
-        cc:=(Member is TPasConst);
-        if cc and (not wc) then
-          begin
-          AppendKw(CreateCode(CreatePara(CreateTD(CreateTR(TableEl)))), 'Const');
-          end;
-        wc:=cc;
-        TREl := CreateTR(TableEl);
-        CodeEl := CreateCode(CreatePara(CreateTD_vtop(TREl)));
-        AppendNbSp(CodeEl, 2);
-        AppendShortDescrCell(TREl, Member);
-
-        if (Member is TPasProcedureBase) then
-          begin
-          AppendKw(CodeEl, TPasProcedureBase(Member).TypeName + ' ');
-          AppendHyperlink(CodeEl, Member);
-          if ah then
-            AppendSym(CodeEl, '();')
-          else
-            AppendSym(CodeEl, ';');
-          if Not OL then
-            AppendProcExt(CodeEl, TPasProcedure(Member));
-          end
-        else if (Member is TPasConst) then
-          begin
-          AppendHyperlink(CodeEl, Member);
-          If Assigned(TPasConst(Member).VarType) then
-            begin
-            AppendSym(CodeEl, ' = ');
-            AppendTypeDecl(TPasType(Member),TableEl,CodeEl);
-            end;
-          AppendSym(CodeEl, ' = ');
-          AppendText(CodeEl,TPasConst(Member).Expr.GetDeclaration(True));
-          end
-        else if (Member is TPasType) then
-          begin
-          AppendHyperlink(CodeEl, Member);
-          AppendSym(CodeEl, ' = ');
-          AppendTypeDecl(TPasType(Member),TableEl,CodeEl);
-          end
-        else if (Member is TPasProperty) then
-          begin
-          AppendKw(CodeEl, 'property ');
-          AppendHyperlink(CodeEl, Member);
-          t:=TPasProperty(Member).ResolvedType;
-          if Assigned(T) then
-          begin
-            AppendSym(CodeEl, ': ');
-            AppendHyperlink(CodeEl, T);
-          end;
-          AppendSym(CodeEl, ';');
-          if TPasProperty(Member).IsDefault then
-          begin
-            AppendKw(CodeEl, ' default');
-            AppendSym(CodeEl, ';');
-          end;
-          if (TPasProperty(Member).ImplementsName<>'') then
-          begin
-            AppendKw(CodeEl, ' implements');
-            AppendText(CodeEl, ' '+TPasProperty(Member).ImplementsName);
-            AppendSym(CodeEl, ';');
-          end;
-          SetLength(s, 0);
-          if Length(TPasProperty(Member).ReadAccessorName) > 0 then
-            s := s + 'r';
-          if Length(TPasProperty(Member).WriteAccessorName) > 0 then
-            s := s + 'w';
-          if Length(TPasProperty(Member).StoredAccessorName) > 0 then
-            s := s + 's';
-          if Length(s) > 0 then
-            AppendText(CodeEl, '  [' + s + ']');
-          end
-        else if (Member is TPasVariable) then
-          begin
-          AppendHyperlink(CodeEl, Member);
-          AppendSym(CodeEl, ': ');
-          AppendHyperlink(CodeEl, TPasVariable(Member).VarType);
-          AppendSym(CodeEl, ';');
-          end
-        else
-          AppendText(CreateWarning(CodeEl), '<' + Member.ClassName + '>');
-        if (Member.Hints<>[]) then
-          begin
-          AppendKW(CodeEl,' '+Engine.HintsToStr(Member.Hints));
-          AppendText(CodeEl, ' ');
-          AppendSym(CodeEl, ';');
-          end;
-      end;
-
-      CodeEl := CreateCode(CreatePara(CreateTD(CreateTR(TableEl))));
-    end;
+    CreateMemberDeclarations(AClass, AClass.Members,TableEl);
 
     AppendText(CodeEl, ' '); // !!!: Dirty trick, necessary for current XML writer
     if not AClass.IsShortDefinition then

+ 21 - 18
utils/fpdoc/dw_ipflin.pas

@@ -29,6 +29,9 @@ const
   TIPFExtension = '.ipf';
 
 type
+
+  { TIPFNewWriter }
+
   TIPFNewWriter = class(TLinearWriter)
   private
     InPackageOverview: Boolean;
@@ -85,7 +88,7 @@ type
     procedure StartSubSection(SubSectionName : String);override;
     procedure StartSubSubSection(SubSubSectionName : String);override;
     procedure StartChapter(ChapterName : String); override;
-    procedure StartOverview(WithAccess : Boolean); override;
+    procedure StartOverview(Const What : String;WithAccess : Boolean); override;
     procedure EndOverview; override;
     procedure WriteOverviewMember(const ALabel,AName,Access,ADescr : String); override;
     procedure WriteOverviewMember(const ALabel,AName,ADescr : String); override;
@@ -613,7 +616,7 @@ end;
 
 { TLinearWriter overrides}
 
-class function TIPFNewWriter.FileNameExtension: String;
+class function TIPFNewWriter.FileNameExtension: string;
 begin
   Result := TIPFExtension;
 end;
@@ -641,7 +644,7 @@ begin
   Result := StringReplace(Result, ' ', '_', [rfReplaceAll]);
 end;
 
-Function TIPFNewWriter.EscapeText(S : String) : String;
+function TIPFNewWriter.EscapeText(S: String): String;
 var
   i: Integer;
 begin
@@ -697,7 +700,7 @@ begin
     end;
 end;
 
-Function TIPFNewWriter.StripText(S : String) : String;
+function TIPFNewWriter.StripText(S: String): String;
 var
   I: Integer;
 begin
@@ -740,7 +743,7 @@ begin
   writeln('');
 end;
 
-procedure TIPFNewWriter.WriteLabel(const s: String);
+procedure TIPFNewWriter.WriteLabel(const S: String);
 var
   x: String;
 begin
@@ -762,7 +765,7 @@ begin
   end;
 end;
 
-procedure TIPFNewWriter.WriteIndex(const s : String);
+procedure TIPFNewWriter.WriteIndex(const S: String);
 begin
 //  writeln(':i1 id=' + s + '.');
 end;
@@ -878,19 +881,19 @@ begin
   //Writeln(':h5.' + SubSubSectionName);
 end;
 
-Procedure TIPFNewWriter.StartProcedure;
+procedure TIPFNewWriter.StartProcedure;
 begin
   //writeln('');
   //writeln(':ul.');
 end;
 
-Procedure TIPFNewWriter.EndProcedure;
+procedure TIPFNewWriter.EndProcedure;
 begin
   //writeln('');
   //writeln(':eul.');
 end;
 
-Procedure TIPFNewWriter.StartSynopsis;
+procedure TIPFNewWriter.StartSynopsis;
 begin
   writeln('');
   writeln(':p.');
@@ -900,7 +903,7 @@ begin
   writeln(':lm margin=3.');
 end;
 
-Procedure TIPFNewWriter.StartDeclaration;
+procedure TIPFNewWriter.StartDeclaration;
 begin
   writeln('');
   writeln(':p.');
@@ -909,7 +912,7 @@ begin
   writeln(':lm margin=3.');
 end;
 
-Procedure TIPFNewWriter.StartVisibility;
+procedure TIPFNewWriter.StartVisibility;
 begin
   writeln('');
   writeln(':p.');
@@ -919,7 +922,7 @@ begin
   writeln('.br');
 end;
 
-Procedure TIPFNewWriter.StartDescription;
+procedure TIPFNewWriter.StartDescription;
 begin
   writeln('');
   writeln(':p.');
@@ -929,7 +932,7 @@ begin
   writeln('.br');
 end;
 
-Procedure TIPFNewWriter.StartErrors;
+procedure TIPFNewWriter.StartErrors;
 begin
   writeln('');
   writeln(':p.');
@@ -949,7 +952,7 @@ begin
   writeln('.br');
 end;
 
-Procedure TIPFNewWriter.StartAccess;
+procedure TIPFNewWriter.StartAccess;
 begin
   writeln('');
   writeln(':p.');
@@ -959,14 +962,14 @@ begin
   writeln('.br');
 end;
 
-Procedure TIPFNewWriter.StartProperty;
+procedure TIPFNewWriter.StartProperty;
 begin
   //writeln('');
   //Writeln('.* here I am');
   //writeln(':ul.');
 end;
 
-Procedure TIPFNewWriter.EndProperty;
+procedure TIPFNewWriter.EndProperty;
 begin
   //writeln('');
   //writeln(':eul.');
@@ -1003,7 +1006,7 @@ begin
   end;
 end;
 
-procedure TIPFNewWriter.StartOverview(WithAccess : Boolean);
+procedure TIPFNewWriter.StartOverview(const What: String; WithAccess: Boolean);
 begin
 {
   If With access then it is a property overview.
@@ -1065,7 +1068,7 @@ begin
   WriteLn(Format(':pd. %s', [ADescr]));
 end;
 
-Procedure TIPFNewWriter.StartSeeAlso;
+procedure TIPFNewWriter.StartSeealso;
 begin
   writeln('');
   writeln(':p.');

+ 34 - 33
utils/fpdoc/dw_latex.pp

@@ -75,7 +75,7 @@ Type
     procedure StartSubSection(SubSectionName : String);override;
     procedure StartSubSubSection(SubSubSectionName : String);override;
     procedure StartChapter(ChapterName : String); override;
-    procedure StartOverview(WithAccess : Boolean); override;
+    procedure StartOverview(Const What : String; WithAccess : Boolean); override;
     procedure EndOverview; override;
     procedure WriteOverviewMember(const ALabel,AName,Access,ADescr : String); override;
     procedure WriteOverviewMember(const ALabel,AName,ADescr : String); override;
@@ -154,7 +154,7 @@ begin
 end;
 
 
-Function TLatexWriter.EscapeText(S : String) : String;
+function TLaTeXWriter.EscapeText(S: String): String;
 
 var
   i: Integer;
@@ -179,7 +179,7 @@ begin
     end;
 end;
 
-Function TLatexWriter.StripText(S : String) : String;
+function TLaTeXWriter.StripText(S: String): String;
 
 var
   I: Integer;
@@ -476,12 +476,12 @@ begin
   // Do nothing
 end;
 
-procedure TLaTeXWriter.WriteLabel(const s: String);
+procedure TLaTeXWriter.WriteLabel(const S: String);
 begin
   WriteLnF('\label{%s}', [LowerCase(StripText(s))]);
 end;
 
-procedure TLaTeXWriter.WriteIndex(const s : String);
+procedure TLaTeXWriter.WriteIndex(const S: String);
 begin
   Write('\index{');
   Write(EscapeText(s));
@@ -512,7 +512,7 @@ begin
     Writeln('\end{verbatim}')
 end;
 
-procedure TLatexWriter.WriteCommentLine;
+procedure TLaTeXWriter.WriteCommentLine;
 const
   CommentLine =
     '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%';
@@ -520,13 +520,13 @@ begin
   Writeln(CommentLine);
 end;
 
-procedure TLatexWriter.WriteComment(Comment : String);
+procedure TLaTeXWriter.WriteComment(Comment: String);
 begin
   Write('% ');
   Writeln(Comment);
 end;
 
-procedure TLatexWriter.StartChapter(ChapterName : String);
+procedure TLaTeXWriter.StartChapter(ChapterName: String);
 begin
   WriteCommentLine;
   WriteComment(ChapterName);
@@ -534,20 +534,20 @@ begin
   Writeln('\chapter{'+EscapeText(ChapterName)+'}');
 end;
 
-procedure TLatexWriter.StartSection(SectionName : String);
+procedure TLaTeXWriter.StartSection(SectionName: String);
 begin
   WriteCommentLine;
   WriteComment(SectionName);
   Writeln('\section{'+EscapeText(SectionName)+'}');
 end;
 
-procedure TLatexWriter.StartSubSection(SubSectionName : String);
+procedure TLaTeXWriter.StartSubSection(SubSectionName: String);
 begin
   WriteComment(SubSectionName);
   Writeln('\subsection{'+EscapeText(SubSectionName)+'}');
 end;
 
-procedure TLatexWriter.StartSubSubSection(SubSubSectionName : String);
+procedure TLaTeXWriter.StartSubSubSection(SubSubSectionName: String);
 begin
   Writeln('\subsubsection{'+EscapeText(SubSubSectionName)+'}');
 end;
@@ -564,38 +564,38 @@ begin
   end;
 end;
 
-Procedure TLatexWriter.StartProcedure;
+procedure TLaTeXWriter.StartProcedure;
 
 begin
   Writeln('\begin{FPCList}');
   InList:=True;
 end;
 
-Procedure TLatexWriter.StartSynopsis;
+procedure TLaTeXWriter.StartSynopsis;
 
 begin
   Writeln('\Synopsis');
 end;
 
-Procedure TLatexWriter.StartDeclaration;
+procedure TLaTeXWriter.StartDeclaration;
 
 begin
   Writeln('\Declaration ');
 end;
 
-Procedure TLatexWriter.StartVisibility;
+procedure TLaTeXWriter.StartVisibility;
 
 begin
   Writeln('\Visibility');
 end;
 
-Procedure TLatexWriter.StartDescription;
+procedure TLaTeXWriter.StartDescription;
 
 begin
   Writeln('\Description');
 end;
 
-Procedure TLatexWriter.StartErrors;
+procedure TLaTeXWriter.StartErrors;
 
 begin
   Writeln('\Errors');
@@ -606,68 +606,69 @@ begin
   Writeln('\VersionInfo');
 end;
 
-Procedure TLatexWriter.StartAccess;
+procedure TLaTeXWriter.StartAccess;
 
 begin
   Writeln('\Access')
 end;
 
-Procedure TLatexWriter.EndProcedure;
+procedure TLaTeXWriter.EndProcedure;
 
 begin
   InList:=False;
   Writeln('\end{FPCList}');
 end;
-Procedure TLatexWriter.StartProperty;
+procedure TLaTeXWriter.StartProperty;
 
 begin
   Writeln('\begin{FPCList}');
   InList:=True;
 end;
 
-Procedure TLatexWriter.EndProperty;
+procedure TLaTeXWriter.EndProperty;
 
 begin
   InList:=False;
   Writeln('\end{FPCList}');
 end;
 
-procedure TLateXWriter.WriteExampleFile(FN : String);
+procedure TLaTeXWriter.WriteExampleFile(FN: String);
 
 begin
   If (FN<>'') then
     WritelnF('\FPCexample{%s}', [ChangeFileExt(FN,'')]);
 end;
 
-procedure TLatexWriter.StartOverview(WithAccess : Boolean);
+procedure TLaTeXWriter.StartOverview(const What: String; WithAccess: Boolean);
 
 begin
   If WithAccess then
     begin
     WriteLn('\begin{tabularx}{\textwidth}{lllX}');
-    WriteLnF('%s & %s & %s & %s \\ \hline',[EscapeText(SDocPage), EscapeText(SDocProperty), EscapeText(SDocAccess), EscapeText(SDocDescription)])
+    WriteLnF('%s & %s & %s & %s \\ \hline',[EscapeText(SDocPage), EscapeText(What), EscapeText(SDocAccess), EscapeText(SDocDescription)])
     end
   else
     begin
     WriteLn('\begin{tabularx}{\textwidth}{llX}');
-    WriteLnF('%s & %s & %s  \\ \hline',[EscapeText(SDocPage), EscapeText(SDocProperty), EscapeText(SDocDescription)])
+    WriteLnF('%s & %s & %s  \\ \hline',[EscapeText(SDocPage), EscapeText(What), EscapeText(SDocDescription)])
     end;
 end;
 
-procedure TLatexWriter.EndOverview;
+procedure TLaTeXWriter.EndOverview;
 
 begin
   WriteLn('\hline');
   WriteLn('\end{tabularx}');
 end;
 
-procedure TLatexWriter.WriteOverviewMember(const ALabel,AName,Access,ADescr : String);
+procedure TLaTeXWriter.WriteOverviewMember(const ALabel, AName, Access,
+  ADescr: String);
 
 begin
   WriteLnF('\pageref{%s} & %s & %s & %s \\',[ALabel,EscapeText(AName),Access,ADescr]);
 end;
 
-procedure TLatexWriter.WriteOverviewMember(const ALabel,AName,ADescr : String);
+procedure TLaTeXWriter.WriteOverviewMember(const ALabel, AName, ADescr: String);
 
 begin
   WriteLnF('\pageref{%s} & %s  & %s \\',[ALabel,EscapeText(AName),ADescr]);
@@ -678,7 +679,7 @@ begin
   Result:=TexExtension;
 end;
 
-Procedure TLatexWriter.StartSeeAlso;
+procedure TLaTeXWriter.StartSeealso;
 
 begin
   If not InList then
@@ -695,7 +696,7 @@ begin
     Writeln('\end{FPCList}');
 end;
 
-procedure TLatexWriter.StartUnitOverview(AModuleName,AModuleLabel : String);
+procedure TLaTeXWriter.StartUnitOverview(AModuleName, AModuleLabel: String);
 
 begin
   WriteLnF('\begin{FPCltable}{lr}{%s}{%s:0units}',
@@ -703,20 +704,20 @@ begin
   WriteLn('Name & Page \\ \hline');
 end;
 
-procedure TLatexWriter.WriteUnitEntry(UnitRef : TPasType);
+procedure TLaTeXWriter.WriteUnitEntry(UnitRef: TPasType);
 
 begin
   WriteLnF('%s\index{unit!%s} & \pageref{%s} \\',
      [EscapeText(UnitRef.Name), EscapeText(UnitRef.Name), StripText(GetLabel(UnitRef))]);
 end;
 
-procedure TLatexWriter.EndUnitOverview;
+procedure TLaTeXWriter.EndUnitOverview;
 
 begin
   WriteLn('\end{FPCltable}');
 end;
 
-Function TLatexWriter.InterPretOption(Const Cmd,Arg : String) : boolean;
+function TLaTeXWriter.InterPretOption(const Cmd, Arg: String): boolean;
 
 begin
   Result:=True;

+ 21 - 21
utils/fpdoc/dw_linrtf.pp

@@ -110,7 +110,7 @@ type
     procedure StartSubSection(SubSectionName : String);override;
     procedure StartSubSubSection(SubSubSectionName : String);override;
     procedure StartChapter(ChapterName : String); override;
-    procedure StartOverview(WithAccess : Boolean); override;
+    procedure StartOverview(Const What : String; WithAccess : Boolean); override;
     procedure WriteOverviewMember(const ALabel,AName,Access,ADescr : String); override;
     procedure WriteOverviewMember(const ALabel,AName,ADescr : String); override;
     procedure EndOverview; override;
@@ -185,7 +185,7 @@ begin
 end;
 
 
-Function TRTFWriter.EscapeText(S : String) : String;
+function TRTFWriter.EscapeText(S: String): String;
 
 var
   i: Integer;
@@ -206,7 +206,7 @@ begin
     end;
 end;
 
-Function TRTFWriter.StripText(S : String) : String;
+function TRTFWriter.StripText(S: String): String;
 
 var
   I: Integer;
@@ -558,14 +558,14 @@ begin
   write('\cell');
 end;
 
-procedure TRTFWriter.WriteLabel(const s: String);
+procedure TRTFWriter.WriteLabel(const S: String);
 var b: string;
 begin
   b := LowerCase(StripText(s));
   WriteF('{\bkmkstart %s}{\bkmkend %s}', [b,b]);
 end;
 
-procedure TRTFWriter.WriteIndex(const s : String);
+procedure TRTFWriter.WriteIndex(const S: String);
 begin
   Write('{\xe{\v '+EscapeText(s)+'}}');
 end;
@@ -632,57 +632,57 @@ begin
           EscapeText(SubSubSectionName)]);
 end;
 
-Procedure TRTFWriter.StartProcedure;
+procedure TRTFWriter.StartProcedure;
 begin
   Write('{\pard');
 end;
 
-Procedure TRTFWriter.StartProperty;
+procedure TRTFWriter.StartProperty;
 begin
   Write('{\pard');
 end;
 
-Procedure TRTFWriter.Header(text:string; font:integer);
+procedure TRTFWriter.Header(text: string; font: integer);
 begin
   WriteF('\par\s9 %s\pard\par\s10\f%d ',[text, font]);
 end;
 
-Procedure TRTFWriter.StartSynopsis;
+procedure TRTFWriter.StartSynopsis;
 begin
   Header(SDocSynopsis,2);
 end;
 
-Procedure TRTFWriter.StartDeclaration;
+procedure TRTFWriter.StartDeclaration;
 begin
   Header(SDocDeclaration,1);
 end;
 
-Procedure TRTFWriter.StartVisibility;
+procedure TRTFWriter.StartVisibility;
 begin
   Header(SDocVisibility,2);
 end;
 
-Procedure TRTFWriter.StartDescription;
+procedure TRTFWriter.StartDescription;
 begin
   Header(SDocDescription,2);
 end;
 
-Procedure TRTFWriter.StartErrors;
+procedure TRTFWriter.StartErrors;
 begin
   Header(SDocErrors,2);
 end;
 
-Procedure TRTFWriter.StartAccess;
+procedure TRTFWriter.StartAccess;
 begin
   Header(SDocAccess,2)
 end;
 
-Procedure TRTFWriter.EndProcedure;
+procedure TRTFWriter.EndProcedure;
 begin
   Write('}');
 end;
 
-Procedure TRTFWriter.EndProperty;
+procedure TRTFWriter.EndProperty;
 begin
   Write('}');
 end;
@@ -705,14 +705,14 @@ begin
     end;
 end;
 
-procedure TRTFWriter.StartOverview(WithAccess : Boolean);
+procedure TRTFWriter.StartOverview(const What: String; WithAccess: Boolean);
 begin
   If WithAccess then
     WriteF('\par\trowd\pard\intbl %s\cell\pard\intbl %s\cell\pard\intbl %s \cell\pard\intbl %s \cell\row',
-        [EscapeText(SDocPage), EscapeText(SDocProperty), EscapeText(SDocAccess), EscapeText(SDocDescription)])
+        [EscapeText(SDocPage), EscapeText(What), EscapeText(SDocAccess), EscapeText(SDocDescription)])
   else
     WriteF('\par\trowd\pard\intbl %s\cell\pard\intbl %s\cell\pard\intbl %s\cell\row',
-        [EscapeText(SDocPage), EscapeText(SDocProperty), EscapeText(SDocDescription)]);
+        [EscapeText(SDocPage), EscapeText(What), EscapeText(SDocDescription)]);
 end;
 
 procedure TRTFWriter.WriteOverviewMember(const ALabel,AName,Access,ADescr : String);
@@ -736,7 +736,7 @@ begin
   Write ('\par');
 end;
 
-Procedure TRTFWriter.StartSeeAlso;
+procedure TRTFWriter.StartSeealso;
 begin
   Header(SDocSeeAlso, 2);
 end;
@@ -776,7 +776,7 @@ begin
   end;
 end;
 
-Function TRTFWriter.InterPretOption(Const Cmd,Arg : String) : boolean;
+function TRTFWriter.InterPretOption(const Cmd, Arg: String): boolean;
 begin
   if Cmd = '--RTF-extension' then
     begin

+ 0 - 2
utils/fpdoc/dw_man.pp

@@ -960,8 +960,6 @@ procedure TManWriter.WriteDoc;
 var
   i : Integer;
   L : TstringList;
-  DocNode : TDocNode;
-
 begin
   PackageName := LowerCase(Copy(Package.Name, 2, 255));
   If (Engine.Output<>'') then

+ 74 - 73
utils/fpdoc/dw_txt.pp

@@ -78,7 +78,7 @@ Type
     procedure StartSubSection(SubSectionName : String);override;
     procedure StartSubSubSection(SubSubSectionName : String);override;
     procedure StartChapter(ChapterName : String); override;
-    procedure StartOverview(WithAccess : Boolean); override;
+    procedure StartOverview(Const What : String;WithAccess : Boolean); override;
     procedure EndOverview; override;
     procedure WriteOverviewMember(const ALabel,AName,Access,ADescr : String); override;
     procedure WriteOverviewMember(const ALabel,AName,ADescr : String); override;
@@ -135,7 +135,7 @@ Type
   end;
 
 
-procedure TTxtWriter.WriteUnderline(Const Msg : String; DoubleLine : Boolean);
+procedure TTXTWriter.WriteUnderline(const Msg: String; DoubleLine: Boolean);
 
 Var
   L : Integer;
@@ -146,7 +146,7 @@ begin
   WriteLine(L,DoubleLine);
 end;
 
-procedure TTxtWriter.WriteLine(DoubleLine : Boolean);
+procedure TTXTWriter.WriteLine(DoubleLine: Boolean);
 
 begin
   Writeline(LineWidth,DoubleLine);
@@ -216,14 +216,14 @@ begin
   end;
 end;
 
-procedure TTxtWriter.NewLine;
+procedure TTXTWriter.NewLine;
 
 begin
   If Not FCurrentPos=0 then
     Writeln('');
 end;
 
-procedure TTxtWriter.WriteLine(LineLength : Integer; DoubleLine : Boolean);
+procedure TTXTWriter.WriteLine(LineLength: Integer; DoubleLine: Boolean);
 
 begin
   NewLine;
@@ -234,7 +234,7 @@ begin
 end;
 
 
-function TTxtWriter.GetLabel(AElement: TPasElement): String;
+function TTXTWriter.GetLabel(AElement: TPasElement): String;
 
 begin
   if AElement.ClassType = TPasUnresolvedTypeRef then
@@ -246,87 +246,87 @@ begin
   end;
 end;
 
-procedure TTxtWriter.DescrBeginBold;
+procedure TTXTWriter.DescrBeginBold;
 begin
 end;
 
-procedure TTxtWriter.DescrEndBold;
+procedure TTXTWriter.DescrEndBold;
 begin
 end;
 
-procedure TTxtWriter.DescrBeginItalic;
+procedure TTXTWriter.DescrBeginItalic;
 begin
 end;
 
-procedure TTxtWriter.DescrEndItalic;
+procedure TTXTWriter.DescrEndItalic;
 begin
 end;
 
-procedure TTxtWriter.DescrBeginEmph;
+procedure TTXTWriter.DescrBeginEmph;
 begin
 end;
 
-procedure TTxtWriter.DescrEndEmph;
+procedure TTXTWriter.DescrEndEmph;
 begin
 end;
 
-procedure TTxtWriter.DescrWriteFileEl(const AText: DOMString);
+procedure TTXTWriter.DescrWriteFileEl(const AText: DOMString);
 begin
   DescrWriteText(AText);
 end;
 
-procedure TTxtWriter.DescrWriteKeywordEl(const AText: DOMString);
+procedure TTXTWriter.DescrWriteKeywordEl(const AText: DOMString);
 begin
   DescrWriteText(AText);
 end;
 
-procedure TTxtWriter.DescrWriteVarEl(const AText: DOMString);
+procedure TTXTWriter.DescrWriteVarEl(const AText: DOMString);
 begin
   DescrWriteText(AText);
 end;
 
-procedure TTxtWriter.DescrBeginLink(const AId: DOMString);
+procedure TTXTWriter.DescrBeginLink(const AId: DOMString);
 begin
   Write('[');
 end;
 
-procedure TTxtWriter.DescrEndLink;
+procedure TTXTWriter.DescrEndLink;
 begin
   Write('] ');
 end;
 
-procedure TTxtWriter.DescrWriteLinebreak;
+procedure TTXTWriter.DescrWriteLinebreak;
 begin
   WriteLn('');
 end;
 
-procedure TTxtWriter.DescrBeginParagraph;
+procedure TTXTWriter.DescrBeginParagraph;
 begin
   // Do nothing
 end;
 
-procedure TTxtWriter.DescrEndParagraph;
+procedure TTXTWriter.DescrEndParagraph;
 begin
   WriteLn('');
 end;
 
-procedure TTxtWriter.DescrBeginCode(HasBorder: Boolean;
+procedure TTXTWriter.DescrBeginCode(HasBorder: Boolean;
   const AHighlighterName: String);
 begin
   StartListing(HasBorder,'');
 end;
 
-procedure TTxtWriter.DescrWriteCodeLine(const ALine: String);
+procedure TTXTWriter.DescrWriteCodeLine(const ALine: String);
 begin
   WriteLn(ALine);
 end;
 
-procedure TTxtWriter.DescrEndCode;
+procedure TTXTWriter.DescrEndCode;
 begin
   EndListing
 end;
 
-procedure TTxtWriter.NewListLevel(Initial : Integer);
+procedure TTXTWriter.NewListLevel(Initial: Integer);
 
 begin
   Inc(FListLevel);
@@ -334,44 +334,44 @@ begin
     FLists[FListLevel]:=0;
 end;
 
-procedure TTxtWriter.DecListLevel;
+procedure TTXTWriter.declistlevel;
 
 begin
   If (FListLevel>0) then
     Dec(FListLevel)
 end;
 
-procedure TTxtWriter.DescrBeginOrderedList;
+procedure TTXTWriter.DescrBeginOrderedList;
 begin
   NewListLevel(0);
 end;
 
-procedure TTxtWriter.DescrEndOrderedList;
+procedure TTXTWriter.DescrEndOrderedList;
 begin
   DecListLevel;
 end;
 
-procedure TTxtWriter.DescrBeginUnorderedList;
+procedure TTXTWriter.DescrBeginUnorderedList;
 begin
   NewListLevel(-1);
 end;
 
-procedure TTxtWriter.DescrEndUnorderedList;
+procedure TTXTWriter.DescrEndUnorderedList;
 begin
   DecListLevel;
 end;
 
-procedure TTxtWriter.DescrBeginDefinitionList;
+procedure TTXTWriter.DescrBeginDefinitionList;
 begin
   NewListLevel(-2);
 end;
 
-procedure TTxtWriter.DescrEndDefinitionList;
+procedure TTXTWriter.DescrEndDefinitionList;
 begin
   DecListLevel;
 end;
 
-procedure TTxtWriter.DescrBeginListItem;
+procedure TTXTWriter.DescrBeginListItem;
 begin
   If FLists[FListLevel]>=0 then
     begin
@@ -381,105 +381,105 @@ begin
   Write('   ');
 end;
 
-procedure TTxtWriter.DescrEndListItem;
+procedure TTXTWriter.DescrEndListItem;
 begin
   WriteLn('');
 end;
 
-procedure TTxtWriter.DescrBeginDefinitionTerm;
+procedure TTXTWriter.DescrBeginDefinitionTerm;
 begin
   Write('<<');
 end;
 
-procedure TTxtWriter.DescrEndDefinitionTerm;
+procedure TTXTWriter.DescrEndDefinitionTerm;
 begin
   WriteLn('>>:');
 end;
 
-procedure TTxtWriter.DescrBeginDefinitionEntry;
+procedure TTXTWriter.DescrBeginDefinitionEntry;
 begin
   // Do nothing
 end;
 
-procedure TTxtWriter.DescrEndDefinitionEntry;
+procedure TTXTWriter.DescrEndDefinitionEntry;
 begin
   WriteLn('');
 end;
 
-procedure TTxtWriter.DescrBeginSectionTitle;
+procedure TTXTWriter.DescrBeginSectionTitle;
 begin
   Inc(FSectionCount);
   WritelnF('%s %d.%d: ',[SDocSection,FChapterCount,FSectionCount]);
 end;
 
-procedure TTxtWriter.DescrBeginSectionBody;
+procedure TTXTWriter.DescrBeginSectionBody;
 begin
   WriteLn('');
 end;
 
-procedure TTxtWriter.DescrEndSection;
+procedure TTXTWriter.DescrEndSection;
 begin
   // Do noting
 end;
 
-procedure TTxtWriter.DescrBeginRemark;
+procedure TTXTWriter.DescrBeginRemark;
 begin
   WriteLn(SDocRemark+': ');
 end;
 
-procedure TTxtWriter.DescrEndRemark;
+procedure TTXTWriter.DescrEndRemark;
 begin
   WriteLn('');
 end;
 
-procedure TTxtWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
+procedure TTXTWriter.DescrBeginTable(ColCount: Integer; HasBorder: Boolean);
 
 begin
   WriteLine(False);
 end;
 
-procedure TTxtWriter.DescrEndTable;
+procedure TTXTWriter.DescrEndTable;
 begin
   WriteLine(False);
 end;
 
-procedure TTxtWriter.DescrBeginTableCaption;
+procedure TTXTWriter.DescrBeginTableCaption;
 begin
   // Do nothing.
 end;
 
-procedure TTxtWriter.DescrEndTableCaption;
+procedure TTXTWriter.DescrEndTableCaption;
 begin
   Inc(FTableCount);
   WriteF('%s %d :',[SDoctable,FTableCount]);
   TableCaptionWritten := True;
 end;
 
-procedure TTxtWriter.DescrBeginTableHeadRow;
+procedure TTXTWriter.DescrBeginTableHeadRow;
 begin
   if not TableCaptionWritten then
     DescrEndTableCaption;
   TableRowStartFlag := True;
 end;
 
-procedure TTxtWriter.DescrEndTableHeadRow;
+procedure TTXTWriter.DescrEndTableHeadRow;
 begin
   WriteLine(False);
 end;
 
-procedure TTxtWriter.DescrBeginTableRow;
+procedure TTXTWriter.DescrBeginTableRow;
 begin
   if not TableCaptionWritten then
     DescrEndTableCaption;
   TableRowStartFlag := True;
 end;
 
-procedure TTxtWriter.DescrEndTableRow;
+procedure TTXTWriter.DescrEndTableRow;
 begin
   WriteLn('');
 end;
 
-procedure TTxtWriter.DescrBeginTableCell;
+procedure TTXTWriter.DescrBeginTableCell;
 begin
   if TableRowStartFlag then
     TableRowStartFlag := False
@@ -487,7 +487,7 @@ begin
     Write('    ');
 end;
 
-procedure TTxtWriter.DescrEndTableCell;
+procedure TTXTWriter.DescrEndTableCell;
 begin
   // Do nothing
 end;
@@ -514,15 +514,15 @@ begin
     Result:=inherited InterpretOption(Cmd, Arg);
 end;
 
-procedure TTxtWriter.WriteLabel(const s: String);
+procedure TTXTWriter.WriteLabel(const S: String);
 begin
 end;
 
-procedure TTxtWriter.WriteIndex(const s : String);
+procedure TTXTWriter.WriteIndex(const S: String);
 begin
 end;
 
-procedure TTxtWriter.StartListing(Frames: Boolean; const name: String);
+procedure TTXTWriter.StartListing(Frames: Boolean; const name: String);
 begin
   FInVerbatim:=True;
   If (Name<>'') then
@@ -533,21 +533,21 @@ begin
     WriteLn('');
 end;
 
-procedure TTxtWriter.EndListing;
+procedure TTXTWriter.EndListing;
 begin
   FInVerbatim:=False;
 end;
 
-procedure TTxtWriter.WriteCommentLine;
+procedure TTXTWriter.WriteCommentLine;
 
 begin
 end;
 
-procedure TTxtWriter.WriteComment(Comment : String);
+procedure TTXTWriter.WriteComment(Comment: String);
 begin
 end;
 
-procedure TTxtWriter.StartChapter(ChapterName : String);
+procedure TTXTWriter.StartChapter(ChapterName: String);
 begin
   Inc(FChapterCount);
   FSectionCount:=0;
@@ -559,7 +559,7 @@ begin
   Writeln('');
 end;
 
-procedure TTxtWriter.StartSection(SectionName : String);
+procedure TTXTWriter.StartSection(SectionName: String);
 begin
   Inc(FSectionCount);
   FSubSectionCount:=0;
@@ -570,7 +570,7 @@ begin
   Writeln('');
 end;
 
-procedure TTxtWriter.StartSubSection(SubSectionName : String);
+procedure TTXTWriter.StartSubSection(SubSectionName: String);
 begin
   Inc(FSubSectionCount);
   Writeln('');
@@ -579,7 +579,7 @@ begin
   Writeln('');
 end;
 
-procedure TTxtWriter.StartSubSubSection(SubSubSectionName : String);
+procedure TTXTWriter.StartSubSubSection(SubSubSectionName: String);
 begin
   Writeln('');
   Writeln(SubSubSectionName);
@@ -598,7 +598,7 @@ begin
   end;
 end;
 
-procedure TTxtWriter.WriteExampleFile(FN : String);
+procedure TTXTWriter.WriteExampleFile(FN: String);
 
 Var
   L : TStringList;
@@ -622,51 +622,52 @@ begin
     end;
 end;
 
-procedure TTxtWriter.StartOverview(WithAccess : Boolean);
+procedure TTXTWriter.StartOverview(const What: String; WithAccess: Boolean);
 
 begin
   If WithAccess then
-    WriteUnderLine(Format('%.30s %.10s %s',[EscapeText(SDocProperty), EscapeText(SDocAccess), EscapeText(SDocDescription)]),False)
+    WriteUnderLine(Format('%.30s %.10s %s',[EscapeText(What), EscapeText(SDocAccess), EscapeText(SDocDescription)]),False)
   else
-    WriteUnderLine(Format('%.30s %s',[EscapeText(SDocMethod), EscapeText(SDocDescription)]),False);
+    WriteUnderLine(Format('%.30s %s',[EscapeText(What), EscapeText(SDocDescription)]),False);
 end;
 
-procedure TTxtWriter.EndOverview;
+procedure TTXTWriter.EndOverview;
 
 begin
   WriteLine(False);
 end;
 
-procedure TTxtWriter.WriteOverviewMember(const ALabel,AName,Access,ADescr : String);
+procedure TTXTWriter.WriteOverviewMember(const ALabel, AName, Access,
+  ADescr: String);
 
 begin
   WriteLnF('%.30s %.10s  %s',[AName,Access,ADescr]);
 end;
 
-procedure TTxtWriter.WriteOverviewMember(const ALabel,AName,ADescr : String);
+procedure TTXTWriter.WriteOverviewMember(const ALabel, AName, ADescr: String);
 
 begin
   WriteLnF('%.30s %s ',[AName,ADescr]);
 end;
 
-class function TTxtWriter.FileNameExtension: String;
+class function TTXTWriter.FileNameExtension: String;
 begin
   Result:=TxtExtension;
 end;
 
-procedure TTxtWriter.StartUnitOverview(AModuleName,AModuleLabel : String);
+procedure TTXTWriter.StartUnitOverview(AModuleName, AModuleLabel: String);
 
 begin
   WriteUnderLine('Unit Name',False);
 end;
 
-procedure TTxtWriter.WriteUnitEntry(UnitRef : TPasType);
+procedure TTXTWriter.WriteUnitEntry(UnitRef: TPasType);
 
 begin
   Writeln(EscapeText(UnitRef.Name));
 end;
 
-procedure TTxtWriter.EndUnitOverview;
+procedure TTXTWriter.EndUnitOverview;
 
 begin
   Writeln('');

+ 161 - 72
utils/fpdoc/dwlinear.pp

@@ -78,7 +78,7 @@ Type
     procedure StartListing(Frames: Boolean; const name: String); virtual; abstract;
     procedure EndListing; virtual; abstract;
     Procedure WriteExampleFile(FN : String); virtual; abstract;
-    procedure StartOverview(WithAccess : Boolean); virtual; Abstract;
+    procedure StartOverview(Const What : String; WithAccess : Boolean); virtual; Abstract;
     procedure EndOverview; virtual; Abstract;
     procedure WriteOverviewMember(const ALabel,AName,Access,ADescr : String); virtual; Abstract;
     procedure WriteOverviewMember(const ALabel,AName,ADescr : String); virtual; Abstract;
@@ -106,9 +106,10 @@ Type
     procedure WriteFunctionsAndProcedures(ASection: TPasSection);
     procedure WriteProcedure(ProcDecl: TPasProcedureBase);
     procedure WriteClasses(ASection: TPasSection);
+    Procedure WriteExtendedRecords(Asection : TPasSection);
     procedure WriteClassDecl(ClassDecl: TPasClassType);
-    procedure WriteClassMethodOverview(ClassDecl: TPasClassType);
-    procedure WriteClassPropertyOverview(ClassDecl: TPasClassType);
+    procedure WriteMethodOverview(AParent: TPasType; Members : TFPList);
+    procedure WritePropertyOverview(AParent: TPasType; Members : TFPList);
     procedure WriteClassInterfacesOverview(ClassDecl: TPasClassType);
     procedure WriteClassInheritanceOverview(ClassDecl: TPasClassType); virtual;
     procedure WriteProperty(PropDecl: TPasProperty);
@@ -128,14 +129,14 @@ const
   Writing support
   ---------------------------------------------------------------------}
 
-Function TLinearWriter.PushWriteContext(S : TStream) : TStream;
+function TLinearWriter.PushWriteContext(S: TStream): TStream;
 
 begin
   Result:=FStream;
   FStream:=S;
 end;
 
-Procedure TLinearWriter.PopWriteContext(S : TSTream);
+procedure TLinearWriter.PopWriteContext(S: TSTream);
 
 begin
   FStream:=S;
@@ -174,7 +175,8 @@ begin
   Write(EscapeText(AText));
 end;
 
-Function TLinearWriter.GetDescrString(AContext: TPasElement; DescrNode: TDOMElement) : String;
+function TLinearWriter.GetDescrString(AContext: TPasElement;
+  DescrNode: TDOMElement): String;
 
 Var
   S : TStringStream;
@@ -274,74 +276,74 @@ end;
   Default implementations, may be overridden in descendents
   ---------------------------------------------------------------------}
 
-Function  TLinearWriter.EscapeText(S : String) : String;
+function TLinearWriter.EscapeText(S: String): String;
 
 begin
   Result:=S;
 end;
 
-Function  TLinearWriter.StripText(S : String) : String;
+function TLinearWriter.StripText(S: String): String;
 
 begin
   Result:=S;
 end;
 
-Procedure TLinearWriter.StartProcedure;
+procedure TLinearWriter.StartProcedure;
 
 begin
   Writeln(SDocProcedure+':');
 end;
 
-Procedure TLinearWriter.StartSynopsis;
+procedure TLinearWriter.StartSynopsis;
 
 begin
   Writeln('');
   Writeln(SDocSynopsis+':');
 end;
 
-Procedure TLinearWriter.StartDeclaration;
+procedure TLinearWriter.StartDeclaration;
 
 begin
   Writeln('');
   Writeln(SDocDeclaration+':');
 end;
 
-Procedure TLinearWriter.StartVisibility;
+procedure TLinearWriter.StartVisibility;
 
 begin
   Writeln('');
   Writeln(SDocVisibility+':');
 end;
 
-Procedure TLinearWriter.StartDescription;
+procedure TLinearWriter.StartDescription;
 
 begin
   Writeln('');
   Writeln(SDocDescription+':');
 end;
 
-Procedure TLinearWriter.StartAccess;
+procedure TLinearWriter.StartAccess;
 
 begin
   Writeln('');
   Writeln(SDocAccess+':');
 end;
 
-Procedure TLinearWriter.StartErrors;
+procedure TLinearWriter.StartErrors;
 
 begin
   Writeln('');
   Writeln(SDocErrors+':');
 end;
 
-Procedure TLinearWriter.StartVersion;
+procedure TLinearWriter.StartVersion;
 
 begin
   Writeln('');
   Writeln(SDocVersion+':');
 end;
 
-Procedure TLinearWriter.StartSeealso;
+procedure TLinearWriter.StartSeealso;
 
 begin
   Writeln('');
@@ -349,20 +351,20 @@ begin
 end;
 
 
-Procedure TLinearWriter.StartProperty;
+procedure TLinearWriter.StartProperty;
 
 begin
   Writeln('');
   Writeln(SDocProperty+':');
 end;
 
-Procedure TLinearWriter.EndProcedure;
+procedure TLinearWriter.EndProcedure;
 
 begin
   Writeln('');
 end;
 
-Procedure TLinearWriter.EndProperty;
+procedure TLinearWriter.EndProperty;
 
 begin
   Writeln('');
@@ -422,9 +424,9 @@ begin
   // Write Interfaces Overview;
   WriteClassInterfacesOverView(ClassDecl);
   // Write method overview
-  WriteClassMethodOverView(ClassDecl);
+  WriteMethodOverView(ClassDecl,ClassDecl.Members);
   // Write Property Overview;
-  WriteClassPropertyOverView(ClassDecl);
+  WritePropertyOverView(ClassDecl,ClassDecl.Members);
 
   // Write method & property descriptions
 
@@ -448,7 +450,7 @@ begin
 end;
 
 
-procedure TLinearWriter.WriteClassPropertyOverview(ClassDecl : TPasClassType);
+procedure TLinearWriter.WritePropertyOverview(AParent: TPasType; Members : TFPList);
 
 var
   Member: TPasElement;
@@ -462,9 +464,9 @@ begin
   List:=TStringList.Create;
   Try
     List.Sorted:=True;
-    for i := 0 to ClassDecl.Members.Count - 1 do
+    for i := 0 to Members.Count - 1 do
       begin
-      Member := TPasElement(ClassDecl.Members[i]);
+      Member := TPasElement(Members[i]);
       With Member do
         if InheritsFrom(TPasProperty) and SHowMember(Member) then
           List.AddObject(Member.Name,Member)
@@ -472,8 +474,8 @@ begin
     If (List.Count>0) then
       begin
       StartSubSection(SDocPropertyOverview);
-      WriteLabel(GetLabel(ClassDecl) + ':Properties');
-      StartOverView(True);
+      WriteLabel(GetLabel(AParent) + ':Properties');
+      StartOverView(SDocProperties,True);
       For I:=0 to List.Count-1 do
         begin
         Member:=TPasElement(List.objects[i]);
@@ -535,7 +537,7 @@ begin
     begin
       StartSubSection(SDocInterfacesOverview);
       WriteLabel(GetLabel(ClassDecl) + ':Interfaces');
-      StartOverView(False);
+      StartOverView(SDocInterface,False);
       for i := 0 to List.Count-1 do
       begin
         lInterface := TPasElement(List.Objects[i]);
@@ -648,6 +650,7 @@ begin
 
   WriteVarsConstsTypes(ASection);
   WriteFunctionsAndProcedures(ASection);
+  WriteExtendedRecords(ASection);
   WriteClasses(ASection);
 end;
 
@@ -721,7 +724,7 @@ begin
     end;
 end;
 
-Procedure TLinearWriter.ProcessPackage;
+procedure TLinearWriter.ProcessPackage;
 
 var
   DocNode: TDocNode;
@@ -740,7 +743,7 @@ begin
   ProcessTopics(DocNode,1);
 end;
 
-Procedure TLinearWriter.ProcessTopics(DocNode : TDocNode; Alevel : Integer);
+procedure TLinearWriter.ProcessTopics(DocNode: TDocNode; Alevel: Integer);
 
 Var
   Node : TDocNode;
@@ -758,7 +761,7 @@ begin
 end;
 
 
-Procedure TLinearWriter.WriteTopicNode(Node : TDocNode; Level : Integer);
+procedure TLinearWriter.WriteTopicNode(Node: TDocNode; Level: Integer);
 
 Var
   Element : TTopicElement;
@@ -860,48 +863,53 @@ end;
 
 procedure TLinearWriter.WriteTypes(ASection: TPasSection);
 var
-  i: Integer;
+  i,j: Integer;
   TypeDecl: TPasType;
+  Recdecl: TPasRecordType;
+  Member : TPasElement;
   DocNode : TDocNode;
 begin
   if ASection.Types.Count > 0 then
-  begin
+    begin
     StartSubSection(SDocTypes,ModuleName+'Types');
     for i := 0 to ASection.Types.Count - 1 do
-    begin
-      DescrBeginParagraph;
-      TypeDecl := TPasType(ASection.Types[i]);
-      WriteTypeDecl(TypeDecl);
-      StartListing(False,'');
-      DocNode := Engine.FindDocNode(TypeDecl);
-      If Assigned(DocNode) and 
-         Assigned(DocNode.Node) and 
-         (Docnode.Node['opaque']='1') then
-          Writeln(TypeDecl.Name+' = '+SDocOpaque)
-      else
       begin
-        Writeln(EscapeText(TypeDecl.GetDeclaration(True)));
-      end;
-      EndListing;
-      WriteLabel(TypeDecl);
-      WriteIndex(TypeDecl);
-      If TypeDecl is TPasEnumType then
-        WriteENumElements(TypeDecl as TPasEnumType)
-      else If (TypeDecl is TPasSetType)
-              and (TPasSetType(TypeDecl).EnumType is TPasEnumType)
-              and (TPasSetType(TypeDecl).EnumType.Name='') then
-        WriteENumElements(TPasSetType(TypeDecl).EnumType as TPasEnumType);
-      WriteDescr(TypeDecl,DocNode);
-      If Assigned(DocNode) and Assigned(DocNode.Version) then
+      TypeDecl := TPasType(ASection.Types[i]);
+      if not ((TypeDecl is TPasRecordType) and TPasRecordType(TypeDecl).IsAdvancedRecord) then
         begin
-        Writeln(Format('%s : ',[SDocVersion]));
-        WriteDescr(TypeDecl, DocNode.Version);
+        DescrBeginParagraph;
+        WriteTypeDecl(TypeDecl);
+        StartListing(False,'');
+        DocNode := Engine.FindDocNode(TypeDecl);
+        If Assigned(DocNode) and
+           Assigned(DocNode.Node) and
+           (Docnode.Node['opaque']='1') then
+            Writeln(TypeDecl.Name+' = '+SDocOpaque)
+        else
+        begin
+          Writeln(EscapeText(TypeDecl.GetDeclaration(True)));
+        end;
+        EndListing;
+        WriteLabel(TypeDecl);
+        WriteIndex(TypeDecl);
+        If TypeDecl is TPasEnumType then
+          WriteENumElements(TypeDecl as TPasEnumType)
+        else If (TypeDecl is TPasSetType)
+                and (TPasSetType(TypeDecl).EnumType is TPasEnumType)
+                and (TPasSetType(TypeDecl).EnumType.Name='') then
+          WriteENumElements(TPasSetType(TypeDecl).EnumType as TPasEnumType);
+        WriteDescr(TypeDecl,DocNode);
+        If Assigned(DocNode) and Assigned(DocNode.Version) then
+          begin
+          Writeln(Format('%s : ',[SDocVersion]));
+          WriteDescr(TypeDecl, DocNode.Version);
+          end;
+        if Assigned(DocNode) and assigned(DocNode.Notes) then
+          ConvertNotes(TypeDecl,DocNode.Notes);
+        DescrEndParagraph;
         end;
-      if Assigned(DocNode) and assigned(DocNode.Notes) then
-        ConvertNotes(TypeDecl,DocNode.Notes);
-      DescrEndParagraph;
       end;
-  end;
+    end;
 end;
 
 procedure TLinearWriter.WriteVars(ASection: TPasSection);
@@ -945,7 +953,7 @@ var
 begin
   With ProcDecl do
     begin
-    if Not (Assigned(Parent) and Parent.InheritsFrom(TPasClassType)) then
+    if Not (Assigned(Parent) and ((Parent.InheritsFrom(TPasClassType)) or Parent.InheritsFrom(TPasRecordType))) then
       begin
       StartSubSection(Name);
       WriteLabel(ProcDecl);
@@ -1174,7 +1182,7 @@ begin
   List.Sort(@CompareElements);
 end;
 
-Function TLinearWriter.ShowMember(M : TPasElement) : boolean;
+function TLinearWriter.ShowMember(M: TPasElement): boolean;
 
 begin
   Result:=Engine.ShowElement(M);
@@ -1189,7 +1197,67 @@ begin
       WriteClassDecl(TPasClassType(ASection.Classes[i]));
 end;
 
-procedure TLinearWriter.WriteClassMethodOverview(ClassDecl: TPasClassType);
+procedure TLinearWriter.WriteExtendedRecords(Asection: TPasSection);
+
+var
+  i,j : Integer;
+  Recdecl : TPasRecordType;
+  DocNode : TDocNode;
+  Member : TPasElement;
+begin
+  if (ASection.Types.Count > 0) then
+    for i := 0 to ASection.Types.Count - 1 do
+      begin
+      If TPasElement(ASection.Types[i]) is TPasRecordType then
+        begin
+        Recdecl:=TPasRecordType(ASection.Types[i]);
+        if RecDecl.IsAdvancedRecord then
+          begin
+          StartSection(RecDecl.Name);
+          DescrBeginParagraph;
+          WriteTypeDecl(RecDecl);
+          StartListing(False,'');
+          DocNode := Engine.FindDocNode(RecDecl);
+          If Assigned(DocNode) and
+             Assigned(DocNode.Node) and
+             (Docnode.Node['opaque']='1') then
+              Writeln(RecDecl.Name+' = '+SDocOpaque)
+          else
+          begin
+            Writeln(EscapeText(RecDecl.GetDeclaration(True)));
+          end;
+          EndListing;
+          WriteLabel(RecDecl);
+          WriteIndex(RecDecl);
+          WriteDescr(RecDecl,DocNode);
+          If Assigned(DocNode) and Assigned(DocNode.Version) then
+            begin
+            Writeln(Format('%s : ',[SDocVersion]));
+            WriteDescr(RecDecl, DocNode.Version);
+            end;
+          if Assigned(DocNode) and assigned(DocNode.Notes) then
+            ConvertNotes(RecDecl,DocNode.Notes);
+          DescrEndParagraph;
+          WriteMethodOverView(Recdecl,Recdecl.Members);
+          WritePropertyOverView(Recdecl,Recdecl.Members);
+          for J := 0 to Recdecl.Members.Count - 1 do
+            begin
+            Member := TPasElement(Recdecl.Members[j]);
+            if Member.InheritsFrom(TPasProcedureBase) and Engine.ShowElement(Member) then
+              WriteProcedure(TPasProcedureBase(Member));
+            end;
+          for j := 0 to Recdecl.Members.Count - 1 do
+            begin
+            Member := TPasElement(Recdecl.Members[j]);
+            if Member.InheritsFrom(TPasProperty) and Engine.ShowElement(Member) then
+              WriteProperty(TPasProperty(Member));
+            end;
+          end;
+        end;
+      end;
+end;
+
+procedure TLinearWriter.WriteMethodOverview(AParent: TPasType; Members : TFPList);
 
 var
   Member : TPasElement;
@@ -1202,9 +1270,9 @@ begin
   List:=TStringList.Create;
   Try
     List.Sorted:=True;
-    for i := 0 to ClassDecl.Members.Count - 1 do
+    for i := 0 to Members.Count - 1 do
       begin
-      Member := TPasElement(ClassDecl.Members[i]);
+      Member := TPasElement(Members[i]);
       With Member do
         if InheritsFrom(TPasProcedureBase) and ShowMember(Member) then
       List.AddObject(Member.Name,Member);
@@ -1212,8 +1280,8 @@ begin
     If List.Count>0 then
       begin
       StartSubSection(SDocMethodOverview);
-      WriteLabel(GetLabel(ClassDecl) + ':Methods');
-      StartOverview(False);
+      WriteLabel(GetLabel(AParent) + ':Methods');
+      StartOverview(SDocMethod,False);
       For I:=0 to List.Count-1 do
         begin
         Member:=TPasElement(List.Objects[i]);
@@ -1243,10 +1311,31 @@ constructor TLinearWriter.Create(APackage: TPasPackage; AEngine: TFPDocEngine);
 
   procedure AddList(AElement: TPasElement; AList: TFPList);
   var
-    i: Integer;
+    i,j: Integer;
+    R : TPasRecordType;
+    FPEl : TPaselement;
+    DocNode: TDocNode;
+
   begin
     for i := 0 to AList.Count - 1 do
+      begin
       AddLabel(TPasElement(AList[i]));
+      if (TObject(AList[i]) is TPasRecordType) then
+        begin
+        R:=TObject(AList[I]) as TPasRecordType;
+        For J:=0 to R.Members.Count-1 do
+          begin
+          FPEl:=TPasElement(R.Members[J]);
+          if ((FPEL is TPasProperty) or (FPEL is TPasProcedureBase))
+             and Engine.ShowElement(FPEl) then
+               begin
+               DocNode := Engine.FindDocNode(FPEl);
+               if Assigned(DocNode) then
+                 AddLabel(FPEl);
+               end;
+          end;
+        end;
+      end;
   end;
 
   procedure AddTopicPages(AElement: TPasElement);
@@ -1381,7 +1470,7 @@ begin
   // do nothing
 end;
 
-function TLinearWriter.InterpretOption(const Cmd: String; const Arg: String): Boolean;
+function TLinearWriter.InterpretOption(const Cmd, Arg: String): Boolean;
 begin
   Result := True;
   if Cmd = cDupLinkedDocParam then

+ 26 - 20
utils/fpdoc/fpdoc.css

@@ -1,5 +1,5 @@
 /*
-  $Id: fpdoc.cst,v 1.1 2005/01/02 16:22:16 michael Exp $
+  $Id: fpdoc.css,v 1.1 2003/03/17 23:03:20 michael Exp $
 
   Default style sheet for FPDoc reference documentation
   by Sebastian Guenther, [email protected]
@@ -62,10 +62,6 @@ span.code {
 span.sym {
   color: darkred
 }
-/* No wordwrap in code fragments */
-span.code {
-   white-space: nowrap
-}
 
 /* keywords in source fragments */
 span.kw {
@@ -131,30 +127,40 @@ table.bar {
   background-color: #a0c0ff;
 }
 
-td p {
- margin: 0;
-}
-
 span.bartitle {
   font-weight: bold;
   font-style: italic;
   color: darkblue
 }
 
-span.toggletreeclose {
-    background: url(minus.png) center left no-repeat;
-    padding-left: 20px; 
+span.footer {
+  font-style: italic;
+  color: darkblue
 }
 
-span.toggletreeopen {
-    background: url(plus.png) center left no-repeat;
-    padding-left: 20px; 
+/* definition list */
+dl {
+ border: 3px double #ccc;
+ padding: 0.5em;
 }
 
-ul.classtreelist li { padding-left: 0px; }
-
-ul.classtreelist { list-style-type:none; }
+/* definition list: term */
+dt {
+ float: left;
+ clear: left;
+ width: auto; /* normally browsers default width of largest item */
+ padding-right: 20px;
+ font-weight: bold;
+ color: darkgreen;
+}
 
-li.classtree ul { display: block; }
+/* definition list: description */
+dd {
+ margin: 0 0 0 110px;
+ padding: 0 0 0.5em 0;
+}
 
-li.classtreeclosed ul { display: none; }
+/* for browsers in standards compliance mode */
+td p {
+  margin: 0;
+}

+ 2 - 17
utils/fpdoc/fpdoc.lpi

@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <CONFIG>
   <ProjectOptions>
     <Version Value="9"/>
@@ -31,8 +31,7 @@
     <RunParams>
       <local>
         <FormatVersion Value="1"/>
-        <CommandLineParams Value="--package=me --output=me --input=ct.pp --format=html"/>
-        <LaunchingApplication PathPlusParams="/usr/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
+        <CommandLineParams Value="--package=fpdoc --input=testunit.pp --output=testunit --format=html --descr=testunit.xml"/>
       </local>
     </RunParams>
     <RequiredPackages Count="1">
@@ -64,7 +63,6 @@
       <Unit4>
         <Filename Value="dw_ipflin.pas"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="dw_ipflin"/>
       </Unit4>
       <Unit5>
         <Filename Value="dw_latex.pp"/>
@@ -74,7 +72,6 @@
       <Unit6>
         <Filename Value="dwlinear.pp"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="dwlinear"/>
       </Unit6>
       <Unit7>
         <Filename Value="dw_linrtf.pp"/>
@@ -84,7 +81,6 @@
       <Unit8>
         <Filename Value="dw_man.pp"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="dw_man"/>
       </Unit8>
       <Unit9>
         <Filename Value="dwriter.pp"/>
@@ -94,7 +90,6 @@
       <Unit10>
         <Filename Value="dw_txt.pp"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="dw_txt"/>
       </Unit10>
       <Unit11>
         <Filename Value="dw_xml.pp"/>
@@ -104,22 +99,18 @@
       <Unit12>
         <Filename Value="fpdocproj.pas"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="fpdocproj"/>
       </Unit12>
       <Unit13>
         <Filename Value="fpdocxmlopts.pas"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="fpdocxmlopts"/>
       </Unit13>
       <Unit14>
         <Filename Value="mkfpdoc.pp"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="mkfpdoc"/>
       </Unit14>
       <Unit15>
         <Filename Value="fpdocclasstree.pp"/>
         <IsPartOfProject Value="True"/>
-        <UnitName Value="fpdocclasstree"/>
       </Unit15>
     </Units>
   </ProjectOptions>
@@ -132,12 +123,6 @@
       <IncludeFiles Value="$(ProjOutDir)"/>
       <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
     </SearchPaths>
-    <Other>
-      <CompilerMessages>
-        <UseMsgFile Value="True"/>
-      </CompilerMessages>
-      <CompilerPath Value="$(CompPath)"/>
-    </Other>
   </CompilerOptions>
   <Debugging>
     <Exceptions Count="3">

+ 29 - 0
utils/fpdoc/testunit.pp

@@ -1,5 +1,7 @@
 {$mode objfpc}
 {$h+}
+{$modeswitch advancedrecords} 
+
 unit testunit;
 
 interface
@@ -41,6 +43,19 @@ Type
                           end; 
                           
   TADeprecatedType = Integer deprecated;
+
+  TMethodRecord = Record
+  Private
+    X22 : Integer;
+    Procedure SetX(AValue : Integer);
+    Function GetX : Integer;
+  Public  
+    Procedure MyMethod;
+    Property MyX : Integer Read GetX Write SetX;
+  Case Integer of
+    1 : (X2,Y2 : Integer);
+    2 : (phi,Omega : Real);
+  end;
                         
 Var
   ASimpleVar : Integer;  
@@ -276,4 +291,18 @@ begin
 
 end;
 
+Procedure TMethodRecord.SetX(AValue : Integer);
+
+begin
+end;
+
+Function TMEthodRecord.GetX : Integer;
+
+begin
+end;
+
+Procedure TMEthodRecord.MyMethod;
+begin
+end;
+
 end.

+ 53 - 6
utils/fpdoc/testunit.xml

@@ -9,8 +9,9 @@
 -->
 
 <module name="testunit">
-<short></short>
+<short>This cannot be</short>
 <descr>
+We have here a description
 </descr>
 <notes>
   <note>Unit note</note>
@@ -18,7 +19,7 @@
 
 <!-- constant Visibility: default -->
 <element name="AnIntegerConst">
-<short></short>
+<short>Aha this is not me</short>
 <descr>
 </descr>
 <version>
@@ -206,7 +207,7 @@ Appears in 2.0
 
 <!-- record type Visibility: default -->
 <element name="TAVariantRecordType">
-<short></short>
+<short>Some record with variants</short>
 <descr>
 </descr>
 <seealso>
@@ -215,7 +216,7 @@ Appears in 2.0
 
 <!-- variable Visibility: default -->
 <element name="TAVariantRecordType.A">
-<short></short>
+<short>A short description for A </short>
 <descr>
 </descr>
 <seealso>
@@ -224,7 +225,7 @@ Appears in 2.0
 
 <!-- variable Visibility: default -->
 <element name="TAVariantRecordType.X">
-<short></short>
+<short>A short description for X</short>
 <descr>
 </descr>
 <seealso>
@@ -233,7 +234,53 @@ Appears in 2.0
 
 <!-- variable Visibility: default -->
 <element name="TAVariantRecordType.Y">
-<short></short>
+<short>A short description for Y</short>
+<descr>
+</descr>
+<seealso>
+</seealso>
+</element>
+
+<!-- record type Visibility: default -->
+<element name="TMethodRecord">
+<short>Some record with variants</short>
+<descr>
+</descr>
+<seealso>
+</seealso>
+</element>
+
+
+<!-- variable Visibility: default -->
+<element name="TMethodRecord.MyMethod">
+<short>A short description for MyMethod</short>
+<descr>
+</descr>
+<seealso>
+</seealso>
+</element>
+
+<!-- variable Visibility: default -->
+<element name="TMethodRecord.A">
+<short>A short description for A </short>
+<descr>
+</descr>
+<seealso>
+</seealso>
+</element>
+
+<!-- variable Visibility: default -->
+<element name="TMethodRecord.X">
+<short>A short description for X</short>
+<descr>
+</descr>
+<seealso>
+</seealso>
+</element>
+
+<!-- variable Visibility: default -->
+<element name="TMethodRecord.Y">
+<short>A short description for Y</short>
 <descr>
 </descr>
 <seealso>