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

Proper template support in call hierarchy, bug 240589.

This commit is contained in:
Markus Schorn 2009-10-19 12:11:05 +00:00
parent 0d66821cc1
commit 7c27796dbd
19 changed files with 484 additions and 105 deletions

View file

@ -7,10 +7,13 @@
* *
* Contributors: * Contributors:
* Rational Software - initial implementation * Rational Software - initial implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.model; package org.eclipse.cdt.core.model;
/** /**
* The interface is used to model, class or function templates and their partial or
* explicit specializations.
* @noextend This interface is not intended to be extended by clients. * @noextend This interface is not intended to be extended by clients.
* @noimplement This interface is not intended to be implemented by clients. * @noimplement This interface is not intended to be implemented by clients.
*/ */
@ -21,6 +24,13 @@ public interface ITemplate {
*/ */
String[] getTemplateParameterTypes(); String[] getTemplateParameterTypes();
/**
* Returns the template arguments in a printable format. For templates that are no specialization,
* this will return the names of the template parameters.
* @since 5.2
*/
String[] getTemplateArguments();
/** /**
* Returns the template signature * Returns the template signature
* The signature depends on the type of template. * The signature depends on the type of template.
@ -35,7 +45,6 @@ public interface ITemplate {
/** /**
* Returns the number of template parameters * Returns the number of template parameters
* @return int
*/ */
int getNumberOfTemplateParameters(); int getNumberOfTemplateParameters();
} }

View file

