PageRenderTime 48ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/src/sys/dotnet/fan/sys/FuncType.cs

https://bitbucket.org/bedlaczech/fan-1.0
C# | 157 lines | 95 code | 27 blank | 35 comment | 24 complexity | 8c777707ff2220d718b35f95a421eaab MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. //
  2. // Copyright (c) 2006, Brian Frank and Andy Frank
  3. // Licensed under the Academic Free License version 3.0
  4. //
  5. // History:
  6. // 23 Jul 07 Andy Frank Creation
  7. //
  8. using System.Text;
  9. namespace Fan.Sys
  10. {
  11. /// <summary>
  12. /// FuncType is a parameterized type for Funcs.
  13. /// </summary>
  14. public class FuncType : GenericType
  15. {
  16. //////////////////////////////////////////////////////////////////////////
  17. // Constructor
  18. //////////////////////////////////////////////////////////////////////////
  19. public FuncType(Type[] pars, Type ret)
  20. : base(Sys.FuncType)
  21. {
  22. this.m_params = pars;
  23. this.m_ret = ret;
  24. // I am a generic parameter type if any my args or
  25. // return type are generic parameter types.
  26. this.m_genericParameterType |= ret.isGenericParameter();
  27. for (int i=0; i<m_params.Length; ++i)
  28. this.m_genericParameterType |= m_params[i].isGenericParameter();
  29. }
  30. //////////////////////////////////////////////////////////////////////////
  31. // Type
  32. //////////////////////////////////////////////////////////////////////////
  33. public override int GetHashCode() { return (int)hash(); }
  34. public override long hash() { return FanStr.hash(signature()); }
  35. public override bool Equals(object obj)
  36. {
  37. if (obj is FuncType)
  38. {
  39. FuncType x = (FuncType)obj;
  40. if (m_params.Length != x.m_params.Length) return false;
  41. for (int i=0; i<m_params.Length; ++i)
  42. if (!m_params[i].Equals(x.m_params[i])) return false;
  43. return m_ret.Equals(x.m_ret);
  44. }
  45. return false;
  46. }
  47. public override string signature()
  48. {
  49. if (m_sig == null)
  50. {
  51. StringBuilder s = new StringBuilder();
  52. s.Append('|');
  53. for (int i=0; i<m_params.Length; ++i)
  54. {
  55. if (i > 0) s.Append(',');
  56. s.Append(m_params[i].signature());
  57. }
  58. s.Append('-').Append('>');
  59. s.Append(m_ret.signature());
  60. s.Append('|');
  61. m_sig = s.ToString();
  62. }
  63. return m_sig;
  64. }
  65. public override bool @is(Type type)
  66. {
  67. if (this == type) return true;
  68. if (type is FuncType)
  69. {
  70. FuncType t = (FuncType)type;
  71. // match return type (if void is needed, anything matches)
  72. if (t.m_ret != Sys.VoidType && !m_ret.@is(t.m_ret)) return false;
  73. // match params - it is ok for me to have less than
  74. // the type params (if I want to ignore them), but I
  75. // must have no more
  76. if (m_params.Length > t.m_params.Length) return false;
  77. for (int i=0; i<m_params.Length; ++i)
  78. if (!t.m_params[i].@is(m_params[i])) return false;
  79. // this method works for the specified method type
  80. return true;
  81. }
  82. return @base().@is(type);
  83. }
  84. internal override Map makeParams()
  85. {
  86. Map map = new Map(Sys.StrType, Sys.TypeType);
  87. for (int i=0; i<m_params.Length; ++i)
  88. map.set(FanStr.m_ascii['A'+i], m_params[i]);
  89. return map.set(FanStr.m_ascii['R'], m_ret).ro();
  90. }
  91. //////////////////////////////////////////////////////////////////////////
  92. // GenericType
  93. //////////////////////////////////////////////////////////////////////////
  94. public override Type getRawType()
  95. {
  96. return Sys.FuncType;
  97. }
  98. public override bool isGenericParameter()
  99. {
  100. return m_genericParameterType;
  101. }
  102. protected override Type doParameterize(Type t)
  103. {
  104. // return
  105. if (t == Sys.RType) return m_ret;
  106. // if A-H maps to avail params
  107. int name = t.name()[0] - 'A';
  108. if (name < m_params.Length) return m_params[name];
  109. // otherwise let anything be used
  110. return Sys.ObjType;
  111. }
  112. //////////////////////////////////////////////////////////////////////////
  113. // Method Support
  114. //////////////////////////////////////////////////////////////////////////
  115. internal List toMethodParams()
  116. {
  117. Param[] p = new Param[m_params.Length];
  118. for (int i=0; i<p.Length; ++i)
  119. p[i] = new Param(FanStr.m_ascii['a'+i], m_params[i], 0);
  120. return new List(Sys.ParamType, p);
  121. }
  122. //////////////////////////////////////////////////////////////////////////
  123. // Fields
  124. //////////////////////////////////////////////////////////////////////////
  125. public readonly Type[] m_params;
  126. public readonly Type m_ret;
  127. private string m_sig;
  128. private bool m_genericParameterType;
  129. }
  130. }