1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug 294730: Pragma operators.

This commit is contained in:
Markus Schorn 2010-02-09 09:44:06 +00:00
parent 7bcc902d24
commit b099b6ccc4
9 changed files with 359 additions and 248 deletions

View file

@ -58,6 +58,8 @@ import org.eclipse.cdt.core.dom.ast.IASTNullStatement;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTPointerOperator;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorPragmaStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement;
import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTProblemDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTProblemStatement;
@ -7290,4 +7292,28 @@ public class AST2Tests extends AST2BaseTest {
bh.assertNonProblem("obj", 3, IParameter.class);
bh.assertProblem("obj =", 3);
}
// #define ONCE() PRAGMA(once)
// #define PRAGMA(x) _Pragma(#x)
// #pragma once
// _Pragma ("once")
// ONCE()
public void testPragmaOperator_294730() throws Exception {
final String code = getAboveComment();
IASTTranslationUnit tu= parseAndCheckBindings(code, ParserLanguage.C);
IASTPreprocessorStatement[] stmts = tu.getAllPreprocessorStatements();
assertEquals(5, stmts.length);
for (int i = 2; i < stmts.length; i++) {
IASTPreprocessorStatement stmt = stmts[i];
assertInstance(stmt, IASTPreprocessorPragmaStatement.class);
assertEquals(i>2, ((IASTPreprocessorPragmaStatement) stmt).isPragmaOperator());
}
tu= parseAndCheckBindings(code, ParserLanguage.CPP);
assertEquals(5, stmts.length);
for (int i = 2; i < stmts.length; i++) {
IASTPreprocessorStatement stmt = stmts[i];
assertInstance(stmt, IASTPreprocessorPragmaStatement.class);
assertEquals(i>2, ((IASTPreprocessorPragmaStatement) stmt).isPragmaOperator());
}
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2009 IBM Corporation and others.
* Copyright (c) 2004, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -8,21 +8,26 @@
* Contributors:
* John Camelon (IBM) - Initial API and implementation
* Emanuel Graf (IFS)
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.core.dom.ast;
/**
* Represents a #pragma directive.
* Represents a #pragma directive or a pragma operator.
*
* @noextend This interface is not intended to be extended by clients.
* @noimplement This interface is not intended to be implemented by clients.
*/
public interface IASTPreprocessorPragmaStatement extends
IASTPreprocessorStatement {
public interface IASTPreprocessorPragmaStatement extends IASTPreprocessorStatement {
/**
* Returns the pragma message.
*/
public char[] getMessage();
/**
* Returns whether this uses the pragma operator syntax, e.g: <code>_Pragma("once")</code>
* @since 5.2
*/
public boolean isPragmaOperator();
}

View file

@ -31,7 +31,6 @@ public class GCCScannerExtensionConfiguration extends GNUScannerExtensionConfigu
@SuppressWarnings("nls")
public GCCScannerExtensionConfiguration() {
addMacro("__null", "(void *)0");
addMacro("_Pragma(arg)", "");
addMacro("__builtin_offsetof(T,m)", "((size_t) &((T *)0)->m)");
}

View file

@ -36,6 +36,10 @@ public interface IToken {
int FIRST_RESERVED_SCANNER= -100;
int LAST_RESERVED_SCANNER= -1;
/** @since 5.2 */
int t_PRAGMA = 5200;
int tIDENTIFIER = 1;
int tINTEGER = 2;
int tCOLONCOLON = 3;
@ -92,7 +96,7 @@ public interface IToken {
* @see IScanner#setSplitShiftROperator(boolean)
* @since 5.2
*/
int tGT_in_SHIFTR= 5200;
int tGT_in_SHIFTR= 5201;
/** @deprecated use {@link #tAND} */ @Deprecated int t_and = 54;
/** @deprecated use {@link #tAMPERASSIGN} */ @Deprecated int t_and_eq = 55;
@ -112,7 +116,8 @@ public interface IToken {
int t_const_cast = 69;
int t_continue = 70;
/** @since 5.2 */ int t_decltype= 5201;
/** @since 5.2 */
int t_decltype= 5202;
int t_default = 71;
int t_delete = 72;
int t_do = 73;
@ -149,7 +154,8 @@ public interface IToken {
int t_short = 104;
int t_sizeof = 105;
int t_static = 106;
/** @since 5.2 */ int t_static_assert = 5202;
/** @since 5.2 */
int t_static_assert = 5203;
int t_static_cast = 107;
int t_signed = 108;
int t_struct = 109;

View file

@ -18,259 +18,262 @@ import org.eclipse.cdt.core.parser.util.CharArrayIntMap;
* @noextend This class is not intended to be subclassed by clients.
* @noinstantiate This class is not intended to be instantiated by clients.
*/
@SuppressWarnings("nls")
public class Keywords {
public static final String CAST = "cast"; //$NON-NLS-1$
public static final String ALIGNOF = "alignof"; //$NON-NLS-1$
public static final String TYPEOF = "typeof"; //$NON-NLS-1$
public static final String CAST = "cast";
public static final String ALIGNOF = "alignof";
public static final String TYPEOF = "typeof";
public static final String _BOOL = "_Bool"; //$NON-NLS-1$
public static final String _COMPLEX = "_Complex"; //$NON-NLS-1$
public static final String _IMAGINARY = "_Imaginary"; //$NON-NLS-1$
public static final String AND = "and"; //$NON-NLS-1$
public static final String AND_EQ = "and_eq"; //$NON-NLS-1$
public static final String ASM = "asm"; //$NON-NLS-1$
public static final String AUTO = "auto"; //$NON-NLS-1$
public static final String BITAND = "bitand"; //$NON-NLS-1$
public static final String BITOR = "bitor"; //$NON-NLS-1$
public static final String BOOL = "bool"; //$NON-NLS-1$
public static final String BREAK = "break"; //$NON-NLS-1$
public static final String CASE = "case"; //$NON-NLS-1$
public static final String CATCH = "catch"; //$NON-NLS-1$
public static final String CHAR = "char"; //$NON-NLS-1$
public static final String CLASS = "class"; //$NON-NLS-1$
public static final String COMPL = "compl"; //$NON-NLS-1$
public static final String CONST = "const"; //$NON-NLS-1$
public static final String CONST_CAST = "const_cast"; //$NON-NLS-1$
public static final String CONTINUE = "continue"; //$NON-NLS-1$
public static final String _BOOL = "_Bool";
public static final String _COMPLEX = "_Complex";
public static final String _IMAGINARY = "_Imaginary";
public static final String AND = "and";
public static final String AND_EQ = "and_eq";
public static final String ASM = "asm";
public static final String AUTO = "auto";
public static final String BITAND = "bitand";
public static final String BITOR = "bitor";
public static final String BOOL = "bool";
public static final String BREAK = "break";
public static final String CASE = "case";
public static final String CATCH = "catch";
public static final String CHAR = "char";
public static final String CLASS = "class";
public static final String COMPL = "compl";
public static final String CONST = "const";
public static final String CONST_CAST = "const_cast";
public static final String CONTINUE = "continue";
/** @since 5.2 */
public static final String DECLTYPE = "decltype"; //$NON-NLS-1$
public static final String DEFAULT = "default"; //$NON-NLS-1$
public static final String DELETE = "delete"; //$NON-NLS-1$
public static final String DO = "do"; //$NON-NLS-1$
public static final String DOUBLE = "double"; //$NON-NLS-1$
public static final String DYNAMIC_CAST = "dynamic_cast"; //$NON-NLS-1$
public static final String ELSE = "else"; //$NON-NLS-1$
public static final String ENUM = "enum"; //$NON-NLS-1$
public static final String EXPLICIT = "explicit"; //$NON-NLS-1$
public static final String EXPORT = "export"; //$NON-NLS-1$
public static final String EXTERN = "extern"; //$NON-NLS-1$
public static final String FALSE = "false"; //$NON-NLS-1$
public static final String FLOAT = "float"; //$NON-NLS-1$
public static final String FOR = "for"; //$NON-NLS-1$
public static final String FRIEND = "friend"; //$NON-NLS-1$
public static final String GOTO = "goto"; //$NON-NLS-1$
public static final String IF = "if"; //$NON-NLS-1$
public static final String INLINE = "inline"; //$NON-NLS-1$
public static final String INT = "int"; //$NON-NLS-1$
public static final String LONG = "long"; //$NON-NLS-1$
public static final String LONG_LONG = "long long"; //$NON-NLS-1$
public static final String MUTABLE = "mutable"; //$NON-NLS-1$
public static final String NAMESPACE = "namespace"; //$NON-NLS-1$
public static final String NEW = "new"; //$NON-NLS-1$
public static final String NOT = "not"; //$NON-NLS-1$
public static final String NOT_EQ = "not_eq"; //$NON-NLS-1$
public static final String OPERATOR = "operator"; //$NON-NLS-1$
public static final String OR = "or"; //$NON-NLS-1$
public static final String OR_EQ = "or_eq"; //$NON-NLS-1$
public static final String PRIVATE = "private"; //$NON-NLS-1$
public static final String PROTECTED = "protected"; //$NON-NLS-1$
public static final String PUBLIC = "public"; //$NON-NLS-1$
public static final String REGISTER = "register"; //$NON-NLS-1$
public static final String REINTERPRET_CAST = "reinterpret_cast"; //$NON-NLS-1$
public static final String RESTRICT = "restrict"; //$NON-NLS-1$
public static final String RETURN = "return"; //$NON-NLS-1$
public static final String SHORT = "short"; //$NON-NLS-1$
public static final String SIGNED = "signed"; //$NON-NLS-1$
public static final String SIZEOF = "sizeof"; //$NON-NLS-1$
public static final String STATIC = "static"; //$NON-NLS-1$
public static final String DECLTYPE = "decltype";
public static final String DEFAULT = "default";
public static final String DELETE = "delete";
public static final String DO = "do";
public static final String DOUBLE = "double";
public static final String DYNAMIC_CAST = "dynamic_cast";
public static final String ELSE = "else";
public static final String ENUM = "enum";
public static final String EXPLICIT = "explicit";
public static final String EXPORT = "export";
public static final String EXTERN = "extern";
public static final String FALSE = "false";
public static final String FLOAT = "float";
public static final String FOR = "for";
public static final String FRIEND = "friend";
public static final String GOTO = "goto";
public static final String IF = "if";
public static final String INLINE = "inline";
public static final String INT = "int";
public static final String LONG = "long";
public static final String LONG_LONG = "long long";
public static final String MUTABLE = "mutable";
public static final String NAMESPACE = "namespace";
public static final String NEW = "new";
public static final String NOT = "not";
public static final String NOT_EQ = "not_eq";
public static final String OPERATOR = "operator";
public static final String OR = "or";
public static final String OR_EQ = "or_eq";
public static final String PRIVATE = "private";
public static final String PROTECTED = "protected";
public static final String PUBLIC = "public";
public static final String REGISTER = "register";
public static final String REINTERPRET_CAST = "reinterpret_cast";
public static final String RESTRICT = "restrict";
public static final String RETURN = "return";
public static final String SHORT = "short";
public static final String SIGNED = "signed";
public static final String SIZEOF = "sizeof";
public static final String STATIC = "static";
/** @since 5.2 */
public static final String STATIC_ASSERT = "static_assert"; //$NON-NLS-1$
public static final String STATIC_CAST = "static_cast"; //$NON-NLS-1$
public static final String STRUCT = "struct"; //$NON-NLS-1$
public static final String SWITCH = "switch"; //$NON-NLS-1$
public static final String TEMPLATE = "template"; //$NON-NLS-1$
public static final String THIS = "this"; //$NON-NLS-1$
public static final String THROW = "throw"; //$NON-NLS-1$
public static final String TRUE = "true"; //$NON-NLS-1$
public static final String TRY = "try"; //$NON-NLS-1$
public static final String TYPEDEF = "typedef"; //$NON-NLS-1$
public static final String TYPEID = "typeid"; //$NON-NLS-1$
public static final String TYPENAME = "typename"; //$NON-NLS-1$
public static final String UNION = "union"; //$NON-NLS-1$
public static final String UNSIGNED = "unsigned"; //$NON-NLS-1$
public static final String USING = "using"; //$NON-NLS-1$
public static final String VIRTUAL = "virtual"; //$NON-NLS-1$
public static final String VOID = "void"; //$NON-NLS-1$
public static final String VOLATILE = "volatile"; //$NON-NLS-1$
public static final String WCHAR_T = "wchar_t"; //$NON-NLS-1$
public static final String WHILE = "while"; //$NON-NLS-1$
public static final String XOR = "xor"; //$NON-NLS-1$
public static final String XOR_EQ = "xor_eq"; //$NON-NLS-1$
public static final String STATIC_ASSERT = "static_assert";
public static final String STATIC_CAST = "static_cast";
public static final String STRUCT = "struct";
public static final String SWITCH = "switch";
public static final String TEMPLATE = "template";
public static final String THIS = "this";
public static final String THROW = "throw";
public static final String TRUE = "true";
public static final String TRY = "try";
public static final String TYPEDEF = "typedef";
public static final String TYPEID = "typeid";
public static final String TYPENAME = "typename";
public static final String UNION = "union";
public static final String UNSIGNED = "unsigned";
public static final String USING = "using";
public static final String VIRTUAL = "virtual";
public static final String VOID = "void";
public static final String VOLATILE = "volatile";
public static final String WCHAR_T = "wchar_t";
public static final String WHILE = "while";
public static final String XOR = "xor";
public static final String XOR_EQ = "xor_eq";
public static final char[] c_BOOL = "_Bool".toCharArray(); //$NON-NLS-1$
public static final char[] c_COMPLEX = "_Complex".toCharArray(); //$NON-NLS-1$
public static final char[] c_IMAGINARY = "_Imaginary".toCharArray(); //$NON-NLS-1$
public static final char[] cAND = "and".toCharArray(); //$NON-NLS-1$
public static final char[] cAND_EQ = "and_eq".toCharArray(); //$NON-NLS-1$
public static final char[] cASM = "asm".toCharArray(); //$NON-NLS-1$
public static final char[] cAUTO = "auto".toCharArray(); //$NON-NLS-1$
public static final char[] cBITAND = "bitand".toCharArray(); //$NON-NLS-1$
public static final char[] cBITOR = "bitor".toCharArray(); //$NON-NLS-1$
public static final char[] cBOOL = "bool".toCharArray(); //$NON-NLS-1$
public static final char[] cBREAK = "break".toCharArray(); //$NON-NLS-1$
public static final char[] cCASE = "case".toCharArray(); //$NON-NLS-1$
public static final char[] cCATCH = "catch".toCharArray(); //$NON-NLS-1$
public static final char[] cCHAR = "char".toCharArray(); //$NON-NLS-1$
public static final char[] cCLASS = "class".toCharArray(); //$NON-NLS-1$
public static final char[] cCOMPL = "compl".toCharArray(); //$NON-NLS-1$
public static final char[] cCONST = "const".toCharArray(); //$NON-NLS-1$
public static final char[] cCONST_CAST = "const_cast".toCharArray(); //$NON-NLS-1$
public static final char[] cCONTINUE = "continue".toCharArray(); //$NON-NLS-1$
public static final char[] cDEFAULT = "default".toCharArray(); //$NON-NLS-1$
public static final char[] c_BOOL = "_Bool".toCharArray();
public static final char[] c_COMPLEX = "_Complex".toCharArray();
public static final char[] c_IMAGINARY = "_Imaginary".toCharArray();
public static final char[] cAND = "and".toCharArray();
public static final char[] cAND_EQ = "and_eq".toCharArray();
public static final char[] cASM = "asm".toCharArray();
public static final char[] cAUTO = "auto".toCharArray();
public static final char[] cBITAND = "bitand".toCharArray();
public static final char[] cBITOR = "bitor".toCharArray();
public static final char[] cBOOL = "bool".toCharArray();
public static final char[] cBREAK = "break".toCharArray();
public static final char[] cCASE = "case".toCharArray();
public static final char[] cCATCH = "catch".toCharArray();
public static final char[] cCHAR = "char".toCharArray();
public static final char[] cCLASS = "class".toCharArray();
public static final char[] cCOMPL = "compl".toCharArray();
public static final char[] cCONST = "const".toCharArray();
public static final char[] cCONST_CAST = "const_cast".toCharArray();
public static final char[] cCONTINUE = "continue".toCharArray();
public static final char[] cDEFAULT = "default".toCharArray();
/** @since 5.2 */
public static final char[] cDECLTYPE = DECLTYPE.toCharArray();
public static final char[] cDELETE = "delete".toCharArray(); //$NON-NLS-1$
public static final char[] cDO = "do".toCharArray(); //$NON-NLS-1$
public static final char[] cDOUBLE = "double".toCharArray(); //$NON-NLS-1$
public static final char[] cDYNAMIC_CAST = "dynamic_cast".toCharArray(); //$NON-NLS-1$
public static final char[] cELSE = "else".toCharArray(); //$NON-NLS-1$
public static final char[] cENUM = "enum".toCharArray(); //$NON-NLS-1$
public static final char[] cEXPLICIT = "explicit".toCharArray(); //$NON-NLS-1$
public static final char[] cEXPORT = "export".toCharArray(); //$NON-NLS-1$
public static final char[] cEXTERN = "extern".toCharArray(); //$NON-NLS-1$
public static final char[] cFALSE = "false".toCharArray(); //$NON-NLS-1$
public static final char[] cFLOAT = "float".toCharArray(); //$NON-NLS-1$
public static final char[] cFOR = "for".toCharArray(); //$NON-NLS-1$
public static final char[] cFRIEND = "friend".toCharArray(); //$NON-NLS-1$
public static final char[] cGOTO = "goto".toCharArray(); //$NON-NLS-1$
public static final char[] cIF = "if".toCharArray(); //$NON-NLS-1$
public static final char[] cINLINE = "inline".toCharArray(); //$NON-NLS-1$
public static final char[] cINT = "int".toCharArray(); //$NON-NLS-1$
public static final char[] cLONG = "long".toCharArray(); //$NON-NLS-1$
public static final char[] cMUTABLE = "mutable".toCharArray(); //$NON-NLS-1$
public static final char[] cNAMESPACE = "namespace".toCharArray(); //$NON-NLS-1$
public static final char[] cNEW = "new".toCharArray(); //$NON-NLS-1$
public static final char[] cNOT = "not".toCharArray(); //$NON-NLS-1$
public static final char[] cNOT_EQ = "not_eq".toCharArray(); //$NON-NLS-1$
public static final char[] cOPERATOR = "operator".toCharArray(); //$NON-NLS-1$
public static final char[] cOR = "or".toCharArray(); //$NON-NLS-1$
public static final char[] cOR_EQ = "or_eq".toCharArray(); //$NON-NLS-1$
public static final char[] cPRIVATE = "private".toCharArray(); //$NON-NLS-1$
public static final char[] cPROTECTED = "protected".toCharArray(); //$NON-NLS-1$
public static final char[] cPUBLIC = "public".toCharArray(); //$NON-NLS-1$
public static final char[] cREGISTER = "register".toCharArray(); //$NON-NLS-1$
public static final char[] cREINTERPRET_CAST = "reinterpret_cast".toCharArray(); //$NON-NLS-1$
public static final char[] cRESTRICT = "restrict".toCharArray(); //$NON-NLS-1$
public static final char[] cRETURN = "return".toCharArray(); //$NON-NLS-1$
public static final char[] cSHORT = "short".toCharArray(); //$NON-NLS-1$
public static final char[] cSIGNED = "signed".toCharArray(); //$NON-NLS-1$
public static final char[] cSIZEOF = "sizeof".toCharArray(); //$NON-NLS-1$
public static final char[] cSTATIC = "static".toCharArray(); //$NON-NLS-1$
public static final char[] cDELETE = "delete".toCharArray();
public static final char[] cDO = "do".toCharArray();
public static final char[] cDOUBLE = "double".toCharArray();
public static final char[] cDYNAMIC_CAST = "dynamic_cast".toCharArray();
public static final char[] cELSE = "else".toCharArray();
public static final char[] cENUM = "enum".toCharArray();
public static final char[] cEXPLICIT = "explicit".toCharArray();
public static final char[] cEXPORT = "export".toCharArray();
public static final char[] cEXTERN = "extern".toCharArray();
public static final char[] cFALSE = "false".toCharArray();
public static final char[] cFLOAT = "float".toCharArray();
public static final char[] cFOR = "for".toCharArray();
public static final char[] cFRIEND = "friend".toCharArray();
public static final char[] cGOTO = "goto".toCharArray();
public static final char[] cIF = "if".toCharArray();
public static final char[] cINLINE = "inline".toCharArray();
public static final char[] cINT = "int".toCharArray();
public static final char[] cLONG = "long".toCharArray();
public static final char[] cMUTABLE = "mutable".toCharArray();
public static final char[] cNAMESPACE = "namespace".toCharArray();
public static final char[] cNEW = "new".toCharArray();
public static final char[] cNOT = "not".toCharArray();
public static final char[] cNOT_EQ = "not_eq".toCharArray();
public static final char[] cOPERATOR = "operator".toCharArray();
public static final char[] cOR = "or".toCharArray();
public static final char[] cOR_EQ = "or_eq".toCharArray();
public static final char[] cPRIVATE = "private".toCharArray();
public static final char[] cPROTECTED = "protected".toCharArray();
public static final char[] cPUBLIC = "public".toCharArray();
public static final char[] cREGISTER = "register".toCharArray();
public static final char[] cREINTERPRET_CAST = "reinterpret_cast".toCharArray();
public static final char[] cRESTRICT = "restrict".toCharArray();
public static final char[] cRETURN = "return".toCharArray();
public static final char[] cSHORT = "short".toCharArray();
public static final char[] cSIGNED = "signed".toCharArray();
public static final char[] cSIZEOF = "sizeof".toCharArray();
public static final char[] cSTATIC = "static".toCharArray();
/** @since 5.2 */
public static final char[] cSTATIC_ASSERT = STATIC_ASSERT.toCharArray();
public static final char[] cSTATIC_CAST = "static_cast".toCharArray(); //$NON-NLS-1$
public static final char[] cSTRUCT = "struct".toCharArray(); //$NON-NLS-1$
public static final char[] cSWITCH = "switch".toCharArray(); //$NON-NLS-1$
public static final char[] cTEMPLATE = "template".toCharArray(); //$NON-NLS-1$
public static final char[] cTHIS = "this".toCharArray(); //$NON-NLS-1$
public static final char[] cTHROW = "throw".toCharArray(); //$NON-NLS-1$
public static final char[] cTRUE = "true".toCharArray(); //$NON-NLS-1$
public static final char[] cTRY = "try".toCharArray(); //$NON-NLS-1$
public static final char[] cTYPEDEF = "typedef".toCharArray(); //$NON-NLS-1$
public static final char[] cTYPEID = "typeid".toCharArray(); //$NON-NLS-1$
public static final char[] cTYPENAME = "typename".toCharArray(); //$NON-NLS-1$
public static final char[] cUNION = "union".toCharArray(); //$NON-NLS-1$
public static final char[] cUNSIGNED = "unsigned".toCharArray(); //$NON-NLS-1$
public static final char[] cUSING = "using".toCharArray(); //$NON-NLS-1$
public static final char[] cVIRTUAL = "virtual".toCharArray(); //$NON-NLS-1$
public static final char[] cVOID = "void".toCharArray(); //$NON-NLS-1$
public static final char[] cVOLATILE = "volatile".toCharArray(); //$NON-NLS-1$
public static final char[] cWCHAR_T = "wchar_t".toCharArray(); //$NON-NLS-1$
public static final char[] cWHILE = "while".toCharArray(); //$NON-NLS-1$
public static final char[] cXOR = "xor".toCharArray(); //$NON-NLS-1$
public static final char[] cXOR_EQ = "xor_eq".toCharArray(); //$NON-NLS-1$
public static final char[] cSTATIC_CAST = "static_cast".toCharArray();
public static final char[] cSTRUCT = "struct".toCharArray();
public static final char[] cSWITCH = "switch".toCharArray();
public static final char[] cTEMPLATE = "template".toCharArray();
public static final char[] cTHIS = "this".toCharArray();
public static final char[] cTHROW = "throw".toCharArray();
public static final char[] cTRUE = "true".toCharArray();
public static final char[] cTRY = "try".toCharArray();
public static final char[] cTYPEDEF = "typedef".toCharArray();
public static final char[] cTYPEID = "typeid".toCharArray();
public static final char[] cTYPENAME = "typename".toCharArray();
public static final char[] cUNION = "union".toCharArray();
public static final char[] cUNSIGNED = "unsigned".toCharArray();
public static final char[] cUSING = "using".toCharArray();
public static final char[] cVIRTUAL = "virtual".toCharArray();
public static final char[] cVOID = "void".toCharArray();
public static final char[] cVOLATILE = "volatile".toCharArray();
public static final char[] cWCHAR_T = "wchar_t".toCharArray();
public static final char[] cWHILE = "while".toCharArray();
public static final char[] cXOR = "xor".toCharArray();
public static final char[] cXOR_EQ = "xor_eq".toCharArray();
public static final char[] cpCOLONCOLON = "::".toCharArray(); //$NON-NLS-1$
public static final char[] cpCOLON = ":".toCharArray(); //$NON-NLS-1$
public static final char[] cpSEMI = ";".toCharArray(); //$NON-NLS-1$
public static final char[] cpCOMMA = ",".toCharArray(); //$NON-NLS-1$
public static final char[] cpQUESTION = "?".toCharArray(); //$NON-NLS-1$
public static final char[] cpLPAREN = "(".toCharArray(); //$NON-NLS-1$
public static final char[] cpRPAREN = ")".toCharArray(); //$NON-NLS-1$
public static final char[] cpLBRACKET = "[".toCharArray(); //$NON-NLS-1$
public static final char[] cpRBRACKET = "]".toCharArray(); //$NON-NLS-1$
public static final char[] cpLBRACE = "{".toCharArray(); //$NON-NLS-1$
public static final char[] cpRBRACE = "}".toCharArray(); //$NON-NLS-1$
public static final char[] cpPLUSASSIGN = "+=".toCharArray(); //$NON-NLS-1$
public static final char[] cpINCR = "++".toCharArray(); //$NON-NLS-1$
public static final char[] cpPLUS = "+".toCharArray(); //$NON-NLS-1$
public static final char[] cpMINUSASSIGN = "-=".toCharArray(); //$NON-NLS-1$
public static final char[] cpDECR = "--".toCharArray(); //$NON-NLS-1$
public static final char[] cpARROWSTAR = "->*".toCharArray(); //$NON-NLS-1$
public static final char[] cpARROW = "->".toCharArray(); //$NON-NLS-1$
public static final char[] cpMINUS = "-".toCharArray(); //$NON-NLS-1$
public static final char[] cpSTARASSIGN = "*=".toCharArray(); //$NON-NLS-1$
public static final char[] cpSTAR = "*".toCharArray(); //$NON-NLS-1$
public static final char[] cpMODASSIGN = "%=".toCharArray(); //$NON-NLS-1$
public static final char[] cpMOD = "%".toCharArray(); //$NON-NLS-1$
public static final char[] cpXORASSIGN = "^=".toCharArray(); //$NON-NLS-1$
public static final char[] cpXOR = "^".toCharArray(); //$NON-NLS-1$
public static final char[] cpAMPERASSIGN = "&=".toCharArray(); //$NON-NLS-1$
public static final char[] cpAND = "&&".toCharArray(); //$NON-NLS-1$
public static final char[] cpAMPER = "&".toCharArray(); //$NON-NLS-1$
public static final char[] cpBITORASSIGN = "|=".toCharArray(); //$NON-NLS-1$
public static final char[] cpOR = "||".toCharArray(); //$NON-NLS-1$
public static final char[] cpBITOR = "|".toCharArray(); //$NON-NLS-1$
public static final char[] cpCOMPL = "~".toCharArray(); //$NON-NLS-1$
public static final char[] cpNOTEQUAL = "!=".toCharArray(); //$NON-NLS-1$
public static final char[] cpNOT = "!".toCharArray(); //$NON-NLS-1$
public static final char[] cpEQUAL = "==".toCharArray(); //$NON-NLS-1$
public static final char[] cpASSIGN ="=".toCharArray(); //$NON-NLS-1$
public static final char[] cpSHIFTL = "<<".toCharArray(); //$NON-NLS-1$
public static final char[] cpLTEQUAL = "<=".toCharArray(); //$NON-NLS-1$
public static final char[] cpLT = "<".toCharArray(); //$NON-NLS-1$
public static final char[] cpSHIFTRASSIGN = ">>=".toCharArray(); //$NON-NLS-1$
public static final char[] cpSHIFTR = ">>".toCharArray(); //$NON-NLS-1$
public static final char[] cpGTEQUAL = ">=".toCharArray(); //$NON-NLS-1$
public static final char[] cpGT = ">".toCharArray(); //$NON-NLS-1$
public static final char[] cpSHIFTLASSIGN = "<<=".toCharArray(); //$NON-NLS-1$
public static final char[] cpELLIPSIS = "...".toCharArray(); //$NON-NLS-1$
public static final char[] cpDOTSTAR = ".*".toCharArray(); //$NON-NLS-1$
public static final char[] cpDOT = ".".toCharArray(); //$NON-NLS-1$
public static final char[] cpDIVASSIGN = "/=".toCharArray(); //$NON-NLS-1$
public static final char[] cpDIV = "/".toCharArray(); //$NON-NLS-1$
public static final char[] cpPOUND = "#".toCharArray(); //$NON-NLS-1$
public static final char[] cpPOUNDPOUND = "##".toCharArray(); //$NON-NLS-1$
public static final char[] cpCOLONCOLON = "::".toCharArray();
public static final char[] cpCOLON = ":".toCharArray();
public static final char[] cpSEMI = ";".toCharArray();
public static final char[] cpCOMMA = ",".toCharArray();
public static final char[] cpQUESTION = "?".toCharArray();
public static final char[] cpLPAREN = "(".toCharArray();
public static final char[] cpRPAREN = ")".toCharArray();
public static final char[] cpLBRACKET = "[".toCharArray();
public static final char[] cpRBRACKET = "]".toCharArray();
public static final char[] cpLBRACE = "{".toCharArray();
public static final char[] cpRBRACE = "}".toCharArray();
public static final char[] cpPLUSASSIGN = "+=".toCharArray();
public static final char[] cpINCR = "++".toCharArray();
public static final char[] cpPLUS = "+".toCharArray();
public static final char[] cpMINUSASSIGN = "-=".toCharArray();
public static final char[] cpDECR = "--".toCharArray();
public static final char[] cpARROWSTAR = "->*".toCharArray();
public static final char[] cpARROW = "->".toCharArray();
public static final char[] cpMINUS = "-".toCharArray();
public static final char[] cpSTARASSIGN = "*=".toCharArray();
public static final char[] cpSTAR = "*".toCharArray();
public static final char[] cpMODASSIGN = "%=".toCharArray();
public static final char[] cpMOD = "%".toCharArray();
public static final char[] cpXORASSIGN = "^=".toCharArray();
public static final char[] cpXOR = "^".toCharArray();
public static final char[] cpAMPERASSIGN = "&=".toCharArray();
public static final char[] cpAND = "&&".toCharArray();
public static final char[] cpAMPER = "&".toCharArray();
public static final char[] cpBITORASSIGN = "|=".toCharArray();
public static final char[] cpOR = "||".toCharArray();
public static final char[] cpBITOR = "|".toCharArray();
public static final char[] cpCOMPL = "~".toCharArray();
public static final char[] cpNOTEQUAL = "!=".toCharArray();
public static final char[] cpNOT = "!".toCharArray();
public static final char[] cpEQUAL = "==".toCharArray();
public static final char[] cpASSIGN ="=".toCharArray();
public static final char[] cpSHIFTL = "<<".toCharArray();
public static final char[] cpLTEQUAL = "<=".toCharArray();
public static final char[] cpLT = "<".toCharArray();
public static final char[] cpSHIFTRASSIGN = ">>=".toCharArray();
public static final char[] cpSHIFTR = ">>".toCharArray();
public static final char[] cpGTEQUAL = ">=".toCharArray();
public static final char[] cpGT = ">".toCharArray();
public static final char[] cpSHIFTLASSIGN = "<<=".toCharArray();
public static final char[] cpELLIPSIS = "...".toCharArray();
public static final char[] cpDOTSTAR = ".*".toCharArray();
public static final char[] cpDOT = ".".toCharArray();
public static final char[] cpDIVASSIGN = "/=".toCharArray();
public static final char[] cpDIV = "/".toCharArray();
public static final char[] cpPOUND = "#".toCharArray();
public static final char[] cpPOUNDPOUND = "##".toCharArray();
// gcc extensions
public static final char[] cpMIN = "<?".toCharArray(); //$NON-NLS-1$
public static final char[] cpMAX = ">?".toCharArray(); //$NON-NLS-1$
public static final char[] cpMIN = "<?".toCharArray();
public static final char[] cpMAX = ">?".toCharArray();
// preprocessor keywords
public static final char[] cIFDEF = "ifdef".toCharArray(); //$NON-NLS-1$
public static final char[] cIFNDEF = "ifndef".toCharArray(); //$NON-NLS-1$
public static final char[] cELIF = "elif".toCharArray(); //$NON-NLS-1$
public static final char[] cENDIF = "endif".toCharArray(); //$NON-NLS-1$
public static final char[] cINCLUDE = "include".toCharArray(); //$NON-NLS-1$
public static final char[] cDEFINE = "define".toCharArray(); //$NON-NLS-1$
public static final char[] cUNDEF = "undef".toCharArray(); //$NON-NLS-1$
public static final char[] cERROR = "error".toCharArray(); //$NON-NLS-1$
public static final char[] cPRAGMA = "pragma".toCharArray(); //$NON-NLS-1$
public static final char[] cLINE = "line".toCharArray(); //$NON-NLS-1$
public static final char[] cDEFINED= "defined".toCharArray(); //$NON-NLS-1$
public static final char[] cVA_ARGS= "__VA_ARGS__".toCharArray(); //$NON-NLS-1$
public static final char[] cIFDEF = "ifdef".toCharArray();
public static final char[] cIFNDEF = "ifndef".toCharArray();
public static final char[] cELIF = "elif".toCharArray();
public static final char[] cENDIF = "endif".toCharArray();
public static final char[] cINCLUDE = "include".toCharArray();
public static final char[] cDEFINE = "define".toCharArray();
public static final char[] cUNDEF = "undef".toCharArray();
public static final char[] cERROR = "error".toCharArray();
public static final char[] cPRAGMA = "pragma".toCharArray();
public static final char[] cLINE = "line".toCharArray();
public static final char[] cDEFINED= "defined".toCharArray();
/** @since 5.2*/
public static final char[] _Pragma= "_Pragma".toCharArray();
public static final char[] cVA_ARGS= "__VA_ARGS__".toCharArray();
// preprocessor extensions (supported by GCC)
public static final char[] cINCLUDE_NEXT = "include_next".toCharArray(); //$NON-NLS-1$
public static final char[] cIMPORT = "import".toCharArray(); //$NON-NLS-1$
public static final char[] cIDENT = "ident".toCharArray(); //$NON-NLS-1$
public static final char[] cSCCS = "sccs".toCharArray(); //$NON-NLS-1$
public static final char[] cWARNING = "warning".toCharArray(); //$NON-NLS-1$
public static final char[] cASSERT = "assert".toCharArray(); //$NON-NLS-1$
public static final char[] cUNASSERT = "unassert".toCharArray(); //$NON-NLS-1$
public static final char[] cINCLUDE_NEXT = "include_next".toCharArray();
public static final char[] cIMPORT = "import".toCharArray();
public static final char[] cIDENT = "ident".toCharArray();
public static final char[] cSCCS = "sccs".toCharArray();
public static final char[] cWARNING = "warning".toCharArray();
public static final char[] cASSERT = "assert".toCharArray();
public static final char[] cUNASSERT = "unassert".toCharArray();
public static void addKeywordsC(CharArrayIntMap kw) {
addCommon(kw);
@ -284,6 +287,7 @@ public class Keywords {
private static void addCommon(CharArrayIntMap words) {
words.put(Keywords._Pragma, IToken.t_PRAGMA);
words.put(Keywords.cAUTO, IToken.t_auto);
words.put(Keywords.cBREAK, IToken.t_break);
words.put(Keywords.cCASE, IToken.t_case);

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2007, 2009 Wind River Systems, Inc. and others.
* Copyright (c) 2007, 2010 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -122,7 +122,7 @@ class ASTComment extends ASTPreprocessorNode implements IASTComment {
abstract class ASTDirectiveWithCondition extends ASTPreprocessorNode {
private final int fConditionOffset;
protected final int fConditionOffset;
private final boolean fActive;
public ASTDirectiveWithCondition(IASTTranslationUnit parent, int startNumber, int condNumber, int endNumber, boolean active) {
super(parent, IASTTranslationUnit.PREPROCESSOR_STATEMENT, startNumber, endNumber);
@ -223,6 +223,29 @@ class ASTPragma extends ASTDirectiveWithCondition implements IASTPreprocessorPra
public char[] getMessage() {
return getCondition();
}
public boolean isPragmaOperator() {
return false;
}
}
class ASTPragmaOperator extends ASTPragma {
private final int fConditionEndOffset;
public ASTPragmaOperator(IASTTranslationUnit parent, int startNumber, int condNumber, int condEndNumber, int endNumber) {
super(parent, startNumber, condNumber, endNumber);
fConditionEndOffset= condEndNumber;
}
@Override
public String getConditionString() {
return new String(getSource(fConditionOffset, fConditionEndOffset));
}
@Override
public boolean isPragmaOperator() {
return true;
}
}
class ASTInclusionStatement extends ASTPreprocessorNode implements IASTPreprocessorIncludeStatement {

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2004, 2009 IBM Corporation and others.
* Copyright (c) 2004, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -502,6 +502,9 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
fHandledCompletion= true;
}
break;
case IToken.t_PRAGMA:
handlePragmaOperator(t1);
return nextTokenRaw();
}
if (fLastToken != null) {
fLastToken.setNext(t1);
@ -510,6 +513,39 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
return t1;
}
private void handlePragmaOperator(Token t1) throws OffsetLimitReachedException {
Token t2= fetchToken();
int end;
if (t2.getType() == IToken.tLPAREN) {
Token t3= fetchToken();
end= t3.getEndOffset();
final int tt = t3.getType();
if (tt == IToken.tSTRING || tt == IToken.tLSTRING || tt == IToken.tUTF16STRING || tt == IToken.tUTF32STRING) {
Token t4= fetchToken();
end= t4.getEndOffset();
if (t4.getType() == IToken.tRPAREN) {
fLocationMap.encounterPragmaOperator(t1.getOffset(), t3.getOffset(), t3.getEndOffset(), t4.getEndOffset());
return;
} else {
end= t3.getEndOffset();
pushbackToken(t4);
}
} else {
if (t3.getType() == IToken.tRPAREN) {
// Consume closing parenthesis
end= t3.getEndOffset();
} else {
end= t2.getEndOffset();
pushbackToken(t3);
}
}
} else {
end= t1.getEndOffset();
pushbackToken(t2);
}
fLocationMap.encounterProblem(IProblem.PREPROCESSOR_INVALID_DIRECTIVE, t1.getCharImage(), t1.getOffset(), end);
}
/**
* Returns next token for the parser. String literals are concatenated.
* @throws EndOfFileException when the end of the translation unit has been reached.
@ -538,6 +574,10 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
fHandledCompletion= true;
break;
case IToken.t_PRAGMA:
handlePragmaOperator(t1);
return nextToken();
case IToken.tSTRING:
case IToken.tLSTRING:
case IToken.tUTF16STRING:
@ -566,6 +606,9 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
// no support for inactive code after a string literal
skipInactiveCode();
continue loop;
case IToken.t_PRAGMA:
handlePragmaOperator(t2);
continue loop;
default:
break loop;
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2007, 2009 Wind River Systems, Inc. and others.
* Copyright (c) 2007, 2010 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -294,6 +294,10 @@ public class LocationMap implements ILocationResolver {
fDirectives.add(new ASTPragma(fTranslationUnit, startOffset, condOffset, condEndOffset));
}
public void encounterPragmaOperator(int startNumber, int condNumber, int condEndNumber, int endNumber) {
fDirectives.add(new ASTPragmaOperator(fTranslationUnit, startNumber, condNumber, condEndNumber, endNumber));
}
public void encounterPoundIfdef(int startOffset, int condOffset, int condEndOffset, int endOffset, boolean taken, IMacroBinding macro) {
startOffset= getSequenceNumberForOffset(startOffset);
condOffset= getSequenceNumberForOffset(condOffset);

View file

@ -348,6 +348,7 @@ public class KeywordSets {
PP_DIRECTIVES_CPP.add(Directives.POUND_ERROR);
PP_DIRECTIVES_CPP.add(Directives.POUND_PRAGMA);
PP_DIRECTIVES_CPP.add(Directives.POUND_ELIF);
PP_DIRECTIVES_CPP.add(Directives._PRAGMA);
PP_DIRECTIVES_CPP.add(Directives.DEFINED);
}