1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug 341008: Open element for enumerators nested in classes.

This commit is contained in:
Markus Schorn 2011-03-30 16:49:04 +00:00
parent 7edc697389
commit a3be88af27
2 changed files with 47 additions and 40 deletions

View file

@ -15,9 +15,7 @@ import java.util.List;
import junit.framework.TestSuite; import junit.framework.TestSuite;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IBasicType;
import org.eclipse.cdt.core.dom.ast.IBasicType.Kind; import org.eclipse.cdt.core.dom.ast.IBasicType.Kind;
@ -52,10 +50,10 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.core.parser.util.ObjectMap;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassSpecializationScope;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateArgument;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates;
@ -1189,24 +1187,23 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa
ICPPClassType b1= getBindingFromASTName("B adb", 1, ICPPClassType.class, ICPPSpecialization.class); ICPPClassType b1= getBindingFromASTName("B adb", 1, ICPPClassType.class, ICPPSpecialization.class);
ICPPClassType b2= getBindingFromASTName("A<C>", 4, ICPPClassType.class, ICPPSpecialization.class); ICPPClassType b2= getBindingFromASTName("A<C>", 4, ICPPClassType.class, ICPPSpecialization.class);
ICPPClassType b3= (ICPPClassType) getIndex().findBindings("A".toCharArray(), new IndexFilter() { IIndexBinding[] sr = getIndex().findBindings("A".toCharArray(), new IndexFilter() {
@Override @Override
public boolean acceptBinding(IBinding binding) throws CoreException { public boolean acceptBinding(IBinding binding) throws CoreException {
return !(binding instanceof ICPPSpecialization); return !(binding instanceof ICPPSpecialization);
} }
}, npm())[0]; }, npm());
assertTrue(sr.length == 1);
ICPPClassType b3= (ICPPClassType) sr[0];
ICPPClassType b4= (ICPPClassType) getIndex().findBindings(new char[][] {"A".toCharArray(), "B".toCharArray()}, new IndexFilter() { sr = getIndex().findBindings(new char[][] {"A".toCharArray(), "B".toCharArray()}, new IndexFilter() {
@Override @Override
public boolean acceptBinding(IBinding binding) throws CoreException { public boolean acceptBinding(IBinding binding) throws CoreException {
try { return binding instanceof ICPPSpecialization;
return !(binding.getScope() instanceof CPPClassSpecializationScope); //
} catch(DOMException de) {
CCorePlugin.log(de);
return false;
}
} }
}, npm())[0]; }, npm());
assertTrue(sr.length == 1);
ICPPClassType b4= (ICPPClassType) sr[0];
assertFalse(b0 instanceof ICPPSpecialization); assertFalse(b0 instanceof ICPPSpecialization);
@ -1217,7 +1214,7 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa
ICPPClassScope cs1= assertInstance(s1, ICPPClassScope.class); ICPPClassScope cs1= assertInstance(s1, ICPPClassScope.class);
assertInstance(cs1.getClassType(), ICPPClassType.class); assertInstance(cs1.getClassType(), ICPPClassType.class);
assertInstance(cs1.getClassType(), ICPPTemplateInstance.class); assertInstance(cs1.getClassType(), ICPPTemplateInstance.class);
assertTrue(((IType)s4.getScopeBinding()).isSameType( (IType) ((IIndexScope)b3.getCompositeScope()).getScopeBinding() )); assertTrue(((IType)((ICPPClassSpecialization) s4.getScopeBinding()).getSpecializedBinding()).isSameType( (IType) ((IIndexScope)b3.getCompositeScope()).getScopeBinding() ));
} }
// class A {}; // class A {};

View file

