diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index 01cc55c2fa1277fd4a5a35318b6eeaa5929830cd..76a77ac395460cc095865d7c5a68543e4d6f112b 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -1395,13 +1395,6 @@ Context::~Context() { } -void Context::build(const QList<Node *> &astPath, QmlJS::Document::Ptr doc, - const QmlJS::Snapshot &snapshot, const QStringList &importPaths) -{ - Link link(this, doc, snapshot, importPaths); - ScopeBuilder(doc, this).push(astPath); -} - Engine *Context::engine() const { return _engine; diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index 20af34a81ca6577dfb62e993ad4001ccba99611c..ba2ee534ab78f43c4aeea7a0309240b10779c485 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -280,9 +280,6 @@ public: Context(Engine *engine); ~Context(); - void build(const QList<AST::Node *> &astPath, const Document::Ptr doc, - const Snapshot &snapshot, const QStringList &importPaths); - Engine *engine() const; const ScopeChain &scopeChain() const; ScopeChain &scopeChain(); diff --git a/src/libs/qmljs/qmljsscopebuilder.cpp b/src/libs/qmljs/qmljsscopebuilder.cpp index 80b3fbb7d74bfac2972ef6077dd7f7a01285ea84..2cc24a8cd533d04600da37476e2f85df4dfc0a2b 100644 --- a/src/libs/qmljs/qmljsscopebuilder.cpp +++ b/src/libs/qmljs/qmljsscopebuilder.cpp @@ -33,7 +33,8 @@ void ScopeBuilder::push(AST::Node *node) // JS scopes if (FunctionDeclaration *fun = cast<FunctionDeclaration *>(node)) { ObjectValue *functionScope = _doc->bind()->findFunctionScope(fun); - _context->scopeChain().jsScopes += functionScope; + if (functionScope) + _context->scopeChain().jsScopes += functionScope; } _context->scopeChain().update(); diff --git a/src/plugins/qmljseditor/qmljscodecompletion.cpp b/src/plugins/qmljseditor/qmljscodecompletion.cpp index adbd80e0ca647877066893a3ed6b37ab2ffc4b53..556d0a903c6e301c91a74f879c5890653bb34201 100644 --- a/src/plugins/qmljseditor/qmljscodecompletion.cpp +++ b/src/plugins/qmljseditor/qmljscodecompletion.cpp @@ -38,6 +38,7 @@ #include <qmljs/qmljsscanner.h> #include <qmljs/qmljsevaluate.h> #include <qmljs/qmljscompletioncontextfinder.h> +#include <qmljs/qmljslink.h> #include <qmljs/qmljsscopebuilder.h> #include <texteditor/basetexteditor.h> @@ -653,10 +654,11 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) Interpreter::Engine interp; Interpreter::Context context(&interp); + Link link(&context, document, snapshot, m_modelManager->importPaths()); // Set up the current scope chain. - QList<AST::Node *> astPath = semanticInfo.astPath(editor->position()); - context.build(astPath, document, snapshot, m_modelManager->importPaths()); + ScopeBuilder scopeBuilder(document, &context); + scopeBuilder.push(semanticInfo.astPath(editor->position())); // Search for the operator that triggered the completion. QChar completionOperator; diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 2114e03dc03f5a3487a1413b750f69dadafaf463..b0c000cbcf1054683b2613f806639b2ee786c3f0 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -39,6 +39,8 @@ #include <qmljs/qmljscheck.h> #include <qmljs/qmljsevaluate.h> #include <qmljs/qmljsdocument.h> +#include <qmljs/qmljslink.h> +#include <qmljs/qmljsscopebuilder.h> #include <qmljs/parser/qmljsastvisitor_p.h> #include <qmljs/parser/qmljsast_p.h> #include <qmljs/parser/qmljsengine_p.h> @@ -1007,8 +1009,9 @@ TextEditor::BaseTextEditor::Link QmlJSTextEditor::findLinkAt(const QTextCursor & Interpreter::Engine interp; Interpreter::Context context(&interp); - context.build(semanticInfo.astPath(cursorPosition), semanticInfo.document, - semanticInfo.snapshot, m_modelManager->importPaths()); + QmlJS::Link linkedSnapshot(&context, semanticInfo.document, semanticInfo.snapshot, m_modelManager->importPaths()); + ScopeBuilder scopeBuilder(semanticInfo.document, &context); + scopeBuilder.push(semanticInfo.astPath(cursorPosition)); Evaluate check(&context); const Interpreter::Value *value = check.reference(node); @@ -1018,7 +1021,7 @@ TextEditor::BaseTextEditor::Link QmlJSTextEditor::findLinkAt(const QTextCursor & if (! (value && value->getSourceLocation(&fileName, &line, &column))) return Link(); - Link link; + BaseTextEditor::Link link; link.fileName = fileName; link.line = line; link.column = column - 1; // adjust the column diff --git a/src/plugins/qmljseditor/qmljshoverhandler.cpp b/src/plugins/qmljseditor/qmljshoverhandler.cpp index 682ec98717e2f3afd0e24f1b87b979d5bfa1229d..38cc47cae562f306d2fc410fcec29b4c01012054 100644 --- a/src/plugins/qmljseditor/qmljshoverhandler.cpp +++ b/src/plugins/qmljseditor/qmljshoverhandler.cpp @@ -39,6 +39,8 @@ #include <qmljs/qmljsbind.h> #include <qmljs/qmljsevaluate.h> #include <qmljs/qmljsinterpreter.h> +#include <qmljs/qmljslink.h> +#include <qmljs/qmljsscopebuilder.h> #include <qmljs/parser/qmljsast_p.h> #include <texteditor/itexteditor.h> #include <texteditor/basetexteditor.h> @@ -172,7 +174,9 @@ void HoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, int p Interpreter::Engine interp; Interpreter::Context context(&interp); - context.build(astPath, qmlDocument, snapshot, m_modelManager->importPaths()); + Link link(&context, qmlDocument, snapshot, m_modelManager->importPaths()); + ScopeBuilder scopeBuilder(qmlDocument, &context); + scopeBuilder.push(astPath); Evaluate check(&context); const Interpreter::Value *value = check(node);