Function.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /*
  2. * Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/HashMap.h>
  8. #include <AK/RefCounted.h>
  9. #include <AK/RefPtr.h>
  10. #include <AK/StringView.h>
  11. #include "DiagnosticEngine.h"
  12. #include "Forward.h"
  13. namespace JSSpecCompiler {
  14. class TranslationUnit {
  15. public:
  16. TranslationUnit(StringView filename);
  17. ~TranslationUnit();
  18. void adopt_declaration(NonnullRefPtr<FunctionDeclaration>&& declaration);
  19. void adopt_function(NonnullRefPtr<FunctionDefinition>&& definition);
  20. FunctionDeclarationRef find_abstract_operation_by_name(StringView name) const;
  21. StringView filename() const { return m_filename; }
  22. DiagnosticEngine& diag() { return m_diagnostic_engine; }
  23. Vector<FunctionDefinitionRef> functions_to_compile() const { return m_functions_to_compile; }
  24. EnumeratorRef get_node_for_enumerator_value(StringView value);
  25. private:
  26. StringView m_filename;
  27. DiagnosticEngine m_diagnostic_engine;
  28. Vector<FunctionDefinitionRef> m_functions_to_compile;
  29. Vector<NonnullRefPtr<FunctionDeclaration>> m_declarations_owner;
  30. HashMap<FlyString, FunctionDeclarationRef> m_abstract_operation_index;
  31. HashMap<StringView, EnumeratorRef> m_enumerator_nodes;
  32. };
  33. struct FunctionArgument {
  34. StringView name;
  35. size_t optional_arguments_group;
  36. };
  37. class QualifiedName {
  38. public:
  39. QualifiedName() { }
  40. QualifiedName(ReadonlySpan<StringView> parsed_name)
  41. {
  42. m_components.ensure_capacity(parsed_name.size());
  43. for (auto component : parsed_name)
  44. m_components.unchecked_append(MUST(FlyString::from_utf8(component)));
  45. }
  46. QualifiedName(ReadonlySpan<FlyString> parsed_name)
  47. {
  48. m_components.ensure_capacity(parsed_name.size());
  49. for (auto component : parsed_name)
  50. m_components.unchecked_append(component);
  51. }
  52. String to_string() const
  53. {
  54. return MUST(String::join("."sv, m_components));
  55. }
  56. Vector<FlyString> const& components() const
  57. {
  58. return m_components;
  59. }
  60. FlyString last_component() const
  61. {
  62. return m_components.last();
  63. }
  64. ReadonlySpan<FlyString> without_last_component() const
  65. {
  66. return components().span().slice(0, components().size() - 1);
  67. }
  68. QualifiedName slice(size_t start, size_t length) const
  69. {
  70. return { m_components.span().slice(start, length) };
  71. }
  72. QualifiedName with_appended(FlyString component) const
  73. {
  74. auto new_components = m_components;
  75. new_components.append(component);
  76. return { new_components };
  77. }
  78. private:
  79. Vector<FlyString> m_components;
  80. };
  81. struct AbstractOperationDeclaration {
  82. FlyString name;
  83. Vector<FunctionArgument> arguments;
  84. };
  85. struct AccessorDeclaration {
  86. QualifiedName name;
  87. };
  88. struct MethodDeclaration {
  89. QualifiedName name;
  90. Vector<FunctionArgument> arguments;
  91. };
  92. using Declaration = Variant<AbstractOperationDeclaration, AccessorDeclaration, MethodDeclaration>;
  93. class FunctionDeclaration : public RefCounted<FunctionDeclaration> {
  94. public:
  95. FunctionDeclaration(Declaration&& declaration, Location location);
  96. virtual ~FunctionDeclaration() = default;
  97. Declaration const& declaration() const { return m_declaration; }
  98. Location location() const { return m_location; }
  99. String name() const;
  100. ReadonlySpan<FunctionArgument> arguments() const;
  101. private:
  102. Declaration m_declaration;
  103. Location m_location;
  104. };
  105. class FunctionDefinition : public FunctionDeclaration {
  106. public:
  107. FunctionDefinition(Declaration&& declaration, Location location, Tree ast);
  108. void reindex_ssa_variables();
  109. Tree m_ast;
  110. // Populates during reference resolving
  111. // NOTE: The hash map here is ordered since we do not want random hash changes to break our test
  112. // expectations (looking at you, SipHash).
  113. OrderedHashMap<StringView, NamedVariableDeclarationRef> m_local_variables;
  114. // Fields populate during CFG building
  115. NamedVariableDeclarationRef m_named_return_value;
  116. RefPtr<ControlFlowGraph> m_cfg;
  117. // Fields populate during SSA building
  118. Vector<SSAVariableDeclarationRef> m_ssa_arguments;
  119. SSAVariableDeclarationRef m_return_value;
  120. Vector<SSAVariableDeclarationRef> m_local_ssa_variables;
  121. };
  122. }