1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-02 05:45:58 +02:00

Performance optimization.

Change-Id: I44a518a9eeb1c31cb1c065f89cae774b125c4f94
This commit is contained in:
Sergey Prigogin 2016-03-01 14:26:31 -08:00
parent f1341a25cb
commit 62dc7c36ea
6 changed files with 72 additions and 44 deletions

View file

@ -13,8 +13,7 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import java.util.ArrayList; import java.util.Arrays;
import java.util.List;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
@ -148,7 +147,6 @@ public class CPPASTBaseSpecifier extends ASTNode implements ICPPASTBaseSpecifier
@Override @Override
public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) { public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) {
IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces); IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces);
List<IBinding> filtered = new ArrayList<>();
ICPPClassType classType = null; ICPPClassType classType = null;
if (getParent() instanceof CPPASTCompositeTypeSpecifier) { 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) { if (binding instanceof IType) {
IType type = (IType) binding; IType type = (IType) binding;
@ -173,15 +173,21 @@ public class CPPASTBaseSpecifier extends ASTNode implements ICPPASTBaseSpecifier
if ((key == ICPPClassType.k_class || key == ICPPClassType.k_struct if ((key == ICPPClassType.k_class || key == ICPPClassType.k_struct
|| type instanceof ICPPDeferredClassInstance || type instanceof ICPPUnknownMemberClass) || type instanceof ICPPDeferredClassInstance || type instanceof ICPPUnknownMemberClass)
&& (classType == null || !type.isSameType(classType))) { && (classType == null || !type.isSameType(classType))) {
filtered.add(binding); if (i != j)
bindings[j] = binding;
j++;
} }
} else if (type instanceof ICPPTemplateTypeParameter) { } 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 @Override

View file

@ -12,6 +12,8 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; 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.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTImplicitName; 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.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; 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.core.parser.util.CharArraySet;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; 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); IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces);
CharArraySet baseClasses = null; CharArraySet baseClasses = null;
int j = 0;
for (int i = 0; i < bindings.length; i++) { for (int i = 0; i < bindings.length; i++) {
final IBinding b = bindings[i]; final IBinding binding = bindings[i];
if ((b instanceof ICPPField) || (b instanceof ICPPNamespace)) { if ((binding instanceof ICPPField) || (binding instanceof ICPPNamespace)) {
// OK, keep binding. if (i != j)
} else if (b instanceof ICPPConstructor || b instanceof ICPPClassType) { bindings[j] = binding;
j++;
} else if (binding instanceof ICPPConstructor || binding instanceof ICPPClassType) {
if (baseClasses == null) if (baseClasses == null)
baseClasses = getBaseClasses(n); baseClasses = getBaseClasses(n);
if (!baseClasses.containsKey(b.getNameCharArray())) { if (baseClasses.containsKey(binding.getNameCharArray())) {
bindings[i] = null; if (i != j)
} bindings[j] = binding;
} else { j++;
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) { private CharArraySet getBaseClasses(IASTName name) {

View file

@ -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 static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.LVALUE;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.ASTVisitor;
@ -228,19 +229,21 @@ public class CPPASTFieldReference extends ASTNode
@Override @Override
public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) { public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) {
IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces); IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces);
List<IBinding> filtered = new ArrayList<>();
for (IBinding binding : bindings) { int j = 0;
if (binding instanceof ICPPMethod) { for (int i = 0; i < bindings.length; i++) {
ICPPMethod method = (ICPPMethod) binding; IBinding binding = bindings[i];
if (method.isImplicit()) { if (!(binding instanceof ICPPMethod && ((ICPPMethod) binding).isImplicit())) {
continue; 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 @Override

View file

@ -11,8 +11,7 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import java.util.ArrayList; import java.util.Arrays;
import java.util.List;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
@ -116,19 +115,24 @@ public class CPPASTNamedTypeSpecifier extends CPPASTBaseDeclSpecifier
@Override @Override
public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) { public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) {
IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces); IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces);
List<IBinding> filtered = new ArrayList<IBinding>();
for (IBinding binding : bindings) { int j = 0;
for (int i = 0; i < bindings.length; i++) {
IBinding binding = bindings[i];
if (binding instanceof ICPPClassType if (binding instanceof ICPPClassType
|| binding instanceof IEnumeration || binding instanceof IEnumeration
|| binding instanceof ICPPNamespace || binding instanceof ICPPNamespace
|| binding instanceof ITypedef || binding instanceof ITypedef
|| binding instanceof ICPPTemplateTypeParameter) { || 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 @Override

View file

@ -13,8 +13,7 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import java.util.ArrayList; import java.util.Arrays;
import java.util.List;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
@ -108,15 +107,20 @@ public class CPPASTUsingDeclaration extends CPPASTAttributeOwner
@Override @Override
public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) { public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) {
IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces); IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces);
List<IBinding> filtered = new ArrayList<IBinding>();
for (IBinding binding : bindings) { int j = 0;
for (int i = 0; i < bindings.length; i++) {
IBinding binding = bindings[i];
if (binding instanceof ICPPNamespace) { 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 @Override

View file

@ -13,8 +13,7 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp; package org.eclipse.cdt.internal.core.dom.parser.cpp;
import java.util.ArrayList; import java.util.Arrays;
import java.util.List;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
@ -95,15 +94,20 @@ public class CPPASTUsingDirective extends CPPASTAttributeOwner
@Override @Override
public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) { public IBinding[] findBindings(IASTName n, boolean isPrefix, String[] namespaces) {
IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces); IBinding[] bindings = CPPSemantics.findBindingsForContentAssist(n, isPrefix, namespaces);
List<IBinding> filtered = new ArrayList<IBinding>();
for (IBinding binding : bindings) { int j = 0;
for (int i = 0; i < bindings.length; i++) {
IBinding binding = bindings[i];
if (binding instanceof ICPPNamespace) { 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 @Override