|
|
|
@ -15,14 +15,20 @@ namespace ICSharpCode.SharpDevelop.Dom |
|
|
|
/// </summary>
|
|
|
|
/// </summary>
|
|
|
|
public class CompoundClass : DefaultClass |
|
|
|
public class CompoundClass : DefaultClass |
|
|
|
{ |
|
|
|
{ |
|
|
|
List<IClass> parts = new List<IClass>(); |
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// The parts this class is based on.
|
|
|
|
|
|
|
|
/// Requires manual locking!
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
internal List<IClass> parts = new List<IClass>(); |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|
/// Gets the parts this class is based on.
|
|
|
|
/// Gets the parts this class is based on. This method is thread-safe and
|
|
|
|
|
|
|
|
/// returns a copy of the list!
|
|
|
|
/// </summary>
|
|
|
|
/// </summary>
|
|
|
|
public List<IClass> Parts { |
|
|
|
public IList<IClass> GetParts() |
|
|
|
get { |
|
|
|
{ |
|
|
|
return parts; |
|
|
|
lock (this) { |
|
|
|
|
|
|
|
return parts.ToArray(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -38,7 +44,7 @@ namespace ICSharpCode.SharpDevelop.Dom |
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|
/// Re-calculate information from class parts (Modifier, Base classes, Type parameters etc.)
|
|
|
|
/// Re-calculate information from class parts (Modifier, Base classes, Type parameters etc.)
|
|
|
|
/// </summary>
|
|
|
|
/// </summary>
|
|
|
|
public void UpdateInformationFromParts() |
|
|
|
internal void UpdateInformationFromParts() |
|
|
|
{ |
|
|
|
{ |
|
|
|
// Common for all parts:
|
|
|
|
// Common for all parts:
|
|
|
|
this.ClassType = parts[0].ClassType; |
|
|
|
this.ClassType = parts[0].ClassType; |
|
|
|
@ -47,8 +53,8 @@ namespace ICSharpCode.SharpDevelop.Dom |
|
|
|
|
|
|
|
|
|
|
|
ModifierEnum modifier = ModifierEnum.None; |
|
|
|
ModifierEnum modifier = ModifierEnum.None; |
|
|
|
const ModifierEnum defaultClassVisibility = ModifierEnum.Internal; |
|
|
|
const ModifierEnum defaultClassVisibility = ModifierEnum.Internal; |
|
|
|
|
|
|
|
|
|
|
|
this.BaseTypes.Clear(); |
|
|
|
this.BaseTypes.Clear(); |
|
|
|
this.TypeParameters.Clear(); |
|
|
|
|
|
|
|
this.Attributes.Clear(); |
|
|
|
this.Attributes.Clear(); |
|
|
|
foreach (IClass part in parts) { |
|
|
|
foreach (IClass part in parts) { |
|
|
|
if ((part.Modifiers & ModifierEnum.VisibilityMask) != defaultClassVisibility) { |
|
|
|
if ((part.Modifiers & ModifierEnum.VisibilityMask) != defaultClassVisibility) { |
|
|
|
@ -61,9 +67,6 @@ namespace ICSharpCode.SharpDevelop.Dom |
|
|
|
this.BaseTypes.Add(rt); |
|
|
|
this.BaseTypes.Add(rt); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
foreach (ITypeParameter typeParam in part.TypeParameters) { |
|
|
|
|
|
|
|
this.TypeParameters.Add(typeParam); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
foreach (IAttribute attribute in part.Attributes) { |
|
|
|
foreach (IAttribute attribute in part.Attributes) { |
|
|
|
this.Attributes.Add(attribute); |
|
|
|
this.Attributes.Add(attribute); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -74,6 +77,23 @@ namespace ICSharpCode.SharpDevelop.Dom |
|
|
|
this.Modifiers = modifier; |
|
|
|
this.Modifiers = modifier; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
|
|
/// Type parameters are same on all parts
|
|
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
public override IList<ITypeParameter> TypeParameters { |
|
|
|
|
|
|
|
get { |
|
|
|
|
|
|
|
lock (this) { |
|
|
|
|
|
|
|
// Locking for the time of getting the reference to the sub-list is sufficient:
|
|
|
|
|
|
|
|
// Classes used for parts never change, instead the whole part is replaced with
|
|
|
|
|
|
|
|
// a new IClass instance.
|
|
|
|
|
|
|
|
return parts[0].TypeParameters; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
set { |
|
|
|
|
|
|
|
throw new NotSupportedException(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|
/// CompoundClass has a normal return type even though IsPartial is set.
|
|
|
|
/// CompoundClass has a normal return type even though IsPartial is set.
|
|
|
|
/// </summary>
|
|
|
|
/// </summary>
|
|
|
|
@ -84,51 +104,61 @@ namespace ICSharpCode.SharpDevelop.Dom |
|
|
|
|
|
|
|
|
|
|
|
public override List<IClass> InnerClasses { |
|
|
|
public override List<IClass> InnerClasses { |
|
|
|
get { |
|
|
|
get { |
|
|
|
List<IClass> l = new List<IClass>(); |
|
|
|
lock (this) { |
|
|
|
foreach (IClass part in parts) { |
|
|
|
List<IClass> l = new List<IClass>(); |
|
|
|
l.AddRange(part.InnerClasses); |
|
|
|
foreach (IClass part in parts) { |
|
|
|
|
|
|
|
l.AddRange(part.InnerClasses); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return l; |
|
|
|
} |
|
|
|
} |
|
|
|
return l; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public override List<IField> Fields { |
|
|
|
public override List<IField> Fields { |
|
|
|
get { |
|
|
|
get { |
|
|
|
List<IField> l = new List<IField>(); |
|
|
|
lock (this) { |
|
|
|
foreach (IClass part in parts) { |
|
|
|
List<IField> l = new List<IField>(); |
|
|
|
l.AddRange(part.Fields); |
|
|
|
foreach (IClass part in parts) { |
|
|
|
|
|
|
|
l.AddRange(part.Fields); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return l; |
|
|
|
} |
|
|
|
} |
|
|
|
return l; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public override List<IProperty> Properties { |
|
|
|
public override List<IProperty> Properties { |
|
|
|
get { |
|
|
|
get { |
|
|
|
List<IProperty> l = new List<IProperty>(); |
|
|
|
lock (this) { |
|
|
|
foreach (IClass part in parts) { |
|
|
|
List<IProperty> l = new List<IProperty>(); |
|
|
|
l.AddRange(part.Properties); |
|
|
|
foreach (IClass part in parts) { |
|
|
|
|
|
|
|
l.AddRange(part.Properties); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return l; |
|
|
|
} |
|
|
|
} |
|
|
|
return l; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public override List<IMethod> Methods { |
|
|
|
public override List<IMethod> Methods { |
|
|
|
get { |
|
|
|
get { |
|
|
|
List<IMethod> l = new List<IMethod>(); |
|
|
|
lock (this) { |
|
|
|
foreach (IClass part in parts) { |
|
|
|
List<IMethod> l = new List<IMethod>(); |
|
|
|
l.AddRange(part.Methods); |
|
|
|
foreach (IClass part in parts) { |
|
|
|
|
|
|
|
l.AddRange(part.Methods); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return l; |
|
|
|
} |
|
|
|
} |
|
|
|
return l; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public override List<IEvent> Events { |
|
|
|
public override List<IEvent> Events { |
|
|
|
get { |
|
|
|
get { |
|
|
|
List<IEvent> l = new List<IEvent>(); |
|
|
|
lock (this) { |
|
|
|
foreach (IClass part in parts) { |
|
|
|
List<IEvent> l = new List<IEvent>(); |
|
|
|
l.AddRange(part.Events); |
|
|
|
foreach (IClass part in parts) { |
|
|
|
|
|
|
|
l.AddRange(part.Events); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return l; |
|
|
|
} |
|
|
|
} |
|
|
|
return l; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|