Make QmlJS::Link private. Use Context::build to set up a context.

This commit is contained in:
Christian Kamm
2010-02-04 10:19:37 +01:00
parent 14f483c67b
commit 25e04d8ef1
6 changed files with 40 additions and 39 deletions

View File

@@ -29,6 +29,7 @@
#include "qmljsinterpreter.h"
#include "qmljscheck.h"
#include "qmljslink.h"
#include "parser/qmljsast_p.h"
#include <QtCore/QMetaObject>
#include <QtCore/QMetaProperty>
@@ -688,6 +689,12 @@ Context::~Context()
{
}
void Context::build(AST::Node *node, Document::Ptr doc, const Snapshot &snapshot)
{
Link link(this, doc, snapshot);
link.scopeChainAt(doc, node);
}
Engine *Context::engine() const
{
return _engine;

View File

@@ -30,6 +30,7 @@
#ifndef QMLJS_INTERPRETER_H
#define QMLJS_INTERPRETER_H
#include <qmljs/qmljsdocument.h>
#include <qmljs/qmljs_global.h>
#include <qmljs/qmljsmetatypesystem.h>
#include <qmljs/parser/qmljsastfwd_p.h>
@@ -224,6 +225,8 @@ public:
Context(Engine *engine);
~Context();
void build(AST::Node *node, Document::Ptr doc, const Snapshot &snapshot);
Engine *engine() const;
ScopeChain scopeChain() const;

View File

@@ -12,12 +12,11 @@ using namespace QmlJS;
using namespace QmlJS::Interpreter;
using namespace QmlJS::AST;
Link::Link(Document::Ptr currentDoc, const Snapshot &snapshot, Interpreter::Engine *interp)
Link::Link(Context *context, Document::Ptr currentDoc, const Snapshot &snapshot)
: _snapshot(snapshot)
, _context(interp)
, _context(context)
{
_docs = reachableDocuments(currentDoc, snapshot);
linkImports();
}
@@ -25,25 +24,20 @@ Link::~Link()
{
}
Context *Link::context()
{
return &_context;
}
Interpreter::Engine *Link::engine()
{
return _context.engine();
return _context->engine();
}
void Link::scopeChainAt(Document::Ptr doc, Node *currentObject)
{
_context.pushScope(engine()->globalObject());
_context->pushScope(engine()->globalObject());
if (! doc)
return;
if (doc->qmlProgram() != 0)
_context.setLookupMode(Context::QmlLookup);
_context->setLookupMode(Context::QmlLookup);
Bind *bind = doc->bind();
@@ -52,7 +46,7 @@ void Link::scopeChainAt(Document::Ptr doc, Node *currentObject)
// ### FIXME: May want to link to instantiating components from here.
if (bind->_rootObjectValue)
_context.pushScope(bind->_rootObjectValue);
_context->pushScope(bind->_rootObjectValue);
ObjectValue *scopeObject = 0;
if (UiObjectDefinition *definition = cast<UiObjectDefinition *>(currentObject))
@@ -61,7 +55,7 @@ void Link::scopeChainAt(Document::Ptr doc, Node *currentObject)
scopeObject = bind->_qmlObjects.value(binding);
if (scopeObject && scopeObject != bind->_rootObjectValue)
_context.pushScope(scopeObject);
_context->pushScope(scopeObject);
const QStringList &includedScripts = bind->includedScripts();
for (int index = includedScripts.size() - 1; index != -1; --index) {
@@ -69,19 +63,19 @@ void Link::scopeChainAt(Document::Ptr doc, Node *currentObject)
if (Document::Ptr scriptDoc = _snapshot.document(scriptFile)) {
if (scriptDoc->jsProgram()) {
_context.pushScope(scriptDoc->bind()->_rootObjectValue);
_context->pushScope(scriptDoc->bind()->_rootObjectValue);
}
}
}
if (bind->_functionEnvironment)
_context.pushScope(bind->_functionEnvironment);
_context->pushScope(bind->_functionEnvironment);
if (bind->_idEnvironment)
_context.pushScope(bind->_idEnvironment);
_context->pushScope(bind->_idEnvironment);
if (const ObjectValue *typeEnvironment = _context.typeEnvironment(doc.data()))
_context.pushScope(typeEnvironment);
if (const ObjectValue *typeEnvironment = _context->typeEnvironment(doc.data()))
_context->pushScope(typeEnvironment);
}
void Link::linkImports()
@@ -92,7 +86,7 @@ void Link::linkImports()
// Populate the _typeEnvironment with imports.
populateImportedTypes(typeEnv, doc);
_context.setTypeEnvironment(doc.data(), typeEnv);
_context->setTypeEnvironment(doc.data(), typeEnv);
}
}

View File

@@ -2,34 +2,32 @@
#define QMLJSLINK_H
#include <qmljs/qmljsdocument.h>
#include <qmljs/qmljsbind.h>
#include <qmljs/qmljsinterpreter.h>
#include <qmljs/parser/qmljsastfwd_p.h>
#include <qmljs/parser/qmljsengine_p.h>
#include <QtCore/QList>
#include <QtCore/QHash>
namespace QmlJS {
class NameId;
/*
Temporarily links a set of bound documents together to allow resolving cross-document
dependencies. The link is undone when this object is destoyed.
Helper for building a context.
*/
class QMLJS_EXPORT Link
class Link
{
public:
// Link all documents in snapshot reachable from doc.
Link(Document::Ptr doc, const Snapshot &snapshot, Interpreter::Engine *interp);
Link(Interpreter::Context *context, Document::Ptr doc, const Snapshot &snapshot);
~Link();
Interpreter::Context *context();
Interpreter::Engine *engine();
// Get the scope chain for the currentObject inside doc.
void scopeChainAt(Document::Ptr doc, AST::Node *currentObject);
private:
Interpreter::Engine *engine();
static QList<Document::Ptr> reachableDocuments(Document::Ptr startDoc, const Snapshot &snapshot);
static AST::UiQualifiedId *qualifiedTypeNameId(AST::Node *node);
@@ -44,7 +42,7 @@ private:
private:
Snapshot _snapshot;
Interpreter::Context _context;
Interpreter::Context *_context;
QList<Document::Ptr> _docs;
};