diff options
author | Markus Schorn | 2008-02-15 12:43:17 +0000 |
---|---|---|
committer | Markus Schorn | 2008-02-15 12:43:17 +0000 |
commit | 08cce46ebc721fc6b1d462652e68cb7610150aa7 (patch) | |
tree | 63f640147a7faf93b0168ca4c1a0e2ee6f843f59 /core | |
parent | 2b53efe51744f9dd2837f6fe6cf383e83280ce0f (diff) | |
download | org.eclipse.cdt-08cce46ebc721fc6b1d462652e68cb7610150aa7.tar.gz org.eclipse.cdt-08cce46ebc721fc6b1d462652e68cb7610150aa7.tar.xz org.eclipse.cdt-08cce46ebc721fc6b1d462652e68cb7610150aa7.zip |
Ambiguity between template arguments and relational expression, bug 104706.
Diffstat (limited to 'core')
5 files changed, 122 insertions, 83 deletions
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java index bb607fee29f..98f418c2663 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2BaseTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2007 IBM Corporation and others. + * Copyright (c) 2004, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -9,10 +9,6 @@ * IBM Corporation - initial API and implementation * Markus Schorn (Wind River Systems) *******************************************************************************/ - -/* - * Created on Nov 22, 2004 - */ package org.eclipse.cdt.core.parser.tests.ast2; import java.io.IOException; @@ -266,7 +262,8 @@ public class AST2BaseTest extends BaseTestCase { shouldVisitNames = true; } public List nameList = new ArrayList(); - public int visit( IASTName name ){ + @Override + public int visit( IASTName name ){ nameList.add( name ); return PROCESS_CONTINUE; } @@ -295,7 +292,8 @@ public class AST2BaseTest extends BaseTestCase { shouldVisitNames = true; } public List<IASTName> nameList = new ArrayList<IASTName>(); - public int visit(IASTName name) { + @Override + public int visit(IASTName name) { nameList.add(name); return PROCESS_CONTINUE; } @@ -361,6 +359,7 @@ public class AST2BaseTest extends BaseTestCase { public int numProblemBindings=0; public int numNullBindings=0; public List nameList = new ArrayList(); + @Override public int visit( IASTName name ){ nameList.add( name ); IBinding binding = name.resolveBinding(); @@ -385,6 +384,7 @@ public class AST2BaseTest extends BaseTestCase { public int numProblemBindings=0; public int numNullBindings=0; public List nameList = new ArrayList(); + @Override public int visit( IASTName name ){ nameList.add( name ); IBinding binding = name.resolveBinding(); @@ -453,7 +453,7 @@ public class AST2BaseTest extends BaseTestCase { } } names= (IASTName[]) lnames.toArray(new IASTName[lnames.size()]); - assertEquals("<>1 name found for \""+section+"\"", 1, names.length); + assertEquals("found " + names.length + " names for \""+section.substring(0, len)+"\"", 1, names.length); IBinding binding = names[0].resolveBinding(); assertNotNull("No binding for "+names[0].getRawSignature(), binding); diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index 62f4f28cdcc..014c90e1b92 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -5708,4 +5708,17 @@ public class AST2CPPTests extends AST2BaseTest { bh.assertNonProblem("foo3", 4); } + // int foo2() { + // int relayIndex = -1; + // int numRelays = 0; + // if( relayIndex < 0 || relayIndex > numRelays ) + // return 0; + // } + public void testTemplateIDAmbiguity_Bug104706() throws Exception { + BindingAssertionHelper bh= new BindingAssertionHelper(getContents(1)[0].toString(), true); + + bh.assertNonProblem("relayIndex <", 10); + bh.assertNonProblem("relayIndex >", 10); + bh.assertNonProblem("numRelays )", 9); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ITokenDuple.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ITokenDuple.java index 4204d6a44f9..7e6e29676ab 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ITokenDuple.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/ITokenDuple.java @@ -1,18 +1,21 @@ /******************************************************************************* - * Copyright (c) 2002, 2007 IBM Corporation and others. + * Copyright (c) 2002, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM Rational Software - Initial API and implementation + * IBM Rational Software - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.core.parser; import java.util.Iterator; import java.util.List; +import org.eclipse.cdt.core.dom.ast.IASTNode; + /** * @author jcamelon @@ -27,13 +30,13 @@ public interface ITokenDuple { */ public abstract IToken getLastToken(); - public List [] getTemplateIdArgLists(); + public List<IASTNode>[] getTemplateIdArgLists(); public ITokenDuple getLastSegment(); public ITokenDuple getLeadingSegments(); public int getSegmentCount(); - public abstract Iterator iterator(); + public abstract Iterator<IToken> iterator(); public abstract String toString(); public char [] toCharArray(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index 1f8a05574c4..9d96d36b5da 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -276,13 +276,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { return last; } - protected List templateArgumentList() throws EndOfFileException, + protected List<IASTNode> templateArgumentList() throws EndOfFileException, BacktrackException { IToken start = LA(1); int startingOffset = start.getOffset(); int endOffset = 0; start = null; - List list = new ArrayList(); + List<IASTNode> list = new ArrayList<IASTNode>(); boolean completedArg = false; boolean failed = false; @@ -363,10 +363,12 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { case IToken.tCOMPLETION: case IToken.tEOC: last = consume(); - IToken templateLast = consumeTemplateArguments(last, argumentList); - if (last != templateLast) { - last = templateLast; - hasTemplateId = true; + if (!fNoTemplateArguments) { + IToken templateLast = consumeTemplateArguments(last, argumentList); + if (last != templateLast) { + last = templateLast; + hasTemplateId = true; + } } break; @@ -378,10 +380,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } while (LT(1) == IToken.tCOLONCOLON) { + boolean checkTemplateArgs= !fNoTemplateArguments; last = consume(); - if (LT(1) == IToken.t_template) + if (LT(1) == IToken.t_template) { + checkTemplateArgs= true; consume(); + } if (LT(1) == IToken.tBITCOMPLEMENT) consume(); @@ -396,7 +401,9 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { case IToken.tCOMPLETION: case IToken.tEOC: last = consume(); - last = consumeTemplateArguments(last, argumentList); + if (checkTemplateArgs) { + last = consumeTemplateArguments(last, argumentList); + } if (last.getType() == IToken.tGT || last.getType() == IToken.tEOC) hasTemplateId = true; } @@ -425,16 +432,16 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { IToken secondMark = mark(); consume(); try { - List list = templateArgumentList(); + List<IASTNode> list = templateArgumentList(); argumentList.addSegment(list); switch (LT(1)) { case IToken.tGT: case IToken.tEOC: - last = consume(); - if( LT(1) == IToken.tINTEGER || LT(1) == IToken.tFLOATINGPT ) { + if( LT(2) == IToken.tINTEGER || LT(2) == IToken.tFLOATINGPT) { backup( secondMark ); return last; } + last = consume(); break; default: throw backtrack; @@ -530,7 +537,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { * @throws BacktrackException * request a backtrack */ - protected void consumePointerOperators(List collection) + protected void consumePointerOperators(List<IASTPointerOperator> collection) throws EndOfFileException, BacktrackException { for (;;) { @@ -1862,6 +1869,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { private final IIndex index; + private boolean fNoTemplateArguments; + private static final int DEFAULT_PARM_LIST_SIZE = 4; private static final int DEFAULT_POINTEROPS_LIST_SIZE = 4; @@ -2139,7 +2148,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } try { - List parms = templateParameterList(); + List<ICPPASTTemplateParameter> parms = templateParameterList(); consume(IToken.tGT); ICPPASTTemplateDeclaration templateDecl = createTemplateDeclaration(); try @@ -2150,7 +2159,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { templateDecl.setExported(exported); templateDecl.setDeclaration(d); for (int i = 0; i < parms.size(); ++i) { - ICPPASTTemplateParameter parm = (ICPPASTTemplateParameter) parms.get(i); + ICPPASTTemplateParameter parm = parms.get(i); templateDecl.addTemplateParamter(parm); } } @@ -2204,11 +2213,11 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { * @throws BacktrackException * request for a backtrack */ - protected List templateParameterList() throws BacktrackException, + protected List<ICPPASTTemplateParameter> templateParameterList() throws BacktrackException, EndOfFileException { // if we have gotten this far then we have a true template-declaration // iterate through the template parameter list - List returnValue = new ArrayList(DEFAULT_PARM_LIST_SIZE); + List<ICPPASTTemplateParameter> returnValue = new ArrayList<ICPPASTTemplateParameter>(DEFAULT_PARM_LIST_SIZE); for (;;) { if (LT(1) == IToken.tGT) @@ -2250,7 +2259,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { IToken firstToken = consume(); consume(IToken.tLT); - List subResult = templateParameterList(); + List<ICPPASTTemplateParameter> subResult = templateParameterList(); consume(IToken.tGT); int last = consume(IToken.t_class).getEndOffset(); IASTName identifierName = null; @@ -2275,7 +2284,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } for (int i = 0; i < subResult.size(); ++i) { - ICPPASTTemplateParameter p = (ICPPASTTemplateParameter) subResult.get(i); + ICPPASTTemplateParameter p = subResult.get(i); parm.addTemplateParamter(p); } returnValue.add(parm); @@ -2587,10 +2596,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } result.setTemplateName(templateIdName); if (duple.getTemplateIdArgLists() != null) { - List args = duple.getTemplateIdArgLists()[0]; + List<IASTNode> args= duple.getTemplateIdArgLists()[0]; if (args != null) for (int i = 0; i < args.size(); ++i) { - IASTNode n = (IASTNode) args.get(i); + IASTNode n = args.get(i); if (n instanceof IASTTypeId) result.addTemplateArgument((IASTTypeId) n); else if(n instanceof IASTExpression) @@ -2712,7 +2721,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { boolean hasFunctionTryBlock = false; boolean consumedSemi = false; int semiOffset = 0; - List constructorChain = Collections.EMPTY_LIST; + List<IASTNode> constructorChain = Collections.emptyList(); switch (LT(1)) { case IToken.tSEMI: @@ -2724,13 +2733,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { case IToken.t_try: consume(); if (LT(1) == IToken.tCOLON) { - constructorChain = new ArrayList(DEFAULT_CONSTRUCTOR_CHAIN_LIST_SIZE); + constructorChain = new ArrayList<IASTNode>(DEFAULT_CONSTRUCTOR_CHAIN_LIST_SIZE); ctorInitializer(constructorChain); } hasFunctionTryBlock = true; break; case IToken.tCOLON: - constructorChain = new ArrayList(DEFAULT_CONSTRUCTOR_CHAIN_LIST_SIZE); + constructorChain = new ArrayList<IASTNode>(DEFAULT_CONSTRUCTOR_CHAIN_LIST_SIZE); ctorInitializer(constructorChain); hasFunctionBody = true; break; @@ -2794,10 +2803,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { ((ASTNode) funcDefinition).setLength(calculateEndOffset(s) - firstOffset); if (hasFunctionTryBlock && declarator instanceof ICPPASTFunctionTryBlockDeclarator) { - List handlers = new ArrayList(DEFAULT_CATCH_HANDLER_LIST_SIZE); + List<ICPPASTCatchHandler> handlers = new ArrayList<ICPPASTCatchHandler>(DEFAULT_CATCH_HANDLER_LIST_SIZE); catchHandlerSequence(handlers); for (int i = 0; i < handlers.size(); ++i) { - ICPPASTCatchHandler handler = (ICPPASTCatchHandler) handlers.get(i); + ICPPASTCatchHandler handler = handlers.get(i); ((ICPPASTFunctionTryBlockDeclarator) declarator).addCatchHandler(handler); ((ASTNode) funcDefinition).setLength(calculateEndOffset(handler) - firstOffset); } @@ -2842,7 +2851,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { * @throws BacktrackException * request a backtrack */ - protected void ctorInitializer(List collection) throws EndOfFileException, + protected void ctorInitializer(List<IASTNode> collection) throws EndOfFileException, BacktrackException { consume(); ctorLoop: for (;;) { @@ -3545,10 +3554,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { la = null; IASTDeclarator innerDecl = null; IASTName declaratorName = null; - List pointerOps = new ArrayList(DEFAULT_POINTEROPS_LIST_SIZE); - List parameters = Collections.EMPTY_LIST; - List arrayMods = Collections.EMPTY_LIST; - List exceptionSpecIds = Collections.EMPTY_LIST; + List<IASTPointerOperator> pointerOps = new ArrayList<IASTPointerOperator>(DEFAULT_POINTEROPS_LIST_SIZE); + List<IASTNode> parameters = Collections.emptyList(); + List<IASTNode> arrayMods = Collections.emptyList(); + List<IASTNode> exceptionSpecIds = Collections.emptyList(); boolean encounteredVarArgs = false; boolean tryEncountered = false; IASTExpression bitField = null; @@ -3563,7 +3572,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { __attribute_decl_seq(supportAttributeSpecifiers, supportDeclspecSpecifiers); if (!pointerOps.isEmpty()) - finalOffset = calculateEndOffset((IASTNode) pointerOps.get(pointerOps.size() - 1)); + finalOffset = calculateEndOffset(pointerOps.get(pointerOps.size() - 1)); if (!forNewTypeId && LT(1) == IToken.tLPAREN) { IToken mark = mark(); @@ -3655,7 +3664,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { IASTParameterDeclaration p = parameterDeclaration(); finalOffset = calculateEndOffset(p); if (parameters == Collections.EMPTY_LIST) - parameters = new ArrayList(DEFAULT_PARM_LIST_SIZE); + parameters = new ArrayList<IASTNode>(DEFAULT_PARM_LIST_SIZE); parameters.add(p); seenParameter = true; } @@ -3693,7 +3702,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { // check for throws clause here if (LT(1) == IToken.t_throw) { - exceptionSpecIds = new ArrayList(DEFAULT_SIZE_EXCEPTIONS_LIST); + exceptionSpecIds = new ArrayList<IASTNode>(DEFAULT_SIZE_EXCEPTIONS_LIST); consume(); // throw consume(IToken.tLPAREN); // ( boolean done = false; @@ -3759,10 +3768,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { case IToken.tLBRACKET: if (forNewTypeId) break; - arrayMods = new ArrayList(DEFAULT_POINTEROPS_LIST_SIZE); + arrayMods = new ArrayList<IASTNode>(DEFAULT_POINTEROPS_LIST_SIZE); consumeArrayModifiers(arrayMods); if (!arrayMods.isEmpty()) - finalOffset = calculateEndOffset((IASTNode) arrayMods.get(arrayMods.size() - 1)); + finalOffset = calculateEndOffset(arrayMods.get(arrayMods.size() - 1)); continue; case IToken.tCOLON: consume(); @@ -3818,7 +3827,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { d = createDeclarator(); } for (int i = 0; i < pointerOps.size(); ++i) { - IASTPointerOperator po = (IASTPointerOperator) pointerOps.get(i); + IASTPointerOperator po = pointerOps.get(i); d.addPointerOperator(po); } if (innerDecl != null) { @@ -4179,7 +4188,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { return new CPPASTBaseSpecifier(); } - protected void catchHandlerSequence(List collection) + protected void catchHandlerSequence(List<ICPPASTCatchHandler> collection) throws EndOfFileException, BacktrackException { if (LT(1) == IToken.tEOC) return; @@ -4349,7 +4358,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { return new CPPASTTranslationUnit(); } - protected void consumeArrayModifiers(List collection) + protected void consumeArrayModifiers(List<IASTNode> collection) throws EndOfFileException, BacktrackException { while (LT(1) == IToken.tLBRACKET) { int o = consume().getOffset(); // eat the '[' @@ -4608,14 +4617,14 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { protected IASTStatement parseTryStatement() throws EndOfFileException, BacktrackException { int startO = consume().getOffset(); IASTStatement tryBlock = compoundStatement(); - List catchHandlers = new ArrayList(DEFAULT_CATCH_HANDLER_LIST_SIZE); + List<ICPPASTCatchHandler> catchHandlers = new ArrayList<ICPPASTCatchHandler>(DEFAULT_CATCH_HANDLER_LIST_SIZE); catchHandlerSequence(catchHandlers); ICPPASTTryBlockStatement tryStatement = createTryBlockStatement(); ((ASTNode) tryStatement).setOffset(startO); tryStatement.setTryBody(tryBlock); for (int i = 0; i < catchHandlers.size(); ++i) { - ICPPASTCatchHandler handler = (ICPPASTCatchHandler) catchHandlers.get(i); + ICPPASTCatchHandler handler = catchHandlers.get(i); tryStatement.addCatchHandler(handler); ((ASTNode) tryStatement).setLength(calculateEndOffset(handler) - startO); } @@ -4654,7 +4663,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { protected IASTStatement parseWhileStatement() throws EndOfFileException, BacktrackException { int startOffset = consume().getOffset(); consume(IToken.tLPAREN); - IASTNode while_condition = cppStyleCondition(true); + IASTNode while_condition = cppStyleCondition(IToken.tRPAREN); switch (LT(1)) { case IToken.tRPAREN: consume(); @@ -4689,20 +4698,31 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { * @param expectSemi TODO * @return */ - protected IASTNode cppStyleCondition(boolean expectSemi) throws BacktrackException, EndOfFileException { + protected IASTNode cppStyleCondition(int expectToken) throws BacktrackException, EndOfFileException { IToken mark = mark(); try { IASTExpression e = expression(); - if( ! expectSemi ) - return e; - switch (LT(1)) { - case IToken.tRPAREN: - case IToken.tEOC: - return e; - default: - throwBacktrack(LA(1)); + final int lt1= LT(1); + if (lt1 == expectToken || lt1 == IToken.tEOC) { + return e; + } + if (!fNoTemplateArguments) { + // bug 104706, ambiguity between template arguments and conditional expression, + // try without template args + backup(mark); + try { + fNoTemplateArguments= true; + e= expression(); + final int lt11= LT(1); + if (lt11 == expectToken || lt11 == IToken.tEOC) { + return e; + } + } + finally { + fNoTemplateArguments= false; + } } - return e; + throwBacktrack(LA(1)); } catch (BacktrackException bt) { backup(mark); try { @@ -4710,9 +4730,9 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } catch (BacktrackException b) { failParse(); throwBacktrack(b); - return null; } } + return null; } private static class EmptyVisitor extends CPPASTVisitor { @@ -4749,7 +4769,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { consume(IToken.tLPAREN); IASTNode condition = null; try { - condition = cppStyleCondition(true); + condition = cppStyleCondition(IToken.tRPAREN); // condition if (LT(1) == IToken.tEOC) { // Completing in the condition @@ -4898,7 +4918,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { int startOffset; startOffset = consume().getOffset(); consume(IToken.tLPAREN); - IASTNode switch_condition = cppStyleCondition(true); + IASTNode switch_condition = cppStyleCondition(IToken.tRPAREN); switch (LT(1)) { case IToken.tRPAREN: consume(); @@ -4945,7 +4965,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { case IToken.tEOC: break; default: - for_condition = cppStyleCondition(false); + for_condition = cppStyleCondition(IToken.tSEMI); } switch (LT(1)) { case IToken.tSEMI: diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java index 83e8ce99b6c..b1ad4250c2c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java @@ -1,12 +1,12 @@ /******************************************************************************* - * Copyright (c) 2002, 2007 IBM Corporation and others. + * Copyright (c) 2002, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM Rational Software - Initial API and implementation + * IBM Rational Software - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.core.parser.token; @@ -15,6 +15,7 @@ import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; +import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.parser.IToken; import org.eclipse.cdt.core.parser.ITokenDuple; import org.eclipse.cdt.core.parser.util.CharArrayUtils; @@ -56,7 +57,7 @@ public class BasicTokenDuple implements ITokenDuple { return lastToken; } - public Iterator iterator() + public Iterator<IToken> iterator() { return new TokenIterator(); } @@ -80,9 +81,9 @@ public class BasicTokenDuple implements ITokenDuple { last = token; } - List [] args = getTemplateIdArgLists(); + List<IASTNode> [] args = getTemplateIdArgLists(); if( args != null && args[ args.length - 1 ] != null ){ - List newArgs = new ArrayList( 1 ); + List<List<IASTNode>> newArgs = new ArrayList<List<IASTNode>>( 1 ); newArgs.add( args[ args.length - 1 ] ); return TokenFactory.createTokenDuple( first, last, newArgs ); } @@ -92,7 +93,7 @@ public class BasicTokenDuple implements ITokenDuple { public ITokenDuple[] getSegments() { - List r = new ArrayList(); + List<ITokenDuple> r = new ArrayList<ITokenDuple>(); IToken token = null; IToken prev = null; IToken last = getLastToken(); @@ -125,7 +126,7 @@ public class BasicTokenDuple implements ITokenDuple { ITokenDuple d = TokenFactory.createTokenDuple( startOfSegment, last ); r.add( d ); } - return (ITokenDuple[]) r.toArray( new ITokenDuple[ r.size() ]); + return r.toArray( new ITokenDuple[ r.size() ]); } @@ -162,8 +163,8 @@ public class BasicTokenDuple implements ITokenDuple { } if( getTemplateIdArgLists() != null ){ - List[] args = getTemplateIdArgLists(); - List newArgs = new ArrayList( args.length - 1 ); + List<IASTNode>[] args = getTemplateIdArgLists(); + List<List<IASTNode>> newArgs = new ArrayList<List<IASTNode>>( args.length - 1 ); boolean foundArgs = false; for( int i = 0; i < args.length - 1; i++ ){ newArgs.add( args[i] ); @@ -187,7 +188,7 @@ public class BasicTokenDuple implements ITokenDuple { private static final char[] EMPTY_STRING = "".toCharArray(); //$NON-NLS-1$ private char[] stringRepresentation = null; - private class TokenIterator implements Iterator + private class TokenIterator implements Iterator<IToken> { private IToken iter = firstToken; @@ -201,7 +202,7 @@ public class BasicTokenDuple implements ITokenDuple { /* (non-Javadoc) * @see java.util.Iterator#next() */ - public Object next() { + public IToken next() { if( ! hasNext() ) throw new NoSuchElementException(); IToken temp = iter; @@ -285,6 +286,7 @@ public class BasicTokenDuple implements ITokenDuple { } + @Override public String toString() { if( stringRepresentation == null ) @@ -369,7 +371,7 @@ public class BasicTokenDuple implements ITokenDuple { /* (non-Javadoc) * @see org.eclipse.cdt.core.parser.ITokenDuple#getTemplateIdArgLists() */ - public List[] getTemplateIdArgLists() { + public List<IASTNode>[] getTemplateIdArgLists() { return null; } @@ -414,6 +416,7 @@ public class BasicTokenDuple implements ITokenDuple { /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ + @Override public boolean equals(Object other) { if( !(other instanceof ITokenDuple ) ) return false; if( ((ITokenDuple) other).getFirstToken().equals( getFirstToken() ) && @@ -425,7 +428,7 @@ public class BasicTokenDuple implements ITokenDuple { public ITokenDuple getTemplateIdNameTokenDuple() { ITokenDuple nameDuple = getLastSegment(); - List [] argLists = getTemplateIdArgLists(); + List<IASTNode>[] argLists = getTemplateIdArgLists(); if( argLists == null || argLists[ argLists.length - 1 ] == null ) return nameDuple; @@ -463,7 +466,7 @@ public class BasicTokenDuple implements ITokenDuple { public char[] extractNameFromTemplateId(){ ITokenDuple nameDuple = getLastSegment(); - List [] argLists = getTemplateIdArgLists(); + List<IASTNode>[] argLists = getTemplateIdArgLists(); if( argLists == null || argLists[ argLists.length - 1 ] == null ) return nameDuple.toCharArray(); @@ -545,7 +548,7 @@ public class BasicTokenDuple implements ITokenDuple { * */ private String [] generateQualifiedName() { - List qn = new ArrayList(); + List<String> qn = new ArrayList<String>(); IToken i = firstToken; while( i != lastToken ) { @@ -577,7 +580,7 @@ public class BasicTokenDuple implements ITokenDuple { qn.add( i.getImage() ); } String [] qualifiedName = new String[ qn.size() ]; - return (String[]) qn.toArray( qualifiedName ); + return qn.toArray( qualifiedName ); } /** |