diff options
Diffstat (limited to 'tools/slang-cpp-extractor/node.cpp')
| -rw-r--r-- | tools/slang-cpp-extractor/node.cpp | 700 |
1 files changed, 0 insertions, 700 deletions
diff --git a/tools/slang-cpp-extractor/node.cpp b/tools/slang-cpp-extractor/node.cpp deleted file mode 100644 index 4598e34c9..000000000 --- a/tools/slang-cpp-extractor/node.cpp +++ /dev/null @@ -1,700 +0,0 @@ -#include "node.h" - -#include "../../source/core/slang-string-escape-util.h" -#include "../../source/core/slang-string-util.h" -#include "file-util.h" - -namespace CppExtract -{ - -// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Node Impl -// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -SLANG_FORCE_INLINE static void _indent(Index indentCount, StringBuilder& out) -{ - FileUtil::indent(indentCount, out); -} - -void Node::dumpMarkup(int indentCount, StringBuilder& out) -{ - if (m_markup.getLength() <= 0) - { - return; - } - - List<UnownedStringSlice> lines; - StringUtil::calcLines(m_markup.getUnownedSlice(), lines); - - // Remove empty lines from the end - while (lines.getCount()) - { - auto lastLine = lines.getLast(); - if (lastLine.trim().getLength() == 0) - { - lines.removeLast(); - continue; - } - break; - } - - if (lines.getCount() == 0) - { - return; - } - - for (auto line : lines) - { - _indent(indentCount, out); - out << "// " << line << "\n"; - } -} - -ScopeNode* Node::getRootScope() -{ - if (m_parentScope) - { - ScopeNode* scope = m_parentScope; - while (scope->m_parentScope) - { - scope = scope->m_parentScope; - } - return scope; - } - else - { - return as<ScopeNode>(this); - } -} - -void Node::calcScopeDepthFirst(List<Node*>& outNodes) -{ - outNodes.add(this); -} - -void Node::calcAbsoluteName(StringBuilder& outName) const -{ - List<Node*> path; - calcScopePath(const_cast<Node*>(this), path); - - // 1 so we skip the global scope - for (Index i = 1; i < path.getCount(); ++i) - { - Node* node = path[i]; - - if (i > 1) - { - outName << "::"; - } - - if (node->m_kind == Kind::AnonymousNamespace) - { - outName << "{Anonymous}"; - } - else - { - outName << node->m_name.getContent(); - } - } -} - -/* static */ void Node::calcScopePath(Node* node, List<Node*>& outPath) -{ - outPath.clear(); - - while (node) - { - outPath.add(node); - node = node->m_parentScope; - } - - // reverse the order, so we go from root to the node - outPath.reverse(); -} - -/* static */ void Node::filterImpl(Filter inFilter, List<Node*>& ioNodes) -{ - // Filter out all the unreflected nodes - Index count = ioNodes.getCount(); - for (Index j = 0; j < count;) - { - Node* node = ioNodes[j]; - - if (!inFilter(node)) - { - ioNodes.removeAt(j); - count--; - } - else - { - j++; - } - } -} - -/* static */ Node* Node::lookupNameInScope(ScopeNode* scope, const UnownedStringSlice& name) -{ - // TODO(JS): Doesn't handle 'using namespace'. - - // Must be unqualified name - SLANG_ASSERT(name.indexOf(UnownedStringSlice::fromLiteral("::")) < 0); - - Node* childNode = scope->findChild(name); - if (childNode) - { - return childNode; - } - - // If we have an anonymous namespace in this scope, try looking up in there.. - if (scope->m_anonymousNamespace) - { - Node* childNode = scope->m_anonymousNamespace->findChild(name); - if (childNode) - { - return childNode; - } - } - - // I could have an enum (that's not an enum class) - for (Node* node : scope->m_children) - { - EnumNode* enumNode = as<EnumNode>(node); - if (enumNode && enumNode->m_kind == Node::Kind::Enum) - { - Node** nodePtr = enumNode->m_childMap.tryGetValue(name); - if (nodePtr) - { - return *nodePtr; - } - } - } - - return nullptr; -} - -/* static */ Node* Node::lookupFromScope( - ScopeNode* scope, - const UnownedStringSlice* parts, - Index partsCount) -{ - SLANG_ASSERT(partsCount > 0); - if (partsCount == 1) - { - return lookupNameInScope(scope, parts[0]); - } - - for (Index i = 0; i < partsCount; ++i) - { - const UnownedStringSlice& part = parts[i]; - - Node* node = lookupNameInScope(scope, part); - if (node == nullptr) - { - return node; - } - // If at end, then we are done - if (i == partsCount - 1) - { - return node; - } - - // If there are more elements, then node must be some kind of scope, - // if we are going to find it - scope = as<ScopeNode>(node); - if (scope == nullptr) - { - break; - } - } - - return nullptr; -} - -/* static */ void Node::splitPath( - const UnownedStringSlice& inPath, - List<UnownedStringSlice>& outParts) -{ - if (inPath.indexOf(UnownedStringSlice::fromLiteral("::")) >= 0) - { - StringUtil::split(inPath, UnownedStringSlice::fromLiteral("::"), outParts); - // Remove any whitespace - for (auto& part : outParts) - { - part = part.trim(); - } - } - else - { - outParts.clear(); - outParts.add(inPath.trim()); - } -} - -/* static */ Node* Node::lookupFromScope(ScopeNode* scope, const UnownedStringSlice& inPath) -{ - if (inPath.indexOf(UnownedStringSlice::fromLiteral("::")) >= 0) - { - List<UnownedStringSlice> parts; - splitPath(inPath, parts); - - return lookupFromScope(scope, parts.getBuffer(), parts.getCount()); - } - else - { - return lookupNameInScope(scope, inPath); - } -} - -/* static */ Node* Node::lookup(ScopeNode* scope, const UnownedStringSlice& inPath) -{ - if (inPath.indexOf(UnownedStringSlice::fromLiteral("::")) >= 0) - { - List<UnownedStringSlice> parts; - splitPath(inPath, parts); - - if (parts[0].getLength() == 0) - { - // It's a lookup from global scope - ScopeNode* rootScope = scope->getRootScope(); - return lookupFromScope(rootScope, parts.getBuffer() + 1, parts.getCount() + 1); - } - - // Okay lets try a lookup from each scope up to the global scope - while (scope) - { - Node* node = lookupFromScope(scope, parts.getBuffer(), parts.getCount()); - if (node) - { - return node; - } - - scope = scope->m_parentScope; - } - } - else - { - while (scope) - { - // Lookup in this scope - Node* node = lookupNameInScope(scope, inPath); - if (node) - { - return node; - } - - // Try parent scope - scope = scope->m_parentScope; - } - } - - return nullptr; -} - -// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ScopeNode !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -ScopeNode* ScopeNode::getAnonymousNamespace() -{ - if (!m_anonymousNamespace) - { - m_anonymousNamespace = new ScopeNode(Kind::AnonymousNamespace); - m_anonymousNamespace->m_parentScope = this; - m_children.add(m_anonymousNamespace); - } - - return m_anonymousNamespace; -} - -void ScopeNode::addChildIgnoringName(Node* child) -{ - SLANG_ASSERT(child->m_parentScope == nullptr); - // Can't add anonymous namespace this way - should be added via getAnonymousNamespace - SLANG_ASSERT(child->m_kind != Kind::AnonymousNamespace); - - child->m_parentScope = this; - m_children.add(child); -} - -void ScopeNode::addChild(Node* child) -{ - addChildIgnoringName(child); - - if (child->m_name.hasContent()) - { - m_childMap.add(child->m_name.getContent(), child); - } -} - -Node* ScopeNode::findChild(const UnownedStringSlice& name) const -{ - Node* const* nodePtr = m_childMap.tryGetValue(name); - if (nodePtr) - { - return *nodePtr; - } - return nullptr; -} - -void ScopeNode::calcScopeDepthFirst(List<Node*>& outNodes) -{ - outNodes.add(this); - for (Node* child : m_children) - { - child->calcScopeDepthFirst(outNodes); - } -} - -void ScopeNode::dump(int indentCount, StringBuilder& out) -{ - dumpMarkup(indentCount, out); - - _indent(indentCount, out); - - switch (m_kind) - { - case Kind::AnonymousNamespace: - { - out << "namespace {\n"; - } - case Kind::Namespace: - { - if (m_name.hasContent()) - { - out << "namespace " << m_name.getContent() << " {\n"; - } - else - { - out << "{\n"; - } - break; - } - } - - for (Node* child : m_children) - { - child->dump(indentCount + 1, out); - } - - _indent(indentCount, out); - out << "}\n"; -} - -/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! EnumCaseNode !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ - -/* Returns true if needs space between the tokens. -It determines this based on the locs, and if they contain something between them. -*/ -static bool _needsSpace(const Token& prevTok, const Token& tok) -{ - auto prevLoc = prevTok.getLoc(); - auto loc = tok.getLoc(); - - auto prevContent = prevTok.getContent(); - - if (prevLoc + prevContent.getLength() == loc) - { - return false; - } - - return true; -} - - -static void _dumpTokens(const Token* toks, Index count, StringBuilder& out) -{ - if (count > 0) - { - out << toks[0].getContent(); - - for (Index i = 1; i < count; ++i) - { - const auto& prevToken = toks[i - 1]; - const auto& token = toks[i]; - - if (_needsSpace(prevToken, token)) - { - out << " "; - } - - out << token.getContent(); - } - } -} - -static void _dumpTokens(const List<Token>& toks, StringBuilder& out) -{ - _dumpTokens(toks.getBuffer(), toks.getCount(), out); -} - - -void EnumCaseNode::dump(int indent, StringBuilder& out) -{ - if (isReflected()) - { - dumpMarkup(indent, out); - - _indent(indent, out); - out << m_name.getContent(); - - if (m_valueTokens.getCount()) - { - out << " = "; - _dumpTokens(m_valueTokens, out); - } - - out << ",\n"; - } -} - -/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! EnumNode !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ - -void TypeDefNode::dump(int indent, StringBuilder& out) -{ - if (isReflected()) - { - dumpMarkup(indent, out); - - _indent(indent, out); - - out << "typedef "; - _dumpTokens(m_targetTypeTokens, out); - out << " " << m_name.getContent() << ";\n"; - } -} - -/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! EnumNode !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ - -void EnumNode::dump(int indent, StringBuilder& out) -{ - if (!isReflected()) - { - return; - } - - dumpMarkup(indent, out); - - _indent(indent, out); - - out << "enum "; - - if (m_kind == Kind::EnumClass) - { - out << "class "; - } - - if (m_name.type != TokenType::Invalid) - { - out << m_name.getContent(); - } - - if (m_backingTokens.getCount() > 0) - { - out << " : "; - _dumpTokens(m_backingTokens, out); - } - - out << "\n"; - _indent(indent, out); - out << "{\n"; - - for (Node* child : m_children) - { - child->dump(indent + 1, out); - } - - _indent(indent, out); - out << "}\n"; -} - -/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!! CallableNode !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ - -void CallableNode::dump(int indent, StringBuilder& out) -{ - if (!isReflected()) - { - return; - } - - dumpMarkup(indent, out); - - _indent(indent, out); - - if (m_isStatic) - { - out << "static "; - } - if (m_isVirtual) - { - out << "virtual "; - } - - out << m_returnType << " "; - out << m_name.getContent() << "("; - - const Index count = m_params.getCount(); - for (Index i = 0; i < count; ++i) - { - if (i > 0) - { - out << ", "; - } - - const auto& param = m_params[i]; - out << param.m_type; - if (param.m_name.type == TokenType::Identifier) - { - out << " " << param.m_name.getContent(); - } - } - - out << ")"; - - if (m_isPure) - { - out << " = 0"; - } - - out << "\n"; -} - -/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! FieldNode !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ - -void FieldNode::dump(int indent, StringBuilder& out) -{ - if (!isReflected()) - { - return; - } - - dumpMarkup(indent, out); - - _indent(indent, out); - - if (m_isStatic) - { - out << "static "; - } - - out << m_fieldType << " " << m_name.getContent() << "\n"; -} - -/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ClassLikeNode !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ - -/// Add a node that is derived from this -void ClassLikeNode::addDerived(ClassLikeNode* derived) -{ - SLANG_ASSERT(derived->m_superNode == nullptr); - derived->m_superNode = this; - m_derivedTypes.add(derived); -} - -void ClassLikeNode::calcDerivedDepthFirst(List<ClassLikeNode*>& outNodes) -{ - outNodes.add(this); - for (ClassLikeNode* derivedType : m_derivedTypes) - { - derivedType->calcDerivedDepthFirst(outNodes); - } -} - -void ClassLikeNode::dumpDerived(int indentCount, StringBuilder& out) -{ - if (isClassLike() && isReflected() && m_name.hasContent()) - { - _indent(indentCount, out); - out << m_name.getContent() << "\n"; - } - - for (ClassLikeNode* derivedType : m_derivedTypes) - { - derivedType->dumpDerived(indentCount + 1, out); - } -} - -Index ClassLikeNode::calcDerivedDepth() const -{ - const ClassLikeNode* node = this; - Index count = 0; - - while (node) - { - count++; - node = node->m_superNode; - } - - return count; -} - -ClassLikeNode* ClassLikeNode::findLastDerived() -{ - for (Index i = m_derivedTypes.getCount() - 1; i >= 0; --i) - { - ClassLikeNode* derivedType = m_derivedTypes[i]; - ClassLikeNode* found = derivedType->findLastDerived(); - if (found) - { - return found; - } - } - return this; -} - -bool ClassLikeNode::hasReflectedDerivedType() const -{ - for (ClassLikeNode* type : m_derivedTypes) - { - if (type->isReflected()) - { - return true; - } - } - return false; -} - -void ClassLikeNode::getReflectedDerivedTypes(List<ClassLikeNode*>& out) const -{ - out.clear(); - for (ClassLikeNode* type : m_derivedTypes) - { - if (type->isReflected()) - { - out.add(type); - } - } -} - -void ClassLikeNode::dump(int indentCount, StringBuilder& out) -{ - dumpMarkup(indentCount, out); - - _indent(indentCount, out); - - const char* typeName = (m_kind == Kind::StructType) ? "struct" : "class"; - - out << typeName << " "; - - if (!isReflected()) - { - out << " ("; - } - out << m_name.getContent(); - if (!isReflected()) - { - out << ") "; - } - - if (m_super.hasContent()) - { - out << " : " << m_super.getContent(); - } - - out << " {\n"; - - for (Node* child : m_children) - { - child->dump(indentCount + 1, out); - } - - _indent(indentCount, out); - out << "}\n"; -} - -} // namespace CppExtract |
