mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-22 14:12:10 +02:00
Use CharArrayObjectMap instead of CharObjectMap to store symbols in
scopes. Change-Id: Ie2f84135d22ba21829afc0426cf1d83e5d234e7c
This commit is contained in:
parent
27774c7688
commit
ad0d665a19
3 changed files with 110 additions and 25 deletions
|
@ -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++];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue