Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [cdt-patch] Symbol Table storage changes

This patch replaces the last patch I sent.

For normal lookups in the symbol table, a HashMap is faster than the tree 
map, but for prefix lookups the TreeMap is faster.  So we are now using 
the HashMap for normal parses, and we use the TreeMap in the parse mode 
used by content assist.

Note that with these changes the results returned by the IASTNode.lookup 
function used by content assist are now in predictable order:  they are 
first sorted in the order of the scopes visited during the lookup and then 
they are sorted alphabetically

Core:
        Modified symbol table constructor to take a ParseMode as a 
parameter.
        Modified symbol table to use a TreeMap instead of HashMap when 
ParseMode is CONTEXTUAL_PARSE
        Modified ASTNode.lookup to throw ASTNotImplementedException if 
called when ParseMode is not CONTEXTUAL_PARSE

Core.test:
        Moved testBug48307_FriendFunction_1 & 
testBug48307_FriendFunction_2 to ContextualParseTest
        Updated ContextualParseTest now that the order of prefix lookup 
results is predictable.

Core.UI:
        Updated CompletionEngine to catch ASTNotImplementedException from 
IASTNode.lookup

tested on windows & linux

-Andrew

Index: parser/ChangeLog-parser
===================================================================
retrieving revision 1.17
diff -u -r1.17 ChangeLog-parser
--- parser/ChangeLog-parser	13 Jan 2004 17:07:02 -0000	1.17
+++ parser/ChangeLog-parser	13 Jan 2004 20:41:56 -0000
@@ -1,3 +1,8 @@
+2004-01-13 Andrew Niefer
+	Modified symbol table constructor to take a ParseMode as a parameter.
+	Modified symbol table to use a TreeMap instead of HashMap when ParseMode is CONTEXTUAL_PARSE
+	Modified ASTNode.lookup to throw ASTNotImplementedException if called when ParseMode is not CONTEXTUAL_PARSE
+
 2004-01-12 John Camelon
 	Fixed bug 48909 - Wrong completion node after a . or an ->
 	Fixed bug 49702 - Wrong completion kind sent in const/dest and code blocks
Index: parser/org/eclipse/cdt/core/parser/ParserFactory.java
===================================================================
retrieving revision 1.16
diff -u -r1.16 ParserFactory.java
--- parser/org/eclipse/cdt/core/parser/ParserFactory.java	5 Jan 2004 21:31:04 -0000	1.16
+++ parser/org/eclipse/cdt/core/parser/ParserFactory.java	13 Jan 2004 20:41:56 -0000
@@ -37,7 +37,7 @@
 		if( mode == ParserMode.QUICK_PARSE )
 			return new QuickParseASTFactory(); 
 		else
-			return new CompleteParseASTFactory( language ); 
+			return new CompleteParseASTFactory( language, mode ); 
 	}
 	
     public static IParser createParser( IScanner scanner, ISourceElementRequestor callback, ParserMode mode, ParserLanguage language, IParserLogService log ) throws ParserFactoryException
Index: parser/org/eclipse/cdt/core/parser/ast/IASTNode.java
===================================================================
retrieving revision 1.9
diff -u -r1.9 IASTNode.java
--- parser/org/eclipse/cdt/core/parser/ast/IASTNode.java	13 Jan 2004 17:07:02 -0000	1.9
+++ parser/org/eclipse/cdt/core/parser/ast/IASTNode.java	13 Jan 2004 20:41:57 -0000
@@ -67,6 +67,6 @@
 	 * @return
 	 * @throws LookupException
 	 */
-	public LookupResult lookup( String prefix, LookupKind[] kind, IASTNode context) throws LookupException;
+	public LookupResult lookup( String prefix, LookupKind[] kind, IASTNode context) throws LookupException, ASTNotImplementedException;
 }
 
Index: parser/org/eclipse/cdt/internal/core/parser/ContextualParser.java
===================================================================
retrieving revision 1.3
diff -u -r1.3 ContextualParser.java
--- parser/org/eclipse/cdt/internal/core/parser/ContextualParser.java	13 Jan 2004 17:07:02 -0000	1.3
+++ parser/org/eclipse/cdt/internal/core/parser/ContextualParser.java	13 Jan 2004 20:41:57 -0000
@@ -52,7 +52,7 @@
 	 */
 	public ContextualParser(IScanner scanner, ISourceElementRequestor callback, ParserLanguage language, IParserLogService log) {
 		super(scanner, callback, language, log);
-		astFactory = ParserFactory.createASTFactory( ParserMode.COMPLETE_PARSE, language);
+		astFactory = ParserFactory.createASTFactory( ParserMode.CONTEXTUAL_PARSE, language);
 		scanner.setASTFactory(astFactory);
 	}
 	
