PageRenderTime 43ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/src/sys/dotnet/fan/sys/Slot.cs

https://bitbucket.org/bedlaczech/fan-1.0
C# | 167 lines | 105 code | 25 blank | 37 comment | 27 complexity | 931b28035f092c19d5d1874f69b02a2a 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. // 27 Sep 06 Andy Frank Creation
  7. //
  8. using System;
  9. using Fanx.Fcode;
  10. using Fanx.Serial;
  11. namespace Fan.Sys
  12. {
  13. /// <summary>
  14. /// Slot models a member field or method of a Type.
  15. /// </summary>
  16. public abstract class Slot : FanObj, Literal
  17. {
  18. //////////////////////////////////////////////////////////////////////////
  19. // Management
  20. //////////////////////////////////////////////////////////////////////////
  21. public static Method findMethod(string qname) { return (Method)find(qname, true); }
  22. public static Method findMethod(string qname, bool check)
  23. {
  24. Slot slot = find(qname, check);
  25. if (slot is Method || check) return (Method)slot;
  26. return null;
  27. }
  28. public static Field findField(string qname) { return (Field)find(qname, true); }
  29. public static Field findField(string qname, bool check)
  30. {
  31. Slot slot = find(qname, check);
  32. if (slot is Field || check) return (Field)slot;
  33. return null;
  34. }
  35. public static Slot find(string qname) { return find(qname, true); }
  36. public static Slot find(string qname, bool check)
  37. {
  38. string typeName, slotName;
  39. try
  40. {
  41. int dot = qname.IndexOf('.');
  42. typeName = qname.Substring(0, dot);
  43. slotName = qname.Substring(dot+1);
  44. }
  45. catch (Exception)
  46. {
  47. throw Err.make("Invalid slot qname \"" + qname + "\", use <pod>::<type>.<slot>").val;
  48. }
  49. Type type = Type.find(typeName, check);
  50. if (type == null) return null;
  51. return type.slot(slotName, check);
  52. }
  53. public static Func findFunc(string qname) { return findFunc(qname, true); }
  54. public static Func findFunc(string qname, bool check)
  55. {
  56. Method m = (Method)find(qname, check);
  57. if (m == null) return null;
  58. return m.m_func;
  59. }
  60. //////////////////////////////////////////////////////////////////////////
  61. // Constructor
  62. //////////////////////////////////////////////////////////////////////////
  63. public Slot(Type parent, string name, int flags, Facets facets, int lineNum)
  64. {
  65. this.m_parent = parent;
  66. this.m_name = name;
  67. this.m_qname = parent == null ? name : parent.qname() + "." + name;
  68. this.m_flags = flags;
  69. this.m_facets = facets;
  70. this.m_lineNum = lineNum;
  71. }
  72. //////////////////////////////////////////////////////////////////////////
  73. // Methods
  74. //////////////////////////////////////////////////////////////////////////
  75. public override Type @typeof() { return Sys.SlotType; }
  76. public Type parent() { return m_parent; }
  77. public virtual string name() { return m_name; }
  78. public string qname() { return m_qname; }
  79. public bool isField() { return (this is Field); }
  80. public bool isMethod() { return (this is Method); }
  81. public abstract string signature();
  82. //////////////////////////////////////////////////////////////////////////
  83. // Flags
  84. //////////////////////////////////////////////////////////////////////////
  85. public int flags() { return m_flags; }
  86. public bool isAbstract() { return (m_flags & FConst.Abstract) != 0; }
  87. public virtual bool isConst() { return (m_flags & FConst.Const) != 0; } // we let synethic Methods override
  88. public bool isCtor() { return (m_flags & FConst.Ctor) != 0; }
  89. public bool isFinal() { return (m_flags & FConst.Final) != 0; }
  90. public bool isInternal() { return (m_flags & FConst.Internal) != 0; }
  91. public bool isNative() { return (m_flags & FConst.Native) != 0; }
  92. public bool isOverride() { return (m_flags & FConst.Override) != 0; }
  93. public bool isPrivate() { return (m_flags & FConst.Private) != 0; }
  94. public bool isProtected() { return (m_flags & FConst.Protected) != 0; }
  95. public bool isPublic() { return (m_flags & FConst.Public) != 0; }
  96. public bool isStatic() { return (m_flags & FConst.Static) != 0; }
  97. public bool isSynthetic() { return (m_flags & FConst.Synthetic) != 0; }
  98. public bool isVirtual() { return (m_flags & FConst.Virtual) != 0; }
  99. public override object trap(string name, List args)
  100. {
  101. // private undocumented access
  102. string n = name;
  103. if (n == "flags") return Long.valueOf(m_flags);
  104. if (n == "lineNumber") return Long.valueOf(m_lineNum);
  105. return base.trap(name, args);
  106. }
  107. //////////////////////////////////////////////////////////////////////////
  108. // Facets
  109. //////////////////////////////////////////////////////////////////////////
  110. public List facets() { return m_facets.list(); }
  111. public Facet facet(Type t) { return m_facets.get(t, true); }
  112. public Facet facet(Type t, bool c) { return m_facets.get(t, c); }
  113. public bool hasFacet(Type t) { return facet(t, false) != null; }
  114. //////////////////////////////////////////////////////////////////////////
  115. // Documentation
  116. //////////////////////////////////////////////////////////////////////////
  117. public string doc()
  118. {
  119. //parent.doc(); // ensure parent has loaded documentation
  120. //return doc;
  121. return "todo";
  122. }
  123. //////////////////////////////////////////////////////////////////////////
  124. // Conversion
  125. //////////////////////////////////////////////////////////////////////////
  126. public override string toStr() { return m_qname; }
  127. public void encode(ObjEncoder @out)
  128. {
  129. m_parent.encode(@out); @out.w(m_name);
  130. }
  131. //////////////////////////////////////////////////////////////////////////
  132. // Fields
  133. //////////////////////////////////////////////////////////////////////////
  134. internal Type m_parent;
  135. internal string m_name;
  136. internal string m_qname;
  137. internal int m_flags;
  138. internal Facets m_facets;
  139. public string m_doc;
  140. internal int m_lineNum;
  141. }
  142. }