PageRenderTime 57ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/Dependencies/boo/src/Boo.Lang.Compiler/TypeSystem/ExternalGenericParameter.cs

https://github.com/w4x/boolangstudio
C# | 144 lines | 98 code | 20 blank | 26 comment | 18 complexity | 997577857ad7d84779ffa063afe3b68f MD5 | raw file
Possible License(s): GPL-2.0
  1. #region license
  2. // Copyright (c) 2003, 2004, 2005 Rodrigo B. de Oliveira (rbo@acm.org)
  3. // All rights reserved.
  4. //
  5. // Redistribution and use in source and binary forms, with or without modification,
  6. // are permitted provided that the following conditions are met:
  7. //
  8. // * Redistributions of source code must retain the above copyright notice,
  9. // this list of conditions and the following disclaimer.
  10. // * Redistributions in binary form must reproduce the above copyright notice,
  11. // this list of conditions and the following disclaimer in the documentation
  12. // and/or other materials provided with the distribution.
  13. // * Neither the name of Rodrigo B. de Oliveira nor the names of its
  14. // contributors may be used to endorse or promote products derived from this
  15. // software without specific prior written permission.
  16. //
  17. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  18. // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  19. // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  20. // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
  21. // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22. // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  23. // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  24. // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  25. // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26. // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. #endregion
  28. using System;
  29. using System.Reflection;
  30. using Boo.Lang.Compiler;
  31. namespace Boo.Lang.Compiler.TypeSystem
  32. {
  33. public class ExternalGenericParameter : ExternalType, IGenericParameter
  34. {
  35. IMethod _declaringMethod = null;
  36. public ExternalGenericParameter(TypeSystemServices tss, Type type) : base(tss, type)
  37. {
  38. if (type.DeclaringMethod != null)
  39. {
  40. _declaringMethod = (IMethod)tss.Map(type.DeclaringMethod);
  41. }
  42. }
  43. public int GenericParameterPosition
  44. {
  45. get { return ActualType.GenericParameterPosition; }
  46. }
  47. public override string FullName
  48. {
  49. get
  50. {
  51. IEntity declaringEntity =
  52. (DeclaringMethod == null ? (IEntity)DeclaringType : (IEntity)DeclaringMethod);
  53. return string.Format("{0}.{1}", declaringEntity.FullName, Name);
  54. }
  55. }
  56. public IMethod DeclaringMethod
  57. {
  58. get
  59. {
  60. return _declaringMethod;
  61. }
  62. }
  63. public Variance Variance
  64. {
  65. get
  66. {
  67. GenericParameterAttributes variance = ActualType.GenericParameterAttributes & GenericParameterAttributes.VarianceMask;
  68. switch (variance)
  69. {
  70. case GenericParameterAttributes.None:
  71. return Variance.Invariant;
  72. case GenericParameterAttributes.Covariant:
  73. return Variance.Covariant;
  74. case GenericParameterAttributes.Contravariant:
  75. return Variance.Contravariant;
  76. default:
  77. return Variance.Invariant;
  78. }
  79. }
  80. }
  81. public IType[] GetBaseTypeConstraints()
  82. {
  83. return Array.ConvertAll<Type, IType>(
  84. ActualType.GetGenericParameterConstraints(),
  85. _typeSystemServices.Map);
  86. }
  87. public bool MustHaveDefaultConstructor
  88. {
  89. get
  90. {
  91. return (ActualType.GenericParameterAttributes & GenericParameterAttributes.DefaultConstructorConstraint) == GenericParameterAttributes.DefaultConstructorConstraint;
  92. }
  93. }
  94. public override bool IsClass
  95. {
  96. get
  97. {
  98. return (ActualType.GenericParameterAttributes & GenericParameterAttributes.ReferenceTypeConstraint) == GenericParameterAttributes.ReferenceTypeConstraint;
  99. }
  100. }
  101. public override bool IsValueType
  102. {
  103. get
  104. {
  105. return (ActualType.GenericParameterAttributes & GenericParameterAttributes.NotNullableValueTypeConstraint) == GenericParameterAttributes.NotNullableValueTypeConstraint;
  106. }
  107. }
  108. override public bool Equals(object rhs)
  109. {
  110. IGenericParameter p = rhs as IGenericParameter;
  111. if (null == p) return false;
  112. //TODO: >=0.9 : check base type constraints
  113. return Name == p.Name //FIXME: should be GenericParameterPosition but crashes on internal g. params(?!!)
  114. && Variance == p.Variance
  115. && MustHaveDefaultConstructor == p.MustHaveDefaultConstructor
  116. && IsClass == p.IsClass
  117. && IsValueType == p.IsValueType;
  118. }
  119. override public int GetHashCode()
  120. {
  121. return base.GetHashCode();
  122. }
  123. }
  124. }