diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java index 7129bef1679..78b1afdf868 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java @@ -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; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java index 0251644373a..027b02ece9b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java @@ -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: diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Lexer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Lexer.java index e0009e93e75..821ccfffb98 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Lexer.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Lexer.java @@ -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; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/MacroExpander.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/MacroExpander.java index 871303f0c78..228c01df65c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/MacroExpander.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/MacroExpander.java @@ -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; diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java index fae9f90fc3e..8be873987d0 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java @@ -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); + } } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests_PlainC.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests_PlainC.java index 11debb27e6c..47fa7d4bc1f 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests_PlainC.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests_PlainC.java @@ -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); + } }