1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 06:05:24 +02:00

Patch for Devin Steffler.

[FIXED][75731][Search] open declaration on class incorrectly points to constructor definition
[FIXED][77989][F3] Open declaration fails in "using namespace N"
[FIXED][78435]Open declaration of argument can't find itself
This commit is contained in:
John Camelon 2004-11-18 16:52:07 +00:00
parent 0a3ce8977b
commit 74f0cc0f87
2 changed files with 214 additions and 2 deletions

View file

@ -22,6 +22,8 @@ import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition;
import org.eclipse.cdt.core.parser.ast.IASTNode;
import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTVariable;
import org.eclipse.cdt.internal.core.parser.ast.complete.ASTNamespaceDefinition;
import org.eclipse.cdt.internal.core.parser.ast.complete.ASTParameterDeclaration;
/**
* @author jcamelon
@ -516,5 +518,192 @@ public class SelectionParseTest extends SelectionParseBaseTest {
IASTField rank = (IASTField) node;
assertEquals( rank.getName(), "rank"); //$NON-NLS-1$
}
public void testBug75731() throws Exception
{
Writer writer = new StringWriter();
writer.write("int rank() {\n"); //$NON-NLS-1$
writer.write("return 5;\n}\n"); //$NON-NLS-1$
writer.write("class Card{\n"); //$NON-NLS-1$
writer.write("private:\n"); //$NON-NLS-1$
writer.write("Card( int rank );\n"); //$NON-NLS-1$
writer.write("int rank;\n"); //$NON-NLS-1$
writer.write("public:\n"); //$NON-NLS-1$
writer.write("int getRank();\n};\n"); //$NON-NLS-1$
writer.write("Card::Card( int rank )\n{\n"); //$NON-NLS-1$
writer.write("this->rank = ::rank();\n"); //$NON-NLS-1$
writer.write("this->rank = this->rank;\n"); //$NON-NLS-1$
writer.write("this->rank = rank;\n"); //$NON-NLS-1$
writer.write("this->rank = Card::rank;\n"); //$NON-NLS-1$
writer.write("this->rank = getRank();\n}\n"); //$NON-NLS-1$
String code = writer.toString();
int index = code.indexOf( "int rank() {") + 4; //$NON-NLS-1$
IASTNode node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTFunction );
IASTFunction rank1 = (IASTFunction) node;
assertEquals( rank1.getName(), "rank"); //$NON-NLS-1$
assertEquals( rank1.getNameOffset(), index );
index = code.indexOf( "class Card{") + 6; //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTClassSpecifier );
IASTClassSpecifier card1 = (IASTClassSpecifier) node;
assertEquals( card1.getName(), "Card"); //$NON-NLS-1$
assertEquals( card1.getNameOffset(), index );
index = code.indexOf( "Card( int rank );"); //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTMethod );
IASTMethod card2 = (IASTMethod) node;
assertEquals( card2.getName(), "Card"); //$NON-NLS-1$
assertEquals( card2.getNameOffset(), index );
index = code.indexOf( "Card( int rank );") + 10; //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTParameterDeclaration );
IASTParameterDeclaration rank2 = (IASTParameterDeclaration) node;
assertEquals( rank2.getName(), "rank"); //$NON-NLS-1$
assertEquals( rank2.getNameOffset(), index );
index = code.indexOf( "int rank;") + 4; //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTField );
IASTField rank3 = (IASTField) node;
assertEquals( rank3.getName(), "rank"); //$NON-NLS-1$
assertEquals( rank3.getNameOffset(), index );
index = code.indexOf( "int getRank();") + 4; //$NON-NLS-1$
node = parse( code, index, index + 7 );
assertTrue( node instanceof IASTMethod );
IASTMethod getRank1 = (IASTMethod) node;
assertEquals( getRank1.getName(), "getRank"); //$NON-NLS-1$
assertEquals( getRank1.getNameOffset(), index );
index = code.indexOf( "Card::Card( int rank )"); //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTClassSpecifier );
IASTClassSpecifier card3 = (IASTClassSpecifier) node;
assertEquals( card3.getName(), "Card"); //$NON-NLS-1$
assertEquals( card3.getNameOffset(), card1.getNameOffset() );
index = code.indexOf( "Card::Card( int rank )") + 6; //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTMethod );
IASTMethod card4 = (IASTMethod) node;
assertEquals( card4.getName(), "Card"); //$NON-NLS-1$
assertEquals( card4.getNameOffset(), card2.getNameOffset() );
index = code.indexOf( "Card::Card( int rank )") + 16; //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTParameterDeclaration );
IASTParameterDeclaration rank4 = (IASTParameterDeclaration) node;
assertEquals( rank4.getName(), "rank"); //$NON-NLS-1$
assertEquals( rank4.getNameOffset(), index );
index = code.indexOf( "this->rank = ::rank();") + 6; //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTField );
IASTField rank5 = (IASTField) node;
assertEquals( rank5.getName(), "rank"); //$NON-NLS-1$
assertEquals( rank5.getNameOffset(), rank3.getNameOffset() );
index = code.indexOf( "this->rank = ::rank();") + 15; //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTFunction );
IASTFunction rank6 = (IASTFunction) node;
assertEquals( rank6.getName(), "rank"); //$NON-NLS-1$
assertEquals( rank6.getNameOffset(), rank1.getNameOffset() );
index = code.indexOf( "this->rank = this->rank;") + 6; //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTField );
IASTField rank7 = (IASTField) node;
assertEquals( rank7.getName(), "rank"); //$NON-NLS-1$
assertEquals( rank7.getNameOffset(), rank3.getNameOffset() );
index = code.indexOf( "this->rank = this->rank;") + 19; //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTField );
IASTField rank8 = (IASTField) node;
assertEquals( rank8.getName(), "rank"); //$NON-NLS-1$
assertEquals( rank8.getNameOffset(), rank3.getNameOffset() );
index = code.indexOf( "this->rank = rank;") + 6; //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTField );
IASTField rank9 = (IASTField) node;
assertEquals( rank9.getName(), "rank"); //$NON-NLS-1$
assertEquals( rank9.getNameOffset(), rank3.getNameOffset() );
index = code.indexOf( "this->rank = rank;") + 13; //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTParameterDeclaration );
IASTParameterDeclaration rank10 = (IASTParameterDeclaration) node;
assertEquals( rank10.getName(), "rank"); //$NON-NLS-1$
assertEquals( rank10.getNameOffset(), rank4.getNameOffset() );
index = code.indexOf( "this->rank = Card::rank;") + 6; //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTField );
IASTField rank11 = (IASTField) node;
assertEquals( rank11.getName(), "rank"); //$NON-NLS-1$
assertEquals( rank11.getNameOffset(), rank3.getNameOffset() );
index = code.indexOf( "this->rank = Card::rank;") + 19; //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTField );
IASTField rank12 = (IASTField) node;
assertEquals( rank12.getName(), "rank"); //$NON-NLS-1$
assertEquals( rank12.getNameOffset(), rank3.getNameOffset() );
index = code.indexOf( "this->rank = getRank();") + 6; //$NON-NLS-1$
node = parse( code, index, index + 4 );
assertTrue( node instanceof IASTField );
IASTField rank13 = (IASTField) node;
assertEquals( rank13.getName(), "rank"); //$NON-NLS-1$
assertEquals( rank13.getNameOffset(), rank3.getNameOffset() );
index = code.indexOf( "this->rank = getRank();") + 13; //$NON-NLS-1$
node = parse( code, index, index + 7 );
assertTrue( node instanceof IASTMethod );
IASTMethod getRank2 = (IASTMethod) node;
assertEquals( getRank2.getName(), "getRank"); //$NON-NLS-1$
assertEquals( getRank2.getNameOffset(), getRank1.getNameOffset() );
}
public void testBug77989() throws Exception {
Writer writer = new StringWriter();
writer.write("namespace N { /* A */\n"); //$NON-NLS-1$
writer.write("class C{};\n}\n"); //$NON-NLS-1$
writer.write("using namespace N; /* B */\n"); //$NON-NLS-1$
writer.write("N::C c; /* C */\n"); //$NON-NLS-1$
String code = writer.toString();
int index = code.indexOf( "using namespace N;") + 16; //$NON-NLS-1$
IASTNode node = parse( code, index, index + 1 );
assertTrue( node instanceof ASTNamespaceDefinition );
ASTNamespaceDefinition n = (ASTNamespaceDefinition) node;
assertEquals( n.getName(), "N"); //$NON-NLS-1$
assertEquals( n.getNameOffset(), 10 );
assertEquals( n.getStartingLine(), 1 );
}
public void testBug78435() throws Exception {
Writer writer = new StringWriter();
writer.write("int itself; //A\n"); //$NON-NLS-1$
writer.write("void f(int itself){} //B\n"); //$NON-NLS-1$
String code = writer.toString();
int index = code.indexOf( "void f(int itself){}") + 11; //$NON-NLS-1$
IASTNode node = parse( code, index, index + 6 );
assertTrue( node instanceof ASTParameterDeclaration );
ASTParameterDeclaration n = (ASTParameterDeclaration) node;
assertEquals( n.getName(), "itself"); //$NON-NLS-1$
assertEquals( n.getNameOffset(), 36 );
assertEquals( n.getStartingLine(), 2 );
}
}

