diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog-parser b/core/org.eclipse.cdt.core/parser/ChangeLog-parser index 1d5f4011ded..590a14f43b4 100644 --- a/core/org.eclipse.cdt.core/parser/ChangeLog-parser +++ b/core/org.eclipse.cdt.core/parser/ChangeLog-parser @@ -1,3 +1,6 @@ +2004-04-10 John Camelon + Partial fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=57898 + 2004-04-09 Andrew Niefer handle NPE during template argument deduction fix bug in definitions of certain template member templates (fixes a ClassCastException encountered in ) 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 9f9dc9deb3f..35fc817b714 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 @@ -336,10 +336,19 @@ public class ExpressionParser implements IExpressionParser { } } - return new TokenDuple(first, last, ( hasTemplateId ? argumentList : null ) ); + ITokenDuple tokenDuple = new TokenDuple(first, last, ( hasTemplateId ? argumentList : null ) ); + setGreaterNameContext( tokenDuple ); + return tokenDuple; } + /** + * @param tokenDuple + */ + protected void setGreaterNameContext(ITokenDuple tokenDuple) { + //do nothing in this implementation + } + /** * @param scope * @param kind @@ -2548,8 +2557,7 @@ public class ExpressionParser implements IExpressionParser { try { - IToken value = scanner.nextToken(); - handleNewToken( value ); + IToken value = scanner.nextToken(); return value; } catch( OffsetLimitReachedException olre ) @@ -2629,6 +2637,7 @@ public class ExpressionParser implements IExpressionParser { if (currToken != null) lastToken = currToken; currToken = currToken.getNext(); + handleNewToken( lastToken ); return lastToken; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/SelectionParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/SelectionParser.java index 3dc064cd816..bd6042a7a06 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/SelectionParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/SelectionParser.java @@ -10,6 +10,8 @@ ***********************************************************************/ package org.eclipse.cdt.internal.core.parser; +import java.util.Iterator; + import org.eclipse.cdt.core.parser.EndOfFileException; import org.eclipse.cdt.core.parser.IParserLogService; import org.eclipse.cdt.core.parser.IScanner; @@ -35,6 +37,8 @@ public class SelectionParser extends ContextualParser { private IASTScope ourScope = null; private IASTCompletionNode.CompletionKind ourKind = null; private IASTNode ourContext = null; + private ITokenDuple greaterContextDuple = null; + private boolean pastPointOfSelection = false; /* (non-Javadoc) * @see org.eclipse.cdt.internal.core.parser.Parser#handleNewToken(org.eclipse.cdt.core.parser.IToken) @@ -53,7 +57,7 @@ public class SelectionParser extends ContextualParser { TraceUtil.outputTrace(log, "Offset Ceiling Hit w/token \"", null, value.getImage(), "\"", null ); //$NON-NLS-1$ //$NON-NLS-2$ lastTokenOfDuple = value; } - if( scanner.isOnTopContext() && lastTokenOfDuple != null && lastTokenOfDuple.getEndOffset() >= offsetRange.getCeilingOffset() ) + if( lastTokenOfDuple != null && lastTokenOfDuple.getEndOffset() >= offsetRange.getCeilingOffset() ) { if ( ourScope == null ) ourScope = getCompletionScope(); @@ -61,12 +65,13 @@ public class SelectionParser extends ContextualParser { ourContext = getCompletionContext(); if( ourKind == null ) ourKind = getCompletionKind(); - } } } + + /** * @param scanner * @param callback @@ -102,9 +107,48 @@ public class SelectionParser extends ContextualParser { if( ! duple.syntaxOfName() ) throw new ParseError( ParseError.ParseErrorKind.OFFSET_RANGE_NOT_NAME ); - return duple.lookup( astFactory, ourScope ); + return provideSelectionNode(duple); } + /** + * @param duple + * @return + */ + protected IASTNode provideSelectionNode(ITokenDuple duple) { + + ITokenDuple finalDuple = null; + // reconcile the name to look up first + if( ! duple.equals( greaterContextDuple )) + { + // 3 cases + + // duple is prefix of greaterContextDuple + if( duple.getFirstToken().equals( greaterContextDuple.getFirstToken() )) + { + // => do not use greaterContextDuple + finalDuple = duple; + } + // duple is suffix of greaterContextDuple + else if( duple.getLastToken().equals( greaterContextDuple.getLastToken() )) + { + // => use greaterContextDuple + finalDuple = greaterContextDuple; + } + // duple is a sub-duple of greaterContextDuple + else + { + // => throw ParseError + throw new ParseError( ParseError.ParseErrorKind.OFFSET_RANGE_NOT_NAME ); + } + } + else + finalDuple = greaterContextDuple; + return finalDuple.lookup( astFactory, ourScope ); + } + + + + /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.IParser#parse(int) */ @@ -119,4 +163,29 @@ public class SelectionParser extends ContextualParser { protected void checkEndOfFile() throws EndOfFileException { } + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.parser.ExpressionParser#setGreaterNameContext(org.eclipse.cdt.core.parser.ITokenDuple) + */ + protected void setGreaterNameContext(ITokenDuple tokenDuple) { + + if( pastPointOfSelection ) return; + if( greaterContextDuple == null && scanner.isOnTopContext() && lastTokenOfDuple != null && firstTokenOfDuple != null ) + { + if( tokenDuple.getStartOffset() > lastTokenOfDuple.getEndOffset() ) + { + pastPointOfSelection = true; + return; + } + int tokensFound = 0; + Iterator i = tokenDuple.iterator(); + while( i.hasNext() ) + { + IToken token = (IToken) i.next(); + if( token == firstTokenOfDuple ) ++tokensFound; + if( token == lastTokenOfDuple ) ++tokensFound; + } + if( tokensFound == 2 ) + greaterContextDuple = tokenDuple; + } + } } 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 f63fcbbbd31..31c7dbe4382 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 @@ -425,4 +425,16 @@ public class TokenDuple implements ITokenDuple { } return true; } + + + /* (non-Javadoc) + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object other) { + if( !(other instanceof ITokenDuple ) ) return false; + if( ((ITokenDuple) other).getFirstToken().equals( getFirstToken() ) && + ((ITokenDuple) other).getLastToken().equals( getLastToken() ) ) + return true; + return false; + } }