mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-08 10:16:03 +02:00
Patch for Devin Steffler.
Further UI indicator infrastructure for testing DOM AST.
This commit is contained in:
parent
497e768f98
commit
6fa14f6b94
5 changed files with 140 additions and 20 deletions
|
@ -1345,6 +1345,14 @@ public class CVisitor {
|
||||||
if( !visitDeclaration( parmDeclarations[i], action ) ) return false;
|
if( !visitDeclaration( parmDeclarations[i], action ) ) return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if( declarator instanceof IASTArrayDeclarator )
|
||||||
|
{
|
||||||
|
IASTArrayDeclarator arrayDecl = (IASTArrayDeclarator) declarator;
|
||||||
|
IASTArrayModifier [] mods = arrayDecl.getArrayModifiers();
|
||||||
|
for( int i = 0; i < mods.length; ++i )
|
||||||
|
if( mods[i].getConstantExpression() != null &&
|
||||||
|
!visitExpression( mods[i].getConstantExpression(), action ) ) return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1690,6 +1698,9 @@ public class CVisitor {
|
||||||
return new CQualifierType(declSpec);
|
return new CQualifierType(declSpec);
|
||||||
|
|
||||||
ICASTTypedefNameSpecifier nameSpec = (ICASTTypedefNameSpecifier) declSpec;
|
ICASTTypedefNameSpecifier nameSpec = (ICASTTypedefNameSpecifier) declSpec;
|
||||||
|
|
||||||
|
if (!(nameSpec.getName().resolveBinding() instanceof IType)) return null;
|
||||||
|
|
||||||
lastType = (IType) nameSpec.getName().resolveBinding();
|
lastType = (IType) nameSpec.getName().resolveBinding();
|
||||||
|
|
||||||
IType pointerChain = setupPointerChain(declarator.getPointerOperators(), lastType);
|
IType pointerChain = setupPointerChain(declarator.getPointerOperators(), lastType);
|
||||||
|
|
|
@ -32,7 +32,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
|
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction;
|
||||||
import org.eclipse.cdt.internal.core.parser.scanner2.LocationMap.ASTObjectMacro;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author dsteffle
|
* @author dsteffle
|
||||||
|
@ -182,8 +181,8 @@ public class CPPPopulateASTViewAction extends CPPBaseVisitorAction implements IP
|
||||||
private void mergeNode(ASTNode node) {
|
private void mergeNode(ASTNode node) {
|
||||||
addRoot(node);
|
addRoot(node);
|
||||||
|
|
||||||
if (node instanceof ASTObjectMacro)
|
if (node instanceof IASTPreprocessorMacroDefinition)
|
||||||
addRoot(((ASTObjectMacro)node).getName());
|
addRoot(((IASTPreprocessorMacroDefinition)node).getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void mergeMacros(IASTPreprocessorMacroDefinition[] macros) {
|
private void mergeMacros(IASTPreprocessorMacroDefinition[] macros) {
|
||||||
|
|
|
@ -57,6 +57,11 @@ public class CPopulateASTViewAction extends CBaseVisitorAction implements IPopul
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addRoot(IASTNode node) {
|
private void addRoot(IASTNode node) {
|
||||||
|
if (!(node.getNodeLocations().length > 0 &&
|
||||||
|
node.getNodeLocations()[0].getNodeOffset() > 0 &&
|
||||||
|
node.getNodeLocations()[0].getNodeLength() > 0))
|
||||||
|
return;
|
||||||
|
|
||||||
TreeParent parent = root.findParentOfNode(node);
|
TreeParent parent = root.findParentOfNode(node);
|
||||||
|
|
||||||
if ( parent != null ) {
|
if ( parent != null ) {
|
||||||
|
|
|
@ -235,7 +235,10 @@ private static final String REFRESH_DOM_AST = "Refresh DOM AST"; //$NON-NLS-1
|
||||||
if (node instanceof IASTArrayModifier) {
|
if (node instanceof IASTArrayModifier) {
|
||||||
imageKey = DOMASTPluginImages.IMG_IASTArrayModifier;
|
imageKey = DOMASTPluginImages.IMG_IASTArrayModifier;
|
||||||
} else if (node instanceof IASTDeclaration) {
|
} else if (node instanceof IASTDeclaration) {
|
||||||
imageKey = DOMASTPluginImages.IMG_IASTDeclaration;
|
if (node instanceof IASTProblemDeclaration)
|
||||||
|
imageKey = DOMASTPluginImages.IMG_IASTProblem;
|
||||||
|
else
|
||||||
|
imageKey = DOMASTPluginImages.IMG_IASTDeclaration;
|
||||||
} else if (node instanceof IASTDeclarator) {
|
} else if (node instanceof IASTDeclarator) {
|
||||||
imageKey = DOMASTPluginImages.IMG_IASTDeclarator;
|
imageKey = DOMASTPluginImages.IMG_IASTDeclarator;
|
||||||
} else if (node instanceof IASTDeclSpecifier) {
|
} else if (node instanceof IASTDeclSpecifier) {
|
||||||
|
@ -257,10 +260,7 @@ private static final String REFRESH_DOM_AST = "Refresh DOM AST"; //$NON-NLS-1
|
||||||
} else if (node instanceof IASTProblem) {
|
} else if (node instanceof IASTProblem) {
|
||||||
imageKey = DOMASTPluginImages.IMG_IASTProblem;
|
imageKey = DOMASTPluginImages.IMG_IASTProblem;
|
||||||
} else if (node instanceof IASTSimpleDeclaration) {
|
} else if (node instanceof IASTSimpleDeclaration) {
|
||||||
if (node instanceof IASTProblemDeclaration)
|
imageKey = DOMASTPluginImages.IMG_IASTSimpleDeclaration;
|
||||||
imageKey = DOMASTPluginImages.IMG_IASTProblem;
|
|
||||||
else
|
|
||||||
imageKey = DOMASTPluginImages.IMG_IASTSimpleDeclaration;
|
|
||||||
} else if (node instanceof IASTStatement) {
|
} else if (node instanceof IASTStatement) {
|
||||||
imageKey = DOMASTPluginImages.IMG_IASTStatement;
|
imageKey = DOMASTPluginImages.IMG_IASTStatement;
|
||||||
} else if (node instanceof IASTTranslationUnit) {
|
} else if (node instanceof IASTTranslationUnit) {
|
||||||
|
|
|
@ -14,8 +14,10 @@ import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
|
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
|
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
|
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||||
|
@ -24,21 +26,39 @@ import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorObjectStyleMacroDefinition;
|
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorObjectStyleMacroDefinition;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.c.ICASTArrayDesignator;
|
import org.eclipse.cdt.core.dom.ast.c.ICASTArrayDesignator;
|
||||||
import org.eclipse.cdt.core.dom.ast.c.ICASTDesignatedInitializer;
|
import org.eclipse.cdt.core.dom.ast.c.ICASTArrayModifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.c.ICASTDesignator;
|
import org.eclipse.cdt.core.dom.ast.c.ICASTDesignator;
|
||||||
import org.eclipse.cdt.core.dom.ast.c.ICASTFieldDesignator;
|
import org.eclipse.cdt.core.dom.ast.c.ICASTFieldDesignator;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTBinaryExpression;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTBinaryExpression;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUnaryExpression;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTUnaryExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.gnu.c.IGCCASTArrayRangeDesignator;
|
import org.eclipse.cdt.core.dom.ast.gnu.c.IGCCASTArrayRangeDesignator;
|
||||||
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTBinaryExpression;
|
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTBinaryExpression;
|
||||||
import org.eclipse.cdt.core.parser.ast.IASTDesignator;
|
|
||||||
import org.eclipse.core.runtime.IAdaptable;
|
import org.eclipse.core.runtime.IAdaptable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author dsteffle
|
* @author dsteffle
|
||||||
*/
|
*/
|
||||||
public class TreeObject implements IAdaptable {
|
public class TreeObject implements IAdaptable {
|
||||||
private static final String DASH = "-";
|
private static final String OP_BRACKETEDPRIMARY = "( )"; //$NON-NLS-1$
|
||||||
|
private static final String OP_TILDE = "~"; //$NON-NLS-1$
|
||||||
|
private static final String OP_SIZEOF = "sizeof"; //$NON-NLS-1$
|
||||||
|
private static final String OP_INCR = "++"; //$NON-NLS-1$
|
||||||
|
private static final String OP_DECR = "--"; //$NON-NLS-1$
|
||||||
|
private static final String OP_NOT = "!"; //$NON-NLS-1$
|
||||||
|
private static final String OP_AMPER = "&"; //$NON-NLS-1$
|
||||||
|
private static final String OP_TYPEOF = "typeof"; //$NON-NLS-1$
|
||||||
|
private static final String OP_ALIGNOF = "alignof"; //$NON-NLS-1$
|
||||||
|
private static final String OP_TYPEID = "typeid"; //$NON-NLS-1$
|
||||||
|
private static final String OP_THROW = "throw"; //$NON-NLS-1$
|
||||||
|
private static final String VARIABLE_SIZED_ = "* "; //$NON-NLS-1$
|
||||||
|
private static final String VOLATILE_ = "volatile "; //$NON-NLS-1$
|
||||||
|
private static final String STATIC_ = "static "; //$NON-NLS-1$
|
||||||
|
private static final String RESTRICT_ = "restrict "; //$NON-NLS-1$
|
||||||
|
private static final String CONST_ = "const "; //$NON-NLS-1$
|
||||||
|
private static final String DASH = "-"; //$NON-NLS-1$
|
||||||
private static final String OP_NOTEQUALS = "!="; //$NON-NLS-1$
|
private static final String OP_NOTEQUALS = "!="; //$NON-NLS-1$
|
||||||
private static final String OP_EQUALS = "=="; //$NON-NLS-1$
|
private static final String OP_EQUALS = "=="; //$NON-NLS-1$
|
||||||
private static final String OP_BINARYXORASSIGN = "^="; //$NON-NLS-1$
|
private static final String OP_BINARYXORASSIGN = "^="; //$NON-NLS-1$
|
||||||
|
@ -67,7 +87,7 @@ public class TreeObject implements IAdaptable {
|
||||||
private static final String OP_PLUS = "+"; //$NON-NLS-1$
|
private static final String OP_PLUS = "+"; //$NON-NLS-1$
|
||||||
private static final String OP_MODULO = "%"; //$NON-NLS-1$
|
private static final String OP_MODULO = "%"; //$NON-NLS-1$
|
||||||
private static final String OP_DIVIDE = "/"; //$NON-NLS-1$
|
private static final String OP_DIVIDE = "/"; //$NON-NLS-1$
|
||||||
private static final String OP_MULTIPLY = "*"; //$NON-NLS-1$
|
private static final String OP_STAR = "*"; //$NON-NLS-1$
|
||||||
private static final String OP_MIN = "<?"; //$NON-NLS-1$
|
private static final String OP_MIN = "<?"; //$NON-NLS-1$
|
||||||
private static final String OP_MAX = ">?"; //$NON-NLS-1$
|
private static final String OP_MAX = ">?"; //$NON-NLS-1$
|
||||||
private static final String OP_PMDOT = "."; //$NON-NLS-1$
|
private static final String OP_PMDOT = "."; //$NON-NLS-1$
|
||||||
|
@ -180,30 +200,115 @@ public class TreeObject implements IAdaptable {
|
||||||
} else if ( node instanceof IASTLiteralExpression ) {
|
} else if ( node instanceof IASTLiteralExpression ) {
|
||||||
buffer.append(START_OF_LIST);
|
buffer.append(START_OF_LIST);
|
||||||
buffer.append(node.toString());
|
buffer.append(node.toString());
|
||||||
|
} else if ( node instanceof IASTUnaryExpression ) {
|
||||||
|
buffer.append(START_OF_LIST);
|
||||||
|
buffer.append( getUnaryOperatorString( (IASTUnaryExpression)node ) );
|
||||||
} else if ( node instanceof IASTBinaryExpression ) {
|
} else if ( node instanceof IASTBinaryExpression ) {
|
||||||
buffer.append(START_OF_LIST);
|
buffer.append(START_OF_LIST);
|
||||||
buffer.append( getBinaryOperatorString( (IASTBinaryExpression)node) );
|
buffer.append( getBinaryOperatorString( (IASTBinaryExpression)node ) );
|
||||||
} else if ( node instanceof ICASTDesignator ) {
|
} else if ( node instanceof ICASTDesignator ) {
|
||||||
if (node instanceof ICASTArrayDesignator) {
|
if ( node instanceof ICASTArrayDesignator && ((ICASTArrayDesignator)node).getSubscriptExpression() != null ) {
|
||||||
buffer.append(START_OF_LIST);
|
buffer.append(START_OF_LIST);
|
||||||
buffer.append(((ICASTArrayDesignator)node).getSubscriptExpression()); // TODO Devin need to test this!
|
buffer.append(((ICASTArrayDesignator)node).getSubscriptExpression());
|
||||||
} else if (node instanceof ICASTFieldDesignator) {
|
} else if ( node instanceof ICASTFieldDesignator && ((ICASTFieldDesignator)node).getName() != null ) {
|
||||||
buffer.append(START_OF_LIST);
|
buffer.append(START_OF_LIST);
|
||||||
buffer.append(((ICASTFieldDesignator)node).getName());
|
buffer.append(((ICASTFieldDesignator)node).getName());
|
||||||
} else if (node instanceof IGCCASTArrayRangeDesignator) {
|
} else if ( node instanceof IGCCASTArrayRangeDesignator && ((IGCCASTArrayRangeDesignator)node).getRangeCeiling() != null && ((IGCCASTArrayRangeDesignator)node).getRangeFloor() != null ) {
|
||||||
buffer.append(START_OF_LIST);
|
buffer.append(START_OF_LIST);
|
||||||
buffer.append(((IGCCASTArrayRangeDesignator)node).getRangeCeiling());
|
buffer.append(((IGCCASTArrayRangeDesignator)node).getRangeCeiling());
|
||||||
buffer.append(DASH);
|
buffer.append(DASH);
|
||||||
buffer.append(((IGCCASTArrayRangeDesignator)node).getRangeFloor());
|
buffer.append(((IGCCASTArrayRangeDesignator)node).getRangeFloor());
|
||||||
}
|
}
|
||||||
} else if ( node instanceof IASTArrayModifier ) {
|
} else if ( node instanceof IASTArrayModifier ) {
|
||||||
buffer.append(START_OF_LIST);
|
boolean started = false;
|
||||||
buffer.append(((IASTArrayModifier)node).getConstantExpression());
|
if ( node instanceof ICASTArrayModifier ) {
|
||||||
|
started = true;
|
||||||
|
buffer.append(START_OF_LIST);
|
||||||
|
if (((ICASTArrayModifier)node).isConst()) buffer.append(CONST_);
|
||||||
|
if (((ICASTArrayModifier)node).isRestrict()) buffer.append(RESTRICT_);
|
||||||
|
if (((ICASTArrayModifier)node).isStatic()) buffer.append(STATIC_);
|
||||||
|
if (((ICASTArrayModifier)node).isVolatile()) buffer.append(VOLATILE_);
|
||||||
|
if (((ICASTArrayModifier)node).isVariableSized()) buffer.append(VARIABLE_SIZED_);
|
||||||
|
}
|
||||||
|
|
||||||
|
IASTExpression constantExpression = ((IASTArrayModifier)node).getConstantExpression();
|
||||||
|
if ( constantExpression != null && constantExpression instanceof IASTIdExpression ) {
|
||||||
|
if (!started) buffer.append(START_OF_LIST);
|
||||||
|
buffer.append(((IASTIdExpression)constantExpression).getName().toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return buffer.toString();
|
return buffer.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getUnaryOperatorString(IASTUnaryExpression be) {
|
||||||
|
int op = be.getOperator();
|
||||||
|
String opString = BLANK_STRING;
|
||||||
|
|
||||||
|
if (be instanceof ICPPASTUnaryExpression) {
|
||||||
|
switch(op) {
|
||||||
|
case ICPPASTUnaryExpression.op_throw:
|
||||||
|
opString = OP_THROW;
|
||||||
|
break;
|
||||||
|
case ICPPASTUnaryExpression.op_typeid:
|
||||||
|
opString = OP_TYPEID;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (be instanceof IGNUASTUnaryExpression) {
|
||||||
|
switch(op) {
|
||||||
|
case IGNUASTUnaryExpression.op_alignOf:
|
||||||
|
opString = OP_ALIGNOF;
|
||||||
|
break;
|
||||||
|
case IGNUASTUnaryExpression.op_typeof:
|
||||||
|
opString = OP_TYPEOF;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!opString.equals(BLANK_STRING)) return opString;
|
||||||
|
|
||||||
|
switch(op) {
|
||||||
|
case IASTUnaryExpression.op_amper:
|
||||||
|
opString = OP_AMPER;
|
||||||
|
break;
|
||||||
|
case IASTUnaryExpression.op_bracketedPrimary:
|
||||||
|
opString = OP_BRACKETEDPRIMARY;
|
||||||
|
break;
|
||||||
|
case IASTUnaryExpression.op_minus:
|
||||||
|
opString = OP_MINUS;
|
||||||
|
break;
|
||||||
|
case IASTUnaryExpression.op_not:
|
||||||
|
opString = OP_NOT;
|
||||||
|
break;
|
||||||
|
case IASTUnaryExpression.op_plus:
|
||||||
|
opString = OP_PLUS;
|
||||||
|
break;
|
||||||
|
case IASTUnaryExpression.op_postFixDecr:
|
||||||
|
opString = OP_DECR;
|
||||||
|
break;
|
||||||
|
case IASTUnaryExpression.op_postFixIncr:
|
||||||
|
opString = OP_INCR;
|
||||||
|
break;
|
||||||
|
case IASTUnaryExpression.op_prefixDecr:
|
||||||
|
opString = OP_DECR;
|
||||||
|
break;
|
||||||
|
case IASTUnaryExpression.op_prefixIncr:
|
||||||
|
opString = OP_INCR;
|
||||||
|
break;
|
||||||
|
case IASTUnaryExpression.op_sizeof:
|
||||||
|
opString = OP_SIZEOF;
|
||||||
|
break;
|
||||||
|
case IASTUnaryExpression.op_star:
|
||||||
|
opString = OP_STAR;
|
||||||
|
break;
|
||||||
|
case IASTUnaryExpression.op_tilde:
|
||||||
|
opString = OP_TILDE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return opString;
|
||||||
|
}
|
||||||
|
|
||||||
private String getBinaryOperatorString(IASTBinaryExpression be) {
|
private String getBinaryOperatorString(IASTBinaryExpression be) {
|
||||||
int op = be.getOperator();
|
int op = be.getOperator();
|
||||||
String opString = BLANK_STRING;
|
String opString = BLANK_STRING;
|
||||||
|
@ -232,7 +337,7 @@ public class TreeObject implements IAdaptable {
|
||||||
|
|
||||||
switch(op) {
|
switch(op) {
|
||||||
case IASTBinaryExpression.op_multiply:
|
case IASTBinaryExpression.op_multiply:
|
||||||
opString = OP_MULTIPLY;
|
opString = OP_STAR;
|
||||||
break;
|
break;
|
||||||
case IASTBinaryExpression.op_divide:
|
case IASTBinaryExpression.op_divide:
|
||||||
opString = OP_DIVIDE;
|
opString = OP_DIVIDE;
|
||||||
|
|
Loading…
Add table
Reference in a new issue