Index: parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTNode.java
===================================================================
retrieving revision 1.4
diff -u -r1.4 ASTNode.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTNode.java	7 Jan 2004 02:00:17 -0000	1.4
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/ASTNode.java	13 Jan 2004 20:42:00 -0000
@@ -14,6 +14,8 @@
 import java.util.List;
 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.internal.core.parser.pst.IContainerSymbol;
 import org.eclipse.cdt.internal.core.parser.pst.ISymbol;
@@ -31,13 +33,17 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.core.parser.ast.IASTNode#lookup(java.lang.String, org.eclipse.cdt.core.parser.ast.IASTNode.LookupKind, org.eclipse.cdt.core.parser.ast.IASTNode)
 	 */
-	public LookupResult lookup(String prefix, LookupKind[] kind, IASTNode context) throws LookupException {
+	public LookupResult lookup(String prefix, LookupKind[] kind, IASTNode context) throws LookupException, ASTNotImplementedException {
 		if( ! ( this instanceof ISymbolOwner ) || ( context != null && !(context instanceof ISymbolOwner) ) ){
 			return null;
 		}
 		
 		IContainerSymbol thisContainer = (IContainerSymbol) ((ISymbolOwner)this).getSymbol();
 		IContainerSymbol qualification = null;
+		
+		if( thisContainer.getSymbolTable().getParserMode() != ParserMode.CONTEXTUAL_PARSE ){
+			throw new ASTNotImplementedException();
+		}
 		
 		if( context != null ){
 			ISymbol sym = (IContainerSymbol) ((ISymbolOwner)context).getSymbol();
Index: parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java
===================================================================
retrieving revision 1.64
diff -u -r1.64 CompleteParseASTFactory.java
--- parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java	9 Jan 2004 16:59:25 -0000	1.64
+++ parser/org/eclipse/cdt/internal/core/parser/ast/complete/CompleteParseASTFactory.java	13 Jan 2004 20:42:01 -0000
@@ -20,6 +20,7 @@
 import org.eclipse.cdt.core.parser.IToken;
 import org.eclipse.cdt.core.parser.ITokenDuple;
 import org.eclipse.cdt.core.parser.ParserLanguage;
+import org.eclipse.cdt.core.parser.ParserMode;
 import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
 import org.eclipse.cdt.core.parser.ast.ASTClassKind;
 import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
@@ -115,11 +116,11 @@
 		}
     }
     
-    public CompleteParseASTFactory( ParserLanguage language )
+    public CompleteParseASTFactory( ParserLanguage language, ParserMode mode )
     {
         super();
         
-		pst = new ParserSymbolTable( language );
+		pst = new ParserSymbolTable( language, mode );
     }
 
 	/*
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java
===================================================================
retrieving revision 1.6
diff -u -r1.6 ContainerSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java	7 Jan 2004 02:00:17 -0000	1.6
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java	13 Jan 2004 20:42:02 -0000
@@ -14,6 +14,7 @@
  
 package org.eclipse.cdt.internal.core.parser.pst;
 
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -21,7 +22,9 @@
 import java.util.List;
 import java.util.ListIterator;
 import java.util.Map;
+import java.util.TreeMap;
 
+import org.eclipse.cdt.core.parser.ParserMode;
 import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
 import org.eclipse.cdt.core.parser.ast.IASTMember;
 import org.eclipse.cdt.core.parser.ast.IASTNode;
@@ -51,9 +54,13 @@
 	public Object clone(){
 		ContainerSymbol copy = (ContainerSymbol)super.clone();
 			
-		copy._usingDirectives  = ( _usingDirectives != null ) ? (LinkedList) _usingDirectives.clone() : null; 
-		copy._containedSymbols = ( _containedSymbols != null )? (HashMap) _containedSymbols.clone() : null;
-
+		copy._usingDirectives  = ( _usingDirectives != null ) ? (LinkedList) _usingDirectives.clone() : null;
+		
+		if( getSymbolTable().getParserMode() == ParserMode.CONTEXTUAL_PARSE )
+			copy._containedSymbols = ( _containedSymbols != null )? (Map)((TreeMap) _containedSymbols).clone() : null;
+		else 
+			copy._containedSymbols = ( _containedSymbols != null )? (Map)((HashMap) _containedSymbols).clone() : null;
+			
 		return copy;	
 	}
 	
@@ -118,7 +125,6 @@
 					origList.add( origDecl );
 					origList.add( obj );
 			
-					declarations.remove( origDecl );
 					declarations.put( obj.getName(), origList );
 				} else	{
 					origList.add( obj );
@@ -264,7 +270,12 @@
 	 */
 	public Map getContainedSymbols(){
 		if( _containedSymbols == null ){
-			_containedSymbols = new HashMap();
+			if( getSymbolTable().getParserMode() == ParserMode.CONTEXTUAL_PARSE ){
+				_containedSymbols = new TreeMap( new SymbolTableComparator() );
+			} else {
+				_containedSymbols = new HashMap( );
+			}
+			
 		}
 		return _containedSymbols;
 	}
@@ -760,7 +771,6 @@
 					}
 				}
 				if( list.size() == 1 ){
-					_context.getContainedSymbols().remove( _symbol.getName() );
 					_context.getContainedSymbols().put( _symbol.getName(), list.getFirst() );
 				}
 			} else if( obj instanceof BasicSymbol ){
@@ -786,8 +796,22 @@
 		private IContainerSymbol _decl;
 		private IContainerSymbol _namespace;
 	}
