diff options
author | Roberto Raggi <[email protected]> | 2010-02-08 12:50:10 +0100 |
---|---|---|
committer | Roberto Raggi <[email protected]> | 2010-02-09 11:37:58 +0100 |
commit | 967ed09c29198a9d7023cc37d2f0c2b9e854ae4f (patch) | |
tree | 9c74f03b69a039071fbb05838bfaf255de8f80c7 /src/libs/qmljs/qmljscheck.cpp | |
parent | b02d2f9f00a947e02945e681732fc0d6ef2be844 (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.cpp | 30 |
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(); } |