mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Added toString methods.
This commit is contained in:
parent
934ea2e952
commit
7cdbcfc0f9
3 changed files with 263 additions and 185 deletions
|
@ -12,6 +12,9 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||||
import org.eclipse.cdt.core.dom.ast.IField;
|
import org.eclipse.cdt.core.dom.ast.IField;
|
||||||
|
@ -25,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPDeferredTemplateInstance;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
|
||||||
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
import org.eclipse.cdt.core.parser.util.ArrayUtil;
|
||||||
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
import org.eclipse.cdt.core.parser.util.ObjectMap;
|
||||||
|
@ -201,6 +205,63 @@ public class CPPClassInstance extends CPPInstance implements ICPPClassType, ICPP
|
||||||
return ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
|
return ICPPMethod.EMPTY_CPPMETHOD_ARRAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a combined argument map of this class and all its base template classes.
|
||||||
|
* This combined map helps with instantiation of members of template classes that subclass
|
||||||
|
* other template classes (see AST2TemplateTests#testRebindPattern_214017_2()).
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public ObjectMap getArgumentMap() {
|
||||||
|
ObjectMap argMap = argumentMap;
|
||||||
|
List<ICPPSpecialization> bases = null;
|
||||||
|
try {
|
||||||
|
for (ICPPBase base : getBases()) {
|
||||||
|
IBinding baseClass = base.getBaseClass();
|
||||||
|
if (baseClass instanceof ICPPSpecialization) {
|
||||||
|
if (bases == null) {
|
||||||
|
bases = new ArrayList<ICPPSpecialization>();
|
||||||
|
}
|
||||||
|
bases.add((ICPPSpecialization) baseClass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bases != null) {
|
||||||
|
for (int i = 0; i < bases.size(); i++) {
|
||||||
|
for (ICPPBase base : ((ICPPClassType) bases.get(i)).getBases()) {
|
||||||
|
IBinding baseClass = base.getBaseClass();
|
||||||
|
if (baseClass instanceof ICPPSpecialization) {
|
||||||
|
bases.add((ICPPSpecialization) baseClass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (bases.size() > 20) { // Protect against cyclic inheritance.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (DOMException e) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bases != null) {
|
||||||
|
for (ICPPSpecialization base : bases) {
|
||||||
|
// Protect against infinite recursion.
|
||||||
|
ObjectMap baseArgMap = base instanceof CPPClassInstance ?
|
||||||
|
((CPPClassInstance) base).argumentMap : base.getArgumentMap();
|
||||||
|
if (!baseArgMap.isEmpty()) {
|
||||||
|
if (argMap == argumentMap) {
|
||||||
|
argMap = (ObjectMap) argumentMap.clone();
|
||||||
|
}
|
||||||
|
for (int i = 0; i < baseArgMap.size(); i++) {
|
||||||
|
Object key = baseArgMap.keyAt(i);
|
||||||
|
if (!argMap.containsKey(key)) {
|
||||||
|
argMap.put(key, baseArgMap.getAt(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return argMap;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
return obj instanceof ICPPClassType && isSameType((ICPPClassType) obj);
|
return obj instanceof ICPPClassType && isSameType((ICPPClassType) obj);
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.dom.ILinkage;
|
import org.eclipse.cdt.core.dom.ILinkage;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
|
||||||
import org.eclipse.cdt.core.dom.ast.DOMException;
|
import org.eclipse.cdt.core.dom.ast.DOMException;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
|
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
|
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
|
||||||
|
@ -47,57 +48,57 @@ import org.eclipse.core.runtime.PlatformObject;
|
||||||
public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInternalFunction {
|
public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInternalFunction {
|
||||||
|
|
||||||
public static class CPPFunctionProblem extends ProblemBinding implements ICPPFunction {
|
public static class CPPFunctionProblem extends ProblemBinding implements ICPPFunction {
|
||||||
public CPPFunctionProblem( IASTNode node, int id, char[] arg ) {
|
public CPPFunctionProblem(IASTNode node, int id, char[] arg) {
|
||||||
super( node, id, arg );
|
super(node, id, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IParameter[] getParameters() throws DOMException {
|
public IParameter[] getParameters() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IScope getFunctionScope() throws DOMException {
|
public IScope getFunctionScope() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IFunctionType getType() throws DOMException {
|
public IFunctionType getType() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean isStatic() throws DOMException {
|
public boolean isStatic() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public String[] getQualifiedName() throws DOMException {
|
public String[] getQualifiedName() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public char[][] getQualifiedNameCharArray() throws DOMException {
|
public char[][] getQualifiedNameCharArray() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean isGloballyQualified() throws DOMException {
|
public boolean isGloballyQualified() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean isMutable() throws DOMException {
|
public boolean isMutable() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean isInline() throws DOMException {
|
public boolean isInline() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean isExternC() throws DOMException {
|
public boolean isExternC() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean isExtern() throws DOMException {
|
public boolean isExtern() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean isAuto() throws DOMException {
|
public boolean isAuto() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean isRegister() throws DOMException {
|
public boolean isRegister() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean takesVarArgs() throws DOMException {
|
public boolean takesVarArgs() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ICPPASTFunctionDeclarator [] declarations;
|
protected ICPPASTFunctionDeclarator[] declarations;
|
||||||
protected ICPPASTFunctionDeclarator definition;
|
protected ICPPASTFunctionDeclarator definition;
|
||||||
protected IFunctionType type = null;
|
protected IFunctionType type = null;
|
||||||
|
|
||||||
|
@ -105,28 +106,28 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
private static final int RESOLUTION_IN_PROGRESS = 1 << 1;
|
private static final int RESOLUTION_IN_PROGRESS = 1 << 1;
|
||||||
private int bits = 0;
|
private int bits = 0;
|
||||||
|
|
||||||
public CPPFunction( ICPPASTFunctionDeclarator declarator ){
|
public CPPFunction(ICPPASTFunctionDeclarator declarator) {
|
||||||
if( declarator != null ) {
|
if (declarator != null) {
|
||||||
IASTNode parent = declarator.getParent();
|
IASTNode parent = declarator.getParent();
|
||||||
if( parent instanceof IASTFunctionDefinition )
|
if (parent instanceof IASTFunctionDefinition)
|
||||||
definition = declarator;
|
definition = declarator;
|
||||||
else
|
else
|
||||||
declarations = new ICPPASTFunctionDeclarator [] { declarator };
|
declarations = new ICPPASTFunctionDeclarator[] { declarator };
|
||||||
|
|
||||||
IASTName name= getASTName();
|
IASTName name= getASTName();
|
||||||
name.setBinding( this );
|
name.setBinding(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resolveAllDeclarations(){
|
private void resolveAllDeclarations() {
|
||||||
if( (bits & (FULLY_RESOLVED | RESOLUTION_IN_PROGRESS)) == 0 ){
|
if ((bits & (FULLY_RESOLVED | RESOLUTION_IN_PROGRESS)) == 0) {
|
||||||
bits |= RESOLUTION_IN_PROGRESS;
|
bits |= RESOLUTION_IN_PROGRESS;
|
||||||
IASTTranslationUnit tu = null;
|
IASTTranslationUnit tu = null;
|
||||||
if( definition != null )
|
if (definition != null) {
|
||||||
tu = definition.getTranslationUnit();
|
tu = definition.getTranslationUnit();
|
||||||
else if( declarations != null )
|
} else if (declarations != null) {
|
||||||
tu = declarations[0].getTranslationUnit();
|
tu = declarations[0].getTranslationUnit();
|
||||||
else {
|
} else {
|
||||||
//implicit binding
|
//implicit binding
|
||||||
IScope scope = getScope();
|
IScope scope = getScope();
|
||||||
try {
|
try {
|
||||||
|
@ -134,13 +135,14 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
if (node != null) {
|
if (node != null) {
|
||||||
tu = node.getTranslationUnit();
|
tu = node.getTranslationUnit();
|
||||||
}
|
}
|
||||||
} catch ( DOMException e ) {
|
} catch (DOMException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( tu != null ){
|
if (tu != null) {
|
||||||
CPPVisitor.getDeclarations( tu, this );
|
CPPVisitor.getDeclarations(tu, this);
|
||||||
}
|
}
|
||||||
declarations = (ICPPASTFunctionDeclarator[]) ArrayUtil.trim( ICPPASTFunctionDeclarator.class, declarations );
|
declarations = (ICPPASTFunctionDeclarator[]) ArrayUtil.trim(ICPPASTFunctionDeclarator.class,
|
||||||
|
declarations);
|
||||||
bits |= FULLY_RESOLVED;
|
bits |= FULLY_RESOLVED;
|
||||||
bits &= ~RESOLUTION_IN_PROGRESS;
|
bits &= ~RESOLUTION_IN_PROGRESS;
|
||||||
}
|
}
|
||||||
|
@ -160,46 +162,48 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
return definition;
|
return definition;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addDefinition( IASTNode node ){
|
public void addDefinition(IASTNode node) {
|
||||||
if( node instanceof IASTName )
|
if (node instanceof IASTName)
|
||||||
node = node.getParent();
|
node = node.getParent();
|
||||||
if( !(node instanceof ICPPASTFunctionDeclarator) )
|
if (!(node instanceof ICPPASTFunctionDeclarator))
|
||||||
return;
|
return;
|
||||||
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) node;
|
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) node;
|
||||||
updateParameterBindings( dtor );
|
updateParameterBindings(dtor);
|
||||||
definition = dtor;
|
definition = dtor;
|
||||||
}
|
}
|
||||||
public void addDeclaration( IASTNode node ){
|
public void addDeclaration(IASTNode node) {
|
||||||
if( node instanceof IASTName )
|
if (node instanceof IASTName)
|
||||||
node = node.getParent();
|
node = node.getParent();
|
||||||
if( !(node instanceof ICPPASTFunctionDeclarator) )
|
if (!(node instanceof ICPPASTFunctionDeclarator))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) node;
|
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) node;
|
||||||
updateParameterBindings( dtor );
|
updateParameterBindings(dtor);
|
||||||
|
|
||||||
if( declarations == null ){
|
if (declarations == null) {
|
||||||
declarations = new ICPPASTFunctionDeclarator [] { dtor };
|
declarations = new ICPPASTFunctionDeclarator[] { dtor };
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//keep the lowest offset declaration in [0]
|
// Keep the lowest offset declaration in [0]
|
||||||
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
|
if (declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset()) {
|
||||||
declarations = (ICPPASTFunctionDeclarator[]) ArrayUtil.prepend( ICPPASTFunctionDeclarator.class, declarations, dtor );
|
declarations = (ICPPASTFunctionDeclarator[]) ArrayUtil.prepend(ICPPASTFunctionDeclarator.class,
|
||||||
|
declarations, dtor);
|
||||||
} else {
|
} else {
|
||||||
declarations = (ICPPASTFunctionDeclarator[]) ArrayUtil.append( ICPPASTFunctionDeclarator.class, declarations, dtor );
|
declarations = (ICPPASTFunctionDeclarator[]) ArrayUtil.append(ICPPASTFunctionDeclarator.class,
|
||||||
|
declarations, dtor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeDeclaration(IASTNode node) {
|
public void removeDeclaration(IASTNode node) {
|
||||||
while( node instanceof IASTName ){
|
while (node instanceof IASTName) {
|
||||||
node = node.getParent();
|
node = node.getParent();
|
||||||
}
|
}
|
||||||
if( definition == node ){
|
if (definition == node) {
|
||||||
definition = null;
|
definition = null;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if( declarations != null ) {
|
if (declarations != null) {
|
||||||
ArrayUtil.remove(declarations, node);
|
ArrayUtil.remove(declarations, node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -207,13 +211,13 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IFunction#getParameters()
|
* @see org.eclipse.cdt.core.dom.ast.IFunction#getParameters()
|
||||||
*/
|
*/
|
||||||
public IParameter [] getParameters() {
|
public IParameter[] getParameters() {
|
||||||
IASTStandardFunctionDeclarator dtor = ( definition != null ) ? definition : declarations[0];
|
IASTStandardFunctionDeclarator dtor = (definition != null) ? definition : declarations[0];
|
||||||
IASTParameterDeclaration[] params = dtor.getParameters();
|
IASTParameterDeclaration[] params = dtor.getParameters();
|
||||||
int size = params.length;
|
int size = params.length;
|
||||||
IParameter [] result = new IParameter[ size ];
|
IParameter[] result = new IParameter[ size ];
|
||||||
if( size > 0 ){
|
if (size > 0) {
|
||||||
for( int i = 0; i < size; i++ ){
|
for (int i = 0; i < size; i++) {
|
||||||
IASTParameterDeclaration p = params[i];
|
IASTParameterDeclaration p = params[i];
|
||||||
final IASTName name = p.getDeclarator().getName();
|
final IASTName name = p.getDeclarator().getName();
|
||||||
final IBinding binding= name.resolveBinding();
|
final IBinding binding= name.resolveBinding();
|
||||||
|
@ -221,7 +225,8 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
result[i]= (IParameter) binding;
|
result[i]= (IParameter) binding;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
result[i] = new CPPParameter.CPPParameterProblem(p, IProblemBinding.SEMANTIC_INVALID_TYPE, name.toCharArray());
|
result[i] = new CPPParameter.CPPParameterProblem(p, IProblemBinding.SEMANTIC_INVALID_TYPE,
|
||||||
|
name.toCharArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -233,7 +238,7 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
*/
|
*/
|
||||||
public IScope getFunctionScope() {
|
public IScope getFunctionScope() {
|
||||||
resolveAllDeclarations();
|
resolveAllDeclarations();
|
||||||
if( definition != null ){
|
if (definition != null) {
|
||||||
return definition.getFunctionScope();
|
return definition.getFunctionScope();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,15 +260,15 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
}
|
}
|
||||||
|
|
||||||
private IASTName getASTName() {
|
private IASTName getASTName() {
|
||||||
IASTDeclarator dtor = ( definition != null ) ? definition : declarations[0];
|
IASTDeclarator dtor = (definition != null) ? definition : declarations[0];
|
||||||
IASTDeclarator nested= dtor.getNestedDeclarator();
|
IASTDeclarator nested= dtor.getNestedDeclarator();
|
||||||
while (nested != null) {
|
while (nested != null) {
|
||||||
dtor= nested;
|
dtor= nested;
|
||||||
nested= nested.getNestedDeclarator();
|
nested= nested.getNestedDeclarator();
|
||||||
}
|
}
|
||||||
IASTName name= dtor.getName();
|
IASTName name= dtor.getName();
|
||||||
if( name instanceof ICPPASTQualifiedName ){
|
if (name instanceof ICPPASTQualifiedName) {
|
||||||
IASTName [] ns = ((ICPPASTQualifiedName)name).getNames();
|
IASTName[] ns = ((ICPPASTQualifiedName)name).getNames();
|
||||||
name = ns[ ns.length - 1 ];
|
name = ns[ ns.length - 1 ];
|
||||||
}
|
}
|
||||||
return name;
|
return name;
|
||||||
|
@ -274,29 +279,29 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
|
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
|
||||||
*/
|
*/
|
||||||
public IScope getScope() {
|
public IScope getScope() {
|
||||||
IASTName n= getASTName();
|
IASTName n = getASTName();
|
||||||
IScope scope = CPPVisitor.getContainingScope( n );
|
IScope scope = CPPVisitor.getContainingScope(n);
|
||||||
if( scope instanceof ICPPClassScope ){
|
if (scope instanceof ICPPClassScope) {
|
||||||
ICPPASTDeclSpecifier declSpec = null;
|
ICPPASTDeclSpecifier declSpec = null;
|
||||||
if( definition != null ){
|
if (definition != null) {
|
||||||
IASTNode node = definition.getParent();
|
IASTNode node = definition.getParent();
|
||||||
while( node instanceof IASTDeclarator )
|
while (node instanceof IASTDeclarator)
|
||||||
node = node.getParent();
|
node = node.getParent();
|
||||||
IASTFunctionDefinition def = (IASTFunctionDefinition) node;
|
IASTFunctionDefinition def = (IASTFunctionDefinition) node;
|
||||||
declSpec = (ICPPASTDeclSpecifier) def.getDeclSpecifier();
|
declSpec = (ICPPASTDeclSpecifier) def.getDeclSpecifier();
|
||||||
} else {
|
} else {
|
||||||
IASTNode node = declarations[0].getParent();
|
IASTNode node = declarations[0].getParent();
|
||||||
while( node instanceof IASTDeclarator )
|
while (node instanceof IASTDeclarator)
|
||||||
node = node.getParent();
|
node = node.getParent();
|
||||||
IASTSimpleDeclaration decl = (IASTSimpleDeclaration)node;
|
IASTSimpleDeclaration decl = (IASTSimpleDeclaration)node;
|
||||||
declSpec = (ICPPASTDeclSpecifier) decl.getDeclSpecifier();
|
declSpec = (ICPPASTDeclSpecifier) decl.getDeclSpecifier();
|
||||||
}
|
}
|
||||||
if( declSpec.isFriend() ) {
|
if (declSpec.isFriend()) {
|
||||||
try {
|
try {
|
||||||
while( scope instanceof ICPPClassScope ){
|
while (scope instanceof ICPPClassScope) {
|
||||||
scope = scope.getParent();
|
scope = scope.getParent();
|
||||||
}
|
}
|
||||||
} catch ( DOMException e ) {
|
} catch (DOMException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -307,51 +312,51 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IFunction#getType()
|
* @see org.eclipse.cdt.core.dom.ast.IFunction#getType()
|
||||||
*/
|
*/
|
||||||
public IFunctionType getType() {
|
public IFunctionType getType() {
|
||||||
if( type == null )
|
if (type == null)
|
||||||
type = (IFunctionType) CPPVisitor.createType( ( definition != null ) ? definition : declarations[0] );
|
type = (IFunctionType) CPPVisitor.createType((definition != null) ? definition : declarations[0]);
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IBinding resolveParameter( IASTParameterDeclaration param ){
|
public IBinding resolveParameter(IASTParameterDeclaration param) {
|
||||||
IASTDeclarator dtor = param.getDeclarator();
|
IASTDeclarator dtor = param.getDeclarator();
|
||||||
while( dtor.getNestedDeclarator() != null )
|
while (dtor.getNestedDeclarator() != null)
|
||||||
dtor = dtor.getNestedDeclarator();
|
dtor = dtor.getNestedDeclarator();
|
||||||
IASTName name = dtor.getName();
|
IASTName name = dtor.getName();
|
||||||
IBinding binding = name.getBinding();
|
IBinding binding = name.getBinding();
|
||||||
if( binding != null )
|
if (binding != null)
|
||||||
return binding;
|
return binding;
|
||||||
|
|
||||||
IASTStandardFunctionDeclarator fdtor = (IASTStandardFunctionDeclarator) param.getParent();
|
IASTStandardFunctionDeclarator fdtor = (IASTStandardFunctionDeclarator) param.getParent();
|
||||||
IASTParameterDeclaration [] ps = fdtor.getParameters();
|
IASTParameterDeclaration[] ps = fdtor.getParameters();
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for( ; i < ps.length; i++ ){
|
for (; i < ps.length; i++) {
|
||||||
if( param == ps[i] )
|
if (param == ps[i])
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
//create a new binding and set it for the corresponding parameter in all known defns and decls
|
//create a new binding and set it for the corresponding parameter in all known defns and decls
|
||||||
binding = new CPPParameter( name );
|
binding = new CPPParameter(name);
|
||||||
IASTParameterDeclaration temp = null;
|
IASTParameterDeclaration temp = null;
|
||||||
if( definition != null ){
|
if (definition != null) {
|
||||||
IASTParameterDeclaration[] paramDecls = definition.getParameters();
|
IASTParameterDeclaration[] paramDecls = definition.getParameters();
|
||||||
if (paramDecls.length > i) { // This will be less than i if we have a void parameter
|
if (paramDecls.length > i) { // This will be less than i if we have a void parameter
|
||||||
temp = paramDecls[i];
|
temp = paramDecls[i];
|
||||||
IASTName n = temp.getDeclarator().getName();
|
IASTName n = temp.getDeclarator().getName();
|
||||||
if( n != name ) {
|
if (n != name) {
|
||||||
n.setBinding( binding );
|
n.setBinding(binding);
|
||||||
((CPPParameter)binding).addDeclaration( n );
|
((CPPParameter)binding).addDeclaration(n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( declarations != null ){
|
if (declarations != null) {
|
||||||
for( int j = 0; j < declarations.length && declarations[j] != null; j++ ){
|
for (int j = 0; j < declarations.length && declarations[j] != null; j++) {
|
||||||
IASTParameterDeclaration [] paramDecls = declarations[j].getParameters();
|
IASTParameterDeclaration[] paramDecls = declarations[j].getParameters();
|
||||||
if( paramDecls.length > i ) {
|
if (paramDecls.length > i) {
|
||||||
temp = paramDecls[i];
|
temp = paramDecls[i];
|
||||||
IASTName n = temp.getDeclarator().getName();
|
IASTName n = temp.getDeclarator().getName();
|
||||||
if( n != name ) {
|
if (n != name) {
|
||||||
n.setBinding( binding );
|
n.setBinding(binding);
|
||||||
((CPPParameter)binding).addDeclaration( n );
|
((CPPParameter)binding).addDeclaration(n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -359,20 +364,20 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
return binding;
|
return binding;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void updateParameterBindings( ICPPASTFunctionDeclarator fdtor ){
|
protected void updateParameterBindings(ICPPASTFunctionDeclarator fdtor) {
|
||||||
ICPPASTFunctionDeclarator orig = definition != null ? definition : declarations[0];
|
ICPPASTFunctionDeclarator orig = definition != null ? definition : declarations[0];
|
||||||
IASTParameterDeclaration [] ops = orig.getParameters();
|
IASTParameterDeclaration[] ops = orig.getParameters();
|
||||||
IASTParameterDeclaration [] nps = fdtor.getParameters();
|
IASTParameterDeclaration[] nps = fdtor.getParameters();
|
||||||
CPPParameter temp = null;
|
CPPParameter temp = null;
|
||||||
for( int i = 0; i < ops.length; i++ ){
|
for (int i = 0; i < ops.length; i++) {
|
||||||
temp = (CPPParameter) ops[i].getDeclarator().getName().getBinding();
|
temp = (CPPParameter) ops[i].getDeclarator().getName().getBinding();
|
||||||
if( temp != null && nps.length > i ){ //length could be different, ie 0 or 1 with void
|
if (temp != null && nps.length > i) { //length could be different, ie 0 or 1 with void
|
||||||
IASTDeclarator dtor = nps[i].getDeclarator();
|
IASTDeclarator dtor = nps[i].getDeclarator();
|
||||||
while( dtor.getNestedDeclarator() != null )
|
while (dtor.getNestedDeclarator() != null)
|
||||||
dtor = dtor.getNestedDeclarator();
|
dtor = dtor.getNestedDeclarator();
|
||||||
IASTName name = dtor.getName();
|
IASTName name = dtor.getName();
|
||||||
name.setBinding( temp );
|
name.setBinding(temp);
|
||||||
temp.addDeclaration( name );
|
temp.addDeclaration(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -380,41 +385,41 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IFunction#isStatic()
|
* @see org.eclipse.cdt.core.dom.ast.IFunction#isStatic()
|
||||||
*/
|
*/
|
||||||
public boolean isStatic( ) {
|
public boolean isStatic() {
|
||||||
return isStatic( true );
|
return isStatic(true);
|
||||||
}
|
}
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction#isStatic(boolean)
|
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction#isStatic(boolean)
|
||||||
*/
|
*/
|
||||||
public boolean isStatic( boolean resolveAll ) {
|
public boolean isStatic(boolean resolveAll) {
|
||||||
if( resolveAll && (bits & FULLY_RESOLVED) == 0 ){
|
if (resolveAll && (bits & FULLY_RESOLVED) == 0) {
|
||||||
resolveAllDeclarations();
|
resolveAllDeclarations();
|
||||||
}
|
}
|
||||||
return hasStorageClass( this, IASTDeclSpecifier.sc_static );
|
return hasStorageClass(this, IASTDeclSpecifier.sc_static);
|
||||||
}
|
}
|
||||||
// }
|
|
||||||
// static public boolean isStatic
|
// static public boolean isStatic
|
||||||
// //2 state bits, most significant = whether or not we've figure this out yet
|
// //2 state bits, most significant = whether or not we've figure this out yet
|
||||||
// //least significant = whether or not we are static
|
// //least significant = whether or not we are static
|
||||||
// int state = ( bits & IS_STATIC ) >> 2;
|
// int state = (bits & IS_STATIC) >> 2;
|
||||||
// if( state > 1 ) return (state % 2 != 0);
|
// if (state > 1) return (state % 2 != 0);
|
||||||
//
|
//
|
||||||
// IASTDeclSpecifier declSpec = null;
|
// IASTDeclSpecifier declSpec = null;
|
||||||
// IASTFunctionDeclarator dtor = (IASTFunctionDeclarator) getDefinition();
|
// IASTFunctionDeclarator dtor = (IASTFunctionDeclarator) getDefinition();
|
||||||
// if( dtor != null ){
|
// if (dtor != null) {
|
||||||
// declSpec = ((IASTFunctionDefinition)dtor.getParent()).getDeclSpecifier();
|
// declSpec = ((IASTFunctionDefinition)dtor.getParent()).getDeclSpecifier();
|
||||||
// if( declSpec.getStorageClass() == IASTDeclSpecifier.sc_static ){
|
// if (declSpec.getStorageClass() == IASTDeclSpecifier.sc_static) {
|
||||||
// bits |= 3 << 2;
|
// bits |= 3 << 2;
|
||||||
// return true;
|
// return true;
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// IASTFunctionDeclarator[] dtors = (IASTFunctionDeclarator[]) getDeclarations();
|
// IASTFunctionDeclarator[] dtors = (IASTFunctionDeclarator[]) getDeclarations();
|
||||||
// if( dtors != null ) {
|
// if (dtors != null) {
|
||||||
// for( int i = 0; i < dtors.length; i++ ){
|
// for (int i = 0; i < dtors.length; i++) {
|
||||||
// IASTNode parent = dtors[i].getParent();
|
// IASTNode parent = dtors[i].getParent();
|
||||||
// declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
|
// declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
|
||||||
// if( declSpec.getStorageClass() == IASTDeclSpecifier.sc_static ){
|
// if (declSpec.getStorageClass() == IASTDeclSpecifier.sc_static) {
|
||||||
// bits |= 3 << 2;
|
// bits |= 3 << 2;
|
||||||
// return true;
|
// return true;
|
||||||
// }
|
// }
|
||||||
|
@ -428,14 +433,14 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getFullyQualifiedName()
|
* @see org.eclipse.cdt.core.dom.ast.IBinding#getFullyQualifiedName()
|
||||||
*/
|
*/
|
||||||
public String[] getQualifiedName() {
|
public String[] getQualifiedName() {
|
||||||
return CPPVisitor.getQualifiedName( this );
|
return CPPVisitor.getQualifiedName(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getFullyQualifiedNameCharArray()
|
* @see org.eclipse.cdt.core.dom.ast.IBinding#getFullyQualifiedNameCharArray()
|
||||||
*/
|
*/
|
||||||
public char[][] getQualifiedNameCharArray() {
|
public char[][] getQualifiedNameCharArray() {
|
||||||
return CPPVisitor.getQualifiedNameCharArray( this );
|
return CPPVisitor.getQualifiedNameCharArray(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
@ -443,40 +448,41 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
*/
|
*/
|
||||||
public boolean isGloballyQualified() throws DOMException {
|
public boolean isGloballyQualified() throws DOMException {
|
||||||
IScope scope = getScope();
|
IScope scope = getScope();
|
||||||
while( scope != null ){
|
while (scope != null) {
|
||||||
if( scope instanceof ICPPBlockScope )
|
if (scope instanceof ICPPBlockScope)
|
||||||
return false;
|
return false;
|
||||||
scope = scope.getParent();
|
scope = scope.getParent();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static public boolean hasStorageClass( ICPPInternalFunction function, int storage){
|
static public boolean hasStorageClass(ICPPInternalFunction function, int storage) {
|
||||||
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) function.getDefinition();
|
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) function.getDefinition();
|
||||||
IASTNode[] ds = function.getDeclarations();
|
IASTNode[] ds = function.getDeclarations();
|
||||||
|
|
||||||
int i = -1;
|
int i = -1;
|
||||||
do{
|
do {
|
||||||
if( dtor != null ){
|
if (dtor != null) {
|
||||||
IASTNode parent = dtor.getParent();
|
IASTNode parent = dtor.getParent();
|
||||||
while( !(parent instanceof IASTDeclaration) )
|
while (!(parent instanceof IASTDeclaration))
|
||||||
parent = parent.getParent();
|
parent = parent.getParent();
|
||||||
|
|
||||||
IASTDeclSpecifier declSpec = null;
|
IASTDeclSpecifier declSpec = null;
|
||||||
if( parent instanceof IASTSimpleDeclaration )
|
if (parent instanceof IASTSimpleDeclaration) {
|
||||||
declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
|
declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
|
||||||
else if( parent instanceof IASTFunctionDefinition )
|
} else if (parent instanceof IASTFunctionDefinition) {
|
||||||
declSpec = ((IASTFunctionDefinition)parent).getDeclSpecifier();
|
declSpec = ((IASTFunctionDefinition)parent).getDeclSpecifier();
|
||||||
if( declSpec.getStorageClass() == storage ) {
|
}
|
||||||
|
if (declSpec.getStorageClass() == storage) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( ds != null && ++i < ds.length ) {
|
if (ds != null && ++i < ds.length) {
|
||||||
dtor = (ICPPASTFunctionDeclarator) ds[i];
|
dtor = (ICPPASTFunctionDeclarator) ds[i];
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
break;
|
break;
|
||||||
} while( dtor != null );
|
}
|
||||||
|
} while (dtor != null);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -494,26 +500,26 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) getDefinition();
|
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) getDefinition();
|
||||||
ICPPASTFunctionDeclarator[] ds = (ICPPASTFunctionDeclarator[]) getDeclarations();
|
ICPPASTFunctionDeclarator[] ds = (ICPPASTFunctionDeclarator[]) getDeclarations();
|
||||||
int i = -1;
|
int i = -1;
|
||||||
do{
|
do {
|
||||||
if( dtor != null ){
|
if (dtor != null) {
|
||||||
IASTNode parent = dtor.getParent();
|
IASTNode parent = dtor.getParent();
|
||||||
while( !(parent instanceof IASTDeclaration) )
|
while (!(parent instanceof IASTDeclaration))
|
||||||
parent = parent.getParent();
|
parent = parent.getParent();
|
||||||
|
|
||||||
IASTDeclSpecifier declSpec = null;
|
IASTDeclSpecifier declSpec = null;
|
||||||
if( parent instanceof IASTSimpleDeclaration )
|
if (parent instanceof IASTSimpleDeclaration)
|
||||||
declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
|
declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
|
||||||
else if( parent instanceof IASTFunctionDefinition )
|
else if (parent instanceof IASTFunctionDefinition)
|
||||||
declSpec = ((IASTFunctionDefinition)parent).getDeclSpecifier();
|
declSpec = ((IASTFunctionDefinition)parent).getDeclSpecifier();
|
||||||
|
|
||||||
if( declSpec.isInline() )
|
if (declSpec.isInline())
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if( ds != null && ++i < ds.length )
|
if (ds != null && ++i < ds.length)
|
||||||
dtor = ds[i];
|
dtor = ds[i];
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
} while( dtor != null );
|
} while (dtor != null);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -539,21 +545,21 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IFunction#isExtern()
|
* @see org.eclipse.cdt.core.dom.ast.IFunction#isExtern()
|
||||||
*/
|
*/
|
||||||
public boolean isExtern() {
|
public boolean isExtern() {
|
||||||
return hasStorageClass( this, IASTDeclSpecifier.sc_extern );
|
return hasStorageClass(this, IASTDeclSpecifier.sc_extern);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IFunction#isAuto()
|
* @see org.eclipse.cdt.core.dom.ast.IFunction#isAuto()
|
||||||
*/
|
*/
|
||||||
public boolean isAuto() {
|
public boolean isAuto() {
|
||||||
return hasStorageClass( this, IASTDeclSpecifier.sc_auto );
|
return hasStorageClass(this, IASTDeclSpecifier.sc_auto);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IFunction#isRegister()
|
* @see org.eclipse.cdt.core.dom.ast.IFunction#isRegister()
|
||||||
*/
|
*/
|
||||||
public boolean isRegister() {
|
public boolean isRegister() {
|
||||||
return hasStorageClass( this, IASTDeclSpecifier.sc_register );
|
return hasStorageClass(this, IASTDeclSpecifier.sc_register);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
@ -561,11 +567,11 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
*/
|
*/
|
||||||
public boolean takesVarArgs() {
|
public boolean takesVarArgs() {
|
||||||
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) getDefinition();
|
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) getDefinition();
|
||||||
if( dtor != null ){
|
if (dtor != null) {
|
||||||
return dtor.takesVarArgs();
|
return dtor.takesVarArgs();
|
||||||
}
|
}
|
||||||
ICPPASTFunctionDeclarator [] ds = (ICPPASTFunctionDeclarator[]) getDeclarations();
|
ICPPASTFunctionDeclarator[] ds = (ICPPASTFunctionDeclarator[]) getDeclarations();
|
||||||
if( ds != null && ds.length > 0 ){
|
if (ds != null && ds.length > 0) {
|
||||||
return ds[0].takesVarArgs();
|
return ds[0].takesVarArgs();
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -574,4 +580,9 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
|
||||||
public ILinkage getLinkage() {
|
public ILinkage getLinkage() {
|
||||||
return Linkage.CPP_LINKAGE;
|
return Linkage.CPP_LINKAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return getName() + ASTTypeUtil.getParameterTypeString(getType()); //$NON-NLS-1$
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,38 +35,38 @@ import org.eclipse.core.runtime.PlatformObject;
|
||||||
*/
|
*/
|
||||||
public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPInternalBinding {
|
public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPInternalBinding {
|
||||||
public static class CPPParameterProblem extends ProblemBinding implements ICPPParameter {
|
public static class CPPParameterProblem extends ProblemBinding implements ICPPParameter {
|
||||||
public CPPParameterProblem( IASTNode node, int id, char[] arg ) {
|
public CPPParameterProblem(IASTNode node, int id, char[] arg) {
|
||||||
super( node, id, arg );
|
super(node, id, arg);
|
||||||
}
|
}
|
||||||
public IType getType() throws DOMException {
|
public IType getType() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean isStatic() throws DOMException {
|
public boolean isStatic() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean isExtern() throws DOMException {
|
public boolean isExtern() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean isAuto() throws DOMException {
|
public boolean isAuto() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean isRegister() throws DOMException {
|
public boolean isRegister() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean hasDefaultValue() {
|
public boolean hasDefaultValue() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
public boolean isMutable() throws DOMException {
|
public boolean isMutable() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public String[] getQualifiedName() throws DOMException {
|
public String[] getQualifiedName() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public char[][] getQualifiedNameCharArray() throws DOMException {
|
public char[][] getQualifiedNameCharArray() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean isGloballyQualified() throws DOMException {
|
public boolean isGloballyQualified() throws DOMException {
|
||||||
throw new DOMException( this );
|
throw new DOMException(this);
|
||||||
}
|
}
|
||||||
public boolean isExternC() {
|
public boolean isExternC() {
|
||||||
return false;
|
return false;
|
||||||
|
@ -74,14 +74,14 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
|
||||||
}
|
}
|
||||||
|
|
||||||
private IType type = null;
|
private IType type = null;
|
||||||
private IASTName [] declarations = null;
|
private IASTName[] declarations = null;
|
||||||
|
|
||||||
|
|
||||||
public CPPParameter( IASTName name ){
|
public CPPParameter(IASTName name) {
|
||||||
this.declarations = new IASTName [] { name };
|
this.declarations = new IASTName[] { name };
|
||||||
}
|
}
|
||||||
|
|
||||||
public CPPParameter( IType type ){
|
public CPPParameter(IType type) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,18 +99,18 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addDeclaration( IASTNode node ){
|
public void addDeclaration(IASTNode node) {
|
||||||
if( !(node instanceof IASTName ) )
|
if (!(node instanceof IASTName))
|
||||||
return;
|
return;
|
||||||
IASTName name = (IASTName) node;
|
IASTName name = (IASTName) node;
|
||||||
if( declarations == null )
|
if (declarations == null) {
|
||||||
declarations = new IASTName[] { name };
|
declarations = new IASTName[] { name };
|
||||||
else {
|
} else {
|
||||||
//keep the lowest offset declaration in [0]
|
//keep the lowest offset declaration in[0]
|
||||||
if( declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset() ){
|
if (declarations.length > 0 && ((ASTNode)node).getOffset() < ((ASTNode)declarations[0]).getOffset()) {
|
||||||
declarations = (IASTName[]) ArrayUtil.prepend( IASTName.class, declarations, name );
|
declarations = (IASTName[]) ArrayUtil.prepend(IASTName.class, declarations, name);
|
||||||
} else {
|
} else {
|
||||||
declarations = (IASTName[]) ArrayUtil.append( IASTName.class, declarations, name );
|
declarations = (IASTName[]) ArrayUtil.append(IASTName.class, declarations, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -119,14 +119,14 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
|
||||||
ArrayUtil.remove(declarations, node);
|
ArrayUtil.remove(declarations, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
private IASTName getPrimaryDeclaration(){
|
private IASTName getPrimaryDeclaration() {
|
||||||
if( declarations != null ){
|
if (declarations != null) {
|
||||||
for( int i = 0; i < declarations.length && declarations[i] != null; i++ ){
|
for (int i = 0; i < declarations.length && declarations[i] != null; i++) {
|
||||||
IASTNode node = declarations[i].getParent();
|
IASTNode node = declarations[i].getParent();
|
||||||
while( !(node instanceof IASTDeclaration) )
|
while (!(node instanceof IASTDeclaration))
|
||||||
node = node.getParent();
|
node = node.getParent();
|
||||||
|
|
||||||
if( node instanceof IASTFunctionDefinition )
|
if (node instanceof IASTFunctionDefinition)
|
||||||
return declarations[i];
|
return declarations[i];
|
||||||
}
|
}
|
||||||
return declarations[0];
|
return declarations[0];
|
||||||
|
@ -138,7 +138,7 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
|
||||||
*/
|
*/
|
||||||
public String getName() {
|
public String getName() {
|
||||||
IASTName name = getPrimaryDeclaration();
|
IASTName name = getPrimaryDeclaration();
|
||||||
if( name != null )
|
if (name != null)
|
||||||
return name.toString();
|
return name.toString();
|
||||||
return CPPSemantics.EMPTY_NAME;
|
return CPPSemantics.EMPTY_NAME;
|
||||||
}
|
}
|
||||||
|
@ -148,7 +148,7 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
|
||||||
*/
|
*/
|
||||||
public char[] getNameCharArray() {
|
public char[] getNameCharArray() {
|
||||||
IASTName name = getPrimaryDeclaration();
|
IASTName name = getPrimaryDeclaration();
|
||||||
if( name != null )
|
if (name != null)
|
||||||
return name.toCharArray();
|
return name.toCharArray();
|
||||||
return CPPSemantics.EMPTY_NAME_ARRAY;
|
return CPPSemantics.EMPTY_NAME_ARRAY;
|
||||||
}
|
}
|
||||||
|
@ -157,14 +157,14 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
|
* @see org.eclipse.cdt.core.dom.ast.IBinding#getScope()
|
||||||
*/
|
*/
|
||||||
public IScope getScope() {
|
public IScope getScope() {
|
||||||
return CPPVisitor.getContainingScope( getPrimaryDeclaration() );
|
return CPPVisitor.getContainingScope(getPrimaryDeclaration());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getPhysicalNode()
|
* @see org.eclipse.cdt.core.dom.ast.IBinding#getPhysicalNode()
|
||||||
*/
|
*/
|
||||||
public IASTNode getPhysicalNode() {
|
public IASTNode getPhysicalNode() {
|
||||||
if( declarations != null )
|
if (declarations != null)
|
||||||
return declarations[0];
|
return declarations[0];
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -173,8 +173,8 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IVariable#getType()
|
* @see org.eclipse.cdt.core.dom.ast.IVariable#getType()
|
||||||
*/
|
*/
|
||||||
public IType getType() {
|
public IType getType() {
|
||||||
if( type == null && declarations != null ){
|
if (type == null && declarations != null) {
|
||||||
type = CPPVisitor.createType( (IASTDeclarator) declarations[0].getParent() );
|
type = CPPVisitor.createType((IASTDeclarator) declarations[0].getParent());
|
||||||
}
|
}
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
@ -190,14 +190,14 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getFullyQualifiedName()
|
* @see org.eclipse.cdt.core.dom.ast.IBinding#getFullyQualifiedName()
|
||||||
*/
|
*/
|
||||||
public String[] getQualifiedName() {
|
public String[] getQualifiedName() {
|
||||||
return new String [] { getName() };
|
return new String[] { getName() };
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IBinding#getFullyQualifiedNameCharArray()
|
* @see org.eclipse.cdt.core.dom.ast.IBinding#getFullyQualifiedNameCharArray()
|
||||||
*/
|
*/
|
||||||
public char[][] getQualifiedNameCharArray() {
|
public char[][] getQualifiedNameCharArray() {
|
||||||
return new char[][]{ getNameCharArray() };
|
return new char[][] { getNameCharArray() };
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
@ -211,7 +211,7 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
|
||||||
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDefinition(org.eclipse.cdt.core.dom.ast.IASTNode)
|
* @see org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding#addDefinition(org.eclipse.cdt.core.dom.ast.IASTNode)
|
||||||
*/
|
*/
|
||||||
public void addDefinition(IASTNode node) {
|
public void addDefinition(IASTNode node) {
|
||||||
addDeclaration( node );
|
addDeclaration(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
@ -234,29 +234,29 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IVariable#isAuto()
|
* @see org.eclipse.cdt.core.dom.ast.IVariable#isAuto()
|
||||||
*/
|
*/
|
||||||
public boolean isAuto() {
|
public boolean isAuto() {
|
||||||
return hasStorageClass( IASTDeclSpecifier.sc_auto );
|
return hasStorageClass(IASTDeclSpecifier.sc_auto);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IVariable#isRegister()
|
* @see org.eclipse.cdt.core.dom.ast.IVariable#isRegister()
|
||||||
*/
|
*/
|
||||||
public boolean isRegister() {
|
public boolean isRegister() {
|
||||||
return hasStorageClass( IASTDeclSpecifier.sc_register );
|
return hasStorageClass(IASTDeclSpecifier.sc_register);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasStorageClass( int storage ){
|
public boolean hasStorageClass(int storage) {
|
||||||
IASTNode[] ns = getDeclarations();
|
IASTNode[] ns = getDeclarations();
|
||||||
if( ns == null )
|
if (ns == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for( int i = 0; i < ns.length && ns[i] != null; i++ ){
|
for (int i = 0; i < ns.length && ns[i] != null; i++) {
|
||||||
IASTNode parent = ns[i].getParent();
|
IASTNode parent = ns[i].getParent();
|
||||||
while( !(parent instanceof IASTDeclaration) )
|
while (!(parent instanceof IASTDeclaration))
|
||||||
parent = parent.getParent();
|
parent = parent.getParent();
|
||||||
|
|
||||||
if( parent instanceof IASTSimpleDeclaration ){
|
if (parent instanceof IASTSimpleDeclaration) {
|
||||||
IASTDeclSpecifier declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
|
IASTDeclSpecifier declSpec = ((IASTSimpleDeclaration)parent).getDeclSpecifier();
|
||||||
if( declSpec.getStorageClass() == storage )
|
if (declSpec.getStorageClass() == storage)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -264,14 +264,14 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
|
||||||
}
|
}
|
||||||
|
|
||||||
public IASTInitializer getDefaultValue() {
|
public IASTInitializer getDefaultValue() {
|
||||||
if( declarations == null )
|
if (declarations == null)
|
||||||
return null;
|
return null;
|
||||||
for (int i = 0; i < declarations.length && declarations[i] != null; i++) {
|
for (int i = 0; i < declarations.length && declarations[i] != null; i++) {
|
||||||
IASTNode parent = declarations[i].getParent();
|
IASTNode parent = declarations[i].getParent();
|
||||||
while( parent.getPropertyInParent() == IASTDeclarator.NESTED_DECLARATOR )
|
while (parent.getPropertyInParent() == IASTDeclarator.NESTED_DECLARATOR)
|
||||||
parent = parent.getParent();
|
parent = parent.getParent();
|
||||||
IASTInitializer init = ((IASTDeclarator)parent).getInitializer();
|
IASTInitializer init = ((IASTDeclarator)parent).getInitializer();
|
||||||
if( init != null )
|
if (init != null)
|
||||||
return init;
|
return init;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -288,4 +288,10 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
|
||||||
public boolean isExternC() {
|
public boolean isExternC() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
String name = getName();
|
||||||
|
return name.length() != 0 ? name : "<unnamed>"; //$NON-NLS-1$
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue