mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-09 18:56:02 +02:00
Further DOM/AST fixes.
This commit is contained in:
parent
c85f211e0e
commit
e269c537e6
7 changed files with 39 additions and 10 deletions
|
@ -28,7 +28,6 @@ import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTProblem;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
|
||||
|
@ -122,13 +121,13 @@ public class AST2BaseTest extends TestCase {
|
|||
|
||||
if( lang == ParserLanguage.C && expectNoProblems )
|
||||
{
|
||||
IASTProblem [] problems = CVisitor.getProblems(tu);
|
||||
assertEquals( problems.length, 0 );
|
||||
assertEquals( CVisitor.getProblems(tu).length, 0 );
|
||||
assertEquals( tu.getPreprocesorProblems().length, 0 );
|
||||
}
|
||||
else if ( lang == ParserLanguage.CPP && expectNoProblems )
|
||||
{
|
||||
IASTProblem [] problems = CPPVisitor.getProblems(tu);
|
||||
assertEquals( problems.length, 0 );
|
||||
assertEquals( CPPVisitor.getProblems(tu).length, 0 );
|
||||
assertEquals( tu.getPreprocesorProblems().length, 0 );
|
||||
}
|
||||
|
||||
return tu;
|
||||
|
|
|
@ -2619,4 +2619,17 @@ public class AST2Tests extends AST2BaseTest {
|
|||
|
||||
assertInstances( col, e, 2 );
|
||||
}
|
||||
|
||||
public void testBug84176() throws Exception {
|
||||
StringBuffer buffer = new StringBuffer( "// example from: C99 6.5.2.5-16\n" ); //$NON-NLS-1$
|
||||
buffer.append( "struct s { int i; };\n"); //$NON-NLS-1$
|
||||
buffer.append("void f (void)\n"); //$NON-NLS-1$
|
||||
buffer.append("{\n"); //$NON-NLS-1$
|
||||
buffer.append(" struct s *p = 0, *q;\n"); //$NON-NLS-1$
|
||||
buffer.append("int j = 0;\n"); //$NON-NLS-1$
|
||||
buffer.append("q = p;\n"); //$NON-NLS-1$
|
||||
buffer.append("p = &((struct s){ j++ }); \n"); //$NON-NLS-1$
|
||||
buffer.append("}\n"); //$NON-NLS-1$
|
||||
parse( buffer.toString(), ParserLanguage.C );
|
||||
}
|
||||
}
|
|
@ -32,16 +32,19 @@ public abstract class ASTNode implements IASTNode {
|
|||
public void setOffset( int offset )
|
||||
{
|
||||
this.offset = offset;
|
||||
this.locations = null;
|
||||
}
|
||||
|
||||
public void setLength( int length )
|
||||
{
|
||||
this.length = length;
|
||||
this.locations = null;
|
||||
}
|
||||
|
||||
public void setOffsetAndLength(int offset, int length) {
|
||||
this.offset = offset;
|
||||
this.length = length;
|
||||
this.locations = null;
|
||||
}
|
||||
|
||||
public void setOffsetAndLength( ASTNode node )
|
||||
|
@ -49,12 +52,15 @@ public abstract class ASTNode implements IASTNode {
|
|||
setOffsetAndLength( node.getOffset(), node.getLength() );
|
||||
}
|
||||
|
||||
private IASTNodeLocation [] locations = null;
|
||||
/* (non-Javadoc)
|
||||
* @see org.eclipse.cdt.core.dom.ast.IASTNode#getNodeLocations()
|
||||
*/
|
||||
public IASTNodeLocation[] getNodeLocations() {
|
||||
if( locations != null ) return locations;
|
||||
if( length == 0 ) return EMPTY_LOCATION_ARRAY;
|
||||
return getTranslationUnit().getLocationInfo( offset, length );
|
||||
locations = getTranslationUnit().getLocationInfo( offset, length );
|
||||
return locations;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
|
|
@ -34,6 +34,7 @@ import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFieldDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFieldReference;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTForStatement;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
|
||||
|
@ -1385,6 +1386,9 @@ public class CVisitor {
|
|||
if( mods[i].getConstantExpression() != null &&
|
||||
!visitExpression( mods[i].getConstantExpression(), action ) ) return false;
|
||||
}
|
||||
else if( declarator instanceof IASTFieldDeclarator )
|
||||
if( ! visitExpression( ((IASTFieldDeclarator) declarator).getBitFieldSize(), action ) ) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -1938,6 +1938,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
} else if (bitField != null) {
|
||||
IASTFieldDeclarator fl = createFieldDeclarator();
|
||||
fl.setBitFieldSize(bitField);
|
||||
bitField.setParent( fl );
|
||||
bitField.setPropertyInParent( IASTFieldDeclarator.FIELD_SIZE );
|
||||
d = fl;
|
||||
} else {
|
||||
d = createDeclarator();
|
||||
|
|
|
@ -36,6 +36,7 @@ import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFieldDeclarator;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFieldReference;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTForStatement;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
|
||||
|
@ -938,6 +939,9 @@ public class CPPVisitor {
|
|||
if( declarator.getInitializer() != null )
|
||||
if( !visitInitializer( declarator.getInitializer(), action ) ) return false;
|
||||
|
||||
if( declarator instanceof IASTFieldDeclarator )
|
||||
if( ! visitExpression( ((IASTFieldDeclarator) declarator).getBitFieldSize(), action ) ) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTName;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
|
||||
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
|
||||
|
@ -30,7 +31,6 @@ import org.eclipse.cdt.core.dom.ast.IASTTypeId;
|
|||
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
|
||||
import org.eclipse.cdt.core.dom.ast.c.ICASTDesignatedInitializer;
|
||||
import org.eclipse.cdt.core.dom.ast.c.ICASTDesignator;
|
||||
import org.eclipse.cdt.core.parser.ast.IASTDesignator;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
|
||||
import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction;
|
||||
|
||||
|
@ -59,9 +59,10 @@ public class CPopulateASTViewAction extends CBaseVisitorAction implements IPopul
|
|||
}
|
||||
|
||||
private void addRoot(IASTNode node) {
|
||||
if (!(node.getNodeLocations().length > 0 &&
|
||||
node.getNodeLocations()[0].getNodeOffset() >= 0 &&
|
||||
node.getNodeLocations()[0].getNodeLength() > 0))
|
||||
IASTNodeLocation[] nodeLocations = node.getNodeLocations();
|
||||
if (!(nodeLocations.length > 0 &&
|
||||
nodeLocations[0].getNodeOffset() >= 0 &&
|
||||
nodeLocations[0].getNodeLength() > 0))
|
||||
return;
|
||||
|
||||
TreeParent parent = root.findParentOfNode(node);
|
||||
|
|
Loading…
Add table
Reference in a new issue