Some refactoring needed to create ranges for JavaScript functions.

This commit is contained in:
Roberto Raggi
2010-02-02 16:36:14 +01:00
parent 03fa188b41
commit 14ffb1e465
8 changed files with 46 additions and 13 deletions

View File

@@ -618,7 +618,7 @@ int QmlCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
const SemanticInfo semanticInfo = edit->semanticInfo();
const QmlJS::Snapshot snapshot = semanticInfo.snapshot;
const Document::Ptr qmlDocument = semanticInfo.document;
const Document::Ptr document = semanticInfo.document;
const QFileInfo currentFileInfo(fileName);
@@ -632,11 +632,11 @@ int QmlCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
// Set up the current scope chain.
Interpreter::ObjectValue *scope = interp.globalObject();
Link link(qmlDocument, snapshot, &interp);
Link link(document, snapshot, &interp);
if (isQmlFile && qmlDocument) {
AST::UiObjectMember *declaringMember = semanticInfo.declaringMember(editor->position());
scope = link.scopeChainAt(qmlDocument, declaringMember);
if (document) {
AST::Node *declaringMember = semanticInfo.declaringMember(editor->position());
scope = link.scopeChainAt(document, declaringMember);
}
// Search for the operator that triggered the completion.

View File

@@ -169,7 +169,7 @@ void QmlHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in
if (m_helpId.isEmpty()) {
AST::Node *node = semanticInfo.nodeUnderCursor(pos);
if (node && !(AST::cast<AST::StringLiteral *>(node) != 0 || AST::cast<AST::NumericLiteral *>(node) != 0)) {
AST::UiObjectMember *declaringMember = semanticInfo.declaringMember(pos);
AST::Node *declaringMember = semanticInfo.declaringMember(pos);
Interpreter::Engine interp;
Link link(qmlDocument, snapshot, &interp);

View File

@@ -409,6 +409,20 @@ protected:
return true;
}
#if 0 // ### create ranges for function declarations.
virtual bool visit(AST::FunctionExpression *ast)
{
_ranges.append(createRange(ast));
return true;
}
virtual bool visit(AST::FunctionDeclaration *ast)
{
_ranges.append(createRange(ast));
return true;
}
#endif
Range createRange(AST::UiObjectMember *member, AST::UiObjectInitializer *ast)
{
Range range;
@@ -422,6 +436,21 @@ protected:
range.end.setPosition(ast->rbraceToken.end());
return range;
}
Range createRange(AST::FunctionExpression *ast)
{
Range range;
range.ast = ast;
range.begin = QTextCursor(_textDocument);
range.begin.setPosition(ast->lbraceToken.begin());
range.end = QTextCursor(_textDocument);
range.end.setPosition(ast->rbraceToken.end());
return range;
}
};
@@ -463,9 +492,9 @@ protected:
} // end of anonymous namespace
AST::UiObjectMember *SemanticInfo::declaringMember(int cursorPosition) const
AST::Node *SemanticInfo::declaringMember(int cursorPosition) const
{
AST::UiObjectMember *declaringMember = 0;
AST::Node *declaringMember = 0;
for (int i = ranges.size() - 1; i != -1; --i) {
const Range &range = ranges.at(i);

View File

@@ -93,7 +93,7 @@ public:
Range(): ast(0) {}
public: // attributes
QmlJS::AST::UiObjectMember *ast;
QmlJS::AST::Node *ast;
QTextCursor begin;
QTextCursor end;
};
@@ -106,7 +106,7 @@ public:
int revision() const;
// Returns the declaring member
QmlJS::AST::UiObjectMember *declaringMember(int cursorPosition) const;
QmlJS::AST::Node *declaringMember(int cursorPosition) const;
// Returns the AST node under cursor
QmlJS::AST::Node *nodeUnderCursor(int cursorPosition) const;