diff --git a/core/org.eclipse.cdt.core/parser/ChangeLog-parser b/core/org.eclipse.cdt.core/parser/ChangeLog-parser index 939e1c0d504..49a27b73023 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-16 Andrew Niefer + refactor ASTNode.lookup, partially addressing bug 50807 + 2004-04-15 David Daoust Modified Scanner Performance by 1. Moved ScannerContext sentinal to ContextStack diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTMethod.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTMethod.java index 296b15a5924..3009e07d548 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTMethod.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTMethod.java @@ -23,7 +23,13 @@ import org.eclipse.cdt.core.parser.ast.IASTMethod; import org.eclipse.cdt.core.parser.ast.IASTTemplate; import org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration; import org.eclipse.cdt.internal.core.parser.ast.EmptyIterator; +import org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol; import org.eclipse.cdt.internal.core.parser.pst.IParameterizedSymbol; +import org.eclipse.cdt.internal.core.parser.pst.ISymbol; +import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable; +import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTableError; +import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTableException; +import org.eclipse.cdt.internal.core.parser.pst.TypeFilter; import org.eclipse.cdt.internal.core.parser.pst.TypeInfo; /** @@ -206,4 +212,34 @@ public class ASTMethod extends ASTFunction implements IASTMethod return (IASTClassSpecifier) getOwnerScope(); } + + /** + * @param prefix + * @param thisContainer + * @param qualification + * @param lookInThis + * @param filter + * @param lookupResults + * @return + * @throws LookupError + */ + protected List performPrefixLookup(String prefix, IContainerSymbol thisContainer, IContainerSymbol qualification, TypeFilter filter) throws LookupError { + if( filter.isLookingInThis() ){ + try{ + ISymbol thisPointer = thisContainer.lookup( ParserSymbolTable.THIS ); + ISymbol thisClass = ( thisPointer != null ) ? thisPointer.getTypeSymbol() : null; + if( thisClass != null && thisClass instanceof IContainerSymbol ){ + return ((IContainerSymbol) thisClass).prefixLookup( filter, prefix, true ); + } + } catch (ParserSymbolTableException e) { + throw new LookupError(); + } catch (ParserSymbolTableError e ){ + throw new LookupError(); + } + } else { + return super.performPrefixLookup( prefix, thisContainer, qualification, filter ); + } + + return null; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTNode.java index 81e5c2904ce..ba70b8fa3ba 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTNode.java @@ -17,6 +17,7 @@ import java.util.ListIterator; import org.eclipse.cdt.core.parser.ParserMode; import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException; import org.eclipse.cdt.core.parser.ast.IASTNode; +import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.parser.ast.IASTTypedefDeclaration; import org.eclipse.cdt.core.parser.ast.IASTVariable; import org.eclipse.cdt.internal.core.parser.ast.SymbolIterator; @@ -24,7 +25,6 @@ import org.eclipse.cdt.internal.core.parser.pst.IContainerSymbol; import org.eclipse.cdt.internal.core.parser.pst.IExtensibleSymbol; import org.eclipse.cdt.internal.core.parser.pst.ISymbol; import org.eclipse.cdt.internal.core.parser.pst.ISymbolOwner; -import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable; import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTableError; import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTableException; import org.eclipse.cdt.internal.core.parser.pst.TypeFilter; @@ -44,52 +44,23 @@ public class ASTNode implements IASTNode { return null; } - IContainerSymbol thisContainer = (IContainerSymbol) ((ISymbolOwner)this).getSymbol(); - IContainerSymbol qualification = null; + IExtensibleSymbol symbol = ((ISymbolOwner)this).getSymbol(); + if( symbol == null || !(symbol instanceof IContainerSymbol) ){ + throw new LookupError(); + } + IContainerSymbol thisContainer = (IContainerSymbol) symbol; + IContainerSymbol qualification = getQualificationSymbol(context); if( thisContainer.getSymbolTable().getParserMode() != ParserMode.COMPLETION_PARSE ){ throw new ASTNotImplementedException(); } - if( context != null ){ - ISymbol sym = null; - if( context instanceof IASTTypedefDeclaration ){ - ISymbol typedef = ((ISymbolOwner)context).getSymbol(); - TypeInfo info = null; - try{ - info = typedef.getTypeInfo().getFinalType(); - } catch( ParserSymbolTableError e ){ - throw new LookupError(); - } - sym = info.getTypeSymbol(); - } else if ( context instanceof IASTVariable ){ - sym = ((ISymbolOwner)context).getSymbol().getTypeSymbol(); // good enough for now - } - else - { - sym = (IContainerSymbol) ((ISymbolOwner)context).getSymbol(); - } - - if( sym == null || !(sym instanceof IContainerSymbol) ){ - throw new LookupError(); - } - qualification = (IContainerSymbol) sym; - } - - ISymbolOwner owner = (ISymbolOwner) this; - IExtensibleSymbol symbol = owner.getSymbol(); - if( symbol == null || !(symbol instanceof IContainerSymbol) ){ - throw new LookupError(); - } - - boolean lookInThis = false; - TypeFilter filter = new TypeFilter(); if( kind != null ){ for( int i = 0; i < kind.length; i++ ){ filter.addAcceptedType( kind[i] ); if( kind[i] == LookupKind.THIS ){ - lookInThis = true; + filter.setLookingInThis( true ); if( kind.length == 1 ){ filter.addAcceptedType( LookupKind.ALL ); } @@ -101,24 +72,7 @@ public class ASTNode implements IASTNode { filter.addAcceptedType( LookupKind.ALL ); } - List lookupResults = null; - try { - if( lookInThis ){ - ISymbol thisPointer = thisContainer.lookup( ParserSymbolTable.THIS ); - ISymbol thisClass = ( thisPointer != null ) ? thisPointer.getTypeSymbol() : null; - if( thisClass != null && thisClass instanceof IContainerSymbol ){ - lookupResults = ((IContainerSymbol) thisClass).prefixLookup( filter, prefix, true ); - } - } else if( qualification != null ){ - lookupResults = qualification.prefixLookup( filter, prefix, true ); - } else { - lookupResults = thisContainer.prefixLookup( filter, prefix, false ); - } - } catch (ParserSymbolTableException e) { - throw new LookupError(); - } catch (ParserSymbolTableError e ){ - throw new LookupError(); - } + List lookupResults = performPrefixLookup(prefix, thisContainer, qualification, filter); if(lookupResults == null) return null; @@ -140,6 +94,67 @@ public class ASTNode implements IASTNode { return new Result( prefix, iterator, lookupResults.size() ); } + /** + * @param prefix + * @param thisContainer + * @param qualification + * @param lookInThis + * @param filter + * @param lookupResults + * @return + * @throws LookupError + */ + protected List performPrefixLookup(String prefix, IContainerSymbol thisContainer, IContainerSymbol qualification, TypeFilter filter) throws LookupError { + List results = null; + try { + if( qualification != null ){ + results = qualification.prefixLookup( filter, prefix, true ); + } else { + results = thisContainer.prefixLookup( filter, prefix, false ); + } + } catch (ParserSymbolTableException e) { + throw new LookupError(); + } catch (ParserSymbolTableError e ){ + throw new LookupError(); + } + return results; + } + + /** + * @param context + * @param qualification + * @return + * @throws LookupError + */ + protected IContainerSymbol getQualificationSymbol(IASTNode context) throws LookupError { + if( context == null ) + return null; + + ISymbol sym = null; + if( context instanceof IASTTypedefDeclaration || + context instanceof IASTVariable || + context instanceof IASTParameterDeclaration ) + { + sym = ((ISymbolOwner)context).getSymbol(); + TypeInfo info = null; + try{ + info = sym.getTypeInfo().getFinalType(); + } catch( ParserSymbolTableError e ){ + throw new LookupError(); + } + sym = info.getTypeSymbol(); + } + else + { + sym = (IContainerSymbol) ((ISymbolOwner)context).getSymbol(); + } + + if( sym == null || !(sym instanceof IContainerSymbol) ){ + throw new LookupError(); + } + return (IContainerSymbol) sym; + } + private class Result implements ILookupResult{ private String prefix; private Iterator iterator; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeFilter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeFilter.java index cf35a58b50b..74e87e8d01f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeFilter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/TypeFilter.java @@ -123,7 +123,15 @@ public class TypeFilter { } + public void setLookingInThis( boolean inThis ){ + lookingInThis = inThis; + } + public boolean isLookingInThis(){ + return lookingInThis; + } private Set acceptedTypes = new HashSet(); private Set acceptedKinds = new HashSet(); + + private boolean lookingInThis = false; } \ No newline at end of file diff --git a/core/org.eclipse.cdt.ui/ChangeLog b/core/org.eclipse.cdt.ui/ChangeLog index 33b44336847..500ebe90483 100644 --- a/core/org.eclipse.cdt.ui/ChangeLog +++ b/core/org.eclipse.cdt.ui/ChangeLog @@ -1,3 +1,6 @@ +2004-04-16 Andrew Niefer + modify CompletionEngine.completionOnFunctionReference for bug 50807 + 2004-04-16 Hoda Amer Fix for bug#44370 : [Content Assist] function-style macros have arguments diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionEngine.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionEngine.java index 552e4113d9b..298c81b33c1 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionEngine.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionEngine.java @@ -628,10 +628,16 @@ public class CompletionEngine implements RelevanceConstants { // and examples. If my assumptions are not correct as to what deserves to be // looked up for FUNCTION_REFRENCE then please update the documentation in // IASTCompletionNode.java. - - IASTNode.LookupKind[] kinds = new IASTNode.LookupKind[1]; - kinds[0] = IASTNode.LookupKind.ALL; String prefix = completionNode.getCompletionPrefix(); + + IASTNode.LookupKind[] kinds = null; + if( prefix.length() == 0 ) + { + kinds = new IASTNode.LookupKind[] { IASTNode.LookupKind.CONSTRUCTORS, IASTNode.LookupKind.FUNCTIONS, IASTNode.LookupKind.METHODS }; + prefix = completionNode.getFunctionName(); + } + else + kinds = new IASTNode.LookupKind[] { IASTNode.LookupKind.ALL }; ILookupResult result = lookup(completionNode.getCompletionScope(), prefix, kinds, completionNode.getCompletionContext()); addToCompletions(result);