diff options
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java')
-rw-r--r-- | core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java | 78 |
1 files changed, 75 insertions, 3 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java index 58a39f498f8..7c5327c5491 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java @@ -20,24 +20,31 @@ import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IProblemBinding; +import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisibilityLabel; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassSpecialization; 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; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPMember; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; +import org.eclipse.cdt.internal.core.dom.parser.ProblemFunctionType; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPTemplates; import org.eclipse.core.runtime.Assert; @@ -47,11 +54,76 @@ import org.eclipse.core.runtime.Assert; public class CPPClassSpecialization extends CPPSpecialization implements ICPPClassSpecialization, ICPPInternalClassTypeMixinHost { - public final static class RecursionResolvingBinding extends ProblemBinding { - public RecursionResolvingBinding(IASTNode node, char[] arg) { + public static class RecursionResolvingBinding extends ProblemBinding implements ICPPMember { + public static RecursionResolvingBinding createFor(IBinding original, IASTNode point) { + if (original instanceof ICPPMethod) + return new RecursionResolvingMethod(point, original.getNameCharArray()); + if (original instanceof ICPPField) + return new RecursionResolvingField(point, original.getNameCharArray()); + return new RecursionResolvingBinding(point, original.getNameCharArray()); + } + + private RecursionResolvingBinding(IASTNode node, char[] arg) { super(node, IProblemBinding.SEMANTIC_RECURSION_IN_LOOKUP, arg); Assert.isTrue(CPPASTNameBase.sAllowRecursionBindings, getMessage()); } + + @Override + public int getVisibility() { + return ICPPASTVisibilityLabel.v_public; + } + + @Override + public ICPPClassType getClassOwner() { + return null; + } + } + + public final static class RecursionResolvingField extends RecursionResolvingBinding implements ICPPField { + public RecursionResolvingField(IASTNode node, char[] arg) { + super(node, arg); + } + + @Override + public ICompositeType getCompositeTypeOwner() { + return null; + } + } + + public final static class RecursionResolvingMethod extends RecursionResolvingBinding implements ICPPMethod { + public RecursionResolvingMethod(IASTNode node, char[] arg) { + super(node, arg); + } + + @Override + public ICPPParameter[] getParameters() { + return ICPPParameter.EMPTY_CPPPARAMETER_ARRAY; + } + + @Override + public int getRequiredArgumentCount() { + return 0; + } + + @Override + public IScope getFunctionScope() { + return null; + } + + @Override + public boolean isNoReturn() { + return false; + } + + @Override + public boolean isDestructor() { + return false; + } + + @Override + public ICPPFunctionType getType() { + return new ProblemFunctionType(getID()); + } } private ICPPClassSpecializationScope specScope; @@ -87,7 +159,7 @@ public class CPPClassSpecialization extends CPPSpecialization fInProgress.set(set); } if (!set.add(original)) - return new RecursionResolvingBinding(point, original.getNameCharArray()); + return RecursionResolvingBinding.createFor(original, point); } IBinding result= CPPTemplates.createSpecialization(this, original, point); |