mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-08 10:16:03 +02:00
Fix for 156671, adding anonymous types to the index.
This commit is contained in:
parent
6b74be4cac
commit
e941f73524
14 changed files with 739 additions and 102 deletions
|
@ -29,6 +29,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||||
import org.eclipse.cdt.core.dom.ast.ICompositeType;
|
import org.eclipse.cdt.core.dom.ast.ICompositeType;
|
||||||
import org.eclipse.cdt.core.dom.ast.IEnumeration;
|
import org.eclipse.cdt.core.dom.ast.IEnumeration;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||||
import org.eclipse.cdt.core.dom.ast.IType;
|
import org.eclipse.cdt.core.dom.ast.IType;
|
||||||
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
||||||
|
@ -468,4 +469,23 @@ public class IndexBugsTests extends BaseTestCase {
|
||||||
fIndex.releaseReadLock();
|
fIndex.releaseReadLock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// enum {e20070206};
|
||||||
|
public void test156671() throws Exception {
|
||||||
|
waitForIndexer();
|
||||||
|
String content= getContentsForTest(1)[0].toString();
|
||||||
|
|
||||||
|
IFile file= TestSourceReader.createFile(fCProject.getProject(), "test156671.cpp", content);
|
||||||
|
TestSourceReader.waitUntilFileIsIndexed(fIndex, file, INDEX_WAIT_TIME);
|
||||||
|
|
||||||
|
fIndex.acquireReadLock();
|
||||||
|
try {
|
||||||
|
IBinding[] bindings= fIndex.findBindings("e20070206".toCharArray(), IndexFilter.getFilter(ILinkage.CPP_LINKAGE_ID), NPM);
|
||||||
|
assertEquals(1, bindings.length);
|
||||||
|
assertTrue(bindings[0] instanceof IEnumerator);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
fIndex.releaseReadLock();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,8 +52,15 @@ abstract class CElementHandle implements ICElementHandle, ISourceReference {
|
||||||
public CElementHandle(ICElement parent, int type, String name) {
|
public CElementHandle(ICElement parent, int type, String name) {
|
||||||
fParent= parent;
|
fParent= parent;
|
||||||
fType= type;
|
fType= type;
|
||||||
|
// anonymous types are assigned a name in the index, we
|
||||||
|
// undo this here
|
||||||
|
if (name.length() > 0 && name.charAt(0)=='{') {
|
||||||
|
fName= ""; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
else {
|
||||||
fName= name;
|
fName= name;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if (obj instanceof ICElement) {
|
if (obj instanceof ICElement) {
|
||||||
|
|
|
@ -13,7 +13,6 @@ package org.eclipse.cdt.core.dom.ast;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.dom.IName;
|
import org.eclipse.cdt.core.dom.IName;
|
||||||
import org.eclipse.cdt.core.index.IIndex;
|
import org.eclipse.cdt.core.index.IIndex;
|
||||||
import org.eclipse.cdt.core.model.ILanguage;
|
|
||||||
import org.eclipse.cdt.core.parser.ParserLanguage;
|
import org.eclipse.cdt.core.parser.ParserLanguage;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -241,7 +241,7 @@ public interface IIndex {
|
||||||
*
|
*
|
||||||
* This is fully equivalent to
|
* This is fully equivalent to
|
||||||
* <pre>
|
* <pre>
|
||||||
* findBindings(new Pattern[]{pattern}, isFullyQualified, filter, monitor);
|
* findBindings(new char[][]{name}, filter, monitor);
|
||||||
* </pre>
|
* </pre>
|
||||||
* @param names an array of names, which has to be matched by the qualified name of the bindings.
|
* @param names an array of names, which has to be matched by the qualified name of the bindings.
|
||||||
* @param filter a filter that allows for skipping parts of the index
|
* @param filter a filter that allows for skipping parts of the index
|
||||||
|
@ -249,7 +249,7 @@ public interface IIndex {
|
||||||
* @return an array of bindings matching the pattern
|
* @return an array of bindings matching the pattern
|
||||||
* @throws CoreException
|
* @throws CoreException
|
||||||
*/
|
*/
|
||||||
public IIndexBinding[] findBindings(char[] names, IndexFilter filter, IProgressMonitor monitor) throws CoreException;
|
public IIndexBinding[] findBindings(char[] name, IndexFilter filter, IProgressMonitor monitor) throws CoreException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Searches the given namespace for all bindings of a given name.
|
* Searches the given namespace for all bindings of a given name.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2004, 2006 IBM Corporation and others.
|
* Copyright (c) 2004, 2007 IBM Corporation and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -37,7 +37,7 @@ import org.eclipse.core.runtime.PlatformObject;
|
||||||
/**
|
/**
|
||||||
* @author aniefer
|
* @author aniefer
|
||||||
*/
|
*/
|
||||||
public class CEnumeration extends PlatformObject implements IEnumeration {
|
public class CEnumeration extends PlatformObject implements IEnumeration, ICInternalBinding {
|
||||||
|
|
||||||
private IASTName [] declarations = null;
|
private IASTName [] declarations = null;
|
||||||
private IASTName definition = null;
|
private IASTName definition = null;
|
||||||
|
|
|
@ -115,9 +115,11 @@ public class CPPImplicitMethod extends CPPImplicitFunction implements ICPPMethod
|
||||||
if( dtor instanceof ICPPASTFunctionDeclarator &&
|
if( dtor instanceof ICPPASTFunctionDeclarator &&
|
||||||
CharArrayUtils.equals( name.toCharArray(), getNameCharArray() ) )
|
CharArrayUtils.equals( name.toCharArray(), getNameCharArray() ) )
|
||||||
{
|
{
|
||||||
IFunctionType t = (IFunctionType) CPPVisitor.createType( dtor );
|
IType t0= CPPVisitor.createType( dtor );
|
||||||
IType [] ps = t.getParameterTypes();
|
|
||||||
boolean ok= false;
|
boolean ok= false;
|
||||||
|
if (t0 instanceof IFunctionType) {
|
||||||
|
IFunctionType t = (IFunctionType) t0;
|
||||||
|
IType [] ps = t.getParameterTypes();
|
||||||
if( ps.length == params.length ){
|
if( ps.length == params.length ){
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
for( ; idx < ps.length && ps[idx] != null; idx++ ){
|
for( ; idx < ps.length && ps[idx] != null; idx++ ){
|
||||||
|
@ -132,6 +134,10 @@ public class CPPImplicitMethod extends CPPImplicitFunction implements ICPPMethod
|
||||||
ok = (t1 instanceof IBasicType) && ((IBasicType) t1).getType() == IBasicType.t_void;
|
ok = (t1 instanceof IBasicType) && ((IBasicType) t1).getType() == IBasicType.t_void;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ok= false;
|
||||||
|
}
|
||||||
if (ok) {
|
if (ok) {
|
||||||
name.setBinding( this );
|
name.setBinding( this );
|
||||||
if( member instanceof IASTSimpleDeclaration )
|
if( member instanceof IASTSimpleDeclaration )
|
||||||
|
|
|
@ -685,8 +685,8 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen
|
||||||
monitor.beginTask(Messages.PDOMManager_JoinIndexerTask, 1000);
|
monitor.beginTask(Messages.PDOMManager_JoinIndexerTask, 1000);
|
||||||
long limit= System.currentTimeMillis()+waitMaxMillis;
|
long limit= System.currentTimeMillis()+waitMaxMillis;
|
||||||
try {
|
try {
|
||||||
while (true) {
|
|
||||||
int currentTicks= 0;
|
int currentTicks= 0;
|
||||||
|
while (true) {
|
||||||
if (monitor.isCanceled()) {
|
if (monitor.isCanceled()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,443 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Markus Schorn - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.internal.core.pdom.dom;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.dom.ILinkage;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.ICompositeType;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IEnumeration;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IField;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IType;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
|
||||||
|
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.internal.core.dom.parser.c.ICInternalBinding;
|
||||||
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
|
||||||
|
public class PDOMASTAdapter {
|
||||||
|
private static class AnonymousASTName implements IASTName {
|
||||||
|
private IASTName fDelegate;
|
||||||
|
private IASTFileLocation fLocation;
|
||||||
|
|
||||||
|
public AnonymousASTName(IASTName name, final IASTFileLocation loc) {
|
||||||
|
fDelegate= name;
|
||||||
|
fLocation= new IASTFileLocation() {
|
||||||
|
public int getEndingLineNumber() {
|
||||||
|
return loc.getStartingLineNumber();
|
||||||
|
}
|
||||||
|
public String getFileName() {
|
||||||
|
return loc.getFileName();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getStartingLineNumber() {
|
||||||
|
return loc.getStartingLineNumber();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IASTFileLocation asFileLocation() {
|
||||||
|
return loc.asFileLocation();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getNodeLength() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getNodeOffset() {
|
||||||
|
return loc.getNodeOffset();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean accept(ASTVisitor visitor) {
|
||||||
|
return fDelegate.accept(visitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean contains(IASTNode node) {
|
||||||
|
return fDelegate.contains(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBinding getBinding() {
|
||||||
|
return fDelegate.getBinding();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getContainingFilename() {
|
||||||
|
return fDelegate.getContainingFilename();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IASTFileLocation getFileLocation() {
|
||||||
|
return fLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ILinkage getLinkage() {
|
||||||
|
return fDelegate.getLinkage();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IASTNodeLocation[] getNodeLocations() {
|
||||||
|
return fDelegate.getNodeLocations();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IASTNode getParent() {
|
||||||
|
return fDelegate.getParent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ASTNodeProperty getPropertyInParent() {
|
||||||
|
return fDelegate.getPropertyInParent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRawSignature() {
|
||||||
|
return fDelegate.getRawSignature();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IASTTranslationUnit getTranslationUnit() {
|
||||||
|
return fDelegate.getTranslationUnit();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDeclaration() {
|
||||||
|
return fDelegate.isDeclaration();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDefinition() {
|
||||||
|
return fDelegate.isDefinition();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isReference() {
|
||||||
|
return fDelegate.isReference();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBinding resolveBinding() {
|
||||||
|
return fDelegate.resolveBinding();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBinding[] resolvePrefix() {
|
||||||
|
return fDelegate.resolvePrefix();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBinding(IBinding binding) {
|
||||||
|
fDelegate.setBinding(binding);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParent(IASTNode node) {
|
||||||
|
fDelegate.setParent(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPropertyInParent(ASTNodeProperty property) {
|
||||||
|
fDelegate.setPropertyInParent(property);
|
||||||
|
}
|
||||||
|
|
||||||
|
public char[] toCharArray() {
|
||||||
|
return fDelegate.toCharArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class AnonymousEnumeration implements IEnumeration {
|
||||||
|
private IEnumeration fDelegate;
|
||||||
|
private char[] fName;
|
||||||
|
|
||||||
|
public AnonymousEnumeration(char[] name, IEnumeration delegate) {
|
||||||
|
fName= name;
|
||||||
|
fDelegate= delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object clone() {
|
||||||
|
throw new PDOMNotImplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getAdapter(Class adapter) {
|
||||||
|
return fDelegate.getAdapter(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerator[] getEnumerators() throws DOMException {
|
||||||
|
return fDelegate.getEnumerators();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ILinkage getLinkage() throws CoreException {
|
||||||
|
return fDelegate.getLinkage();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return new String(fName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public char[] getNameCharArray() {
|
||||||
|
return fName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IScope getScope() throws DOMException {
|
||||||
|
return fDelegate.getScope();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSameType(IType type) {
|
||||||
|
return fDelegate.isSameType(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class AnonymousCompositeType implements ICompositeType {
|
||||||
|
protected ICompositeType fDelegate;
|
||||||
|
private char[] fName;
|
||||||
|
|
||||||
|
public AnonymousCompositeType(char[] name, ICompositeType delegate) {
|
||||||
|
fName= name;
|
||||||
|
fDelegate= delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object clone() {
|
||||||
|
throw new PDOMNotImplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IField findField(String name) throws DOMException {
|
||||||
|
return fDelegate.findField(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getAdapter(Class adapter) {
|
||||||
|
return fDelegate.getAdapter(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IScope getCompositeScope() throws DOMException {
|
||||||
|
return fDelegate.getCompositeScope();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IField[] getFields() throws DOMException {
|
||||||
|
return fDelegate.getFields();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getKey() throws DOMException {
|
||||||
|
return fDelegate.getKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ILinkage getLinkage() throws CoreException {
|
||||||
|
return fDelegate.getLinkage();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return new String(fName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public char[] getNameCharArray() {
|
||||||
|
return fName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IScope getScope() throws DOMException {
|
||||||
|
return fDelegate.getScope();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSameType(IType type) {
|
||||||
|
return fDelegate.isSameType(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class AnonymousClassType implements ICPPClassType {
|
||||||
|
private ICPPClassType fDelegate;
|
||||||
|
private char[] fName;
|
||||||
|
|
||||||
|
public AnonymousClassType(char[] name, ICPPClassType delegate) {
|
||||||
|
fName= name;
|
||||||
|
fDelegate= delegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object clone() {
|
||||||
|
throw new PDOMNotImplementedError();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return new String(fName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public char[] getNameCharArray() {
|
||||||
|
return fName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IField findField(String name) throws DOMException {
|
||||||
|
return fDelegate.findField(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getAdapter(Class adapter) {
|
||||||
|
return fDelegate.getAdapter(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICPPMethod[] getAllDeclaredMethods() throws DOMException {
|
||||||
|
return fDelegate.getAllDeclaredMethods();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICPPBase[] getBases() throws DOMException {
|
||||||
|
return fDelegate.getBases();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IScope getCompositeScope() throws DOMException {
|
||||||
|
return fDelegate.getCompositeScope();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICPPConstructor[] getConstructors() throws DOMException {
|
||||||
|
return fDelegate.getConstructors();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICPPField[] getDeclaredFields() throws DOMException {
|
||||||
|
return fDelegate.getDeclaredFields();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICPPMethod[] getDeclaredMethods() throws DOMException {
|
||||||
|
return fDelegate.getDeclaredMethods();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IField[] getFields() throws DOMException {
|
||||||
|
return fDelegate.getFields();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IBinding[] getFriends() throws DOMException {
|
||||||
|
return fDelegate.getFriends();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getKey() throws DOMException {
|
||||||
|
return fDelegate.getKey();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ILinkage getLinkage() throws CoreException {
|
||||||
|
return fDelegate.getLinkage();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICPPMethod[] getMethods() throws DOMException {
|
||||||
|
return fDelegate.getMethods();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICPPClassType[] getNestedClasses() throws DOMException {
|
||||||
|
return fDelegate.getNestedClasses();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getQualifiedName() throws DOMException {
|
||||||
|
return fDelegate.getQualifiedName();
|
||||||
|
}
|
||||||
|
|
||||||
|
public char[][] getQualifiedNameCharArray() throws DOMException {
|
||||||
|
return fDelegate.getQualifiedNameCharArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IScope getScope() throws DOMException {
|
||||||
|
return fDelegate.getScope();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isGloballyQualified() throws DOMException {
|
||||||
|
return fDelegate.isGloballyQualified();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSameType(IType type) {
|
||||||
|
return fDelegate.isSameType(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the provided binding is anonymous, either an adapter is returned
|
||||||
|
* that computes a name for the binding, or <code>null</code> if that
|
||||||
|
* is not appropriate (e.g. binding is not a type).
|
||||||
|
* Otherwise, if the binding has a name it is returned unchanged.
|
||||||
|
*/
|
||||||
|
public static IBinding getAdapterIfAnonymous(IBinding binding) {
|
||||||
|
if (binding != null) {
|
||||||
|
char[] name= binding.getNameCharArray();
|
||||||
|
if (name.length == 0) {
|
||||||
|
if (binding instanceof IEnumeration) {
|
||||||
|
name= createNameForAnonymous(binding);
|
||||||
|
if (name != null) {
|
||||||
|
return new AnonymousEnumeration(name, (IEnumeration) binding);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (binding instanceof ICPPClassType) {
|
||||||
|
name= createNameForAnonymous(binding);
|
||||||
|
if (name != null) {
|
||||||
|
return new AnonymousClassType(name, (ICPPClassType) binding);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (binding instanceof ICompositeType) {
|
||||||
|
name= createNameForAnonymous(binding);
|
||||||
|
if (name != null) {
|
||||||
|
return new AnonymousCompositeType(name, (ICompositeType) binding);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return binding;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static char[] createNameForAnonymous(IBinding binding) {
|
||||||
|
IASTNode node= null;
|
||||||
|
if (binding instanceof ICInternalBinding) {
|
||||||
|
node= ((ICInternalBinding) binding).getPhysicalNode();
|
||||||
|
}
|
||||||
|
else if (binding instanceof ICPPInternalBinding) {
|
||||||
|
node= ((ICPPInternalBinding) binding).getDefinition();
|
||||||
|
}
|
||||||
|
if (node != null) {
|
||||||
|
IASTFileLocation loc= node.getFileLocation();
|
||||||
|
if (loc == null) {
|
||||||
|
node= node.getParent();
|
||||||
|
if (node != null) {
|
||||||
|
loc= node.getFileLocation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (loc != null) {
|
||||||
|
char[] fname= loc.getFileName().toCharArray();
|
||||||
|
int fnamestart= findFileNameStart(fname);
|
||||||
|
StringBuffer buf= new StringBuffer();
|
||||||
|
buf.append('{');
|
||||||
|
buf.append(fname, fnamestart, fname.length-fnamestart);
|
||||||
|
buf.append(':');
|
||||||
|
buf.append(loc.getNodeOffset());
|
||||||
|
buf.append('}');
|
||||||
|
return buf.toString().toCharArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int findFileNameStart(char[] fname) {
|
||||||
|
for (int i= fname.length-2; i>=0; i--) {
|
||||||
|
switch (fname[i]) {
|
||||||
|
case '/':
|
||||||
|
case '\\':
|
||||||
|
return i+1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the name is empty and has no file location, either an adapter
|
||||||
|
* that has a file location is returned, or <code>null</code> if that
|
||||||
|
* is not possible.
|
||||||
|
* Otherwise if the provided name is not empty, it is returned unchanged.
|
||||||
|
*/
|
||||||
|
public static IASTName getAdapterIfAnonymous(IASTName name) {
|
||||||
|
if (name.getFileLocation() == null) {
|
||||||
|
if (name.toCharArray().length == 0) {
|
||||||
|
IASTNode parent= name.getParent();
|
||||||
|
if (parent != null) {
|
||||||
|
IASTFileLocation loc= parent.getFileLocation();
|
||||||
|
if (loc != null) {
|
||||||
|
return new AnonymousASTName(name, loc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,6 +40,7 @@ import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator;
|
import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.FindBinding;
|
import org.eclipse.cdt.internal.core.pdom.dom.FindBinding;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
|
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMASTAdapter;
|
||||||
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.PDOMLinkage;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||||
|
@ -84,9 +85,13 @@ class PDOMCLinkage extends PDOMLinkage {
|
||||||
if (parent == null)
|
if (parent == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (binding instanceof IParameter)
|
// assign names to anonymous types.
|
||||||
|
binding= PDOMASTAdapter.getAdapterIfAnonymous(binding);
|
||||||
|
|
||||||
|
if (binding == null || binding instanceof IParameter)
|
||||||
return null; // skip parameters
|
return null; // skip parameters
|
||||||
else if (binding instanceof IField) { // must be before IVariable
|
|
||||||
|
if (binding instanceof IField) { // must be before IVariable
|
||||||
if (parent instanceof IPDOMMemberOwner)
|
if (parent instanceof IPDOMMemberOwner)
|
||||||
pdomBinding = new PDOMCField(pdom, (IPDOMMemberOwner)parent, (IField) binding);
|
pdomBinding = new PDOMCField(pdom, (IPDOMMemberOwner)parent, (IField) binding);
|
||||||
} else if (binding instanceof IVariable) {
|
} else if (binding instanceof IVariable) {
|
||||||
|
@ -130,7 +135,7 @@ class PDOMCLinkage extends PDOMLinkage {
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
char[] namechars = name.toCharArray();
|
char[] namechars = name.toCharArray();
|
||||||
if (namechars == null || name.toCharArray().length == 0)
|
if (namechars == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
IBinding binding = name.resolveBinding();
|
IBinding binding = name.resolveBinding();
|
||||||
|
@ -174,7 +179,13 @@ class PDOMCLinkage extends PDOMLinkage {
|
||||||
}
|
}
|
||||||
// so if the binding is from another pdom it has to be adapted.
|
// so if the binding is from another pdom it has to be adapted.
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
// assign names to anonymous types.
|
||||||
|
binding= PDOMASTAdapter.getAdapterIfAnonymous(binding);
|
||||||
|
if (binding == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
PDOMNode parent = getAdaptedParent(binding);
|
PDOMNode parent = getAdaptedParent(binding);
|
||||||
|
|
||||||
if (parent == this) {
|
if (parent == this) {
|
||||||
|
|
|
@ -48,6 +48,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction;
|
||||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||||
import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator;
|
import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
|
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMASTAdapter;
|
||||||
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.PDOMLinkage;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
|
||||||
|
@ -102,7 +103,7 @@ class PDOMCPPLinkage extends PDOMLinkage {
|
||||||
|
|
||||||
// Check for null name
|
// Check for null name
|
||||||
char[] namechars = name.toCharArray();
|
char[] namechars = name.toCharArray();
|
||||||
if (namechars == null || namechars.length == 0)
|
if (namechars == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
IBinding binding = name.resolveBinding();
|
IBinding binding = name.resolveBinding();
|
||||||
|
@ -145,6 +146,12 @@ class PDOMCPPLinkage extends PDOMLinkage {
|
||||||
private PDOMBinding addBinding(PDOMNode parent, IBinding binding) throws CoreException, DOMException {
|
private PDOMBinding addBinding(PDOMNode parent, IBinding binding) throws CoreException, DOMException {
|
||||||
PDOMBinding pdomBinding= null;
|
PDOMBinding pdomBinding= null;
|
||||||
|
|
||||||
|
// assign names to anonymous types.
|
||||||
|
binding= PDOMASTAdapter.getAdapterIfAnonymous(binding);
|
||||||
|
if (binding == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
if (binding instanceof ICPPField && parent instanceof PDOMCPPClassType)
|
if (binding instanceof ICPPField && parent instanceof PDOMCPPClassType)
|
||||||
pdomBinding = new PDOMCPPField(pdom, (PDOMCPPClassType)parent, (ICPPField) binding);
|
pdomBinding = new PDOMCPPField(pdom, (PDOMCPPClassType)parent, (ICPPField) binding);
|
||||||
else if (binding instanceof ICPPVariable && !(binding.getScope() instanceof CPPBlockScope)) {
|
else if (binding instanceof ICPPVariable && !(binding.getScope() instanceof CPPBlockScope)) {
|
||||||
|
@ -254,6 +261,13 @@ class PDOMCPPLinkage extends PDOMLinkage {
|
||||||
}
|
}
|
||||||
// so if the binding is from another pdom it has to be adapted.
|
// so if the binding is from another pdom it has to be adapted.
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
// assign names to anonymous types.
|
||||||
|
binding= PDOMASTAdapter.getAdapterIfAnonymous(binding);
|
||||||
|
if (binding == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PDOMNode parent = getAdaptedParent(binding);
|
PDOMNode parent = getAdaptedParent(binding);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
* Copyright (c) 2006, 2007 Wind River Systems, Inc. and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -45,6 +45,7 @@ import org.eclipse.cdt.core.model.ICProject;
|
||||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
|
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
|
||||||
import org.eclipse.cdt.internal.core.index.IWritableIndex;
|
import org.eclipse.cdt.internal.core.index.IWritableIndex;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.dom.PDOMASTAdapter;
|
||||||
import org.eclipse.core.filesystem.EFS;
|
import org.eclipse.core.filesystem.EFS;
|
||||||
import org.eclipse.core.resources.IFile;
|
import org.eclipse.core.resources.IFile;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
@ -463,7 +464,10 @@ public abstract class PDOMIndexerTask implements IPDOMIndexerTask {
|
||||||
// names
|
// names
|
||||||
ast.accept(new IndexerASTVisitor() {
|
ast.accept(new IndexerASTVisitor() {
|
||||||
public void visit(IASTName name, IASTName caller) {
|
public void visit(IASTName name, IASTName caller) {
|
||||||
|
// assign a location to anonymous types.
|
||||||
|
name= PDOMASTAdapter.getAdapterIfAnonymous(name);
|
||||||
IASTFileLocation nameLoc = name.getFileLocation();
|
IASTFileLocation nameLoc = name.getFileLocation();
|
||||||
|
|
||||||
if (nameLoc != null) {
|
if (nameLoc != null) {
|
||||||
IIndexFileLocation location = findLocation(nameLoc.getFileName());
|
IIndexFileLocation location = findLocation(nameLoc.getFileName());
|
||||||
addToMap(symbolMap, 2, location, new IASTName[]{name, caller});
|
addToMap(symbolMap, 2, location, new IASTName[]{name, caller});
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (c) 2006 Wind River Systems, Inc. and others.
|
* Copyright (c) 2006, 2007 Wind River Systems, Inc. and others.
|
||||||
* All rights reserved. This program and the accompanying materials
|
* All rights reserved. This program and the accompanying materials
|
||||||
* are made available under the terms of the Eclipse Public License v1.0
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
* which accompanies this distribution, and is available at
|
* which accompanies this distribution, and is available at
|
||||||
|
@ -64,8 +64,13 @@ public class BaseUITestCase extends BaseTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void waitForIndexer(IIndex index, IFile file, int maxmillis) throws Exception {
|
protected void waitForIndexer(IIndex index, IFile file, int maxmillis) throws Exception {
|
||||||
|
boolean firstTime= true;
|
||||||
long endTime= System.currentTimeMillis() + maxmillis;
|
long endTime= System.currentTimeMillis() + maxmillis;
|
||||||
do {
|
while (firstTime || System.currentTimeMillis() < endTime) {
|
||||||
|
if (!firstTime)
|
||||||
|
Thread.sleep(50);
|
||||||
|
firstTime= false;
|
||||||
|
|
||||||
index.acquireReadLock();
|
index.acquireReadLock();
|
||||||
try {
|
try {
|
||||||
IIndexFile pfile= index.getFile(IndexLocationFactory.getWorkspaceIFL(file));
|
IIndexFile pfile= index.getFile(IndexLocationFactory.getWorkspaceIFL(file));
|
||||||
|
@ -76,9 +81,7 @@ public class BaseUITestCase extends BaseTestCase {
|
||||||
finally {
|
finally {
|
||||||
index.releaseReadLock();
|
index.releaseReadLock();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Thread.sleep(50);
|
|
||||||
} while (System.currentTimeMillis() < endTime);
|
|
||||||
throw new Exception("Indexer did not complete in time!");
|
throw new Exception("Indexer did not complete in time!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -132,11 +132,11 @@ public class BasicCallHierarchyTest extends CallHierarchyBaseTest {
|
||||||
doTestEnumerator("enumerator.cpp", "testEnumerator");
|
doTestEnumerator("enumerator.cpp", "testEnumerator");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void _testAnonymousEnumeratorC_156671() throws Exception {
|
public void testAnonymousEnumeratorC_156671() throws Exception {
|
||||||
doTestEnumerator("enumerator.c", "testAnonymousEnumerator");
|
doTestEnumerator("enumerator.c", "testAnonymousEnumerator");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void _testAnonymousEnumeratorCpp_156671() throws Exception {
|
public void testAnonymousEnumeratorCpp_156671() throws Exception {
|
||||||
doTestEnumerator("enumerator.cpp", "testAnonymousEnumerator");
|
doTestEnumerator("enumerator.cpp", "testAnonymousEnumerator");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,14 +178,6 @@ public class BasicCallHierarchyTest extends CallHierarchyBaseTest {
|
||||||
checkTreeNode(tree, 0, "main()");
|
checkTreeNode(tree, 0, "main()");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testStructMembersC() throws Exception {
|
|
||||||
doTestStructMembers("struct_member.c");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testStructMembersCpp() throws Exception {
|
|
||||||
doTestStructMembers("struct_member.cpp");
|
|
||||||
}
|
|
||||||
|
|
||||||
// {testStructMembers}
|
// {testStructMembers}
|
||||||
// struct s1 {
|
// struct s1 {
|
||||||
// int mem1;
|
// int mem1;
|
||||||
|
@ -215,9 +207,56 @@ public class BasicCallHierarchyTest extends CallHierarchyBaseTest {
|
||||||
// i= vt2.mem2; //ref
|
// i= vt2.mem2; //ref
|
||||||
// i= vt3.mem3; //ref
|
// i= vt3.mem3; //ref
|
||||||
// };
|
// };
|
||||||
private void doTestStructMembers(String filename) throws Exception {
|
public void testStructMembersC() throws Exception {
|
||||||
String content = readTaggedComment("testStructMembers");
|
String content = readTaggedComment("testStructMembers");
|
||||||
IFile file= createFile(getProject(), filename, content);
|
IFile file= createFile(getProject(), "struct_member.c", content);
|
||||||
|
waitForIndexer(fIndex, file, 1000);
|
||||||
|
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
|
||||||
|
CEditor editor= (CEditor) IDE.openEditor(page, file);
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem1"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
Tree tree = getCHTreeViewer().getTree();
|
||||||
|
checkTreeNode(tree, 0, "s1::mem1");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem2"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "s2::mem2");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem3"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "(anon)::mem3");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem4"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "s4::mem4");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem5"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "(anon)::mem5");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem1; //ref"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "s1::mem1");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem2; //ref"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "s2::mem2");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem4."), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "s4::mem4");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStructMembersCpp() throws Exception {
|
||||||
|
String content = readTaggedComment("testStructMembers");
|
||||||
|
IFile file= createFile(getProject(), "struct_member.cpp", content);
|
||||||
waitForIndexer(fIndex, file, 1000);
|
waitForIndexer(fIndex, file, 1000);
|
||||||
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
|
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
|
||||||
CEditor editor= (CEditor) IDE.openEditor(page, file);
|
CEditor editor= (CEditor) IDE.openEditor(page, file);
|
||||||
|
@ -262,17 +301,38 @@ public class BasicCallHierarchyTest extends CallHierarchyBaseTest {
|
||||||
checkTreeNode(tree, 0, 0, "main()");
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void _testAnonymousStructMembersC_156671() throws Exception {
|
public void testAnonymousStructMembersC_156671() throws Exception {
|
||||||
doTestAnonymousStructMembers("anon_struct_member.c");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void _testAnonymousStructMembersCpp_156671() throws Exception {
|
|
||||||
doTestAnonymousStructMembers("anon_struct_member.cpp");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void doTestAnonymousStructMembers(String filename) throws Exception {
|
|
||||||
String content = readTaggedComment("testStructMembers");
|
String content = readTaggedComment("testStructMembers");
|
||||||
IFile file= createFile(getProject(), filename, content);
|
IFile file= createFile(getProject(), "anon_struct_member.c", content);
|
||||||
|
waitForIndexer(fIndex, file, 1000);
|
||||||
|
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
|
||||||
|
CEditor editor= (CEditor) IDE.openEditor(page, file);
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem3"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
Tree tree = getCHTreeViewer().getTree();
|
||||||
|
checkTreeNode(tree, 0, "(anon)::mem3");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem5"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "(anon)::mem5");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem3; //ref"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "(anon)::mem3");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem5; //ref"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "(anon)::mem5");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAnonymousStructMembersCpp_156671() throws Exception {
|
||||||
|
String content = readTaggedComment("testStructMembers");
|
||||||
|
IFile file= createFile(getProject(), "anon_struct_member.cpp", content);
|
||||||
waitForIndexer(fIndex, file, 1000);
|
waitForIndexer(fIndex, file, 1000);
|
||||||
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
|
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
|
||||||
CEditor editor= (CEditor) IDE.openEditor(page, file);
|
CEditor editor= (CEditor) IDE.openEditor(page, file);
|
||||||
|
@ -299,15 +359,6 @@ public class BasicCallHierarchyTest extends CallHierarchyBaseTest {
|
||||||
checkTreeNode(tree, 0, 0, "main()");
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void testUnionMembersC() throws Exception {
|
|
||||||
doTestUnionMembers("union_member.c");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testUnionMembersCpp() throws Exception {
|
|
||||||
doTestUnionMembers("union_member.cpp");
|
|
||||||
}
|
|
||||||
|
|
||||||
// {testUnionMembers}
|
// {testUnionMembers}
|
||||||
// union u1 {
|
// union u1 {
|
||||||
// int mem1;
|
// int mem1;
|
||||||
|
@ -342,9 +393,56 @@ public class BasicCallHierarchyTest extends CallHierarchyBaseTest {
|
||||||
// i= vt2.mem2; //ref
|
// i= vt2.mem2; //ref
|
||||||
// i= vt3.mem3; //ref
|
// i= vt3.mem3; //ref
|
||||||
// };
|
// };
|
||||||
private void doTestUnionMembers(String filename) throws Exception {
|
public void testUnionMembersC() throws Exception {
|
||||||
String content = readTaggedComment("testUnionMembers");
|
String content = readTaggedComment("testUnionMembers");
|
||||||
IFile file= createFile(getProject(), filename, content);
|
IFile file= createFile(getProject(), "union_member.c", content);
|
||||||
|
waitForIndexer(fIndex, file, 1000);
|
||||||
|
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
|
||||||
|
CEditor editor= (CEditor) IDE.openEditor(page, file);
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem1"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
Tree tree = getCHTreeViewer().getTree();
|
||||||
|
checkTreeNode(tree, 0, "u1::mem1");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem2"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "u2::mem2");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem3"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "(anon)::mem3");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem4"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "u4::mem4");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem5"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "(anon)::mem5");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem1; //ref"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "u1::mem1");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem2; //ref"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "u2::mem2");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem4."), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "u4::mem4");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testUnionMembersCpp() throws Exception {
|
||||||
|
String content = readTaggedComment("testUnionMembers");
|
||||||
|
IFile file= createFile(getProject(), "union_member.cpp", content);
|
||||||
waitForIndexer(fIndex, file, 1000);
|
waitForIndexer(fIndex, file, 1000);
|
||||||
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
|
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
|
||||||
CEditor editor= (CEditor) IDE.openEditor(page, file);
|
CEditor editor= (CEditor) IDE.openEditor(page, file);
|
||||||
|
@ -389,17 +487,38 @@ public class BasicCallHierarchyTest extends CallHierarchyBaseTest {
|
||||||
checkTreeNode(tree, 0, 0, "main()");
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void _testAnonymousUnionMembersC_156671() throws Exception {
|
public void testAnonymousUnionMembersC_156671() throws Exception {
|
||||||
doTestAnonymousUnionMembers("anon_union_member.c");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void _testAnonymousUnionMembersCpp_156671() throws Exception {
|
|
||||||
doTestAnonymousUnionMembers("anon_union_member.cpp");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void doTestAnonymousUnionMembers(String filename) throws Exception {
|
|
||||||
String content = readTaggedComment("testUnionMembers");
|
String content = readTaggedComment("testUnionMembers");
|
||||||
IFile file= createFile(getProject(), filename, content);
|
IFile file= createFile(getProject(), "anon_union_member.c", content);
|
||||||
|
waitForIndexer(fIndex, file, 1000);
|
||||||
|
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
|
||||||
|
CEditor editor= (CEditor) IDE.openEditor(page, file);
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem3"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
Tree tree = getCHTreeViewer().getTree();
|
||||||
|
checkTreeNode(tree, 0, "(anon)::mem3");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem5"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "(anon)::mem5");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem3; //ref"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "(anon)::mem3");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
|
||||||
|
editor.selectAndReveal(content.indexOf("mem5; //ref"), 0);
|
||||||
|
openCallHierarchy(editor);
|
||||||
|
checkTreeNode(tree, 0, "(anon)::mem5");
|
||||||
|
checkTreeNode(tree, 0, 0, "main()");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAnonymousUnionMembersCpp_156671() throws Exception {
|
||||||
|
String content = readTaggedComment("testUnionMembers");
|
||||||
|
IFile file= createFile(getProject(), "anon_union_member.cpp", content);
|
||||||
waitForIndexer(fIndex, file, 1000);
|
waitForIndexer(fIndex, file, 1000);
|
||||||
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
|
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
|
||||||
CEditor editor= (CEditor) IDE.openEditor(page, file);
|
CEditor editor= (CEditor) IDE.openEditor(page, file);
|
||||||
|
|
|
@ -688,7 +688,8 @@ public class CElementLabels {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isQualifier) {
|
// types cannot be qualified in plain c
|
||||||
|
if (isQualifier && !isCLanguage(parent)) {
|
||||||
int qflags= flags & ~MF_POST_FILE_QUALIFIED;
|
int qflags= flags & ~MF_POST_FILE_QUALIFIED;
|
||||||
getTypeLabel(parent, qflags, buf);
|
getTypeLabel(parent, qflags, buf);
|
||||||
buf.append("::"); //$NON-NLS-1$
|
buf.append("::"); //$NON-NLS-1$
|
||||||
|
@ -731,6 +732,16 @@ public class CElementLabels {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean isCLanguage(ICElement elem) {
|
||||||
|
while (elem != null) {
|
||||||
|
elem= elem.getParent();
|
||||||
|
if (elem instanceof ITranslationUnit) {
|
||||||
|
return ((ITranslationUnit) elem).isCLanguage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert an <code>ASTAccessVisibility</code> into its string representation.
|
* Convert an <code>ASTAccessVisibility</code> into its string representation.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue