From 993b0299f44ba1493fe89d69a25e6c1382bff5f2 Mon Sep 17 00:00:00 2001 From: Andrew Niefer Date: Mon, 12 Jul 2004 18:03:48 +0000 Subject: [PATCH] bug 69833 - Use hashmaps during completion parse and then just sort the prefix lookup results at the end --- .../core/parser/pst/ContainerSymbol.java | 15 +----- .../core/parser/pst/ParameterizedSymbol.java | 14 +----- .../core/parser/pst/ParserSymbolTable.java | 50 ++++++++++--------- 3 files changed, 30 insertions(+), 49 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java index b93669094ca..b2fed035e38 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ContainerSymbol.java @@ -26,10 +26,8 @@ import java.util.ListIterator; import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; -import java.util.TreeMap; 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; @@ -55,12 +53,7 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { ContainerSymbol copy = (ContainerSymbol)super.clone(); copy._usingDirectives = (_usingDirectives != Collections.EMPTY_LIST) ? (List) ((ArrayList)_usingDirectives).clone() : _usingDirectives; - - if( getSymbolTable().getParserMode() == ParserMode.COMPLETION_PARSE ) - copy._containedSymbols = ( _containedSymbols != Collections.EMPTY_MAP )? (Map)((TreeMap) _containedSymbols).clone() : _containedSymbols; - else - copy._containedSymbols = ( _containedSymbols != Collections.EMPTY_MAP )? (Map)((HashMap) _containedSymbols).clone() : _containedSymbols; - + copy._containedSymbols = ( _containedSymbols != Collections.EMPTY_MAP )? (Map)((HashMap) _containedSymbols).clone() : _containedSymbols; copy._contents = (_contents != Collections.EMPTY_LIST) ? (List) ((ArrayList)_contents).clone() : _contents; return copy; @@ -435,11 +428,7 @@ public class ContainerSymbol extends BasicSymbol implements IContainerSymbol { protected void putInContainedSymbols( String key, Object obj ){ if( _containedSymbols == Collections.EMPTY_MAP ){ - if( getSymbolTable().getParserMode() == ParserMode.COMPLETION_PARSE ){ - _containedSymbols = new TreeMap( new SymbolTableComparator() ); - } else { - _containedSymbols = new HashMap( ); - } + _containedSymbols = new HashMap( ); } _containedSymbols.put( key, obj ); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java index ed42893ab94..ff79cbd5805 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParameterizedSymbol.java @@ -19,9 +19,6 @@ import java.util.HashMap; import java.util.List; import java.util.ListIterator; import java.util.Map; -import java.util.TreeMap; - -import org.eclipse.cdt.core.parser.ParserMode; /** * @author aniefer @@ -43,11 +40,7 @@ public class ParameterizedSymbol extends ContainerSymbol implements IParameteriz ParameterizedSymbol copy = (ParameterizedSymbol)super.clone(); copy._parameterList = ( _parameterList != Collections.EMPTY_LIST ) ? (List) ((ArrayList)_parameterList).clone() : _parameterList; - - if( getSymbolTable().getParserMode() == ParserMode.COMPLETION_PARSE ) - copy._parameterMap = ( _parameterMap != Collections.EMPTY_MAP ) ? (Map) ((TreeMap) _parameterMap).clone() : _parameterMap; - else - copy._parameterMap = ( _parameterMap != Collections.EMPTY_MAP ) ? (Map) ((HashMap) _parameterMap).clone() : _parameterMap; + copy._parameterMap = ( _parameterMap != Collections.EMPTY_MAP ) ? (Map) ((HashMap) _parameterMap).clone() : _parameterMap; return copy; } @@ -131,10 +124,7 @@ public class ParameterizedSymbol extends ContainerSymbol implements IParameteriz if( name != null && !name.equals(ParserSymbolTable.EMPTY_NAME) ) { if( _parameterMap == Collections.EMPTY_MAP ){ - if( getSymbolTable().getParserMode() == ParserMode.COMPLETION_PARSE ) - _parameterMap = new TreeMap( new SymbolTableComparator() ); - else - _parameterMap = new HashMap( ); + _parameterMap = new HashMap( ); } if( !_parameterMap.containsKey( name ) ) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java index ea757349a41..b272dd5a199 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/pst/ParserSymbolTable.java @@ -23,7 +23,7 @@ import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Set; -import java.util.SortedMap; +import java.util.TreeMap; import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserMode; @@ -326,11 +326,7 @@ public class ParserSymbolTable { Iterator iterator = null; if( data.isPrefixLookup() && declarations != Collections.EMPTY_MAP ){ - if( declarations instanceof SortedMap ){ - iterator = ((SortedMap)declarations).tailMap( data.name.toLowerCase() ).keySet().iterator(); - } else { - throw new ParserSymbolTableError( ParserSymbolTableError.r_InternalError ); - } + iterator = declarations.keySet().iterator(); } String name = ( iterator != null && iterator.hasNext() ) ? (String) iterator.next() : data.name; @@ -342,13 +338,15 @@ public class ParserSymbolTable { obj = collectSymbol( data, obj ); if( obj != null ){ - if( found == null ) - found = new LinkedHashMap(); + if( found == null ){ + if( data.isPrefixLookup() ) + found = new TreeMap( new ContainerSymbol.SymbolTableComparator() ); + else + found = new LinkedHashMap(); + } found.put( name, obj ); } } - } else { - break; } if( iterator != null && iterator.hasNext() ){ @@ -357,6 +355,8 @@ public class ParserSymbolTable { name = null; } } + if( found != null && data.isPrefixLookup() ) + found = new LinkedHashMap( found ); if( found != null && !data.isPrefixLookup() ){ return found; @@ -401,13 +401,17 @@ public class ParserSymbolTable { if( nameMatches( data, symbol.getName() ) ){ obj = collectSymbol( data, symbol ); if( obj != null ){ - if( found == null ) - found = new LinkedHashMap(); + if( found == null ){ + if( data.isPrefixLookup() ) + found = new TreeMap( new ContainerSymbol.SymbolTableComparator() ); + else + found = new LinkedHashMap(); + } found.put( symbol.getName(), obj ); } } } - return found; + return ( found instanceof TreeMap ) ? new LinkedHashMap( found ) : found; } } @@ -415,11 +419,7 @@ public class ParserSymbolTable { if( parameters != Collections.EMPTY_MAP ){ iterator = null; if( data.isPrefixLookup() ){ - if( parameters instanceof SortedMap ){ - iterator = ((SortedMap) parameters).tailMap( data.name.toLowerCase() ).keySet().iterator(); - } else { - throw new ParserSymbolTableError( ParserSymbolTableError.r_InternalError ); - } + iterator = parameters.keySet().iterator(); } name = ( iterator != null && iterator.hasNext() ) ? (String) iterator.next() : data.name; @@ -428,12 +428,14 @@ public class ParserSymbolTable { obj = parameters.get( name ); obj = collectSymbol( data, obj ); if( obj != null ){ - if( found == null ) - found = new LinkedHashMap(); + if( found == null ){ + if( data.isPrefixLookup() ) + found = new TreeMap( new ContainerSymbol.SymbolTableComparator() ); + else + found = new LinkedHashMap(); + } found.put( name, obj ); } - } else { - break; } if( iterator != null && iterator.hasNext() ){ @@ -443,7 +445,7 @@ public class ParserSymbolTable { } } } - return found; + return ( found instanceof TreeMap ) ? new LinkedHashMap( found ) : found; } private static boolean nameMatches( LookupData data, String name ){ @@ -452,7 +454,7 @@ public class ParserSymbolTable { } return name.equals( data.name ); } - private static boolean checkType( LookupData data, ISymbol symbol ) { //, TypeInfo.eType type, TypeInfo.eType upperType ){ + private static boolean checkType( LookupData data, ISymbol symbol ) { if( data.getFilter() == null ){ return true; }