diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTEnumerator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTEnumerator.java index a888330d461..5ace2107853 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTEnumerator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTEnumerator.java @@ -101,8 +101,12 @@ public abstract class ASTEnumerator extends ASTNode implements IASTEnumerator, I public IValue getIntegralValue() { if (integralValue == null) { IASTNode parent= getParent(); - if (parent instanceof IASTEnumerationSpecifier) - createEnumValues((IASTEnumerationSpecifier) parent); + if (parent instanceof IASTInternalEnumerationSpecifier) { + IASTInternalEnumerationSpecifier ies= (IASTInternalEnumerationSpecifier) parent; + if (ies.startValueComputation()) { // prevents infinite recursions + createEnumValues((IASTEnumerationSpecifier) parent); + } + } if (integralValue == null) { integralValue= Value.UNKNOWN; } @@ -118,7 +122,7 @@ public abstract class ASTEnumerator extends ASTNode implements IASTEnumerator, I cv++; IASTExpression expr= etor.getValue(); if (expr != null) { - IValue val= Value.create(expr); + IValue val= Value.create(expr, Value.MAX_RECURSION_DEPTH); Long nv= val.numericalValue(); isknown= false; if (nv != null) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java index f665bdbb348..1c9dbf15fce 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java @@ -18,13 +18,10 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IFunction; import org.eclipse.cdt.core.dom.ast.IScope; -import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.internal.core.dom.parser.c.ICInternalBinding; import org.eclipse.cdt.internal.core.dom.parser.c.ICInternalFunction; -import org.eclipse.cdt.internal.core.dom.parser.c.ICInternalVariable; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction; -import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalVariable; /** * Access to methods on scopes and bindings internal to the parser. @@ -94,16 +91,6 @@ public class ASTInternal { return func.isStatic(); } - public static boolean isStatic(IVariable var) throws DOMException { - if (var instanceof ICPPInternalVariable) { - return ((ICPPInternalVariable)var).isStatic(); - } - if (var instanceof ICInternalVariable) { - return ((ICInternalVariable)var).isStatic(); - } - return var.isStatic(); - } - public static void setFullyResolved(IBinding binding, boolean val) { if (binding instanceof ICInternalFunction) { ((ICInternalFunction) binding).setFullyResolved(true); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/IASTInternalEnumerationSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/IASTInternalEnumerationSpecifier.java new file mode 100644 index 00000000000..4dfd9c06106 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/IASTInternalEnumerationSpecifier.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. and others. + * 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: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.dom.parser; + +import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier; + +/** + * Internal interface for c- or c++ enumeration specifiers. + */ +public interface IASTInternalEnumerationSpecifier extends IASTEnumerationSpecifier { + /** + * Notifies that the value computation for the enumeration is started. Returns whether this is the + * first attempt to do so. + */ + boolean startValueComputation(); +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/IInternalVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/IInternalVariable.java new file mode 100644 index 00000000000..cb3271c634a --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/IInternalVariable.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2008 Wind River Systems, Inc. and others. + * 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: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.dom.parser; + +import org.eclipse.cdt.core.dom.ast.IValue; +import org.eclipse.cdt.core.dom.ast.IVariable; + +/** + * Internal interface for bindings in the ast that have values. + */ +public interface IInternalVariable extends IVariable { + + /** + * Returns the value of the variable, or null. + * If the recursion depth is reached {@link Value#UNKNOWN} will be returned. + */ + IValue getInitialValue(int maxRecursionDepth); +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java index 2f89b927501..4b11532988e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/Value.java @@ -36,11 +36,13 @@ import org.eclipse.cdt.internal.core.parser.scanner.ExpressionEvaluator.EvalExce * is to support instantiation of templates with non-type template parameters. */ public class Value implements IValue { + public static final int MAX_RECURSION_DEPTH = 25; public final static IValue UNKNOWN= new Value(""); //$NON-NLS-1$ private final static IValue[] TYPICAL= {new Value(String.valueOf(0)), new Value(String.valueOf(1)), new Value(String.valueOf(2)), new Value(String.valueOf(3)), new Value(String.valueOf(4)), new Value(String.valueOf(5)), new Value(String.valueOf(6))}; + private static class UnknownValueException extends Exception {} private static UnknownValueException UNKNOWN_EX= new UnknownValueException(); @@ -67,9 +69,9 @@ public class Value implements IValue { return new Value(String.valueOf(value)); } - public static IValue create(IASTExpression expr) { + public static IValue create(IASTExpression expr, int maxRecursionDepth) { try { - Object obj= evaluate(expr, 20); + Object obj= evaluate(expr, maxRecursionDepth); if (obj instanceof Long) return create(((Long) obj).longValue()); return new Value(obj.toString()); @@ -132,31 +134,31 @@ public class Value implements IValue { return o + "," + evaluate(cexpr.getNegativeResultExpression(), maxdepth) + "," + po + '?'; } if (e instanceof IASTIdExpression) { - if (e instanceof IASTIdExpression) { - IBinding b= ((IASTIdExpression) e).getName().resolveBinding(); - if (b instanceof ICPPTemplateParameter) { - if (b instanceof ICPPTemplateNonTypeParameter) { - return evaluate((ICPPTemplateParameter) b); - } - throw UNKNOWN_EX; - } else if (b instanceof IVariable) { - IValue cv= ((IVariable) b).getInitialValue(); - if (cv != null) { - return toObject(cv); - } - } else if (b instanceof IEnumerator) { - IValue cv= ((IEnumerator) b).getValue(); - return toObject(cv); - } - try { - if (b instanceof ICPPBinding) - return ((ICPPBinding) b).getQualifiedName(); - return b.getName(); - } catch (DOMException e1) { - throw UNKNOWN_EX; + IBinding b= ((IASTIdExpression) e).getName().resolveBinding(); + if (b instanceof ICPPTemplateParameter) { + if (b instanceof ICPPTemplateNonTypeParameter) { + return evaluate((ICPPTemplateParameter) b); } + throw UNKNOWN_EX; + } + IValue cv= null; + if (b instanceof IInternalVariable) { + cv= ((IInternalVariable) b).getInitialValue(maxdepth-1); + } else if (b instanceof IVariable) { + cv= ((IVariable) b).getInitialValue(); + } else if (b instanceof IEnumerator) { + cv= ((IEnumerator) b).getValue(); + } + if (cv != null) + return toObject(cv); + + try { + if (b instanceof ICPPBinding) + return ((ICPPBinding) b).getQualifiedName(); + return b.getName(); + } catch (DOMException e1) { + throw UNKNOWN_EX; } - return evaluate(e, --maxdepth); // prevent recursion } if (e instanceof IASTLiteralExpression) { if (e.getExpressionType() instanceof IBasicType) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerationSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerationSpecifier.java index d049ea6975f..651ad69f4c7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerationSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTEnumerationSpecifier.java @@ -6,9 +6,9 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM Rational Software - Initial API and implementation - * Markus Schorn (Wind River Systems) - * Yuan Zhang / Beth Tibbitts (IBM Research) + * John Camelon (IBM Rational Software) - Initial API and implementation + * Markus Schorn (Wind River Systems) + * Yuan Zhang / Beth Tibbitts (IBM Research) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.c; @@ -16,14 +16,16 @@ import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.c.ICASTEnumerationSpecifier; import org.eclipse.cdt.core.parser.util.ArrayUtil; +import org.eclipse.cdt.internal.core.dom.parser.IASTInternalEnumerationSpecifier; /** - * @author jcamelon + * AST node for enumeration specifiers. */ -public class CASTEnumerationSpecifier extends CASTBaseDeclSpecifier implements - ICASTEnumerationSpecifier { +public class CASTEnumerationSpecifier extends CASTBaseDeclSpecifier + implements IASTInternalEnumerationSpecifier, ICASTEnumerationSpecifier { private IASTName name; + private boolean valuesComputed= false; public CASTEnumerationSpecifier() { @@ -33,6 +35,14 @@ public class CASTEnumerationSpecifier extends CASTBaseDeclSpecifier implements setName(name); } + public boolean startValueComputation() { + if (valuesComputed) + return false; + + valuesComputed= true; + return true; + } + public void addEnumerator(IASTEnumerator enumerator) { if (enumerator != null) { enumerator.setParent(this); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVariable.java index 71c5506abf2..e10a8b644f1 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVariable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVariable.java @@ -29,14 +29,15 @@ import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.internal.core.dom.Linkage; +import org.eclipse.cdt.internal.core.dom.parser.IInternalVariable; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.Value; import org.eclipse.core.runtime.PlatformObject; /** - * Represents a global or a local variable. + * Binding for a global or a local variable, serves as base class for fields. */ -public class CVariable extends PlatformObject implements IVariable, ICInternalVariable { +public class CVariable extends PlatformObject implements IInternalVariable, ICInternalBinding { public static class CVariableProblem extends ProblemBinding implements IVariable { public CVariableProblem( IASTNode node, int id, char[] arg ) { super( node, id, arg ); @@ -161,11 +162,15 @@ public class CVariable extends PlatformObject implements IVariable, ICInternalVa } public IValue getInitialValue() { + return getInitialValue(Value.MAX_RECURSION_DEPTH); + } + + public IValue getInitialValue(int maxDepth) { if (declarations != null) { for (IASTName decl : declarations) { if (decl == null) break; - final IValue val= getInitialValue(decl); + final IValue val= getInitialValue(decl, maxDepth); if (val != null) return val; } @@ -173,14 +178,14 @@ public class CVariable extends PlatformObject implements IVariable, ICInternalVa return null; } - private IValue getInitialValue(IASTName name) { + private IValue getInitialValue(IASTName name, int maxDepth) { IASTDeclarator dtor= findDeclarator(name); if (dtor != null) { IASTInitializer init= dtor.getInitializer(); if (init instanceof IASTInitializerExpression) { IASTExpression expr= ((IASTInitializerExpression) init).getExpression(); if (expr != null) - return Value.create(expr); + return Value.create(expr, maxDepth); } if (init != null) return Value.UNKNOWN; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/ICInternalVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/ICInternalVariable.java deleted file mode 100644 index a6658dc32f9..00000000000 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/ICInternalVariable.java +++ /dev/null @@ -1,26 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2008 Wind River Systems, Inc. and others. - * 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: - * Markus Schorn - initial API and implementation - *******************************************************************************/ - -package org.eclipse.cdt.internal.core.dom.parser.c; - -import org.eclipse.cdt.core.dom.ast.DOMException; - -/** - * Interface for ast-internal implementations of variable bindings. - * @since 5.0 - */ -public interface ICInternalVariable extends ICInternalBinding { - - /** - * Returns whether there is a static declaration for this variable. - */ - public boolean isStatic() throws DOMException; -} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java index a673b629c07..97089ee57d3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java @@ -6,22 +6,24 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * John Camelon (IBM) - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.ASTVisitor; -import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.parser.util.ArrayUtil; +import org.eclipse.cdt.internal.core.dom.parser.IASTInternalEnumerationSpecifier; /** - * @author jcamelon + * AST node for c++ enumeration specifiers. */ public class CPPASTEnumerationSpecifier extends CPPASTBaseDeclSpecifier - implements IASTEnumerationSpecifier { + implements IASTInternalEnumerationSpecifier { private IASTName name; + private boolean valuesComputed= false; public CPPASTEnumerationSpecifier() { @@ -30,6 +32,14 @@ public class CPPASTEnumerationSpecifier extends CPPASTBaseDeclSpecifier public CPPASTEnumerationSpecifier(IASTName name) { setName(name); } + + public boolean startValueComputation() { + if (valuesComputed) + return false; + + valuesComputed= true; + return true; + } public void addEnumerator(IASTEnumerator enumerator) { if (enumerator != null) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldSpecialization.java index 69ccf01df65..c3d6636111c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldSpecialization.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFieldSpecialization.java @@ -19,11 +19,13 @@ import org.eclipse.cdt.core.dom.ast.IValue; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.parser.util.ObjectMap; +import org.eclipse.cdt.internal.core.dom.parser.IInternalVariable; +import org.eclipse.cdt.internal.core.dom.parser.Value; /** * Binding for a specialization of a field. */ -public class CPPFieldSpecialization extends CPPSpecialization implements ICPPField { +public class CPPFieldSpecialization extends CPPSpecialization implements ICPPField, IInternalVariable { private IType type = null; private IValue value= null; @@ -79,8 +81,19 @@ public class CPPFieldSpecialization extends CPPSpecialization implements ICPPFie } public IValue getInitialValue() { + return getInitialValue(Value.MAX_RECURSION_DEPTH); + } + + public IValue getInitialValue(int maxRecursionDepth) { if (value == null) { - value= specializeValue(getField().getInitialValue()); + ICPPField field= getField(); + IValue v; + if (field instanceof IInternalVariable) { + v= ((IInternalVariable) field).getInitialValue(maxRecursionDepth); + } else { + v= specializeValue(getField().getInitialValue()); + } + value= specializeValue(v); } return value; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java index ba4b114a5fb..58c2e5ae732 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java @@ -37,6 +37,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.internal.core.dom.Linkage; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; +import org.eclipse.cdt.internal.core.dom.parser.IInternalVariable; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.Value; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; @@ -46,7 +47,7 @@ import org.eclipse.core.runtime.PlatformObject; /** * @author aniefer */ -public class CPPVariable extends PlatformObject implements ICPPVariable, ICPPInternalVariable { +public class CPPVariable extends PlatformObject implements ICPPVariable, ICPPInternalBinding, IInternalVariable { public static class CPPVariableProblem extends ProblemBinding implements ICPPVariable{ public CPPVariableProblem(IASTNode node, int id, char[] arg) { super(node, id, arg); @@ -376,8 +377,12 @@ public class CPPVariable extends PlatformObject implements ICPPVariable, ICPPInt } public IValue getInitialValue() { + return getInitialValue(Value.MAX_RECURSION_DEPTH); + } + + public IValue getInitialValue(int maxDepth) { if (definition != null) { - final IValue val= getInitialValue(definition); + final IValue val= getInitialValue(definition, maxDepth); if (val != null) return val; } @@ -385,7 +390,7 @@ public class CPPVariable extends PlatformObject implements ICPPVariable, ICPPInt for (IASTName decl : declarations) { if (decl == null) break; - final IValue val= getInitialValue(decl); + final IValue val= getInitialValue(decl, maxDepth); if (val != null) return val; } @@ -393,20 +398,20 @@ public class CPPVariable extends PlatformObject implements ICPPVariable, ICPPInt return null; } - private IValue getInitialValue(IASTName name) { + private IValue getInitialValue(IASTName name, int maxDepth) { IASTDeclarator dtor= findDeclarator(name); if (dtor != null) { IASTInitializer init= dtor.getInitializer(); if (init instanceof IASTInitializerExpression) { IASTExpression expr= ((IASTInitializerExpression) init).getExpression(); if (expr != null) - return Value.create(expr); + return Value.create(expr, maxDepth); } else if (init instanceof ICPPASTConstructorInitializer) { IType type= SemanticUtil.getUltimateTypeUptoPointers(getType()); if (type instanceof IPointerType || type instanceof IBasicType) { IASTExpression expr= ((ICPPASTConstructorInitializer) init).getExpression(); if (expr != null) - return Value.create(expr); + return Value.create(expr, maxDepth); } } if (init != null) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalVariable.java deleted file mode 100644 index eba12146a7b..00000000000 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/ICPPInternalVariable.java +++ /dev/null @@ -1,27 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2007, 2008 Wind River Systems, Inc. and others. - * 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: - * Markus Schorn - initial API and implementation - *******************************************************************************/ - -package org.eclipse.cdt.internal.core.dom.parser.cpp; - -import org.eclipse.cdt.core.dom.ast.DOMException; - - -/** - * Interface for ast-internal implementations of variable bindings. - * @since 5.0 - */ -public interface ICPPInternalVariable extends ICPPInternalBinding { - - /** - * Returns whether there is a static declaration for this variable. - */ - public boolean isStatic() throws DOMException; -} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java index c47dfff0fb8..c02fad456ce 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPVisitor.java @@ -2227,8 +2227,7 @@ public class CPPVisitor { public static String[] getQualifiedName(IBinding binding) { String[] ns = null; try { - IBinding owner= binding.getOwner(); - while (owner != null) { + for (IBinding owner= binding.getOwner(); owner != null; owner= owner.getOwner()) { String n= owner.getName(); if (n == null) break; @@ -2238,7 +2237,6 @@ public class CPPVisitor { continue; ns = (String[]) ArrayUtil.append(String.class, ns, n); - owner = owner.getOwner(); } } catch (DOMException e) { } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java index 0203501279d..16b8faa9291 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java @@ -229,7 +229,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage boolean requireDefinition= false; if (binding instanceof IVariable) { if (!(binding instanceof IField)) { - checkInSourceOnly= ASTInternal.isStatic((IVariable) binding); + checkInSourceOnly= ((IVariable) binding).isStatic(); } } else if (binding instanceof IFunction) { IFunction f= (IFunction) binding;