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:
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;
|
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
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue