diff options
author | Andrew Niefer | 2004-09-24 20:42:16 +0000 |
---|---|---|
committer | Andrew Niefer | 2004-09-24 20:42:16 +0000 |
commit | 1943c247b240afd39904953375100b895c3cf0ee (patch) | |
tree | 8371e9bbdcbed5fce832d3e4fcc12a2974c80fd6 /core | |
parent | 59a54c9689d38f10685ea2c9c19cf19b62ed2afc (diff) | |
download | org.eclipse.cdt-1943c247b240afd39904953375100b895c3cf0ee.tar.gz org.eclipse.cdt-1943c247b240afd39904953375100b895c3cf0ee.tar.xz org.eclipse.cdt-1943c247b240afd39904953375100b895c3cf0ee.zip |
fix bug 72713: [Open Declaration] F3 on a method definition goes nowhere
Diffstat (limited to 'core')
2 files changed, 24 insertions, 2 deletions
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java index da0bdb3c777..46fd7efafe7 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/SelectionParseTest.java @@ -439,5 +439,18 @@ public class SelectionParseTest extends SelectionParseBaseTest { assertTrue( node instanceof IASTFunction ); assertEquals( ((IASTFunction)node).getName(), "f_SD" ); //$NON-NLS-1$ } + + public void testBug72713() throws Exception{ + Writer writer = new StringWriter(); + writer.write( "class Deck{ void initialize(); }; \n"); //$NON-NLS-1$ + writer.write( "void Deck::initialize(){} \n"); //$NON-NLS-1$ + + String code = writer.toString(); + int startIndex = code.indexOf( ":initialize" ); //$NON-NLS-1$ + IASTNode node = parse( code, startIndex + 1, startIndex + 11 ); + assertTrue( node instanceof IASTMethod ); + assertFalse( ((IASTMethod)node).previouslyDeclared() ); + assertEquals( ((IASTMethod) node).getNameOffset(), code.indexOf( " initialize();" ) + 1 ); //$NON-NLS-1$ + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java index 72ce1ec6425..9135aa3d501 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java @@ -79,6 +79,7 @@ import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.parser.ast.ASTCompletionNode; import org.eclipse.cdt.internal.core.parser.ast.complete.CompleteParseASTFactory; import org.eclipse.cdt.internal.core.parser.problem.IProblemFactory; +import org.eclipse.cdt.internal.core.parser.pst.ISymbolOwner; import org.eclipse.cdt.internal.core.parser.token.KeywordSets; import org.eclipse.cdt.internal.core.parser.token.OffsetDuple; import org.eclipse.cdt.internal.core.parser.token.TokenFactory; @@ -6594,8 +6595,16 @@ public class Parser implements IParserData, IParser if( contextNode instanceof IASTQualifiedNameElement ) { String [] elementQualifiedName = ((IASTQualifiedNameElement)contextNode).getFullyQualifiedName(); - if( Arrays.equals( elementQualifiedName, finalDuple.toQualifiedName() ) ) - return contextNode; + if( Arrays.equals( elementQualifiedName, finalDuple.toQualifiedName() ) ){ + IASTNode declNode = null; + if( contextNode instanceof ISymbolOwner ){ + ISymbolOwner owner = (ISymbolOwner) contextNode; + if( owner.getSymbol() != null && owner.getSymbol().getASTExtension() != null ){ + declNode = owner.getSymbol().getASTExtension().getPrimaryDeclaration(); + } + } + return (declNode != null) ? declNode : contextNode; + } } try { if( ourKind == IASTCompletionNode.CompletionKind.NEW_TYPE_REFERENCE ) |