mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Option to record defined macros during expansion.
This commit is contained in:
parent
22a089aca4
commit
535d90cc7d
2 changed files with 22 additions and 15 deletions
|
@ -101,11 +101,12 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
|
||||||
private static final DynamicMacro __LINE__ = new LineMacro("__LINE__".toCharArray()); //$NON-NLS-1$
|
private static final DynamicMacro __LINE__ = new LineMacro("__LINE__".toCharArray()); //$NON-NLS-1$
|
||||||
private static final char[] ONCE = "once".toCharArray(); //$NON-NLS-1$
|
private static final char[] ONCE = "once".toCharArray(); //$NON-NLS-1$
|
||||||
|
|
||||||
private static final int NO_EXPANSION = 0x01;
|
static final int NO_EXPANSION = 0x01;
|
||||||
private static final int PROTECT_DEFINED = 0x02;
|
static final int PROTECT_DEFINED = 0x02;
|
||||||
private static final int STOP_AT_NL = 0x04;
|
static final int STOP_AT_NL = 0x04;
|
||||||
private static final int CHECK_NUMBERS = 0x08;
|
static final int CHECK_NUMBERS = 0x08;
|
||||||
private static final int REPORT_SIGNIFICANT_MACROS = 0x10;
|
static final int REPORT_SIGNIFICANT_MACROS = 0x10;
|
||||||
|
static final int IGNORE_UNDEFINED_SIGNIFICANT_MACROS = 0x20;
|
||||||
|
|
||||||
private static final int MAX_INCLUSION_DEPTH = 200;
|
private static final int MAX_INCLUSION_DEPTH = 200;
|
||||||
|
|
||||||
|
@ -1821,7 +1822,7 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
|
||||||
}
|
}
|
||||||
PreprocessorMacro macro= fMacroDictionary.get(name);
|
PreprocessorMacro macro= fMacroDictionary.get(name);
|
||||||
if (macro == null) {
|
if (macro == null) {
|
||||||
if (reportSignificant)
|
if ((options & IGNORE_UNDEFINED_SIGNIFICANT_MACROS) == 0)
|
||||||
fCurrentContext.significantMacroUndefined(name);
|
fCurrentContext.significantMacroUndefined(name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1843,9 +1844,7 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
|
||||||
final ITokenSequence input= stopAtNewline ? fLineInputToMacroExpansion : fInputToMacroExpansion;
|
final ITokenSequence input= stopAtNewline ? fLineInputToMacroExpansion : fInputToMacroExpansion;
|
||||||
final MacroExpander expander = withinExpansion ? new MacroExpander(this, fMacroDictionary,
|
final MacroExpander expander = withinExpansion ? new MacroExpander(this, fMacroDictionary,
|
||||||
fLocationMap, fLexOptions) : fMacroExpander;
|
fLocationMap, fLexOptions) : fMacroExpander;
|
||||||
TokenList replacement= expander.expand(input, (options & PROTECT_DEFINED) != 0, macro,
|
TokenList replacement= expander.expand(input, options, macro, identifier, contentAssist, fCurrentContext);
|
||||||
identifier, contentAssist,
|
|
||||||
reportSignificant ? fCurrentContext : null);
|
|
||||||
final IASTName[] expansions= expander.clearImplicitExpansions();
|
final IASTName[] expansions= expander.clearImplicitExpansions();
|
||||||
final ImageLocationInfo[] ili= expander.clearImageLocationInfos();
|
final ImageLocationInfo[] ili= expander.clearImageLocationInfos();
|
||||||
final Token last= replacement.last();
|
final Token last= replacement.last();
|
||||||
|
|
|
@ -137,6 +137,7 @@ public class MacroExpander {
|
||||||
private int fFixedLineNumber;
|
private int fFixedLineNumber;
|
||||||
private char[] fFixedInput;
|
private char[] fFixedInput;
|
||||||
private ScannerContext fReportMacros;
|
private ScannerContext fReportMacros;
|
||||||
|
private boolean fReportUndefined;
|
||||||
|
|
||||||
public MacroExpander(ILexerLog log, CharArrayMap<PreprocessorMacro> macroDictionary, LocationMap locationMap, LexerOptions lexOptions) {
|
public MacroExpander(ILexerLog log, CharArrayMap<PreprocessorMacro> macroDictionary, LocationMap locationMap, LexerOptions lexOptions) {
|
||||||
fDictionary= macroDictionary;
|
fDictionary= macroDictionary;
|
||||||
|
@ -150,10 +151,17 @@ public class MacroExpander {
|
||||||
* Expects that the identifier has been consumed, stores the result in the list provided.
|
* Expects that the identifier has been consumed, stores the result in the list provided.
|
||||||
* @param scannerContext
|
* @param scannerContext
|
||||||
*/
|
*/
|
||||||
public TokenList expand(ITokenSequence lexer, final boolean isPPCondition,
|
public TokenList expand(ITokenSequence lexer, final int ppOptions,
|
||||||
PreprocessorMacro macro, Token identifier, boolean completionMode,
|
PreprocessorMacro macro, Token identifier, boolean completionMode,
|
||||||
ScannerContext scannerContext) throws OffsetLimitReachedException {
|
ScannerContext scannerContext) throws OffsetLimitReachedException {
|
||||||
fReportMacros= scannerContext;
|
final boolean protectDefined= (ppOptions & CPreprocessor.PROTECT_DEFINED) != 0;
|
||||||
|
if ((ppOptions & CPreprocessor.REPORT_SIGNIFICANT_MACROS) != 0) {
|
||||||
|
fReportMacros= scannerContext;
|
||||||
|
fReportUndefined= (ppOptions & CPreprocessor.IGNORE_UNDEFINED_SIGNIFICANT_MACROS) == 0;
|
||||||
|
} else {
|
||||||
|
fReportMacros= null;
|
||||||
|
}
|
||||||
|
|
||||||
fImplicitMacroExpansions.clear();
|
fImplicitMacroExpansions.clear();
|
||||||
fImageLocationInfos.clear();
|
fImageLocationInfos.clear();
|
||||||
|
|
||||||
|
@ -175,7 +183,7 @@ public class MacroExpander {
|
||||||
|
|
||||||
input.prepend(firstExpansion);
|
input.prepend(firstExpansion);
|
||||||
|
|
||||||
result= expandAll(input, forbidden, isPPCondition, null);
|
result= expandAll(input, forbidden, protectDefined, null);
|
||||||
} catch (CompletionInMacroExpansionException e) {
|
} catch (CompletionInMacroExpansionException e) {
|
||||||
// for content assist in macro expansions, we return the list of tokens of the
|
// for content assist in macro expansions, we return the list of tokens of the
|
||||||
// parameter at the current cursor position and hope that they make sense if
|
// parameter at the current cursor position and hope that they make sense if
|
||||||
|
@ -362,10 +370,10 @@ public class MacroExpander {
|
||||||
} else if (macro == null || (macro.isFunctionStyle() && !input.findLParenthesis())) {
|
} else if (macro == null || (macro.isFunctionStyle() && !input.findLParenthesis())) {
|
||||||
// Tricky: Don't mark function-style macros if you don't find the left parenthesis
|
// Tricky: Don't mark function-style macros if you don't find the left parenthesis
|
||||||
if (fReportMacros != null) {
|
if (fReportMacros != null) {
|
||||||
if (macro == null) {
|
if (macro != null) {
|
||||||
fReportMacros.significantMacroUndefined(image);
|
|
||||||
} else {
|
|
||||||
fReportMacros.significantMacro(macro);
|
fReportMacros.significantMacro(macro);
|
||||||
|
} else if (fReportUndefined){
|
||||||
|
fReportMacros.significantMacroUndefined(image);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
result.append(t);
|
result.append(t);
|
||||||
|
|
Loading…
Add table
Reference in a new issue