diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java index c686c5bf9a6..acf317ddb47 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java @@ -13,8 +13,7 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; -import java.util.ArrayList; -import java.util.List; +import java.util.Arrays; import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTName; @@ -148,7 +147,6 @@ public class CPPASTBaseSpecifier extends ASTNode implements ICPPASTBaseSpecifier @Override public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) { IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces); - List filtered = new ArrayList<>(); ICPPClassType classType = null; if (getParent() instanceof CPPASTCompositeTypeSpecifier) { @@ -159,7 +157,9 @@ public class CPPASTBaseSpecifier extends ASTNode implements ICPPASTBaseSpecifier } } - for (IBinding binding : bindings) { + int j = 0; + for (int i = 0; i < bindings.length; i++) { + IBinding binding = bindings[i]; if (binding instanceof IType) { IType type = (IType) binding; @@ -173,15 +173,21 @@ public class CPPASTBaseSpecifier extends ASTNode implements ICPPASTBaseSpecifier if ((key == ICPPClassType.k_class || key == ICPPClassType.k_struct || type instanceof ICPPDeferredClassInstance || type instanceof ICPPUnknownMemberClass) && (classType == null || !type.isSameType(classType))) { - filtered.add(binding); + if (i != j) + bindings[j] = binding; + j++; } } else if (type instanceof ICPPTemplateTypeParameter) { - filtered.add(binding); + if (i != j) + bindings[j] = binding; + j++; } } } - return filtered.toArray(new IBinding[filtered.size()]); + if (j < bindings.length) + return Arrays.copyOfRange(bindings, 0, j); + return bindings; } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTConstructorChainInitializer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTConstructorChainInitializer.java index b5672f2e1bc..1793a72c122 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTConstructorChainInitializer.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTConstructorChainInitializer.java @@ -12,6 +12,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import java.util.Arrays; + import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTImplicitName; @@ -31,7 +33,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; -import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.CharArraySet; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; @@ -144,22 +145,28 @@ public class CPPASTConstructorChainInitializer extends ASTNode implements IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces); CharArraySet baseClasses = null; + int j = 0; for (int i = 0; i < bindings.length; i++) { - final IBinding b = bindings[i]; - if ((b instanceof ICPPField) || (b instanceof ICPPNamespace)) { - // OK, keep binding. - } else if (b instanceof ICPPConstructor || b instanceof ICPPClassType) { + final IBinding binding = bindings[i]; + if ((binding instanceof ICPPField) || (binding instanceof ICPPNamespace)) { + if (i != j) + bindings[j] = binding; + j++; + } else if (binding instanceof ICPPConstructor || binding instanceof ICPPClassType) { if (baseClasses == null) baseClasses = getBaseClasses(n); - if (!baseClasses.containsKey(b.getNameCharArray())) { - bindings[i] = null; + if (baseClasses.containsKey(binding.getNameCharArray())) { + if (i != j) + bindings[j] = binding; + j++; } - } else { - bindings[i] = null; } } - return ArrayUtil.removeNulls(IBinding.class, bindings); + + if (j < bindings.length) + return Arrays.copyOfRange(bindings, 0, j); + return bindings; } private CharArraySet getBaseClasses(IASTName name) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java index e71168b134e..66b34fa9d98 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java @@ -17,6 +17,7 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.LVALUE; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import org.eclipse.cdt.core.dom.ast.ASTVisitor; @@ -228,19 +229,21 @@ public class CPPASTFieldReference extends ASTNode @Override public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) { IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces); - List filtered = new ArrayList<>(); - for (IBinding binding : bindings) { - if (binding instanceof ICPPMethod) { - ICPPMethod method = (ICPPMethod) binding; - if (method.isImplicit()) { - continue; - } + int j = 0; + for (int i = 0; i < bindings.length; i++) { + IBinding binding = bindings[i]; + if (!(binding instanceof ICPPMethod && ((ICPPMethod) binding).isImplicit())) { + if (i != j) + bindings[j] = binding; + j++; } - filtered.add(binding); } - return filtered.toArray(new IBinding[filtered.size()]); + + if (j < bindings.length) + return Arrays.copyOfRange(bindings, 0, j); + return bindings; } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamedTypeSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamedTypeSpecifier.java index 26ef3a52290..0119feb3558 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamedTypeSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamedTypeSpecifier.java @@ -11,8 +11,7 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; -import java.util.ArrayList; -import java.util.List; +import java.util.Arrays; import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTName; @@ -116,19 +115,24 @@ public class CPPASTNamedTypeSpecifier extends CPPASTBaseDeclSpecifier @Override public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) { IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces); - List filtered = new ArrayList(); - for (IBinding binding : bindings) { + int j = 0; + for (int i = 0; i < bindings.length; i++) { + IBinding binding = bindings[i]; if (binding instanceof ICPPClassType || binding instanceof IEnumeration || binding instanceof ICPPNamespace || binding instanceof ITypedef || binding instanceof ICPPTemplateTypeParameter) { - filtered.add(binding); + if (i != j) + bindings[j] = binding; + j++; } } - return filtered.toArray(new IBinding[filtered.size()]); + if (j < bindings.length) + return Arrays.copyOfRange(bindings, 0, j); + return bindings; } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDeclaration.java index d18666da41f..a078fc39fba 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDeclaration.java @@ -13,8 +13,7 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; -import java.util.ArrayList; -import java.util.List; +import java.util.Arrays; import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTName; @@ -108,15 +107,20 @@ public class CPPASTUsingDeclaration extends CPPASTAttributeOwner @Override public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) { IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces); - List filtered = new ArrayList(); - for (IBinding binding : bindings) { + int j = 0; + for (int i = 0; i < bindings.length; i++) { + IBinding binding = bindings[i]; if (binding instanceof ICPPNamespace) { - filtered.add(binding); + if (i != j) + bindings[j] = binding; + j++; } } - return filtered.toArray(new IBinding[filtered.size()]); + if (j < bindings.length) + return Arrays.copyOfRange(bindings, 0, j); + return bindings; } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDirective.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDirective.java index c97ec6677e1..eaed06a7bdb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDirective.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDirective.java @@ -13,8 +13,7 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; -import java.util.ArrayList; -import java.util.List; +import java.util.Arrays; import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTName; @@ -95,15 +94,20 @@ public class CPPASTUsingDirective extends CPPASTAttributeOwner @Override public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) { IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces); - List filtered = new ArrayList(); - for (IBinding binding : bindings) { + int j = 0; + for (int i = 0; i < bindings.length; i++) { + IBinding binding = bindings[i]; if (binding instanceof ICPPNamespace) { - filtered.add(binding); + if (i != j) + bindings[j] = binding; + j++; } } - return filtered.toArray(new IBinding[filtered.size()]); + if (j < bindings.length) + return Arrays.copyOfRange(bindings, 0, j); + return bindings; } @Override