mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-09-07 18:43:32 +02:00
Fixed Bug 84478 [C++ Parser] does not support declarations inside while condition
This commit is contained in:
parent
58615beb77
commit
629a1ea350
9 changed files with 137 additions and 44 deletions
|
@ -4763,4 +4763,11 @@ public class AST2CPPTests extends AST2BaseTest {
|
||||||
assertNoProblemBindings( col );
|
assertNoProblemBindings( col );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testBug84478_3() throws Exception {
|
||||||
|
IASTTranslationUnit tu = parse( "void foo() { switch( int x = 4 ) { case 4: break; default: break;} }", ParserLanguage.CPP ); //$NON-NLS-1$
|
||||||
|
CPPNameCollector col = new CPPNameCollector();
|
||||||
|
tu.accept( col );
|
||||||
|
assertNoProblemBindings( col );
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ public interface IASTForStatement extends IASTStatement {
|
||||||
public static final ASTNodeProperty BODY = new ASTNodeProperty("IASTForStatement.BODY - IASTStatement body of IASTForStatement"); //$NON-NLS-1$
|
public static final ASTNodeProperty BODY = new ASTNodeProperty("IASTForStatement.BODY - IASTStatement body of IASTForStatement"); //$NON-NLS-1$
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <code>INITDECLARATION</code> represents the relationship between a
|
* <code>INITIALIZER</code> represents the relationship between a
|
||||||
* <code>IASTForStatement</code> and its <code>IASTDeclaration</code>
|
* <code>IASTForStatement</code> and its <code>IASTDeclaration</code>
|
||||||
* initializer.
|
* initializer.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -18,11 +18,11 @@ package org.eclipse.cdt.core.dom.ast;
|
||||||
public interface IASTSwitchStatement extends IASTStatement {
|
public interface IASTSwitchStatement extends IASTStatement {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <code>CONTROLLER</code> represents the relationship between an
|
* <code>CONTROLLER_EXP</code> represents the relationship between an
|
||||||
* <code>IASTSwitchStatement</code> and it's nested
|
* <code>IASTSwitchStatement</code> and it's nested
|
||||||
* <code>IASTExpression</code>.
|
* <code>IASTExpression</code>.
|
||||||
*/
|
*/
|
||||||
public static final ASTNodeProperty CONTROLLER = new ASTNodeProperty(
|
public static final ASTNodeProperty CONTROLLER_EXP = new ASTNodeProperty(
|
||||||
"IASTSwitchStatement.CONTROLLER - IASTExpression (controller) for IASTSwitchExpression"); //$NON-NLS-1$
|
"IASTSwitchStatement.CONTROLLER - IASTExpression (controller) for IASTSwitchExpression"); //$NON-NLS-1$
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -37,7 +37,7 @@ public interface IASTSwitchStatement extends IASTStatement {
|
||||||
*
|
*
|
||||||
* @return the controller expression
|
* @return the controller expression
|
||||||
*/
|
*/
|
||||||
public IASTExpression getController();
|
public IASTExpression getControllerExpression();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the controlling expression for the switch.
|
* Set the controlling expression for the switch.
|
||||||
|
@ -45,7 +45,7 @@ public interface IASTSwitchStatement extends IASTStatement {
|
||||||
* @param controller
|
* @param controller
|
||||||
* <code>IASTExpression</code>
|
* <code>IASTExpression</code>
|
||||||
*/
|
*/
|
||||||
public void setController(IASTExpression controller);
|
public void setControllerExpression(IASTExpression controller);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the body of the switch statement.
|
* Returns the body of the switch statement.
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
/**********************************************************************
|
||||||
|
* Copyright (c) 2004 IBM Corporation and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Common Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/cpl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* IBM - Initial API and implementation
|
||||||
|
**********************************************************************/
|
||||||
|
package org.eclipse.cdt.core.dom.ast.cpp;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement;
|
||||||
|
|
||||||
|
public interface ICPPASTSwitchStatement extends IASTSwitchStatement {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <code>CONTROLLER_DECLARATION</code> represents the relationship between an
|
||||||
|
* <code>IASTSwitchStatement</code> and it's nested
|
||||||
|
* <code>IASTDeclaration</code>.
|
||||||
|
*/
|
||||||
|
public static final ASTNodeProperty CONTROLLER_DECLARATION = new ASTNodeProperty(
|
||||||
|
"IASTSwitchStatement.CONTROLLER - IASTDeclaration (controller) for IASTSwitchExpression"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In C++, a switch statement can be contorller by a declaration.
|
||||||
|
*
|
||||||
|
* @return <code>IASTDeclaration</code>
|
||||||
|
*/
|
||||||
|
public IASTDeclaration getControllerDeclaration();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In C++, a switch statement can be contorller by a declaration.
|
||||||
|
*
|
||||||
|
* @param d <code>IASTDeclaration</code>
|
||||||
|
*/
|
||||||
|
public void setControllerDeclaration( IASTDeclaration d );
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -49,7 +49,6 @@ import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
|
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement;
|
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
|
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression;
|
||||||
|
@ -1412,11 +1411,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
||||||
*/
|
*/
|
||||||
protected abstract IASTWhileStatement createWhileStatement();
|
protected abstract IASTWhileStatement createWhileStatement();
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
protected abstract IASTSwitchStatement createSwitchStatement();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
@ -1929,32 +1923,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
||||||
return while_statement;
|
return while_statement;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return
|
|
||||||
* @throws EndOfFileException
|
|
||||||
* @throws BacktrackException
|
|
||||||
*/
|
|
||||||
protected IASTStatement parseSwitchStatement() throws EndOfFileException,
|
|
||||||
BacktrackException {
|
|
||||||
int startOffset;
|
|
||||||
startOffset = consume(IToken.t_switch).getOffset();
|
|
||||||
consume(IToken.tLPAREN);
|
|
||||||
IASTExpression switch_condition = condition();
|
|
||||||
consume(IToken.tRPAREN);
|
|
||||||
IASTStatement switch_body = statement();
|
|
||||||
|
|
||||||
IASTSwitchStatement switch_statement = createSwitchStatement();
|
|
||||||
((ASTNode) switch_statement).setOffsetAndLength(startOffset,
|
|
||||||
calculateEndOffset(switch_body) - startOffset);
|
|
||||||
switch_statement.setController(switch_condition);
|
|
||||||
switch_condition.setParent(switch_statement);
|
|
||||||
switch_condition.setPropertyInParent(IASTSwitchStatement.CONTROLLER);
|
|
||||||
switch_statement.setBody(switch_body);
|
|
||||||
switch_body.setParent(switch_statement);
|
|
||||||
switch_body.setPropertyInParent(IASTSwitchStatement.BODY);
|
|
||||||
return switch_statement;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param result
|
* @param result
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -28,14 +28,14 @@ public class CASTSwitchStatement extends CASTNode implements
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IASTSwitchStatement#getController()
|
* @see org.eclipse.cdt.core.dom.ast.IASTSwitchStatement#getController()
|
||||||
*/
|
*/
|
||||||
public IASTExpression getController() {
|
public IASTExpression getControllerExpression() {
|
||||||
return controller;
|
return controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IASTSwitchStatement#setController(org.eclipse.cdt.core.dom.ast.IASTExpression)
|
* @see org.eclipse.cdt.core.dom.ast.IASTSwitchStatement#setController(org.eclipse.cdt.core.dom.ast.IASTExpression)
|
||||||
*/
|
*/
|
||||||
public void setController(IASTExpression controller) {
|
public void setControllerExpression(IASTExpression controller) {
|
||||||
this.controller = controller;
|
this.controller = controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2792,5 +2792,30 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
calculateEndOffset(castExpression));
|
calculateEndOffset(castExpression));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
* @throws EndOfFileException
|
||||||
|
* @throws BacktrackException
|
||||||
|
*/
|
||||||
|
protected IASTStatement parseSwitchStatement() throws EndOfFileException, BacktrackException {
|
||||||
|
int startOffset;
|
||||||
|
startOffset = consume(IToken.t_switch).getOffset();
|
||||||
|
consume(IToken.tLPAREN);
|
||||||
|
IASTExpression switch_condition = condition();
|
||||||
|
consume(IToken.tRPAREN);
|
||||||
|
IASTStatement switch_body = statement();
|
||||||
|
|
||||||
|
IASTSwitchStatement switch_statement = createSwitchStatement();
|
||||||
|
((ASTNode) switch_statement).setOffsetAndLength(startOffset,
|
||||||
|
calculateEndOffset(switch_body) - startOffset);
|
||||||
|
switch_statement.setControllerExpression(switch_condition);
|
||||||
|
switch_condition.setParent(switch_statement);
|
||||||
|
switch_condition.setPropertyInParent(IASTSwitchStatement.CONTROLLER_EXP);
|
||||||
|
switch_statement.setBody(switch_body);
|
||||||
|
switch_body.setParent(switch_statement);
|
||||||
|
switch_body.setPropertyInParent(IASTSwitchStatement.BODY);
|
||||||
|
return switch_statement;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -11,32 +11,34 @@
|
||||||
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
package org.eclipse.cdt.internal.core.dom.parser.cpp;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
|
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
import org.eclipse.cdt.core.dom.ast.IASTExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSwitchStatement;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
|
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author jcamelon
|
* @author jcamelon
|
||||||
*/
|
*/
|
||||||
public class CPPASTSwitchStatement extends CPPASTNode implements
|
public class CPPASTSwitchStatement extends CPPASTNode implements
|
||||||
IASTSwitchStatement, IASTAmbiguityParent {
|
ICPPASTSwitchStatement, IASTAmbiguityParent {
|
||||||
|
|
||||||
private IASTExpression controller;
|
private IASTExpression controller;
|
||||||
private IASTStatement body;
|
private IASTStatement body;
|
||||||
|
private IASTDeclaration decl;
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IASTSwitchStatement#getController()
|
* @see org.eclipse.cdt.core.dom.ast.IASTSwitchStatement#getController()
|
||||||
*/
|
*/
|
||||||
public IASTExpression getController() {
|
public IASTExpression getControllerExpression() {
|
||||||
return controller;
|
return controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.cdt.core.dom.ast.IASTSwitchStatement#setController(org.eclipse.cdt.core.dom.ast.IASTExpression)
|
* @see org.eclipse.cdt.core.dom.ast.IASTSwitchStatement#setController(org.eclipse.cdt.core.dom.ast.IASTExpression)
|
||||||
*/
|
*/
|
||||||
public void setController(IASTExpression controller) {
|
public void setControllerExpression(IASTExpression controller) {
|
||||||
this.controller = controller;
|
this.controller = controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,7 +82,21 @@ public class CPPASTSwitchStatement extends CPPASTNode implements
|
||||||
other.setParent( child.getParent() );
|
other.setParent( child.getParent() );
|
||||||
controller = (IASTExpression) other;
|
controller = (IASTExpression) other;
|
||||||
}
|
}
|
||||||
|
if( child == decl )
|
||||||
|
{
|
||||||
|
other.setPropertyInParent( child.getPropertyInParent() );
|
||||||
|
other.setParent( child.getParent() );
|
||||||
|
decl = (IASTDeclaration) other;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IASTDeclaration getControllerDeclaration() {
|
||||||
|
return decl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setControllerDeclaration(IASTDeclaration d) {
|
||||||
|
decl = d;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,6 +108,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTReferenceOperator;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleDeclSpecifier;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleDeclSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeConstructorExpression;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeConstructorExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSwitchStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
|
||||||
|
@ -4893,7 +4894,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
/**
|
/**
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
protected IASTSwitchStatement createSwitchStatement() {
|
protected ICPPASTSwitchStatement createSwitchStatement() {
|
||||||
return new CPPASTSwitchStatement();
|
return new CPPASTSwitchStatement();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5334,4 +5335,38 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
return buildUnaryExpression(operator, castExpression, offset,
|
return buildUnaryExpression(operator, castExpression, offset,
|
||||||
calculateEndOffset(castExpression));
|
calculateEndOffset(castExpression));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
* @throws EndOfFileException
|
||||||
|
* @throws BacktrackException
|
||||||
|
*/
|
||||||
|
protected IASTStatement parseSwitchStatement() throws EndOfFileException, BacktrackException {
|
||||||
|
int startOffset;
|
||||||
|
startOffset = consume(IToken.t_switch).getOffset();
|
||||||
|
consume(IToken.tLPAREN);
|
||||||
|
IASTNode switch_condition = cppStyleCondition();
|
||||||
|
consume(IToken.tRPAREN);
|
||||||
|
IASTStatement switch_body = statement();
|
||||||
|
|
||||||
|
ICPPASTSwitchStatement switch_statement = createSwitchStatement();
|
||||||
|
((ASTNode) switch_statement).setOffsetAndLength(startOffset,
|
||||||
|
calculateEndOffset(switch_body) - startOffset);
|
||||||
|
if( switch_condition instanceof IASTExpression )
|
||||||
|
{
|
||||||
|
switch_statement.setControllerExpression((IASTExpression) switch_condition);
|
||||||
|
switch_condition.setParent(switch_statement);
|
||||||
|
switch_condition.setPropertyInParent(IASTSwitchStatement.CONTROLLER_EXP);
|
||||||
|
}
|
||||||
|
else if( switch_condition instanceof IASTDeclaration )
|
||||||
|
{
|
||||||
|
switch_statement.setControllerDeclaration((IASTDeclaration) switch_condition);
|
||||||
|
switch_condition.setParent(switch_statement);
|
||||||
|
switch_condition.setPropertyInParent(ICPPASTSwitchStatement.CONTROLLER_DECLARATION);
|
||||||
|
}
|
||||||
|
switch_statement.setBody(switch_body);
|
||||||
|
switch_body.setParent(switch_statement);
|
||||||
|
switch_body.setPropertyInParent(IASTSwitchStatement.BODY);
|
||||||
|
return switch_statement;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue