mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-24 09:25:31 +02:00
Initial implementation of values for variables and enumerators, bug 250788.
This commit is contained in:
parent
27881f4236
commit
d7e75c1559
52 changed files with 1244 additions and 441 deletions
|
@ -84,6 +84,7 @@ import org.eclipse.cdt.core.dom.ast.IQualifierType;
|
|||
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.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.c.ICASTArrayModifier;
|
||||
|
@ -5429,4 +5430,41 @@ public class AST2Tests extends AST2BaseTest {
|
|||
assertEquals(offset, token.getOffset());
|
||||
assertEquals(image.length(), token.getLength());
|
||||
}
|
||||
|
||||
// int a= 1+2-3*4+10/2; // -4
|
||||
// int b= a+4;
|
||||
// int* c= &b;
|
||||
// enum X {e0, e4=4, e5, e2=2, e3};
|
||||
public void testValues() throws Exception {
|
||||
final String code= getAboveComment();
|
||||
boolean isCpp= false;
|
||||
do {
|
||||
BindingAssertionHelper bh= new BindingAssertionHelper(code, false);
|
||||
IVariable v= (IVariable) bh.assertNonProblem("a=", 1);
|
||||
checkValue(v.getInitialValue(), -4);
|
||||
v= (IVariable) bh.assertNonProblem("b=", 1);
|
||||
checkValue(v.getInitialValue(), 0);
|
||||
v= (IVariable) bh.assertNonProblem("c=", 1);
|
||||
assertNull(v.getInitialValue().numericalValue());
|
||||
|
||||
IEnumerator e= (IEnumerator) bh.assertNonProblem("e0", 2);
|
||||
checkValue(e.getValue(), 0);
|
||||
e= (IEnumerator) bh.assertNonProblem("e2", 2);
|
||||
checkValue(e.getValue(), 2);
|
||||
e= (IEnumerator) bh.assertNonProblem("e3", 2);
|
||||
checkValue(e.getValue(), 3);
|
||||
e= (IEnumerator) bh.assertNonProblem("e4", 2);
|
||||
checkValue(e.getValue(), 4);
|
||||
e= (IEnumerator) bh.assertNonProblem("e5", 2);
|
||||
checkValue(e.getValue(), 5);
|
||||
isCpp= !isCpp;
|
||||
} while (isCpp);
|
||||
}
|
||||
|
||||
private void checkValue(IValue initialValue, int i) {
|
||||
assertNotNull(initialValue);
|
||||
final Long numericalValue = initialValue.numericalValue();
|
||||
assertNotNull(numericalValue);
|
||||
assertEquals(i, numericalValue.intValue());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,10 +19,12 @@ import org.eclipse.cdt.core.dom.ast.IBasicType;
|
|||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.ICompositeType;
|
||||
import org.eclipse.cdt.core.dom.ast.IEnumeration;
|
||||
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunctionType;
|
||||
import org.eclipse.cdt.core.dom.ast.IPointerType;
|
||||
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
|
||||
/**
|
||||
|
@ -373,4 +375,39 @@ public class IndexCBindingResolutionTest extends IndexBindingResolutionTestBase
|
|||
getBindingFromASTName("a= 1", 1);
|
||||
getBindingFromASTName("b= 1", 1);
|
||||
}
|
||||
|
||||
// int a= 1+2-3*4+10/2; // -4
|
||||
// int b= a+4;
|
||||
// int* c= &b;
|
||||
// enum X {e0, e4=4, e5, e2=2, e3};
|
||||
|
||||
// void ref() {
|
||||
// a; b; c; e0; e2; e3; e4; e5;
|
||||
// }
|
||||
public void testValues() throws Exception {
|
||||
IVariable v= (IVariable) getBindingFromASTName("a;", 1);
|
||||
checkValue(v.getInitialValue(), -4);
|
||||
v= (IVariable) getBindingFromASTName("b;", 1);
|
||||
checkValue(v.getInitialValue(), 0);
|
||||
v= (IVariable) getBindingFromASTName("c;", 1);
|
||||
assertNull(v.getInitialValue().numericalValue());
|
||||
|
||||
IEnumerator e= (IEnumerator) getBindingFromASTName("e0", 2);
|
||||
checkValue(e.getValue(), 0);
|
||||
e= (IEnumerator) getBindingFromASTName("e2", 2);
|
||||
checkValue(e.getValue(), 2);
|
||||
e= (IEnumerator) getBindingFromASTName("e3", 2);
|
||||
checkValue(e.getValue(), 3);
|
||||
e= (IEnumerator) getBindingFromASTName("e4", 2);
|
||||
checkValue(e.getValue(), 4);
|
||||
e= (IEnumerator) getBindingFromASTName("e5", 2);
|
||||
checkValue(e.getValue(), 5);
|
||||
}
|
||||
|
||||
private void checkValue(IValue initialValue, int i) {
|
||||
assertNotNull(initialValue);
|
||||
final Long numericalValue = initialValue.numericalValue();
|
||||
assertNotNull(numericalValue);
|
||||
assertEquals(i, numericalValue.intValue());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,8 @@ import org.eclipse.cdt.core.dom.ast.IEnumeration;
|
|||
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.IPointerType;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
|
||||
|
@ -1324,6 +1326,40 @@ public abstract class IndexCPPBindingResolutionTest extends IndexBindingResoluti
|
|||
IBinding foo3= getBindingFromASTName("foo(e)", 3);
|
||||
}
|
||||
|
||||
// int a= 1+2-3*4+10/2; // -4
|
||||
// int b= a+4;
|
||||
// int* c= &b;
|
||||
// enum X {e0, e4=4, e5, e2=2, e3};
|
||||
|
||||
// void ref() {
|
||||
// a; b; c; e0; e2; e3; e4; e5;
|
||||
// }
|
||||
public void testValues() throws Exception {
|
||||
IVariable v= (IVariable) getBindingFromASTName("a;", 1);
|
||||
checkValue(v.getInitialValue(), -4);
|
||||
v= (IVariable) getBindingFromASTName("b;", 1);
|
||||
checkValue(v.getInitialValue(), 0);
|
||||
v= (IVariable) getBindingFromASTName("c;", 1);
|
||||
assertNull(v.getInitialValue().numericalValue());
|
||||
|
||||
IEnumerator e= (IEnumerator) getBindingFromASTName("e0", 2);
|
||||
checkValue(e.getValue(), 0);
|
||||
e= (IEnumerator) getBindingFromASTName("e2", 2);
|
||||
checkValue(e.getValue(), 2);
|
||||
e= (IEnumerator) getBindingFromASTName("e3", 2);
|
||||
checkValue(e.getValue(), 3);
|
||||
e= (IEnumerator) getBindingFromASTName("e4", 2);
|
||||
checkValue(e.getValue(), 4);
|
||||
e= (IEnumerator) getBindingFromASTName("e5", 2);
|
||||
checkValue(e.getValue(), 5);
|
||||
}
|
||||
|
||||
private void checkValue(IValue initialValue, int i) {
|
||||
assertNotNull(initialValue);
|
||||
final Long numericalValue = initialValue.numericalValue();
|
||||
assertNotNull(numericalValue);
|
||||
assertEquals(i, numericalValue.intValue());
|
||||
}
|
||||
|
||||
/* CPP assertion helpers */
|
||||
/* ##################################################################### */
|
||||
|
|
|
@ -21,10 +21,12 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
|
|||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.ICompositeType;
|
||||
import org.eclipse.cdt.core.dom.ast.IEnumeration;
|
||||
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.IFunction;
|
||||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.ITypedef;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
|
||||
|
@ -172,6 +174,27 @@ public class IndexUpdateTests extends IndexTestBase {
|
|||
}
|
||||
}
|
||||
|
||||
private void checkValue(String name, Long value) throws Exception {
|
||||
fIndex.acquireReadLock();
|
||||
try {
|
||||
IBinding b = findBinding(name);
|
||||
IValue v= null;
|
||||
if (b instanceof IVariable)
|
||||
v= ((IVariable) b).getInitialValue();
|
||||
else if (b instanceof IEnumerator)
|
||||
v= ((IEnumerator) b).getValue();
|
||||
else
|
||||
fail();
|
||||
|
||||
if (value == null)
|
||||
assertNull(v);
|
||||
else
|
||||
assertEquals(value, v.numericalValue());
|
||||
} finally {
|
||||
fIndex.releaseReadLock();
|
||||
}
|
||||
}
|
||||
|
||||
private void checkVariable(IVariable var, String type, String[] modifiers) throws DOMException {
|
||||
assertEquals(msg(), type, ASTTypeUtil.getType(var.getType()));
|
||||
checkModifier(modifiers, AUTO, var.isAuto());
|
||||
|
@ -823,5 +846,56 @@ public class IndexUpdateTests extends IndexTestBase {
|
|||
fIndex.releaseReadLock();
|
||||
}
|
||||
}
|
||||
|
||||
// int global;
|
||||
// struct C {int mem;};
|
||||
// enum E {e0};
|
||||
|
||||
// int global=1;
|
||||
// struct C {int mem=1;};
|
||||
// enum E {e0=1};
|
||||
|
||||
// int global;
|
||||
// struct C {int mem;};
|
||||
// enum E {e0};
|
||||
public void testValuesC() throws Exception {
|
||||
setupFile(3, false);
|
||||
checkValue("global", null);
|
||||
checkValue("C::mem", null);
|
||||
checkValue("e0", 0L);
|
||||
updateFile();
|
||||
checkValue("global", 1L);
|
||||
checkValue("C::mem", 1L);
|
||||
checkValue("e0", 1L);
|
||||
updateFile();
|
||||
checkValue("global", null);
|
||||
checkValue("C::mem", null);
|
||||
checkValue("e0", 0L);
|
||||
}
|
||||
|
||||
// int global;
|
||||
// struct C {int mem;};
|
||||
// enum E {e0};
|
||||
|
||||
// int global=1;
|
||||
// struct C {int mem=1;};
|
||||
// enum E {e0=1};
|
||||
|
||||
// int global;
|
||||
// struct C {int mem;};
|
||||
// enum E {e0};
|
||||
public void testValuesCPP() throws Exception {
|
||||
setupFile(3, true);
|
||||
checkValue("global", null);
|
||||
checkValue("C::mem", null);
|
||||
checkValue("e0", 0L);
|
||||
updateFile();
|
||||
checkValue("global", 1L);
|
||||
checkValue("C::mem", 1L);
|
||||
checkValue("e0", 1L);
|
||||
updateFile();
|
||||
checkValue("global", null);
|
||||
checkValue("C::mem", null);
|
||||
checkValue("e0", 0L);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,8 +47,6 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
|
|||
/**
|
||||
* This is a utility class to help convert AST elements to Strings corresponding to the
|
||||
* AST element's type.
|
||||
*
|
||||
* @author dsteffle
|
||||
*/
|
||||
public class ASTTypeUtil {
|
||||
private static final String COMMA_SPACE = ", "; //$NON-NLS-1$
|
||||
|
@ -371,20 +369,17 @@ public class ASTTypeUtil {
|
|||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if (((IQualifierType) type).isConst()) {
|
||||
if (needSpace) {
|
||||
result.append(SPACE); needSpace = false;
|
||||
}
|
||||
result.append(Keywords.CONST); needSpace = true;
|
||||
if (((IQualifierType) type).isConst()) {
|
||||
if (needSpace) {
|
||||
result.append(SPACE); needSpace = false;
|
||||
}
|
||||
if (((IQualifierType) type).isVolatile()) {
|
||||
if (needSpace) {
|
||||
result.append(SPACE); needSpace = false;
|
||||
}
|
||||
result.append(Keywords.VOLATILE); needSpace = true;
|
||||
result.append(Keywords.CONST); needSpace = true;
|
||||
}
|
||||
if (((IQualifierType) type).isVolatile()) {
|
||||
if (needSpace) {
|
||||
result.append(SPACE); needSpace = false;
|
||||
}
|
||||
} catch (DOMException e) {
|
||||
result.append(Keywords.VOLATILE); needSpace = true;
|
||||
}
|
||||
} else if (type instanceof ITypedef) {
|
||||
result.append(((ITypedef) type).getNameCharArray());
|
||||
|
@ -552,11 +547,7 @@ public class ASTTypeUtil {
|
|||
*/
|
||||
public static boolean isConst(IType type) {
|
||||
if (type instanceof IQualifierType) {
|
||||
try {
|
||||
return ((IQualifierType) type).isConst();
|
||||
} catch (DOMException e) {
|
||||
return false;
|
||||
}
|
||||
return ((IQualifierType) type).isConst();
|
||||
} else if (type instanceof ITypeContainer) {
|
||||
try {
|
||||
return isConst(((ITypeContainer) type).getType());
|
||||
|
|
|
@ -6,16 +6,15 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
* Andrew Niefer (IBM Corporation) - initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
|
||||
/*
|
||||
* Created on Dec 8, 2004
|
||||
*/
|
||||
package org.eclipse.cdt.core.dom.ast;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
* Interface for basic types.
|
||||
*
|
||||
* @noimplement This interface is not intended to be implemented by clients.
|
||||
*/
|
||||
public interface IBasicType extends IType {
|
||||
|
||||
|
@ -28,11 +27,9 @@ public interface IBasicType extends IType {
|
|||
public int getType() throws DOMException;
|
||||
|
||||
/**
|
||||
* Returns the IASTExpression for the value of this type. May be null.
|
||||
*
|
||||
* @return IASTExpression or null
|
||||
* @throws DOMException
|
||||
* @deprecated, types don't have values.
|
||||
*/
|
||||
@Deprecated
|
||||
public IASTExpression getValue() throws DOMException;
|
||||
|
||||
public static final int t_unspecified = IASTSimpleDeclSpecifier.t_unspecified;
|
||||
|
|
|
@ -1,21 +1,19 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2004, 2005 IBM Corporation and others.
|
||||
* Copyright (c) 2004, 2008 IBM Corporation 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:
|
||||
* IBM Corporation - initial API and implementation
|
||||
* Andrew Niefer (IBM Corporation) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
|
||||
/*
|
||||
* Created on Nov 23, 2004
|
||||
*/
|
||||
package org.eclipse.cdt.core.dom.ast;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
* Interface for enumerators.
|
||||
*
|
||||
* @noimplement This interface is not intended to be implemented by clients.
|
||||
*/
|
||||
public interface IEnumerator extends IBinding {
|
||||
/**
|
||||
|
@ -25,4 +23,10 @@ public interface IEnumerator extends IBinding {
|
|||
* @return the type of the enumeration
|
||||
*/
|
||||
public IType getType() throws DOMException;
|
||||
|
||||
/**
|
||||
* Returns the value assigned to this enumerator.
|
||||
* @since 5.1
|
||||
*/
|
||||
public IValue getValue();
|
||||
}
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2004, 2005 IBM Corporation and others.
|
||||
* Copyright (c) 2004, 2008 IBM Corporation 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:
|
||||
* IBM - Initial API and implementation
|
||||
* Doug Schaefer (IBM) - Initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.core.dom.ast;
|
||||
|
||||
|
@ -14,8 +15,14 @@ package org.eclipse.cdt.core.dom.ast;
|
|||
* Represents a parameter to a function. The scope of the parameter is
|
||||
* the function that declared this parameter.
|
||||
*
|
||||
* @author Doug Schaefer
|
||||
* @noimplement This interface is not intended to be implemented by clients.
|
||||
*/
|
||||
public interface IParameter extends IVariable {
|
||||
public static final IParameter [] EMPTY_PARAMETER_ARRAY = new IParameter[0];
|
||||
|
||||
/**
|
||||
* Inherited from {@link IVariable}, always returns <code>null</code>.
|
||||
* @since 5.1
|
||||
*/
|
||||
IValue getInitialValue();
|
||||
}
|
||||
|
|
|
@ -6,29 +6,26 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
* Andrew Niefer (IBM Corporation) - initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
|
||||
/*
|
||||
* Created on Dec 8, 2004
|
||||
*/
|
||||
package org.eclipse.cdt.core.dom.ast;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
* Interface used to qualify types.
|
||||
*
|
||||
* @noimplement This interface is not intended to be implemented by clients.
|
||||
*/
|
||||
public interface IQualifierType extends IType {
|
||||
/**
|
||||
* is this a const type
|
||||
* @throws DOMException
|
||||
* Returns whether this is a const type
|
||||
*/
|
||||
public boolean isConst() throws DOMException;
|
||||
public boolean isConst();
|
||||
|
||||
/**
|
||||
* is this a volatile type
|
||||
* @throws DOMException
|
||||
* Returns whether this is a volatile type
|
||||
*/
|
||||
public boolean isVolatile() throws DOMException;
|
||||
public boolean isVolatile();
|
||||
|
||||
/**
|
||||
* get the type that this is qualifying
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
/*******************************************************************************
|
||||
* 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.core.dom.ast;
|
||||
|
||||
/**
|
||||
* Models a value of a variable, enumerator or expression.
|
||||
*
|
||||
* @noimplement This interface is not intended to be implemented by clients.
|
||||
* @since 5.1
|
||||
*/
|
||||
public interface IValue {
|
||||
/**
|
||||
* Returns the value as a number, or <code>null</code> if this is not possible.
|
||||
*/
|
||||
Long numericalValue();
|
||||
|
||||
/**
|
||||
* Returns a canonical representation that is suitable for distinguishing
|
||||
* constant values for the purpose of template instantiation.
|
||||
* The representation may not be used to display the value.
|
||||
*/
|
||||
String getCanonicalRepresentation();
|
||||
}
|
|
@ -6,28 +6,47 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
* Doug Schaefer (IBM) - Initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.core.dom.ast;
|
||||
|
||||
/**
|
||||
* @author Doug Schaefer
|
||||
* Interface for all sorts of variables: local, parameter, global, field.
|
||||
*
|
||||
* @noimplement This interface is not intended to be implemented by clients.
|
||||
*/
|
||||
public interface IVariable extends IBinding {
|
||||
|
||||
/**
|
||||
* @return the type of the variable
|
||||
* Returns the type of the variable
|
||||
*/
|
||||
public IType getType() throws DOMException;
|
||||
|
||||
/**
|
||||
* Returns the value for a variable with an initializer,
|
||||
* or <code>null</code> otherwise.
|
||||
* @since 5.1
|
||||
*/
|
||||
public IValue getInitialValue();
|
||||
|
||||
/**
|
||||
* Does this function have the static storage-class specifier
|
||||
* similarily for extern, auto, register
|
||||
* @throws DOMException
|
||||
* Returns whether this variable is declared static.
|
||||
*/
|
||||
public boolean isStatic() throws DOMException;
|
||||
|
||||
/**
|
||||
* Returns whether this variable is declared extern.
|
||||
*/
|
||||
public boolean isExtern() throws DOMException;
|
||||
|
||||
/**
|
||||
* Returns whether this variable is an automatic variable.
|
||||
*/
|
||||
public boolean isAuto() throws DOMException;
|
||||
|
||||
/**
|
||||
* Returns whether this variable is declared register.
|
||||
*/
|
||||
public boolean isRegister() throws DOMException;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,134 @@
|
|||
/*******************************************************************************
|
||||
* 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.ASTVisitor;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
|
||||
|
||||
/**
|
||||
* Base class for c- and c++ enumerators.
|
||||
*/
|
||||
public abstract class ASTEnumerator extends ASTNode implements IASTEnumerator, IASTAmbiguityParent {
|
||||
|
||||
private IASTName name;
|
||||
private IASTExpression value;
|
||||
private IValue integralValue;
|
||||
|
||||
|
||||
public ASTEnumerator() {
|
||||
}
|
||||
|
||||
public ASTEnumerator(IASTName name, IASTExpression value) {
|
||||
setName(name);
|
||||
setValue(value);
|
||||
}
|
||||
|
||||
public void setName(IASTName name) {
|
||||
this.name = name;
|
||||
if (name != null) {
|
||||
name.setParent(this);
|
||||
name.setPropertyInParent(ENUMERATOR_NAME);
|
||||
}
|
||||
}
|
||||
|
||||
public IASTName getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setValue(IASTExpression expression) {
|
||||
this.value = expression;
|
||||
if (expression != null) {
|
||||
expression.setParent(this);
|
||||
expression.setPropertyInParent(ENUMERATOR_VALUE);
|
||||
}
|
||||
}
|
||||
|
||||
public IASTExpression getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean accept( ASTVisitor action ){
|
||||
if( action.shouldVisitEnumerators ){
|
||||
switch( action.visit( this ) ){
|
||||
case ASTVisitor.PROCESS_ABORT : return false;
|
||||
case ASTVisitor.PROCESS_SKIP : return true;
|
||||
default : break;
|
||||
}
|
||||
}
|
||||
if( name != null ) if( !name.accept( action ) ) return false;
|
||||
if( value != null ) if( !value.accept( action ) ) return false;
|
||||
if( action.shouldVisitEnumerators ){
|
||||
switch( action.leave( this ) ){
|
||||
case ASTVisitor.PROCESS_ABORT : return false;
|
||||
case ASTVisitor.PROCESS_SKIP : return true;
|
||||
default : break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public int getRoleForName(IASTName n) {
|
||||
if (n == name)
|
||||
return r_definition;
|
||||
|
||||
return r_reference;
|
||||
}
|
||||
|
||||
public void replace(IASTNode child, IASTNode other) {
|
||||
if( child == value)
|
||||
{
|
||||
other.setPropertyInParent( child.getPropertyInParent() );
|
||||
other.setParent( child.getParent() );
|
||||
value = (IASTExpression) other;
|
||||
}
|
||||
}
|
||||
|
||||
public IValue getIntegralValue() {
|
||||
if (integralValue == null) {
|
||||
IASTNode parent= getParent();
|
||||
if (parent instanceof IASTEnumerationSpecifier)
|
||||
createEnumValues((IASTEnumerationSpecifier) parent);
|
||||
if (integralValue == null) {
|
||||
integralValue= Value.UNKNOWN;
|
||||
}
|
||||
}
|
||||
return integralValue;
|
||||
}
|
||||
|
||||
private void createEnumValues(IASTEnumerationSpecifier parent) {
|
||||
IASTEnumerator[] etors= parent.getEnumerators();
|
||||
int cv= -1;
|
||||
boolean isknown= true;
|
||||
for (IASTEnumerator etor : etors) {
|
||||
cv++;
|
||||
IASTExpression expr= etor.getValue();
|
||||
if (expr != null) {
|
||||
IValue val= Value.create(expr);
|
||||
Long nv= val.numericalValue();
|
||||
isknown= false;
|
||||
if (nv != null) {
|
||||
isknown= true;
|
||||
cv= nv.intValue();
|
||||
}
|
||||
}
|
||||
if (etor instanceof ASTEnumerator) {
|
||||
((ASTEnumerator) etor).integralValue= isknown ? Value.create(cv) : Value.UNKNOWN;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.IFunctionType;
|
|||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
|
||||
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
|
||||
|
@ -27,17 +28,17 @@ import org.eclipse.cdt.core.parser.ParserLanguage;
|
|||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||
import org.eclipse.cdt.internal.core.dom.Linkage;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.c.CBasicType;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.c.CBuiltinVariable;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.c.CFunctionType;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.c.CImplicitFunction;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.c.CImplicitTypedef;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.c.CBuiltinVariable;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.c.CPointerType;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.c.CQualifierType;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBuiltinVariable;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPFunctionType;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPImplicitFunction;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPImplicitTypedef;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBuiltinVariable;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerType;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPQualifierType;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.GPPBasicType;
|
||||
|
@ -47,8 +48,6 @@ import org.eclipse.core.runtime.PlatformObject;
|
|||
/**
|
||||
* This is the IBuiltinBindingsProvider used to implement the "Other" built-in GCC symbols defined:
|
||||
* http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html#Other-Builtins
|
||||
*
|
||||
* @author dsteffle
|
||||
*/
|
||||
public class GCCBuiltinSymbolProvider implements IBuiltinBindingsProvider {
|
||||
/**
|
||||
|
@ -2407,6 +2406,10 @@ public class GCCBuiltinSymbolProvider implements IBuiltinBindingsProvider {
|
|||
public IBinding getOwner() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
static public class CPPBuiltinParameter extends PlatformObject implements ICPPParameter {
|
||||
|
@ -2499,5 +2502,9 @@ public class GCCBuiltinSymbolProvider implements IBuiltinBindingsProvider {
|
|||
public IBinding getOwner() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,291 @@
|
|||
/*******************************************************************************
|
||||
* 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.ASTSignatureUtil;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTArraySubscriptExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTCastExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IBasicType;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
|
||||
import org.eclipse.cdt.internal.core.parser.scanner.ExpressionEvaluator;
|
||||
import org.eclipse.cdt.internal.core.parser.scanner.ExpressionEvaluator.EvalException;
|
||||
|
||||
/**
|
||||
* Represents values of variables, enumerators or expressions. The primary purpose of the representation
|
||||
* is to support instantiation of templates with non-type template parameters.
|
||||
*/
|
||||
public class Value implements IValue {
|
||||
public final static IValue UNKNOWN= new Value("<unknown>"); //$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();
|
||||
|
||||
private final String fValue;
|
||||
private Value(String rep) {
|
||||
fValue= rep;
|
||||
}
|
||||
public String getCanonicalRepresentation() {
|
||||
return fValue;
|
||||
}
|
||||
|
||||
public Long numericalValue() {
|
||||
try {
|
||||
return Long.parseLong(fValue);
|
||||
} catch (NumberFormatException e) {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static IValue create(long value) {
|
||||
if (value >=0 && value < TYPICAL.length)
|
||||
return TYPICAL[(int) value];
|
||||
return new Value(String.valueOf(value));
|
||||
}
|
||||
|
||||
public static IValue create(IASTExpression expr) {
|
||||
try {
|
||||
Object obj= evaluate(expr, 20);
|
||||
if (obj instanceof Long)
|
||||
return create(((Long) obj).longValue());
|
||||
return new Value(obj.toString());
|
||||
} catch (UnknownValueException e) {
|
||||
}
|
||||
return UNKNOWN;
|
||||
}
|
||||
|
||||
public static IValue fromCanonicalRepresentation(String rep) {
|
||||
if (rep.equals(UNKNOWN.getCanonicalRepresentation()))
|
||||
return UNKNOWN;
|
||||
|
||||
try {
|
||||
return create(Long.parseLong(rep));
|
||||
} catch (NumberFormatException e) {}
|
||||
|
||||
return new Value(rep);
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes the canonical representation of the value of the expression. Returns a {@code Long} for
|
||||
* numerical values or a {@code String}, otherwise.
|
||||
* @throws UnknownValueException
|
||||
*/
|
||||
@SuppressWarnings("nls")
|
||||
private static Object evaluate(IASTExpression e, int maxdepth) throws UnknownValueException {
|
||||
if (maxdepth < 0 || e == null)
|
||||
throw UNKNOWN_EX;
|
||||
|
||||
if (e instanceof IASTArraySubscriptExpression) {
|
||||
IASTArraySubscriptExpression sub= (IASTArraySubscriptExpression) e;
|
||||
return evaluate(sub.getArrayExpression(), maxdepth) + "," +
|
||||
evaluate(sub.getSubscriptExpression(), maxdepth) + ",[]";
|
||||
}
|
||||
if (e instanceof IASTBinaryExpression) {
|
||||
return evaluateBinaryExpression((IASTBinaryExpression) e, maxdepth);
|
||||
}
|
||||
if (e instanceof IASTUnaryExpression) {
|
||||
return evaluateUnaryExpression((IASTUnaryExpression) e, maxdepth);
|
||||
}
|
||||
if (e instanceof IASTCastExpression) {
|
||||
return evaluate(((IASTCastExpression) e).getOperand(), maxdepth);
|
||||
}
|
||||
if (e instanceof IASTConditionalExpression) {
|
||||
IASTConditionalExpression cexpr= (IASTConditionalExpression) e;
|
||||
Object o= evaluate(cexpr.getLogicalConditionExpression(), maxdepth);
|
||||
if (o instanceof Long) {
|
||||
Long v= (Long) o;
|
||||
if (v.longValue() == 0) {
|
||||
return evaluate(cexpr.getNegativeResultExpression(), maxdepth);
|
||||
}
|
||||
final IASTExpression pe = cexpr.getPositiveResultExpression();
|
||||
if (pe == null) // gnu-extension allows to omit the positive expression.
|
||||
return o;
|
||||
return evaluate(pe, maxdepth);
|
||||
}
|
||||
|
||||
final IASTExpression pe = cexpr.getPositiveResultExpression();
|
||||
Object po= pe == null ? o : evaluate(pe, maxdepth);
|
||||
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;
|
||||
}
|
||||
}
|
||||
return evaluate(e, --maxdepth); // prevent recursion
|
||||
}
|
||||
if (e instanceof IASTLiteralExpression) {
|
||||
if (e.getExpressionType() instanceof IBasicType) {
|
||||
try {
|
||||
return ExpressionEvaluator.getNumber(e.toString().toCharArray());
|
||||
} catch (EvalException e1) {
|
||||
throw UNKNOWN_EX;
|
||||
}
|
||||
}
|
||||
return e.toString();
|
||||
}
|
||||
throw UNKNOWN_EX;
|
||||
}
|
||||
|
||||
private static Object toObject(IValue cv) throws UnknownValueException {
|
||||
if (cv == Value.UNKNOWN)
|
||||
throw UNKNOWN_EX;
|
||||
|
||||
Long lv= cv.numericalValue();
|
||||
if (lv != null)
|
||||
return lv;
|
||||
return cv.getCanonicalRepresentation();
|
||||
}
|
||||
|
||||
@SuppressWarnings("nls")
|
||||
private static String evaluate(ICPPTemplateParameter param) {
|
||||
// mstodo add support for parameter positions first.
|
||||
return "#" ;//+Integer.toHexString(param.getParameterPosition());
|
||||
}
|
||||
|
||||
@SuppressWarnings("nls")
|
||||
private static Object evaluateUnaryExpression(IASTUnaryExpression ue, int maxdepth) throws UnknownValueException {
|
||||
final int unaryOp= ue.getOperator();
|
||||
if (unaryOp == IASTUnaryExpression.op_amper || unaryOp == IASTUnaryExpression.op_star)
|
||||
throw UNKNOWN_EX;
|
||||
|
||||
final Object value= evaluate(ue.getOperand(), maxdepth);
|
||||
if (value instanceof Long) {
|
||||
long v= (Long) value;
|
||||
switch(unaryOp) {
|
||||
case IASTUnaryExpression.op_prefixIncr:
|
||||
case IASTUnaryExpression.op_postFixIncr:
|
||||
return ++v;
|
||||
case IASTUnaryExpression.op_prefixDecr :
|
||||
case IASTUnaryExpression.op_postFixDecr:
|
||||
return --v;
|
||||
case IASTUnaryExpression.op_bracketedPrimary:
|
||||
case IASTUnaryExpression.op_plus:
|
||||
return value;
|
||||
case IASTUnaryExpression.op_minus:
|
||||
return -v;
|
||||
case IASTUnaryExpression.op_tilde:
|
||||
return ~v;
|
||||
case IASTUnaryExpression.op_not:
|
||||
return v == 0 ? 1 : 0;
|
||||
}
|
||||
}
|
||||
switch (unaryOp) {
|
||||
case IASTUnaryExpression.op_bracketedPrimary:
|
||||
case IASTUnaryExpression.op_plus:
|
||||
return value;
|
||||
}
|
||||
|
||||
return value + "," + ASTSignatureUtil.getUnaryOperatorString(ue);
|
||||
}
|
||||
|
||||
@SuppressWarnings("nls")
|
||||
private static Object evaluateBinaryExpression(IASTBinaryExpression be, int maxdepth) throws UnknownValueException {
|
||||
final Object o1= evaluate(be.getOperand1(), maxdepth);
|
||||
final Object o2= evaluate(be.getOperand2(), maxdepth);
|
||||
|
||||
final int op= be.getOperator();
|
||||
if (o1 instanceof Long && o2 instanceof Long) {
|
||||
long v1= (Long) o1;
|
||||
long v2= (Long) o2;
|
||||
switch(op) {
|
||||
case IASTBinaryExpression.op_multiply:
|
||||
return v1*v2;
|
||||
case IASTBinaryExpression.op_divide:
|
||||
if (v2 == 0)
|
||||
throw UNKNOWN_EX;
|
||||
return v1/v2;
|
||||
case IASTBinaryExpression.op_modulo:
|
||||
if (v2 == 0)
|
||||
throw UNKNOWN_EX;
|
||||
return v1 % v2;
|
||||
case IASTBinaryExpression.op_plus:
|
||||
return v1+v2;
|
||||
case IASTBinaryExpression.op_minus:
|
||||
return v1-v2;
|
||||
case IASTBinaryExpression.op_shiftLeft:
|
||||
return v1 << v2;
|
||||
case IASTBinaryExpression.op_shiftRight:
|
||||
return v1 >> v2;
|
||||
case IASTBinaryExpression.op_lessThan:
|
||||
return v1 < v2 ? 1 : 0;
|
||||
case IASTBinaryExpression.op_greaterThan:
|
||||
return v1 > v2 ? 1 : 0;
|
||||
case IASTBinaryExpression.op_lessEqual:
|
||||
return v1 <= v2 ? 1 : 0;
|
||||
case IASTBinaryExpression.op_greaterEqual:
|
||||
return v1 >= v2 ? 1 : 0;
|
||||
case IASTBinaryExpression.op_binaryAnd:
|
||||
return v1&v2;
|
||||
case IASTBinaryExpression.op_binaryXor:
|
||||
return v1^v2;
|
||||
case IASTBinaryExpression.op_binaryOr:
|
||||
return v1|v2;
|
||||
case IASTBinaryExpression.op_logicalAnd:
|
||||
return v1 != 0 && v2 != 0 ? 1 : 0;
|
||||
case IASTBinaryExpression.op_logicalOr:
|
||||
return v1 != 0 || v2 != 0 ? 1 : 0;
|
||||
case IASTBinaryExpression.op_equals:
|
||||
return v1 == v2 ? 1 : 0;
|
||||
case IASTBinaryExpression.op_notequals:
|
||||
return v1 != v2 ? 1 : 0;
|
||||
case IASTBinaryExpression.op_max:
|
||||
return Math.max(v1, v2);
|
||||
case IASTBinaryExpression.op_min:
|
||||
return Math.min(v1, v2);
|
||||
}
|
||||
}
|
||||
switch (op) {
|
||||
case IASTBinaryExpression.op_equals:
|
||||
return o1.equals(o2) ? 1 : 0;
|
||||
case IASTBinaryExpression.op_notequals:
|
||||
return !o1.equals(o2) ? 1 : 0;
|
||||
}
|
||||
|
||||
return o1 + "," + o2 + "," + ASTSignatureUtil.getBinaryOperatorString(be);
|
||||
}
|
||||
}
|
|
@ -6,94 +6,23 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM Rational Software - Initial API and implementation
|
||||
* Yuan Zhang / Beth Tibbitts (IBM Research)
|
||||
* John Camelon (IBM Rational Software) - Initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.c;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ASTEnumerator;
|
||||
|
||||
/**
|
||||
* @author jcamelon
|
||||
* C-specific enumerator
|
||||
*/
|
||||
public class CASTEnumerator extends ASTNode implements IASTEnumerator, IASTAmbiguityParent {
|
||||
|
||||
private IASTName name;
|
||||
private IASTExpression value;
|
||||
|
||||
|
||||
public class CASTEnumerator extends ASTEnumerator {
|
||||
public CASTEnumerator() {
|
||||
super();
|
||||
}
|
||||
|
||||
public CASTEnumerator(IASTName name, IASTExpression value) {
|
||||
setName(name);
|
||||
setValue(value);
|
||||
super(name, value);
|
||||
}
|
||||
|
||||
public void setName(IASTName name) {
|
||||
this.name = name;
|
||||
if (name != null) {
|
||||
name.setParent(this);
|
||||
name.setPropertyInParent(ENUMERATOR_NAME);
|
||||
}
|
||||
}
|
||||
|
||||
public IASTName getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setValue(IASTExpression expression) {
|
||||
this.value = expression;
|
||||
if (expression != null) {
|
||||
expression.setParent(this);
|
||||
expression.setPropertyInParent(ENUMERATOR_VALUE);
|
||||
}
|
||||
}
|
||||
|
||||
public IASTExpression getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean accept( ASTVisitor action ){
|
||||
if( action.shouldVisitEnumerators ){
|
||||
switch( action.visit( this ) ){
|
||||
case ASTVisitor.PROCESS_ABORT : return false;
|
||||
case ASTVisitor.PROCESS_SKIP : return true;
|
||||
default : break;
|
||||
}
|
||||
}
|
||||
if( name != null ) if( !name.accept( action ) ) return false;
|
||||
if( value != null ) if( !value.accept( action ) ) return false;
|
||||
if( action.shouldVisitEnumerators ){
|
||||
switch( action.leave( this ) ){
|
||||
case ASTVisitor.PROCESS_ABORT : return false;
|
||||
case ASTVisitor.PROCESS_SKIP : return true;
|
||||
default : break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public int getRoleForName(IASTName n) {
|
||||
if( n == name )return r_definition;
|
||||
return r_unclear;
|
||||
}
|
||||
|
||||
public void replace(IASTNode child, IASTNode other) {
|
||||
if( child == value)
|
||||
{
|
||||
other.setPropertyInParent( child.getPropertyInParent() );
|
||||
other.setParent( child.getParent() );
|
||||
value = (IASTExpression) other;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
* Andrew Niefer (IBM Corporation) - initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.c;
|
||||
|
@ -21,23 +21,28 @@ import org.eclipse.cdt.core.dom.ast.IEnumeration;
|
|||
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
|
||||
import org.eclipse.cdt.internal.core.dom.Linkage;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ASTEnumerator;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.Value;
|
||||
import org.eclipse.core.runtime.PlatformObject;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
* C-specific binding for enumerators.
|
||||
*/
|
||||
public class CEnumerator extends PlatformObject implements IEnumerator {
|
||||
public static class CEnumeratorProblem extends ProblemBinding implements IEnumerator {
|
||||
public CEnumeratorProblem( IASTNode node, int id, char[] arg ) {
|
||||
super( node, id, arg );
|
||||
}
|
||||
|
||||
public IType getType() throws DOMException {
|
||||
throw new DOMException( this );
|
||||
}
|
||||
public IValue getValue() {
|
||||
return Value.UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
private final IASTName enumeratorName;
|
||||
|
@ -83,4 +88,12 @@ public class CEnumerator extends PlatformObject implements IEnumerator {
|
|||
public IBinding getOwner() throws DOMException {
|
||||
return CVisitor.findEnclosingFunction(enumeratorName);
|
||||
}
|
||||
|
||||
public IValue getValue() {
|
||||
IASTNode parent= enumeratorName.getParent();
|
||||
if (parent instanceof ASTEnumerator)
|
||||
return ((ASTEnumerator) parent).getIntegralValue();
|
||||
|
||||
return Value.UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,102 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2004, 2008 IBM Corporation 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:
|
||||
* IBM Corporation - initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.c;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ILinkage;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
import org.eclipse.cdt.core.dom.ast.c.ICExternalBinding;
|
||||
import org.eclipse.cdt.internal.core.dom.Linkage;
|
||||
import org.eclipse.core.runtime.PlatformObject;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
*/
|
||||
public class CExternalVariable extends PlatformObject implements ICExternalBinding, IVariable {
|
||||
private IASTTranslationUnit tu;
|
||||
private IASTName name;
|
||||
/**
|
||||
* @param name
|
||||
*/
|
||||
public CExternalVariable( IASTTranslationUnit tu, IASTName name ) {
|
||||
this.name = name;
|
||||
this.tu = tu;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getName()
|
||||
*/
|
||||
public String getName() {
|
||||
return name.toString();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getNameCharArray()
|
||||
*/
|
||||
public char[] getNameCharArray() {
|
||||
return name.toCharArray();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
|
||||
*/
|
||||
public IScope getScope() {
|
||||
return tu.getScope();
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IVariable#getType()
|
||||
*/
|
||||
public IType getType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IVariable#isStatic()
|
||||
*/
|
||||
public boolean isStatic() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IVariable#isExtern()
|
||||
*/
|
||||
public boolean isExtern() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IVariable#isAuto()
|
||||
*/
|
||||
public boolean isAuto() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IVariable#isRegister()
|
||||
*/
|
||||
public boolean isRegister() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public ILinkage getLinkage() {
|
||||
return Linkage.C_LINKAGE;
|
||||
}
|
||||
|
||||
public IBinding getOwner() {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -23,6 +23,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
|
|||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.c.ICASTTypedefNameSpecifier;
|
||||
import org.eclipse.cdt.internal.core.dom.Linkage;
|
||||
import org.eclipse.core.runtime.PlatformObject;
|
||||
|
@ -125,4 +126,8 @@ public class CKnRParameter extends PlatformObject implements IParameter {
|
|||
public IBinding getOwner() throws DOMException {
|
||||
return CVisitor.findEnclosingFunction(declaration);
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
|
|||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator;
|
||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||
import org.eclipse.cdt.internal.core.dom.Linkage;
|
||||
|
@ -55,6 +56,9 @@ public class CParameter extends PlatformObject implements IParameter {
|
|||
public boolean isRegister() throws DOMException {
|
||||
throw new DOMException( this );
|
||||
}
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private IASTName [] declarations;
|
||||
|
@ -197,4 +201,8 @@ public class CParameter extends PlatformObject implements IParameter {
|
|||
|
||||
return CVisitor.findEnclosingFunction(declarations[0]);
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,16 +16,21 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression;
|
||||
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.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
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.ProblemBinding;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.Value;
|
||||
import org.eclipse.core.runtime.PlatformObject;
|
||||
|
||||
/**
|
||||
|
@ -52,6 +57,9 @@ public class CVariable extends PlatformObject implements IVariable, ICInternalVa
|
|||
public boolean isRegister() throws DOMException {
|
||||
throw new DOMException( this );
|
||||
}
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
private IASTName [] declarations = null;
|
||||
private IType type = null;
|
||||
|
@ -151,4 +159,40 @@ public class CVariable extends PlatformObject implements IVariable, ICInternalVa
|
|||
|
||||
return CVisitor.findDeclarationOwner(declarations[0], true);
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
if (declarations != null) {
|
||||
for (IASTName decl : declarations) {
|
||||
if (decl == null)
|
||||
break;
|
||||
final IValue val= getInitialValue(decl);
|
||||
if (val != null)
|
||||
return val;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private IValue getInitialValue(IASTName name) {
|
||||
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);
|
||||
}
|
||||
if (init != null)
|
||||
return Value.UNKNOWN;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private IASTDeclarator findDeclarator(IASTName name) {
|
||||
IASTNode node = name.getParent();
|
||||
if (!(node instanceof IASTDeclarator))
|
||||
return null;
|
||||
|
||||
return CVisitor.findOutermostDeclarator((IASTDeclarator) node);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,92 +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.IASTExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ASTEnumerator;
|
||||
|
||||
/**
|
||||
* @author jcamelon
|
||||
* C++-specific enumerator.
|
||||
*/
|
||||
public class CPPASTEnumerator extends ASTNode implements IASTEnumerator, IASTAmbiguityParent {
|
||||
|
||||
private IASTName name;
|
||||
private IASTExpression value;
|
||||
|
||||
|
||||
public class CPPASTEnumerator extends ASTEnumerator {
|
||||
public CPPASTEnumerator() {
|
||||
super();
|
||||
}
|
||||
|
||||
public CPPASTEnumerator(IASTName name, IASTExpression value) {
|
||||
setName(name);
|
||||
setValue(value);
|
||||
super(name, value);
|
||||
}
|
||||
|
||||
public void setName(IASTName name) {
|
||||
this.name = name;
|
||||
if (name != null) {
|
||||
name.setParent(this);
|
||||
name.setPropertyInParent(ENUMERATOR_NAME);
|
||||
}
|
||||
}
|
||||
|
||||
public IASTName getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setValue(IASTExpression expression) {
|
||||
this.value = expression;
|
||||
if (expression != null) {
|
||||
expression.setParent(this);
|
||||
expression.setPropertyInParent(ENUMERATOR_VALUE);
|
||||
}
|
||||
}
|
||||
|
||||
public IASTExpression getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean accept( ASTVisitor action ){
|
||||
if( action.shouldVisitEnumerators ){
|
||||
switch( action.visit( this ) ){
|
||||
case ASTVisitor.PROCESS_ABORT : return false;
|
||||
case ASTVisitor.PROCESS_SKIP : return true;
|
||||
default : break;
|
||||
}
|
||||
}
|
||||
if( name != null ) if( !name.accept( action ) ) return false;
|
||||
if( value != null ) if( !value.accept( action ) ) return false;
|
||||
|
||||
if( action.shouldVisitEnumerators ){
|
||||
switch( action.leave( this ) ){
|
||||
case ASTVisitor.PROCESS_ABORT : return false;
|
||||
case ASTVisitor.PROCESS_SKIP : return true;
|
||||
default : break;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public int getRoleForName(IASTName n) {
|
||||
if( name == n )
|
||||
return r_definition;
|
||||
return r_reference;
|
||||
}
|
||||
|
||||
public void replace(IASTNode child, IASTNode other) {
|
||||
if( child == value ) {
|
||||
other.setPropertyInParent( child.getPropertyInParent() );
|
||||
other.setParent( child.getParent() );
|
||||
value = (IASTExpression) other;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,12 +6,9 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
* Andrew Niefer (IBM Corporation) - initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
/*
|
||||
* Created on Dec 10, 2004
|
||||
*/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
|
||||
|
@ -23,28 +20,28 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
|
|||
import org.eclipse.cdt.internal.core.index.IIndexType;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
* Integral c++ type.
|
||||
*/
|
||||
public class CPPBasicType implements ICPPBasicType {
|
||||
|
||||
protected int qualifierBits = 0;
|
||||
protected int type;
|
||||
protected IASTExpression value = null;
|
||||
protected IASTExpression expression = null;
|
||||
|
||||
public CPPBasicType( int t, int bits ){
|
||||
public CPPBasicType(int t, int bits) {
|
||||
type = t;
|
||||
qualifierBits = bits;
|
||||
|
||||
if( type == IBasicType.t_unspecified ){
|
||||
if( (qualifierBits & ( IS_LONG | IS_SHORT | IS_SIGNED | IS_UNSIGNED )) != 0 )
|
||||
if (type == IBasicType.t_unspecified) {
|
||||
if ((qualifierBits & (IS_LONG | IS_SHORT | IS_SIGNED | IS_UNSIGNED)) != 0)
|
||||
type = IBasicType.t_int;
|
||||
}
|
||||
}
|
||||
|
||||
public CPPBasicType( int t, int bits, IASTExpression val ){
|
||||
public CPPBasicType(int t, int bits, IASTExpression fromExpression) {
|
||||
type = t;
|
||||
qualifierBits = bits;
|
||||
value = val;
|
||||
expression= fromExpression;
|
||||
}
|
||||
|
||||
public boolean isSameType( IType object ) {
|
||||
|
@ -116,17 +113,25 @@ public class CPPBasicType implements ICPPBasicType {
|
|||
return t;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IBasicType#getValue()
|
||||
*/
|
||||
/**
|
||||
* @deprecated types don't have values
|
||||
*/
|
||||
@Deprecated
|
||||
public IASTExpression getValue() {
|
||||
return value;
|
||||
return expression;
|
||||
}
|
||||
|
||||
public void setValue( IASTExpression val ){
|
||||
value = val;
|
||||
public void setFromExpression(IASTExpression val) {
|
||||
expression = val;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the expression the type was created for, or <code>null</code>.
|
||||
*/
|
||||
public IASTExpression getCreatedFromExpression() {
|
||||
return expression;
|
||||
}
|
||||
|
||||
public int getQualifierBits() {
|
||||
return qualifierBits;
|
||||
}
|
||||
|
|
|
@ -6,7 +6,8 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
* Andrew Niefer (IBM Corporation) - initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
|
@ -20,14 +21,17 @@ import org.eclipse.cdt.core.dom.ast.IEnumeration;
|
|||
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
|
||||
import org.eclipse.cdt.internal.core.dom.Linkage;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ASTEnumerator;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.Value;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
|
||||
import org.eclipse.core.runtime.PlatformObject;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
* Binding for a c++ enumerator.
|
||||
*/
|
||||
public class CPPEnumerator extends PlatformObject implements IEnumerator, ICPPInternalBinding {
|
||||
|
||||
|
@ -133,4 +137,12 @@ public class CPPEnumerator extends PlatformObject implements IEnumerator, ICPPIn
|
|||
public IBinding getOwner() throws DOMException {
|
||||
return CPPVisitor.findDeclarationOwner(enumName, true);
|
||||
}
|
||||
|
||||
public IValue getValue() {
|
||||
final IASTNode parent= enumName.getParent();
|
||||
if (parent instanceof ASTEnumerator)
|
||||
return ((ASTEnumerator) parent).getIntegralValue();
|
||||
|
||||
return Value.UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
* Andrew Niefer (IBM) - Initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
@ -15,15 +15,17 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
|
|||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.ICompositeType;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
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;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
* Binding for a specialization of a field.
|
||||
*/
|
||||
public class CPPFieldSpecialization extends CPPSpecialization implements ICPPField {
|
||||
private IType type = null;
|
||||
private IValue value= null;
|
||||
|
||||
public CPPFieldSpecialization( IBinding orig, ICPPClassType owner, ObjectMap argMap ) {
|
||||
super(orig, owner, argMap);
|
||||
|
@ -76,4 +78,10 @@ public class CPPFieldSpecialization extends CPPSpecialization implements ICPPFie
|
|||
return getClassOwner();
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
if (value == null) {
|
||||
value= specializeValue(getField().getInitialValue());
|
||||
}
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
* Andrew Niefer (IBM Corporation) - initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
@ -24,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
|||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
|
||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||
import org.eclipse.cdt.internal.core.dom.Linkage;
|
||||
|
@ -34,7 +35,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
|
|||
import org.eclipse.core.runtime.PlatformObject;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
* Binding for a c++ function parameter
|
||||
*/
|
||||
public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPInternalBinding {
|
||||
public static class CPPParameterProblem extends ProblemBinding implements ICPPParameter {
|
||||
|
@ -74,6 +75,9 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
|
|||
public boolean isExternC() {
|
||||
return false;
|
||||
}
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private IType type = null;
|
||||
|
@ -301,4 +305,8 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
|
|||
public IBinding getOwner() throws DOMException {
|
||||
return CPPVisitor.findEnclosingFunction(declarations[0]);
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
* Andrew Niefer (IBM) - Initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
@ -14,11 +14,12 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
|||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
|
||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
* Binding for a specialization of a parameter.
|
||||
*/
|
||||
public class CPPParameterSpecialization extends CPPSpecialization implements ICPPParameter {
|
||||
private IType type = null;
|
||||
|
@ -83,4 +84,8 @@ public class CPPParameterSpecialization extends CPPSpecialization implements ICP
|
|||
public boolean isExternC() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM - Initial API and implementation
|
||||
* Andrew Niefer (IBM) - Initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
@ -17,6 +17,7 @@ import org.eclipse.cdt.core.dom.ast.IASTNode;
|
|||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
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.ICPPFunction;
|
||||
|
@ -31,7 +32,9 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
|
|||
import org.eclipse.core.runtime.PlatformObject;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
* Base class for all specializations in the AST. Note the specialization may also be created on behalf
|
||||
* of the index. The index may be concurrently be accessed (read-only) from different threads. So there
|
||||
* is a need to synchronize non-final members.
|
||||
*/
|
||||
public abstract class CPPSpecialization extends PlatformObject implements ICPPSpecialization, ICPPInternalBinding {
|
||||
private IBinding owner;
|
||||
|
@ -53,7 +56,11 @@ public abstract class CPPSpecialization extends PlatformObject implements ICPPSp
|
|||
return CPPTemplates.instantiateType(type, argumentMap, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public IValue specializeValue(IValue value) {
|
||||
return CPPTemplates.instantiateValue(value, argumentMap);
|
||||
}
|
||||
|
||||
public IBinding getSpecializedBinding() {
|
||||
return specialized;
|
||||
}
|
||||
|
|
|
@ -6,7 +6,8 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
* Andrew Niefer (IBM Corporation) - initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||
|
||||
|
@ -18,11 +19,12 @@ import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateNonTypeParameter;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
|
||||
|
||||
/**
|
||||
* @author aniefer
|
||||
* Binding for a non-type template parameter.
|
||||
*/
|
||||
public class CPPTemplateNonTypeParameter extends CPPTemplateParameter implements
|
||||
ICPPTemplateNonTypeParameter {
|
||||
|
@ -87,4 +89,8 @@ public class CPPTemplateNonTypeParameter extends CPPTemplateParameter implements
|
|||
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -17,13 +17,20 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression;
|
||||
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.IBasicType;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IPointerType;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
|
||||
|
@ -31,7 +38,9 @@ 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.ProblemBinding;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.Value;
|
||||
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;
|
||||
|
||||
/**
|
||||
|
@ -74,6 +83,9 @@ public class CPPVariable extends PlatformObject implements ICPPVariable, ICPPInt
|
|||
public boolean isRegister() throws DOMException {
|
||||
throw new DOMException(this);
|
||||
}
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private IASTName declarations[] = null;
|
||||
|
@ -362,4 +374,44 @@ public class CPPVariable extends PlatformObject implements ICPPVariable, ICPPInt
|
|||
public String toString() {
|
||||
return getName();
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
if (definition != null) {
|
||||
final IValue val= getInitialValue(definition);
|
||||
if (val != null)
|
||||
return val;
|
||||
}
|
||||
if (declarations != null) {
|
||||
for (IASTName decl : declarations) {
|
||||
if (decl == null)
|
||||
break;
|
||||
final IValue val= getInitialValue(decl);
|
||||
if (val != null)
|
||||
return val;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private IValue getInitialValue(IASTName name) {
|
||||
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);
|
||||
} 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);
|
||||
}
|
||||
}
|
||||
if (init != null)
|
||||
return Value.UNKNOWN;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,6 +43,7 @@ import org.eclipse.cdt.core.dom.ast.IQualifierType;
|
|||
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.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier;
|
||||
|
@ -872,6 +873,13 @@ public class CPPTemplates {
|
|||
}
|
||||
return spec;
|
||||
}
|
||||
|
||||
public static IValue instantiateValue(IValue value, ObjectMap argMap) {
|
||||
if (value == null)
|
||||
return null;
|
||||
// mstodo instantiate values
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method propagates the specialization of a member to the types used by the member.
|
||||
|
@ -1693,7 +1701,7 @@ public class CPPTemplates {
|
|||
CPPASTLiteralExpression exp = new CPPASTLiteralExpression();
|
||||
exp.setValue(String.valueOf(i));
|
||||
CPPBasicType temp = (CPPBasicType) t.clone();
|
||||
temp.setValue(exp);
|
||||
temp.setFromExpression(exp); // mstodo is that necessary??
|
||||
args[i] = temp;
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -1586,10 +1586,11 @@ public class CPPVisitor {
|
|||
|
||||
// Currently, CPPBasicType objects are also used to represent non-type template argument
|
||||
// values. We must ensure the initializer expression is attached to the type if available.
|
||||
// mstodo can be removed
|
||||
if (declarator.getInitializer() instanceof IASTInitializerExpression) {
|
||||
IType utype= getUltimateTypeUptoPointers(baseType);
|
||||
if (utype instanceof CPPBasicType) {
|
||||
((CPPBasicType)utype).setValue(((IASTInitializerExpression) declarator.getInitializer()).getExpression());
|
||||
((CPPBasicType)utype).setFromExpression(((IASTInitializerExpression) declarator.getInitializer()).getExpression());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1895,7 +1896,7 @@ public class CPPVisitor {
|
|||
case IASTBinaryExpression.op_equals:
|
||||
case IASTBinaryExpression.op_notequals:
|
||||
CPPBasicType basicType= new CPPBasicType(ICPPBasicType.t_bool, 0);
|
||||
basicType.setValue(expression);
|
||||
basicType.setFromExpression(expression);
|
||||
return basicType;
|
||||
case IASTBinaryExpression.op_plus:
|
||||
IType t2 = getExpressionType(binary.getOperand2());
|
||||
|
@ -1921,7 +1922,7 @@ public class CPPVisitor {
|
|||
} catch (DOMException e) {
|
||||
}
|
||||
basicType= new CPPBasicType(IBasicType.t_int, ICPPBasicType.IS_LONG | ICPPBasicType.IS_UNSIGNED);
|
||||
basicType.setValue(expression);
|
||||
basicType.setFromExpression(expression);
|
||||
return basicType;
|
||||
}
|
||||
return t1;
|
||||
|
@ -1999,7 +2000,7 @@ public class CPPVisitor {
|
|||
}
|
||||
return new CPPPointerType(type);
|
||||
} else if (type instanceof CPPBasicType) {
|
||||
((CPPBasicType) type).setValue(expression);
|
||||
((CPPBasicType) type).setFromExpression(expression);
|
||||
}
|
||||
return type;
|
||||
} else if (expression instanceof ICPPASTFieldReference) {
|
||||
|
@ -2161,7 +2162,7 @@ public class CPPVisitor {
|
|||
if (makelong > 1) {
|
||||
flags |= ICPPBasicType.IS_LONG_LONG;
|
||||
GPPBasicType result = new GPPBasicType(IBasicType.t_int, flags, null);
|
||||
result.setValue(expression);
|
||||
result.setFromExpression(expression);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -2386,7 +2387,9 @@ public class CPPVisitor {
|
|||
/**
|
||||
* @param e1
|
||||
* @return the first non id-expression by following values assigned to basic types.
|
||||
* @deprecated mstodo remove
|
||||
*/
|
||||
@Deprecated
|
||||
public static final IASTExpression reverseConstantPropagationLookup(IASTExpression e1) {
|
||||
try {
|
||||
for (int i= 0; e1 instanceof IASTIdExpression && i < 8; i++) {
|
||||
|
|
|
@ -42,6 +42,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
|||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerType;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding;
|
||||
|
@ -627,8 +628,8 @@ public class Conversions {
|
|||
if (t instanceof IBasicType && ((IBasicType)t).getType() == IBasicType.t_char &&
|
||||
s instanceof IQualifierType) {
|
||||
IType qt = ((IQualifierType) s).getType();
|
||||
if (qt instanceof IBasicType) {
|
||||
IASTExpression val = ((IBasicType) qt).getValue();
|
||||
if (qt instanceof CPPBasicType) {
|
||||
IASTExpression val = ((CPPBasicType) qt).getCreatedFromExpression();
|
||||
canConvert = (val != null &&
|
||||
val instanceof IASTLiteralExpression &&
|
||||
((IASTLiteralExpression)val).getKind() == IASTLiteralExpression.lk_string_literal);
|
||||
|
@ -738,9 +739,10 @@ public class Conversions {
|
|||
IType t = getUltimateType(trg, tHolder, true);
|
||||
IType sPrev= sHolder[0], tPrev= tHolder[0];
|
||||
|
||||
if (src instanceof IBasicType && trg instanceof IPointerType) {
|
||||
if (src instanceof CPPBasicType && trg instanceof IPointerType) {
|
||||
//4.10-1 an integral constant expression of integer type that evaluates to 0 can be converted to a pointer type
|
||||
IASTExpression exp = ((IBasicType)src).getValue();
|
||||
IASTExpression exp = ((CPPBasicType)src).getCreatedFromExpression();
|
||||
// mstodo improve by checking evaluation
|
||||
if (exp instanceof IASTLiteralExpression &&
|
||||
((IASTLiteralExpression)exp).getKind() == IASTLiteralExpression.lk_integer_constant) {
|
||||
try {
|
||||
|
|
|
@ -32,10 +32,10 @@ public class QualifierTypeClone implements IQualifierType, ITypeContainer, IInde
|
|||
}
|
||||
return type;
|
||||
}
|
||||
public boolean isConst() throws DOMException {
|
||||
public boolean isConst() {
|
||||
return delegate.isConst();
|
||||
}
|
||||
public boolean isVolatile() throws DOMException {
|
||||
public boolean isVolatile() {
|
||||
return delegate.isVolatile();
|
||||
}
|
||||
public boolean isSameType(IType type) {
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Symbian Software Systems and others.
|
||||
* Copyright (c) 2007, 2008 Symbian Software Systems 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:
|
||||
* Andrew Ferguson (Symbian) - Initial implementation
|
||||
* Andrew Ferguson (Symbian) - Initial implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.index.composite;
|
||||
|
||||
|
@ -21,11 +21,11 @@ public class CompositeQualifierType extends CompositeTypeContainer implements IQ
|
|||
super((ITypeContainer) qualifierType, cf);
|
||||
}
|
||||
|
||||
public boolean isConst() throws DOMException {
|
||||
public boolean isConst() {
|
||||
return ((IQualifierType)type).isConst();
|
||||
}
|
||||
|
||||
public boolean isVolatile() throws DOMException {
|
||||
public boolean isVolatile() {
|
||||
return ((IQualifierType)type).isVolatile();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Symbian Software Systems and others.
|
||||
* Copyright (c) 2007, 2008 Symbian Software Systems 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:
|
||||
* Andrew Ferguson (Symbian) - Initial implementation
|
||||
* Andrew Ferguson (Symbian) - Initial implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.index.composite.c;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexType;
|
||||
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
|
||||
|
@ -25,4 +26,8 @@ class CompositeCEnumerator extends CompositeCBinding implements IEnumerator {
|
|||
public IType getType() throws DOMException {
|
||||
return cf.getCompositeType((IIndexType)((IEnumerator)rbinding).getType());
|
||||
}
|
||||
|
||||
public IValue getValue() {
|
||||
return ((IEnumerator)rbinding).getValue();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,18 +1,19 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Symbian Software Systems and others.
|
||||
* Copyright (c) 2007, 2008 Symbian Software Systems 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:
|
||||
* Andrew Ferguson (Symbian) - Initial implementation
|
||||
* Andrew Ferguson (Symbian) - Initial implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.index.composite.c;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexType;
|
||||
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
|
||||
|
@ -44,4 +45,7 @@ class CompositeCParameter extends CompositeCBinding implements IParameter {
|
|||
return ((IParameter)rbinding).isStatic();
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,17 +1,18 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Symbian Software Systems and others.
|
||||
* Copyright (c) 2007, 2008 Symbian Software Systems 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:
|
||||
* Andrew Ferguson (Symbian) - Initial implementation
|
||||
* Andrew Ferguson (Symbian) - Initial implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.index.composite.c;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexType;
|
||||
|
@ -44,4 +45,7 @@ class CompositeCVariable extends CompositeCBinding implements IVariable {
|
|||
return ((IVariable)rbinding).isStatic();
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
return ((IVariable)rbinding).getInitialValue();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.index.composite.cpp;
|
|||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexType;
|
||||
import org.eclipse.cdt.internal.core.index.composite.ICompositesFactory;
|
||||
|
||||
|
@ -25,4 +26,8 @@ class CompositeCPPEnumerator extends CompositeCPPBinding implements IEnumerator
|
|||
IType type = ((IEnumerator)rbinding).getType();
|
||||
return cf.getCompositeType((IIndexType)type);
|
||||
}
|
||||
|
||||
public IValue getValue() {
|
||||
return ((IEnumerator)rbinding).getValue();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.index.composite.cpp;
|
|||
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexType;
|
||||
|
@ -52,4 +53,8 @@ class CompositeCPPVariable extends CompositeCPPBinding implements ICPPVariable {
|
|||
public boolean isStatic() throws DOMException {
|
||||
return ((ICPPVariable)rbinding).isStatic();
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
return ((ICPPVariable)rbinding).getInitialValue();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,12 +23,12 @@ import org.eclipse.cdt.core.parser.util.CharArrayMap;
|
|||
/**
|
||||
* Used to evaluate expressions in preprocessor directives.
|
||||
*/
|
||||
class ExpressionEvaluator {
|
||||
static class EvalException extends Exception {
|
||||
public class ExpressionEvaluator {
|
||||
public static class EvalException extends Exception {
|
||||
private int fProblemID;
|
||||
private char[] fProblemArg;
|
||||
|
||||
public EvalException(int problemID, char[] problemArg) {
|
||||
private EvalException(int problemID, char[] problemArg) {
|
||||
fProblemID= problemID;
|
||||
fProblemArg= problemArg;
|
||||
}
|
||||
|
@ -47,6 +47,9 @@ class ExpressionEvaluator {
|
|||
private ArrayList<IASTName> fMacrosInDefinedExpressions= new ArrayList<IASTName>();
|
||||
private LocationMap fLocationMap;
|
||||
|
||||
ExpressionEvaluator() {
|
||||
}
|
||||
|
||||
public boolean evaluate(TokenList condition, CharArrayMap<PreprocessorMacro> macroDictionary, LocationMap map) throws EvalException {
|
||||
fTokens= condition.first();
|
||||
fDictionary= macroDictionary;
|
||||
|
@ -331,8 +334,7 @@ class ExpressionEvaluator {
|
|||
return 1;
|
||||
}
|
||||
|
||||
private long getNumber(char[] image) throws EvalException {
|
||||
|
||||
public static long getNumber(char[] image) throws EvalException {
|
||||
// Integer constants written in binary are a non-standard extension
|
||||
// supported by GCC since 4.3 and by some other C compilers
|
||||
// They consist of a prefix 0b or 0B, followed by a sequence of 0 and 1 digits
|
||||
|
@ -409,7 +411,7 @@ class ExpressionEvaluator {
|
|||
}
|
||||
}
|
||||
|
||||
private long getNumber(char[] tokenImage, int from, int to, int base, int problemID) throws EvalException {
|
||||
private static long getNumber(char[] tokenImage, int from, int to, int base, int problemID) throws EvalException {
|
||||
if (from == to) {
|
||||
throw new EvalException(problemID, tokenImage);
|
||||
}
|
||||
|
@ -433,7 +435,7 @@ class ExpressionEvaluator {
|
|||
return result;
|
||||
}
|
||||
|
||||
private int getDigit(char c) {
|
||||
private static int getDigit(char c) {
|
||||
switch(c) {
|
||||
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
|
||||
return c-'0';
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* QNX - Initial API and implementation
|
||||
* Doug Schaefer (QNX) - Initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
* IBM Corporation
|
||||
* Andrew Ferguson (Symbian)
|
||||
|
@ -90,9 +90,7 @@ import org.eclipse.core.runtime.PlatformObject;
|
|||
import org.eclipse.core.runtime.Status;
|
||||
|
||||
/**
|
||||
* The PDOM Database.
|
||||
*
|
||||
* @author Doug Schaefer
|
||||
* Database for storing semantic information for one project.
|
||||
*/
|
||||
public class PDOM extends PlatformObject implements IPDOM {
|
||||
/**
|
||||
|
@ -180,6 +178,7 @@ public class PDOM extends PlatformObject implements IPDOM {
|
|||
* 71.0 - proper support for anonymous unions, bug 206450
|
||||
* 72.0 - store project-relative paths for resources that belong to the project, bug 239472
|
||||
* 72.1 - store flag for pure virtual methods.
|
||||
* 73.0 - add values for variables and enumerations, bug
|
||||
*/
|
||||
|
||||
public static final int LINKAGES = Database.DATA_AREA;
|
||||
|
|
|
@ -6,11 +6,10 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* QNX - Initial API and implementation
|
||||
* Doug Schaefer (QNX) - Initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
* IBM Corporation
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.internal.core.pdom.dom;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
|
@ -30,8 +29,7 @@ import org.eclipse.cdt.internal.core.pdom.db.Database;
|
|||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* @author Doug Schaefer
|
||||
*
|
||||
* Type qualifier for the index.
|
||||
*/
|
||||
public class PDOMQualifierType extends PDOMNode implements IQualifierType, ICQualifierType,
|
||||
ITypeContainer, IIndexType {
|
||||
|
@ -103,7 +101,7 @@ public class PDOMQualifierType extends PDOMNode implements IQualifierType, ICQua
|
|||
return pdom.getDB().getByte(record + FLAGS);
|
||||
}
|
||||
|
||||
public boolean isConst() throws DOMException {
|
||||
public boolean isConst() {
|
||||
try {
|
||||
return (getFlags() & CONST) != 0;
|
||||
} catch (CoreException e) {
|
||||
|
@ -112,7 +110,7 @@ public class PDOMQualifierType extends PDOMNode implements IQualifierType, ICQua
|
|||
}
|
||||
}
|
||||
|
||||
public boolean isVolatile() throws DOMException {
|
||||
public boolean isVolatile() {
|
||||
try {
|
||||
return (getFlags() & VOLATILE) != 0;
|
||||
} catch (CoreException e) {
|
||||
|
|
|
@ -1,42 +1,49 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006 QNX Software Systems and others.
|
||||
* Copyright (c) 2006, 2008 QNX Software Systems 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:
|
||||
* QNX - Initial API and implementation
|
||||
* Doug Schaefer (QNX) - Initial API and implementation
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.internal.core.pdom.dom.c;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.Value;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexCBindingConstants;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.Database;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* @author Doug Schaefer
|
||||
*
|
||||
* Binding for c enumerator in the index.
|
||||
*/
|
||||
class PDOMCEnumerator extends PDOMBinding implements IEnumerator {
|
||||
|
||||
private static final int ENUMERATION = PDOMBinding.RECORD_SIZE + 0;
|
||||
private static final int NEXT_ENUMERATOR = PDOMBinding.RECORD_SIZE + 4;
|
||||
private static final int VALUE= PDOMBinding.RECORD_SIZE + 8;
|
||||
|
||||
@SuppressWarnings("hiding")
|
||||
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 8;
|
||||
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 12;
|
||||
|
||||
public PDOMCEnumerator(PDOM pdom, PDOMNode parent, IEnumerator enumerator, PDOMCEnumeration enumeration)
|
||||
throws CoreException {
|
||||
super(pdom, parent, enumerator.getNameCharArray());
|
||||
pdom.getDB().putInt(record + ENUMERATION, enumeration.getRecord());
|
||||
|
||||
final Database db = pdom.getDB();
|
||||
db.putInt(record + ENUMERATION, enumeration.getRecord());
|
||||
storeValue(db, enumerator);
|
||||
enumeration.addEnumerator(this);
|
||||
}
|
||||
|
||||
|
@ -54,6 +61,21 @@ class PDOMCEnumerator extends PDOMBinding implements IEnumerator {
|
|||
return IIndexCBindingConstants.CENUMERATOR;
|
||||
}
|
||||
|
||||
private void storeValue(final Database db, IEnumerator enumerator) throws CoreException {
|
||||
IValue value= enumerator.getValue();
|
||||
if (value != null) {
|
||||
Long val= value.numericalValue();
|
||||
db.putInt(record + VALUE, val == null ? -1 : val.intValue());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(PDOMLinkage linkage, IBinding newBinding) throws CoreException {
|
||||
if (newBinding instanceof IEnumerator)
|
||||
storeValue(pdom.getDB(), (IEnumerator) newBinding);
|
||||
}
|
||||
|
||||
|
||||
public PDOMCEnumerator getNextEnumerator() throws CoreException {
|
||||
int value = pdom.getDB().getInt(record + NEXT_ENUMERATOR);
|
||||
return value != 0 ? new PDOMCEnumerator(pdom, value) : null;
|
||||
|
@ -73,4 +95,13 @@ class PDOMCEnumerator extends PDOMBinding implements IEnumerator {
|
|||
}
|
||||
}
|
||||
|
||||
public IValue getValue() {
|
||||
try {
|
||||
int val= pdom.getDB().getInt(record + VALUE);
|
||||
return Value.create(val);
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
}
|
||||
return Value.UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* QNX - Initial API and implementation
|
||||
* Doug Schaefer (QNX) - Initial API and implementation
|
||||
* Andrew Ferguson (Symbian)
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
|
@ -18,6 +18,7 @@ import org.eclipse.cdt.core.dom.ast.IASTInitializer;
|
|||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.index.IIndexFile;
|
||||
import org.eclipse.cdt.internal.core.Util;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexCBindingConstants;
|
||||
|
@ -33,9 +34,7 @@ import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
|
|||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* A parameter to a function or a method
|
||||
*
|
||||
* @author Doug Schaefer
|
||||
* Binding for a function parameter in the index.
|
||||
*/
|
||||
class PDOMCParameter extends PDOMNamedNode implements IParameter, IPDOMBinding {
|
||||
|
||||
|
@ -195,4 +194,8 @@ class PDOMCParameter extends PDOMNamedNode implements IParameter, IPDOMBinding {
|
|||
public IIndexFile getLocalToFile() throws CoreException {
|
||||
return null;
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,16 +1,15 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2006, 2007 QNX Software Systems and others.
|
||||
* Copyright (c) 2006, 2008 QNX Software Systems 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:
|
||||
* QNX - Initial API and implementation
|
||||
* Doug Schaefer (QNX) - Initial API and implementation
|
||||
* IBM Corporation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.internal.core.pdom.dom.c;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
|
@ -18,10 +17,13 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
import org.eclipse.cdt.internal.core.Util;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.Value;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexCBindingConstants;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.Database;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
|
||||
|
@ -29,52 +31,70 @@ import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
|||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* @author Doug Schaefer
|
||||
*
|
||||
* Database representation for c-variables
|
||||
*/
|
||||
class PDOMCVariable extends PDOMBinding implements IVariable {
|
||||
|
||||
/**
|
||||
* Offset of pointer to type information for this parameter
|
||||
* Offset of pointer to type information for this variable
|
||||
* (relative to the beginning of the record).
|
||||
*/
|
||||
private static final int TYPE_OFFSET = PDOMBinding.RECORD_SIZE + 0;
|
||||
|
||||
|
||||
/**
|
||||
* Offset of pointer to value information for this variable
|
||||
* (relative to the beginning of the record).
|
||||
*/
|
||||
private static final int VALUE_OFFSET = PDOMBinding.RECORD_SIZE + 4;
|
||||
|
||||
/**
|
||||
* Offset of annotation information (relative to the beginning of the
|
||||
* record).
|
||||
*/
|
||||
private static final int ANNOTATIONS = PDOMBinding.RECORD_SIZE + 4;
|
||||
private static final int ANNOTATIONS = PDOMBinding.RECORD_SIZE + 8;
|
||||
|
||||
/**
|
||||
* The size in bytes of a PDOMCVariable record in the database.
|
||||
*/
|
||||
@SuppressWarnings("hiding")
|
||||
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 5;
|
||||
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 9;
|
||||
|
||||
public PDOMCVariable(PDOM pdom, PDOMNode parent, IVariable variable) throws CoreException {
|
||||
super(pdom, parent, variable.getNameCharArray());
|
||||
|
||||
try {
|
||||
final Database db = pdom.getDB();
|
||||
setType(parent.getLinkageImpl(), variable.getType());
|
||||
pdom.getDB().putByte(record + ANNOTATIONS, PDOMCAnnotation.encodeAnnotation(variable));
|
||||
db.putByte(record + ANNOTATIONS, PDOMCAnnotation.encodeAnnotation(variable));
|
||||
|
||||
setValue(db, variable);
|
||||
} catch (DOMException e) {
|
||||
throw new CoreException(Util.createStatus(e));
|
||||
}
|
||||
}
|
||||
|
||||
private void setValue(final Database db, IVariable variable) throws CoreException {
|
||||
IValue val= variable.getInitialValue();
|
||||
db.putInt(record + VALUE_OFFSET, val == null ? 0 : db.newString(val.getCanonicalRepresentation()).getRecord());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(final PDOMLinkage linkage, IBinding newBinding) throws CoreException {
|
||||
if (newBinding instanceof IVariable) {
|
||||
final Database db = pdom.getDB();
|
||||
IVariable var= (IVariable) newBinding;
|
||||
IType mytype= getType();
|
||||
int valueRec= db.getInt(record + VALUE_OFFSET);
|
||||
try {
|
||||
IType newType= var.getType();
|
||||
setType(linkage, newType);
|
||||
if (mytype != null) {
|
||||
db.putByte(record + ANNOTATIONS, PDOMCAnnotation.encodeAnnotation(var));
|
||||
setValue(db, var);
|
||||
|
||||
if (mytype != null)
|
||||
linkage.deleteType(mytype, record);
|
||||
}
|
||||
pdom.getDB().putByte(record + ANNOTATIONS, PDOMCAnnotation.encodeAnnotation(var));
|
||||
if (valueRec != 0)
|
||||
db.getString(valueRec).delete();
|
||||
} catch (DOMException e) {
|
||||
throw new CoreException(Util.createStatus(e));
|
||||
}
|
||||
|
@ -110,6 +130,19 @@ class PDOMCVariable extends PDOMBinding implements IVariable {
|
|||
}
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
try {
|
||||
final Database db = pdom.getDB();
|
||||
int valRec = db.getInt(record + VALUE_OFFSET);
|
||||
if (valRec == 0)
|
||||
return null;
|
||||
return Value.fromCanonicalRepresentation(db.getString(valRec).getString());
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isStatic() throws DOMException {
|
||||
return getBit(getByte(record + ANNOTATIONS), PDOMCAnnotation.STATIC_OFFSET);
|
||||
}
|
||||
|
|
|
@ -6,37 +6,46 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* QNX - Initial API and implementation
|
||||
* Doug Schaefer (QNX) - Initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.Value;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.Database;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* @author Doug Schaefer
|
||||
*
|
||||
* Binding for a c++ enumerator in the index.
|
||||
*/
|
||||
class PDOMCPPEnumerator extends PDOMCPPBinding implements IEnumerator {
|
||||
|
||||
private static final int ENUMERATION = PDOMBinding.RECORD_SIZE + 0;
|
||||
private static final int NEXT_ENUMERATOR = PDOMBinding.RECORD_SIZE + 4;
|
||||
private static final int VALUE= PDOMBinding.RECORD_SIZE + 8;
|
||||
|
||||
@SuppressWarnings("hiding")
|
||||
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 8;
|
||||
|
||||
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 12;
|
||||
|
||||
public PDOMCPPEnumerator(PDOM pdom, PDOMNode parent, IEnumerator enumerator, PDOMCPPEnumeration enumeration)
|
||||
throws CoreException {
|
||||
super(pdom, parent, enumerator.getNameCharArray());
|
||||
pdom.getDB().putInt(record + ENUMERATION, enumeration.getRecord());
|
||||
|
||||
final Database db = pdom.getDB();
|
||||
db.putInt(record + ENUMERATION, enumeration.getRecord());
|
||||
storeValue(db, enumerator);
|
||||
enumeration.addEnumerator(this);
|
||||
}
|
||||
|
||||
|
@ -54,6 +63,20 @@ class PDOMCPPEnumerator extends PDOMCPPBinding implements IEnumerator {
|
|||
return IIndexCPPBindingConstants.CPPENUMERATOR;
|
||||
}
|
||||
|
||||
private void storeValue(final Database db, IEnumerator enumerator) throws CoreException {
|
||||
IValue value= enumerator.getValue();
|
||||
if (value != null) {
|
||||
Long val= value.numericalValue();
|
||||
db.putInt(record + VALUE, val == null ? -1 : val.intValue());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(PDOMLinkage linkage, IBinding newBinding) throws CoreException {
|
||||
if (newBinding instanceof IEnumerator)
|
||||
storeValue(pdom.getDB(), (IEnumerator) newBinding);
|
||||
}
|
||||
|
||||
public PDOMCPPEnumerator getNextEnumerator() throws CoreException {
|
||||
int value = pdom.getDB().getInt(record + NEXT_ENUMERATOR);
|
||||
return value != 0 ? new PDOMCPPEnumerator(pdom, value) : null;
|
||||
|
@ -72,4 +95,14 @@ class PDOMCPPEnumerator extends PDOMCPPBinding implements IEnumerator {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public IValue getValue() {
|
||||
try {
|
||||
int val= pdom.getDB().getInt(record + VALUE);
|
||||
return Value.create(val);
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
}
|
||||
return Value.UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* QNX - Initial API and implementation
|
||||
* Bryan Wilkinson (QNX) - Initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
||||
|
@ -15,30 +15,38 @@ import org.eclipse.cdt.core.CCorePlugin;
|
|||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.ICompositeType;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
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.dom.ast.cpp.ICPPSpecialization;
|
||||
import org.eclipse.cdt.internal.core.Util;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.Value;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.Database;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
|
||||
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* @author Bryan Wilkinson
|
||||
*
|
||||
* Binding for a specialization of a field, used in the index.
|
||||
*/
|
||||
class PDOMCPPFieldSpecialization extends PDOMCPPSpecialization implements
|
||||
ICPPField {
|
||||
|
||||
private static final int TYPE = PDOMCPPSpecialization.RECORD_SIZE + 0;
|
||||
|
||||
/**
|
||||
* Offset of pointer to value information for this variable
|
||||
* (relative to the beginning of the record).
|
||||
*/
|
||||
private static final int VALUE_OFFSET = PDOMBinding.RECORD_SIZE + 4;
|
||||
|
||||
/**
|
||||
* The size in bytes of a PDOMCPPFieldSpecialization record in the database.
|
||||
*/
|
||||
@SuppressWarnings("hiding")
|
||||
protected static final int RECORD_SIZE = PDOMCPPSpecialization.RECORD_SIZE + 4;
|
||||
protected static final int RECORD_SIZE = PDOMCPPSpecialization.RECORD_SIZE + 8;
|
||||
|
||||
public PDOMCPPFieldSpecialization(PDOM pdom, PDOMNode parent,
|
||||
ICPPField field, PDOMBinding specialized)
|
||||
|
@ -46,11 +54,17 @@ class PDOMCPPFieldSpecialization extends PDOMCPPSpecialization implements
|
|||
super(pdom, parent, (ICPPSpecialization) field, specialized);
|
||||
|
||||
try {
|
||||
final Database db = pdom.getDB();
|
||||
IType type = field.getType();
|
||||
PDOMNode typeNode = getLinkageImpl().addType(this, type);
|
||||
if (typeNode != null) {
|
||||
pdom.getDB().putInt(record + TYPE, typeNode.getRecord());
|
||||
db.putInt(record + TYPE, typeNode.getRecord());
|
||||
}
|
||||
IValue val= field.getInitialValue();
|
||||
if (val != null) {
|
||||
db.putInt(record + VALUE_OFFSET, db.newString(val.getCanonicalRepresentation()).getRecord());
|
||||
}
|
||||
|
||||
} catch (DOMException e) {
|
||||
throw new CoreException(Util.createStatus(e));
|
||||
}
|
||||
|
@ -90,6 +104,19 @@ class PDOMCPPFieldSpecialization extends PDOMCPPSpecialization implements
|
|||
return null;
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
try {
|
||||
final Database db = pdom.getDB();
|
||||
int valRec = db.getInt(record + VALUE_OFFSET);
|
||||
if (valRec == 0)
|
||||
return null;
|
||||
return Value.fromCanonicalRepresentation(db.getString(valRec).toString());
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isAuto() throws DOMException {
|
||||
return getField().isAuto();
|
||||
}
|
||||
|
|
|
@ -6,17 +6,17 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* QNX - Initial API and implementation
|
||||
* Doug Schaefer (QNX) - Initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
* IBM Corporation
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
|
||||
import org.eclipse.cdt.core.index.IIndexFile;
|
||||
import org.eclipse.cdt.internal.core.Util;
|
||||
|
@ -33,9 +33,7 @@ import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
|
|||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* A parameter to a function or a method
|
||||
*
|
||||
* @author Doug Schaefer
|
||||
* Binding for a parameter of a c++ function in the index.
|
||||
*/
|
||||
class PDOMCPPParameter extends PDOMNamedNode implements ICPPParameter, IPDOMBinding {
|
||||
|
||||
|
@ -259,4 +257,8 @@ class PDOMCPPParameter extends PDOMNamedNode implements ICPPParameter, IPDOMBind
|
|||
public IIndexFile getLocalToFile() throws CoreException {
|
||||
return null;
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 QNX Software Systems and others.
|
||||
* Copyright (c) 2007, 2008 QNX Software Systems 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:
|
||||
* QNX - Initial API and implementation
|
||||
* Bryan Wilkinson (QNX) - Initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
||||
|
@ -14,6 +14,7 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
|||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||
import org.eclipse.cdt.internal.core.Util;
|
||||
|
@ -24,8 +25,7 @@ import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
|
|||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* @author Bryan Wilkinson
|
||||
*
|
||||
* Binding for a specialization of a parameter in the index.
|
||||
*/
|
||||
class PDOMCPPParameterSpecialization extends PDOMCPPSpecialization implements ICPPParameter {
|
||||
/**
|
||||
|
@ -140,4 +140,7 @@ class PDOMCPPParameterSpecialization extends PDOMCPPSpecialization implements IC
|
|||
return false;
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,11 +6,10 @@
|
|||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* QNX - Initial API and implementation
|
||||
* Doug Schaefer (QNX) - Initial API and implementation
|
||||
* Markus Schorn (Wind River Systems)
|
||||
* IBM Corporation
|
||||
*******************************************************************************/
|
||||
|
||||
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
|
||||
|
||||
import org.eclipse.cdt.core.CCorePlugin;
|
||||
|
@ -18,9 +17,11 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
|
||||
import org.eclipse.cdt.internal.core.Util;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.Value;
|
||||
import org.eclipse.cdt.internal.core.index.IIndexCPPBindingConstants;
|
||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||
import org.eclipse.cdt.internal.core.pdom.db.Database;
|
||||
|
@ -32,28 +33,33 @@ import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCAnnotation;
|
|||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* @author Doug Schaefer
|
||||
*
|
||||
* Binding for a c++ variable in the index, serves as a base class for fields.
|
||||
*/
|
||||
class PDOMCPPVariable extends PDOMCPPBinding implements ICPPVariable {
|
||||
|
||||
/**
|
||||
* Offset of pointer to type information for this parameter
|
||||
* Offset of pointer to type information for this variable
|
||||
* (relative to the beginning of the record).
|
||||
*/
|
||||
private static final int TYPE_OFFSET = PDOMBinding.RECORD_SIZE + 0;
|
||||
|
||||
/**
|
||||
* Offset of pointer to value information for this variable
|
||||
* (relative to the beginning of the record).
|
||||
*/
|
||||
private static final int VALUE_OFFSET = PDOMBinding.RECORD_SIZE + 4;
|
||||
|
||||
/**
|
||||
* Offset of annotation information (relative to the beginning of the
|
||||
* record).
|
||||
*/
|
||||
protected static final int ANNOTATIONS = PDOMBinding.RECORD_SIZE + 4; // byte
|
||||
protected static final int ANNOTATIONS = PDOMBinding.RECORD_SIZE + 8; // byte
|
||||
|
||||
/**
|
||||
* The size in bytes of a PDOMCPPVariable record in the database.
|
||||
*/
|
||||
@SuppressWarnings("hiding")
|
||||
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 5;
|
||||
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 9;
|
||||
|
||||
public PDOMCPPVariable(PDOM pdom, PDOMNode parent, IVariable variable) throws CoreException {
|
||||
super(pdom, parent, variable.getNameCharArray());
|
||||
|
@ -63,23 +69,34 @@ class PDOMCPPVariable extends PDOMCPPBinding implements ICPPVariable {
|
|||
Database db = pdom.getDB();
|
||||
setType(parent.getLinkageImpl(), variable.getType());
|
||||
db.putByte(record + ANNOTATIONS, encodeFlags(variable));
|
||||
setValue(db, variable);
|
||||
} catch (DOMException e) {
|
||||
throw new CoreException(Util.createStatus(e));
|
||||
}
|
||||
}
|
||||
|
||||
private void setValue(Database db, IVariable variable) throws CoreException {
|
||||
IValue val= variable.getInitialValue();
|
||||
db.putInt(record + VALUE_OFFSET, val == null ? 0 : db.newString(val.getCanonicalRepresentation()).getRecord());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(final PDOMLinkage linkage, IBinding newBinding) throws CoreException {
|
||||
if (newBinding instanceof IVariable) {
|
||||
final Database db = pdom.getDB();
|
||||
IVariable var= (IVariable) newBinding;
|
||||
IType mytype= getType();
|
||||
int valueRec= db.getInt(record + VALUE_OFFSET);
|
||||
try {
|
||||
IType newType= var.getType();
|
||||
setType(linkage, newType);
|
||||
pdom.getDB().putByte(record + ANNOTATIONS, PDOMCPPAnnotation.encodeAnnotation(var));
|
||||
if (mytype != null) {
|
||||
db.putByte(record + ANNOTATIONS, encodeFlags(var));
|
||||
setValue(db, var);
|
||||
if (mytype != null)
|
||||
linkage.deleteType(mytype, record);
|
||||
}
|
||||
if (valueRec != 0)
|
||||
db.getString(valueRec).delete();
|
||||
|
||||
} catch (DOMException e) {
|
||||
throw new CoreException(Util.createStatus(e));
|
||||
}
|
||||
|
@ -124,6 +141,19 @@ class PDOMCPPVariable extends PDOMCPPBinding implements ICPPVariable {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
try {
|
||||
final Database db = pdom.getDB();
|
||||
int valRec = db.getInt(record + VALUE_OFFSET);
|
||||
if (valRec == 0)
|
||||
return null;
|
||||
return Value.fromCanonicalRepresentation(db.getString(valRec).getString());
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isAuto() throws DOMException {
|
||||
return getBit(getByte(record + ANNOTATIONS), PDOMCAnnotation.AUTO_OFFSET);
|
||||
|
|
|
@ -17,7 +17,9 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
|
|||
import org.eclipse.cdt.core.dom.ast.IEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.internal.core.dom.Linkage;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.Value;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor;
|
||||
import org.eclipse.core.runtime.PlatformObject;
|
||||
|
||||
|
@ -74,4 +76,8 @@ public class C99Enumerator extends PlatformObject implements IC99Binding, IEnume
|
|||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public IValue getValue() {
|
||||
return Value.UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@ import org.eclipse.cdt.core.dom.ast.IASTNode;
|
|||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||
import org.eclipse.cdt.core.dom.ast.IScope;
|
||||
import org.eclipse.cdt.core.dom.ast.IType;
|
||||
import org.eclipse.cdt.core.dom.ast.IValue;
|
||||
import org.eclipse.cdt.core.dom.ast.IVariable;
|
||||
import org.eclipse.cdt.internal.core.dom.Linkage;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor;
|
||||
|
@ -119,4 +120,8 @@ public class C99Variable extends PlatformObject implements IC99Binding, IVariabl
|
|||
|
||||
return CVisitor.findDeclarationOwner((IASTNode) scope.getScopeName(), true);
|
||||
}
|
||||
|
||||
public IValue getInitialValue() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue