diff options
author | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-06-14 15:02:05 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-06-14 15:03:10 +0200 |
commit | 41bb1a8b86774c52e1da94b5f553f30dfb187077 (patch) | |
tree | a2f44ac50d4433042dc541656eaa288ffcbd2d39 | |
parent | 297b281cede2a1c5cdac4ca7512273774f1eee2a (diff) | |
download | qt-creator-41bb1a8b86774c52e1da94b5f553f30dfb187077.tar.gz |
Added refactoring action to create component from object definition.
-rw-r--r-- | src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp | 134 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmljscomponentfromobjectdef.h | 54 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmljseditor.pro | 6 | ||||
-rw-r--r-- | src/plugins/qmljseditor/qmljsquickfix.cpp | 2 |
4 files changed, 194 insertions, 2 deletions
diff --git a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp new file mode 100644 index 0000000000..38c0a0abd1 --- /dev/null +++ b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp @@ -0,0 +1,134 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "qmljscomponentfromobjectdef.h" +#include "qmljsrefactoringchanges.h" + +#include <coreplugin/ifile.h> + +#include <qmljs/parser/qmljsast_p.h> +#include <qmljs/qmljsdocument.h> + +#include <QtCore/QCoreApplication> +#include <QtCore/QDir> +#include <QtCore/QFileInfo> + +#include <QDebug> + +using namespace QmlJS::AST; +using namespace QmlJSEditor::Internal; + +ComponentFromObjectDef::ComponentFromObjectDef(TextEditor::BaseTextEditor *editor) + : QmlJSQuickFixOperation(editor), _objDef(0) +{} + +static QString getId(UiObjectDefinition *def) +{ + if (def && def->initializer) { + for (UiObjectMemberList *iter = def->initializer->members; iter; iter = iter->next) { + if (UiScriptBinding *script = cast<UiScriptBinding*>(iter->member)) { + if (!script->qualifiedId) + continue; + if (script->qualifiedId->next) + continue; + if (script->qualifiedId->name) { + if (script->qualifiedId->name->asString() == QLatin1String("id")) { + ExpressionStatement *expStmt = cast<ExpressionStatement *>(script->statement); + if (!expStmt) + continue; + if (IdentifierExpression *idExp = cast<IdentifierExpression *>(expStmt->expression)) { + return idExp->name->asString(); + } else if (StringLiteral *strExp = cast<StringLiteral *>(expStmt->expression)) { + return strExp->value->asString(); + } + } + } + } + } + } + + return QString(); +} + +QString ComponentFromObjectDef::description() const +{ + return QCoreApplication::translate("QmlJSEditor::ComponentFromObjectDef", + "Extract Component"); +} + +void ComponentFromObjectDef::createChangeSet() +{ + Q_ASSERT(_objDef != 0); + + QString componentName = getId(_objDef); + componentName[0] = componentName.at(0).toUpper(); + + const QString path = editor()->file()->fileName(); + const QString fileName = QFileInfo(path).path() + QDir::separator() + componentName + QLatin1String(".qml"); + + QString imports; + UiProgram *prog = semanticInfo().document->qmlProgram(); + if (prog && prog->imports) { + const int start = position(prog->imports->firstSourceLocation()); + const int end = position(prog->members->member->firstSourceLocation()); + imports = textOf(start, end); + } + + const int start = position(_objDef->firstSourceLocation()); + const int end = position(_objDef->lastSourceLocation()); + const QString txt = imports + textOf(start, end) + QLatin1String("}\n"); + + replace(start, end, componentName + QLatin1String(" {\n")); + reindent(range(start, end + 1)); + + qmljsRefactoringChanges()->createFile(fileName, txt); + qmljsRefactoringChanges()->reindent(fileName, range(0, txt.length() - 1)); +} + +int ComponentFromObjectDef::check() +{ + _objDef = 0; + const int pos = textCursor().position(); + + QList<Node *> path = semanticInfo().astPath(pos); + for (int i = path.size() - 1; i >= 0; --i) { + Node *node = path.at(i); + qDebug() << "path component" << i << typeid(*node).name(); + if (UiObjectDefinition *objDef = cast<UiObjectDefinition *>(node)) { + if (i > 0 && !cast<UiProgram*>(path.at(i - 1))) { // node is not the root node + if (!getId(objDef).isEmpty()) { + _objDef = objDef; + return 0; + } + } + } + } + + return -1; +} diff --git a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.h b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.h new file mode 100644 index 0000000000..5957f4e5a7 --- /dev/null +++ b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.h @@ -0,0 +1,54 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef QMLJSCOMPONENTFROMOBJECTDEF_H +#define QMLJSCOMPONENTFROMOBJECTDEF_H + +#include "qmljsquickfix.h" + +namespace QmlJSEditor { +namespace Internal { + +class ComponentFromObjectDef: public QmlJSQuickFixOperation +{ +public: + ComponentFromObjectDef(TextEditor::BaseTextEditor *editor); + + virtual QString description() const; + virtual void createChangeSet(); + virtual int check(); + +private: + QmlJS::AST::UiObjectDefinition *_objDef; +}; + +} // namespace Internal +} // namespace QmlJSEditor + +#endif // QMLJSCOMPONENTFROMOBJECTDEF_H diff --git a/src/plugins/qmljseditor/qmljseditor.pro b/src/plugins/qmljseditor/qmljseditor.pro index cf715dfe2b..88daee54c7 100644 --- a/src/plugins/qmljseditor/qmljseditor.pro +++ b/src/plugins/qmljseditor/qmljseditor.pro @@ -22,7 +22,8 @@ HEADERS += \ qmljsmodelmanager.h \ qmljspreviewrunner.h \ qmljsquickfix.h \ - qmljsrefactoringchanges.h + qmljsrefactoringchanges.h \ + qmljscomponentfromobjectdef.h SOURCES += \ qmljscodecompletion.cpp \ @@ -37,7 +38,8 @@ SOURCES += \ qmljsmodelmanager.cpp \ qmljspreviewrunner.cpp \ qmljsquickfix.cpp \ - qmljsrefactoringchanges.cpp + qmljsrefactoringchanges.cpp \ + qmljscomponentfromobjectdef.cpp RESOURCES += qmljseditor.qrc OTHER_FILES += QmlJSEditor.pluginspec QmlJSEditor.mimetypes.xml diff --git a/src/plugins/qmljseditor/qmljsquickfix.cpp b/src/plugins/qmljseditor/qmljsquickfix.cpp index b7ab218e1b..d64cee547e 100644 --- a/src/plugins/qmljseditor/qmljsquickfix.cpp +++ b/src/plugins/qmljseditor/qmljsquickfix.cpp @@ -28,6 +28,7 @@ **************************************************************************/ #include "qmljsquickfix.h" +#include "qmljscomponentfromobjectdef.h" #include "qmljseditor.h" #include "qmljsrefactoringchanges.h" #include "qmljs/parser/qmljsast_p.h" @@ -228,5 +229,6 @@ QList<TextEditor::QuickFixOperation::Ptr> QmlJSQuickFixCollector::quickFixOperat { QList<TextEditor::QuickFixOperation::Ptr> quickFixOperations; quickFixOperations.append(TextEditor::QuickFixOperation::Ptr(new SplitInitializerOp(editor))); + quickFixOperations.append(TextEditor::QuickFixOperation::Ptr(new ComponentFromObjectDef(editor))); return quickFixOperations; } |