mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 14:42:11 +02:00
Bug 430282 - Break out of recursion when creating
RecursionResolvingBindings Change-Id: I568a6f551969adc771ef48113c25b089b69657df Signed-off-by: Nathan Ridge <zeratul976@hotmail.com> Reviewed-on: https://git.eclipse.org/r/23588 Reviewed-by: Sergey Prigogin <eclipse.sprigogin@gmail.com> IP-Clean: Sergey Prigogin <eclipse.sprigogin@gmail.com> Tested-by: Sergey Prigogin <eclipse.sprigogin@gmail.com>
This commit is contained in:
parent
d02be6bf77
commit
8be981a088
1 changed files with 21 additions and 6 deletions
|
@ -44,19 +44,34 @@ public abstract class CPPASTNameBase extends ASTNode implements ICPPASTName {
|
||||||
private static final byte MAX_RESOLUTION_DEPTH= 6;
|
private static final byte MAX_RESOLUTION_DEPTH= 6;
|
||||||
|
|
||||||
protected final static class RecursionResolvingBinding extends ProblemBinding implements IRecursionResolvingBinding {
|
protected final static class RecursionResolvingBinding extends ProblemBinding implements IRecursionResolvingBinding {
|
||||||
public RecursionResolvingBinding(IASTName node) {
|
public RecursionResolvingBinding(IASTName node, char[] arg) {
|
||||||
super(node, IProblemBinding.SEMANTIC_RECURSION_IN_LOOKUP);
|
super(node, IProblemBinding.SEMANTIC_RECURSION_IN_LOOKUP, arg);
|
||||||
Assert.isTrue(sAllowRecursionBindings, getMessage());
|
Assert.isTrue(sAllowRecursionBindings, getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private RecursionResolvingBinding createRecursionResolvingBinding() {
|
||||||
|
// We create a recursion resolving binding when the resolution depth
|
||||||
|
// exceeds MAX_RESOLUTION_DEPTH. If the resolution depth exceeds
|
||||||
|
// MAX_RESOLUTION_DEPTH + 1, it means that attempting to create the
|
||||||
|
// recursion resolving binding has led us back to trying to resolve
|
||||||
|
// the bidning for this name again, so the recursion isn't broken.
|
||||||
|
// This can happen because the constructor of RecursionResolvingBinding
|
||||||
|
// calls ProblemBinding.getMessage(), which can try to do name
|
||||||
|
// resolution to build an argument string if one wasn't provided in the
|
||||||
|
// ProblemBinding constructor. To break the recursion in a case
|
||||||
|
// like, this we provide the argument string "(unknown)" instead.
|
||||||
|
char[] args = (fResolutionDepth > MAX_RESOLUTION_DEPTH + 1) ? "(unknown)".toCharArray() : null; //$NON-NLS-1$
|
||||||
|
return new RecursionResolvingBinding(this, args);
|
||||||
|
}
|
||||||
|
|
||||||
private IBinding fBinding;
|
private IBinding fBinding;
|
||||||
private byte fResolutionDepth;
|
private byte fResolutionDepth;
|
||||||
private boolean fIsFinal;
|
private boolean fIsFinal;
|
||||||
|
|
||||||
public final void incResolutionDepth() {
|
public final void incResolutionDepth() {
|
||||||
if (fBinding == null && ++fResolutionDepth > MAX_RESOLUTION_DEPTH) {
|
if (fBinding == null && ++fResolutionDepth > MAX_RESOLUTION_DEPTH) {
|
||||||
setBinding(new RecursionResolvingBinding(this));
|
setBinding(createRecursionResolvingBinding());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,7 +89,7 @@ public abstract class CPPASTNameBase extends ASTNode implements ICPPASTName {
|
||||||
public IBinding resolvePreBinding() {
|
public IBinding resolvePreBinding() {
|
||||||
if (fBinding == null) {
|
if (fBinding == null) {
|
||||||
if (++fResolutionDepth > MAX_RESOLUTION_DEPTH) {
|
if (++fResolutionDepth > MAX_RESOLUTION_DEPTH) {
|
||||||
setBinding(new RecursionResolvingBinding(this));
|
setBinding(createRecursionResolvingBinding());
|
||||||
} else {
|
} else {
|
||||||
setBinding(createIntermediateBinding());
|
setBinding(createIntermediateBinding());
|
||||||
}
|
}
|
||||||
|
@ -86,7 +101,7 @@ public abstract class CPPASTNameBase extends ASTNode implements ICPPASTName {
|
||||||
public IBinding resolveBinding() {
|
public IBinding resolveBinding() {
|
||||||
if (fBinding == null) {
|
if (fBinding == null) {
|
||||||
if (++fResolutionDepth > MAX_RESOLUTION_DEPTH) {
|
if (++fResolutionDepth > MAX_RESOLUTION_DEPTH) {
|
||||||
setBinding(new RecursionResolvingBinding(this));
|
setBinding(createRecursionResolvingBinding());
|
||||||
} else {
|
} else {
|
||||||
fIsFinal= false;
|
fIsFinal= false;
|
||||||
final IBinding b= createIntermediateBinding();
|
final IBinding b= createIntermediateBinding();
|
||||||
|
@ -137,7 +152,7 @@ public abstract class CPPASTNameBase extends ASTNode implements ICPPASTName {
|
||||||
if (fBinding instanceof ICPPTwoPhaseBinding) {
|
if (fBinding instanceof ICPPTwoPhaseBinding) {
|
||||||
ICPPTwoPhaseBinding intermediateBinding= (ICPPTwoPhaseBinding) fBinding;
|
ICPPTwoPhaseBinding intermediateBinding= (ICPPTwoPhaseBinding) fBinding;
|
||||||
if (++fResolutionDepth > MAX_RESOLUTION_DEPTH) {
|
if (++fResolutionDepth > MAX_RESOLUTION_DEPTH) {
|
||||||
setBinding(new RecursionResolvingBinding(this));
|
setBinding(createRecursionResolvingBinding());
|
||||||
} else {
|
} else {
|
||||||
setBinding(intermediateBinding.resolveFinalBinding(astName));
|
setBinding(intermediateBinding.resolveFinalBinding(astName));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue