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 1df98359785..8794c7092c8 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 @@ -1307,10 +1307,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { typeId = typeId(true, false); switch (LT(1)) { case IToken.tRPAREN: - lastOffset = consume(IToken.tRPAREN).getEndOffset(); - break; case IToken.tEOC: - lastOffset = Integer.MAX_VALUE; + lastOffset = consume().getEndOffset(); break; default: throw backtrack; @@ -1501,10 +1499,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { int lastOffset; switch (LT(1)) { case IToken.tRBRACKET: - lastOffset = consume(IToken.tRBRACKET).getEndOffset(); - break; case IToken.tEOC: - lastOffset = Integer.MAX_VALUE; + lastOffset = consume().getEndOffset(); break; default: throw backtrack; @@ -1540,10 +1536,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { secondExpression = null; switch (LT(1)) { case IToken.tRPAREN: - lastOffset = consume(IToken.tRPAREN).getEndOffset(); - break; case IToken.tEOC: - lastOffset = Integer.MAX_VALUE; + lastOffset = consume().getEndOffset(); break; default: throw backtrack; @@ -1959,13 +1953,26 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { // using-directive int endOffset = consume(IToken.t_namespace).getEndOffset(); IASTName name = null; - if (LT(1) == IToken.tIDENTIFIER || LT(1) == IToken.tCOLONCOLON) + switch (LT(1)) { + case IToken.tIDENTIFIER: + case IToken.tCOLONCOLON: + case IToken.tCOMPLETION: name = createName(name()); - else + break; + default: throwBacktrack(firstToken.getOffset(), endOffset - firstToken.getOffset()); + } + + switch (LT(1)) { + case IToken.tSEMI: + case IToken.tEOC: + endOffset = consume().getEndOffset(); + break; + default: + throw backtrack; + } - endOffset = consume(IToken.tSEMI).getEndOffset(); ICPPASTUsingDirective astUD = createUsingDirective(); ((ASTNode) astUD).setOffsetAndLength(firstToken.getOffset(), endOffset - firstToken.getOffset()); @@ -1983,7 +1990,16 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } IASTName name = createName(name()); - int end = consume(IToken.tSEMI).getEndOffset(); + int end; + switch (LT(1)) { + case IToken.tSEMI: + case IToken.tEOC: + end = consume().getEndOffset(); + break; + default: + throw backtrack; + } + ICPPASTUsingDeclaration result = createUsingDeclaration(); ((ASTNode) result).setOffsetAndLength(firstToken.getOffset(), end - firstToken.getOffset()); @@ -4549,10 +4565,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { int l; switch (LT(1)) { case IToken.tRBRACKET: - l = consume(IToken.tRBRACKET).getEndOffset(); - break; case IToken.tEOC: - l = Integer.MAX_VALUE; + l = consume().getEndOffset(); break; default: throw backtrack; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionContributor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionContributor.java index 7cd1139a06e..61c7d110233 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionContributor.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionContributor.java @@ -25,9 +25,13 @@ import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IVariable; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration; import org.eclipse.cdt.core.model.IWorkingCopy; import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; import org.eclipse.cdt.internal.ui.viewsupport.CElementImageProvider; @@ -229,7 +233,7 @@ public class DOMCompletionContributor implements ICompletionContributor { if (binding instanceof ITypedef) { imageDescriptor = CElementImageProvider.getTypedefImageDescriptor(); } else if (binding instanceof ICompositeType) { - if (((ICompositeType)binding).getKey() == ICPPClassType.k_class) + if (((ICompositeType)binding).getKey() == ICPPClassType.k_class || binding instanceof ICPPClassTemplate) imageDescriptor = CElementImageProvider.getClassImageDescriptor(); else if (((ICompositeType)binding).getKey() == ICompositeType.k_struct) imageDescriptor = CElementImageProvider.getStructImageDescriptor(); @@ -253,6 +257,12 @@ public class DOMCompletionContributor implements ICompletionContributor { imageDescriptor = CElementImageProvider.getVariableImageDescriptor(); } else if (binding instanceof ICPPNamespace) { imageDescriptor = CElementImageProvider.getNamespaceImageDescriptor(); + } else if (binding instanceof ICPPFunctionTemplate) { + imageDescriptor = CElementImageProvider.getFunctionImageDescriptor(); + } else if (binding instanceof ICPPUsingDeclaration) { + ICPPDelegate[] delegates = ((ICPPUsingDeclaration)binding).getDelegates(); + if (delegates.length > 0) + return getImage(delegates[0]); } } catch (DOMException e) { }