@@ -40,6 +40,7 @@ class StringReplacement {
4040 }
4141
4242 inline const std::string &getReplacedText () { return Text; }
43+ inline size_t getLength () { return Length; }
4344
4445private:
4546 // SourceStr is the string which need replaced.
@@ -132,17 +133,30 @@ class StringReplacements {
132133 // Add a template dependent replacement
133134 inline void addTemplateDependentReplacement (size_t Offset, size_t Length,
134135 unsigned TemplateIndex) {
135- TDRs.insert (
136- std::make_pair (Offset, std::make_shared<TemplateDependentReplacement>(
137- SourceStr, Offset, Length, TemplateIndex)));
136+ // Find items in ReplMap whose offset <= Offset.
137+ // Then check length, is there is overlap, ignore this insertion.
138+ // Finally calculate the shift length.
139+ int Shift = 0 ;
140+ auto UpperBound = ReplMap.upper_bound (Offset);
141+ for (auto It = ReplMap.begin (); It != UpperBound; ++It) {
142+ if ((It->first + It->second ->getLength ()) > Offset) {
143+ // overlap
144+ return ;
145+ }
146+ Shift +=
147+ (It->second ->getReplacedText ().length () - It->second ->getLength ());
148+ }
149+ auto TDR = std::make_shared<TemplateDependentReplacement>(
150+ SourceStr, Offset, Length, TemplateIndex);
151+ TDR ->shift (Shift);
152+ TDRs.insert (std::make_pair (Offset + Shift, TDR ));
138153 }
139154
140- inline void addTemplateDependentReplacement (
141- size_t Offset, size_t Length,
142- std::shared_ptr<TemplateDependentStringInfo> TDSI ) {
143- // TDRs.insert(
144- // std::make_pair(Offset, std::make_shared<TemplateDependentReplacement>(
145- // SourceStr, Offset, Length, TemplateIndex)));
155+ inline void addTemplateDependentReplacement (std::string String,
156+ unsigned TemplateIndex) {
157+ auto TDR = std::make_shared<TemplateDependentReplacement>(
158+ String, String.size (), TemplateIndex);
159+ TDRs.insert (std::make_pair (0 , TDR ));
146160 }
147161
148162 // Add a string replacement
@@ -595,10 +609,9 @@ class ExprAnalysis {
595609 ReplSet.addTemplateDependentReplacement (Offset, Length, TemplateIndex);
596610 }
597611
598- inline void
599- addReplacement (size_t Offset, size_t Length,
600- std::shared_ptr<TemplateDependentStringInfo> TDSI ) {
601- ReplSet.addTemplateDependentReplacement (Offset, Length, TDSI );
612+ inline void addReplacement (std::string String,
613+ unsigned TemplateIndex) {
614+ ReplSet.addTemplateDependentReplacement (String, TemplateIndex);
602615 }
603616
604617 // Analyze the expression, jump to corresponding analysis function according
0 commit comments