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:
parent
f1341a25cb
commit
62dc7c36ea
6 changed files with 72 additions and 44 deletions
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue