1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-22 06:02:11 +02:00

Use CharArrayObjectMap instead of CharObjectMap to store symbols in

scopes.

Change-Id: Ie2f84135d22ba21829afc0426cf1d83e5d234e7c
This commit is contained in:
Sergey Prigogin 2016-04-13 21:06:58 -07:00
parent 27774c7688
commit ad0d665a19
3 changed files with 110 additions and 25 deletions

View file

@ -12,9 +12,15 @@
package org.eclipse.cdt.core.parser.util; package org.eclipse.cdt.core.parser.util;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.util.AbstractCollection;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.function.Consumer;
/** /**
* @author Doug Schaefer * @author Doug Schaefer
@ -166,6 +172,32 @@ public class CharArrayObjectMap <T> extends CharTable {
return values; return values;
} }
/**
* Returns a {@link Collection} view of the values contained in this map.
* The collection is backed by the map, so changes to the map are reflected
* in the collection, and vice-versa.
*
* @since 6.0
*/
public Collection<T> values() {
return new Values();
}
/**
* Checks if the map values contain the given object.
*
* @since 6.0
*/
public boolean containsValue(Object v) {
int n = size();
for (int i = 0; i < n; i++) {
if (Objects.equals(valueTable[i], v)) {
return true;
}
}
return false;
}
@Override @Override
public String toString() { public String toString() {
StringBuilder buf = new StringBuilder(); StringBuilder buf = new StringBuilder();
@ -183,4 +215,51 @@ public class CharArrayObjectMap <T> extends CharTable {
buf.append('}'); buf.append('}');
return buf.toString(); return buf.toString();
} }
private class Values extends AbstractCollection<T> {
@Override
public final int size() {
return CharArrayObjectMap.this.size();
}
@Override
public final void clear() {
CharArrayObjectMap.this.clear();
}
@Override
public final boolean contains(Object v) {
return containsValue(v);
}
@Override
public final Iterator<T> iterator() {
return new ValueIterator();
}
@Override
@SuppressWarnings("unchecked")
public final void forEach(Consumer<? super T> action) {
for (int i = 0; i < size(); i++) {
action.accept((T) valueTable[i]);
}
}
}
private final class ValueIterator implements Iterator<T> {
int index;
@Override
public boolean hasNext() {
return index < size();
}
@Override
@SuppressWarnings("unchecked")
public T next() {
if (!hasNext())
throw new NoSuchElementException();
return (T) valueTable[index++];
}
}
} }

View file

