1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-28 19:35:36 +02:00

Support for case-ranges, bug 211882.

This commit is contained in:
Markus Schorn 2008-04-11 06:47:44 +00:00
parent 7a1ab1e347
commit 81a7a466e9
7 changed files with 83 additions and 15 deletions

View file

@ -4493,4 +4493,15 @@ public class AST2Tests extends AST2BaseTest {
parseAndCheckBindings(code, ParserLanguage.C, true); parseAndCheckBindings(code, ParserLanguage.C, true);
parseAndCheckBindings(code, ParserLanguage.CPP, true); parseAndCheckBindings(code, ParserLanguage.CPP, true);
} }
// void test(int count) {
// switch(count) {
// case 1 ... 3: break;
// }
// }
public void testCaseRange_Bug211882() throws Exception {
final String code = getAboveComment();
parseAndCheckBindings(code, ParserLanguage.C, true);
parseAndCheckBindings(code, ParserLanguage.CPP, true);
}
} }

View file

@ -10,6 +10,7 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.ast; package org.eclipse.cdt.core.dom.ast;
/** /**
* This interface represents a binary expression. * This interface represents a binary expression.
* *
@ -194,9 +195,40 @@ public interface IASTBinaryExpression extends IASTExpression {
public static final int op_notequals = 29; public static final int op_notequals = 29;
/** /**
* op_last is the field used in subinterfaces to start their operators at * For c==, only.
* <code>op_pmdot</code> pointer-to-member field dereference.
*/ */
public static final int op_last = op_notequals; public static final int op_pmdot = 30;
/**
* For c++, only.
* <code>op_pmarrow</code> pointer-to-member pointer dereference.
*/
public static final int op_pmarrow = 31;
/**
* For g++, only.
* <code>op_max</code> represents >?
*/
public static final int op_max = 32;
/**
* For g++, only.
* <code>op_min</code> represents <?
*/
public static final int op_min = 33;
/**
* For gcc compilers, only.
* <code>op_ellipses</code> represents ... as used for case ranges.
*/
public static final int op_ellipses= 34;
/**
* @deprecated all constants must be defined here, to avoid using the same value twice.
*/
@Deprecated
public static final int op_last = op_ellipses;
/** /**
* Get the first operand. * Get the first operand.

View file

@ -22,15 +22,17 @@ public interface ICPPASTBinaryExpression extends IASTBinaryExpression {
/** /**
* <code>op_pmdot</code> pointer-to-member field dereference. * <code>op_pmdot</code> pointer-to-member field dereference.
*/ */
public static final int op_pmdot = IASTBinaryExpression.op_last + 1; public static final int op_pmdot = IASTBinaryExpression.op_pmdot;
/** /**
* <code>op_pmarrow</code> pointer-to-member pointer dereference. * <code>op_pmarrow</code> pointer-to-member pointer dereference.
*/ */
public static final int op_pmarrow = IASTBinaryExpression.op_last + 2; public static final int op_pmarrow = IASTBinaryExpression.op_pmarrow;
/** /**
* <code>op_last</code> is defined for subinterfaces to further extend. * @deprecated all constants must be defined in {@link IASTBinaryExpression}, to avoid
* duplicate usage of the same constant.
*/ */
public static final int op_last = op_pmarrow; @Deprecated
public static final int op_last = IASTBinaryExpression.op_last;
} }

View file

@ -10,6 +10,7 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.ast.gnu.cpp; package org.eclipse.cdt.core.dom.ast.gnu.cpp;
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTBinaryExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTBinaryExpression;
/** /**
@ -22,16 +23,18 @@ public interface IGPPASTBinaryExpression extends ICPPASTBinaryExpression {
/** /**
* <code>op_max</code> represents >? * <code>op_max</code> represents >?
*/ */
public static final int op_max = ICPPASTBinaryExpression.op_last + 1; public static final int op_max = IASTBinaryExpression.op_max;
/** /**
* <code>op_min</code> represents <? * <code>op_min</code> represents <?
*/ */
public static final int op_min = ICPPASTBinaryExpression.op_last + 2; public static final int op_min = IASTBinaryExpression.op_min;
/** /**
* <code>op_last</code> provided for sub-interfaces to extend. * @deprecated all constants must be defined in {@link IASTBinaryExpression} to avoid
* using a constant twice.
*/ */
public static final int op_last = op_min; @Deprecated
public static final int op_last = IASTBinaryExpression.op_last;
} }

View file

@ -43,17 +43,23 @@ public abstract class GNUScannerExtensionConfiguration extends AbstractScannerEx
public static void addAdditionalGNUKeywords(CharArrayIntMap target) { public static void addAdditionalGNUKeywords(CharArrayIntMap target) {
target.put(GCCKeywords.cp__ALIGNOF__, IGCCToken.t___alignof__ ); target.put(GCCKeywords.cp__ALIGNOF__, IGCCToken.t___alignof__ );
target.put(GCCKeywords.cp__ALIGNOF__, IGCCToken.t___alignof__ );
target.put(GCCKeywords.cp__ASM, IToken.t_asm);
target.put(GCCKeywords.cp__ASM__, IToken.t_asm); target.put(GCCKeywords.cp__ASM__, IToken.t_asm);
target.put(GCCKeywords.cp__ATTRIBUTE, IGCCToken.t__attribute__ ); target.put(GCCKeywords.cp__ATTRIBUTE, IGCCToken.t__attribute__ );
target.put(GCCKeywords.cp__ATTRIBUTE__, IGCCToken.t__attribute__ ); target.put(GCCKeywords.cp__ATTRIBUTE__, IGCCToken.t__attribute__ );
target.put(GCCKeywords.cp__CONST, IToken.t_const); target.put(GCCKeywords.cp__CONST, IToken.t_const);
target.put(GCCKeywords.cp__CONST__, IToken.t_const); target.put(GCCKeywords.cp__CONST__, IToken.t_const);
target.put(GCCKeywords.cp__DECLSPEC, IGCCToken.t__declspec ); target.put(GCCKeywords.cp__DECLSPEC, IGCCToken.t__declspec );
target.put(GCCKeywords.cp__INLINE, IToken.t_inline);
target.put(GCCKeywords.cp__INLINE__, IToken.t_inline); target.put(GCCKeywords.cp__INLINE__, IToken.t_inline);
target.put(GCCKeywords.cp__RESTRICT, IToken.t_restrict); target.put(GCCKeywords.cp__RESTRICT, IToken.t_restrict);
target.put(GCCKeywords.cp__RESTRICT__, IToken.t_restrict); target.put(GCCKeywords.cp__RESTRICT__, IToken.t_restrict);
target.put(GCCKeywords.cp__VOLATILE, IToken.t_volatile);
target.put(GCCKeywords.cp__VOLATILE__, IToken.t_volatile); target.put(GCCKeywords.cp__VOLATILE__, IToken.t_volatile);
target.put(GCCKeywords.cp__SIGNED, IToken.t_signed);
target.put(GCCKeywords.cp__SIGNED__, IToken.t_signed); target.put(GCCKeywords.cp__SIGNED__, IToken.t_signed);
target.put(GCCKeywords.cp__TYPEOF, IGCCToken.t_typeof);
target.put(GCCKeywords.cp__TYPEOF__, IGCCToken.t_typeof); target.put(GCCKeywords.cp__TYPEOF__, IGCCToken.t_typeof);
target.put(GCCKeywords.cpTYPEOF, IGCCToken.t_typeof ); target.put(GCCKeywords.cpTYPEOF, IGCCToken.t_typeof );
} }

View file