@ -126,6 +126,13 @@ public class CElementBaseLabels {
*/ */
public final static int T_FULLY_QUALIFIED= 1 << 13; public final static int T_FULLY_QUALIFIED= 1 << 13;
/**
* Instances and specializations are qualified with arguments, templates with template parameter names.
* The flag overrides {@link #TEMPLATE_PARAMETERS}.
* @since 5.2
*/
public final static int TEMPLATE_ARGUMENTS= 1 << 14;
/** /**
* Append base class specifications to type names. * Append base class specifications to type names.
* e.g. <code>MyClass : public BaseClass</code> * e.g. <code>MyClass : public BaseClass</code>
@ -358,7 +365,7 @@ public class CElementBaseLabels {
if( getFlag( flags, M_FULLY_QUALIFIED ) ){ if( getFlag( flags, M_FULLY_QUALIFIED ) ){
ICElement parent = method.getParent(); ICElement parent = method.getParent();
if (parent != null && parent.exists() && !(parent instanceof ITranslationUnit)) { if (parent != null && parent.exists() && !(parent instanceof ITranslationUnit)) {
getTypeLabel( parent, T_FULLY_QUALIFIED, buf ); getTypeLabel( parent, T_FULLY_QUALIFIED | (flags & TEMPLATE_ARGUMENTS), buf );
buf.append( "::" ); //$NON-NLS-1$ buf.append( "::" ); //$NON-NLS-1$
} }
} }
@ -417,7 +424,7 @@ public class CElementBaseLabels {
// post qualification // post qualification
if( getFlag(flags, M_POST_QUALIFIED)) { if( getFlag(flags, M_POST_QUALIFIED)) {
buf.append( CONCAT_STRING ); buf.append( CONCAT_STRING );
getTypeLabel( method.getParent(), T_FULLY_QUALIFIED, buf ); getTypeLabel( method.getParent(), T_FULLY_QUALIFIED | (flags & TEMPLATE_ARGUMENTS), buf );
} }
if( getFlag(flags, MF_POST_FILE_QUALIFIED)) { if( getFlag(flags, MF_POST_FILE_QUALIFIED)) {
IPath path= method.getPath(); IPath path= method.getPath();
@ -446,20 +453,26 @@ public class CElementBaseLabels {
} }
private static void getTemplateParameters(ITemplate template, int flags, StringBuffer buf) { private static void getTemplateParameters(ITemplate template, int flags, StringBuffer buf) {
if (getFlag(flags, TEMPLATE_PARAMETERS)) { String[] args= null;
String[] types = template.getTemplateParameterTypes(); if (getFlag(flags, TEMPLATE_ARGUMENTS)) {
args = template.getTemplateArguments();
} else if (getFlag(flags, TEMPLATE_PARAMETERS)) {
args= template.getTemplateParameterTypes();
} else {
return;
}
buf.append('<'); buf.append('<');
if (types != null) { if (args != null) {
for (int i= 0; i < types.length; i++) { for (int i= 0; i < args.length; i++) {
if (i > 0) { if (i > 0) {
buf.append( ',' ); buf.append( ',' );
} }
buf.append( types[i] ); buf.append( args[i] );
} }
} }
buf.append('>'); buf.append('>');
} }
}
/** /**
* Appends the label for a field to a StringBuffer. * Appends the label for a field to a StringBuffer.
@ -479,7 +492,7 @@ public class CElementBaseLabels {
if( getFlag( flags, F_FULLY_QUALIFIED ) ){ if( getFlag( flags, F_FULLY_QUALIFIED ) ){
ICElement parent = field.getParent(); ICElement parent = field.getParent();
if (parent != null && parent.exists()) { if (parent != null && parent.exists()) {
getTypeLabel( parent, T_FULLY_QUALIFIED, buf ); getTypeLabel( parent, T_FULLY_QUALIFIED | (flags & TEMPLATE_PARAMETERS), buf );
buf.append( "::" ); //$NON-NLS-1$ buf.append( "::" ); //$NON-NLS-1$
} }
} }
@ -498,7 +511,7 @@ public class CElementBaseLabels {
// post qualification // post qualification
if( getFlag(flags, F_POST_QUALIFIED)) { if( getFlag(flags, F_POST_QUALIFIED)) {
buf.append( CONCAT_STRING ); buf.append( CONCAT_STRING );
getTypeLabel( field.getParent(), T_FULLY_QUALIFIED, buf ); getTypeLabel( field.getParent(), T_FULLY_QUALIFIED | (flags & TEMPLATE_PARAMETERS), buf );
} }
if( getFlag(flags, MF_POST_FILE_QUALIFIED)) { if( getFlag(flags, MF_POST_FILE_QUALIFIED)) {
IPath path= field.getPath(); IPath path= field.getPath();

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2002, 2008 IBM Corporation and others. * Copyright (c) 2002, 2009 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
@ -33,11 +33,15 @@ public class FunctionTemplate extends Function implements IFunctionTemplate {
return fTemplate.getTemplateParameterTypes(); return fTemplate.getTemplateParameterTypes();
} }
public String[] getTemplateArguments() {
return fTemplate.getTemplateArguments();
}
/** /**
* Sets the template parameter types. * Sets the template parameter types.
*/ */
public void setTemplateParameterTypes(String[] templateParameterTypes) { public void setTemplateParameterTypes(String[] templateParameterTypes) {
fTemplate.setTemplateParameterTypes(templateParameterTypes); fTemplate.setTemplateInfo(templateParameterTypes, null);
} }
/** /**

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2005 QnX Software Systems and others. * Copyright (c) 2005, 2009 QnX Software Systems 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
@ -28,6 +28,10 @@ public class FunctionTemplateDeclaration extends FunctionDeclaration implements
return fTemplate.getTemplateParameterTypes(); return fTemplate.getTemplateParameterTypes();
} }
public String[] getTemplateArguments() {
return fTemplate.getTemplateArguments();
}
public String getTemplateSignature() throws CModelException { public String getTemplateSignature() throws CModelException {
StringBuffer sig = new StringBuffer(fTemplate.getTemplateSignature()); StringBuffer sig = new StringBuffer(fTemplate.getTemplateSignature());
sig.append(this.getParameterClause()); sig.append(this.getParameterClause());
@ -52,7 +56,7 @@ public class FunctionTemplateDeclaration extends FunctionDeclaration implements
* Sets the template parameter types. * Sets the template parameter types.
*/ */
public void setTemplateParameterTypes(String[] templateParameterTypes) { public void setTemplateParameterTypes(String[] templateParameterTypes) {
fTemplate.setTemplateParameterTypes(templateParameterTypes); fTemplate.setTemplateInfo(templateParameterTypes, null);
} }
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2002, 2008 IBM Corporation and others. * Copyright (c) 2002, 2009 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
@ -33,12 +33,16 @@ public class MethodTemplate extends Method implements IMethodTemplate {
return fTemplate.getTemplateParameterTypes(); return fTemplate.getTemplateParameterTypes();
} }
public String[] getTemplateArguments() {
return fTemplate.getTemplateArguments();
}
/** /**
* Sets the fParameterTypes. * Sets the fParameterTypes.
* @param templateParameterTypes The template parameter types to set * @param templateParameterTypes The template parameter types to set
*/ */
public void setTemplateParameterTypes(String[] templateParameterTypes) { public void setTemplateParameterTypes(String[] templateParameterTypes) {
fTemplate.setTemplateParameterTypes(templateParameterTypes); fTemplate.setTemplateInfo(templateParameterTypes, null);
} }
/** /**

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2005 QnX Software Systems and others. * Copyright (c) 2005, 2009 QnX Software Systems 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
@ -28,6 +28,10 @@ public class MethodTemplateDeclaration extends MethodDeclaration implements IMet
return fTemplate.getTemplateParameterTypes(); return fTemplate.getTemplateParameterTypes();
} }
public String[] getTemplateArguments() {
return fTemplate.getTemplateArguments();
}
public String getTemplateSignature() throws CModelException { public String getTemplateSignature() throws CModelException {
StringBuffer sig = new StringBuffer(fTemplate.getTemplateSignature()); StringBuffer sig = new StringBuffer(fTemplate.getTemplateSignature());
sig.append(this.getParameterClause()); sig.append(this.getParameterClause());
@ -54,7 +58,7 @@ public class MethodTemplateDeclaration extends MethodDeclaration implements IMet
* @param templateParameterTypes The template parameter types to set * @param templateParameterTypes The template parameter types to set
*/ */
public void setTemplateParameterTypes(String[] templateParameterTypes) { public void setTemplateParameterTypes(String[] templateParameterTypes) {
fTemplate.setTemplateParameterTypes(templateParameterTypes); fTemplate.setTemplateInfo(templateParameterTypes, null);
} }
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2002, 2008 IBM Corporation and others. * Copyright (c) 2002, 2009 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
@ -31,12 +31,16 @@ public class StructureTemplate extends Structure implements IStructureTemplate {
return fTemplate.getTemplateParameterTypes(); return fTemplate.getTemplateParameterTypes();
} }
public String[] getTemplateArguments() {
return fTemplate.getTemplateArguments();
}
/** /**
* Sets the fParameterTypes. * Sets the fParameterTypes.
* @param templateParameterTypes The template parameter types to set * @param templateParameterTypes The template parameter types to set
*/ */
public void setTemplateParameterTypes(String[] templateParameterTypes) { public void setTemplateParameterTypes(String[] templateParameterTypes) {
fTemplate.setTemplateParameterTypes(templateParameterTypes); fTemplate.setTemplateInfo(templateParameterTypes, null);
} }
/** /**

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2005, 2008 QnX Software Systems and others. * Copyright (c) 2005, 2009 QnX Software Systems 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
@ -29,8 +29,12 @@ public class StructureTemplateDeclaration extends StructureDeclaration implement
return fTemplate.getTemplateParameterTypes(); return fTemplate.getTemplateParameterTypes();
} }
public String[] getTemplateArguments() {
return fTemplate.getTemplateArguments();
}
public void setTemplateParameterTypes(String[] templateParameterTypes) { public void setTemplateParameterTypes(String[] templateParameterTypes) {
fTemplate.setTemplateParameterTypes(templateParameterTypes); fTemplate.setTemplateInfo(templateParameterTypes, null);
} }
public String getTemplateSignature() throws CModelException { public String getTemplateSignature() throws CModelException {
@ -46,9 +50,9 @@ public class StructureTemplateDeclaration extends StructureDeclaration implement
super.getHandleMemento(buff); super.getHandleMemento(buff);
if (fTemplate.getNumberOfTemplateParameters() > 0) { if (fTemplate.getNumberOfTemplateParameters() > 0) {
final String[] parameterTypes= fTemplate.getTemplateParameterTypes(); final String[] parameterTypes= fTemplate.getTemplateParameterTypes();
for (int i = 0; i < parameterTypes.length; i++) { for (String parameterType : parameterTypes) {
buff.append(CEM_PARAMETER); buff.append(CEM_PARAMETER);
escapeMementoName(buff, parameterTypes[i]); escapeMementoName(buff, parameterType);
} }
} }
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2005 QnX Software Systems and others. * Copyright (c) 2005, 2009 QnX Software Systems 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
@ -7,21 +7,22 @@
* *
* Contributors: * Contributors:
* Qnx Software Systems - initial API and implementation * Qnx Software Systems - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.model; package org.eclipse.cdt.internal.core.model;
import org.eclipse.cdt.core.model.ITemplate; import org.eclipse.cdt.core.model.ITemplate;
public class Template implements ITemplate { public class Template implements ITemplate {
protected static final String[] fgEmptyList= {};
protected static final String[] fgEmptyList= new String[] {}; protected String[] fTemplateParameterTypes;
protected String[] templateParameterTypes; protected String[] fTemplateArgs;
protected String fName; protected String fName;
public Template(String name) { public Template(String name) {
fName = name; fName = name;
templateParameterTypes= fgEmptyList; fTemplateParameterTypes= fgEmptyList;
fTemplateArgs= fgEmptyList;
} }
/** /**
* Returns the parameterTypes. * Returns the parameterTypes.
@ -29,22 +30,26 @@ public class Template implements ITemplate {
* @return String[] * @return String[]
*/ */
public String[] getTemplateParameterTypes() { public String[] getTemplateParameterTypes() {
return templateParameterTypes; return fTemplateParameterTypes;
}
public String[] getTemplateArguments() {
return fTemplateArgs;
} }
/** /**
* Sets the fParameterTypes. * Sets the parameter types and template arguments.
* @param templateParameterTypes The template parameter types to set
*/ */
public void setTemplateParameterTypes(String[] templateParameterTypes) { public void setTemplateInfo(String[] templateParameterTypes, String[] args) {
this.templateParameterTypes = templateParameterTypes; if (templateParameterTypes != null)
fTemplateParameterTypes = templateParameterTypes;
if (args != null) {
fTemplateArgs= args;
}
} }
/**
* @see org.eclipse.cdt.core.model.ITemplate#getNumberOfTemplateParameters()
*/
public int getNumberOfTemplateParameters() { public int getNumberOfTemplateParameters() {
return templateParameterTypes == null ? 0 : templateParameterTypes.length; return fTemplateParameterTypes == null ? 0 : fTemplateParameterTypes.length;
} }
/** /**
@ -68,5 +73,4 @@ public class Template implements ITemplate {
} }
return sig.toString(); return sig.toString();
} }
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2002, 2006 IBM Corporation and others. * Copyright (c) 2002, 2009 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,6 +37,10 @@ public class VariableTemplate extends Variable implements ITemplate {
return templateParameterTypes; return templateParameterTypes;
} }
public String[] getTemplateArguments() {
return fgEmptyList;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.model.ITemplate#setTemplateParameterTypes(java.lang.String[]) * @see org.eclipse.cdt.core.model.ITemplate#setTemplateParameterTypes(java.lang.String[])
*/ */