-
+	
+	static protected class SymbolTableComparator implements Comparator{
+		public int compare( Object o1, Object o2 ){
+			int result = ((String) o1).compareToIgnoreCase( (String) o2 );
+			if( result == 0 ){
+				return ((String) o1).compareTo( (String) o2 );
+			}
+			return result;
+		}
+		
+		public boolean equals( Object obj ){
+			return ( obj instanceof SymbolTableComparator );
+		}
+	}
+	
 	private		LinkedList	_usingDirectives;		//collection of nominated namespaces
-	private		HashMap 	_containedSymbols;		//declarations contained by us.
+	private		Map 		_containedSymbols;		//declarations contained by us.
 
 }
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java
===================================================================
retrieving revision 1.2
diff -u -r1.2 ParameterizedSymbol.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java	9 Jan 2004 16:59:25 -0000	1.2
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java	13 Jan 2004 20:42:03 -0000
@@ -18,7 +18,9 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.TreeMap;
 
+import org.eclipse.cdt.core.parser.ParserMode;
 import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable.Command;
 
 /**
@@ -45,8 +47,12 @@
 		ParameterizedSymbol copy = (ParameterizedSymbol)super.clone();
 			
 		copy._parameterList = ( _parameterList != null ) ? (LinkedList) _parameterList.clone() : null;
-		copy._parameterMap	= ( _parameterMap  != null ) ? (HashMap) _parameterMap.clone() : null;
 		
+		if( getSymbolTable().getParserMode() == ParserMode.CONTEXTUAL_PARSE )
+			copy._parameterMap	= ( _parameterMap  != null ) ? (Map) ((TreeMap) _parameterMap).clone() : null;
+		else 
+			copy._parameterMap	= ( _parameterMap  != null ) ? (Map) ((HashMap) _parameterMap).clone() : null;
+			
 		copy._argumentList	  = ( _argumentList != null ) ? (LinkedList) _argumentList.clone() : null;
 		copy._specializations = ( _specializations != null ) ? (LinkedList) _specializations.clone() : null;
 		
@@ -142,7 +148,10 @@
 	 */
 	public Map getParameterMap(){
 		if( _parameterMap == null ){
-			_parameterMap = new HashMap();
+			if( getSymbolTable().getParserMode() == ParserMode.CONTEXTUAL_PARSE )
+				_parameterMap = new TreeMap( new SymbolTableComparator() );
+			else 
+				_parameterMap = new HashMap( );
 		}
 		return _parameterMap;
 	}
@@ -282,7 +291,7 @@
 	}
 	
 	private 	LinkedList	_parameterList;			//have my cake
