From eb628d737dfa98a5cbfe88358e8e7985c934aa3e Mon Sep 17 00:00:00 2001 From: Andrew Ferguson Date: Thu, 3 May 2007 09:10:48 +0000 Subject: [PATCH] add composite for (ITypedef & ICPPSpecialization) binding --- .../tests/IndexCPPTemplateResolutionTest.java | 39 +++++++++++++++++++ .../core/dom/parser/cpp/CPPClassTemplate.java | 5 ++- .../composite/cpp/CPPCompositesFactory.java | 2 + .../CompositeCPPTypedefSpecialization.java | 31 +++++++++++++++ 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTypedefSpecialization.java diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java index 6ed8008b7d4..0234b1df4d5 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexCPPTemplateResolutionTest.java @@ -15,6 +15,7 @@ import junit.framework.TestSuite; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; @@ -43,6 +44,44 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa suite.addTest(suite(ProjectWithDepProj.class)); } + public IndexCPPTemplateResolutionTest() { + setStrategy(new ReferencedProject(true)); + } + + // template class A { + // public: + // typedef T TD; + // }; + // + // class B {}; + // A::TD foo; + + // class C {}; + // A::TD bar; + // + // void qux() { + // A::TD foo2= foo; + // A::TD bar2= bar; + // } + public void testTypedefSpecialization() { + IBinding b0= getBindingFromASTName("TD foo2", 2); + IBinding b1= getBindingFromASTName("TD bar2", 2); + assertInstance(b0, ITypedef.class); + assertInstance(b1, ITypedef.class); + assertInstance(b0, ICPPSpecialization.class); + assertInstance(b1, ICPPSpecialization.class); + ObjectMap om0= ((ICPPSpecialization)b0).getArgumentMap(); + ObjectMap om1= ((ICPPSpecialization)b1).getArgumentMap(); + assertEquals(1, om0.size()); + assertEquals(1, om1.size()); + assertInstance(om0.keyAt(0), ICPPTemplateTypeParameter.class); + assertInstance(om0.getAt(0), ICPPClassType.class); + assertInstance(om1.keyAt(0), ICPPTemplateTypeParameter.class); + assertInstance(om1.getAt(0), ICPPClassType.class); + assertEquals("B", ((ICPPClassType)om0.getAt(0)).getName()); + assertEquals("C", ((ICPPClassType)om1.getAt(0)).getName()); + } + // template // void foo(X x) {} // diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java index f40a2959ec1..d950b1a199d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java @@ -53,6 +53,7 @@ import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.ObjectSet; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassType.CPPClassTypeProblem; +import org.eclipse.cdt.internal.core.index.IIndexType; /** * @author aniefer @@ -484,8 +485,8 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements public boolean isSameType( IType type ) { if( type == this ) return true; - if( type instanceof ITypedef ) - return ((ITypedef)type).isSameType( this ); + if( type instanceof ITypedef || type instanceof IIndexType) + return type.isSameType( this ); return false; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java index 34f00456503..12aa20e57c8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CPPCompositesFactory.java @@ -207,6 +207,8 @@ public class CPPCompositesFactory extends AbstractCompositeFactory implements IC return new CompositeCPPField(this, (ICPPField) binding); } if(binding instanceof ICPPParameter) { return new CompositeCPPParameterSpecialization(this, (ICPPParameter) binding); + } if(binding instanceof ITypedef) { + return new CompositeCPPTypedefSpecialization(this, (ICPPBinding) binding); } else { throw new CompositingNotImplementedError("composite binding unavailable for "+binding+" "+binding.getClass()); //$NON-NLS-1$ //$NON-NLS-2$ } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTypedefSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTypedefSpecialization.java new file mode 100644 index 00000000000..d3917084fd6 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPTypedefSpecialization.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2007 Symbian Software Systems 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: + * Andrew Ferguson (Symbian) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.index.composite.cpp; + +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; +import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; + +class CompositeCPPTypedefSpecialization extends CompositeCPPTypedef implements ICPPSpecialization { + public CompositeCPPTypedefSpecialization(ICompositesFactory cf, ICPPBinding delegate) { + super(cf, delegate); + } + + public ObjectMap getArgumentMap() { + return TemplateInstanceUtil.getArgumentMap(cf, rbinding); + } + + public IBinding getSpecializedBinding() { + return TemplateInstanceUtil.getSpecializedBinding(cf, rbinding); + } +}