diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPEnumScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPEnumScope.java new file mode 100644 index 00000000000..11f553ea12f --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPEnumScope.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2014 Nathan Ridge. + * 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: + * Nathan Ridge - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.dom.ast.cpp; + +/** + * Interface for enumeration scopes. + * + * @noimplement This interface is not intended to be implemented by clients. + * @noextend This interface is not intended to be extended by clients. + */ +public interface ICPPEnumScope extends ICPPScope { + /** + * Returns the binding for the enumeration this scope is associated with. + */ + ICPPEnumeration getEnumerationType(); +} \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumScope.java index c176ea88493..c4ec4254f78 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumScope.java @@ -12,12 +12,17 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.IName; import org.eclipse.cdt.core.dom.ast.EScopeKind; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.ISemanticProblem; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumeration; /** * Implementation of namespace scopes, including global scope. */ -public class CPPEnumScope extends CPPScope { +public class CPPEnumScope extends CPPScope implements ICPPEnumScope { public CPPEnumScope(ICPPASTEnumerationSpecifier specifier) { super(specifier); } @@ -32,4 +37,15 @@ public class CPPEnumScope extends CPPScope { ICPPASTEnumerationSpecifier node = (ICPPASTEnumerationSpecifier) getPhysicalNode(); return node.getName(); } + + @Override + public ICPPEnumeration getEnumerationType() { + ICPPASTEnumerationSpecifier node = (ICPPASTEnumerationSpecifier) getPhysicalNode(); + final IASTName name = node.getName(); + IBinding binding = name.resolveBinding(); + if (binding instanceof ICPPEnumeration) + return (ICPPEnumeration) binding; + + return new CPPEnumeration.CPPEnumerationProblem(name, ISemanticProblem.BINDING_NO_CLASS, name.toCharArray()); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumeration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumeration.java index e595d99b1a2..66906a7dc1c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumeration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumeration.java @@ -41,6 +41,7 @@ import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.Linkage; +import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil; import org.eclipse.core.runtime.PlatformObject; @@ -51,6 +52,37 @@ import org.eclipse.core.runtime.PlatformObject; public class CPPEnumeration extends PlatformObject implements ICPPEnumeration, ICPPInternalBinding { private static final IASTName NOT_INITIALIZED = CPPASTName.NOT_INITIALIZED; private static final IEnumerator[] EMPTY_ENUMERATORS = {}; + + public static class CPPEnumerationProblem extends ProblemBinding implements ICPPEnumeration, ICPPScope { + public CPPEnumerationProblem(IASTNode node, int id, char[] arg) { + super(node, id, arg); + } + @Override + public IEnumerator[] getEnumerators() { + return EMPTY_ENUMERATORS; + } + @Override + public long getMinValue() { + return 0; + } + @Override + public long getMaxValue() { + return 0; + } + @Override + public boolean isScoped() { + return false; + } + @Override + public IType getFixedType() { + return null; + } + @Override + public ICPPScope asScope() { + return this; + } + + } private final boolean fIsScoped; private final IType fFixedType; 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 0a2dcc5e5e3..46903a3bcb7 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 @@ -32,6 +32,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplatePartialSpecializationSpecialization; 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.ICPPEnumScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumeration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; @@ -122,6 +123,10 @@ public class CPPCompositesFactory extends AbstractCompositeFactory { ICPPClassScope classScope = (ICPPClassScope) rscope; return new CompositeCPPClassScope(this, findOneBinding(classScope.getClassType())); } + if (rscope instanceof ICPPEnumScope) { + ICPPEnumScope enumScope = (ICPPEnumScope) rscope; + return new CompositeCPPEnumScope(this, findOneBinding(enumScope.getEnumerationType())); + } if (rscope instanceof ICPPNamespaceScope) { ICPPNamespace[] namespaces; if (rscope instanceof CompositeCPPNamespace) { @@ -131,7 +136,7 @@ public class CPPCompositesFactory extends AbstractCompositeFactory { namespaces = getNamespaces(rscope.getScopeBinding()); } return new CompositeCPPNamespaceScope(this, namespaces); - } + } throw new CompositingNotImplementedError(rscope.getClass().getName()); } catch (CoreException e) { CCorePlugin.log(e); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPEnumScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPEnumScope.java index 8933319fb05..929dfdc0d80 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPEnumScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/composite/cpp/CompositeCPPEnumScope.java @@ -13,15 +13,15 @@ package org.eclipse.cdt.internal.core.index.composite.cpp; import org.eclipse.cdt.core.dom.ast.EScopeKind; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumeration; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding; import org.eclipse.cdt.internal.core.index.composite.CompositeScope; import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory; -class CompositeCPPEnumScope extends CompositeScope implements ICPPScope { +class CompositeCPPEnumScope extends CompositeScope implements ICPPEnumScope { public CompositeCPPEnumScope(ICompositesFactory cf, IIndexFragmentBinding rbinding) { super(cf, rbinding); } @@ -58,4 +58,9 @@ class CompositeCPPEnumScope extends CompositeScope implements ICPPScope { public IIndexBinding getScopeBinding() { return cf.getCompositeBinding(rbinding); } + + @Override + public ICPPEnumeration getEnumerationType() { + return (ICPPEnumeration) getScopeBinding(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumScope.java index f892e243acd..3930bd5badb 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumScope.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPEnumScope.java @@ -23,7 +23,8 @@ import org.eclipse.cdt.core.dom.ast.EScopeKind; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IEnumerator; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumScope; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPEnumeration; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexFileSet; import org.eclipse.cdt.core.index.IIndexName; @@ -40,7 +41,7 @@ import org.eclipse.core.runtime.CoreException; * Represents the enum scope for an enum stored in the index. * For safe use all fields need to be final. */ -class PDOMCPPEnumScope implements ICPPScope, IIndexScope { +class PDOMCPPEnumScope implements ICPPEnumScope, IIndexScope { private final IPDOMCPPEnumType fBinding; public PDOMCPPEnumScope(IPDOMCPPEnumType binding) { @@ -190,4 +191,9 @@ class PDOMCPPEnumScope implements ICPPScope, IIndexScope { CCorePlugin.log(e); } } + + @Override + public ICPPEnumeration getEnumerationType() { + return (ICPPEnumeration) getScopeBinding(); + } }