// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ICSharpCode.SharpDevelop.Dom
{
public class Constructor : DefaultMethod
{
public Constructor(ModifierEnum m, DomRegion region, DomRegion bodyRegion, IClass declaringType)
: base((m & ModifierEnum.Static) != 0 ? "#cctor" : "#ctor",
declaringType.DefaultReturnType,
m, region, bodyRegion, declaringType)
{
}
public Constructor(ModifierEnum m, IReturnType returnType, IClass declaringType)
: base((m & ModifierEnum.Static) != 0 ? "#cctor" : "#ctor",
returnType, m, DomRegion.Empty, DomRegion.Empty, declaringType)
{
}
///
/// Creates a default constructor for the class.
/// The constructor has the region of the class and a documentation comment saying
/// it is a default constructor.
///
public static Constructor CreateDefault(IClass c)
{
if (c == null)
throw new ArgumentNullException("c");
ModifierEnum modifiers = ModifierEnum.Synthetic;
if (c.IsAbstract)
modifiers |= ModifierEnum.Protected;
else
modifiers |= ModifierEnum.Public;
DomRegion region = new DomRegion(c.Region.BeginLine, c.Region.BeginColumn, c.Region.BeginLine, c.Region.BeginColumn);
Constructor con = new Constructor(modifiers, region, region, c);
con.Documentation = "Default constructor of " + c.Name;
return con;
}
}
[Serializable]
public class Destructor : DefaultMethod
{
public Destructor(DomRegion region, DomRegion bodyRegion, IClass declaringType)
: base("#dtor", null, ModifierEnum.None, region, bodyRegion, declaringType)
{
}
}
[Serializable]
public class DefaultMethod : AbstractMember, IMethod
{
IList parameters;
IList typeParameters;
IList handlesClauses;
protected override void FreezeInternal()
{
parameters = FreezeList(parameters);
typeParameters = FreezeList(typeParameters);
handlesClauses = FreezeList(handlesClauses);
base.FreezeInternal();
}
bool isExtensionMethod;
public bool IsExtensionMethod {
get {
return isExtensionMethod;
}
set {
CheckBeforeMutation();
isExtensionMethod = value;
}
}
public override IMember Clone()
{
DefaultMethod p = new DefaultMethod(Name, ReturnType, Modifiers, Region, BodyRegion, DeclaringType);
p.parameters = DefaultParameter.Clone(this.Parameters);
p.typeParameters = new List(this.typeParameters);
p.CopyDocumentationFrom(this);
p.isExtensionMethod = this.isExtensionMethod;
foreach (ExplicitInterfaceImplementation eii in InterfaceImplementations) {
p.InterfaceImplementations.Add(eii.Clone());
}
return p;
}
public override string DotNetName {
get {
if (typeParameters == null || typeParameters.Count == 0)
return base.DotNetName;
else
return base.DotNetName + "``" + typeParameters.Count;
}
}
public override string DocumentationTag {
get {
string dotnetName = this.DotNetName;
StringBuilder b = new StringBuilder("M:", dotnetName.Length + 2);
b.Append(dotnetName);
IList paras = this.Parameters;
if (paras.Count > 0) {
b.Append('(');
for (int i = 0; i < paras.Count; ++i) {
if (i > 0) b.Append(',');
IReturnType rt = paras[i].ReturnType;
if (rt != null) {
b.Append(rt.DotNetName);
}
}
b.Append(')');
}
return b.ToString();
}
}
public virtual IList TypeParameters {
get {
if (typeParameters == null) {
typeParameters = new List();
}
return typeParameters;
}
set {
CheckBeforeMutation();
typeParameters = value;
}
}
public virtual IList Parameters {
get {
if (parameters == null) {
parameters = new List();
}
return parameters;
}
set {
CheckBeforeMutation();
parameters = value;
}
}
public IList HandlesClauses {
get {
if (handlesClauses == null) {
handlesClauses = new List();
}
return handlesClauses;
}
set {
CheckBeforeMutation();
handlesClauses = value;
}
}
public virtual bool IsConstructor {
get {
return Name == "#ctor" || Name == "#cctor";
}
}
public virtual bool IsOperator {
get {
return Name.StartsWith("op_", StringComparison.Ordinal);
}
}
public DefaultMethod(IClass declaringType, string name) : base(declaringType, name)
{
}
public DefaultMethod(string name, IReturnType type, ModifierEnum m, DomRegion region, DomRegion bodyRegion, IClass declaringType) : base(declaringType, name)
{
this.ReturnType = type;
this.Region = region;
this.BodyRegion = bodyRegion;
Modifiers = m;
}
public override string ToString()
{
return String.Format("[DefaultMethod: {0}]",
(new Dom.CSharp.CSharpAmbience {
ConversionFlags = ConversionFlags.StandardConversionFlags
| ConversionFlags.UseFullyQualifiedMemberNames
}).Convert(this));
}
public virtual int CompareTo(IMethod value)
{
int cmp = string.CompareOrdinal(this.FullyQualifiedName, value.FullyQualifiedName);
if (cmp != 0) {
return cmp;
}
cmp = this.TypeParameters.Count - value.TypeParameters.Count;
if (cmp != 0) {
return cmp;
}
return DiffUtility.Compare(Parameters, value.Parameters);
}
int IComparable.CompareTo(object value)
{
if (value == null) {
return 0;
}
return CompareTo((IMethod)value);
}
public override EntityType EntityType {
get {
return EntityType.Method;
}
}
}
}