@ -56,6 +56,8 @@ import org.eclipse.cdt.core.index.IIndexLocationConverter;
import org.eclipse.cdt.core.index.IIndexMacro; import org.eclipse.cdt.core.index.IIndexMacro;
import org.eclipse.cdt.core.index.IIndexMacroContainer; import org.eclipse.cdt.core.index.IIndexMacroContainer;
import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
import org.eclipse.cdt.internal.core.dom.Linkage; import org.eclipse.cdt.internal.core.dom.Linkage;
import org.eclipse.cdt.internal.core.index.IIndexCBindingConstants; import org.eclipse.cdt.internal.core.index.IIndexCBindingConstants;
import org.eclipse.cdt.internal.core.index.IIndexFragment; import org.eclipse.cdt.internal.core.index.IIndexFragment;
@ -75,7 +77,6 @@ import org.eclipse.cdt.internal.core.pdom.dom.FindBinding;
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory;
import org.eclipse.cdt.internal.core.pdom.dom.MacroContainerCollector; import org.eclipse.cdt.internal.core.pdom.dom.MacroContainerCollector;
import org.eclipse.cdt.internal.core.pdom.dom.MacroContainerPatternCollector; import org.eclipse.cdt.internal.core.pdom.dom.MacroContainerPatternCollector;
import org.eclipse.cdt.internal.core.pdom.dom.NamedNodeCollector;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile; import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMInclude; import org.eclipse.cdt.internal.core.pdom.dom.PDOMInclude;
@ -729,34 +730,43 @@ public class PDOM extends PlatformObject implements IPDOM {
if (names.length == 0) { if (names.length == 0) {
return IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY; return IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY;
} }
ArrayList<PDOMBinding> result= new ArrayList<PDOMBinding>(); if (names.length == 1) {
ArrayList<PDOMNamedNode> nodes= new ArrayList<PDOMNamedNode>(); return findBindings(names[0], true, caseSensitive, filter, monitor);
for (PDOMLinkage linkage : getLinkageList()) { }
if (filter.acceptLinkage(linkage)) {
nodes.add(linkage); IIndexFragmentBinding[] candidates = findBindings(names[names.length-1], false, caseSensitive, filter, monitor);
for (int i=0; i < names.length-1; i++) { int j= 0;
char[] name= names[i]; for (int i = 0; i < candidates.length; i++) {
NamedNodeCollector collector= new NamedNodeCollector(linkage, name, false, false, caseSensitive); IIndexFragmentBinding cand = candidates[i];
for (Iterator<PDOMNamedNode> in = nodes.iterator(); in.hasNext();) { if (matches(cand, names, caseSensitive)) {
PDOMNode node= in.next(); candidates[j++]= cand;
node.accept(collector);
}
nodes.clear();
nodes.addAll(Arrays.asList(collector.getNodes()));
}
char[] name= names[names.length-1];
BindingCollector collector= new BindingCollector(linkage, name, filter, false, false, caseSensitive);
for (Iterator<PDOMNamedNode> in = nodes.iterator(); in.hasNext();) {
PDOMNode node= in.next();
node.accept(collector);
}
nodes.clear();
result.addAll(Arrays.asList(collector.getBindings()));
} }
} }
return result.toArray(new IIndexFragmentBinding[result.size()]); return ArrayUtil.trimAt(IIndexFragmentBinding.class, candidates, j-1);
} }
private boolean matches(IIndexFragmentBinding cand, char[][] names, boolean caseSensitive) {
int i= names.length-1;
while(i >= 0) {
if (cand == null)
return false;
char[] name= cand.getNameCharArray();
if (!CharArrayUtils.equals(name, 0, name.length, names[i], !caseSensitive)) {
if (cand instanceof IEnumeration) {
if (cand instanceof ICPPEnumeration && ((ICPPEnumeration) cand).isScoped())
return false;
// Unscoped enumerations are not part of the qualified name.
i++;
} else {
return false;
}
}
cand= cand.getOwner();
i--;
}
return cand == null;
}
private long getFirstLinkageRecord() throws CoreException { private long getFirstLinkageRecord() throws CoreException {
return db.getRecPtr(LINKAGES); return db.getRecPtr(LINKAGES);