LCOV - code coverage report
Current view: top level - src/torque - declaration-visitor.h (source / functions) Hit Total Coverage
Test: app.info Lines: 23 23 100.0 %
Date: 2019-04-17 Functions: 6 6 100.0 %

          Line data    Source code
       1             : // Copyright 2017 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #ifndef V8_TORQUE_DECLARATION_VISITOR_H_
       6             : #define V8_TORQUE_DECLARATION_VISITOR_H_
       7             : 
       8             : #include <set>
       9             : #include <string>
      10             : 
      11             : #include "src/base/macros.h"
      12             : #include "src/torque/declarations.h"
      13             : #include "src/torque/file-visitor.h"
      14             : #include "src/torque/global-context.h"
      15             : #include "src/torque/types.h"
      16             : #include "src/torque/utils.h"
      17             : 
      18             : namespace v8 {
      19             : namespace internal {
      20             : namespace torque {
      21             : 
      22        5886 : class DeclarationVisitor : public FileVisitor {
      23             :  public:
      24           3 :   void Visit(Ast* ast) {
      25           3 :     CurrentScope::Scope current_namespace(GlobalContext::GetDefaultNamespace());
      26         969 :     for (Declaration* child : ast->declarations()) Visit(child);
      27           3 :   }
      28             : 
      29             :   void Visit(Declaration* decl);
      30             : 
      31          50 :   Namespace* GetOrCreateNamespace(const std::string& name) {
      32             :     std::vector<Namespace*> existing_namespaces = FilterDeclarables<Namespace>(
      33         150 :         Declarations::TryLookupShallow(QualifiedName(name)));
      34          50 :     if (existing_namespaces.empty()) {
      35          41 :       return Declarations::DeclareNamespace(name);
      36             :     }
      37             :     DCHECK_EQ(1, existing_namespaces.size());
      38           9 :     return existing_namespaces.front();
      39             :   }
      40             : 
      41          50 :   void Visit(NamespaceDeclaration* decl) {
      42          50 :     CurrentScope::Scope current_scope(GetOrCreateNamespace(decl->name));
      43         580 :     for (Declaration* child : decl->declarations) Visit(child);
      44          50 :   }
      45             : 
      46             :   void Visit(TypeDeclaration* decl);
      47             : 
      48             :   void DeclareMethods(AggregateType* container,
      49             :                       const std::vector<Declaration*>& methods);
      50             :   void Visit(StructDeclaration* decl);
      51             :   void Visit(ClassDeclaration* decl);
      52             : 
      53          19 :   void Visit(TypeAliasDeclaration* decl) {
      54          19 :     const Type* type = Declarations::GetType(decl->type);
      55          38 :     type->AddAlias(decl->name->value);
      56          19 :     Declarations::DeclareType(decl->name, type, true);
      57          19 :   }
      58             : 
      59             :   Builtin* CreateBuiltin(BuiltinDeclaration* decl, std::string external_name,
      60             :                          std::string readable_name, Signature signature,
      61             :                          base::Optional<Statement*> body);
      62          19 :   void Visit(ExternalBuiltinDeclaration* decl, const Signature& signature,
      63             :              base::Optional<Statement*> body) {
      64          76 :     Declarations::Declare(
      65             :         decl->name,
      66          19 :         CreateBuiltin(decl, decl->name, decl->name, signature, base::nullopt));
      67          19 :   }
      68             : 
      69             :   void Visit(ExternalRuntimeDeclaration* decl, const Signature& sig,
      70             :              base::Optional<Statement*> body);
      71             :   void Visit(ExternalMacroDeclaration* decl, const Signature& sig,
      72             :              base::Optional<Statement*> body);
      73             :   void Visit(TorqueBuiltinDeclaration* decl, const Signature& signature,
      74             :              base::Optional<Statement*> body);
      75             :   void Visit(TorqueMacroDeclaration* decl, const Signature& signature,
      76             :              base::Optional<Statement*> body);
      77             :   void Visit(IntrinsicDeclaration* decl, const Signature& signature,
      78             :              base::Optional<Statement*> body);
      79             : 
      80             :   void Visit(CallableNode* decl, const Signature& signature,
      81             :              base::Optional<Statement*> body);
      82             : 
      83             :   void Visit(ConstDeclaration* decl);
      84             :   void Visit(StandardDeclaration* decl);
      85             :   void Visit(GenericDeclaration* decl);
      86             :   void Visit(SpecializationDeclaration* decl);
      87             :   void Visit(ExternConstDeclaration* decl);
      88             :   void Visit(CppIncludeDeclaration* decl);
      89             : 
      90             :   Signature MakeSpecializedSignature(const SpecializationKey& key);
      91             :   Callable* SpecializeImplicit(const SpecializationKey& key);
      92             :   Callable* Specialize(const SpecializationKey& key, CallableNode* declaration,
      93             :                        base::Optional<const CallableNodeSignature*> signature,
      94             :                        base::Optional<Statement*> body);
      95             : 
      96             :   void FinalizeStructsAndClasses();
      97             : 
      98             :  private:
      99             :   void DeclareSpecializedTypes(const SpecializationKey& key);
     100             : 
     101             :   void FinalizeStructFieldsAndMethods(StructType* struct_type,
     102             :                                       StructDeclaration* struct_declaration);
     103             :   void FinalizeClassFieldsAndMethods(ClassType* class_type,
     104             :                                      ClassDeclaration* class_declaration);
     105             : 
     106             :   std::vector<std::tuple<Scope*, StructDeclaration*, StructType*>>
     107             :       struct_declarations_;
     108             :   std::vector<std::tuple<Scope*, ClassDeclaration*, ClassType*>>
     109             :       class_declarations_;
     110             : };
     111             : 
     112             : }  // namespace torque
     113             : }  // namespace internal
     114             : }  // namespace v8
     115             : 
     116             : #endif  // V8_TORQUE_DECLARATION_VISITOR_H_

Generated by: LCOV version 1.10