From 17bf8f55f16acd9cc6fe247124abd6cc3866f920 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Wed, 7 May 2014 16:23:49 -0700 Subject: [PATCH] Fixed "UnsupportedOperationException: addMember method should be called instead" error. --- .../AbstractCPPClassSpecializationScope.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java index c523fdf9858..506d56c994e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/AbstractCPPClassSpecializationScope.java @@ -28,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization; +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.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; @@ -114,16 +115,27 @@ public class AbstractCPPClassSpecializationScope implements ICPPClassSpecializat IBinding[] bindings= classScope.getBindings(lookup); IBinding[] result= IBinding.EMPTY_BINDING_ARRAY; + int n = 0; for (IBinding binding : bindings) { if (binding == specialized || - (binding instanceof ICPPClassType && specialized.isSameType((IType) binding))) { + (binding instanceof ICPPClassType && areSameTypesModuloPartialSpecialization(specialized, (IType) binding))) { binding= specialClass; } else { binding= specialClass.specializeMember(binding, lookup.getLookupPoint()); } - result = ArrayUtil.append(result, binding); + result = ArrayUtil.appendAt(result, n++, binding); } - return ArrayUtil.trim(result); + return ArrayUtil.trim(result, n); + } + + private static boolean areSameTypesModuloPartialSpecialization(IType type1, IType type2) { + while (type1 instanceof ICPPClassTemplatePartialSpecialization) { + type1 = ((ICPPClassTemplatePartialSpecialization) type1).getPrimaryClassTemplate(); + } + while (type2 instanceof ICPPClassTemplatePartialSpecialization) { + type2 = ((ICPPClassTemplatePartialSpecialization) type2).getPrimaryClassTemplate(); + } + return type1.isSameType(type2); } @Override