PageRenderTime 50ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/src/sys/java/fan/sys/Slot.java

https://bitbucket.org/bedlaczech/fan-1.0
Java | 165 lines | 104 code | 26 blank | 35 comment | 24 complexity | b753ddd45f52be7ba7530f917d150fa4 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. // 4 Jan 06 Brian Frank Creation
  7. //
  8. package fan.sys;
  9. import fanx.fcode.*;
  10. import fanx.serial.*;
  11. /**
  12. * Slot models a member field or method of a Type.
  13. */
  14. public abstract class Slot
  15. extends FanObj
  16. implements 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, boolean checked)
  23. {
  24. Slot slot = find(qname, checked);
  25. if (slot instanceof Method || checked) 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, boolean checked)
  30. {
  31. Slot slot = find(qname, checked);
  32. if (slot instanceof Field || checked) 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, boolean checked)
  37. {
  38. String typeName, slotName;
  39. try
  40. {
  41. int dot = qname.lastIndexOf('.');
  42. typeName = qname.substring(0, dot);
  43. slotName = qname.substring(dot+1);
  44. }
  45. catch (Exception e)
  46. {
  47. throw Err.make("Invalid slot qname \"" + qname + "\", use <pod>::<type>.<slot>");
  48. }
  49. Type type = Type.find(typeName, checked);
  50. if (type == null) return null;
  51. return type.slot(slotName, checked);
  52. }
  53. public static Func findFunc(String qname) { return findFunc(qname, true); }
  54. public static Func findFunc(String qname, boolean checked)
  55. {
  56. Method m = (Method)find(qname, checked);
  57. if (m == null) return null;
  58. return m.func;
  59. }
  60. //////////////////////////////////////////////////////////////////////////
  61. // Constructor
  62. //////////////////////////////////////////////////////////////////////////
  63. public Slot(Type parent, String name, int flags, Facets facets, int lineNum)
  64. {
  65. this.parent = parent;
  66. this.name = name;
  67. this.qname = parent == null ? name : parent.qname() + "." + name;
  68. this.flags = flags;
  69. this.facets = facets;
  70. this.lineNum = lineNum;
  71. }
  72. //////////////////////////////////////////////////////////////////////////
  73. // Methods
  74. //////////////////////////////////////////////////////////////////////////
  75. public Type typeof() { return Sys.SlotType; }
  76. public Type parent() { return parent; }
  77. public String name() { return name; }
  78. public String qname() { return qname; }
  79. public boolean isField() { return this instanceof Field; }
  80. public boolean isMethod() { return this instanceof Method; }
  81. public abstract String signature();
  82. //////////////////////////////////////////////////////////////////////////
  83. // Flags
  84. //////////////////////////////////////////////////////////////////////////
  85. public final int flags() { return flags; }
  86. public final boolean isAbstract() { return (flags & FConst.Abstract) != 0; }
  87. public /* */ boolean isConst() { return (flags & FConst.Const) != 0; } // we let synthetic Methods override
  88. public final boolean isCtor() { return (flags & FConst.Ctor) != 0; }
  89. public final boolean isInternal() { return (flags & FConst.Internal) != 0; }
  90. public final boolean isNative() { return (flags & FConst.Native) != 0; }
  91. public final boolean isOverride() { return (flags & FConst.Override) != 0; }
  92. public final boolean isPrivate() { return (flags & FConst.Private) != 0; }
  93. public final boolean isProtected() { return (flags & FConst.Protected) != 0; }
  94. public final boolean isPublic() { return (flags & FConst.Public) != 0; }
  95. public final boolean isStatic() { return (flags & FConst.Static) != 0; }
  96. public final boolean isSynthetic() { return (flags & FConst.Synthetic) != 0; }
  97. public final boolean isVirtual() { return (flags & FConst.Virtual) != 0; }
  98. public Object trap(String name, List args)
  99. {
  100. // private undocumented access
  101. if (name.equals("flags")) return Long.valueOf(flags);
  102. if (name.equals("lineNumber")) return Long.valueOf(lineNum);
  103. return super.trap(name, args);
  104. }
  105. //////////////////////////////////////////////////////////////////////////
  106. // Facets
  107. //////////////////////////////////////////////////////////////////////////
  108. public List facets() { return facets.list(); }
  109. public Facet facet(Type t) { return facets.get(t, true); }
  110. public Facet facet(Type t, boolean c) { return facets.get(t, c); }
  111. public final boolean hasFacet(Type t) { return facet(t, false) != null; }
  112. //////////////////////////////////////////////////////////////////////////
  113. // Documentation
  114. //////////////////////////////////////////////////////////////////////////
  115. public String doc()
  116. {
  117. parent.doc(); // ensure parent has loaded documentation
  118. return doc;
  119. }
  120. //////////////////////////////////////////////////////////////////////////
  121. // Conversion
  122. //////////////////////////////////////////////////////////////////////////
  123. public String toStr() { return qname; }
  124. public void encode(ObjEncoder out)
  125. {
  126. parent.encode(out);
  127. out.w(name);
  128. }
  129. //////////////////////////////////////////////////////////////////////////
  130. // Fields
  131. //////////////////////////////////////////////////////////////////////////
  132. final int flags;
  133. final String name;
  134. final String qname;
  135. Type parent;
  136. final Facets facets;
  137. public String doc;
  138. public final int lineNum;
  139. }