mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-31 21:05:37 +02:00
fixing problems encountered when resolving bindings in some order other than top down
- declarations of template parameters - containing scope of a method
This commit is contained in:
parent
301b9f9cc3
commit
af10bf00cb
21 changed files with 295 additions and 59 deletions
|
@ -858,4 +858,21 @@ public class AST2TemplateTests extends AST2BaseTest {
|
||||||
assertTrue( A1 instanceof ICPPTemplateInstance );
|
assertTrue( A1 instanceof ICPPTemplateInstance );
|
||||||
assertSame( ((ICPPTemplateInstance)A1).getOriginalBinding(), A );
|
assertSame( ((ICPPTemplateInstance)A1).getOriginalBinding(), A );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testTemplateParameterDeclarations() throws Exception {
|
||||||
|
StringBuffer buffer = new StringBuffer();
|
||||||
|
buffer.append( "template <class T> void f( T ); \n"); //$NON-NLS-1$
|
||||||
|
buffer.append( "template <class T> void f( T ) {} \n"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.CPP );
|
||||||
|
CPPNameCollector col = new CPPNameCollector();
|
||||||
|
tu.accept( col );
|
||||||
|
|
||||||
|
ICPPTemplateParameter T1 = (ICPPTemplateParameter) col.getName(4).resolveBinding();
|
||||||
|
ICPPTemplateParameter T2 = (ICPPTemplateParameter) col.getName(2).resolveBinding();
|
||||||
|
|
||||||
|
assertSame( T1, T2 );
|
||||||
|
|
||||||
|
assertInstances( col, T1, 4 );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -213,5 +213,42 @@ public class ArrayUtil {
|
||||||
|
|
||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insert the obj at the beginning of the array, shifting the whole thing one index
|
||||||
|
* @param c
|
||||||
|
* @param array
|
||||||
|
* @param idx
|
||||||
|
* @param obj
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Object[] prepend(Class c, Object[] array, Object obj) {
|
||||||
|
if( obj == null )
|
||||||
|
return array;
|
||||||
|
if( array == null || array.length == 0){
|
||||||
|
array = (Object[]) Array.newInstance( c, DEFAULT_LENGTH );
|
||||||
|
array[0] = obj;
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for( ; i < array.length; i++ ){
|
||||||
|
if( array[i] == null ){
|
||||||
|
array[i] = obj;
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( i < array.length ){
|
||||||
|
System.arraycopy( array, 0, array, 1, array.length - i );
|
||||||
|
array[0] = obj;
|
||||||
|
} else {
|
||||||
|
Object [] temp = (Object[]) Array.newInstance( c, array.length * 2 );
|
||||||
|
System.arraycopy( array, 0, temp, 1, array.length );
|
||||||
|
temp[0] = obj;
|
||||||
|
array = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -384,12 +384,28 @@ public class CPPClassType implements ICPPClassType, ICPPInternalClassType {
|
||||||
|
|
||||||
//keep the lowest offset declaration in [0]
|
//keep the lowest offset declaration in [0]
|
||||||
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
|
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
|
||||||
IASTName temp = declarations[0];
|
declarations = (IASTName[]) ArrayUtil.prepend( IASTName.class, declarations, name );
|
||||||
declarations[0] = name;
|
} else {
|
||||||
node = temp;
|
declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, name );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
if( definition == node ){
|
||||||
|
definition = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if( declarations != null ) {
|
||||||
|
for (int i = 0; i < declarations.length; i++) {
|
||||||
|
if( node == declarations[i] ) {
|
||||||
|
if( i == declarations.length - 1 )
|
||||||
|
declarations[i] = null;
|
||||||
|
else
|
||||||
|
System.arraycopy( declarations, i + 1, declarations, i, declarations.length - 1 - i );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, name );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
|
|
@ -232,6 +232,9 @@ public class CPPDeferredClassInstance /*extends CPPInstance*/ implements
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance#getOriginalBinding()
|
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance#getOriginalBinding()
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -244,6 +244,10 @@ public class CPPDeferredFunctionInstance /*extends CPPInstance*/ implements
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction#isStatic(boolean)
|
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction#isStatic(boolean)
|
||||||
|
|
|
@ -149,5 +149,9 @@ public class CPPDelegate implements ICPPDelegate, ICPPInternalBinding {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -169,6 +169,10 @@ public class CPPEnumeration implements IEnumeration, ICPPInternalBinding, ICPPBi
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IType#isSameType(org.eclipse.cdt.core.dom.ast.IType)
|
* @see org.eclipse.cdt.core.dom.ast.IType#isSameType(org.eclipse.cdt.core.dom.ast.IType)
|
||||||
|
|
|
@ -62,7 +62,8 @@ public class CPPEnumerator implements IEnumerator, ICPPInternalBinding, ICPPBind
|
||||||
public IASTNode getDefinition() {
|
public IASTNode getDefinition() {
|
||||||
return enumName;
|
return enumName;
|
||||||
}
|
}
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
}
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getName()
|
* @see org.eclipse.cdt.core.dom.ast.IBinding#getName()
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -225,12 +225,31 @@ public class CPPFunction implements ICPPFunction, ICPPInternalFunction {
|
||||||
|
|
||||||
//keep the lowest offset declaration in [0]
|
//keep the lowest offset declaration in [0]
|
||||||
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
|
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
|
||||||
ICPPASTFunctionDeclarator temp = declarations[0];
|
declarations = (ICPPASTFunctionDeclarator[]) ArrayUtil.prepend( ICPPASTFunctionDeclarator.class, declarations, dtor );
|
||||||
declarations[0] = dtor;
|
} else {
|
||||||
dtor = temp;
|
declarations = (ICPPASTFunctionDeclarator[]) ArrayUtil.append( ICPPASTFunctionDeclarator.class, declarations, dtor );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
while( node instanceof IASTName ){
|
||||||
|
node = node.getParent();
|
||||||
|
}
|
||||||
|
if( definition == node ){
|
||||||
|
definition = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if( declarations != null ) {
|
||||||
|
for (int i = 0; i < declarations.length; i++) {
|
||||||
|
if( node == declarations[i] ) {
|
||||||
|
if( i == declarations.length - 1 )
|
||||||
|
declarations[i] = null;
|
||||||
|
else
|
||||||
|
System.arraycopy( declarations, i + 1, declarations, i, declarations.length - 1 - i );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
declarations = (ICPPASTFunctionDeclarator[]) ArrayUtil.append( ICPPASTFunctionDeclarator.class, declarations, dtor );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
|
|
@ -94,6 +94,10 @@ public class CPPInstance implements ICPPTemplateInstance {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance#getArguments()
|
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance#getArguments()
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -139,6 +139,9 @@ public class CPPLabel implements ILabel, ICPPInternalBinding, ICPPBinding {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
}
|
}
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,6 +134,14 @@ public class CPPMethod extends CPPFunction implements ICPPMethod {
|
||||||
|
|
||||||
public IScope getScope() {
|
public IScope getScope() {
|
||||||
IASTNode node = (declarations != null && declarations.length > 0) ? declarations[0] : definition;
|
IASTNode node = (declarations != null && declarations.length > 0) ? declarations[0] : definition;
|
||||||
|
if( node instanceof IASTDeclarator ){
|
||||||
|
IASTName name = ((IASTDeclarator)node).getName();
|
||||||
|
if( name instanceof ICPPASTQualifiedName ){
|
||||||
|
IASTName [] ns = ((ICPPASTQualifiedName)name).getNames();
|
||||||
|
name = ns[ ns.length - 1 ];
|
||||||
|
}
|
||||||
|
return CPPVisitor.getContainingScope( name );
|
||||||
|
}
|
||||||
return CPPVisitor.getContainingScope( node );
|
return CPPVisitor.getContainingScope( node );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,8 +182,22 @@ public class CPPMethod extends CPPFunction implements ICPPMethod {
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod#isVirtual()
|
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod#isVirtual()
|
||||||
*/
|
*/
|
||||||
public boolean isVirtual() throws DOMException {
|
public boolean isVirtual() {
|
||||||
// TODO Auto-generated method stub
|
if( definition != null ){
|
||||||
|
IASTNode node = definition.getParent();
|
||||||
|
while( node instanceof IASTDeclarator )
|
||||||
|
node = node.getParent();
|
||||||
|
|
||||||
|
ICPPASTDeclSpecifier declSpec = null;
|
||||||
|
if( node instanceof IASTSimpleDeclaration )
|
||||||
|
declSpec = (ICPPASTDeclSpecifier) ((IASTSimpleDeclaration)node).getDeclSpecifier();
|
||||||
|
else if( node instanceof IASTFunctionDefinition )
|
||||||
|
declSpec = (ICPPASTDeclSpecifier) ((IASTFunctionDefinition)node).getDeclSpecifier();
|
||||||
|
|
||||||
|
if( declSpec != null ){
|
||||||
|
return declSpec.isVirtual();
|
||||||
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -232,12 +232,10 @@ public class CPPNamespace implements ICPPNamespace, ICPPInternalBinding {
|
||||||
}
|
}
|
||||||
|
|
||||||
if( namespaceDefinitions.length > 0 && ((ASTNode)name).getOffset() < ((ASTNode)namespaceDefinitions[0]).getOffset() ){
|
if( namespaceDefinitions.length > 0 && ((ASTNode)name).getOffset() < ((ASTNode)namespaceDefinitions[0]).getOffset() ){
|
||||||
IASTName temp = namespaceDefinitions[0];
|
namespaceDefinitions = (IASTName[]) ArrayUtil.prepend( IASTName.class, namespaceDefinitions, name );
|
||||||
namespaceDefinitions[0] = name;
|
} else {
|
||||||
name = temp;
|
namespaceDefinitions = (IASTName[]) ArrayUtil.append( IASTName.class, namespaceDefinitions, name );
|
||||||
}
|
}
|
||||||
|
|
||||||
namespaceDefinitions = (IASTName[]) ArrayUtil.append( IASTName.class, namespaceDefinitions, name );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
@ -246,5 +244,18 @@ public class CPPNamespace implements ICPPNamespace, ICPPInternalBinding {
|
||||||
public void addDeclaration(IASTNode node) {
|
public void addDeclaration(IASTNode node) {
|
||||||
addDefinition( node );
|
addDefinition( node );
|
||||||
}
|
}
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
if( namespaceDefinitions != null ) {
|
||||||
|
for (int i = 0; i < namespaceDefinitions.length; i++) {
|
||||||
|
if( node == namespaceDefinitions[i] ) {
|
||||||
|
if( i == namespaceDefinitions.length - 1 )
|
||||||
|
namespaceDefinitions[i] = null;
|
||||||
|
else
|
||||||
|
System.arraycopy( namespaceDefinitions, i + 1, namespaceDefinitions, i, namespaceDefinitions.length - 1 - i );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,4 +143,7 @@ public class CPPNamespaceAlias implements ICPPNamespaceAlias, ICPPInternalBindin
|
||||||
*/
|
*/
|
||||||
public void addDeclaration(IASTNode node) {
|
public void addDeclaration(IASTNode node) {
|
||||||
}
|
}
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
|
||||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||||
|
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author aniefer
|
* @author aniefer
|
||||||
|
@ -90,14 +91,30 @@ public class CPPParameter implements ICPPParameter, ICPPInternalBinding {
|
||||||
if( !(node instanceof IASTName ) )
|
if( !(node instanceof IASTName ) )
|
||||||
return;
|
return;
|
||||||
IASTName name = (IASTName) node;
|
IASTName name = (IASTName) node;
|
||||||
if( declarations == null ){
|
if( declarations == null )
|
||||||
declarations = new IASTName [] { name };
|
declarations = new IASTName[] { name };
|
||||||
return;
|
else {
|
||||||
}
|
//keep the lowest offset declaration in [0]
|
||||||
|
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
|
||||||
declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, name );
|
declarations = (IASTName[]) ArrayUtil.prepend( IASTName.class, declarations, name );
|
||||||
|
} else {
|
||||||
|
declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, name );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
if( declarations != null ) {
|
||||||
|
for (int i = 0; i < declarations.length; i++) {
|
||||||
|
if( node == declarations[i] ) {
|
||||||
|
if( i == declarations.length - 1 )
|
||||||
|
declarations[i] = null;
|
||||||
|
else
|
||||||
|
System.arraycopy( declarations, i + 1, declarations, i, declarations.length - 1 - i );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
private IASTName getPrimaryDeclaration(){
|
private IASTName getPrimaryDeclaration(){
|
||||||
if( declarations != null ){
|
if( declarations != null ){
|
||||||
for( int i = 0; i < declarations.length && declarations[i] != null; i++ ){
|
for( int i = 0; i < declarations.length && declarations[i] != null; i++ ){
|
||||||
|
|
|
@ -41,6 +41,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
|
||||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||||
|
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
|
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -365,13 +366,35 @@ public abstract class CPPTemplateDefinition implements ICPPTemplateDefinition, I
|
||||||
return;
|
return;
|
||||||
IASTName declName = (IASTName) node;
|
IASTName declName = (IASTName) node;
|
||||||
updateTemplateParameterBindings( declName );
|
updateTemplateParameterBindings( declName );
|
||||||
if( declarations == null ){
|
if( declarations == null )
|
||||||
declarations = new IASTName [] { declName };
|
declarations = new IASTName[] { declName };
|
||||||
return;
|
else {
|
||||||
}
|
//keep the lowest offset declaration in [0]
|
||||||
declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, declName );
|
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
|
||||||
|
declarations = (IASTName[]) ArrayUtil.prepend( IASTName.class, declarations, declName );
|
||||||
|
} else {
|
||||||
|
declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, declName );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
if( definition == node ){
|
||||||
|
definition = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if( declarations != null ) {
|
||||||
|
for (int i = 0; i < declarations.length; i++) {
|
||||||
|
if( node == declarations[i] ) {
|
||||||
|
if( i == declarations.length - 1 )
|
||||||
|
declarations[i] = null;
|
||||||
|
else
|
||||||
|
System.arraycopy( declarations, i + 1, declarations, i, declarations.length - 1 - i );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
protected void updateTemplateParameterBindings( IASTName name ){
|
protected void updateTemplateParameterBindings( IASTName name ){
|
||||||
IASTName orig = definition != null ? definition : declarations[0];
|
IASTName orig = definition != null ? definition : declarations[0];
|
||||||
ICPPASTTemplateDeclaration origTemplate = CPPTemplates.getTemplateDeclaration( orig );
|
ICPPASTTemplateDeclaration origTemplate = CPPTemplates.getTemplateDeclaration( orig );
|
||||||
|
|
|
@ -17,9 +17,10 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||||
import org.eclipse.cdt.core.dom.ast.IType;
|
import org.eclipse.cdt.core.dom.ast.IType;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||||
|
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||||
|
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author aniefer
|
* @author aniefer
|
||||||
|
@ -65,20 +66,6 @@ public class CPPTemplateParameter implements ICPPTemplateParameter, ICPPInternal
|
||||||
return CPPVisitor.getContainingScope( getPrimaryDeclaration () );
|
return CPPVisitor.getContainingScope( getPrimaryDeclaration () );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#isTemplateInstance()
|
|
||||||
*/
|
|
||||||
public boolean isTemplateInstance() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
|
||||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getTemplatedBinding()
|
|
||||||
*/
|
|
||||||
public ICPPBinding getTemplatedBinding() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedName()
|
* @see org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding#getQualifiedName()
|
||||||
*/
|
*/
|
||||||
|
@ -114,6 +101,8 @@ public class CPPTemplateParameter implements ICPPTemplateParameter, ICPPInternal
|
||||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDefinition()
|
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#getDefinition()
|
||||||
*/
|
*/
|
||||||
public IASTNode getDefinition() {
|
public IASTNode getDefinition() {
|
||||||
|
if( declarations != null && declarations.length > 0 )
|
||||||
|
return declarations[0];
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,15 +118,39 @@ public class CPPTemplateParameter implements ICPPTemplateParameter, ICPPInternal
|
||||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDefinition(org.eclipse.cdt.core.dom.ast.IASTNode)
|
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDefinition(org.eclipse.cdt.core.dom.ast.IASTNode)
|
||||||
*/
|
*/
|
||||||
public void addDefinition(IASTNode node) {
|
public void addDefinition(IASTNode node) {
|
||||||
// TODO Auto-generated method stub
|
addDeclaration( node );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDeclaration(org.eclipse.cdt.core.dom.ast.IASTNode)
|
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDeclaration(org.eclipse.cdt.core.dom.ast.IASTNode)
|
||||||
*/
|
*/
|
||||||
public void addDeclaration(IASTNode node) {
|
public void addDeclaration(IASTNode node) {
|
||||||
// TODO Auto-generated method stub
|
if( !(node instanceof IASTName) )
|
||||||
|
return;
|
||||||
|
IASTName name = (IASTName) node;
|
||||||
|
if( declarations == null )
|
||||||
|
declarations = new IASTName[] { name };
|
||||||
|
else {
|
||||||
|
//keep the lowest offset declaration in [0]
|
||||||
|
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
|
||||||
|
IASTName temp = declarations[0];
|
||||||
|
declarations[0] = name;
|
||||||
|
name = temp;
|
||||||
|
}
|
||||||
|
declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, name );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
if( declarations != null ) {
|
||||||
|
for (int i = 0; i < declarations.length; i++) {
|
||||||
|
if( node == declarations[i] ) {
|
||||||
|
if( i == declarations.length - 1 )
|
||||||
|
declarations[i] = null;
|
||||||
|
else
|
||||||
|
System.arraycopy( declarations, i + 1, declarations, i, declarations.length - 1 - i );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -557,8 +557,12 @@ public class CPPTemplates {
|
||||||
this.bindings = bindings;
|
this.bindings = bindings;
|
||||||
}
|
}
|
||||||
public int visit(IASTName name) {
|
public int visit(IASTName name) {
|
||||||
if( name.getBinding() != null && bindings.containsKey( name.getBinding() ) )
|
if( name.getBinding() != null && bindings.containsKey( name.getBinding() ) ){
|
||||||
|
IBinding binding = name.getBinding();
|
||||||
|
if( binding instanceof ICPPInternalBinding )
|
||||||
|
((ICPPInternalBinding)binding).removeDeclaration( name );
|
||||||
name.setBinding( null );
|
name.setBinding( null );
|
||||||
|
}
|
||||||
return PROCESS_CONTINUE;
|
return PROCESS_CONTINUE;
|
||||||
}
|
}
|
||||||
public int visit(IASTStatement statement) {
|
public int visit(IASTStatement statement) {
|
||||||
|
@ -590,6 +594,7 @@ public class CPPTemplates {
|
||||||
if( bindingsToClear == null )
|
if( bindingsToClear == null )
|
||||||
bindingsToClear = new ObjectSet( templateParams.length );
|
bindingsToClear = new ObjectSet( templateParams.length );
|
||||||
tn.setBinding( defParams[i] );
|
tn.setBinding( defParams[i] );
|
||||||
|
((ICPPInternalBinding)defParams[i]).addDeclaration( tn );
|
||||||
bindingsToClear.put( defParams[i] );
|
bindingsToClear.put( defParams[i] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -641,7 +646,7 @@ public class CPPTemplates {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( bindingsToClear != null ){
|
if( bindingsToClear != null && !result ){
|
||||||
ClearBindingAction action = new ClearBindingAction( bindingsToClear );
|
ClearBindingAction action = new ClearBindingAction( bindingsToClear );
|
||||||
templateDecl.accept( action );
|
templateDecl.accept( action );
|
||||||
}
|
}
|
||||||
|
|
|
@ -191,11 +191,24 @@ public class CPPTypedef implements ITypedef, ITypeContainer, ICPPInternalBinding
|
||||||
else {
|
else {
|
||||||
//keep the lowest offset declaration in [0]
|
//keep the lowest offset declaration in [0]
|
||||||
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
|
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
|
||||||
IASTName temp = declarations[0];
|
declarations = (IASTName[]) ArrayUtil.prepend( IASTName.class, declarations, name );
|
||||||
declarations[0] = name;
|
} else {
|
||||||
name = temp;
|
declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, name );
|
||||||
}
|
}
|
||||||
declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, name );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
if( declarations != null ) {
|
||||||
|
for (int i = 0; i < declarations.length; i++) {
|
||||||
|
if( node == declarations[i] ) {
|
||||||
|
if( i == declarations.length - 1 )
|
||||||
|
declarations[i] = null;
|
||||||
|
else
|
||||||
|
System.arraycopy( declarations, i + 1, declarations, i, declarations.length - 1 - i );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,13 +150,30 @@ public class CPPVariable implements ICPPVariable, ICPPInternalBinding {
|
||||||
else {
|
else {
|
||||||
//keep the lowest offset declaration in [0]
|
//keep the lowest offset declaration in [0]
|
||||||
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
|
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
|
||||||
IASTName temp = declarations[0];
|
declarations = (IASTName[]) ArrayUtil.prepend( IASTName.class, declarations, name );
|
||||||
declarations[0] = name;
|
} else {
|
||||||
name = temp;
|
declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, name );
|
||||||
}
|
}
|
||||||
declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, name );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeDeclaration(IASTNode node) {
|
||||||
|
if( node == definition ){
|
||||||
|
definition = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if( declarations != null ) {
|
||||||
|
for (int i = 0; i < declarations.length; i++) {
|
||||||
|
if( node == declarations[i] ) {
|
||||||
|
if( i == declarations.length - 1 )
|
||||||
|
declarations[i] = null;
|
||||||
|
else
|
||||||
|
System.arraycopy( declarations, i + 1, declarations, i, declarations.length - 1 - i );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPBinding#getDeclarations()
|
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPBinding#getDeclarations()
|
||||||
*/
|
*/
|
||||||
|
@ -339,5 +356,4 @@ public class CPPVariable implements ICPPVariable, ICPPInternalBinding {
|
||||||
public boolean isRegister() {
|
public boolean isRegister() {
|
||||||
return hasStorageClass( IASTDeclSpecifier.sc_register );
|
return hasStorageClass( IASTDeclSpecifier.sc_register );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,4 +36,5 @@ public interface ICPPInternalBinding extends IBinding {
|
||||||
*/
|
*/
|
||||||
void addDefinition( IASTNode node );
|
void addDefinition( IASTNode node );
|
||||||
void addDeclaration( IASTNode node );
|
void addDeclaration( IASTNode node );
|
||||||
|
void removeDeclaration(IASTNode node);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue