diff --git a/duchain/contextbuilder.cpp b/duchain/contextbuilder.cpp index 4327089..fbfebe9 100644 --- a/duchain/contextbuilder.cpp +++ b/duchain/contextbuilder.cpp @@ -1,88 +1,88 @@ #include "contextbuilder.h" #include #include #include #include "rustducontext.h" #include "nodetraits.h" namespace Rust { RSVisitResult visitCallback(RSNode *node, RSNode *parent, void *data); -RangeInRevision ContextBuilder::editorFindSpellingRange(RustNode *node, const Identifier& identifier) +RangeInRevision ContextBuilder::editorFindSpellingRange(RustNode *node, const QString& identifier) { RSRange range = node_get_spelling_range(node->data()); KTextEditor::Range incorrectRange = KTextEditor::Range(range.start.line - 1, range.start.column, INT_MAX, INT_MAX); IDocument *document = ICore::self()->documentController() ->documentForUrl(topContext()->url().toUrl()); QVector ranges; if (document) { - ranges = document->textDocument()->searchText(incorrectRange, identifier.toString()); + ranges = document->textDocument()->searchText(incorrectRange, identifier); } else { ranges = { KTextEditor::Range::invalid() }; } return RangeInRevision::castFromSimpleRange(ranges.first()); } void ContextBuilder::visitChildren(RustNode *node) { visit_children(node->data(), visitCallback, this); } void ContextBuilder::startVisiting(RustNode *node) { visitChildren(node); } void ContextBuilder::setContextOnNode(RustNode *node, KDevelop::DUContext *context) { node->setContext(context); } KDevelop::DUContext *ContextBuilder::contextFromNode(RustNode *node) { return node->getContext(); } KDevelop::RangeInRevision ContextBuilder::editorFindRange(RustNode *fromNode, RustNode *toNode) { RSRange fromRange = node_get_extent(fromNode->data()); RSRange toRange = node_get_extent(toNode->data()); return RangeInRevision(fromRange.start.line - 1, fromRange.start.column, toRange.end.line - 1, toRange.end.column); } KDevelop::QualifiedIdentifier ContextBuilder::identifierForNode(RustPath *node) { return QualifiedIdentifier(node->value); } KDevelop::DUContext *ContextBuilder::newContext(const KDevelop::RangeInRevision &range) { return new RustNormalDUContext(range, currentContext()); } KDevelop::TopDUContext *ContextBuilder::newTopContext(const KDevelop::RangeInRevision &range, KDevelop::ParsingEnvironmentFile *file) { if (!file) { file = new ParsingEnvironmentFile(document()); file->setLanguage(IndexedString("Rust")); } return new RustTopDUContext(document(), range, file); } RSVisitResult visitCallback(RSNode *node, RSNode *parent, void *data) { ContextBuilder *builder = static_cast(data); RustNode currentNode(node); RustNode parentNode(parent); return builder->visitNode(¤tNode, &parentNode); } } diff --git a/duchain/contextbuilder.h b/duchain/contextbuilder.h index 5c465bf..83955aa 100644 --- a/duchain/contextbuilder.h +++ b/duchain/contextbuilder.h @@ -1,42 +1,42 @@ #ifndef CONTEXTBUILDER_H #define CONTEXTBUILDER_H #include #include "rustnode.h" namespace Rust { using ContextBuilderBase = KDevelop::AbstractContextBuilder; class ContextBuilder : public ContextBuilderBase { public: ContextBuilder() = default; virtual ~ContextBuilder() = default; protected: - KDevelop::RangeInRevision editorFindSpellingRange(RustNode *node, const KDevelop::Identifier &identifier); + KDevelop::RangeInRevision editorFindSpellingRange(RustNode *node, const QString &identifier); template KDevelop::DUContext *createContext(RSNode *node, const KDevelop::QualifiedIdentifier& scopeId); virtual RSVisitResult visitNode(RustNode *node, RustNode *parent) = 0; void visitChildren(RustNode *node); void startVisiting(RustNode *node) override; void setContextOnNode(RustNode *node, KDevelop::DUContext *context) override; KDevelop::DUContext *contextFromNode(RustNode *node) override; KDevelop::RangeInRevision editorFindRange(RustNode *fromNode, RustNode *toNode) override; KDevelop::QualifiedIdentifier identifierForNode(RustPath *node) override; KDevelop::DUContext *newContext(const KDevelop::RangeInRevision &range) override; KDevelop::TopDUContext *newTopContext(const KDevelop::RangeInRevision &range, KDevelop::ParsingEnvironmentFile *file) override; private: friend RSVisitResult visitCallback(RSNode *node, RSNode *parent, void *data); }; } #endif // CONTEXTBUILDER_H diff --git a/duchain/declarationbuilder.cpp b/duchain/declarationbuilder.cpp index 009c110..aef6b0e 100644 --- a/duchain/declarationbuilder.cpp +++ b/duchain/declarationbuilder.cpp @@ -1,152 +1,152 @@ #include "declarationbuilder.h" #include #include #include "types/declarationtypes.h" #include "nodetraits.h" #include "rustdebug.h" namespace Rust { using namespace KDevelop; RSVisitResult DeclarationBuilder::visitNode(RustNode *node, RustNode *parent) { RSNodeKind kind = node_get_kind(node->data()); switch (kind) { case StructDecl: return buildDeclaration(node, parent); case EnumDecl: return buildDeclaration(node, parent); case FunctionDecl: return buildDeclaration(node, parent); case ImplDecl: return buildDeclaration(node, parent); case TraitDecl: return buildDeclaration(node, parent); case TypeAliasDecl: return buildDeclaration(node, parent); case EnumVariantDecl: return buildDeclaration(node, parent); case FieldDecl: return buildDeclaration(node, parent); case VarDecl: return buildDeclaration(node, parent); default: return Recurse; } } template RSVisitResult DeclarationBuilder::buildDeclaration(RustNode *node, RustNode *parent) { Q_UNUSED(parent); constexpr bool hasContext = NodeTraits::hasContext(Kind); RustPath name(node); RSRange range = node_get_spelling_range(node->data()); RSRange extent = node_get_extent(node->data()); qCDebug(KDEV_RUST) << "DECLARATION:" << name.value << "; spelling range: (" << range.start.line << ":" << range.start.column << "-" << range.end.line << ":" << range.end.column << "); extent: (" << extent.start.line << ":" << extent.start.column << "-" << extent.end.line << ":" << extent.end.column << ")"; if (hasContext) { - createDeclaration(node, Identifier(name.value)); + createDeclaration(node, &name); openContext(node, NodeTraits::contextType(Kind), &name); visitChildren(node); closeContext(); eventuallyAssignInternalContext(); closeDeclaration(); return Continue; } - createDeclaration(node, Identifier(name.value)); + createDeclaration(node, &name); return Recurse; } template -Declaration *DeclarationBuilder::createDeclaration(RustNode *node, const Identifier &id) +Declaration *DeclarationBuilder::createDeclaration(RustNode *node, RustPath *name) { - auto range = editorFindSpellingRange(node, id); + auto range = editorFindSpellingRange(node, name->value); - Declaration *decl = openDeclaration::Type>(id, range); + Declaration *decl = openDeclaration::Type>(Identifier(name->value), range); auto type = createType(node); openType(type); if (Kind == TypeAliasDecl) { decl->setIsTypeAlias(true); } if (NodeTraits::isTypeDeclaration(Kind)) { decl->setKind(Declaration::Type); } setDeclData(decl); setType(decl, type.data()); closeType(); return decl; } template > typename IdType::Type::Ptr DeclarationBuilder::createType(RustNode *node) { Q_UNUSED(node); return typename IdType::Type::Ptr(new typename IdType::Type); } template > FunctionType::Ptr DeclarationBuilder::createType(RustNode *node) { Q_UNUSED(node); return FunctionType::Ptr(new FunctionType); } template > AbstractType::Ptr DeclarationBuilder::createType(RustNode *node) { Q_UNUSED(node); return AbstractType::Ptr(nullptr); } template void DeclarationBuilder::setType(Declaration *decl, typename IdType::Type *type) { setType(decl, static_cast(type)); setType(decl, static_cast(type)); } template void DeclarationBuilder::setType(Declaration *decl, IdentifiedType *type) { type->setDeclaration(decl); } template void DeclarationBuilder::setType(Declaration *decl, AbstractType *type) { decl->setAbstractType(AbstractType::Ptr(type)); } template> void DeclarationBuilder::setDeclData(ClassDeclaration *decl) { if (Kind == StructDecl || Kind == ImplDecl) { decl->setClassType(ClassDeclarationData::Struct); } else if (Kind == TraitDecl) { decl->setClassType(ClassDeclarationData::Trait); } } template void DeclarationBuilder::setDeclData(Declaration *decl) { } } diff --git a/duchain/declarationbuilder.h b/duchain/declarationbuilder.h index f0a537b..e7d3b2e 100644 --- a/duchain/declarationbuilder.h +++ b/duchain/declarationbuilder.h @@ -1,70 +1,70 @@ #ifndef DECLARATIONBUILDER_H #define DECLARATIONBUILDER_H #include #include #include #include #include "duchain/types/declarationtypes.h" #include "duchain/contextbuilder.h" #include "duchain/nodetraits.h" #include "duchain/rustnode.h" #include "duchain/astredux.h" namespace Rust { using TypeBuilderBase = KDevelop::AbstractTypeBuilder; using DeclarationBuilderBase = KDevelop::AbstractDeclarationBuilder; namespace detail { enum class enabler {}; } constexpr detail::enabler dummy = {}; template using EnableIf = typename std::enable_if::type; class DeclarationBuilder : public DeclarationBuilderBase { public: DeclarationBuilder() = default; virtual ~DeclarationBuilder() = default; protected: virtual RSVisitResult visitNode(RustNode *node, RustNode *parent); private: template RSVisitResult buildDeclaration(RustNode *node, RustNode *parent); template - KDevelop::Declaration *createDeclaration(RustNode *node, const KDevelop::Identifier &id); + KDevelop::Declaration *createDeclaration(RustNode *node, RustPath *names); template = dummy> typename IdType::Type::Ptr createType(RustNode *node); template = dummy> KDevelop::FunctionType::Ptr createType(RustNode *node); template = dummy> KDevelop::AbstractType::Ptr createType(RustNode *node); template void setDeclData(KDevelop::Declaration *decl); template = dummy> void setDeclData(KDevelop::ClassDeclaration *decl); template void setType(KDevelop::Declaration *decl, typename IdType::Type *type); template void setType(KDevelop::Declaration *decl, KDevelop::IdentifiedType *type); template void setType(KDevelop::Declaration *decl, KDevelop::AbstractType *type); }; } #endif // DECLARATIONBUILDER_H