1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 17:05:26 +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;
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<IBinding> 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

View file

@ -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) {

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 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<IBinding> 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

View file

@ -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<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
|| 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

View file

@ -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<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) {
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

View file

@ -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<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) {
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