From fa05cfd37d7eb7d9cd9d20850a9fcefeed685919 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 17 Aug 2011 15:50:15 +0200 Subject: [PATCH] Bug 354086: CCE in composite index. --- .../tests/IndexCPPTemplateResolutionTest.java | 36 +++++++++++++++++++ .../core/dom/parser/cpp/ClassTypeHelper.java | 2 +- .../cpp/CompositeCPPClassSpecialization.java | 34 ++++-------------- .../composite/cpp/CompositeCPPClassType.java | 30 +++++----------- 4 files changed, 52 insertions(+), 50 deletions(-) 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 9ccba88bf57..9dbf441cd85 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 @@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IBasicType.Kind; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IFunctionType; import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IScope; @@ -1829,5 +1830,40 @@ public class IndexCPPTemplateResolutionTest extends IndexBindingResolutionTestBa assertTrue(reference instanceof ICPPSpecialization); } + // template struct Base { + // int bfield; + // void bmethod(); + // }; + // template struct XT : Base { + // int field; + // void method() {}; + // friend void f(); + // struct Nested {}; + // }; + // struct TXT : XT {}; + + // TXT x; + public void testClassSpecialization_Bug354086() throws Exception { + ICPPClassType ct= getBindingFromASTName("TXT", 0, ICPPClassType.class); + ICPPMethod[] methods = ct.getAllDeclaredMethods(); + assertEquals(2, methods.length); + + methods= ct.getConstructors(); + assertEquals(2, methods.length); + methods= ct.getMethods(); + assertEquals(14, methods.length); + + ICPPBase[] bases = ct.getBases(); + assertEquals(1, bases.length); + + IField field = ct.findField("bfield"); + assertNotNull(field); + + IField[] fields = ct.getFields(); + assertEquals(2, fields.length); + + IBinding[] friends = ct.getFriends(); + assertEquals(0, friends.length); // not yet supported + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java index 470ab6ec631..9525265030b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ClassTypeHelper.java @@ -425,7 +425,7 @@ public class ClassTypeHelper { IField[] fields = ct.getDeclaredFields(); ICPPClassType[] bases = getAllBases(ct); for (ICPPClassType base : bases) { - fields = (IField[]) ArrayUtil.addAll(IField.class, fields, base.getFields()); + fields = (IField[]) ArrayUtil.addAll(IField.class, fields, base.getDeclaredFields()); } return (IField[]) ArrayUtil.trim(IField.class, fields); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java index ffd39e9dc3d..55690716214 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassSpecialization.java @@ -12,7 +12,6 @@ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.dom.ast.IBinding; -import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; @@ -25,7 +24,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPClassSpecializationScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.cdt.internal.core.index.IIndexFragment; @@ -105,7 +103,7 @@ public class CompositeCPPClassSpecialization extends CompositeCPPClassType imple } @Override - public ICPPBase[] getBases() { + public final ICPPBase[] getBases() { IScope scope= getCompositeScope(); if (scope instanceof ICPPClassSpecializationScope) { return ((ICPPClassSpecializationScope) scope).getBases(); @@ -114,7 +112,7 @@ public class CompositeCPPClassSpecialization extends CompositeCPPClassType imple } @Override - public ICPPConstructor[] getConstructors() { + public final ICPPConstructor[] getConstructors() { IScope scope= getCompositeScope(); if (scope instanceof ICPPClassSpecializationScope) { return ((ICPPClassSpecializationScope) scope).getConstructors(); @@ -123,7 +121,7 @@ public class CompositeCPPClassSpecialization extends CompositeCPPClassType imple } @Override - public ICPPMethod[] getDeclaredMethods() { + public final ICPPMethod[] getDeclaredMethods() { IScope scope= getCompositeScope(); if (scope instanceof ICPPClassSpecializationScope) { return ((ICPPClassSpecializationScope) scope).getDeclaredMethods(); @@ -132,7 +130,7 @@ public class CompositeCPPClassSpecialization extends CompositeCPPClassType imple } @Override - public ICPPField[] getDeclaredFields() { + public final ICPPField[] getDeclaredFields() { IScope scope= getCompositeScope(); if (scope instanceof ICPPClassSpecializationScope) { return ((ICPPClassSpecializationScope) scope).getDeclaredFields(); @@ -141,7 +139,7 @@ public class CompositeCPPClassSpecialization extends CompositeCPPClassType imple } @Override - public IBinding[] getFriends() { + public final IBinding[] getFriends() { IScope scope= getCompositeScope(); if (scope instanceof ICPPClassSpecializationScope) { return ((ICPPClassSpecializationScope) scope).getFriends(); @@ -150,7 +148,7 @@ public class CompositeCPPClassSpecialization extends CompositeCPPClassType imple } @Override - public ICPPClassType[] getNestedClasses() { + public final ICPPClassType[] getNestedClasses() { IScope scope= getCompositeScope(); if (scope instanceof ICPPClassSpecializationScope) { return ((ICPPClassSpecializationScope) scope).getNestedClasses(); @@ -158,26 +156,6 @@ public class CompositeCPPClassSpecialization extends CompositeCPPClassType imple return super.getNestedClasses(); } - @Override - public IField findField(String name) { - return ClassTypeHelper.findField(this, name); - } - - @Override - public ICPPMethod[] getAllDeclaredMethods() { - return ClassTypeHelper.getAllDeclaredMethods(this); - } - - @Override - public IField[] getFields() { - return ClassTypeHelper.getFields(this); - } - - @Override - public ICPPMethod[] getMethods() { - return ClassTypeHelper.getMethods(this); - } - @Deprecated public ObjectMap getArgumentMap() { return TemplateInstanceUtil.getArgumentMap(cf, rbinding); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassType.java index d6a42aecf8e..4050da7c023 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPClassType.java @@ -21,6 +21,7 @@ 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.core.dom.ast.cpp.ICPPScope; +import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; @@ -35,17 +36,12 @@ class CompositeCPPClassType extends CompositeCPPBinding implements ICPPClassType fail(); return null; } - public IField findField(String name) { - IField preResult = ((ICPPClassType)rbinding).findField(name); - return (IField) cf.getCompositeBinding((IIndexFragmentBinding)preResult); + public final IField findField(String name) { + return ClassTypeHelper.findField(this, name); } - public ICPPMethod[] getAllDeclaredMethods() { - ICPPMethod[] result = ((ICPPClassType)rbinding).getAllDeclaredMethods(); - for(int i=0; i