forked from qt-creator/qt-creator
Merge branch 'master' of git@scm.dev.nokia.troll.no:creator/mainline
This commit is contained in:
@@ -140,7 +140,6 @@ struct EditorManagerPrivate {
|
|||||||
Internal::SplitterOrView *m_splitter;
|
Internal::SplitterOrView *m_splitter;
|
||||||
QPointer<IEditor> m_currentEditor;
|
QPointer<IEditor> m_currentEditor;
|
||||||
QPointer<SplitterOrView> m_currentView;
|
QPointer<SplitterOrView> m_currentView;
|
||||||
QStackedLayout *m_stackedLayout;
|
|
||||||
|
|
||||||
ICore *m_core;
|
ICore *m_core;
|
||||||
|
|
||||||
@@ -182,7 +181,6 @@ struct EditorManagerPrivate {
|
|||||||
EditorManagerPrivate::EditorManagerPrivate(ICore *core, QWidget *parent) :
|
EditorManagerPrivate::EditorManagerPrivate(ICore *core, QWidget *parent) :
|
||||||
m_view(0),
|
m_view(0),
|
||||||
m_splitter(0),
|
m_splitter(0),
|
||||||
m_stackedLayout(0),
|
|
||||||
m_core(core),
|
m_core(core),
|
||||||
m_revertToSavedAction(new QAction(EditorManager::tr("Revert to Saved"), parent)),
|
m_revertToSavedAction(new QAction(EditorManager::tr("Revert to Saved"), parent)),
|
||||||
m_saveAction(new QAction(parent)),
|
m_saveAction(new QAction(parent)),
|
||||||
@@ -388,8 +386,10 @@ EditorManager::EditorManager(ICore *core, QWidget *parent) :
|
|||||||
m_d->m_view = m_d->m_splitter->view();
|
m_d->m_view = m_d->m_splitter->view();
|
||||||
|
|
||||||
|
|
||||||
m_d->m_stackedLayout = new QStackedLayout(this);
|
QHBoxLayout *layout = new QHBoxLayout(this);
|
||||||
m_d->m_stackedLayout->addWidget(m_d->m_splitter);
|
layout->setMargin(0);
|
||||||
|
layout->setSpacing(0);
|
||||||
|
layout->addWidget(m_d->m_splitter);
|
||||||
|
|
||||||
updateActions();
|
updateActions();
|
||||||
|
|
||||||
@@ -423,11 +423,6 @@ void EditorManager::init()
|
|||||||
pluginManager()->addObject(m_d->m_openEditorsFactory);
|
pluginManager()->addObject(m_d->m_openEditorsFactory);
|
||||||
}
|
}
|
||||||
|
|
||||||
QSize EditorManager::minimumSizeHint() const
|
|
||||||
{
|
|
||||||
return QSize(400, 300);
|
|
||||||
}
|
|
||||||
|
|
||||||
QString EditorManager::defaultExternalEditor() const
|
QString EditorManager::defaultExternalEditor() const
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_MAC
|
#ifdef Q_OS_MAC
|
||||||
|
@@ -151,8 +151,6 @@ public:
|
|||||||
void saveSettings(QSettings *settings);
|
void saveSettings(QSettings *settings);
|
||||||
void readSettings(QSettings *settings);
|
void readSettings(QSettings *settings);
|
||||||
|
|
||||||
QSize minimumSizeHint() const;
|
|
||||||
|
|
||||||
Internal::OpenEditorsWindow *windowPopup() const;
|
Internal::OpenEditorsWindow *windowPopup() const;
|
||||||
void showWindowPopup() const;
|
void showWindowPopup() const;
|
||||||
|
|
||||||
|
@@ -656,6 +656,13 @@ SplitterOrView *SplitterOrView::findNextView_helper(SplitterOrView *view, bool *
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QSize SplitterOrView::minimumSizeHint() const
|
||||||
|
{
|
||||||
|
if (m_splitter)
|
||||||
|
return m_splitter->minimumSizeHint();
|
||||||
|
return QSize(64, 64);
|
||||||
|
}
|
||||||
|
|
||||||
void SplitterOrView::split(Qt::Orientation orientation)
|
void SplitterOrView::split(Qt::Orientation orientation)
|
||||||
{
|
{
|
||||||
Q_ASSERT(m_view && m_splitter == 0);
|
Q_ASSERT(m_view && m_splitter == 0);
|
||||||
|
@@ -179,8 +179,8 @@ public:
|
|||||||
|
|
||||||
SplitterOrView *findNextView(SplitterOrView *view);
|
SplitterOrView *findNextView(SplitterOrView *view);
|
||||||
|
|
||||||
QSize sizeHint() const { return QSize(32, 32); }
|
QSize sizeHint() const { return minimumSizeHint(); }
|
||||||
QSize minimumSizeHint() const { return QSize(32, 32); }
|
QSize minimumSizeHint() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void focusInEvent(QFocusEvent *);
|
void focusInEvent(QFocusEvent *);
|
||||||
|
@@ -432,7 +432,7 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
m_editor = editor;
|
m_editor = editor;
|
||||||
m_startPosition = findStartOfName(editor);
|
m_startPosition = findStartOfName();
|
||||||
m_completionOperator = T_EOF_SYMBOL;
|
m_completionOperator = T_EOF_SYMBOL;
|
||||||
|
|
||||||
int endOfOperator = m_startPosition;
|
int endOfOperator = m_startPosition;
|
||||||
@@ -520,7 +520,7 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
|
|||||||
|
|
||||||
if (m_completionOperator == T_LPAREN && completeFunction(exprTy, resolvedTypes, context)) {
|
if (m_completionOperator == T_LPAREN && completeFunction(exprTy, resolvedTypes, context)) {
|
||||||
return m_startPosition;
|
return m_startPosition;
|
||||||
} if ((m_completionOperator == T_DOT || m_completionOperator == T_ARROW) &&
|
} else if ((m_completionOperator == T_DOT || m_completionOperator == T_ARROW) &&
|
||||||
completeMember(resolvedTypes, context)) {
|
completeMember(resolvedTypes, context)) {
|
||||||
return m_startPosition;
|
return m_startPosition;
|
||||||
} else if (m_completionOperator == T_COLON_COLON && completeScope(resolvedTypes, context)) {
|
} else if (m_completionOperator == T_COLON_COLON && completeScope(resolvedTypes, context)) {
|
||||||
@@ -531,6 +531,32 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
|
|||||||
return m_startPosition;
|
return m_startPosition;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_completionOperator == T_LPAREN) {
|
||||||
|
// Find the expression that precedes the current name
|
||||||
|
int index = endOfExpression;
|
||||||
|
while (m_editor->characterAt(index - 1).isSpace())
|
||||||
|
--index;
|
||||||
|
index = findStartOfName(index);
|
||||||
|
|
||||||
|
QTextCursor tc(edit->document());
|
||||||
|
tc.setPosition(index);
|
||||||
|
QString baseExpression = expressionUnderCursor(tc);
|
||||||
|
|
||||||
|
// Resolve the type of this expression
|
||||||
|
QList<TypeOfExpression::Result> results =
|
||||||
|
typeOfExpression(baseExpression, thisDocument, symbol, TypeOfExpression::Preprocess);
|
||||||
|
|
||||||
|
// If it's a class, add completions for the constructors
|
||||||
|
foreach (const TypeOfExpression::Result &result, results) {
|
||||||
|
if (result.first->isClass()) {
|
||||||
|
FullySpecifiedType exprTy = result.first;
|
||||||
|
if (completeConstructors(exprTy->asClass()))
|
||||||
|
return m_startPosition;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// nothing to do.
|
// nothing to do.
|
||||||
@@ -541,26 +567,14 @@ bool CppCodeCompletion::completeFunction(FullySpecifiedType exprTy,
|
|||||||
const QList<TypeOfExpression::Result> &resolvedTypes,
|
const QList<TypeOfExpression::Result> &resolvedTypes,
|
||||||
const LookupContext &)
|
const LookupContext &)
|
||||||
{
|
{
|
||||||
|
if (Class *klass = exprTy->asClass()) {
|
||||||
|
completeConstructors(klass);
|
||||||
|
} else {
|
||||||
ConvertToCompletionItem toCompletionItem(this);
|
ConvertToCompletionItem toCompletionItem(this);
|
||||||
Overview o;
|
Overview o;
|
||||||
o.setShowReturnTypes(true);
|
o.setShowReturnTypes(true);
|
||||||
o.setShowArgumentNames(true);
|
o.setShowArgumentNames(true);
|
||||||
|
|
||||||
if (Class *klass = exprTy->asClass()) {
|
|
||||||
for (unsigned i = 0; i < klass->memberCount(); ++i) {
|
|
||||||
Symbol *member = klass->memberAt(i);
|
|
||||||
if (! member->type()->isFunction())
|
|
||||||
continue;
|
|
||||||
else if (! member->identity())
|
|
||||||
continue;
|
|
||||||
else if (! member->identity()->isEqualTo(klass->identity()))
|
|
||||||
continue;
|
|
||||||
if (TextEditor::CompletionItem item = toCompletionItem(member)) {
|
|
||||||
item.m_text = o(member->type(), member->name());
|
|
||||||
m_completions.append(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
QSet<QString> signatures;
|
QSet<QString> signatures;
|
||||||
foreach (TypeOfExpression::Result p, resolvedTypes) {
|
foreach (TypeOfExpression::Result p, resolvedTypes) {
|
||||||
FullySpecifiedType ty = p.first;
|
FullySpecifiedType ty = p.first;
|
||||||
@@ -873,6 +887,30 @@ void CppCodeCompletion::completeClass(const QList<Symbol *> &candidates,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CppCodeCompletion::completeConstructors(Class *klass)
|
||||||
|
{
|
||||||
|
ConvertToCompletionItem toCompletionItem(this);
|
||||||
|
Overview o;
|
||||||
|
o.setShowReturnTypes(true);
|
||||||
|
o.setShowArgumentNames(true);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < klass->memberCount(); ++i) {
|
||||||
|
Symbol *member = klass->memberAt(i);
|
||||||
|
if (! member->type()->isFunction())
|
||||||
|
continue;
|
||||||
|
else if (! member->identity())
|
||||||
|
continue;
|
||||||
|
else if (! member->identity()->isEqualTo(klass->identity()))
|
||||||
|
continue;
|
||||||
|
if (TextEditor::CompletionItem item = toCompletionItem(member)) {
|
||||||
|
item.m_text = o(member->type(), member->name());
|
||||||
|
m_completions.append(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ! m_completions.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
bool CppCodeCompletion::completeQtMethod(CPlusPlus::FullySpecifiedType,
|
bool CppCodeCompletion::completeQtMethod(CPlusPlus::FullySpecifiedType,
|
||||||
const QList<TypeOfExpression::Result> &results,
|
const QList<TypeOfExpression::Result> &results,
|
||||||
const LookupContext &context,
|
const LookupContext &context,
|
||||||
@@ -1135,14 +1173,15 @@ void CppCodeCompletion::cleanup()
|
|||||||
typeOfExpression.setSnapshot(Snapshot());
|
typeOfExpression.setSnapshot(Snapshot());
|
||||||
}
|
}
|
||||||
|
|
||||||
int CppCodeCompletion::findStartOfName(const TextEditor::ITextEditor *editor)
|
int CppCodeCompletion::findStartOfName(int pos) const
|
||||||
{
|
{
|
||||||
int pos = editor->position();
|
if (pos == -1)
|
||||||
|
pos = m_editor->position();
|
||||||
QChar chr;
|
QChar chr;
|
||||||
|
|
||||||
// Skip to the start of a name
|
// Skip to the start of a name
|
||||||
do {
|
do {
|
||||||
chr = editor->characterAt(--pos);
|
chr = m_editor->characterAt(--pos);
|
||||||
} while (chr.isLetterOrNumber() || chr == QLatin1Char('_'));
|
} while (chr.isLetterOrNumber() || chr == QLatin1Char('_'));
|
||||||
|
|
||||||
return pos + 1;
|
return pos + 1;
|
||||||
|
@@ -103,6 +103,8 @@ private:
|
|||||||
const CPlusPlus::LookupContext &context,
|
const CPlusPlus::LookupContext &context,
|
||||||
bool staticLookup = true);
|
bool staticLookup = true);
|
||||||
|
|
||||||
|
bool completeConstructors(CPlusPlus::Class *klass);
|
||||||
|
|
||||||
bool completeQtMethod(CPlusPlus::FullySpecifiedType exprTy,
|
bool completeQtMethod(CPlusPlus::FullySpecifiedType exprTy,
|
||||||
const QList<CPlusPlus::TypeOfExpression::Result> &,
|
const QList<CPlusPlus::TypeOfExpression::Result> &,
|
||||||
const CPlusPlus::LookupContext &context,
|
const CPlusPlus::LookupContext &context,
|
||||||
@@ -118,7 +120,7 @@ private:
|
|||||||
const CPlusPlus::LookupContext &context)
|
const CPlusPlus::LookupContext &context)
|
||||||
{ return completeQtMethod(exprTy, results, context, false); }
|
{ return completeQtMethod(exprTy, results, context, false); }
|
||||||
|
|
||||||
static int findStartOfName(const TextEditor::ITextEditor *editor);
|
int findStartOfName(int pos = -1) const;
|
||||||
|
|
||||||
QList<TextEditor::CompletionItem> m_completions;
|
QList<TextEditor::CompletionItem> m_completions;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user