203
219
result.Append ("add");
204
220
generator.AppendBraceStart (result, generator.policy.EventAddBraceStyle);
205
221
generator.AppendIndent (result);
206
result.AppendLine ("// TODO");
222
result.Append ("// TODO");
223
generator.AppendLine (result);
207
224
generator.AppendBraceEnd (result, generator.policy.EventAddBraceStyle);
209
226
generator.AppendIndent (result);
210
227
result.Append ("remove");
211
228
generator.AppendBraceStart (result, generator.policy.EventRemoveBraceStyle);
212
229
generator.AppendIndent (result);
213
result.AppendLine ("// TODO");
230
result.Append ("// TODO");
231
generator.AppendLine (result);
214
233
generator.AppendBraceEnd (result, generator.policy.EventRemoveBraceStyle);
215
234
generator.AppendBraceEnd (result, generator.policy.EventBraceStyle);
270
289
AppendParameterList (result, options.ImplementingType, method.Parameters);
271
290
result.Append (")");
273
generator.AppendBraceStart (result, generator.policy.MethodBraceStyle);
274
if (method.Name == "ToString" && (method.Parameters == null || method.Parameters.Count == 0) && method.ReturnType != null && method.ReturnType.FullName == "System.String") {
275
generator.AppendIndent (result);
276
bodyStartOffset = result.Length;
277
result.Append ("return string.Format");
278
if (generator.policy.BeforeMethodDeclarationParentheses)
280
result.Append ("(\"[");
281
result.Append (options.ImplementingType.Name);
282
if (options.ImplementingType.PropertyCount > 0)
283
result.Append (": ");
285
foreach (IProperty property in options.ImplementingType.Properties) {
286
if (property.IsStatic || !property.IsPublic)
289
result.Append (", ");
290
result.Append (property.Name);
291
result.Append ("={");
295
result.Append ("]\"");
296
foreach (IProperty property in options.ImplementingType.Properties) {
297
if (property.IsStatic || !property.IsPublic)
299
result.Append (", ");
300
result.Append (property.Name);
302
result.Append (");");
303
bodyEndOffset = result.Length;
304
result.AppendLine ();
305
} else if (IsMonoTouchModelMember (method)) {
306
AppendMonoTouchTodo (result, out bodyStartOffset, out bodyEndOffset);
307
} else if (method.IsAbstract || method.DeclaringType.ClassType == ClassType.Interface) {
308
AppendNotImplementedException (result, options, out bodyStartOffset, out bodyEndOffset);
310
generator.AppendIndent (result);
311
bodyStartOffset = result.Length;
312
if (method.ReturnType.FullName != DomReturnType.Void.FullName)
313
result.Append ("return ");
314
result.Append ("base.");
315
result.Append (method.Name);
316
if (generator.policy.BeforeMethodCallParentheses)
319
for (int i = 0; i < method.Parameters.Count; i++) {
292
var typeParameters = method.TypeParameters;
293
if (typeParameters.Any (p => p.Constraints.Any () || (p.TypeParameterModifier & TypeParameterModifier.HasDefaultConstructorConstraint) != 0)) {
294
result.Append (" where ");
295
int typeParameterCount = 0;
296
foreach (var p in typeParameters) {
297
if (!p.Constraints.Any () && (p.TypeParameterModifier & TypeParameterModifier.HasDefaultConstructorConstraint) == 0)
299
if (typeParameterCount != 0)
321
300
result.Append (", ");
323
var p = method.Parameters[i];
325
result.Append ("out ");
327
result.Append ("ref ");
302
typeParameterCount++;
328
303
result.Append (p.Name);
330
result.Append (");");
331
bodyEndOffset = result.Length;
332
result.AppendLine ();
334
generator.AppendBraceEnd (result, generator.policy.MethodBraceStyle);
304
result.Append (" : ");
305
int constraintCount = 0;
307
if ((p.TypeParameterModifier & TypeParameterModifier.HasDefaultConstructorConstraint) != 0) {
308
result.Append ("new ()");
311
foreach (var c in p.Constraints) {
312
if (constraintCount != 0)
313
result.Append (", ");
315
if (c.DecoratedFullName == DomReturnType.ValueType.DecoratedFullName) {
316
result.Append ("struct");
319
if (c.DecoratedFullName == DomReturnType.Object.DecoratedFullName) {
320
result.Append ("class");
323
AppendReturnType (result, options.ImplementingType, c);
328
if (options.ImplementingType.ClassType == ClassType.Interface) {
331
generator.AppendBraceStart (result, generator.policy.MethodBraceStyle);
332
if (method.Name == "ToString" && (method.Parameters == null || method.Parameters.Count == 0) && method.ReturnType != null && method.ReturnType.FullName == "System.String") {
333
generator.AppendIndent (result);
334
bodyStartOffset = result.Length;
335
result.Append ("return string.Format");
336
if (generator.policy.BeforeMethodDeclarationParentheses)
338
result.Append ("(\"[");
339
result.Append (options.ImplementingType.Name);
340
if (options.ImplementingType.PropertyCount > 0)
341
result.Append (": ");
343
foreach (IProperty property in options.ImplementingType.Properties) {
344
if (property.IsStatic || !property.IsPublic)
347
result.Append (", ");
348
result.Append (property.Name);
349
result.Append ("={");
353
result.Append ("]\"");
354
foreach (IProperty property in options.ImplementingType.Properties) {
355
if (property.IsStatic || !property.IsPublic)
357
result.Append (", ");
358
result.Append (property.Name);
360
result.Append (");");
361
bodyEndOffset = result.Length;
362
generator.AppendLine (result);
363
} else if (IsMonoTouchModelMember (method)) {
364
AppendMonoTouchTodo (result, out bodyStartOffset, out bodyEndOffset);
365
} else if (method.IsAbstract || !(method.IsVirtual || method.IsOverride) || method.DeclaringType.ClassType == ClassType.Interface) {
366
AppendNotImplementedException (result, options, out bodyStartOffset, out bodyEndOffset);
368
generator.AppendIndent (result);
369
bodyStartOffset = result.Length;
370
if (method.ReturnType.FullName != DomReturnType.Void.FullName)
371
result.Append ("return ");
372
result.Append ("base.");
373
result.Append (method.Name);
374
if (generator.policy.BeforeMethodCallParentheses)
377
for (int i = 0; i < method.Parameters.Count; i++) {
379
result.Append (", ");
381
var p = method.Parameters[i];
383
result.Append ("out ");
385
result.Append ("ref ");
386
result.Append (p.Name);
388
result.Append (");");
389
bodyEndOffset = result.Length;
390
generator.AppendLine (result);
392
generator.AppendBraceEnd (result, generator.policy.MethodBraceStyle);
335
394
return new CodeGeneratorMemberResult (result.ToString (), bodyStartOffset, bodyEndOffset);
357
416
static string GetModifiers (IType implementingType, IMember member)
359
if (member.IsPublic || member.DeclaringType.ClassType == ClassType.Interface)
361
if (member.IsPrivate)
418
StringBuilder result = new StringBuilder ();
419
if (member.IsPublic || (member.DeclaringType != null && member.DeclaringType.ClassType == ClassType.Interface)) {
420
result.Append ("public ");
421
} else if (member.IsProtectedAndInternal) {
422
result.Append ("protected internal ");
423
} else if (member.IsProtectedOrInternal && (member.DeclaringType != null && implementingType.SourceProjectDom == member.DeclaringType.SourceProjectDom)) {
424
result.Append ("internal protected ");
425
} else if (member.IsProtected) {
426
result.Append ("protected ");
427
} else if (member.IsInternal) {
428
result.Append ("internal ");
364
if (member.IsProtectedAndInternal)
365
return "protected internal ";
366
if (member.IsProtectedOrInternal && implementingType.SourceProjectDom == member.DeclaringType.SourceProjectDom)
367
return "internal protected ";
432
result.Append ("static ");
369
if (member.IsProtected)
371
if (member.IsInternal)
434
return result.ToString ();
377
437
void AppendModifiers (StringBuilder result, CSharpCodeGenerator.CodeGenerationOptions options, IMember member)
379
439
generator.AppendIndent (result);
380
if (options.ExplicitDeclaration)
440
if (options.ExplicitDeclaration || options.ImplementingType.ClassType == ClassType.Interface)
382
442
result.Append (GetModifiers (options.ImplementingType, member));
384
if ((member.Modifiers & Modifiers.Virtual) == Modifiers.Virtual ||
385
(member.Modifiers & Modifiers.Abstract) == Modifiers.Abstract)
444
bool isFromInterface = false;
445
if (member.DeclaringType != null && member.DeclaringType.ClassType == ClassType.Interface) {
446
isFromInterface = true;
447
if (options.ImplementingType != null) {
448
foreach (IType type in options.ImplementingType.SourceProjectDom.GetInheritanceTree (options.ImplementingType)) {
449
if (type.ClassType == ClassType.Interface)
451
if (type.SearchMember (member.Name, true).Any (m => m.Name == member.Name && member.MemberType == m.MemberType && DomMethod.ParameterListEquals (member.Parameters, m.Parameters))) {
452
isFromInterface = false;
458
if (!isFromInterface && ((member.Modifiers & Modifiers.Virtual) == Modifiers.Virtual ||
459
(member.Modifiers & Modifiers.Abstract) == Modifiers.Abstract))
386
460
result.Append ("override ");
409
483
int bodyStartOffset, bodyEndOffset;
410
484
generator.AppendIndent (result);
411
485
result.Append ("get");
412
generator.AppendBraceStart (result, generator.policy.PropertyGetBraceStyle);
413
if (IsMonoTouchModelMember (property)) {
414
AppendMonoTouchTodo (result, out bodyStartOffset, out bodyEndOffset);
415
} else if (property.IsAbstract || property.DeclaringType.ClassType == ClassType.Interface) {
416
AppendNotImplementedException (result, options, out bodyStartOffset, out bodyEndOffset);
486
if (options.ImplementingType.ClassType == ClassType.Interface) {
487
result.AppendLine (";");
418
generator.AppendIndent (result);
419
bodyStartOffset = result.Length;
420
result.Append ("return base.");
421
result.Append (property.Name);
423
bodyEndOffset = result.Length;
424
result.AppendLine ();
489
generator.AppendBraceStart (result, generator.policy.PropertyGetBraceStyle);
490
if (IsMonoTouchModelMember (property)) {
491
AppendMonoTouchTodo (result, out bodyStartOffset, out bodyEndOffset);
492
} else if (property.IsAbstract || property.DeclaringType.ClassType == ClassType.Interface) {
493
AppendNotImplementedException (result, options, out bodyStartOffset, out bodyEndOffset);
495
generator.AppendIndent (result);
496
bodyStartOffset = result.Length;
497
result.Append ("return base.");
498
result.Append (property.Name);
500
bodyEndOffset = result.Length;
501
generator.AppendLine (result);
503
generator.AppendBraceEnd (result, generator.policy.PropertyGetBraceStyle);
504
generator.AppendLine (result);
505
regions.Add (new CodeGeneratorBodyRegion (bodyStartOffset, bodyEndOffset));
426
generator.AppendBraceEnd (result, generator.policy.PropertyGetBraceStyle);
427
result.AppendLine ();
428
regions.Add (new CodeGeneratorBodyRegion (bodyStartOffset, bodyEndOffset));
431
509
if (property.HasSet) {
432
510
int bodyStartOffset, bodyEndOffset;
433
511
generator.AppendIndent (result);
434
512
result.Append ("set");
435
generator.AppendBraceStart (result, generator.policy.PropertyGetBraceStyle);
436
if (IsMonoTouchModelMember (property)) {
437
AppendMonoTouchTodo (result, out bodyStartOffset, out bodyEndOffset);
438
} else if (property.IsAbstract || property.DeclaringType.ClassType == ClassType.Interface) {
439
AppendNotImplementedException (result, options, out bodyStartOffset, out bodyEndOffset);
513
if (options.ImplementingType.ClassType == ClassType.Interface) {
514
result.AppendLine (";");
441
generator.AppendIndent (result);
442
bodyStartOffset = result.Length;
443
result.Append ("base.");
444
result.Append (property.Name);
445
result.Append (" = value;");
446
bodyEndOffset = result.Length;
447
result.AppendLine ();
516
generator.AppendBraceStart (result, generator.policy.PropertyGetBraceStyle);
517
if (IsMonoTouchModelMember (property)) {
518
AppendMonoTouchTodo (result, out bodyStartOffset, out bodyEndOffset);
519
} else if (property.IsAbstract || property.DeclaringType.ClassType == ClassType.Interface) {
520
AppendNotImplementedException (result, options, out bodyStartOffset, out bodyEndOffset);
522
generator.AppendIndent (result);
523
bodyStartOffset = result.Length;
524
result.Append ("base.");
525
result.Append (property.Name);
526
result.Append (" = value;");
527
bodyEndOffset = result.Length;
528
generator.AppendLine (result);
530
generator.AppendBraceEnd (result, generator.policy.PropertyGetBraceStyle);
531
generator.AppendLine (result);
532
regions.Add (new CodeGeneratorBodyRegion (bodyStartOffset, bodyEndOffset));
449
generator.AppendBraceEnd (result, generator.policy.PropertyGetBraceStyle);
450
result.AppendLine ();
451
regions.Add (new CodeGeneratorBodyRegion (bodyStartOffset, bodyEndOffset));
454
535
generator.AppendBraceEnd (result, generator.policy.PropertyBraceStyle);
455
536
return new CodeGeneratorMemberResult (result.ToString (), regions);