From b099b6ccc490f2712042837063dc328c8038e34a Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Tue, 9 Feb 2010 09:44:06 +0000 Subject: [PATCH] Bug 294730: Pragma operators. --- .../cdt/core/parser/tests/ast2/AST2Tests.java | 26 + .../ast/IASTPreprocessorPragmaStatement.java | 15 +- .../c/GCCScannerExtensionConfiguration.java | 1 - .../org/eclipse/cdt/core/parser/IToken.java | 12 +- .../org/eclipse/cdt/core/parser/Keywords.java | 474 +++++++++--------- .../parser/scanner/ASTPreprocessorNode.java | 27 +- .../core/parser/scanner/CPreprocessor.java | 45 +- .../core/parser/scanner/LocationMap.java | 6 +- .../core/parser/token/KeywordSets.java | 1 + 9 files changed, 359 insertions(+), 248 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index 2ff3003969e..c135b4e3c91 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -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()); + } + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorPragmaStatement.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorPragmaStatement.java index c5ddd61102a..5e65c555ccc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorPragmaStatement.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTPreprocessorPragmaStatement.java @@ -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: _Pragma("once") + * @since 5.2 + */ + public boolean isPragmaOperator(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/c/GCCScannerExtensionConfiguration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/c/GCCScannerExtensionConfiguration.java index 8546b90735f..d5f85b6ed95 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/c/GCCScannerExtensionConfiguration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/parser/c/GCCScannerExtensionConfiguration.java @@ -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)"); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IToken.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IToken.java index 102819b8848..e56fb65185f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IToken.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IToken.java @@ -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; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/Keywords.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/Keywords.java index bb6d4fbd789..c7428649f5e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/Keywords.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/Keywords.java @@ -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[] cpMIN = "?".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); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorNode.java index 9597f994af5..fc208872c06 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ASTPreprocessorNode.java @@ -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 { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java index 956b4eea8b5..b1c02994393 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java @@ -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; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationMap.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationMap.java index d7527abb2fe..489bf5a9079 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationMap.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/LocationMap.java @@ -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); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java index 501ee2086cb..cd2bc0a22d9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/KeywordSets.java @@ -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); }