Reimplemented switch declaration/definition.

This commit is contained in:
Roberto Raggi
2010-05-12 16:36:52 +02:00
parent 3c6ad0d845
commit 5d13a206e2

View File

@@ -1227,56 +1227,45 @@ static bool isCompatible(Function *definition, Symbol *declaration,
void CPPEditor::switchDeclarationDefinition() void CPPEditor::switchDeclarationDefinition()
{ {
int line = 0, column = 0;
convertPosition(position(), &line, &column);
if (! m_modelManager) if (! m_modelManager)
return; return;
#warning implement CPPEditor::switchDeclarationDefinition
qWarning() << Q_FUNC_INFO << __LINE__;
#if 0
const Snapshot snapshot = m_modelManager->snapshot(); const Snapshot snapshot = m_modelManager->snapshot();
Document::Ptr doc = snapshot.document(file()->fileName()); if (Document::Ptr thisDocument = snapshot.document(file()->fileName())) {
if (!doc) int line = 0, column = 0;
return; convertPosition(position(), &line, &column);
Symbol *lastSymbol = doc->findSymbolAt(line, column);
if (!lastSymbol || !lastSymbol->scope())
return;
Function *f = lastSymbol->asFunction(); Scope *scope = thisDocument->scopeAt(line, column);
if (!f) { Symbol *lastVisibleSymbol = thisDocument->findSymbolAt(line, column);
Scope *fs = lastSymbol->scope();
if (!fs->isFunctionScope()) Scope *functionScope = 0;
fs = fs->enclosingFunctionScope(); if (scope->isFunctionScope())
if (fs) functionScope = scope;
f = fs->owner()->asFunction(); else
functionScope = scope->enclosingFunctionScope();
if (! functionScope && lastVisibleSymbol) {
if (Function *def = lastVisibleSymbol->asFunction())
functionScope = def->members();
} }
if (f) { if (functionScope) {
LookupContext context(doc, snapshot); LookupContext context(thisDocument, snapshot);
const QualifiedNameId *q = qualifiedNameIdForSymbol(f, context.control()); Function *functionDefinition = functionScope->owner()->asFunction();
const QList<Symbol *> symbols = context.lookup(q, lastSymbol); // ### FIXME const QList<Symbol *> declarations = context.lookup(functionDefinition->name(), functionDefinition->scope());
foreach (Symbol *decl, declarations) {
Symbol *declaration = 0; // TODO: check decl.
foreach (declaration, symbols) { openCppEditorAt(linkToSymbol(decl));
if (isCompatible(f, declaration, q))
break; break;
} }
if (! declaration && ! symbols.isEmpty()) } else if (lastVisibleSymbol && lastVisibleSymbol->isDeclaration() && lastVisibleSymbol->type()->isFunctionType()) {
declaration = symbols.first(); if (Symbol *def = snapshot.findMatchingDefinition(lastVisibleSymbol))
if (declaration)
openCppEditorAt(linkToSymbol(declaration));
} else if (lastSymbol->type()->isFunctionType()) {
if (Symbol *def = findDefinition(lastSymbol, snapshot))
openCppEditorAt(linkToSymbol(def)); openCppEditorAt(linkToSymbol(def));
} }
#endif }
} }
static inline LookupItem skipForwardDeclarations(const QList<LookupItem> &resolvedSymbols) static inline LookupItem skipForwardDeclarations(const QList<LookupItem> &resolvedSymbols)