@ -40,7 +40,7 @@ import org.eclipse.cdt.core.index.IIndexFileSet;
import org.eclipse.cdt.core.index.IIndexName; import org.eclipse.cdt.core.index.IIndexName;
import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.core.parser.Keywords; import org.eclipse.cdt.core.parser.Keywords;
import org.eclipse.cdt.core.parser.util.CharArrayMap; import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassScope;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics;
@ -60,9 +60,9 @@ import org.eclipse.core.runtime.CoreException;
*/ */
class PDOMCPPClassScope implements ICPPClassScope, IIndexScope { class PDOMCPPClassScope implements ICPPClassScope, IIndexScope {
private static final class PopulateMap implements IPDOMVisitor { private static final class PopulateMap implements IPDOMVisitor {
private final CharArrayMap<List<PDOMBinding>> fResult; private final CharArrayObjectMap<List<PDOMBinding>> fResult;
private PopulateMap(CharArrayMap<List<PDOMBinding>> result) { private PopulateMap(CharArrayObjectMap<List<PDOMBinding>> result) {
fResult = result; fResult = result;
} }
@ -88,7 +88,8 @@ class PDOMCPPClassScope implements ICPPClassScope, IIndexScope {
public void leave(IPDOMNode node){} public void leave(IPDOMNode node){}
} }
private static final IndexFilter CONVERSION_FILTER = new DeclaredBindingsFilter(ILinkage.CPP_LINKAGE_ID, true, false) { private static final IndexFilter CONVERSION_FILTER =
new DeclaredBindingsFilter(ILinkage.CPP_LINKAGE_ID, true, false) {
@Override @Override
public boolean acceptBinding(IBinding binding) throws CoreException { public boolean acceptBinding(IBinding binding) throws CoreException {
return binding instanceof ICPPMethod && return binding instanceof ICPPMethod &&
@ -189,7 +190,7 @@ class PDOMCPPClassScope implements ICPPClassScope, IIndexScope {
} }
public static IBinding[] getBindingsViaCache(IPDOMCPPClassType ct, final char[] name, IndexFilter filter) throws CoreException { public static IBinding[] getBindingsViaCache(IPDOMCPPClassType ct, final char[] name, IndexFilter filter) throws CoreException {
CharArrayMap<List<PDOMBinding>> map = getBindingMap(ct); CharArrayObjectMap<List<PDOMBinding>> map = getBindingMap(ct);
List<PDOMBinding> cached= map.get(name); List<PDOMBinding> cached= map.get(name);
if (cached == null) if (cached == null)
return IBinding.EMPTY_BINDING_ARRAY; return IBinding.EMPTY_BINDING_ARRAY;
@ -212,9 +213,10 @@ class PDOMCPPClassScope implements ICPPClassScope, IIndexScope {
/** /**
* Visit bindings via the cache. * Visit bindings via the cache.
*/ */
public static void acceptViaCache(IPDOMCPPClassType ct, IPDOMVisitor visitor, boolean includeNestedInAnonymous) throws CoreException { public static void acceptViaCache(IPDOMCPPClassType ct, IPDOMVisitor visitor,
boolean includeNestedInAnonymous) throws CoreException {
final long record= ct.getRecord(); final long record= ct.getRecord();
CharArrayMap<List<PDOMBinding>> map= getBindingMap(ct); CharArrayObjectMap<List<PDOMBinding>> map= getBindingMap(ct);
for (List<PDOMBinding> list : map.values()) { for (List<PDOMBinding> list : map.values()) {
for (PDOMBinding node : list) { for (PDOMBinding node : list) {
if (includeNestedInAnonymous || node.getParentNodeRec() == record) { if (includeNestedInAnonymous || node.getParentNodeRec() == record) {
@ -232,28 +234,30 @@ class PDOMCPPClassScope implements ICPPClassScope, IIndexScope {
final Long key= ct.getRecord() + PDOMCPPLinkage.CACHE_MEMBERS; final Long key= ct.getRecord() + PDOMCPPLinkage.CACHE_MEMBERS;
final PDOM pdom = ct.getPDOM(); final PDOM pdom = ct.getPDOM();
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Reference<CharArrayMap<List<PDOMBinding>>> cached= (Reference<CharArrayMap<List<PDOMBinding>>>) pdom.getCachedResult(key); Reference<CharArrayObjectMap<List<PDOMBinding>>> cached=
CharArrayMap<List<PDOMBinding>> map= cached == null ? null : cached.get(); (Reference<CharArrayObjectMap<List<PDOMBinding>>>) pdom.getCachedResult(key);
CharArrayObjectMap<List<PDOMBinding>> map= cached == null ? null : cached.get();
if (map != null) { if (map != null) {
new PopulateMap(map).visit(member); new PopulateMap(map).visit(member);
} }
} }
} }
public static CharArrayMap<List<PDOMBinding>> getBindingMap(IPDOMCPPClassType ct) throws CoreException { public static CharArrayObjectMap<List<PDOMBinding>> getBindingMap(IPDOMCPPClassType ct) throws CoreException {
final Long key= ct.getRecord() + PDOMCPPLinkage.CACHE_MEMBERS; final Long key= ct.getRecord() + PDOMCPPLinkage.CACHE_MEMBERS;
final PDOM pdom = ct.getPDOM(); final PDOM pdom = ct.getPDOM();
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Reference<CharArrayMap<List<PDOMBinding>>> cached= (Reference<CharArrayMap<List<PDOMBinding>>>) pdom.getCachedResult(key); Reference<CharArrayObjectMap<List<PDOMBinding>>> cached=
CharArrayMap<List<PDOMBinding>> map= cached == null ? null : cached.get(); (Reference<CharArrayObjectMap<List<PDOMBinding>>>) pdom.getCachedResult(key);
CharArrayObjectMap<List<PDOMBinding>> map= cached == null ? null : cached.get();
if (map == null) { if (map == null) {
// There is no cache, build it: // There is no cache, build it:
map= new CharArrayMap<>(); map= new CharArrayObjectMap<>(8);
IPDOMVisitor visitor= new PopulateMap(map); IPDOMVisitor visitor= new PopulateMap(map);
visitor.visit(ct); visitor.visit(ct);
ct.acceptUncached(visitor); ct.acceptUncached(visitor);
pdom.putCachedResult(key, new SoftReference<CharArrayMap<?>>(map)); pdom.putCachedResult(key, new SoftReference<CharArrayObjectMap<?>>(map));
} }
return map; return map;
} }

View file

@ -29,7 +29,7 @@ import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.index.IIndexFileSet;
import org.eclipse.cdt.core.index.IIndexName; import org.eclipse.cdt.core.index.IIndexName;
import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.core.parser.util.CharArrayMap; import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
import org.eclipse.cdt.core.parser.util.IContentAssistMatcher; import org.eclipse.cdt.core.parser.util.IContentAssistMatcher;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics;
import org.eclipse.cdt.internal.core.index.IIndexScope; import org.eclipse.cdt.internal.core.index.IIndexScope;
@ -66,7 +66,7 @@ class PDOMCPPEnumScope implements ICPPEnumScope, IIndexScope {
@Override @Override
public IBinding getBinding(IASTName name, boolean resolve, IIndexFileSet fileSet) { public IBinding getBinding(IASTName name, boolean resolve, IIndexFileSet fileSet) {
try { try {
CharArrayMap<IPDOMCPPEnumerator> map= getBindingMap(fBinding); CharArrayObjectMap<IPDOMCPPEnumerator> map= getBindingMap(fBinding);
return map.get(name.toCharArray()); return map.get(name.toCharArray());
} catch (CoreException e) { } catch (CoreException e) {
CCorePlugin.log(e); CCorePlugin.log(e);
@ -82,7 +82,7 @@ class PDOMCPPEnumScope implements ICPPEnumScope, IIndexScope {
@Override @Override
public IBinding[] getBindings(ScopeLookupData lookup) { public IBinding[] getBindings(ScopeLookupData lookup) {
try { try {
CharArrayMap<IPDOMCPPEnumerator> map= getBindingMap(fBinding); CharArrayObjectMap<IPDOMCPPEnumerator> map= getBindingMap(fBinding);
if (lookup.isPrefixLookup()) { if (lookup.isPrefixLookup()) {
final List<IBinding> result= new ArrayList<IBinding>(); final List<IBinding> result= new ArrayList<IBinding>();
final char[] nc= lookup.getLookupKey(); final char[] nc= lookup.getLookupKey();
@ -141,22 +141,23 @@ class PDOMCPPEnumScope implements ICPPEnumScope, IIndexScope {
return fBinding.hashCode(); return fBinding.hashCode();
} }
private static CharArrayMap<IPDOMCPPEnumerator> getBindingMap(IPDOMCPPEnumType enumeration) throws CoreException { private static CharArrayObjectMap<IPDOMCPPEnumerator> getBindingMap(IPDOMCPPEnumType enumeration) throws CoreException {
final Long key= enumeration.getRecord() + PDOMCPPLinkage.CACHE_MEMBERS; final Long key= enumeration.getRecord() + PDOMCPPLinkage.CACHE_MEMBERS;
final PDOM pdom = enumeration.getPDOM(); final PDOM pdom = enumeration.getPDOM();
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Reference<CharArrayMap<IPDOMCPPEnumerator>> cached= (Reference<CharArrayMap<IPDOMCPPEnumerator>>) pdom.getCachedResult(key); Reference<CharArrayObjectMap<IPDOMCPPEnumerator>> cached=
CharArrayMap<IPDOMCPPEnumerator> map= cached == null ? null : cached.get(); (Reference<CharArrayObjectMap<IPDOMCPPEnumerator>>) pdom.getCachedResult(key);
CharArrayObjectMap<IPDOMCPPEnumerator> map= cached == null ? null : cached.get();
if (map == null) { if (map == null) {
// there is no cache, build it: // there is no cache, build it:
List<IPDOMCPPEnumerator> enumerators = new ArrayList<>(); List<IPDOMCPPEnumerator> enumerators = new ArrayList<>();
enumeration.loadEnumerators(enumerators); enumeration.loadEnumerators(enumerators);
map = new CharArrayMap<IPDOMCPPEnumerator>(); map = new CharArrayObjectMap<IPDOMCPPEnumerator>(enumerators.size());
for (IPDOMCPPEnumerator enumerator : enumerators) { for (IPDOMCPPEnumerator enumerator : enumerators) {
map.put(enumerator.getNameCharArray(), enumerator); map.put(enumerator.getNameCharArray(), enumerator);
} }
pdom.putCachedResult(key, new SoftReference<CharArrayMap<?>>(map)); pdom.putCachedResult(key, new SoftReference<CharArrayObjectMap<?>>(map));
} }
return map; return map;
} }
@ -165,8 +166,9 @@ class PDOMCPPEnumScope implements ICPPEnumScope, IIndexScope {
final Long key= enumType.getRecord() + PDOMCPPLinkage.CACHE_MEMBERS; final Long key= enumType.getRecord() + PDOMCPPLinkage.CACHE_MEMBERS;
final PDOM pdom = enumType.getPDOM(); final PDOM pdom = enumType.getPDOM();
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Reference<CharArrayMap<IPDOMCPPEnumerator>> cached= (Reference<CharArrayMap<IPDOMCPPEnumerator>>) pdom.getCachedResult(key); Reference<CharArrayObjectMap<IPDOMCPPEnumerator>> cached=
CharArrayMap<IPDOMCPPEnumerator> map= cached == null ? null : cached.get(); (Reference<CharArrayObjectMap<IPDOMCPPEnumerator>>) pdom.getCachedResult(key);
CharArrayObjectMap<IPDOMCPPEnumerator> map= cached == null ? null : cached.get();
if (map != null) { if (map != null) {
map.put(enumItem.getNameCharArray(), enumItem); map.put(enumItem.getNameCharArray(), enumItem);
} }
@ -194,7 +196,7 @@ class PDOMCPPEnumScope implements ICPPEnumScope, IIndexScope {
public static void acceptViaCache(IPDOMCPPEnumType enumType, IPDOMVisitor visitor) { public static void acceptViaCache(IPDOMCPPEnumType enumType, IPDOMVisitor visitor) {
try { try {
CharArrayMap<IPDOMCPPEnumerator> map = getBindingMap(enumType); CharArrayObjectMap<IPDOMCPPEnumerator> map = getBindingMap(enumType);
for (IPDOMCPPEnumerator enumItem : map.values()) { for (IPDOMCPPEnumerator enumItem : map.values()) {
visitor.visit(enumItem); visitor.visit(enumItem);
visitor.leave(enumItem); visitor.leave(enumItem);