Browse Source

* added more options to format the result of tprocdef.fullprocname() via
a new customprocname() method and tprocnameoption flags (add parameter
names, add "function"/"procedure", add name of owning struct or not,
don't add the "class" prefix for class methods)
Reason: for internal use by the compiler so it can output the procdef
into something that can be fed back to the parser for reuse (seems
easier than manually constructing a new procdef, or duplicating it
inside of another objectdef)

git-svn-id: branches/jvmbackend@18426 -

Jonas Maebe 14 years ago
parent
commit
96b0ee0827
2 changed files with 66 additions and 34 deletions
  1. 1 1
      compiler/ncal.pas
  2. 65 33
      compiler/symdef.pas

+ 1 - 1
compiler/ncal.pas

@@ -2399,7 +2399,7 @@ implementation
         for i:=0 to tprocsym(sym).ProcdefList.Count-1 do
         for i:=0 to tprocsym(sym).ProcdefList.Count-1 do
           begin
           begin
             pd:=tprocdef(tprocsym(sym).ProcdefList[i]);
             pd:=tprocdef(tprocsym(sym).ProcdefList[i]);
-            hs:=pd.procsym.name+pd.typename_paras(false);
+            hs:=pd.procsym.name+pd.typename_paras([]);
             j:=AbstractMethodsList.FindIndexOf(hs);
             j:=AbstractMethodsList.FindIndexOf(hs);
             if j<>-1 then
             if j<>-1 then
               AbstractMethodsList[j]:=pd
               AbstractMethodsList[j]:=pd

+ 65 - 33
compiler/symdef.pas

@@ -414,6 +414,10 @@ interface
 
 
        { tabstractprocdef }
        { tabstractprocdef }
 
 
+       tprocnameoption = (pno_showhidden, pno_proctypeoption, pno_paranames,
+         pno_ownername, pno_noclassmarker);
+       tprocnameoptions = set of tprocnameoption;
+
        tabstractprocdef = class(tstoreddef)
        tabstractprocdef = class(tstoreddef)
           { saves a definition to the return type }
           { saves a definition to the return type }
           returndef       : tdef;
           returndef       : tdef;
@@ -440,7 +444,7 @@ interface
           procedure buildderef;override;
           procedure buildderef;override;
           procedure deref;override;
           procedure deref;override;
           procedure calcparas;
           procedure calcparas;
-          function  typename_paras(showhidden:boolean): string;
+          function  typename_paras(pno: tprocnameoptions): string;
           function  is_methodpointer:boolean;virtual;
           function  is_methodpointer:boolean;virtual;
           function  is_addressonly:boolean;virtual;
           function  is_addressonly:boolean;virtual;
           function  no_self_node:boolean;
           function  no_self_node:boolean;
@@ -576,6 +580,7 @@ interface
           function  mangledname : string;
           function  mangledname : string;
           procedure setmangledname(const s : string);
           procedure setmangledname(const s : string);
           function  fullprocname(showhidden:boolean):string;
           function  fullprocname(showhidden:boolean):string;
+          function  customprocname(pno: tprocnameoptions):string;
           function  defaultmangledname: string;
           function  defaultmangledname: string;
           function  cplusplusmangledname : string;
           function  cplusplusmangledname : string;
           function  objcmangledname : string;
           function  objcmangledname : string;
@@ -3311,7 +3316,7 @@ implementation
       end;
       end;
 
 
 
 
-    function tabstractprocdef.typename_paras(showhidden:boolean) : string;
+    function tabstractprocdef.typename_paras(pno: tprocnameoptions) : string;
       var
       var
         hs,s  : string;
         hs,s  : string;
         hp    : TParavarsym;
         hp    : TParavarsym;
@@ -3325,7 +3330,7 @@ implementation
          begin
          begin
            hp:=tparavarsym(paras[i]);
            hp:=tparavarsym(paras[i]);
            if not(vo_is_hidden_para in hp.varoptions) or
            if not(vo_is_hidden_para in hp.varoptions) or
-              (showhidden) then
+              (pno_showhidden in pno) then
             begin
             begin
                if first then
                if first then
                 begin
                 begin
@@ -3346,6 +3351,8 @@ implementation
                  vs_constref :
                  vs_constref :
                    s:=s+'constref ';
                    s:=s+'constref ';
                end;
                end;
+               if (pno_paranames in pno) then
+                 s:=s+hp.realname+':';
                if hp.univpara then
                if hp.univpara then
                  s:=s+'univ ';
                  s:=s+'univ ';
                if assigned(hp.vardef.typesym) then
                if assigned(hp.vardef.typesym) then
@@ -3776,46 +3783,71 @@ implementation
 
 
 
 
     function tprocdef.fullprocname(showhidden:boolean):string;
     function tprocdef.fullprocname(showhidden:boolean):string;
+      var
+        pno: tprocnameoptions;
+      begin
+        pno:=[];
+        if showhidden then
+          include(pno,pno_showhidden);
+        result:=customprocname(pno);
+      end;
+
+
+    function tprocdef.customprocname(pno: tprocnameoptions):string;
       var
       var
         s : string;
         s : string;
         t : ttoken;
         t : ttoken;
       begin
       begin
 {$ifdef EXTDEBUG}
 {$ifdef EXTDEBUG}
-        showhidden:=true;
+        include(pno,pno_showhidden);
 {$endif EXTDEBUG}
 {$endif EXTDEBUG}
         s:='';
         s:='';
-        if assigned(struct) then
-         begin
-           s:=struct.RttiName+'.';
-           if (po_classmethod in procoptions) and
-              not (proctypeoption in [potype_class_constructor,potype_class_destructor]) then
-             s:='class ' + s;
-         end;
         if proctypeoption=potype_operator then
         if proctypeoption=potype_operator then
           begin
           begin
             for t:=NOTOKEN to last_overloaded do
             for t:=NOTOKEN to last_overloaded do
               if procsym.realname='$'+overloaded_names[t] then
               if procsym.realname='$'+overloaded_names[t] then
                 begin
                 begin
-                  s:='operator '+arraytokeninfo[t].str+typename_paras(showhidden);
+                  s:='operator ';
+                  if (pno_ownername in pno) and
+                     assigned(struct) then
+                    s:=s+struct.RttiName+'.';
+                  s:=s+arraytokeninfo[t].str+typename_paras(pno);
                   break;
                   break;
                 end;
                 end;
           end
           end
         else
         else
-          s:=s+procsym.realname+typename_paras(showhidden);
-        case proctypeoption of
-          potype_constructor:
-            s:='constructor '+s;
-          potype_destructor:
-            s:='destructor '+s;
-          potype_class_constructor:
-            s:='class constructor '+s;
-          potype_class_destructor:
-            s:='class destructor '+s;
-          else
-            if assigned(returndef) and
-              not(is_void(returndef)) then
-              s:=s+':'+returndef.GetTypeName;
-        end;
+          begin
+            if (po_classmethod in procoptions) and
+               not(pno_noclassmarker in pno) and
+               not (proctypeoption in [potype_class_constructor,potype_class_destructor]) then
+              s:='class ';
+            case proctypeoption of
+              potype_constructor:
+                s:=s+'constructor ';
+              potype_destructor:
+                s:=s+'destructor '+s;
+              potype_class_constructor:
+                s:=s+'class constructor ';
+              potype_class_destructor:
+                s:=s+'class destructor ';
+              else
+                if (pno_proctypeoption in pno) and
+                   assigned(returndef) and
+                   not(is_void(returndef)) then
+                  s:=s+'function '
+                else
+                  s:=s+'procedure ';
+            end;
+            if (pno_ownername in pno) and
+               (owner.symtabletype in [recordsymtable,objectsymtable]) then
+              s:=s+tabstractrecorddef(owner.defowner).RttiName+'.';
+            s:=s+procsym.realname+typename_paras(pno);
+          end;
+        if not(proctypeoption in [potype_constructor,potype_destructor,
+             potype_class_constructor,potype_class_destructor]) and
+           assigned(returndef) and
+           not(is_void(returndef)) then
+          s:=s+':'+returndef.GetTypeName;
         if owner.symtabletype=localsymtable then
         if owner.symtabletype=localsymtable then
           s:=s+' is nested';
           s:=s+' is nested';
         s:=s+';';
         s:=s+';';
@@ -3825,7 +3857,7 @@ implementation
         if (po_staticmethod in procoptions) and
         if (po_staticmethod in procoptions) and
            not (proctypeoption in [potype_class_constructor,potype_class_destructor]) then
            not (proctypeoption in [potype_class_constructor,potype_class_destructor]) then
           s:=s+' Static;';
           s:=s+' Static;';
-        fullprocname:=s;
+        customprocname:=s;
       end;
       end;
 
 
 
 
@@ -4441,12 +4473,12 @@ implementation
     function tprocvardef.GetTypeName : string;
     function tprocvardef.GetTypeName : string;
       var
       var
         s: string;
         s: string;
-        showhidden : boolean;
+        pno : tprocnameoptions;
       begin
       begin
 {$ifdef EXTDEBUG}
 {$ifdef EXTDEBUG}
-         showhidden:=true;
+         pno:=[pno_showhidden];
 {$else EXTDEBUG}
 {$else EXTDEBUG}
-         showhidden:=false;
+         pno:=[];
 {$endif EXTDEBUG}
 {$endif EXTDEBUG}
          s:='<';
          s:='<';
          if po_classmethod in procoptions then
          if po_classmethod in procoptions then
@@ -4458,9 +4490,9 @@ implementation
              s := s+'procedure variable type of';
              s := s+'procedure variable type of';
          if assigned(returndef) and
          if assigned(returndef) and
             (returndef<>voidtype) then
             (returndef<>voidtype) then
-           s:=s+' function'+typename_paras(showhidden)+':'+returndef.GetTypeName
+           s:=s+' function'+typename_paras(pno)+':'+returndef.GetTypeName
          else
          else
-           s:=s+' procedure'+typename_paras(showhidden);
+           s:=s+' procedure'+typename_paras(pno);
          if po_methodpointer in procoptions then
          if po_methodpointer in procoptions then
            s := s+' of object';
            s := s+' of object';
          if is_nested_pd(self) then
          if is_nested_pd(self) then