Skip to content

Commit 735205b

Browse files
committed
Fix: Avoid spurious code changes during 'shrink'.
Cloning a node would copy, not clone, its token. If later that token is modified, clones of the token would be modified too. Most noticeable when inlining a constant into multiple locations, then trying to modify one of them.
1 parent e7aec4c commit 735205b

34 files changed

+126
-12
lines changed

ShaderShrinker/Shrinker.Lexer/AlphaNumToken.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,5 +45,7 @@ public override IToken TryMatch(string code, ref int offset)
4545

4646
return new AlphaNumToken(Read(code, ref offset, s.Length));
4747
}
48+
49+
public override IToken Clone() => new AlphaNumToken(Content);
4850
}
4951
}

ShaderShrinker/Shrinker.Lexer/AssignmentOperatorToken.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@ public class AssignmentOperatorToken : Token
44
{
55
public override IToken TryMatch(string code, ref int offset) =>
66
Peek(code, offset) == '=' ? new AssignmentOperatorToken { Content = Read(code, ref offset) } : null;
7+
8+
public override IToken Clone() => new AssignmentOperatorToken { Content = Content };
79
}
810
}

ShaderShrinker/Shrinker.Lexer/BackslashToken.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,7 @@ public BackslashToken()
2020

2121
public override IToken TryMatch(string code, ref int offset) =>
2222
Peek(code, offset) == '\\' ? new BackslashToken { Content = Read(code, ref offset) } : null;
23+
24+
public override IToken Clone() => new BackslashToken();
2325
}
2426
}

ShaderShrinker/Shrinker.Lexer/BracketToken.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@ public class BracketToken : Token
44
{
55
public override IToken TryMatch(string code, ref int offset) =>
66
"(){}[]".Contains(Peek(code, offset, 1)) ? new BracketToken { Content = Read(code, ref offset) } : null;
7+
8+
public override IToken Clone() => new BracketToken { Content = Content };
79
}
810
}

ShaderShrinker/Shrinker.Lexer/CommaToken.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,7 @@ public CommaToken()
2020

2121
public override IToken TryMatch(string code, ref int offset) =>
2222
Peek(code, offset) == ',' ? new CommaToken { Content = Read(code, ref offset) } : null;
23+
24+
public override IToken Clone() => new CommaToken();
2325
}
2426
}

ShaderShrinker/Shrinker.Lexer/ConstToken.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,7 @@ public override IToken TryJoin(List<IToken> tokens, int tokenIndex, out int dele
4444
deleteTotal = count + 1;
4545
return tokens[tokenIndex + count];
4646
}
47+
48+
public override IToken Clone() => new ConstToken { Content = Content };
4749
}
4850
}

ShaderShrinker/Shrinker.Lexer/DotToken.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,5 +48,7 @@ public override IToken TryJoin(List<IToken> tokens, int tokenIndex, out int dele
4848

4949
return deleteTotal <= 1 ? null : new FloatToken(newContent.ToString());
5050
}
51+
52+
public override IToken Clone() => new DotToken { Content = "." };
5153
}
5254
}

ShaderShrinker/Shrinker.Lexer/EqualityOperatorToken.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@ public class EqualityOperatorToken : Token
44
{
55
public override IToken TryMatch(string code, ref int offset) =>
66
Peek(code, offset, 2) == "==" ? new EqualityOperatorToken { Content = Read(code, ref offset, 2) } : null;
7+
8+
public override IToken Clone() => new EqualityOperatorToken { Content = "==" };
79
}
810
}

ShaderShrinker/Shrinker.Lexer/FloatToken.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public FloatToken(string s)
3232
public override IToken TryMatch(string code, ref int offset) =>
3333
throw new InvalidOperationException("Should be created by DotToken.");
3434

35+
public override IToken Clone() => new FloatToken(Content);
36+
3537
public IToken Simplify()
3638
{
3739
const int MaxSigFigs = 9;

ShaderShrinker/Shrinker.Lexer/IToken.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,7 @@ public interface IToken
2626
/// Post-process the complete token list, allowing a token to merge with its neighbors. (E.g. '//' merging with following text until newline.
2727
/// </summary>
2828
IToken TryJoin(List<IToken> tokens, int tokenIndex, out int deletePrevious, out int deleteTotal);
29+
30+
IToken Clone();
2931
}
3032
}

0 commit comments

Comments
 (0)