-	private 	HashMap		_parameterMap;			//and eat it too
+	private 	Map			_parameterMap;			//and eat it too
 	private		LinkedList	_specializations;		//template specializations
 	private		LinkedList	_argumentList;			//template specialization arguments
 	private 	ISymbol		_returnType;
Index: parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java
===================================================================
retrieving revision 1.33
diff -u -r1.33 ParserSymbolTable.java
--- parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java	9 Jan 2004 16:59:25 -0000	1.33
+++ parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java	13 Jan 2004 20:42:04 -0000
@@ -22,9 +22,11 @@
 import java.util.ListIterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.SortedMap;
 
 import org.eclipse.cdt.core.parser.Enum;
 import org.eclipse.cdt.core.parser.ParserLanguage;
+import org.eclipse.cdt.core.parser.ParserMode;
 import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
 import org.eclipse.cdt.core.parser.ast.IASTMember;
 import org.eclipse.cdt.core.parser.ast.IASTNode;
@@ -43,10 +45,11 @@
 	/**
 	 * Constructor for ParserSymbolTable.
 	 */
-	public ParserSymbolTable( ParserLanguage language ) {
+	public ParserSymbolTable( ParserLanguage language, ParserMode mode ) {
 		super();
 		_compilationUnit = newContainerSymbol( EMPTY_NAME, TypeInfo.t_namespace );
 		_language = language;
+		_mode = mode;
 	}
 
 	public IContainerSymbol getCompilationUnit(){
@@ -304,7 +307,15 @@
 		
 		Map declarations = lookIn.getContainedSymbols();
 		
-		Iterator iterator = ( data.mode == LookupMode.PREFIX ) ? declarations.keySet().iterator() : null;
+		Iterator iterator = null;
+		if( data.mode == LookupMode.PREFIX ){
+			if( declarations instanceof SortedMap ){
+				iterator = ((SortedMap)declarations).tailMap( data.name.toLowerCase() ).keySet().iterator();
+			} else {
+				throw new ParserSymbolTableException( ParserSymbolTableException.r_InternalError );
+			}
+		}
+		
 		String name = ( iterator != null && iterator.hasNext() ) ? (String) iterator.next() : data.name;
 		
 		while( name != null ) {
@@ -315,6 +326,8 @@
 				
 				if( obj != null )
 					found.put( name, obj );
+			} else {
+				break;
 			}
 						
 			if( iterator != null && iterator.hasNext() ){
@@ -331,7 +344,14 @@
 		if( lookIn instanceof IParameterizedSymbol ){
 			Map parameters = ((IParameterizedSymbol)lookIn).getParameterMap();
 			if( parameters != null ){
-				iterator = ( data.mode == LookupMode.PREFIX ) ? parameters.keySet().iterator() : null;
+				iterator = null;
+				if( data.mode == LookupMode.PREFIX ){
+					if( parameters instanceof SortedMap ){
+						iterator = ((SortedMap) parameters).tailMap( data.name.toLowerCase() ).keySet().iterator();
+					} else {
+						throw new ParserSymbolTableException( ParserSymbolTableException.r_InternalError );
+					}
+				}
 				name = ( iterator != null && iterator.hasNext() ) ? (String) iterator.next() : data.name;
 				while( name != null ){
 					if( nameMatches( data, name ) ){
@@ -340,7 +360,10 @@
 						if( obj != null ){
 							found.put( name, obj );
 						}
+					} else {
+						break;
 					}
+					
 					if( iterator != null && iterator.hasNext() ){
 						name = (String) iterator.next();
 					} else {
@@ -2196,7 +2219,8 @@
 
 	//private Stack _contextStack = new Stack();
 	private IContainerSymbol _compilationUnit;
-	private ParserLanguage    _language;
+	private ParserLanguage   _language;
+	private ParserMode		 _mode;
 	private LinkedList undoList = new LinkedList();
 	private HashSet markSet = new HashSet();
 	
@@ -2206,6 +2230,10 @@
 	
 	public ParserLanguage getLanguage(){
 		return _language;
+	}
+	
+	public ParserMode getParserMode(){
+		return _mode;
 	}
 	
 	protected void pushCommand( Command command ){
Index: ChangeLog
===================================================================
retrieving revision 1.164
diff -u -r1.164 ChangeLog
--- ChangeLog	13 Jan 2004 17:06:56 -0000	1.164
+++ ChangeLog	13 Jan 2004 20:42:29 -0000
@@ -1,3 +1,7 @@
+2004-01-13 Andrew Niefer
+	Moved testBug48307_FriendFunction_1 & testBug48307_FriendFunction_2 to ContextualParseTest
+	Updated ContextualParseTest now that the order of prefix lookup results is predictable.
+
 2004-01-13 John Camelon
 	Updated ContextualParseTest to accommodate bugfixes 48909 & 49702.  
 
Index: parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java
===================================================================
retrieving revision 1.47
diff -u -r1.47 CompleteParseASTTest.java
--- parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java	9 Jan 2004 16:59:30 -0000	1.47
+++ parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java	13 Jan 2004 20:42:32 -0000
@@ -32,7 +32,6 @@
 import org.eclipse.cdt.core.parser.ast.IASTLinkageSpecification;
 import org.eclipse.cdt.core.parser.ast.IASTMethod;
 import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition;
-import org.eclipse.cdt.core.parser.ast.IASTNode;
 import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration;
 import org.eclipse.cdt.core.parser.ast.IASTReference;
 import org.eclipse.cdt.core.parser.ast.IASTScope;
@@ -42,7 +41,6 @@
 import org.eclipse.cdt.core.parser.ast.IASTUsingDirective;
 import org.eclipse.cdt.core.parser.ast.IASTVariable;
 import org.eclipse.cdt.core.parser.ast.IASTVariableReference;
-import org.eclipse.cdt.core.parser.ast.IASTNode.LookupResult;
 import org.eclipse.cdt.internal.core.parser.ParserException;
 
 
@@ -1159,49 +1157,5 @@
 		foo = (IASTFunction)i.next();
 		assertTrue( foo.takesVarArgs() );
 		assertAllReferences( 1, createTaskList( new Task( foo ) ) );
-	}
-	
-	public void testBug48307_FriendFunction_1() throws Exception {
-		StringWriter writer = new StringWriter();
-		writer.write( "class A{ public : void foo(); }; " );
-		writer.write( "class B{ ");
-		writer.write( "   private : int aPrivate;" );
-		writer.write( "   friend void A::foo(); ");
-		writer.write( "};" );
-		writer.write( "void A::foo(){}" );
-		
-		Iterator i = parse( writer.toString() ).getDeclarations();
-		
-		IASTClassSpecifier classA = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
-		IASTClassSpecifier classB = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
-		IASTMethod method = (IASTMethod) i.next();
-		
-		LookupResult result = method.lookup( "a", new IASTNode.LookupKind[] { IASTNode.LookupKind.ALL }, classB );
-
-		assertEquals( result.getResultsSize(), 1 );
-		IASTField field = (IASTField) result.getNodes().next();
-		assertEquals( field.getName(), "aPrivate" );
-	}
-
-	public void testBug48307_FriendFunction_2() throws Exception {
-		StringWriter writer = new StringWriter();
-		writer.write( "void global();" );
-		writer.write( "class B{ ");
-		writer.write( "   private : int aPrivate;" );
-		writer.write( "   friend void global(); ");
-		writer.write( "};" );
-		writer.write( "void global(){}" );
-				
-		Iterator i = parse( writer.toString() ).getDeclarations();
-		
-		IASTFunction functionDecl  = (IASTFunction) i.next();
-		IASTClassSpecifier classB = (IASTClassSpecifier)((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
-		IASTFunction functionDef = (IASTFunction) i.next();
-		
-		LookupResult result = functionDef.lookup( "a", new IASTNode.LookupKind[] { IASTNode.LookupKind.ALL }, classB );
-
-		assertEquals( result.getResultsSize(), 1 );
-		IASTField field = (IASTField) result.getNodes().next();
-		assertEquals( field.getName(), "aPrivate" );
 	}
 }
Index: parser/org/eclipse/cdt/core/parser/tests/ContextualParseTest.java
===================================================================
retrieving revision 1.8
diff -u -r1.8 ContextualParseTest.java
--- parser/org/eclipse/cdt/core/parser/tests/ContextualParseTest.java	13 Jan 2004 17:06:56 -0000	1.8
+++ parser/org/eclipse/cdt/core/parser/tests/ContextualParseTest.java	13 Jan 2004 20:42:32 -0000
@@ -150,12 +150,14 @@
 			Iterator iter = result.getNodes();
 			
 			IASTVariable anotherVar = (IASTVariable) iter.next();
+			
+			IASTVariable aVar = (IASTVariable) iter.next();
+			
 			if( i != 0 )
 			{
 				IASTFunction foo = (IASTFunction) iter.next();
 				assertEquals( foo.getName(), "foo");
 			}
-			IASTVariable aVar = (IASTVariable) iter.next();
 					
 			assertFalse( iter.hasNext() );
 			assertEquals( anotherVar.getName(), "anotherVar" );
@@ -198,18 +200,8 @@
 		
 		Iterator iter = result.getNodes();
 		
-		IASTMethod aMethod = null;
-		IASTField aField = null;
-		
-		//we can't currently predict the order in this case
-		for( int i = 1; i <= 2; i++ ){
-			IASTNode astNode = (IASTNode) iter.next();
-			if( astNode instanceof IASTMethod ){
-				aMethod = (IASTMethod) astNode;
-			} else{
-				aField = (IASTField) astNode;
-			}
-		}
+		IASTField aField = (IASTField) iter.next();
+		IASTMethod aMethod = (IASTMethod) iter.next();
 		
 		assertFalse( iter.hasNext() );
 		
@@ -561,5 +553,53 @@
 		
 		LookupResult result = inquestion.lookup( "a", kinds, null );
 		assertEquals(result.getResultsSize(), 3 );
+	}
+	
+	public void testBug48307_FriendFunction_1() throws Exception {
+		StringWriter writer = new StringWriter();
+		writer.write( "class A{ public : void foo(); }; " );
+		writer.write( "class B{ ");
+		writer.write( "   private : int aPrivate;" );
+		writer.write( "   friend void A::foo(); ");
+		writer.write( "};" );
+		writer.write( "void A::foo(){" );
+		writer.write( "   B b;");
+		writer.write( "   b.aP" );
+		
+		String code = writer.toString();
+		int index = code.indexOf( "b.aP" );
+		IASTCompletionNode node = parse( code, index + 4  );
+		
+		LookupResult result = node.getCompletionScope().lookup( node.getCompletionPrefix(), 
+				new IASTNode.LookupKind[] { IASTNode.LookupKind.ALL }, 
+				node.getCompletionContext() );
+
+		assertEquals( result.getResultsSize(), 1 );
+		IASTField field = (IASTField) result.getNodes().next();
+		assertEquals( field.getName(), "aPrivate" );
+	}
+
+	public void testBug48307_FriendFunction_2() throws Exception {
+		StringWriter writer = new StringWriter();
+		writer.write( "void global();" );
+		writer.write( "class B{ ");
+		writer.write( "   private : int aPrivate;" );
+		writer.write( "   friend void global(); ");
+		writer.write( "};" );
+		writer.write( "void global(){" );
+		writer.write( "   B b;");
+		writer.write( "   b.aP" );
+		
+		String code = writer.toString();
+		int index = code.indexOf( "b.aP" );
+		IASTCompletionNode node = parse( code, index + 4  );
+		
+		LookupResult result = node.getCompletionScope().lookup( node.getCompletionPrefix(), 
+				new IASTNode.LookupKind[] { IASTNode.LookupKind.ALL }, 
+				node.getCompletionContext() );
+
+		assertEquals( result.getResultsSize(), 1 );
+		IASTField field = (IASTField) result.getNodes().next();
+		assertEquals( field.getName(), "aPrivate" );
 	}
 }
Index: parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java
===================================================================
retrieving revision 1.29
diff -u -r1.29 ParserSymbolTableTest.java
--- parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java	9 Jan 2004 16:59:30 -0000	1.29
+++ parser/org/eclipse/cdt/core/parser/tests/ParserSymbolTableTest.java	13 Jan 2004 20:42:33 -0000
@@ -20,6 +20,7 @@
 import junit.framework.TestCase;
 
 import org.eclipse.cdt.core.parser.ParserLanguage;
+import org.eclipse.cdt.core.parser.ParserMode;
 import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
 import org.eclipse.cdt.core.parser.ast.ASTClassKind;
 import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier;
@@ -66,11 +67,11 @@
 	}
 	
 	public ParserSymbolTable newTable(){
-		return newTable( ParserLanguage.CPP );
+		return newTable( ParserLanguage.CPP, ParserMode.COMPLETE_PARSE );
 	}
 	
-	public ParserSymbolTable newTable( ParserLanguage language ){
-		table = new ParserSymbolTable( language );
+	public ParserSymbolTable newTable( ParserLanguage language, ParserMode mode ){
+		table = new ParserSymbolTable( language, mode );
 		return table;
 	}
 	/**
@@ -3011,7 +3012,7 @@
 	 * }
 	 */
 	public void testPrefixLookup_Unqualified() throws Exception {
-		newTable();
+		newTable( ParserLanguage.CPP, ParserMode.CONTEXTUAL_PARSE );
 		
 		ISymbol aVar = table.newSymbol( "aVar", TypeInfo.t_int );
 		table.getCompilationUnit().addSymbol( aVar );
@@ -3042,7 +3043,7 @@
 	 * d.a(CTRL+SPACE)
 	 */
 	public void testPrefixLookup_Qualified() throws Exception {
-		newTable();
+		newTable( ParserLanguage.CPP, ParserMode.CONTEXTUAL_PARSE );
 		
 		ISymbol aVar = table.newSymbol( "aVar", TypeInfo.t_int );
 		table.getCompilationUnit().addSymbol( aVar );
@@ -3082,7 +3083,7 @@
 	 * @throws Exception
 	 */
 	public void testPrefixLookup_Inheritance() throws Exception {
-		newTable();
+		newTable( ParserLanguage.CPP, ParserMode.CONTEXTUAL_PARSE );
 		
 		IDerivableContainerSymbol A = table.newDerivableContainerSymbol( "A", TypeInfo.t_class );
 		table.getCompilationUnit().addSymbol( A );
@@ -3143,7 +3144,7 @@
 	 * @throws Exception
 	 */
 	public void testPrefixLookup_Ambiguities() throws Exception{
-		newTable();
+		newTable( ParserLanguage.CPP, ParserMode.CONTEXTUAL_PARSE );
 		
 		ISymbol aa = table.newSymbol( "aa", TypeInfo.t_int );
 		table.getCompilationUnit().addSymbol( aa );
@@ -3288,7 +3289,7 @@
 	 * @throws Exception
 	 */
 	public void testPrefixFiltering() throws Exception{
-		newTable();
+		newTable( ParserLanguage.CPP, ParserMode.CONTEXTUAL_PARSE );
 		IDerivableContainerSymbol a1 = table.newDerivableContainerSymbol( "a1", TypeInfo.t_struct );
 		table.getCompilationUnit().addSymbol( a1 );
 		
Index: ChangeLog
===================================================================
retrieving revision 1.240
diff -u -r1.240 ChangeLog
--- ChangeLog	13 Jan 2004 17:47:07 -0000	1.240
+++ ChangeLog	13 Jan 2004 20:42:58 -0000
@@ -1,3 +1,6 @@
+2004-01-13 Andrew Niefer
+	Updated CompletionEngine to catch ASTNotImplementedException from IASTNode.lookup
+
 2004-01-13 John Camelon
 	Updated CompletionEngine to handle IASTCompletionKind.CompletionKind.STATEMENT_START
 
Index: src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionEngine.java
===================================================================
retrieving revision 1.11
diff -u -r1.11 CompletionEngine.java
--- src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionEngine.java	13 Jan 2004 17:06:52 -0000	1.11
+++ src/org/eclipse/cdt/internal/ui/text/contentassist/CompletionEngine.java	13 Jan 2004 20:43:03 -0000
@@ -31,6 +31,7 @@
 import org.eclipse.cdt.core.parser.ParserUtil;
 import org.eclipse.cdt.core.parser.ScannerInfo;
 import org.eclipse.cdt.core.parser.ast.ASTClassKind;
+import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
 import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier;
 import org.eclipse.cdt.core.parser.ast.IASTCodeScope;
 import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit;
@@ -393,6 +394,9 @@
 		} catch (IASTNode.LookupException ilk ){
 			// do we want to do something here?
 			ilk.printStackTrace();
+			return null;
+		} catch (ASTNotImplementedException e) {
+			//shouldn't happen since we do a contextual parse
 			return null;
 		}
 	}

Back to the top