From 54aa75f147db2cafd6eacffd08379fbf9ecb2f94 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Wed, 28 Apr 2004 17:30:17 +0000 Subject: [PATCH] Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=60264 --- .../core/parser/tests/SelectionParseTest.java | 17 +++++++++++++++++ .../eclipse/cdt/core/parser/ITokenDuple.java | 5 +++++ .../parser/ast/complete/ASTExpression.java | 13 ++++++++++--- .../core/parser/token/TokenDuple.java | 19 +++++++++++++++++++ 4 files changed, 51 insertions(+), 3 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 568a9bcdd61..05eff64c651 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 @@ -24,6 +24,7 @@ import org.eclipse.cdt.core.parser.ScannerInfo; import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; import org.eclipse.cdt.core.parser.ast.IASTFunction; import org.eclipse.cdt.core.parser.ast.IASTMethod; +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; @@ -183,4 +184,20 @@ public class SelectionParseTest extends CompleteParseBaseTest { assertEquals( destructor.getName(), "~Gonzo" ); //$NON-NLS-1$ assertTrue( destructor.isDestructor() ); } + + public void testBug60264() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "namespace Muppets { int i; }\n" ); //$NON-NLS-1$ + writer.write( "int main(int argc, char **argv) { Muppets::i = 1; }\n" ); //$NON-NLS-1$ + String code = writer.toString(); + int index = code.indexOf( "Muppets::"); //$NON-NLS-1$ + IASTNode node = parse( code, index, index + 7 ); + assertNotNull( node ); + assertTrue( node instanceof IASTNamespaceDefinition ); + IASTNamespaceDefinition namespace = (IASTNamespaceDefinition) node; + assertEquals( namespace.getName(), "Muppets"); //$NON-NLS-1$ + assertEquals( namespace.getStartingLine(), 1 ); + + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ITokenDuple.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ITokenDuple.java index e8b696755b6..5e27ee3b431 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ITokenDuple.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ITokenDuple.java @@ -53,4 +53,9 @@ public interface ITokenDuple { public abstract boolean syntaxOfName(); public String extractNameFromTemplateId(); + /** + * @param duple + * @return + */ + public boolean contains(ITokenDuple duple); } \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTExpression.java index 99264c79ada..c893c827ae8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTExpression.java @@ -352,9 +352,16 @@ public class ASTExpression extends ASTNode implements IASTExpression { if( expression == null ) return false; if( expression.getExpressionKind() == IASTExpression.Kind.ID_EXPRESSION && - expression instanceof ASTExpression && - ((ASTExpression)expression).getIdExpressionTokenDuple().equals( duple ) ) - return true; + expression instanceof ASTExpression ) + { + ITokenDuple expressionDuple = ((ASTExpression)expression).getIdExpressionTokenDuple(); + // check equality + if( expressionDuple.equals( duple ) ) + return true; + // check subduple + if( expressionDuple.contains( duple ) ) + return true; + } return false; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/TokenDuple.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/TokenDuple.java index 27a4b81d908..d2d4e191e37 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/TokenDuple.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/TokenDuple.java @@ -475,4 +475,23 @@ public class TokenDuple implements ITokenDuple { return nameBuffer.toString(); } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.parser.ITokenDuple#contains(org.eclipse.cdt.core.parser.ITokenDuple) + */ + public boolean contains(ITokenDuple duple) { + if( duple == null ) return false; + boolean foundFirst = false; + boolean foundLast = false; + Iterator i = iterator(); + while( i.hasNext() ) + { + IToken current = (IToken) i.next(); + if( current == firstToken ) foundFirst = true; + if( current == lastToken ) foundLast = true; + if( foundFirst && foundLast ) break; + } + + return ( foundFirst && foundLast ); + } }