View file

@ -22,9 +22,14 @@ import org.eclipse.cdt.core.dom.ast.IParameter;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
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.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.index.IIndexMacro; import org.eclipse.cdt.core.index.IIndexMacro;
import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.ITranslationUnit;
@ -73,12 +78,21 @@ public class CElementHandleFactory {
element= definition element= definition
? new MethodHandle(parentElement, (ICPPMethod) binding) ? new MethodHandle(parentElement, (ICPPMethod) binding)
: new MethodDeclarationHandle(parentElement, (ICPPMethod) binding); : new MethodDeclarationHandle(parentElement, (ICPPMethod) binding);
} } else if (binding instanceof IFunction) {
else if (binding instanceof IFunction) { if (binding instanceof ICPPTemplateInstance) {
element= definition
? new FunctionTemplateHandle(parentElement, (ICPPTemplateInstance) binding)
: new FunctionTemplateDeclarationHandle(parentElement, (ICPPTemplateInstance) binding);
} else if (binding instanceof ICPPFunctionTemplate) {
element= definition
? new FunctionTemplateHandle(parentElement, (ICPPFunctionTemplate) binding)
: new FunctionTemplateDeclarationHandle(parentElement, (ICPPFunctionTemplate) binding);
} else {
element= definition element= definition
? new FunctionHandle(parentElement, (IFunction) binding) ? new FunctionHandle(parentElement, (IFunction) binding)
: new FunctionDeclarationHandle(parentElement, (IFunction) binding); : new FunctionDeclarationHandle(parentElement, (IFunction) binding);
} }
}
else if (binding instanceof IField) { else if (binding instanceof IField) {
element= new FieldHandle(parentElement, (IField) binding); element= new FieldHandle(parentElement, (IField) binding);
} }
@ -95,12 +109,7 @@ public class CElementHandleFactory {
element= new EnumeratorHandle(parentElement, (IEnumerator) binding); element= new EnumeratorHandle(parentElement, (IEnumerator) binding);
} }
else if (binding instanceof ICompositeType) { else if (binding instanceof ICompositeType) {
if (binding instanceof ICPPClassTemplate) { element= createHandleForComposite(parentElement, (ICompositeType) binding);
element= new StructureTemplateHandle(parentElement, (ICompositeType) binding);
}
else {
element= new StructureHandle(parentElement, (ICompositeType) binding);
}
} }
else if (binding instanceof ICPPNamespace) { else if (binding instanceof ICPPNamespace) {
element= new NamespaceHandle(parentElement, (ICPPNamespace) binding); element= new NamespaceHandle(parentElement, (ICPPNamespace) binding);
@ -139,9 +148,27 @@ public class CElementHandleFactory {
if (parentBinding instanceof ICompositeType) { if (parentBinding instanceof ICompositeType) {
ICElement grandParent= createParent(tu, parentBinding); ICElement grandParent= createParent(tu, parentBinding);
if (grandParent != null) { if (grandParent != null) {
return new StructureHandle(grandParent, (ICompositeType) parentBinding); return createHandleForComposite(grandParent, (ICompositeType) parentBinding);
} }
} }
return null; return null;
} }
private static CElementHandle createHandleForComposite(ICElement parent, ICompositeType classBinding)
throws DOMException {
if (classBinding instanceof ICPPClassTemplatePartialSpecialization) {
return new StructureTemplateHandle(parent, (ICPPClassTemplatePartialSpecialization) classBinding);
}
if (classBinding instanceof ICPPClassTemplate) {
return new StructureTemplateHandle(parent, (ICPPClassTemplate) classBinding);
}
if (classBinding instanceof ICPPClassSpecialization) {
ICPPClassSpecialization spec= (ICPPClassSpecialization) classBinding;
ICPPClassType orig= spec.getSpecializedBinding();
if (orig instanceof ICPPClassTemplate) {
return new StructureTemplateHandle(parent, (ICPPClassSpecialization) classBinding, (ICPPClassTemplate) orig);
}
}
return new StructureHandle(parent, classBinding);
}
} }

