//
// 2002-2005 AlphaSierraPapa
// GNU General Public License
//
// $Revision$
//
using System;
using System.Diagnostics;
using System.Reflection;
using System.Collections;
using System.Collections.Generic;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
namespace ICSharpCode.SharpDevelop.Dom
{
///
/// A class made up of multiple partial classes.
///
public class CompoundClass : DefaultClass
{
List parts = new List();
///
/// Gets the parts this class is based on.
///
public List Parts {
get {
return parts;
}
}
///
/// Creates a new CompoundClass with the specified class as first part.
///
public CompoundClass(IClass firstPart) : base(firstPart.CompilationUnit, firstPart.FullyQualifiedName)
{
parts.Add(firstPart);
UpdateInformationFromParts();
}
///
/// Re-calculate information from class parts (Modifier, Base classes, Type parameters etc.)
///
public void UpdateInformationFromParts()
{
// Common for all parts:
this.ClassType = parts[0].ClassType;
ModifierEnum modifier = ModifierEnum.None;
this.BaseTypes.Clear();
this.TypeParameters.Clear();
this.Attributes.Clear();
foreach (IClass part in parts) {
modifier |= part.Modifiers;
this.BaseTypes.AddRange(part.BaseTypes);
this.TypeParameters.AddRange(part.TypeParameters);
this.Attributes.AddRange(part.Attributes);
}
this.Modifiers = modifier;
}
///
/// CompoundClass has a normal return type even though IsPartial is set.
///
protected override IReturnType CreateDefaultReturnType()
{
return new DefaultReturnType(this);
}
public override List InnerClasses {
get {
List l = new List();
foreach (IClass part in parts) {
l.AddRange(part.InnerClasses);
}
return l;
}
}
public override List Fields {
get {
List l = new List();
foreach (IClass part in parts) {
l.AddRange(part.Fields);
}
return l;
}
}
public override List Properties {
get {
List l = new List();
foreach (IClass part in parts) {
l.AddRange(part.Properties);
}
return l;
}
}
public override List Indexer {
get {
List l = new List();
foreach (IClass part in parts) {
l.AddRange(part.Indexer);
}
return l;
}
}
public override List Methods {
get {
List l = new List();
foreach (IClass part in parts) {
l.AddRange(part.Methods);
}
return l;
}
}
public override List Events {
get {
List l = new List();
foreach (IClass part in parts) {
l.AddRange(part.Events);
}
return l;
}
}
}
}