View file

@ -50,13 +50,16 @@ import org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTEnumerator;
import org.eclipse.cdt.core.parser.ast.IASTExpression;
import org.eclipse.cdt.core.parser.ast.IASTFactory;
import org.eclipse.cdt.core.parser.ast.IASTFunction;
import org.eclipse.cdt.core.parser.ast.IASTInitializerClause;
import org.eclipse.cdt.core.parser.ast.IASTLinkageSpecification;
import org.eclipse.cdt.core.parser.ast.IASTMethod;
import org.eclipse.cdt.core.parser.ast.IASTNamespaceAlias;
import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition;
import org.eclipse.cdt.core.parser.ast.IASTNode;
import org.eclipse.cdt.core.parser.ast.IASTOffsetableElement;
import org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement;
import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTQualifiedNameElement;
import org.eclipse.cdt.core.parser.ast.IASTReference;
import org.eclipse.cdt.core.parser.ast.IASTScope;
@ -6674,9 +6677,29 @@ public class Parser implements IParserData, IParser
if( contextNode == null ) return null;
if( contextNode instanceof IASTDeclaration )
{
if( contextNode instanceof IASTOffsetableNamedElement )
if( contextNode instanceof IASTOffsetableNamedElement && !(contextNode instanceof IASTUsingDirective) && !(contextNode instanceof IASTUsingDeclaration))
{
if( ((IASTOffsetableNamedElement)contextNode).getName().equals( finalDuple.toString() ) )
if( contextNode instanceof IASTFunction ) {
Iterator i = ((IASTFunction)contextNode).getParameters();
while (i.hasNext()) {
IASTParameterDeclaration parm = (IASTParameterDeclaration)i.next();
if (parm.getName().equals(finalDuple.toString()) && parm.getNameOffset() == finalDuple.getStartOffset() && parm.getStartingLine() == finalDuple.getLineNumber() && parm instanceof IASTNode) {
return (IASTNode) parm;
}
}
}
if (contextNode instanceof IASTMethod) {
Iterator parms = ((IASTMethod)contextNode).getParameters();
while (parms.hasNext()) {
Object parm = parms.next();
if (parm instanceof IASTParameterDeclaration && ((IASTParameterDeclaration)parm).getName().equals(finalDuple.toString()) && ((IASTParameterDeclaration)parm).getNameOffset() == finalDuple.getStartOffset()) {
return (IASTNode)parm;
}
}
}
if( ((IASTOffsetableNamedElement)contextNode).getName().equals( finalDuple.toString() ) && ((IASTOffsetableNamedElement)contextNode).getNameOffset() == finalDuple.getStartOffset()) // 75731 needs to include offset for equality as well...
return contextNode;
}
if( contextNode instanceof IASTQualifiedNameElement )