Changeset 211

Show
Ignore:
Timestamp:
07/06/06 16:10:13 (2 years ago)
Author:
Don Clugston
Message:

More refactoring of demangle.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/meta/demangle.d

    r210 r211  
    2929{ 
    3030    static if (wantQualifiedNames != MangledNameType.PrettyName) { 
    31         // Deal with symbolnameof!(), qualifiednameof!(). 
     31        // There are only a few types where symbolnameof!(), qualifiednameof!() 
     32        // make sense. 
    3233        static if (str[0]=='C' || str[0]=='S' || str[0]=='E' || str[0]=='T') 
    3334            const char [] demangleType = prettyLname!(str[1..$], wantQualifiedNames); 
    34         else static assert(0, "Demangle error: type '" ~ str ~ "' does not contain a qualified name"); 
     35        else { 
     36            static assert(0, "Demangle error: type '" ~ str ~ "' does not contain a qualified name"); 
     37        }         
    3538    } else static if (str[0] == 'A') // dynamic array 
    3639        const char [] demangleType = demangleType!(str[1..$], wantQualifiedNames) ~ "[]"; 
     
    239242    else static if (str.length>2 && str[0]=='_' && str[1]=='D') 
    240243        const char [] getDotName = getQualifiedName!(str[2..$], wantQualifiedNames); 
    241     else static if (isdigit!(( str[0] ))) { 
    242         static if (str[getLnameConsumed!(str)..$].length>0) { 
     244    else { 
     245        static assert (isdigit!(( str[0] ))); 
     246        static if ( getLnameConsumed!(str) < str.length && isdigit!(( str[getLnameConsumed!(str)] ))) { 
    243247            static if (wantQualifiedNames == MangledNameType.SymbolName) { 
    244                 static if (getLnameConsumed!(str)==str.length) { 
    245                     const char [] getQualifiedName = prettyLname!(getLname!(str), wantQualifiedNames); 
    246                 } else static if ( isdigit!(( str[getLnameConsumed!(str)] ))) { 
    247                     const char [] getQualifiedName = 
    248                         getQualifiedName!(str[getLnameConsumed!(str) .. $], wantQualifiedNames, ""); 
    249                 } else { 
    250                     const char [] getQualifiedName = prettyLname!(getLname!(str), wantQualifiedNames); 
    251                 } 
     248                // For symbol names, only display the last symbol 
     249                const char [] getQualifiedName = 
     250                    getQualifiedName!(str[getLnameConsumed!(str) .. $], wantQualifiedNames, ""); 
    252251            } else { 
    253                 // Qualified and pretty names 
     252                // Qualified and pretty names display everything 
    254253                const char [] getQualifiedName = dotstr 
    255254                    ~ prettyLname!(getLname!(str), wantQualifiedNames) 
     
    259258            const char [] getQualifiedName = dotstr ~ prettyLname!(getLname!(str), wantQualifiedNames); 
    260259        } 
    261     } else const char [] getQualifiedName = ""; 
    262 
    263  
    264 // BUG: This isn't correct. It's making getQualifiedName() unnecessarily complicated. 
     260    } 
     261
     262 
    265263template getQualifiedNameConsumed (char [] str) 
    266264{ 
    267265    static if (str.length>1 &&  isdigit!(( str[0] )) ) { 
    268         static if (getLnameConsumed!(str) <= str.length) { 
     266        static if (getLnameConsumed!(str) < str.length && isdigit!(( str[getLnameConsumed!(str)] ))) { 
    269267            const int getQualifiedNameConsumed = getLnameConsumed!(str) 
    270268                + getQualifiedNameConsumed!(str[getLnameConsumed!(str) .. $]); 
    271269        } else { 
    272             const int getQualifiedNameConsumed = str.length
     270            const int getQualifiedNameConsumed = getLnameConsumed!(str)
    273271        } 
    274272    } else static if (str.length>1 && str[0]=='_' && str[1]=='D') { 
    275273        const int getQualifiedNameConsumed = get_DnameConsumed!(str) 
    276274            + getQualifiedNameConsumed!(str[get_DnameConsumed!(str)..$]); 
    277     } else const int getQualifiedNameConsumed=0
     275    } else static assert(0)
    278276} 
    279277