summaryrefslogtreecommitdiffstats
path: root/tools/slang-cpp-extractor/node-tree.h
blob: b54321b098e6e18caa7fa21384616572a015fa4d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#ifndef CPP_EXTRACT_NODE_TREE_H
#define CPP_EXTRACT_NODE_TREE_H

#include "diagnostics.h"
#include "node.h"
#include "identifier-lookup.h"

#include "../../source/compiler-core/slang-lexer.h"

namespace CppExtract {
using namespace Slang;

class TypeSet : public RefObject
{
public:
    /// This is the looked up name.
    UnownedStringSlice m_macroName;    ///< The name extracted from the macro SLANG_ABSTRACT_AST_CLASS -> AST

    String m_typeName;                  ///< The enum type name associated with this type for AST it is ASTNode
    String m_fileMark;                  ///< This 'mark' becomes of the output filename

    List<ClassLikeNode*> m_baseTypes;   ///< The base types for this type set
};

class SourceOrigin : public RefObject
{
public:

    void addNode(Node* node)
    {
        if (auto classLike = as<ClassLikeNode>(node))
        {
            SLANG_ASSERT(classLike->m_origin == nullptr);
            classLike->m_origin = this;
        }

        m_nodes.add(node);
    }

    SourceOrigin(SourceFile* sourceFile, const String& macroOrigin) :
        m_sourceFile(sourceFile),
        m_macroOrigin(macroOrigin)
    {}

    String m_macroOrigin;               ///< The macro text is inserted into the macro to identify the origin. It is based on the filename
    SourceFile* m_sourceFile;           ///< The source file - also holds the path information

    /// All of the nodes defined in this file in the order they were defined
    /// Note that the same namespace may be listed multiple times.
    List<RefPtr<Node> > m_nodes;
};

struct Options;
class IdentifierLookup;

/* NodeTree holds nodes that have been parsed into a tree rooted on the 'rootNode'.
Also contains other state associated with or useful to a node tree */
class NodeTree
{
public:
    friend class Parser;
        /// Get all of the parsed source origins
    const List<RefPtr<SourceOrigin> >& getSourceOrigins() const { return m_sourceOrigins; }

    TypeSet* getTypeSet(const UnownedStringSlice& slice);
    TypeSet* getOrAddTypeSet(const UnownedStringSlice& slice);

    SourceOrigin* addSourceOrigin(SourceFile* sourceFile, const Options& options);

        /// Get all of the type sets
    const List<RefPtr<TypeSet>>& getTypeSets() const { return m_typeSets; }

        /// Get the root node
    Node* getRootNode() const { return m_rootNode; }

        /// When parsing we don't lookup all up super types/add derived types. This is because
        /// we allow files to be processed in any order, so we have to do the type lookup as a separate operation
    SlangResult calcDerivedTypes(DiagnosticSink* sink);

    NodeTree(StringSlicePool* typePool, NamePool* namePool, IdentifierLookup* identifierLookup);

    static String calcMacroOrigin(const String& filePath, const Options& options);

protected:
    SlangResult _calcDerivedTypesRec(ScopeNode* node, DiagnosticSink* sink);

    StringSlicePool m_typeSetPool;              ///< Pool for type set names
    List<RefPtr<TypeSet> > m_typeSets;          ///< The type sets

    IdentifierLookup* m_identifierLookup;
    StringSlicePool* m_typePool;                ///< Pool for just types

    NamePool* m_namePool;

    RefPtr<ScopeNode> m_rootNode;   ///< The root scope 

    List<RefPtr<SourceOrigin>> m_sourceOrigins;
};

} // CppExtract

#endif