Skip to content

Commit 6fd986d

Browse files
committed
Fix redundant rewrite attempts of TypeSimplifier
TypeSimplifier didn't respect line limit, causing each node to be rewriten 10 times (once for each line limit window) unless it was succesfully replaced in first try
1 parent 67f11ea commit 6fd986d

2 files changed

Lines changed: 20 additions & 12 deletions

File tree

source/OneTimeRewriter.hpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class OneTimeRewriter : public SyntaxRewriter<TDerived> {
1212
public:
1313
enum State {
1414
SKIP_TO_START,
15-
REMOVAL_ALLOWED,
15+
REWRITE_ALLOWED,
1616
REGISTER_CHILD,
1717
EXIT_REWRITE_POINT,
1818
REGISTER_SUCCESSOR,
@@ -30,7 +30,7 @@ class OneTimeRewriter : public SyntaxRewriter<TDerived> {
3030
SourceRange rewritePointChildren;
3131
SourceRange rewritePointSuccessor;
3232

33-
State state = REMOVAL_ALLOWED;
33+
State state = REWRITE_ALLOWED;
3434

3535
// As an optimization we do minimization in quasi-sorted way:
3636
// first minimize nodes at least 1024 lines long, then 512, and so on
@@ -58,7 +58,7 @@ class OneTimeRewriter : public SyntaxRewriter<TDerived> {
5858
template <typename T>
5959
void visit(T&& node, bool isNodeRemovable = true) {
6060
if (state == SKIP_TO_START && node.sourceRange() == startPoint) {
61-
state = REMOVAL_ALLOWED;
61+
state = REWRITE_ALLOWED;
6262
}
6363

6464
if (state == REGISTER_CHILD && node.sourceRange() != SourceRange::NoLocation &&
@@ -96,17 +96,23 @@ class OneTimeRewriter : public SyntaxRewriter<TDerived> {
9696
template <typename T>
9797
bool shouldRemove(const T& node, bool isNodeRemovable) {
9898
unsigned len = std::ranges::count(node.toString(), '\n') + 1;
99-
return state == REMOVAL_ALLOWED && isNodeRemovable && len >= linesLowerLimit &&
99+
return state == REWRITE_ALLOWED && isNodeRemovable && len >= linesLowerLimit &&
100100
len < linesUpperLimit;
101101
}
102102

103103
template <typename T>
104104
bool shouldRemove(const SyntaxList<T>& list) {
105105
unsigned len = std::ranges::count(list.toString(), '\n') + 1;
106-
return state == REMOVAL_ALLOWED && list.getChildCount() && len >= linesLowerLimit &&
106+
return state == REWRITE_ALLOWED && list.getChildCount() && len >= linesLowerLimit &&
107107
len < linesUpperLimit;
108108
}
109109

110+
template <typename T>
111+
bool shouldReplace(const T& node) {
112+
unsigned len = std::ranges::count(node.toString(), '\n') + 1;
113+
return state == REWRITE_ALLOWED && len >= linesLowerLimit && len < linesUpperLimit;
114+
}
115+
110116
template <typename T>
111117
void logType() {
112118
std::cerr << STRINGIZE_NODE_TYPE(T) << "\n";
@@ -140,12 +146,14 @@ class OneTimeRewriter : public SyntaxRewriter<TDerived> {
140146

141147
template <typename TOrig, typename TNew>
142148
void replaceNode(const TOrig& originalNode, TNew& newNode) {
143-
logType<TOrig>();
144-
std::cerr << prefixLines(originalNode.toString(), "-") << "\n";
145-
std::cerr << prefixLines(newNode.toString(), "+") << "\n";
146-
DERIVED->replace(originalNode, newNode);
147-
rewritePoint = originalNode.sourceRange();
148-
state = REGISTER_CHILD;
149+
if (shouldReplace(originalNode)) {
150+
logType<TOrig>();
151+
std::cerr << prefixLines(originalNode.toString(), "-") << "\n";
152+
std::cerr << prefixLines(newNode.toString(), "+") << "\n";
153+
DERIVED->replace(originalNode, newNode);
154+
rewritePoint = originalNode.sourceRange();
155+
state = REGISTER_CHILD;
156+
}
149157
}
150158

151159
std::shared_ptr<SyntaxTree> transform(const std::shared_ptr<SyntaxTree> tree,

source/TypeSimplifier.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class TypeSimplifier : public OneTimeRewriter<TypeSimplifier> {
3636
}
3737

3838
ShouldVisitChildren handle(const DataTypeSyntax& node, bool isNodeRemovable) {
39-
if (state == REMOVAL_ALLOWED && canSimplify(&node)) {
39+
if (shouldReplace(node) && canSimplify(&node)) {
4040
replaceNode(node, *makeIntNode(node.sourceRange().start()));
4141
}
4242
return VISIT_CHILDREN;

0 commit comments

Comments
 (0)