Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java78
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);

Back to the top