@ -27,14 +27,20 @@ public class GCCKeywords {
public static final char [] cp__ATTRIBUTE__ = __ATTRIBUTE__.toCharArray(); public static final char [] cp__ATTRIBUTE__ = __ATTRIBUTE__.toCharArray();
public static final char [] cp__DECLSPEC = __DECLSPEC.toCharArray(); public static final char [] cp__DECLSPEC = __DECLSPEC.toCharArray();
public static final char [] cp__ALIGNOF = "__alignof".toCharArray(); //$NON-NLS-1$
public static final char [] cp__ATTRIBUTE = "__attribute".toCharArray(); //$NON-NLS-1$ public static final char [] cp__ATTRIBUTE = "__attribute".toCharArray(); //$NON-NLS-1$
public static final char [] cp__ASM= "__asm".toCharArray(); //$NON-NLS-1$
public static final char [] cp__ASM__= "__asm__".toCharArray(); //$NON-NLS-1$ public static final char [] cp__ASM__= "__asm__".toCharArray(); //$NON-NLS-1$
public static final char [] cp__CONST__= "__const__".toCharArray(); //$NON-NLS-1$
public static final char [] cp__CONST= "__const".toCharArray(); //$NON-NLS-1$ public static final char [] cp__CONST= "__const".toCharArray(); //$NON-NLS-1$
public static final char [] cp__CONST__= "__const__".toCharArray(); //$NON-NLS-1$
public static final char [] cp__INLINE= "__inline".toCharArray(); //$NON-NLS-1$
public static final char [] cp__INLINE__= "__inline__".toCharArray(); //$NON-NLS-1$ public static final char [] cp__INLINE__= "__inline__".toCharArray(); //$NON-NLS-1$
public static final char [] cp__RESTRICT__= "__restrict__".toCharArray(); //$NON-NLS-1$
public static final char [] cp__RESTRICT= "__restrict".toCharArray(); //$NON-NLS-1$ public static final char [] cp__RESTRICT= "__restrict".toCharArray(); //$NON-NLS-1$
public static final char [] cp__RESTRICT__= "__restrict__".toCharArray(); //$NON-NLS-1$
public static final char [] cp__VOLATILE= "__volatile".toCharArray(); //$NON-NLS-1$
public static final char [] cp__VOLATILE__= "__volatile__".toCharArray(); //$NON-NLS-1$ public static final char [] cp__VOLATILE__= "__volatile__".toCharArray(); //$NON-NLS-1$
public static final char [] cp__SIGNED= "__signed".toCharArray(); //$NON-NLS-1$
public static final char [] cp__SIGNED__= "__signed__".toCharArray(); //$NON-NLS-1$ public static final char [] cp__SIGNED__= "__signed__".toCharArray(); //$NON-NLS-1$
public static final char [] cp__TYPEOF= "__typeof".toCharArray(); //$NON-NLS-1$
public static final char [] cp__TYPEOF__= "__typeof__".toCharArray(); //$NON-NLS-1$ public static final char [] cp__TYPEOF__= "__typeof__".toCharArray(); //$NON-NLS-1$
} }

View file

@ -1689,9 +1689,17 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
protected IASTStatement parseCaseStatement() throws EndOfFileException, BacktrackException { protected IASTStatement parseCaseStatement() throws EndOfFileException, BacktrackException {
int startOffset = consume().getOffset(); // t_case int startOffset = consume().getOffset(); // t_case
IASTExpression case_exp = constantExpression(); IASTExpression caseExpression = constantExpression();
int lt1 = LT(1);
if (lt1 == IToken.tELLIPSIS) {
consume();
IASTExpression upperBoundExpression= constantExpression();
caseExpression = buildBinaryExpression(IASTBinaryExpression.op_assign,
caseExpression, upperBoundExpression, calculateEndOffset(upperBoundExpression));
lt1= LT(1);
}
int lastOffset = 0; int lastOffset = 0;
switch (LT(1)) { switch (lt1) {
case IToken.tCOLON: case IToken.tCOLON:
case IToken.tEOC: case IToken.tEOC:
lastOffset = consume().getEndOffset(); lastOffset = consume().getEndOffset();
@ -1702,7 +1710,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
IASTCaseStatement cs = createCaseStatement(); IASTCaseStatement cs = createCaseStatement();
((ASTNode) cs).setOffsetAndLength(startOffset, lastOffset - startOffset); ((ASTNode) cs).setOffsetAndLength(startOffset, lastOffset - startOffset);
cs.setExpression(case_exp); cs.setExpression(caseExpression);
return cs; return cs;
} }