~ubuntu-branches/ubuntu/oneiric/monodevelop/oneiric-updates

« back to all changes in this revision

Viewing changes to src/addins/CSharpBinding/CSharpAmbience.cs

  • Committer: Bazaar Package Importer
  • Author(s): Jo Shields
  • Date: 2009-02-18 08:40:51 UTC
  • mfrom: (1.2.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20090218084051-gh8m6ukvokbwj7cf
Tags: 1.9.2+dfsg-1ubuntu1
* Merge from Debian Experimental (LP: #330519), remaining Ubuntu changes:
  + debian/control:
    - Update for Gnome# 2.24
    - Add libmono-cairo1.0-cil to build-deps to fool pkg-config check

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
//  CSharpAmbience.cs
2
 
//
3
 
//  This file was derived from a file from #Develop. 
4
 
//
5
 
//  Copyright (C) 2001-2007 Mike Krüger <mkrueger@novell.com>
6
 
// 
7
 
//  This program is free software; you can redistribute it and/or modify
8
 
//  it under the terms of the GNU General Public License as published by
9
 
//  the Free Software Foundation; either version 2 of the License, or
10
 
//  (at your option) any later version.
11
 
// 
12
 
//  This program is distributed in the hope that it will be useful,
13
 
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
 
//  GNU General Public License for more details.
16
 
//  
17
 
//  You should have received a copy of the GNU General Public License
18
 
//  along with this program; if not, write to the Free Software
19
 
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
 
 
21
 
using System;
22
 
using System.Collections;
23
 
using System.Text;
24
 
 
25
 
using MonoDevelop.Projects.Parser;
26
 
using MonoDevelop.Core;
27
 
using MonoDevelop.Projects.Ambience;
28
 
 
29
 
namespace CSharpBinding
30
 
{
31
 
        public class CSharpAmbience : Ambience
32
 
        {
33
 
                static string[,] typeConversionList = new string[,] {
34
 
                        {"System.Void",    "void"},
35
 
                        {"System.Object",  "object"},
36
 
                        {"System.Boolean", "bool"},
37
 
                        {"System.Byte",    "byte"},
38
 
                        {"System.SByte",   "sbyte"},
39
 
                        {"System.Char",    "char"},
40
 
                        {"System.Enum",    "enum"},
41
 
                        {"System.Int16",   "short"},
42
 
                        {"System.Int32",   "int"},
43
 
                        {"System.Int64",   "long"},
44
 
                        {"System.UInt16",  "ushort"},
45
 
                        {"System.UInt32",  "uint"},
46
 
                        {"System.UInt64",  "ulong"},
47
 
                        {"System.Single",  "float"},
48
 
                        {"System.Double",  "double"},
49
 
                        {"System.Decimal", "decimal"},
50
 
                        {"System.String",  "string"}
51
 
                };
52
 
                
53
 
                static Hashtable typeConversionTable = new Hashtable();
54
 
                
55
 
                public static Hashtable TypeConversionTable {
56
 
                        get {
57
 
                                return typeConversionTable;
58
 
                        }
59
 
                }
60
 
                
61
 
                static CSharpAmbience()
62
 
                {
63
 
                        for (int i = 0; i < typeConversionList.GetLength(0); ++i) {
64
 
                                typeConversionTable[typeConversionList[i, 0]] = typeConversionList[i, 1];
65
 
                        }
66
 
                }
67
 
                
68
 
                bool ModifierIsSet(ModifierEnum modifier, ModifierEnum query)
69
 
                {
70
 
                        return (modifier & query) == query;
71
 
                }
72
 
                
73
 
                public override string Convert (ModifierEnum modifier, ConversionFlags conversionFlags)
74
 
                {
75
 
                        if (ShowAccessibility(conversionFlags)) {
76
 
                                if (ModifierIsSet(modifier, ModifierEnum.Public)) {
77
 
                                        return "public ";
78
 
                                } else if (ModifierIsSet(modifier, ModifierEnum.Private)) {
79
 
                                        return "private ";
80
 
                                } else if (ModifierIsSet(modifier, ModifierEnum.ProtectedAndInternal)) {
81
 
                                        return "protected internal ";
82
 
                                } else if (ModifierIsSet(modifier, ModifierEnum.ProtectedOrInternal)) {
83
 
                                        return "internal protected ";
84
 
                                } else if (ModifierIsSet(modifier, ModifierEnum.Internal)) {
85
 
                                        return "internal ";
86
 
                                } else if (ModifierIsSet(modifier, ModifierEnum.Protected)) {
87
 
                                        return "protected ";
88
 
                                }
89
 
                        }
90
 
                        
91
 
                        return string.Empty;
92
 
                }
93
 
                
94
 
                string GetModifier(IDecoration decoration, ConversionFlags conversionFlags)
95
 
                {       
96
 
                        string mod;
97
 
                        
98
 
                        if (decoration.IsStatic)        mod = "static ";
99
 
                        else if (decoration.IsFinal)    mod = "final ";
100
 
                        else if (decoration.IsVirtual)  mod = "virtual ";
101
 
                        else if (decoration.IsOverride) mod = "override ";
102
 
                        else if (decoration.IsNew)      mod = "new ";
103
 
                        else return "";
104
 
                        
105
 
                        if (IncludeHTMLMarkup(conversionFlags) | IncludePangoMarkup(conversionFlags))
106
 
                                return "<i>" + mod + "</i>";
107
 
                        else
108
 
                                return mod;
109
 
                }
110
 
                
111
 
                string ConvertTypeName (string typeName, ConversionFlags conversionFlags, ITypeNameResolver resolver)
112
 
                {
113
 
                        int p = typeName.IndexOf ('`');
114
 
                        if (p == -1)
115
 
                                return GetResolvedTypeName (typeName, conversionFlags, resolver);
116
 
 
117
 
                        StringBuilder res = new StringBuilder (GetResolvedTypeName (typeName.Substring (0, p), conversionFlags, resolver));
118
 
                        int i = typeName.IndexOf ('[', p);
119
 
                        if (i == -1)
120
 
                                return typeName.Substring (0, p);
121
 
 
122
 
                        if (!ParseGenericParamList (res, typeName, ref i, conversionFlags, resolver))
123
 
                                return typeName;
124
 
                        
125
 
                        res.Append (typeName.Substring (i));
126
 
                        return res.ToString ();
127
 
                }
128
 
                
129
 
                bool ParseTypeName (StringBuilder res, string str, ref int i, ConversionFlags conversionFlags, ITypeNameResolver resolver)
130
 
                {
131
 
                        int p = str.IndexOfAny (new char [] { '`', ',', '*', '[', ']'}, i);
132
 
                        if (p == -1)
133
 
                                return false;
134
 
                        
135
 
                        res.Append (GetResolvedTypeName (str.Substring (i, p - i), conversionFlags, resolver));
136
 
                        while (true) {
137
 
                                char c = str [p];
138
 
                                if (c == '`') {
139
 
                                        // It's a generic type
140
 
                                        i = str.IndexOf ('[', p);
141
 
                                        if (i == -1) return false;
142
 
                                        return ParseGenericParamList (res, str, ref i, conversionFlags, resolver);
143
 
                                }
144
 
                                else if (c == ',' || c == ']') {
145
 
                                        // end of name
146
 
                                        i = p;
147
 
                                        return true;
148
 
                                }
149
 
                                else if (c == '[') {
150
 
                                        // It's an array, skip it and continue searching
151
 
                                        i = str.IndexOf (']', p + 1);
152
 
                                        if (i == -1) return false;
153
 
                                        res.Append (str, p, i - p + 1);
154
 
                                        p = i + 1;
155
 
                                }
156
 
                                else if (c == '*') {
157
 
                                        // It's an array, skip it and continue searching
158
 
                                        res.Append (c);
159
 
                                        p++;
160
 
                                }
161
 
                                else
162
 
                                        return false;
163
 
                        }
164
 
                }
165
 
                
166
 
                bool ParseGenericParamList (StringBuilder res, string str, ref int i, ConversionFlags conversionFlags, ITypeNameResolver resolver)
167
 
                {
168
 
                        // Parses a list of generic parameters (including the brackets)
169
 
                        
170
 
                        bool includeMarkup = IncludeHTMLMarkup (conversionFlags) || IncludePangoMarkup (conversionFlags);
171
 
                        res.Append ((includeMarkup) ? "&lt;" : "<");
172
 
 
173
 
                        int p = i + 1;
174
 
                        while (p < str.Length && str [p] != ']') {
175
 
                                if (!ParseTypeName (res, str, ref p, conversionFlags, resolver))
176
 
                                        return false;
177
 
                                if (str [p] == ',') {
178
 
                                        res.Append (',');
179
 
                                        p++;
180
 
                                }
181
 
                        }
182
 
                        res.Append ((includeMarkup) ? "&gt;" : ">");
183
 
                        i = p + 1;
184
 
                        return true;
185
 
                }
186
 
                
187
 
                public override string Convert (IClass c, ConversionFlags conversionFlags, ITypeNameResolver resolver)
188
 
                {
189
 
                        StringBuilder builder = new StringBuilder();
190
 
                        
191
 
                        builder.Append (Convert (c.Modifiers, conversionFlags));
192
 
                        
193
 
                        if (ShowClassModifiers(conversionFlags)) {
194
 
                                if (c.IsSealed) {
195
 
                                        switch (c.ClassType) {
196
 
                                                case ClassType.Delegate:
197
 
                                                case ClassType.Struct:
198
 
                                                case ClassType.Enum:
199
 
                                                        break;
200
 
                                                
201
 
                                                default:
202
 
                                                        AppendPangoHtmlTag (builder, "sealed ", "i", conversionFlags);
203
 
                                                        break;
204
 
                                        }
205
 
                                } else if (c.IsAbstract && c.ClassType != ClassType.Interface) {
206
 
                                        AppendPangoHtmlTag (builder, "abstract ", "i", conversionFlags);
207
 
                                }
208
 
                        }
209
 
                        
210
 
                        if (ShowClassModifiers(conversionFlags)) {
211
 
                                switch (c.ClassType) {
212
 
                                        case ClassType.Delegate:
213
 
                                                builder.Append("delegate");
214
 
                                                // Only display the return type when modifiers are to be
215
 
                                                // shown - this fixes the vay delegates are shown in the
216
 
                                                // popup window
217
 
                                                if (c.Methods.Count > 0) {
218
 
                                                        foreach(IMethod m in c.Methods) {
219
 
                                                                if (m.Name != "Invoke") continue;
220
 
                                                                builder.Append (' ');
221
 
                                                                builder.Append (Convert (m.ReturnType, ConversionFlags.None, resolver));
222
 
                                                        }
223
 
                                                }
224
 
                                                break;
225
 
                                        case ClassType.Class:
226
 
                                                builder.Append("class");
227
 
                                                break;
228
 
                                        case ClassType.Struct:
229
 
                                                builder.Append("struct");
230
 
                                                break;
231
 
                                        case ClassType.Interface:
232
 
                                                builder.Append("interface");
233
 
                                                break;
234
 
                                        case ClassType.Enum:
235
 
                                                builder.Append("enum");
236
 
                                                break;
237
 
                                }
238
 
                                builder.Append(' ');
239
 
                        }
240
 
                        
241
 
                        string name;
242
 
                        if (UseFullyQualifiedMemberNames (conversionFlags) || (UseIntrinsicTypeNames (conversionFlags) && typeConversionTable.Contains (c.FullyQualifiedName)))
243
 
                                name = c.FullyQualifiedName;
244
 
                        else
245
 
                                name = c.Name;
246
 
                        AppendPangoHtmlTag (builder, ConvertTypeName (name, conversionFlags, resolver), "b", conversionFlags);
247
 
                        
248
 
                        // Display generic parameters only if told so
249
 
                        if (ShowGenericParameters(conversionFlags) && c.GenericParameters != null && c.GenericParameters.Count > 0) {
250
 
                                bool includeMarkup = IncludeHTMLMarkup(conversionFlags) || IncludePangoMarkup(conversionFlags);
251
 
                                builder.Append ((includeMarkup) ? "&lt;" : "<");
252
 
                                // Since we know that there is at least one generic parameter in
253
 
                                // the list, we can add it outside the loop - so, we don't have
254
 
                                // to check whether we may append a comma or not
255
 
                                builder.Append (c.GenericParameters[0].Name);
256
 
                                // Now continue with the others, if there are any
257
 
                                for (int i = 1; i < c.GenericParameters.Count; i++) {
258
 
                                        builder.Append (", ");
259
 
                                        builder.Append (c.GenericParameters[i].Name);
260
 
                                }
261
 
                                builder.Append ((includeMarkup) ? "&gt;" : ">");
262
 
                        }
263
 
                        
264
 
                        if (c.ClassType == ClassType.Delegate && ShowClassModifiers (conversionFlags)) {
265
 
                                builder.Append(" (");
266
 
                                if (IncludeHTMLMarkup(conversionFlags)) builder.Append("<br>");
267
 
                                
268
 
                                foreach(IMethod m in c.Methods) {
269
 
                                        if (m.Name != "Invoke") continue;
270
 
                                        
271
 
                                        for (int i = 0; i < m.Parameters.Count; ++i) {
272
 
                                                if (IncludeHTMLMarkup(conversionFlags)) builder.Append("&nbsp;&nbsp;&nbsp;");
273
 
                                                
274
 
                                                builder.Append (Convert (m.Parameters[i], conversionFlags, resolver));
275
 
                                                if (i + 1 < m.Parameters.Count) builder.Append(", ");
276
 
                                                
277
 
                                                if (IncludeHTMLMarkup(conversionFlags)) builder.Append("<br>");
278
 
                                        }
279
 
                                }
280
 
                                builder.Append(')');
281
 
                                
282
 
                        } else if (ShowInheritanceList(conversionFlags) && c.ClassType != ClassType.Enum) {
283
 
                                if (c.BaseTypes.Count > 0) {
284
 
                                        builder.Append (" : ");
285
 
                                        builder.Append (Convert (c.BaseTypes[0], ConversionFlags.None, resolver));
286
 
                                        for (int i = 1; i < c.BaseTypes.Count; ++i) {
287
 
                                                builder.Append (", ");
288
 
                                                builder.Append (Convert (c.BaseTypes[i], ConversionFlags.None, resolver));
289
 
                                        }
290
 
                                }
291
 
                        }
292
 
                        
293
 
                        if (IncludeBodies(conversionFlags)) {
294
 
                                builder.Append("\n{");
295
 
                        }
296
 
                        
297
 
                        return builder.ToString();              
298
 
                }
299
 
                
300
 
                public override string ConvertEnd(IClass c, ConversionFlags conversionFlags)
301
 
                {
302
 
                        return "}";
303
 
                }
304
 
                
305
 
                public override string Convert (IField field, ConversionFlags conversionFlags, ITypeNameResolver resolver)
306
 
                {
307
 
                        StringBuilder builder = new StringBuilder();
308
 
                        
309
 
                        builder.Append (Convert (field.Modifiers, conversionFlags));
310
 
                        
311
 
                        if (ShowMemberModifiers(conversionFlags)) {
312
 
                                if (field.IsStatic && field.IsLiteral)
313
 
                                        AppendPangoHtmlTag (builder, "const ", "i", conversionFlags);
314
 
                                else if (field.IsStatic)
315
 
                                        AppendPangoHtmlTag (builder, "static ", "i", conversionFlags);
316
 
                                
317
 
                                if (field.IsReadonly) {
318
 
                                        AppendPangoHtmlTag (builder, "readonly ", "i", conversionFlags);
319
 
                                }
320
 
                        }
321
 
                        
322
 
                        if (field.ReturnType != null && ShowReturnType (conversionFlags)) {
323
 
                                builder.Append (Convert (field.ReturnType, conversionFlags, resolver));
324
 
                                builder.Append (' ');
325
 
                        }
326
 
                        
327
 
                        if (UseFullyQualifiedMemberNames(conversionFlags))
328
 
                                AppendPangoHtmlTag (builder, ConvertTypeName (field.FullyQualifiedName, conversionFlags, null), "b", conversionFlags);
329
 
                        else
330
 
                                AppendPangoHtmlTag (builder, field.Name, "b", conversionFlags);
331
 
                        
332
 
                        if (IncludeBodies(conversionFlags))
333
 
                                builder.Append(";");
334
 
                        
335
 
                        return builder.ToString();                      
336
 
                }
337
 
                
338
 
                public override string Convert (IProperty property, ConversionFlags conversionFlags, ITypeNameResolver resolver)
339
 
                {
340
 
                        StringBuilder builder = new StringBuilder();
341
 
                        
342
 
                        builder.Append (Convert (property.Modifiers, conversionFlags));
343
 
                        
344
 
                        if (ShowMemberModifiers(conversionFlags)) {
345
 
                                builder.Append(GetModifier(property, conversionFlags));
346
 
                        }
347
 
                        
348
 
                        if (property.ReturnType != null && ShowReturnType (conversionFlags)) {
349
 
                                builder.Append (Convert (property.ReturnType, conversionFlags, resolver));
350
 
                                builder.Append(' ');
351
 
                        }
352
 
                        
353
 
                        if (UseFullyQualifiedMemberNames(conversionFlags))
354
 
                                AppendPangoHtmlTag (builder, ConvertTypeName (property.FullyQualifiedName, conversionFlags, null), "b", conversionFlags);
355
 
                        else
356
 
                                AppendPangoHtmlTag (builder, property.Name, "b", conversionFlags);
357
 
                        
358
 
                        if (property.Parameters.Count > 0 && ShowParameters (conversionFlags)) {
359
 
                                builder.Append(" (");
360
 
 
361
 
                                if (IncludeHTMLMarkup(conversionFlags)) builder.Append("<br>&nbsp;&nbsp;&nbsp;");
362
 
                                builder.Append (Convert (property.Parameters[0], conversionFlags, resolver));
363
 
                        
364
 
                                for (int i = 0; i < property.Parameters.Count; ++i) {
365
 
                                        if (IncludeHTMLMarkup(conversionFlags)) builder.Append("<br>&nbsp;&nbsp;&nbsp;");
366
 
                                        builder.Append(", ");
367
 
                                        builder.Append (Convert (property.Parameters[i], conversionFlags, resolver));
368
 
                                }
369
 
                                if (IncludeHTMLMarkup(conversionFlags)) builder.Append("<br>");
370
 
                                
371
 
                                builder.Append(')');
372
 
                        }
373
 
                        
374
 
                        if (IncludeBodies(conversionFlags)) {
375
 
                                builder.Append(" { ");
376
 
                                
377
 
                                if (property.CanGet) {
378
 
                                        builder.Append("get; ");
379
 
                                }
380
 
                                if (property.CanSet) {
381
 
                                        builder.Append("set; ");
382
 
                                }
383
 
                                
384
 
                                builder.Append(" } ");
385
 
                        }
386
 
                        return builder.ToString();
387
 
                }
388
 
                
389
 
                public override string Convert (IEvent e, ConversionFlags conversionFlags, ITypeNameResolver resolver)
390
 
                {
391
 
                        StringBuilder builder = new StringBuilder();
392
 
                        
393
 
                        builder.Append (Convert (e.Modifiers, conversionFlags));
394
 
                        
395
 
                        if (ShowMemberModifiers(conversionFlags)) {
396
 
                                builder.Append(GetModifier(e, conversionFlags));
397
 
                        }
398
 
                        
399
 
                        if (e.ReturnType != null && ShowReturnType (conversionFlags)) {
400
 
                                builder.Append (Convert (e.ReturnType, conversionFlags, resolver));
401
 
                                builder.Append (' ');
402
 
                        }
403
 
                        
404
 
                        if (UseFullyQualifiedMemberNames(conversionFlags))
405
 
                                AppendPangoHtmlTag (builder, ConvertTypeName (e.FullyQualifiedName, conversionFlags, null), "b", conversionFlags);
406
 
                        else
407
 
                                AppendPangoHtmlTag (builder, e.Name, "b", conversionFlags);
408
 
                        
409
 
                        if (IncludeBodies(conversionFlags)) builder.Append(";");
410
 
                        
411
 
                        return builder.ToString();
412
 
                }
413
 
                
414
 
                public override string Convert (IIndexer m, ConversionFlags conversionFlags, ITypeNameResolver resolver)
415
 
                {
416
 
                        StringBuilder builder = new StringBuilder();
417
 
                        builder.Append (Convert (m.Modifiers, conversionFlags));
418
 
                        
419
 
                        if (ShowMemberModifiers(conversionFlags) && m.IsStatic)
420
 
                                AppendPangoHtmlTag (builder, "static", "i", conversionFlags);
421
 
                        
422
 
                        if (m.ReturnType != null && ShowReturnType (conversionFlags)) {
423
 
                                builder.Append (Convert (m.ReturnType, conversionFlags, resolver));
424
 
                                builder.Append(' ');
425
 
                        }
426
 
                        
427
 
                        if (UseFullyQualifiedMemberNames (conversionFlags))
428
 
                                AppendPangoHtmlTag (builder, ConvertTypeName (m.FullyQualifiedName, conversionFlags, null), "b", conversionFlags);
429
 
                        else
430
 
                                AppendPangoHtmlTag (builder, ConvertTypeName (m.Name, conversionFlags, null), "b", conversionFlags);
431
 
                        
432
 
                        builder.Append(" [");
433
 
                        
434
 
                        Convert (m.Parameters, builder, conversionFlags, resolver);
435
 
                        
436
 
                        builder.Append(']');
437
 
                        
438
 
                        if (IncludeBodies(conversionFlags)) builder.Append(";");
439
 
                        
440
 
                        return builder.ToString();
441
 
                }
442
 
                
443
 
                public void Convert (ParameterCollection parameters, StringBuilder builder, ConversionFlags conversionFlags)
444
 
                {
445
 
                        Convert (parameters, builder, conversionFlags, null);
446
 
                }
447
 
                
448
 
                public void Convert (ParameterCollection parameters, StringBuilder builder, ConversionFlags conversionFlags, ITypeNameResolver resolver)
449
 
                {
450
 
                        if (parameters.Count > 0) {
451
 
                                for (int i = 0; i < parameters.Count; ++i) {
452
 
                                        if (i > 0)
453
 
                                                builder.Append (", ");
454
 
                                        if (IncludeHTMLMarkup(conversionFlags))
455
 
                                                builder.Append("<br>&nbsp;&nbsp;&nbsp;");
456
 
                                        builder.Append (Convert (parameters[i], conversionFlags, resolver));
457
 
                                }
458
 
                                if (IncludeHTMLMarkup(conversionFlags))
459
 
                                        builder.Append("<br>");
460
 
                        }
461
 
                }
462
 
                
463
 
                public override string Convert (IMethod m, ConversionFlags conversionFlags, ITypeNameResolver resolver)
464
 
                {
465
 
                        bool includeMarkup = IncludeHTMLMarkup(conversionFlags) || IncludePangoMarkup(conversionFlags);
466
 
                        
467
 
                        StringBuilder builder = new StringBuilder();
468
 
                        builder.Append (Convert (m.Modifiers, conversionFlags));
469
 
                        if (ShowMemberModifiers(conversionFlags)) {
470
 
                                builder.Append(GetModifier(m, conversionFlags));
471
 
                        }
472
 
                        
473
 
                        string name = m.Name;
474
 
                        
475
 
                        if (m.IsSpecialName && (name == "op_Implicit" || name == "op_Explicit")) {
476
 
                                // Conversion operators have a special signature
477
 
                                if (name == "op_Implicit")
478
 
                                        builder.Append("implicit operator ");
479
 
                                else
480
 
                                        builder.Append("explicit operator ");
481
 
                                AppendPangoHtmlTag (builder, Convert (m.ReturnType, conversionFlags, resolver), "b", conversionFlags);
482
 
                        }
483
 
                        else {
484
 
                        
485
 
                                if (m.ReturnType != null && ShowReturnType(conversionFlags)) {
486
 
                                        builder.Append (Convert (m.ReturnType, conversionFlags, resolver));
487
 
                                        builder.Append(' ');
488
 
                                }
489
 
                                
490
 
                                if (m.IsSpecialName) {
491
 
                                        name = GetSpecialMethodName (name);
492
 
                                        if (includeMarkup) {
493
 
                                                name = name.Replace ("<", "&lt;");
494
 
                                                name = name.Replace (">", "&gt;");
495
 
                                        }
496
 
                                }
497
 
                                
498
 
                                if (m.IsConstructor) {
499
 
                                        if (m.DeclaringType != null)
500
 
                                                AppendPangoHtmlTag (builder, ConvertTypeName (m.DeclaringType.Name, conversionFlags, null), "b", conversionFlags);
501
 
                                        else
502
 
                                                AppendPangoHtmlTag (builder, name, "b", conversionFlags);
503
 
                                } else {
504
 
                                        if (UseFullyQualifiedMemberNames(conversionFlags)) {
505
 
                                                string fq = m.DeclaringType.FullyQualifiedName + "." + name;
506
 
                                                AppendPangoHtmlTag (builder, ConvertTypeName (fq, conversionFlags, resolver), "b", conversionFlags);
507
 
                                        }
508
 
                                        else
509
 
                                                AppendPangoHtmlTag (builder, name, "b", conversionFlags);
510
 
                                }
511
 
                        }
512
 
                        
513
 
                        // Display generic parameters only if told so
514
 
                        if (ShowGenericParameters(conversionFlags) && m.GenericParameters != null && m.GenericParameters.Count > 0) {
515
 
                                builder.Append ((includeMarkup) ? "&lt;" : "<");
516
 
                                // Since we know that there is at least one generic parameter in
517
 
                                // the list, we can add it outside the loop - so, we don't have
518
 
                                // to check whether we may append a comma or not
519
 
                                builder.Append (m.GenericParameters[0].Name);
520
 
                                // Now continue with the others, if there are any
521
 
                                for (int i = 1; i < m.GenericParameters.Count; i++) {
522
 
                                        builder.Append (", ");
523
 
                                        builder.Append (m.GenericParameters[i].Name);
524
 
                                }
525
 
                                builder.Append ((includeMarkup) ? "&gt;" : ">");
526
 
                        }
527
 
                        
528
 
                        if (ShowParameters (conversionFlags)) {
529
 
                                builder.Append(" (");
530
 
                                Convert (m.Parameters, builder, conversionFlags, resolver);
531
 
                                builder.Append(')');
532
 
                        }
533
 
                        
534
 
                        if (IncludeBodies(conversionFlags)) {
535
 
                                if (m.DeclaringType != null) {
536
 
                                        if (m.DeclaringType.ClassType == ClassType.Interface) {
537
 
                                                builder.Append(";");
538
 
                                        } else {
539
 
                                                builder.Append(" {");
540
 
                                        }
541
 
                                } else {
542
 
                                        builder.Append(" {");
543
 
                                }
544
 
                        }
545
 
                        return builder.ToString();
546
 
                }
547
 
                
548
 
                string GetSpecialMethodName (string name)
549
 
                {
550
 
                        switch (name) {
551
 
                                case "op_UnaryPlus":
552
 
                                case "op_Addition": return "operator +";
553
 
                                case "op_Subtraction":
554
 
                                case "op_UnaryNegation": return "operator -";
555
 
                                case "op_Multiply": return "operator *";
556
 
                                case "op_Division": return "operator /";
557
 
                                case "op_Modulus": return "operator %";
558
 
                                case "op_LogicalNot": return "operator !";
559
 
                                case "op_BitwiseAnd": return "operator &";
560
 
                                case "op_BitwiseOr": return "operator |";
561
 
                                case "op_ExclusiveOr": return "operator ^";
562
 
                                case "op_LeftShift": return "operator <<";
563
 
                                case "op_RightShift": return "operator >>";
564
 
                                case "op_GreaterThan": return "operator >";
565
 
                                case "op_GreaterThanOrEqual": return "operator >=";
566
 
                                case "op_Equality": return "operator ==";
567
 
                                case "op_Inequality": return "operator !=";
568
 
                                case "op_LessThan": return "operator <";
569
 
                                case "op_LessThanOrEqual": return "operator <=";
570
 
                                case "op_Increment": return "operator ++";
571
 
                                case "op_Decrement": return "operator --";
572
 
                                case "op_True": return "operator true";
573
 
                                case "op_False": return "operator false";
574
 
                        }
575
 
                        return name;
576
 
                }
577
 
                
578
 
                public override string ConvertEnd(IMethod m, ConversionFlags conversionFlags)
579
 
                {
580
 
                        return "}";
581
 
                }
582
 
                
583
 
                public override string Convert (IReturnType returnType, ConversionFlags conversionFlags, ITypeNameResolver resolver)
584
 
                {
585
 
                        if (returnType == null) {
586
 
                                return String.Empty;
587
 
                        }
588
 
                        StringBuilder builder = new StringBuilder();
589
 
                        
590
 
                        //bool linkSet = false;
591
 
                        
592
 
                        //if (UseLinkArrayList(conversionFlags)) {
593
 
                                //SharpAssemblyReturnType ret = returnType as SharpAssemblyReturnType;
594
 
                                //if (ret != null) {
595
 
                                //      if (ret.UnderlyingClass != null) {
596
 
                                //              builder.Append("<a href='as://" + linkArrayList.Add(ret.UnderlyingClass) + "'>");
597
 
                                //              linkSet = true;
598
 
                                //      }
599
 
                                //}
600
 
                        //}
601
 
                        
602
 
                        if (UseIntrinsicTypeNames (conversionFlags) && typeConversionTable.Contains (returnType.FullyQualifiedName)) {
603
 
                                builder.Append (typeConversionTable[returnType.FullyQualifiedName].ToString());
604
 
                        } else {
605
 
                                if (UseFullyQualifiedMemberNames(conversionFlags)) {
606
 
                                        builder.Append (ConvertTypeName (returnType.FullyQualifiedName, conversionFlags, resolver));
607
 
                                } else {
608
 
                                        builder.Append (ConvertTypeName (returnType.Name, conversionFlags, resolver));
609
 
                                }
610
 
                        }
611
 
                        
612
 
                        // Display generic parameters only if told so
613
 
                        if (ShowGenericParameters(conversionFlags) && returnType.GenericArguments != null && returnType.GenericArguments.Count > 0) {
614
 
                                bool includeMarkup = IncludeHTMLMarkup(conversionFlags) || IncludePangoMarkup(conversionFlags);
615
 
                                builder.Append ((includeMarkup) ? "&lt;" : "<");
616
 
                                // Since we know that there is at least one generic argument in
617
 
                                // the list, we can add it outside the loop - so, we don't have
618
 
                                // to check whether we may append a comma or not
619
 
                                builder.Append (Convert (returnType.GenericArguments[0], conversionFlags, resolver));
620
 
                                // Now continue with the others, if there are any
621
 
                                for (int i = 1; i < returnType.GenericArguments.Count; i++) {
622
 
                                        builder.Append (", ");
623
 
                                        builder.Append (Convert (returnType.GenericArguments[i], conversionFlags, resolver));
624
 
                                }
625
 
                                builder.Append ((includeMarkup) ? "&gt;" : ">");
626
 
                        }
627
 
                        
628
 
//                      if (linkSet) {
629
 
//                              builder.Append("</a>");
630
 
//                      }
631
 
                        
632
 
                        for (int i = 0; i < returnType.PointerNestingLevel; ++i) {
633
 
                                builder.Append('*');
634
 
                        }
635
 
                        
636
 
                        for (int i = 0; i < returnType.ArrayCount; ++i) {
637
 
                                builder.Append('[');
638
 
                                for (int j = 1; j < returnType.ArrayDimensions[i]; ++j) {
639
 
                                        builder.Append(',');
640
 
                                }
641
 
                                builder.Append(']');
642
 
                        }
643
 
                        
644
 
                        return builder.ToString();
645
 
                }
646
 
                
647
 
                public override string Convert (IParameter param, ConversionFlags conversionFlags, ITypeNameResolver resolver)
648
 
                {
649
 
                        StringBuilder builder = new StringBuilder();
650
 
                        
651
 
                        if (param.IsRef)
652
 
                                AppendPangoHtmlTag (builder, "ref ", "i", conversionFlags);
653
 
                        else if (param.IsOut)
654
 
                                AppendPangoHtmlTag (builder, "out ", "i", conversionFlags);
655
 
                        else if (param.IsParams)
656
 
                                AppendPangoHtmlTag (builder, "params ", "i", conversionFlags);
657
 
 
658
 
                        builder.Append (Convert (param.ReturnType, conversionFlags, resolver));
659
 
                        
660
 
                        if (ShowParameterNames(conversionFlags)) {
661
 
                                builder.Append(' ');
662
 
                                AppendPangoHtmlTag (builder, param.Name, "b", conversionFlags);
663
 
                        }
664
 
                        return builder.ToString();
665
 
                }
666
 
 
667
 
                public override string Convert (LocalVariable localVariable, ConversionFlags conversionFlags, ITypeNameResolver resolver)
668
 
                {
669
 
                        StringBuilder builder = new StringBuilder();                                            
670
 
                        if (ShowReturnType (conversionFlags)) {
671
 
                                builder.Append (Convert (localVariable.ReturnType, conversionFlags, resolver));                                         
672
 
                                builder.Append(' ');
673
 
                        }
674
 
                        AppendPangoHtmlTag (builder, localVariable.Name, "b", conversionFlags);
675
 
                        
676
 
                        return builder.ToString();
677
 
                }
678
 
                
679
 
                // pango has some problems with
680
 
                // <i>static </i>bool <b>Equals</b> (<i></i>object a, <i></i>object b)
681
 
                // it will make "object a" italics. so rather tan appending a markup
682
 
                // tag if there might be a modifier, we only do it if there is.
683
 
                void AppendPangoHtmlTag (StringBuilder sb, string str, string tag, ConversionFlags conversionFlags)
684
 
                {
685
 
                        if (IncludeHTMLMarkup(conversionFlags) | IncludePangoMarkup(conversionFlags)) sb.Append ('<').Append (tag).Append ('>');
686
 
                        
687
 
                        sb.Append (str);
688
 
                        
689
 
                        if (IncludeHTMLMarkup(conversionFlags) | IncludePangoMarkup(conversionFlags)) sb.Append ("</").Append (tag).Append ('>');
690
 
                }
691
 
                
692
 
                public override string WrapAttribute(string attribute)
693
 
                {
694
 
                        return "[" + attribute + "]";
695
 
                }
696
 
                
697
 
                public override string WrapComment(string comment)
698
 
                {
699
 
                        return "// " + comment;
700
 
                }
701
 
 
702
 
                public override string GetIntrinsicTypeName (string dotNetTypeName)
703
 
                {
704
 
                        string tn = typeConversionTable [dotNetTypeName] as string;
705
 
                        if (tn != null)
706
 
                                return tn;
707
 
                        else
708
 
                                return dotNetTypeName;
709
 
                }
710
 
                
711
 
        }
712
 
}