View file

@ -0,0 +1,73 @@
/*******************************************************************************
* Copyright (c) 2009 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.model.ext;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IFunctionTemplateDeclaration;
import org.eclipse.cdt.internal.core.model.Template;
public class FunctionTemplateDeclarationHandle extends FunctionDeclarationHandle implements IFunctionTemplateDeclaration {
Template fTemplate;
public FunctionTemplateDeclarationHandle(ICElement parent, ICPPFunctionTemplate func) throws DOMException {
this(parent, ICElement.C_TEMPLATE_FUNCTION_DECLARATION, func);
}
public FunctionTemplateDeclarationHandle(ICElement parent, ICPPTemplateInstance func) throws DOMException {
this(parent, ICElement.C_TEMPLATE_FUNCTION_DECLARATION, func);
}
protected FunctionTemplateDeclarationHandle(ICElement parent, int type, ICPPFunctionTemplate func) throws DOMException {
super(parent, type, func);
fTemplate= new Template(func.getName());
ICPPTemplateParameter[] tpars = func.getTemplateParameters();
String[] args= new String[tpars.length];
for (int i = 0; i < args.length; i++) {
args[i]= tpars[i].getName();
}
fTemplate.setTemplateInfo(null, args);
}
protected FunctionTemplateDeclarationHandle(ICElement parent, int type, ICPPTemplateInstance func) throws DOMException {
super(parent, type, (IFunction) func);
fTemplate= new Template(func.getName());
ICPPTemplateArgument[] targs = func.getTemplateArguments();
String[] args= new String[targs.length];
for (int i = 0; i < args.length; i++) {
args[i]= ASTTypeUtil.getArgumentString(targs[i], false);
}
fTemplate.setTemplateInfo(null, args);
}
public String[] getTemplateArguments() {
return fTemplate.getTemplateArguments();
}
public int getNumberOfTemplateParameters() {
return fTemplate.getNumberOfTemplateParameters();
}
public String[] getTemplateParameterTypes() {
return fTemplate.getTemplateParameterTypes();
}
public String getTemplateSignature() throws CModelException {
return fTemplate.getTemplateSignature();
}
}

View file

@ -0,0 +1,28 @@
/*******************************************************************************
* Copyright (c) 2009 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.model.ext;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IFunctionTemplate;
public class FunctionTemplateHandle extends FunctionTemplateDeclarationHandle implements IFunctionTemplate {
public FunctionTemplateHandle(ICElement parent, ICPPFunctionTemplate func) throws DOMException {
super(parent, ICElement.C_TEMPLATE_FUNCTION, func);
}
public FunctionTemplateHandle(ICElement parent, ICPPTemplateInstance func) throws DOMException {
super(parent, ICElement.C_TEMPLATE_FUNCTION, func);
}
}

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2007, 2008 Wind River Systems, Inc. and others. * Copyright (c) 2007, 2009 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
@ -9,13 +9,16 @@
* Markus Schorn - initial API and implementation * Markus Schorn - initial API and implementation
* Anton Leherbauer (Wind River Systems) * Anton Leherbauer (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.model.ext; package org.eclipse.cdt.internal.core.model.ext;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap;
import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IStructureTemplate; import org.eclipse.cdt.core.model.IStructureTemplate;
@ -25,19 +28,40 @@ public class StructureTemplateHandle extends StructureHandle implements IStructu
private Template fTemplate; private Template fTemplate;
public StructureTemplateHandle(ICElement parent, ICompositeType classTemplate) throws DOMException { public StructureTemplateHandle(ICElement parent, ICPPClassTemplate classTemplate) throws DOMException {
super(parent, classTemplate); super(parent, classTemplate);
fTemplate= new Template(classTemplate.getName()); fTemplate= new Template(classTemplate.getName());
if (classTemplate instanceof ICPPClassTemplate) { ICPPTemplateParameter[] tpars = classTemplate.getTemplateParameters();
ICPPClassTemplate ct= (ICPPClassTemplate) classTemplate; String[] args= new String[tpars.length];
ICPPTemplateParameter[] tps= ct.getTemplateParameters(); for (int i = 0; i < args.length; i++) {
String[] types= new String[tps.length]; args[i]= tpars[i].getName();
for (int i = 0; i < tps.length; i++) {
ICPPTemplateParameter tp = tps[i];
types[i]= tp.getName();
} }
fTemplate.setTemplateParameterTypes(types); fTemplate.setTemplateInfo(null, args);
} }
public StructureTemplateHandle(ICElement parent, ICPPClassTemplatePartialSpecialization classTemplate) throws DOMException {
super(parent, classTemplate);
fTemplate= new Template(classTemplate.getName());
ICPPTemplateArgument[] targs = classTemplate.getTemplateArguments();
String[] args= new String[targs.length];
for (int i = 0; i < args.length; i++) {
args[i]= ASTTypeUtil.getArgumentString(targs[i], false);
}
fTemplate.setTemplateInfo(null, args);
}
public StructureTemplateHandle(ICElement parent, ICPPClassSpecialization classBinding, ICPPClassTemplate ct) throws DOMException {
super(parent, classBinding);
fTemplate= new Template(classBinding.getName());
ICPPTemplateParameterMap map = classBinding.getTemplateParameterMap();
ICPPTemplateParameter[] tpars = ct.getTemplateParameters();
String[] args= new String[tpars.length];
for (int i = 0; i < tpars.length; i++) {
ICPPTemplateParameter par = tpars[i];
ICPPTemplateArgument arg = map.getArgument(par);
args[i]= arg == null ? par.getName() : ASTTypeUtil.getArgumentString(arg, false);
}
fTemplate.setTemplateInfo(null, args);
} }
public int getNumberOfTemplateParameters() { public int getNumberOfTemplateParameters() {
@ -48,6 +72,10 @@ public class StructureTemplateHandle extends StructureHandle implements IStructu
return fTemplate.getTemplateParameterTypes(); return fTemplate.getTemplateParameterTypes();
} }
public String[] getTemplateArguments() {
return fTemplate.getTemplateArguments();
}
public String getTemplateSignature() throws CModelException { public String getTemplateSignature() throws CModelException {
return fTemplate.getTemplateSignature(); return fTemplate.getTemplateSignature();
} }

View file

@ -263,7 +263,7 @@ public class CallHierarchyBugs extends CallHierarchyBaseTest {
int idx = content.indexOf("Foo(3)"); int idx = content.indexOf("Foo(3)");
editor.selectAndReveal(idx, 0); editor.selectAndReveal(idx, 0);
openCallHierarchy(editor, true); openCallHierarchy(editor, true);
Tree chTree= checkTreeNode(ch, 0, "CSome::Foo(const int &)").getParent(); Tree chTree= checkTreeNode(ch, 0, "CSome<int>::Foo(const int &)").getParent();
TreeItem item= checkTreeNode(chTree, 0, 0, "test()"); TreeItem item= checkTreeNode(chTree, 0, 0, "test()");
checkTreeNode(chTree, 0, 1, null); checkTreeNode(chTree, 0, 1, null);
} }

View file

@ -375,4 +375,94 @@ public class CppCallHierarchyTest extends CallHierarchyBaseTest {
checkTreeNode(node, 0, "cfunc()"); checkTreeNode(node, 0, "cfunc()");
checkTreeNode(node, 1, null); checkTreeNode(node, 1, null);
} }
// template<typename T> void f(T t) {}
// template<> void f(int t) {}
//
// template<typename T> class CT {
// public:
// void m() {};
// };
// template<typename T> class CT<T*> {
// public:
// void m() {};
// };
// template<> class CT<char> {
// public:
// void m() {}
// };
//
// void testint() {
// CT<int> ci;
// ci.m();
// f(1);
// }
//
// void testintptr() {
// CT<int*> ci;
// ci.m();
// int i= 1;
// f(&i);
// }
//
// void testchar() {
// CT<char> ci;
// ci.m();
// f('1');
// }
public void testTemplates() throws Exception {
StringBuffer[] content= getContentsForTest(1);
String source = content[0].toString();
IFile file= createFile(getProject(), "testTemplates.cpp", source);
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
CEditor editor= openEditor(file);
waitForIndexer(fIndex, file, CallHierarchyBaseTest.INDEXER_WAIT_TIME);
CCorePlugin.getIndexManager().joinIndexer(INDEXER_WAIT_TIME, NPM);
int pos= source.indexOf("f(");
editor.selectAndReveal(pos, 1);
openCallHierarchy(editor, true);
Tree tree = getCHTreeViewer().getTree();
checkTreeNode(tree, 0, "f<T>(T)");
checkTreeNode(tree, 0, 0, "testintptr()");
checkTreeNode(tree, 0, 1, "testint()");
checkTreeNode(tree, 0, 2, null);
pos= source.indexOf("f(", pos+1);
editor.selectAndReveal(pos, 1);
openCallHierarchy(editor, true);
tree = getCHTreeViewer().getTree();
checkTreeNode(tree, 0, "f<char>(char)");
checkTreeNode(tree, 0, 0, "testchar()");
checkTreeNode(tree, 0, 1, null);
pos= source.indexOf("m(", pos+1);
editor.selectAndReveal(pos, 1);
openCallHierarchy(editor, true);
tree = getCHTreeViewer().getTree();
checkTreeNode(tree, 0, "CT<T>::m()");
checkTreeNode(tree, 0, 0, "testint()");
checkTreeNode(tree, 0, 1, null);
pos= source.indexOf("m(", pos+1);
editor.selectAndReveal(pos, 1);
openCallHierarchy(editor, true);
tree = getCHTreeViewer().getTree();
checkTreeNode(tree, 0, "CT<T*>::m()");
checkTreeNode(tree, 0, 0, "testintptr()");
checkTreeNode(tree, 0, 1, null);
pos= source.indexOf("m(", pos+1);
editor.selectAndReveal(pos, 1);
openCallHierarchy(editor, true);
tree = getCHTreeViewer().getTree();
checkTreeNode(tree, 0, "CT<char>::m()");
checkTreeNode(tree, 0, 0, "testchar()");
checkTreeNode(tree, 0, 1, null);
}
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2008 Wind River Systems, Inc. and others. * Copyright (c) 2006, 2009 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
@ -11,7 +11,6 @@
package org.eclipse.cdt.internal.ui.callhierarchy; package org.eclipse.cdt.internal.ui.callhierarchy;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.IColorProvider;
@ -33,10 +32,11 @@ import org.eclipse.cdt.internal.ui.viewsupport.CUILabelProvider;
import org.eclipse.cdt.internal.ui.viewsupport.ImageImageDescriptor; import org.eclipse.cdt.internal.ui.viewsupport.ImageImageDescriptor;
public class CHLabelProvider extends LabelProvider implements IColorProvider { public class CHLabelProvider extends LabelProvider implements IColorProvider {
private final static int LABEL_OPTIONS_SIMPLE= CElementBaseLabels.ALL_FULLY_QUALIFIED | CElementBaseLabels.M_PARAMETER_TYPES; private final static int LABEL_OPTIONS_SIMPLE = CElementBaseLabels.ALL_FULLY_QUALIFIED
| CElementBaseLabels.M_PARAMETER_TYPES | CElementBaseLabels.TEMPLATE_ARGUMENTS;
private final static int LABEL_OPTIONS_SHOW_FILES= LABEL_OPTIONS_SIMPLE | CElementBaseLabels.MF_POST_FILE_QUALIFIED; private final static int LABEL_OPTIONS_SHOW_FILES= LABEL_OPTIONS_SIMPLE | CElementBaseLabels.MF_POST_FILE_QUALIFIED;
private CUILabelProvider fCLabelProvider= new CUILabelProvider(LABEL_OPTIONS_SIMPLE, 0); private CUILabelProvider fCLabelProvider= new CUILabelProvider(LABEL_OPTIONS_SIMPLE, CElementImageProvider.OVERLAY_ICONS);
private CHContentProvider fContentProvider; private CHContentProvider fContentProvider;
private HashMap<String, Image> fCachedImages= new HashMap<String, Image>(); private HashMap<String, Image> fCachedImages= new HashMap<String, Image>();
private Color fColorInactive; private Color fColorInactive;
@ -118,8 +118,7 @@ public class CHLabelProvider extends LabelProvider implements IColorProvider {
@Override @Override
public void dispose() { public void dispose() {
fCLabelProvider.dispose(); fCLabelProvider.dispose();
for (Iterator<Image> iter = fCachedImages.values().iterator(); iter.hasNext();) { for (Image image : fCachedImages.values()) {
Image image = iter.next();
image.dispose(); image.dispose();
} }
fCachedImages.clear(); fCachedImages.clear();

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2008 Wind River Systems, Inc. and others. * Copyright (c) 2006, 2009 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
@ -12,6 +12,8 @@ package org.eclipse.cdt.internal.ui.callhierarchy;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
@ -20,15 +22,19 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization;
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.ICPPTemplateInstance;
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.IIndexBinding;
import org.eclipse.cdt.core.index.IIndexName; import org.eclipse.cdt.core.index.IIndexName;
import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ISourceReference; import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInstanceCache;
import org.eclipse.cdt.internal.core.model.ext.ICElementHandle; import org.eclipse.cdt.internal.core.model.ext.ICElementHandle;
import org.eclipse.cdt.internal.ui.viewsupport.IndexUI; import org.eclipse.cdt.internal.ui.viewsupport.IndexUI;
@ -75,12 +81,12 @@ public class CHQueries {
final ICProject project = callee.getCProject(); final ICProject project = callee.getCProject();
IIndexBinding calleeBinding= IndexUI.elementToBinding(index, callee, linkageID); IIndexBinding calleeBinding= IndexUI.elementToBinding(index, callee, linkageID);
if (calleeBinding != null) { if (calleeBinding != null) {
findCalledBy(index, calleeBinding, true, project, result); findCalledBy1(index, calleeBinding, true, project, result);
if (calleeBinding instanceof ICPPMethod) { if (calleeBinding instanceof ICPPMethod) {
try { try {
IBinding[] overriddenBindings= ClassTypeHelper.findOverridden((ICPPMethod) calleeBinding); IBinding[] overriddenBindings= ClassTypeHelper.findOverridden((ICPPMethod) calleeBinding);
for (IBinding overriddenBinding : overriddenBindings) { for (IBinding overriddenBinding : overriddenBindings) {
findCalledBy(index, overriddenBinding, false, project, result); findCalledBy1(index, overriddenBinding, false, project, result);
} }
} catch (DOMException e) { } catch (DOMException e) {
// index bindings don't throw DOMExceptions // index bindings don't throw DOMExceptions
@ -89,7 +95,57 @@ public class CHQueries {
} }
} }
private static void findCalledBy(IIndex index, IBinding callee, boolean includeOrdinaryCalls, ICProject project, CalledByResult result) private static void findCalledBy1(IIndex index, IBinding callee, boolean includeOrdinaryCalls,
ICProject project, CalledByResult result) throws CoreException {
findCalledBy2(index, callee, includeOrdinaryCalls, project, result);
List<? extends IBinding> specializations = findSpecializations(callee);
for (IBinding spec : specializations) {
findCalledBy2(index, spec, includeOrdinaryCalls, project, result);
}
}
private static List<? extends IBinding> findSpecializations(IBinding callee) throws CoreException {
try {
List<IBinding> result= null;
IBinding owner = callee.getOwner();
if (owner != null) {
List<? extends IBinding> specializedOwners= findSpecializations(owner);
if (!specializedOwners.isEmpty()) {
result= new ArrayList<IBinding>(specializedOwners.size());
for (IBinding specOwner : specializedOwners) {
if (specOwner instanceof ICPPClassSpecialization) {
result.add(((ICPPClassSpecialization) specOwner).specializeMember(callee));
}
}
}
}
if (callee instanceof ICPPInstanceCache) {
final List<ICPPTemplateInstance> instances= Arrays.asList(((ICPPInstanceCache) callee).getAllInstances());
if (!instances.isEmpty()) {
if (result == null)
result= new ArrayList<IBinding>(instances.size());
for (ICPPTemplateInstance inst : instances) {
if (!IndexFilter.ALL_DECLARED.acceptBinding(inst)) {
result.add(inst);
}
}
}
}
if (result != null) {
return result;
}
} catch (DOMException e) {
}
return Collections.emptyList();
}
private static void findCalledBy2(IIndex index, IBinding callee, boolean includeOrdinaryCalls, ICProject project, CalledByResult result)
throws CoreException { throws CoreException {
IIndexName[] names= index.findNames(callee, IIndex.FIND_REFERENCES | IIndex.SEARCH_ACROSS_LANGUAGE_BOUNDARIES); IIndexName[] names= index.findNames(callee, IIndex.FIND_REFERENCES | IIndex.SEARCH_ACROSS_LANGUAGE_BOUNDARIES);
for (IIndexName rname : names) { for (IIndexName rname : names) {

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2007 Wind River Systems, Inc. and others. * Copyright (c) 2006, 2009 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
@ -8,7 +8,6 @@
* Contributors: * Contributors:
* Markus Schorn - initial API and implementation * Markus Schorn - initial API and implementation
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.ui.callhierarchy; package org.eclipse.cdt.internal.ui.callhierarchy;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -30,6 +29,7 @@ import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.c.ICExternalBinding; import org.eclipse.cdt.core.dom.ast.c.ICExternalBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexManager; import org.eclipse.cdt.core.index.IIndexManager;
import org.eclipse.cdt.core.index.IIndexName; import org.eclipse.cdt.core.index.IIndexName;
@ -164,39 +164,63 @@ public class CallHierarchyUI {
if (elem != null) { if (elem != null) {
return new ICElement[]{elem}; return new ICElement[]{elem};
} }
return NO_ELEMENTS;
} }
else {
ICElement[] elems= IndexUI.findAllDefinitions(index, binding); ICElement[] elems= IndexUI.findAllDefinitions(index, binding);
if (elems.length == 0) { if (elems.length != 0)
ICElement elem= null;
if (name.isDeclaration()) {
elem= IndexUI.getCElementForName(project, index, name);
}
else {
elem= IndexUI.findAnyDeclaration(index, project, binding);
}
if (elem != null) {
elems= new ICElement[]{elem};
}
}
return elems; return elems;
if (name.isDeclaration()) {
ICElementHandle elem= IndexUI.getCElementForName(project, index, name);
if (elem != null) {
return new ICElement[] {elem};
} }
return NO_ELEMENTS;
}
ICElementHandle elem= IndexUI.findAnyDeclaration(index, project, binding);
if (elem != null) {
return new ICElement[]{elem};
}
if (binding instanceof ICPPSpecialization) {
return findSpecializationDeclaration(binding, project, index);
}
return NO_ELEMENTS;
} }
} }
} }
finally { finally {
index.releaseReadLock(); index.releaseReadLock();
} }
} } catch (CoreException e) {
catch (CoreException e) {
CUIPlugin.log(e); CUIPlugin.log(e);
} } catch (InterruptedException e) {
catch (InterruptedException e) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
} }
return NO_ELEMENTS; return NO_ELEMENTS;
} }
private static ICElement[] findSpecializationDeclaration(IBinding binding, ICProject project,
IIndex index) throws CoreException {
while (binding instanceof ICPPSpecialization) {
IBinding original= ((ICPPSpecialization) binding).getSpecializedBinding();
ICElementHandle[] elems= IndexUI.findAllDefinitions(index, original);
if (elems.length == 0) {
ICElementHandle elem= IndexUI.findAnyDeclaration(index, project, original);
if (elem != null) {
elems= new ICElementHandle[]{elem};
}
}
if (elems.length > 0) {
return elems;
}
binding= original;
}
return NO_ELEMENTS;
}
public static ICElement[] findDefinitions(ICElement input) { public static ICElement[] findDefinitions(ICElement input) {
try { try {
final ITranslationUnit tu= CModelUtil.getTranslationUnit(input); final ITranslationUnit tu= CModelUtil.getTranslationUnit(input);