1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

No proposals for content-assist within literals (bug 193464).

This commit is contained in:
Markus Schorn 2007-11-27 10:17:58 +00:00
parent 47ca7060dc
commit 0387b359a8
6 changed files with 45 additions and 21 deletions

View file

@ -6,10 +6,10 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems)
* Ed Swartz (Nokia)
* Mike Kucera (IBM) - bug #206952
* IBM Rational Software - Initial API and implementation
* Markus Schorn (Wind River Systems)
* Ed Swartz (Nokia)
* Mike Kucera (IBM) - bug #206952
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser;
@ -154,8 +154,13 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
// Use to create the completion node
protected ASTCompletionNode createCompletionNode(IToken token) {
// the preprocessor may deliver tokens for literals or header-names.
if (completionNode == null && token != null)
completionNode = new ASTCompletionNode(token, getTranslationUnit());
switch(token.getType()) {
case IToken.tCOMPLETION:
completionNode = new ASTCompletionNode(token, getTranslationUnit());
break;
}
return completionNode;
}

View file

@ -173,6 +173,7 @@ public class CPreprocessor implements ILexerLog, IScanner {
private String[][] fPreIncludedFiles= null;
private int fContentAssistLimit= -1;
private boolean fHandledCompletion= false;
// state information
private final CharArrayObjectMap fMacroDictionary = new CharArrayObjectMap(512);
@ -416,7 +417,12 @@ public class CPreprocessor implements ILexerLog, IScanner {
return t;
}
t= internalFetchToken(true, false, true, fRootContext);
try {
t= internalFetchToken(true, false, true, fRootContext);
} catch (OffsetLimitReachedException e) {
fHandledCompletion= true;
throw e;
}
final int offset= fLocationMap.getSequenceNumberForOffset(t.getOffset());
final int endOffset= fLocationMap.getSequenceNumberForOffset(t.getEndOffset());
t.setOffset(offset, endOffset);
@ -440,18 +446,18 @@ public class CPreprocessor implements ILexerLog, IScanner {
}
Token t1= fetchToken();
if (t1.getType() == IToken.tEND_OF_INPUT) {
switch (t1.getType()) {
case IToken.tCOMPLETION:
fHandledCompletion= true;
break;
case IToken.tEND_OF_INPUT:
if (fContentAssistLimit >= 0) {
int useType= IToken.tCOMPLETION;
if (fLastToken != null) {
final int lt= fLastToken.getType();
if (lt == IToken.tCOMPLETION || lt == IToken.tEOC) {
useType= IToken.tEOC;
}
}
int useType= fHandledCompletion ? IToken.tEOC : IToken.tCOMPLETION;
int sequenceNumber= fLocationMap.getSequenceNumberForOffset(fContentAssistLimit);
t1= new Token(useType, null, sequenceNumber, sequenceNumber);
fHandledCompletion= true;
}
break;
}
if (fLastToken != null) {
fLastToken.setNext(t1);
@ -474,19 +480,18 @@ public class CPreprocessor implements ILexerLog, IScanner {
final int tt1= t1.getType();
switch(tt1) {
case IToken.tCOMPLETION:
fHandledCompletion= true;
break;
case IToken.tEND_OF_INPUT:
if (fContentAssistLimit < 0) {
throw new EndOfFileException();
}
int useType= IToken.tCOMPLETION;
if (fLastToken != null) {
final int lt= fLastToken.getType();
if (lt == IToken.tCOMPLETION || lt == IToken.tEOC) {
useType= IToken.tEOC;
}
}
int useType= fHandledCompletion ? IToken.tEOC : IToken.tCOMPLETION;
int sequenceNumber= fLocationMap.getSequenceNumberForOffset(fContentAssistLimit);
t1= new Token(useType, null, sequenceNumber, sequenceNumber);
fHandledCompletion= true;
break;
case IToken.tSTRING:

View file

@ -174,6 +174,7 @@ final public class Lexer {
throw new OffsetLimitReachedException(origin, t);
case IToken.tEND_OF_INPUT:
if (fSupportContentAssist) {
t.setType(IToken.tCOMPLETION);
throw new OffsetLimitReachedException(origin, t);
}
// no break;

View file

@ -299,6 +299,7 @@ public class MacroExpander {
case IToken.tEND_OF_INPUT:
assert nesting >= 0;
if (fCompletionMode) {
t.setType(IToken.tCOMPLETION);
throw new OffsetLimitReachedException(ORIGIN, null);
}
break loop;

View file

@ -889,4 +889,10 @@ public class CompletionTests extends AbstractContentAssistTest {
final String[] expected= new String[0];
assertCompletionResults(fCursorOffset, expected, AbstractContentAssistTest.COMPARE_REP_STRINGS);
}
// void func() {float a; a= 1./*cursor*/}
public void testCompletionInFloatingPointLiteral_Bug193464() throws Exception {
final String[] expected= new String[0];
assertCompletionResults(fCursorOffset, expected, AbstractContentAssistTest.COMPARE_REP_STRINGS);
}
}

View file

@ -182,4 +182,10 @@ public class CompletionTests_PlainC extends AbstractContentAssistTest {
final String[] expected= new String[0];
assertCompletionResults(expected);
}
// void func() {float a; a= 1./*cursor*/}
public void testCompletionInFloatingPointLiteral_Bug193464() throws Exception {
final String[] expected= new String[0];
assertCompletionResults(expected);
}
}