mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-07 09:46:02 +02:00
This commit is contained in:
parent
d595dc0508
commit
129dd89591
3 changed files with 30 additions and 14 deletions
|
@ -1086,4 +1086,20 @@ public class CompletionParseTest extends CompletionParseBaseTest {
|
||||||
assertTrue( blah instanceof IASTVariable );
|
assertTrue( blah instanceof IASTVariable );
|
||||||
assertEquals( ((IASTVariable)blah).getName(), "blah" ); //$NON-NLS-1$
|
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 );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -275,7 +275,7 @@ public class ExpressionParser implements IExpressionParser, IParserData {
|
||||||
return last;
|
return last;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List templateArgumentList( IASTScope scope ) throws EndOfFileException, BacktrackException
|
protected List templateArgumentList( IASTScope scope, IASTCompletionNode.CompletionKind kind ) throws EndOfFileException, BacktrackException
|
||||||
{
|
{
|
||||||
IASTExpression expression = null;
|
IASTExpression expression = null;
|
||||||
List list = new LinkedList();
|
List list = new LinkedList();
|
||||||
|
@ -294,7 +294,7 @@ public class ExpressionParser implements IExpressionParser, IParserData {
|
||||||
IToken mark = mark();
|
IToken mark = mark();
|
||||||
|
|
||||||
try{
|
try{
|
||||||
IASTTypeId typeId = typeId( scope, false, CompletionKind.TYPE_REFERENCE );
|
IASTTypeId typeId = typeId( scope, false, kind );
|
||||||
|
|
||||||
expression = astFactory.createExpression( scope, IASTExpression.Kind.POSTFIX_TYPEID_TYPEID,
|
expression = astFactory.createExpression( scope, IASTExpression.Kind.POSTFIX_TYPEID_TYPEID,
|
||||||
null, null, null, typeId, null, EMPTY_STRING, null);
|
null, null, null, typeId, null, EMPTY_STRING, null);
|
||||||
|
@ -423,7 +423,7 @@ public class ExpressionParser implements IExpressionParser, IParserData {
|
||||||
else
|
else
|
||||||
setCompletionValuesNoContext(scope, kind, key );
|
setCompletionValuesNoContext(scope, kind, key );
|
||||||
|
|
||||||
last = consumeTemplateArguments(scope, last, argumentList);
|
last = consumeTemplateArguments(scope, last, argumentList, kind);
|
||||||
if( last.getType() == IToken.tGT )
|
if( last.getType() == IToken.tGT )
|
||||||
hasTemplateId = true;
|
hasTemplateId = true;
|
||||||
break;
|
break;
|
||||||
|
@ -454,7 +454,7 @@ public class ExpressionParser implements IExpressionParser, IParserData {
|
||||||
prev = last;
|
prev = last;
|
||||||
last = consume();
|
last = consume();
|
||||||
setCompletionValues( scope, kind, first, prev, Key.EMPTY );
|
setCompletionValues( scope, kind, first, prev, Key.EMPTY );
|
||||||
last = consumeTemplateArguments(scope, last, argumentList);
|
last = consumeTemplateArguments(scope, last, argumentList, kind);
|
||||||
if( last.getType() == IToken.tGT )
|
if( last.getType() == IToken.tGT )
|
||||||
hasTemplateId = true;
|
hasTemplateId = true;
|
||||||
}
|
}
|
||||||
|
@ -524,14 +524,14 @@ public class ExpressionParser implements IExpressionParser, IParserData {
|
||||||
* @throws EndOfFileException
|
* @throws EndOfFileException
|
||||||
* @throws BacktrackException
|
* @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( language != ParserLanguage.CPP ) return last;
|
||||||
if( LT(1) == IToken.tLT ){
|
if( LT(1) == IToken.tLT ){
|
||||||
IToken secondMark = mark();
|
IToken secondMark = mark();
|
||||||
consume( IToken.tLT );
|
consume( IToken.tLT );
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
List list = templateArgumentList( scope );
|
List list = templateArgumentList( scope, completionKind );
|
||||||
argumentList.addSegment( list );
|
argumentList.addSegment( list );
|
||||||
last = consume( IToken.tGT );
|
last = consume( IToken.tGT );
|
||||||
} catch( BacktrackException bt )
|
} 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
|
// we know this is an operator
|
||||||
IToken operatorToken = consume(IToken.t_operator);
|
IToken operatorToken = consume(IToken.t_operator);
|
||||||
IToken toSend = null;
|
IToken toSend = null;
|
||||||
|
@ -669,7 +669,7 @@ public class ExpressionParser implements IExpressionParser, IParserData {
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
toSend = consumeTemplateArguments( d.getDeclarationWrapper().getScope(), toSend, templateArgs );
|
toSend = consumeTemplateArguments( d.getDeclarationWrapper().getScope(), toSend, templateArgs, completionKind );
|
||||||
if( toSend.getType() == IToken.tGT ){
|
if( toSend.getType() == IToken.tGT ){
|
||||||
hasTemplateId = true;
|
hasTemplateId = true;
|
||||||
}
|
}
|
||||||
|
@ -2737,7 +2737,7 @@ public class ExpressionParser implements IExpressionParser, IParserData {
|
||||||
end = consumeTemplateParameters(end);
|
end = consumeTemplateParameters(end);
|
||||||
}
|
}
|
||||||
if (LT(1) == IToken.t_operator)
|
if (LT(1) == IToken.t_operator)
|
||||||
operatorId(d, start, null);
|
operatorId(d, start, null, kind);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
backup(mark);
|
backup(mark);
|
||||||
|
@ -2745,7 +2745,7 @@ public class ExpressionParser implements IExpressionParser, IParserData {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( LT(1) == IToken.t_operator )
|
else if( LT(1) == IToken.t_operator )
|
||||||
operatorId( d, null, null);
|
operatorId( d, null, null, kind);
|
||||||
|
|
||||||
duple = d.getNameDuple();
|
duple = d.getNameDuple();
|
||||||
}
|
}
|
||||||
|
|
|
@ -2362,7 +2362,7 @@ public abstract class Parser extends ExpressionParser implements IParser
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (LT(1) == IToken.t_operator)
|
if (LT(1) == IToken.t_operator)
|
||||||
operatorId(d, null, null);
|
operatorId(d, null, null, kind);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -2387,7 +2387,7 @@ public abstract class Parser extends ExpressionParser implements IParser
|
||||||
IToken end = null;
|
IToken end = null;
|
||||||
|
|
||||||
if (start.getType() == IToken.tIDENTIFIER){
|
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 )
|
if( end != null && end.getType() == IToken.tGT )
|
||||||
hasTemplateId = true;
|
hasTemplateId = true;
|
||||||
}
|
}
|
||||||
|
@ -2397,13 +2397,13 @@ public abstract class Parser extends ExpressionParser implements IParser
|
||||||
{
|
{
|
||||||
end = consume();
|
end = consume();
|
||||||
if (end.getType() == IToken.tIDENTIFIER){
|
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 )
|
if( end.getType() == IToken.tGT )
|
||||||
hasTemplateId = true;
|
hasTemplateId = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (LT(1) == IToken.t_operator)
|
if (LT(1) == IToken.t_operator)
|
||||||
operatorId(d11, start, ( hasTemplateId ? argumentList : null ) );
|
operatorId(d11, start, ( hasTemplateId ? argumentList : null ), kind );
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue