summaryrefslogtreecommitdiff
path: root/src/plugins/qmljseditor
diff options
context:
space:
mode:
authorChristian Kamm <christian.d.kamm@nokia.com>2011-07-12 14:55:27 +0200
committerChristian Kamm <christian.d.kamm@nokia.com>2011-08-08 12:05:03 +0200
commitf87dc6198609abdb58b430cf272a4e6ca7144865 (patch)
tree738d7024efedab5254676139ca456631e334c78a /src/plugins/qmljseditor
parented1321a4f95d4ecbbd96794ec355cfc7984cfb2d (diff)
downloadqt-creator-f87dc6198609abdb58b430cf272a4e6ca7144865.tar.gz
QmlJS: Split Context and ScopeChain.
Context is created by Link and has information about imports for all Documents in a Snapshot. ScopeChain represents how lookup is done at a specific place in a Document. Change-Id: I874102d57bbaf1a497fa3f27633bed6ee75dcf10 Reviewed-on: http://codereview.qt.nokia.com/1694 Reviewed-by: Fawzi Mohamed <fawzi.mohamed@nokia.com>
Diffstat (limited to 'src/plugins/qmljseditor')
-rw-r--r--src/plugins/qmljseditor/qmljscompletionassist.cpp26
-rw-r--r--src/plugins/qmljseditor/qmljseditor.cpp2
-rw-r--r--src/plugins/qmljseditor/qmljsfindreferences.cpp80
-rw-r--r--src/plugins/qmljseditor/qmljshoverhandler.cpp6
-rw-r--r--src/plugins/qmljseditor/quicktoolbar.cpp2
5 files changed, 59 insertions, 57 deletions
diff --git a/src/plugins/qmljseditor/qmljscompletionassist.cpp b/src/plugins/qmljseditor/qmljscompletionassist.cpp
index 031447eb5f..a2079ccac5 100644
--- a/src/plugins/qmljseditor/qmljscompletionassist.cpp
+++ b/src/plugins/qmljseditor/qmljscompletionassist.cpp
@@ -48,6 +48,7 @@
#include <qmljs/parser/qmljsast_p.h>
#include <qmljs/qmljsinterpreter.h>
#include <qmljs/qmljscontext.h>
+#include <qmljs/qmljsscopechain.h>
#include <qmljs/qmljslookupcontext.h>
#include <qmljs/qmljsscanner.h>
#include <qmljs/qmljsbind.h>
@@ -86,15 +87,15 @@ class EnumerateProperties: private Interpreter::MemberProcessor
bool _globalCompletion;
bool _enumerateGeneratedSlots;
bool _enumerateSlots;
- const Interpreter::Context *_context;
+ const Interpreter::ScopeChain *_scopeChain;
const Interpreter::ObjectValue *_currentObject;
public:
- EnumerateProperties(const Interpreter::Context *context)
+ EnumerateProperties(const Interpreter::ScopeChain *scopeChain)
: _globalCompletion(false),
_enumerateGeneratedSlots(false),
_enumerateSlots(true),
- _context(context),
+ _scopeChain(scopeChain),
_currentObject(0)
{
}
@@ -131,7 +132,7 @@ public:
_properties.clear();
_currentObject = 0;
- foreach (const Interpreter::ObjectValue *scope, _context->scopeChain().all())
+ foreach (const Interpreter::ObjectValue *scope, _scopeChain->all())
enumerateProperties(scope);
return _properties;
@@ -192,7 +193,7 @@ private:
return;
_processed.insert(object);
- enumerateProperties(object->prototype(_context));
+ enumerateProperties(object->prototype(_scopeChain->context()));
object->processMembers(this);
}
@@ -422,6 +423,7 @@ IAssistProposal *QmlJSCompletionAssistProcessor::perform(const IAssistInterface
const QList<AST::Node *> path = semanticInfo.rangePath(m_interface->position());
LookupContext::Ptr lookupContext = semanticInfo.lookupContext(path);
const Interpreter::Context *context = lookupContext->context();
+ const Interpreter::ScopeChain &scopeChain = lookupContext->scopeChain();
// Search for the operator that triggered the completion.
QChar completionOperator;
@@ -521,7 +523,7 @@ IAssistProposal *QmlJSCompletionAssistProcessor::perform(const IAssistInterface
doJsKeywordCompletion = false;
doQmlTypeCompletion = true;
- EnumerateProperties enumerateProperties(context);
+ EnumerateProperties enumerateProperties(&scopeChain);
enumerateProperties.setGlobalCompletion(true);
enumerateProperties.setEnumerateGeneratedSlots(true);
enumerateProperties.setEnumerateSlots(false);
@@ -539,8 +541,8 @@ IAssistProposal *QmlJSCompletionAssistProcessor::perform(const IAssistInterface
contextFinder.isAfterOnInLhsOfBinding());
if (ScopeBuilder::isPropertyChangesObject(context, qmlScopeType)
- && context->scopeChain().qmlScopeObjects.size() == 2) {
- addCompletions(enumerateProperties(context->scopeChain().qmlScopeObjects.first()),
+ && scopeChain.qmlScopeObjects().size() == 2) {
+ addCompletions(enumerateProperties(scopeChain.qmlScopeObjects().first()),
m_interface->symbolIcon(),
SymbolOrder);
}
@@ -564,15 +566,15 @@ IAssistProposal *QmlJSCompletionAssistProcessor::perform(const IAssistInterface
doQmlTypeCompletion = true;
if (doQmlTypeCompletion) {
- if (const Interpreter::ObjectValue *qmlTypes = context->scopeChain().qmlTypes) {
- EnumerateProperties enumerateProperties(context);
+ if (const Interpreter::ObjectValue *qmlTypes = scopeChain.qmlTypes()) {
+ EnumerateProperties enumerateProperties(&scopeChain);
addCompletions(enumerateProperties(qmlTypes), m_interface->symbolIcon(), TypeOrder);
}
}
if (doGlobalCompletion) {
// It's a global completion.
- EnumerateProperties enumerateProperties(context);
+ EnumerateProperties enumerateProperties(&scopeChain);
enumerateProperties.setGlobalCompletion(true);
addCompletions(enumerateProperties(), m_interface->symbolIcon(), SymbolOrder);
}
@@ -619,7 +621,7 @@ IAssistProposal *QmlJSCompletionAssistProcessor::perform(const IAssistInterface
//qDebug() << "type:" << interp->typeId(value);
if (value && completionOperator == QLatin1Char('.')) { // member completion
- EnumerateProperties enumerateProperties(context);
+ EnumerateProperties enumerateProperties(&scopeChain);
if (contextFinder.isInLhsOfBinding() && qmlScopeType) {
enumerateProperties.setEnumerateGeneratedSlots(true);
addCompletionsPropertyLhs(enumerateProperties(value),
diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp
index ebfdf17f0c..1e722884bb 100644
--- a/src/plugins/qmljseditor/qmljseditor.cpp
+++ b/src/plugins/qmljseditor/qmljseditor.cpp
@@ -1260,7 +1260,7 @@ TextEditor::BaseTextEditorWidget::Link QmlJSTextEditorWidget::findLinkAt(const Q
}
LookupContext::Ptr lookupContext = semanticInfo.lookupContext(semanticInfo.rangePath(cursorPosition));
- Evaluate evaluator(lookupContext->context());
+ Evaluate evaluator(&lookupContext->scopeChain());
const Interpreter::Value *value = evaluator.reference(node);
QString fileName;
diff --git a/src/plugins/qmljseditor/qmljsfindreferences.cpp b/src/plugins/qmljseditor/qmljsfindreferences.cpp
index 436af01a5f..1921ebc95d 100644
--- a/src/plugins/qmljseditor/qmljsfindreferences.cpp
+++ b/src/plugins/qmljseditor/qmljsfindreferences.cpp
@@ -80,10 +80,9 @@ public:
FindUsages(Document::Ptr doc, Context *context)
: _doc(doc)
- , _context(context)
- , _builder(context, doc)
+ , _scopeChain(doc, context)
+ , _builder(&_scopeChain)
{
- _builder.initializeRootScope();
}
Result operator()(const QString &name, const ObjectValue *scope)
@@ -106,7 +105,7 @@ protected:
{
if (node->name
&& node->name->asString() == _name
- && _context->scopeChain().qmlScopeObjects.contains(_scope)) {
+ && _scopeChain.qmlScopeObjects().contains(_scope)) {
_usages.append(node->identifierToken);
}
if (AST::cast<Block *>(node->statement)) {
@@ -176,7 +175,7 @@ protected:
return false;
const ObjectValue *scope;
- _context->lookup(_name, &scope);
+ _scopeChain.lookup(_name, &scope);
if (!scope)
return false;
if (check(scope)) {
@@ -188,14 +187,14 @@ protected:
// so it might still be a use - we just found a different value in a different scope first
// if scope is one of these, our match wasn't inside the instantiating components list
- const ScopeChain &chain = _context->scopeChain();
- if (chain.jsScopes.contains(scope)
- || chain.qmlScopeObjects.contains(scope)
- || chain.qmlTypes == scope
- || chain.globalScope == scope)
+ const ScopeChain &chain = _scopeChain;
+ if (chain.jsScopes().contains(scope)
+ || chain.qmlScopeObjects().contains(scope)
+ || chain.qmlTypes() == scope
+ || chain.globalScope() == scope)
return false;
- if (contains(chain.qmlComponentScope.data()))
+ if (contains(chain.qmlComponentChain().data()))
_usages.append(node->identifierToken);
return false;
@@ -206,7 +205,7 @@ protected:
if (!node->name || node->name->asString() != _name)
return true;
- Evaluate evaluate(_context);
+ Evaluate evaluate(&_scopeChain);
const Value *lhsValue = evaluate(node->base);
if (!lhsValue)
return true;
@@ -245,19 +244,19 @@ protected:
}
private:
- bool contains(const ScopeChain::QmlComponentChain *chain)
+ bool contains(const QmlComponentChain *chain)
{
- if (!chain || !chain->document)
+ if (!chain || !chain->document())
return false;
- if (chain->document->bind()->idEnvironment()->lookupMember(_name, _context))
- return chain->document->bind()->idEnvironment() == _scope;
- const ObjectValue *root = chain->document->bind()->rootObjectValue();
- if (root->lookupMember(_name, _context)) {
+ if (chain->document()->bind()->idEnvironment()->lookupMember(_name, _scopeChain.context()))
+ return chain->document()->bind()->idEnvironment() == _scope;
+ const ObjectValue *root = chain->document()->bind()->rootObjectValue();
+ if (root->lookupMember(_name, _scopeChain.context())) {
return check(root);
}
- foreach (const ScopeChain::QmlComponentChain *parent, chain->instantiatingComponents) {
+ foreach (const QmlComponentChain *parent, chain->instantiatingComponents()) {
if (contains(parent))
return true;
}
@@ -269,13 +268,13 @@ private:
if (!s)
return false;
const ObjectValue *definingObject;
- s->lookupMember(_name, _context, &definingObject);
+ s->lookupMember(_name, _scopeChain.context(), &definingObject);
return definingObject == _scope;
}
bool checkQmlScope()
{
- foreach (const ObjectValue *s, _context->scopeChain().qmlScopeObjects) {
+ foreach (const ObjectValue *s, _scopeChain.qmlScopeObjects()) {
if (check(s))
return true;
}
@@ -285,14 +284,14 @@ private:
bool checkLookup()
{
const ObjectValue *scope = 0;
- _context->lookup(_name, &scope);
+ _scopeChain.lookup(_name, &scope);
return check(scope);
}
Result _usages;
Document::Ptr _doc;
- Context *_context;
+ ScopeChain _scopeChain;
ScopeBuilder _builder;
QString _name;
@@ -307,9 +306,9 @@ public:
FindTypeUsages(Document::Ptr doc, Context *context)
: _doc(doc)
, _context(context)
- , _builder(context, doc)
+ , _scopeChain(doc, context)
+ , _builder(&_scopeChain)
{
- _builder.initializeRootScope();
}
Result operator()(const QString &name, const ObjectValue *typeValue)
@@ -380,7 +379,7 @@ protected:
return false;
const ObjectValue *scope;
- const Value *objV = _context->lookup(_name, &scope);
+ const Value *objV = _scopeChain.lookup(_name, &scope);
if (objV == _typeValue)
_usages.append(node->identifierToken);
return false;
@@ -390,7 +389,7 @@ protected:
{
if (!node->name || node->name->asString() != _name)
return true;
- Evaluate evaluate(_context);
+ Evaluate evaluate(&_scopeChain);
const Value *lhsValue = evaluate(node->base);
if (!lhsValue)
return true;
@@ -452,6 +451,7 @@ private:
Document::Ptr _doc;
Context *_context;
+ ScopeChain _scopeChain;
ScopeBuilder _builder;
QString _name;
@@ -466,8 +466,8 @@ public:
TypeKind
};
- FindTargetExpression(Document::Ptr doc, Context *context)
- : _doc(doc), _context(context)
+ FindTargetExpression(Document::Ptr doc, const ScopeChain *scopeChain)
+ : _doc(doc), _scopeChain(scopeChain)
{
}
@@ -488,7 +488,7 @@ public:
const ObjectValue *scope()
{
if (!_scope)
- _context->lookup(_name, &_scope);
+ _scopeChain->lookup(_name, &_scope);
return _scope;
}
@@ -524,7 +524,7 @@ protected:
_name = node->name->asString();
if ((!_name.isEmpty()) && _name.at(0).isUpper()) {
// a possible type
- _targetValue = _context->lookup(_name, &_scope);
+ _targetValue = _scopeChain->lookup(_name, &_scope);
if (value_cast<const ObjectValue*>(_targetValue))
_typeKind = TypeKind;
}
@@ -539,14 +539,14 @@ protected:
_name = node->name->asString();
if ((!_name.isEmpty()) && _name.at(0).isUpper()) {
// a possible type
- Evaluate evaluate(_context);
+ Evaluate evaluate(_scopeChain);
const Value *lhsValue = evaluate(node->base);
if (!lhsValue)
return true;
const ObjectValue *lhsObj = lhsValue->asObjectValue();
if (lhsObj) {
_scope = lhsObj;
- _targetValue = lhsObj->lookupMember(_name, _context);
+ _targetValue = lhsObj->lookupMember(_name, _scopeChain->context());
_typeKind = TypeKind;
}
}
@@ -593,7 +593,7 @@ protected:
if (containsOffset(node->typeToken)){
if (node->memberType){
_name = node->memberType->asString();
- _targetValue = _context->lookupType(_doc.data(), QStringList(_name));
+ _targetValue = _scopeChain->context()->lookupType(_doc.data(), QStringList(_name));
_scope = 0;
_typeKind = TypeKind;
}
@@ -654,7 +654,7 @@ private:
{
for (UiQualifiedId *att = id; att; att = att->next) {
if (att->name && containsOffset(att->identifierToken)) {
- _targetValue = _context->lookupType(_doc.data(), id, att->next);
+ _targetValue = _scopeChain->context()->lookupType(_doc.data(), id, att->next);
_scope = 0;
_name = att->name->asString();
_typeKind = TypeKind;
@@ -666,7 +666,7 @@ private:
void setScope(Node *node)
{
- Evaluate evaluate(_context);
+ Evaluate evaluate(_scopeChain);
const Value *v = evaluate(node);
if (v)
_scope = v->asObjectValue();
@@ -677,7 +677,7 @@ private:
const Value *_targetValue;
Node *_objectNode;
Document::Ptr _doc;
- Context *_context;
+ const ScopeChain *_scopeChain;
quint32 _offset;
Kind _typeKind;
};
@@ -823,12 +823,12 @@ static void find_helper(QFutureInterface<FindReferences::Usage> &future,
Link link(snapshot, modelManager->importPaths(), modelManager->builtins(doc));
Context context = link();
- ScopeBuilder builder(&context, doc);
- builder.initializeRootScope();
+ ScopeChain scopeChain(doc, &context);
+ ScopeBuilder builder(&scopeChain);
ScopeAstPath astPath(doc);
builder.push(astPath(offset));
- FindTargetExpression findTarget(doc, &context);
+ FindTargetExpression findTarget(doc, &scopeChain);
findTarget(offset);
const QString &name = findTarget.name();
if (name.isEmpty())
diff --git a/src/plugins/qmljseditor/qmljshoverhandler.cpp b/src/plugins/qmljseditor/qmljshoverhandler.cpp
index ee7a17deb1..57f1921f4b 100644
--- a/src/plugins/qmljseditor/qmljshoverhandler.cpp
+++ b/src/plugins/qmljseditor/qmljshoverhandler.cpp
@@ -186,7 +186,7 @@ bool HoverHandler::matchColorItem(const LookupContext::Ptr &lookupContext,
} else if (const AST::UiPublicMember *publicMember =
AST::cast<const AST::UiPublicMember *>(member)) {
if (publicMember->name && posIsInSource(pos, publicMember->statement)) {
- value = lookupContext->context()->lookup(publicMember->name->asString());
+ value = lookupContext->scopeChain().lookup(publicMember->name->asString());
if (const Interpreter::Reference *ref = value->asReference())
value = lookupContext->context()->lookupReference(ref);
color = textAt(qmlDocument,
@@ -306,7 +306,7 @@ static const Interpreter::ObjectValue *isMember(const LookupContext::Ptr &lookup
if (!identExp->name)
return 0;
*name = identExp->name->asString();
- lookupContext->context()->lookup(*name, &owningObject);
+ lookupContext->scopeChain().lookup(*name, &owningObject);
} else if (AST::FieldMemberExpression *fme = AST::cast<AST::FieldMemberExpression *>(node)) {
if (!fme->base || !fme->name)
return 0;
@@ -321,7 +321,7 @@ static const Interpreter::ObjectValue *isMember(const LookupContext::Ptr &lookup
if (!qid->name)
return 0;
*name = qid->name->asString();
- const Interpreter::Value *value = lookupContext->context()->lookup(*name, &owningObject);
+ const Interpreter::Value *value = lookupContext->scopeChain().lookup(*name, &owningObject);
for (AST::UiQualifiedId *it = qid->next; it; it = it->next) {
if (!value)
return 0;
diff --git a/src/plugins/qmljseditor/quicktoolbar.cpp b/src/plugins/qmljseditor/quicktoolbar.cpp
index 4d86052feb..9c4fe1a372 100644
--- a/src/plugins/qmljseditor/quicktoolbar.cpp
+++ b/src/plugins/qmljseditor/quicktoolbar.cpp
@@ -78,7 +78,7 @@ static inline const Interpreter::ObjectValue * getPropertyChangesTarget(Node *no
if (scriptBinding->qualifiedId
&& scriptBinding->qualifiedId->name->asString() == QLatin1String("target")
&& ! scriptBinding->qualifiedId->next) {
- Evaluate evaluator(lookupContext->context());
+ Evaluate evaluator(&lookupContext->scopeChain());
const Interpreter::Value *targetValue = evaluator(scriptBinding->statement);
if (const Interpreter::ObjectValue *targetObject = Interpreter::value_cast<const Interpreter::ObjectValue *>(targetValue)) {
return targetObject;