diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/CharArrayUtils.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/CharArrayUtils.java index 6307942c555..df708bc8690 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/CharArrayUtils.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/CharArrayUtils.java @@ -23,6 +23,8 @@ public class CharArrayUtils { /** @since 5.4 */ public static final char[] EMPTY_CHAR_ARRAY = {}; public static final char[] EMPTY = EMPTY_CHAR_ARRAY; + /** @since 5.7 */ + public static final char[][] EMPTY_ARRAY_OF_CHAR_ARRAYS = {}; private CharArrayUtils() {} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/CharTable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/CharTable.java index 8bdba868d2d..bf03dc96b7d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/CharTable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/CharTable.java @@ -169,16 +169,28 @@ public class CharTable extends HashTable { return i; // Follow the next chain - for (i = nextTable[i] - 1; i >= 0 && nextTable[i] != i + 1; i = nextTable[i] - 1) + for (i = nextTable[i] - 1; i >= 0 && nextTable[i] != i + 1; i = nextTable[i] - 1) { if (CharArrayUtils.equals(buffer, start, len, keyTable[i])) return i; + } return -1; } - public Object[] keyArray() { - Object[] keys = new Object[size()]; + /** + * @since 5.7 + */ + public char[][] keys() { + char[][] keys = new char[size()][]; System.arraycopy(keyTable, 0, keys, 0, keys.length); return keys; } + + /** + * @deprecated Use {@link #keys()} instead. + */ + @Deprecated + public Object[] keyArray() { + return keys(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java index 716d12195a0..d444b31e9ca 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java @@ -340,9 +340,8 @@ public class CScope implements ICScope, IASTInternalScope { for (CharArrayObjectMap map : mapsToNameOrBinding) { if (lookup.isPrefixLookup()) { IContentAssistMatcher matcher = ContentAssistMatcherFactory.getInstance().createMatcher(c); - Object[] keys = map.keyArray(); - for (Object key2 : keys) { - char[] key = (char[]) key2; + char[][] keys = map.keys(); + for (char[] key : keys) { if (matcher.match(key)) { obj = ArrayUtil.append(obj, map.get(key)); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java index a8057c5af61..e0eff514920 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java @@ -38,6 +38,7 @@ import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.CharArrayObjectMap; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.IContentAssistMatcher; import org.eclipse.cdt.core.parser.util.ObjectSet; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; @@ -94,7 +95,7 @@ abstract public class CPPScope implements ICPPASTInternalScope { return; if (bindings == null) - bindings = new CharArrayObjectMap(1); + bindings = new CharArrayObjectMap<>(1); if (name instanceof ICPPASTQualifiedName && !(physicalNode instanceof ICPPASTCompositeTypeSpecifier) && !(physicalNode instanceof ICPPASTNamespaceDefinition)) { @@ -109,7 +110,7 @@ abstract public class CPPScope implements ICPPASTInternalScope { if (o instanceof ObjectSet) { ((ObjectSet) o).put(name); } else { - ObjectSet temp = new ObjectSet(2); + ObjectSet temp = new ObjectSet<>(2); temp.put(o); temp.put(name); bindings.put(c, temp); @@ -229,11 +230,10 @@ abstract public class CPPScope implements ICPPASTInternalScope { Object obj = null; if (lookup.isPrefixLookup()) { - Object[] keys = bindings != null ? bindings.keyArray() : new Object[0]; - ObjectSet all= new ObjectSet(16); + char[][] keys = bindings != null ? bindings.keys() : CharArrayUtils.EMPTY_ARRAY_OF_CHAR_ARRAYS; + ObjectSet all= new ObjectSet<>(16); IContentAssistMatcher matcher = ContentAssistMatcherFactory.getInstance().createMatcher(c); - for (Object key2 : keys) { - final char[] key = (char[]) key2; + for (char[] key : keys) { if (key != CONSTRUCTOR_KEY && matcher.match(key)) { obj= bindings.get(key); if (obj instanceof ObjectSet) { @@ -335,9 +335,6 @@ abstract public class CPPScope implements ICPPASTInternalScope { } } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) - */ @Override public IBinding[] find(String name) { return CPPSemantics.findBindings(this, name, false); @@ -347,7 +344,7 @@ abstract public class CPPScope implements ICPPASTInternalScope { @SuppressWarnings({ "unchecked" }) public void addBinding(IBinding binding) { if (bindings == null) - bindings = new CharArrayObjectMap(1); + bindings = new CharArrayObjectMap<>(1); char[] c = binding.getNameCharArray(); if (c.length == 0) { return; @@ -357,7 +354,7 @@ abstract public class CPPScope implements ICPPASTInternalScope { if (o instanceof ObjectSet) { ((ObjectSet) o).put(binding); } else { - ObjectSet set = new ObjectSet(2); + ObjectSet set = new ObjectSet<>(2); set.put(o); set.put(binding); bindings.put(c, set); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/SignificantMacros.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/SignificantMacros.java index 909b930f61b..a35ca724a9b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/SignificantMacros.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/SignificantMacros.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2011 Google, Inc and others. + * Copyright (c) 2011, 2014 Google, Inc and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -22,18 +22,18 @@ import org.eclipse.cdt.core.parser.util.CharArrayUtils; * it back. * * The map is encoded as: - * <number_of_entries>,<key1><value1>...<keyN><valueN>. + * {@code ,...}. *

- * Each string is encoded as: <number_of_characters>,<characters>. - * A null string is encoded as a single comma. + * Each string is encoded as: {@code ,}. + * A {@code null} string is encoded as a single comma. */ public class SignificantMacros implements ISignificantMacros { public static final char[] DEFINED = {0}; public static final char[] UNDEFINED = {1}; - private static final Comparator SORTER = new Comparator() { + private static final Comparator SORTER = new Comparator() { @Override - public int compare(Object o1, Object o2) { - return CharArrayUtils.compare((char[])o1, (char[])o2); + public int compare(char[] s1, char[] s2) { + return CharArrayUtils.compare(s1, s2); } }; @@ -51,10 +51,9 @@ public class SignificantMacros implements ISignificantMacros { private char[] encode(CharArrayObjectMap sigMacros) { StringBuilder buffer= new StringBuilder(); - Object[] keys= sigMacros.keyArray(); + char[][] keys= sigMacros.keys(); Arrays.sort(keys, SORTER); - for (Object key : keys) { - char[] name= (char[]) key; + for (char[] name : keys) { char[] value= sigMacros.get(name); buffer.append((char) name.length).append(name); buffer.append((char) value.length).append(value);