eduucaldas updated this revision to Diff 284324. eduucaldas added a comment.
Implement `canBeEmpty`, `getDelimiterToken`, `getTerminationKind` for `NestedNameSpecifier` Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D85440/new/ https://reviews.llvm.org/D85440 Files: clang/include/clang/Tooling/Syntax/Nodes.h clang/lib/Tooling/Syntax/BuildTree.cpp clang/lib/Tooling/Syntax/Nodes.cpp clang/lib/Tooling/Syntax/Tree.cpp
Index: clang/lib/Tooling/Syntax/Tree.cpp =================================================================== --- clang/lib/Tooling/Syntax/Tree.cpp +++ clang/lib/Tooling/Syntax/Tree.cpp @@ -357,21 +357,38 @@ return children; } -// The methods below can't be implemented without information about the derived -// list. These methods will be implemented by switching on the derived list's -// `NodeKind` - clang::tok::TokenKind syntax::List::getDelimiterTokenKind() { - llvm_unreachable("There are no subclasses of List, thus " - "getDelimiterTokenKind() cannot be called"); + switch (this->kind()) { + case NodeKind::NestedNameSpecifier: { + return clang::tok::coloncolon; + } + default: { + llvm_unreachable("This is not a subclass of List, thus " + "getDelimiterTokenKind() cannot be called"); + } + } } syntax::List::TerminationKind syntax::List::getTerminationKind() { - llvm_unreachable("There are no subclasses of List, thus getTerminationKind() " - "cannot be called"); + switch (this->kind()) { + case NodeKind::NestedNameSpecifier: { + return TerminationKind::Terminated; + } + default: { + llvm_unreachable("This is not a subclass of List, thus " + "getTerminationKind() cannot be called"); + } + } } bool syntax::List::canBeEmpty() { - llvm_unreachable( - "There are no subclasses of List, thus canBeEmpty() cannot be called"); + switch (this->kind()) { + case NodeKind::NestedNameSpecifier: { + return false; + } + default: { + llvm_unreachable("This is not a subclass of List, thus canBeEmpty() " + "cannot be called"); + } + } } Index: clang/lib/Tooling/Syntax/Nodes.cpp =================================================================== --- clang/lib/Tooling/Syntax/Nodes.cpp +++ clang/lib/Tooling/Syntax/Nodes.cpp @@ -200,30 +200,32 @@ return OS << "IdExpression_id"; case syntax::NodeRole::IdExpression_qualifier: return OS << "IdExpression_qualifier"; - case syntax::NodeRole::NestedNameSpecifier_specifier: - return OS << "NestedNameSpecifier_specifier"; - case syntax::NodeRole::NestedNameSpecifier_delimiter: - return OS << "NestedNameSpecifier_delimiter"; case syntax::NodeRole::ParenExpression_subExpression: return OS << "ParenExpression_subExpression"; } llvm_unreachable("invalid role"); } -std::vector<syntax::Leaf *> syntax::NestedNameSpecifier::delimiters() { - std::vector<syntax::Leaf *> Children; - for (auto *C = firstChild(); C; C = C->nextSibling()) { - assert(C->role() == syntax::NodeRole::NestedNameSpecifier_delimiter); - Children.push_back(llvm::cast<syntax::Leaf>(C)); +// We could have an interator in list to not pay memory costs of temporary +// vector +std::vector<syntax::NameSpecifier *> syntax::NestedNameSpecifier::specifiers() { + auto specifiersAsNodes = getElementsAsNodes(); + std::vector<syntax::NameSpecifier *> Children; + for (const auto &element : specifiersAsNodes) { + Children.push_back(llvm::cast<syntax::NameSpecifier>(element)); } return Children; } -std::vector<syntax::NameSpecifier *> syntax::NestedNameSpecifier::specifiers() { - std::vector<syntax::NameSpecifier *> Children; - for (auto *C = firstChild(); C; C = C->nextSibling()) { - assert(C->role() == syntax::NodeRole::NestedNameSpecifier_specifier); - Children.push_back(cast<syntax::NameSpecifier>(C)); +std::vector<syntax::List::ElementAndDelimiter<syntax::NameSpecifier>> +syntax::NestedNameSpecifier::specifiersAndDoubleColons() { + auto specifiersAsNodesAndDoubleColons = getElementsAsNodesAndDelimiters(); + std::vector<syntax::List::ElementAndDelimiter<syntax::NameSpecifier>> + Children; + for (const auto &specifierAndDoubleColon : specifiersAsNodesAndDoubleColons) { + Children.push_back( + {llvm::cast<syntax::NameSpecifier>(specifierAndDoubleColon.element), + specifierAndDoubleColon.delimiter}); } return Children; } Index: clang/lib/Tooling/Syntax/BuildTree.cpp =================================================================== --- clang/lib/Tooling/Syntax/BuildTree.cpp +++ clang/lib/Tooling/Syntax/BuildTree.cpp @@ -809,9 +809,8 @@ if (!isa<syntax::GlobalNameSpecifier>(NS)) Builder.foldNode(Builder.getRange(getLocalSourceRange(it)).drop_back(), NS, it); - Builder.markChild(NS, syntax::NodeRole::NestedNameSpecifier_specifier); - Builder.markChildToken(it.getEndLoc(), - syntax::NodeRole::NestedNameSpecifier_delimiter); + Builder.markChild(NS, syntax::NodeRole::List_element); + Builder.markChildToken(it.getEndLoc(), syntax::NodeRole::List_delimiter); } auto *NNS = new (allocator()) syntax::NestedNameSpecifier; Builder.foldNode(Builder.getRange(QualifierLoc.getSourceRange()), NNS, Index: clang/include/clang/Tooling/Syntax/Nodes.h =================================================================== --- clang/include/clang/Tooling/Syntax/Nodes.h +++ clang/include/clang/Tooling/Syntax/Nodes.h @@ -173,8 +173,6 @@ ParametersAndQualifiers_trailingReturn, IdExpression_id, IdExpression_qualifier, - NestedNameSpecifier_specifier, - NestedNameSpecifier_delimiter, ParenExpression_subExpression }; /// For debugging purposes. @@ -262,14 +260,15 @@ /// Models a `nested-name-specifier`. C++ [expr.prim.id.qual] /// e.g. the `std::vector<int>::` in `std::vector<int>::size`. -class NestedNameSpecifier final : public Tree { +class NestedNameSpecifier final : public List { public: - NestedNameSpecifier() : Tree(NodeKind::NestedNameSpecifier) {} + NestedNameSpecifier() : List(NodeKind::NestedNameSpecifier) {} static bool classof(const Node *N) { return N->kind() <= NodeKind::NestedNameSpecifier; } std::vector<NameSpecifier *> specifiers(); - std::vector<Leaf *> delimiters(); + std::vector<List::ElementAndDelimiter<syntax::NameSpecifier>> + specifiersAndDoubleColons(); }; /// Models an `unqualified-id`. C++ [expr.prim.id.unqual]
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits