summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/pp-macro-expander.cpp
diff options
context:
space:
mode:
authorChristian Kamm <christian.d.kamm@nokia.com>2009-09-25 16:00:14 +0200
committerChristian Kamm <christian.d.kamm@nokia.com>2009-09-25 16:08:01 +0200
commit22ed0255b97ff52d808ebd93fabe06e214b56d2d (patch)
tree40dc79d131d6b13a8360ff8e68e7ab6119557d1f /src/libs/cplusplus/pp-macro-expander.cpp
parent90470771fd58722a6a82b3da28bfaa645b250216 (diff)
downloadqt-creator-22ed0255b97ff52d808ebd93fabe06e214b56d2d.tar.gz
Track more macro uses.
In particular macros that are only checked for definition or are expanded during the evaluation of an #if or #elif directive are now also added to the list available through Document::macroUses(). The names of undefined macros that are interesting (because they're used in an #ifdef or a defined(...)) are now available through Document::undefinedMacroUses(). Reviewed-by: Roberto Raggi <roberto.raggi@nokia.com>
Diffstat (limited to 'src/libs/cplusplus/pp-macro-expander.cpp')
-rw-r--r--src/libs/cplusplus/pp-macro-expander.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/libs/cplusplus/pp-macro-expander.cpp b/src/libs/cplusplus/pp-macro-expander.cpp
index 4902158c76..42be634562 100644
--- a/src/libs/cplusplus/pp-macro-expander.cpp
+++ b/src/libs/cplusplus/pp-macro-expander.cpp
@@ -66,9 +66,11 @@ inline static bool comment_p (const char *__first, const char *__last)
return (*__first == '/' || *__first == '*');
}
-MacroExpander::MacroExpander(Environment *env, pp_frame *frame)
+MacroExpander::MacroExpander(Environment *env, pp_frame *frame, Client *client, unsigned start_offset)
: env(env),
frame(frame),
+ client(client),
+ start_offset(start_offset),
lines(0)
{ }
@@ -97,6 +99,7 @@ const char *MacroExpander::operator()(const char *first, const char *last,
const char *MacroExpander::expand(const char *__first, const char *__last,
QByteArray *__result)
{
+ const char *start = __first;
__first = skip_blanks (__first, __last);
lines = skip_blanks.lines;
@@ -284,6 +287,9 @@ const char *MacroExpander::expand(const char *__first, const char *__last,
if (! macro->definition().isEmpty())
{
+ if (client)
+ client->startExpandingMacro(start_offset + (name_begin-start), *macro, fast_name, true);
+
macro->setHidden(true);
QByteArray __tmp;
@@ -310,6 +316,9 @@ const char *MacroExpander::expand(const char *__first, const char *__last,
}
macro->setHidden(false);
+
+ if (client)
+ client->stopExpandingMacro(start_offset + (name_begin-start), *macro);
}
if (! m)
@@ -330,6 +339,7 @@ const char *MacroExpander::expand(const char *__first, const char *__last,
}
QVector<QByteArray> actuals;
+ QVector<MacroArgumentReference> actuals_ref;
actuals.reserve (5);
++arg_it; // skip '('
@@ -338,6 +348,7 @@ const char *MacroExpander::expand(const char *__first, const char *__last,
const char *arg_end = skip_argument_variadics (actuals, macro, arg_it, __last);
if (arg_it != arg_end)
{
+ actuals_ref.append(MacroArgumentReference(start_offset + (arg_it-start), arg_end - arg_it));
const QByteArray actual (arg_it, arg_end - arg_it);
QByteArray expanded;
expand_actual (actual.constBegin (), actual.constEnd (), &expanded);
@@ -350,6 +361,7 @@ const char *MacroExpander::expand(const char *__first, const char *__last,
++arg_it; // skip ','
arg_end = skip_argument_variadics (actuals, macro, arg_it, __last);
+ actuals_ref.append(MacroArgumentReference(start_offset + (arg_it-start), arg_end - arg_it));
const QByteArray actual (arg_it, arg_end - arg_it);
QByteArray expanded;
expand_actual (actual.constBegin (), actual.constEnd (), &expanded);
@@ -363,11 +375,17 @@ const char *MacroExpander::expand(const char *__first, const char *__last,
++arg_it; // skip ')'
__first = arg_it;
+ if (client)
+ client->startExpandingMacro(start_offset + (name_begin-start), *macro, fast_name, true, actuals_ref);
+
pp_frame frame (macro, actuals);
MacroExpander expand_macro (env, &frame);
macro->setHidden(true);
expand_macro (macro->definition(), __result);
macro->setHidden(false);
+
+ if (client)
+ client->stopExpandingMacro(start_offset + (name_begin-start), *macro);
}
else
__result->append(*__first++);