From 129dd89591b47d0d831d22fd26964ed66f2187c1 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Fri, 21 May 2004 15:31:24 +0000 Subject: [PATCH] Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=62725 --- .../parser/tests/CompletionParseTest.java | 16 +++++++++++++++ .../core/parser/ExpressionParser.java | 20 +++++++++---------- .../cdt/internal/core/parser/Parser.java | 8 ++++---- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java index c29f7d2ada8..44241f5234f 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompletionParseTest.java @@ -1086,4 +1086,20 @@ public class CompletionParseTest extends CompletionParseBaseTest { assertTrue( blah instanceof IASTVariable ); assertEquals( ((IASTVariable)blah).getName(), "blah" ); //$NON-NLS-1$ } + + public void testBug62725() throws Exception + { + Writer writer = new StringWriter(); + writer.write( "int f() {\n" ); //$NON-NLS-1$ + writer.write( " int biSizeImage = 5;\n" ); //$NON-NLS-1$ + writer.write( "for (int i = 0; i < bi " ); //$NON-NLS-1$ + String code = writer.toString(); + IASTCompletionNode node = parse( code, code.indexOf( "< bi") + 4 ); //$NON-NLS-1$ + assertNotNull( node ); + assertEquals( node.getCompletionPrefix(), "bi"); //$NON-NLS-1$\ + assertNull( node.getCompletionContext() ); + assertTrue( node.getCompletionScope() instanceof IASTFunction ); + assertTrue( ((IASTFunction)node.getCompletionScope()).getName().equals( "f" ) ); //$NON-NLS-1$ + assertEquals( node.getCompletionKind(), IASTCompletionNode.CompletionKind.SINGLE_NAME_REFERENCE ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java index a5d3451adfa..5512f9f121c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionParser.java @@ -275,7 +275,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { return last; } - protected List templateArgumentList( IASTScope scope ) throws EndOfFileException, BacktrackException + protected List templateArgumentList( IASTScope scope, IASTCompletionNode.CompletionKind kind ) throws EndOfFileException, BacktrackException { IASTExpression expression = null; List list = new LinkedList(); @@ -294,7 +294,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { IToken mark = mark(); try{ - IASTTypeId typeId = typeId( scope, false, CompletionKind.TYPE_REFERENCE ); + IASTTypeId typeId = typeId( scope, false, kind ); expression = astFactory.createExpression( scope, IASTExpression.Kind.POSTFIX_TYPEID_TYPEID, null, null, null, typeId, null, EMPTY_STRING, null); @@ -423,7 +423,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { else setCompletionValuesNoContext(scope, kind, key ); - last = consumeTemplateArguments(scope, last, argumentList); + last = consumeTemplateArguments(scope, last, argumentList, kind); if( last.getType() == IToken.tGT ) hasTemplateId = true; break; @@ -454,7 +454,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { prev = last; last = consume(); setCompletionValues( scope, kind, first, prev, Key.EMPTY ); - last = consumeTemplateArguments(scope, last, argumentList); + last = consumeTemplateArguments(scope, last, argumentList, kind); if( last.getType() == IToken.tGT ) hasTemplateId = true; } @@ -524,14 +524,14 @@ public class ExpressionParser implements IExpressionParser, IParserData { * @throws EndOfFileException * @throws BacktrackException */ - protected IToken consumeTemplateArguments(IASTScope scope, IToken last, TemplateParameterManager argumentList) throws EndOfFileException, BacktrackException { + protected IToken consumeTemplateArguments(IASTScope scope, IToken last, TemplateParameterManager argumentList, IASTCompletionNode.CompletionKind completionKind) throws EndOfFileException, BacktrackException { if( language != ParserLanguage.CPP ) return last; if( LT(1) == IToken.tLT ){ IToken secondMark = mark(); consume( IToken.tLT ); try { - List list = templateArgumentList( scope ); + List list = templateArgumentList( scope, completionKind ); argumentList.addSegment( list ); last = consume( IToken.tGT ); } catch( BacktrackException bt ) @@ -619,7 +619,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { } } - protected void operatorId(Declarator d, IToken originalToken, TemplateParameterManager templateArgs) throws BacktrackException, EndOfFileException { + protected void operatorId(Declarator d, IToken originalToken, TemplateParameterManager templateArgs, IASTCompletionNode.CompletionKind completionKind ) throws BacktrackException, EndOfFileException { // we know this is an operator IToken operatorToken = consume(IToken.t_operator); IToken toSend = null; @@ -669,7 +669,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { try { - toSend = consumeTemplateArguments( d.getDeclarationWrapper().getScope(), toSend, templateArgs ); + toSend = consumeTemplateArguments( d.getDeclarationWrapper().getScope(), toSend, templateArgs, completionKind ); if( toSend.getType() == IToken.tGT ){ hasTemplateId = true; } @@ -2737,7 +2737,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { end = consumeTemplateParameters(end); } if (LT(1) == IToken.t_operator) - operatorId(d, start, null); + operatorId(d, start, null, kind); else { backup(mark); @@ -2745,7 +2745,7 @@ public class ExpressionParser implements IExpressionParser, IParserData { } } else if( LT(1) == IToken.t_operator ) - operatorId( d, null, null); + operatorId( d, null, null, kind); duple = d.getNameDuple(); } 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 2243f25b6a4..6fdfe6c04f1 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 @@ -2362,7 +2362,7 @@ public abstract class Parser extends ExpressionParser implements IParser try { if (LT(1) == IToken.t_operator) - operatorId(d, null, null); + operatorId(d, null, null, kind); else { try @@ -2387,7 +2387,7 @@ public abstract class Parser extends ExpressionParser implements IParser IToken end = null; if (start.getType() == IToken.tIDENTIFIER){ - end = consumeTemplateArguments(d.getDeclarationWrapper().getScope(), end, argumentList); + end = consumeTemplateArguments(d.getDeclarationWrapper().getScope(), end, argumentList, kind); if( end != null && end.getType() == IToken.tGT ) hasTemplateId = true; } @@ -2397,13 +2397,13 @@ public abstract class Parser extends ExpressionParser implements IParser { end = consume(); if (end.getType() == IToken.tIDENTIFIER){ - end = consumeTemplateArguments(d.getDeclarationWrapper().getScope(), end, argumentList); + end = consumeTemplateArguments(d.getDeclarationWrapper().getScope(), end, argumentList, kind); if( end.getType() == IToken.tGT ) hasTemplateId = true; } } if (LT(1) == IToken.t_operator) - operatorId(d11, start, ( hasTemplateId ? argumentList : null ) ); + operatorId(d11, start, ( hasTemplateId ? argumentList : null ), kind ); else {