From 0d35254d82c9c89fb74b08fb64b0e6342bd1dac9 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Tue, 31 Jan 2017 19:56:59 -0500 Subject: [PATCH] Bug 511427 - ClassCastException in CompositeCPPClassType.wrapBindings() Change-Id: Id02d59a67b98131aaa4afc8936f89d0985ef93cf --- .../index/composite/CompositeIndexBinding.java | 18 ++++++++++++++++++ .../composite/cpp/CompositeCPPClassType.java | 4 ++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/CompositeIndexBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/CompositeIndexBinding.java index f6c535c1128..71405a40f3e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/CompositeIndexBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/CompositeIndexBinding.java @@ -12,11 +12,14 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.index.composite; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ILinkage; +import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexFile; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.IIndexScope; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.core.runtime.CoreException; /** @@ -130,4 +133,19 @@ public abstract class CompositeIndexBinding implements IIndexBinding { public IIndexBinding getRawBinding() { return rbinding; } + + protected IIndexFragmentBinding adaptBinding(IBinding binding) { + if (binding instanceof IIndexFragmentBinding) { + return (IIndexFragmentBinding) binding; + } + ILinkage linkage = rbinding.getLinkage(); + if (linkage instanceof PDOMLinkage) { + try { + return ((PDOMLinkage) linkage).adaptBinding(binding); + } catch(CoreException e) { + CCorePlugin.log(e); + } + } + return null; + } } 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 3ff0299b711..a394cdc3547 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 @@ -30,7 +30,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration; 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; @@ -213,7 +212,8 @@ class CompositeCPPClassType extends CompositeCPPBinding implements ICPPClassType protected T[] wrapBindings(T[] bindings) { T[] result = Arrays.copyOf(bindings, bindings.length); for (int i= 0; i < bindings.length; i++) { - result[i] = (T) cf.getCompositeBinding((IIndexFragmentBinding) bindings[i]); + // Cannot assume the incoming binding is an index binding in all cases. + result[i] = (T) cf.getCompositeBinding(adaptBinding(bindings[i])); } return result; }