aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/qmljs/qmljscheck.cpp
diff options
context:
space:
mode:
authorRoberto Raggi <[email protected]>2010-02-08 12:50:10 +0100
committerRoberto Raggi <[email protected]>2010-02-09 11:37:58 +0100
commit967ed09c29198a9d7023cc37d2f0c2b9e854ae4f (patch)
tree9c74f03b69a039071fbb05838bfaf255de8f80c7 /src/libs/qmljs/qmljscheck.cpp
parentb02d2f9f00a947e02945e681732fc0d6ef2be844 (diff)
Initial support of `Follow symbol under cursor' for QML/JS.
Diffstat (limited to 'src/libs/qmljs/qmljscheck.cpp')
-rw-r--r--src/libs/qmljs/qmljscheck.cpp30
1 files changed, 15 insertions, 15 deletions
diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp
index f25a7df52f0..0cb1e77b9a3 100644
--- a/src/libs/qmljs/qmljscheck.cpp
+++ b/src/libs/qmljs/qmljscheck.cpp
@@ -51,10 +51,18 @@ Check::~Check()
const Interpreter::Value *Check::operator()(AST::Node *ast)
{
- return check(ast);
+ const Value *result = reference(ast);
+
+ if (const Reference *ref = value_cast<const Reference *>(result))
+ result = ref->value(_context);
+
+ if (! result)
+ result = _engine->undefinedValue();
+
+ return result;
}
-const Interpreter::Value *Check::check(AST::Node *ast)
+const Interpreter::Value *Check::reference(AST::Node *ast)
{
// save the result
const Value *previousResult = switchResult(0);
@@ -63,15 +71,7 @@ const Interpreter::Value *Check::check(AST::Node *ast)
accept(ast);
// restore the previous result
- const Value *result = switchResult(previousResult);
-
- if (const Reference *ref = value_cast<const Reference *>(result))
- result = ref->value(_context);
-
- if (! result)
- result = _engine->undefinedValue();
-
- return result;
+ return switchResult(previousResult);
}
Interpreter::Engine *Check::switchEngine(Interpreter::Engine *engine)
@@ -309,7 +309,7 @@ bool Check::visit(AST::FieldMemberExpression *ast)
if (! ast->name)
return false;
- if (const Interpreter::Value *base = _engine->convertToObject(check(ast->base))) {
+ if (const Interpreter::Value *base = _engine->convertToObject(reference(ast->base))) {
if (const Interpreter::ObjectValue *obj = base->asObjectValue()) {
_result = obj->property(ast->name->asString(), _context);
}
@@ -320,7 +320,7 @@ bool Check::visit(AST::FieldMemberExpression *ast)
bool Check::visit(AST::NewMemberExpression *ast)
{
- if (const FunctionValue *ctor = value_cast<const FunctionValue *>(check(ast->base))) {
+ if (const FunctionValue *ctor = value_cast<const FunctionValue *>(reference(ast->base))) {
_result = ctor->construct();
}
return false;
@@ -328,7 +328,7 @@ bool Check::visit(AST::NewMemberExpression *ast)
bool Check::visit(AST::NewExpression *ast)
{
- if (const FunctionValue *ctor = value_cast<const FunctionValue *>(check(ast->expression))) {
+ if (const FunctionValue *ctor = value_cast<const FunctionValue *>(reference(ast->expression))) {
_result = ctor->construct();
}
return false;
@@ -336,7 +336,7 @@ bool Check::visit(AST::NewExpression *ast)
bool Check::visit(AST::CallExpression *ast)
{
- if (const Interpreter::Value *base = check(ast->base)) {
+ if (const Interpreter::Value *base = reference(ast->base)) {
if (const Interpreter::FunctionValue *obj = base->asFunctionValue()) {
_result = obj->returnValue();
}