/src/tools/semantics/types/type_builder/liberty_type_init.e

http://github.com/tybor/Liberty · Specman e · 123 lines · 99 code · 7 blank · 17 comment · 5 complexity · 68dca5cf96113510c5009b4cf325ef7b MD5 · raw file

  1. -- This file is part of Liberty Eiffel.
  2. --
  3. -- Liberty Eiffel is free software: you can redistribute it and/or modify
  4. -- it under the terms of the GNU General Public License as published by
  5. -- the Free Software Foundation, version 3 of the License.
  6. --
  7. -- Liberty Eiffel is distributed in the hope that it will be useful,
  8. -- but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. -- GNU General Public License for more details.
  11. --
  12. -- You should have received a copy of the GNU General Public License
  13. -- along with Liberty Eiffel. If not, see <http://www.gnu.org/licenses/>.
  14. --
  15. class LIBERTY_TYPE_INIT
  16. --
  17. -- Initializes general type information such as obsolete, deferred, and so on
  18. --
  19. insert
  20. LIBERTY_TYPE_BUILDER_TOOLS
  21. creation {LIBERTY_TYPE_BUILDER}
  22. make
  23. feature {}
  24. make (a_builder: like builder; a_type: like type; a_universe: like universe; default_effective_generic_parameters: like effective_generic_parameters) is
  25. require
  26. a_builder /= Void
  27. a_type /= Void
  28. a_universe /= Void
  29. do
  30. builder := a_builder
  31. type := a_type
  32. universe := a_universe
  33. effective_generic_parameters := default_effective_generic_parameters
  34. ensure
  35. builder = a_builder
  36. type = a_type
  37. universe = a_universe
  38. effective_generic_parameters = default_effective_generic_parameters
  39. end
  40. universe: LIBERTY_UNIVERSE
  41. feature {LIBERTY_TYPE_BUILDER}
  42. init_type_header is
  43. local
  44. class_header: LIBERTY_AST_CLASS_HEADER
  45. marker: LIBERTY_AST_CLASS_MARKER
  46. name: FIXED_STRING
  47. type_parameters: LIBERTY_AST_TYPE_PARAMETERS
  48. type_parameter: LIBERTY_AST_TYPE_PARAMETER
  49. effective_type: LIBERTY_ACTUAL_TYPE
  50. i, n: INTEGER
  51. do
  52. class_header := type.ast.class_header
  53. marker := class_header.class_marker
  54. if marker.is_deferred then
  55. type.set_deferred
  56. elseif marker.is_expanded then
  57. type.set_expanded
  58. elseif marker.is_separate then
  59. type.set_separate
  60. else
  61. type.set_reference
  62. end
  63. name := class_header.class_name.image.image.intern
  64. if name /= type.name then
  65. errors.set(level_fatal_error, once "Expected type " + type.name + once ", but got " + name)
  66. end
  67. type_parameters := class_header.type_parameters
  68. n := type_parameters.list_count
  69. if n /= type.parameters.count then
  70. errors.add_position(semantics_position_at(class_header.class_name))
  71. errors.add_position(type.descriptor_position)
  72. errors.set(level_error, once "Bad number of generic parameters")
  73. elseif n > 0 then
  74. check
  75. same_indexes: type_parameters.list_lower = type.parameters.lower
  76. end
  77. create {HASHED_DICTIONARY[LIBERTY_ACTUAL_TYPE, FIXED_STRING]} effective_generic_parameters.with_capacity(n)
  78. from
  79. i := type_parameters.list_lower
  80. until
  81. i > type_parameters.list_upper
  82. loop
  83. type_parameter := type_parameters.list_item(i)
  84. effective_type ::= type.parameters.item(i).known_type
  85. effective_generic_parameters.add(effective_type, type_parameter.class_name.image.image.intern)
  86. i := i + 1
  87. end
  88. builder.set_effective_generic_parameters(effective_generic_parameters)
  89. end
  90. torch.burn
  91. end
  92. is_ready: BOOLEAN is
  93. local
  94. i: INTEGER
  95. do
  96. from
  97. Result := True
  98. i := type.parameters.lower
  99. until
  100. not Result or else i > type.parameters.upper
  101. loop
  102. Result := type.parameters.item(i).is_known
  103. debug ("type.building.internals")
  104. if not Result then
  105. log.trace.put_string(type.full_name)
  106. log.trace.put_string(once ": not yet ready because the type parameter #")
  107. log.trace.put_integer(i)
  108. log.trace.put_string(once ", ")
  109. log.trace.put_string(type.parameters.item(i).full_name)
  110. log.trace.put_line(once " is not yet actually set")
  111. end
  112. end
  113. i := i + 1
  114. end
  115. end
  116. end -- class LIBERTY_TYPE_INIT