12 changed files with 322 additions and 49 deletions
@ -0,0 +1,82 @@
@@ -0,0 +1,82 @@
|
||||
// Copyright (c) 2010 AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under MIT X11 license (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
|
||||
namespace ICSharpCode.NRefactory.TypeSystem.Implementation |
||||
{ |
||||
/// <summary>
|
||||
/// Represents an array type.
|
||||
/// </summary>
|
||||
public class ArrayType : TypeWithElementType |
||||
{ |
||||
int dimensions; |
||||
|
||||
public ArrayType(IType elementType, int dimensions) : base(elementType) |
||||
{ |
||||
if (dimensions <= 0) |
||||
throw new ArgumentOutOfRangeException("dimensions", dimensions, "dimensions must be positive"); |
||||
this.dimensions = dimensions; |
||||
} |
||||
|
||||
public int Dimensions { |
||||
get { return dimensions; } |
||||
} |
||||
|
||||
public override string NameSuffix { |
||||
get { |
||||
if (dimensions == 0) |
||||
return "[]"; |
||||
else |
||||
return "[" + new string(',', dimensions-1) + "]"; |
||||
} |
||||
} |
||||
|
||||
public override Nullable<bool> IsReferenceType { |
||||
get { return true; } |
||||
} |
||||
|
||||
public override int GetHashCode() |
||||
{ |
||||
return unchecked(GetElementType().GetHashCode() * 71681 + dimensions); |
||||
} |
||||
|
||||
public override bool Equals(IType other) |
||||
{ |
||||
ArrayType a = other as ArrayType; |
||||
return a != null && elementType.Equals(a.elementType) && a.dimensions == dimensions; |
||||
} |
||||
} |
||||
|
||||
public class ArrayTypeReference : AbstractTypeReference |
||||
{ |
||||
ITypeReference elementType; |
||||
int dimensions; |
||||
|
||||
public ArrayTypeReference(ITypeReference elementType, int dimensions) |
||||
{ |
||||
if (elementType == null) |
||||
throw new ArgumentNullException("elementType"); |
||||
this.elementType = elementType; |
||||
this.dimensions = dimensions; |
||||
} |
||||
|
||||
public override IType Resolve(ITypeResolveContext context) |
||||
{ |
||||
return new ArrayType(elementType.Resolve(context), dimensions); |
||||
} |
||||
|
||||
public override string ToString() |
||||
{ |
||||
return elementType.ToString() + "[" + new string(',', dimensions - 1) + "]"; |
||||
} |
||||
|
||||
public static ITypeReference Create(ITypeReference elementType, int dimensions) |
||||
{ |
||||
if (elementType is IType) |
||||
return new ArrayType((IType)elementType, dimensions); |
||||
else |
||||
return new ArrayTypeReference(elementType, dimensions); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,65 @@
@@ -0,0 +1,65 @@
|
||||
// Copyright (c) 2010 AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under MIT X11 license (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
|
||||
namespace ICSharpCode.NRefactory.TypeSystem.Implementation |
||||
{ |
||||
public class PointerType : TypeWithElementType |
||||
{ |
||||
public PointerType(IType elementType) : base(elementType) |
||||
{ |
||||
} |
||||
|
||||
public override string NameSuffix { |
||||
get { |
||||
return "*"; |
||||
} |
||||
} |
||||
|
||||
public override Nullable<bool> IsReferenceType { |
||||
get { return null; } |
||||
} |
||||
|
||||
public override int GetHashCode() |
||||
{ |
||||
return elementType.GetHashCode() ^ 91725811; |
||||
} |
||||
|
||||
public override bool Equals(IType other) |
||||
{ |
||||
PointerType a = other as PointerType; |
||||
return a != null && elementType.Equals(a.elementType); |
||||
} |
||||
} |
||||
|
||||
public class PointerTypeReference : AbstractTypeReference |
||||
{ |
||||
ITypeReference elementType; |
||||
|
||||
public PointerTypeReference(ITypeReference elementType) |
||||
{ |
||||
if (elementType == null) |
||||
throw new ArgumentNullException("elementType"); |
||||
this.elementType = elementType; |
||||
} |
||||
|
||||
public override IType Resolve(ITypeResolveContext context) |
||||
{ |
||||
return new PointerType(elementType.Resolve(context)); |
||||
} |
||||
|
||||
public override string ToString() |
||||
{ |
||||
return elementType.ToString() + "*"; |
||||
} |
||||
|
||||
public static ITypeReference Create(ITypeReference elementType) |
||||
{ |
||||
if (elementType is IType) |
||||
return new PointerType((IType)elementType); |
||||
else |
||||
return new PointerTypeReference(elementType); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,45 @@
@@ -0,0 +1,45 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <author name="Daniel Grunwald"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
using System; |
||||
|
||||
namespace ICSharpCode.NRefactory.TypeSystem.Implementation |
||||
{ |
||||
public abstract class TypeWithElementType : AbstractType |
||||
{ |
||||
protected readonly IType elementType; |
||||
|
||||
protected TypeWithElementType(IType elementType) |
||||
{ |
||||
if (elementType == null) |
||||
throw new ArgumentNullException("elementType"); |
||||
this.elementType = elementType; |
||||
} |
||||
|
||||
public override string Name { |
||||
get { return elementType.Name + NameSuffix; } |
||||
} |
||||
|
||||
public override string Namespace { |
||||
get { return elementType.Namespace; } |
||||
} |
||||
|
||||
public override string FullName { |
||||
get { return elementType.FullName + NameSuffix; } |
||||
} |
||||
|
||||
public override string DotNetName { |
||||
get { return elementType.DotNetName + NameSuffix; } |
||||
} |
||||
|
||||
public abstract string NameSuffix { get; } |
||||
|
||||
public override IType GetElementType() |
||||
{ |
||||
return elementType; |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue