From 6924155bcbebd8db5341685310c09b328c1d87ac Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Tue, 22 Feb 2005 19:27:18 +0000 Subject: [PATCH] Hooked up to the prefix resolution. Added image for functions. --- .../org/eclipse/cdt/core/dom/ast/IASTName.java | 8 ++++++++ .../dom/parser/AbstractGNUSourceCodeParser.java | 5 ++++- .../cdt/internal/core/dom/parser/c/CASTName.java | 5 +++++ .../internal/core/dom/parser/cpp/CPPASTName.java | 4 ++++ .../core/dom/parser/cpp/CPPASTQualifiedName.java | 5 +++++ .../core/dom/parser/cpp/CPPASTTemplateId.java | 5 +++++ .../internal/core/parser/scanner2/BaseScanner.java | 6 ++---- .../internal/core/parser/scanner2/LocationMap.java | 5 +++++ .../internal/core/parser/token/SimpleToken.java | 3 ++- .../text/contentassist/CCompletionProcessor2.java | 14 +++++++------- 10 files changed, 47 insertions(+), 13 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java index acb55475cdd..a48c80657f8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java @@ -30,5 +30,13 @@ public interface IASTName extends IASTNode { */ public IBinding resolveBinding(); + /** + * Return a list of bindings in the scope of the name that have the + * name as a prefix. + * + * @return bindings that start with this name + */ + public IBinding[] resolvePrefix(); + public char[] toCharArray(); } 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 db646e024dd..b895fd965d4 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 @@ -432,12 +432,15 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { case IToken.tRBRACE: --depth; break; + case IToken.tEOC: + throw new EndOfFileException(); } if (depth < 0) return; consume(); } + // eat the SEMI/RBRACE as well consume(); } @@ -1458,7 +1461,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { BacktrackException savedBt = null; try { IASTExpression expression = expression(); - lastTokenOfExpression = consume(IToken.tSEMI); + lastTokenOfExpression = consume(); // SEMI or EOC expressionStatement = createExpressionStatement(); expressionStatement.setExpression(expression); ((ASTNode) expressionStatement).setOffsetAndLength( diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java index b5c2897cd51..7b9c1612bc9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java @@ -45,6 +45,11 @@ public class CASTName extends CASTNode implements IASTName { return binding; } + public IBinding[] resolvePrefix() { + // TODO hook this up to the CVisitor + return null; + } + protected boolean hasBinding(){ return ( binding != null ); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java index 519d7540c31..22cd0f91045 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java @@ -46,6 +46,10 @@ public class CPPASTName extends CPPASTNode implements IASTName { return binding; } + public IBinding[] resolvePrefix() { + return CPPSemantics.prefixLookup(this); + } + protected void setBinding( IBinding binding ){ this.binding = binding; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java index 487f8e8f728..d123b0c25b0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java @@ -37,6 +37,11 @@ public class CPPASTQualifiedName extends CPPASTNode implements return names[names.length - 1].resolveBinding(); } + public IBinding[] resolvePrefix() { + removeNullNames(); + return names[names.length - 1].resolvePrefix(); + } + /* * (non-Javadoc) * diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java index ebda1183e6c..e8f21d2eeae 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateId.java @@ -112,6 +112,11 @@ public class CPPASTTemplateId extends CPPASTNode implements ICPPASTTemplateId { return null; } + public IBinding[] resolvePrefix() { + // TODO Auto-generated method stub + return null; + } + /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IASTName#toCharArray() */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java index 8b5e9a6c499..a6f49150d89 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java @@ -55,7 +55,7 @@ abstract class BaseScanner implements IScanner { protected static final char[] VA_ARGS_CHARARRAY = "__VA_ARGS__".toCharArray(); //$NON-NLS-1$ - protected static final IToken eocToken = new SimpleToken(IToken.tEOC, 0, null, 0); + protected final IToken eocToken = new SimpleToken(IToken.tEOC, 0, null, 0); /** * @author jcamelon @@ -1517,9 +1517,6 @@ abstract class BaseScanner implements IScanner { if (finished) { if (contentAssistMode) { - if (lastToken == eocToken) - throwEOF(); - lastToken = nextToken; nextToken = eocToken; return lastToken; @@ -1554,6 +1551,7 @@ abstract class BaseScanner implements IScanner { if (!exception) finished = true; } else if (nextToken.getType() == IToken.tCOMPLETION) { + lastToken.setNext(nextToken); finished = true; } else if (nextToken.getType() == IToken.tPOUNDPOUND) { // time for a pasting diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java index 09648818d8e..fc453676ef4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java @@ -584,6 +584,11 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog { return null; } + public IBinding[] resolvePrefix() { + // TODO Auto-generated method stub + return null; + } + /* * (non-Javadoc) * diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/SimpleToken.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/SimpleToken.java index 79de2765d6e..a5400cae6bc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/SimpleToken.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/SimpleToken.java @@ -299,7 +299,8 @@ public class SimpleToken extends AbstractToken implements IToken { return "#"; //$NON-NLS-1$ case IScanner.tPOUNDPOUND: return "##"; //$NON-NLS-1$ - + case IToken.tEOC: + return "EOC"; //$NON-NLS-1$ default : // we should never get here! // assert false : getType(); diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProcessor2.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProcessor2.java index 80fde41e825..35791f4ffe8 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProcessor2.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProcessor2.java @@ -22,7 +22,7 @@ import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; -import org.eclipse.cdt.core.dom.ast.IProblemBinding; +import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; @@ -88,12 +88,10 @@ public class CCompletionProcessor2 implements IContentAssistProcessor { IASTName[] names = completionNode.getNames(); for (int i = 0; i < names.length; ++i) { - IBinding binding = names[i].resolveBinding(); - - if (binding != null && !(binding instanceof IProblemBinding)) { - proposals.add(createBindingCompletionProposal(binding, repOffset, repLength)); - proposals.add(createBindingCompletionProposal(binding, repOffset, repLength)); - } + IBinding [] bindings = names[i].resolvePrefix(); + if (bindings != null) + for (int j = 0; j < bindings.length; ++j) + proposals.add(createBindingCompletionProposal(bindings[j], repOffset, repLength)); } } @@ -170,6 +168,8 @@ public class CCompletionProcessor2 implements IContentAssistProcessor { imageDescriptor = CElementImageProvider.getStructImageDescriptor(); else if (((ICompositeType)binding).getKey() == ICompositeType.k_union) imageDescriptor = CElementImageProvider.getUnionImageDescriptor(); + } else if (binding instanceof IFunction) { + imageDescriptor = CElementImageProvider.getFunctionImageDescriptor(); } else if (binding instanceof IVariable) { imageDescriptor = CElementImageProvider.getVariableImageDescriptor(); }