1 module TokenStreamRewriterTest; 2 3 version(unittest) { 4 5 import RuleTranslatorLexer; 6 import RuleTranslatorParser: RuleTranslatorParser; 7 import RuleTranslatorBaseListener; 8 import antlr.v4.runtime.ANTLRInputStream; 9 import antlr.v4.runtime.CommonToken; 10 import antlr.v4.runtime.CommonTokenStream; 11 import antlr.v4.runtime.TokenStream; 12 import antlr.v4.runtime.DiagnosticErrorListener; 13 import antlr.v4.runtime.LexerNoViableAltException; 14 import antlr.v4.runtime.Token; 15 import antlr.v4.runtime.TokenStreamRewriter : TokenStreamRewriter; 16 import antlr.v4.runtime.atn.ParserATNSimulator; 17 import antlr.v4.runtime.tree.ParseTreeWalker; 18 import dshould : be, equal, not, should; 19 import dshould.thrown; 20 import std.conv : to; 21 import std.stdio : File, writefln; 22 import std.file; 23 import unit_threaded; 24 25 public class InsertTestListenerReplace : RuleTranslatorBaseListener { 26 27 TokenStreamRewriter rewriter; 28 29 this(TokenStream tokens) 30 { 31 rewriter = new TokenStreamRewriter(tokens); 32 } 33 /** 34 * <p>The default implementation does nothing.</p> 35 */ 36 override public void enterFile_input(RuleTranslatorParser.File_inputContext ctx) { 37 writefln("enterFile"); 38 } 39 /** 40 * {@inheritDoc} 41 * 42 * <p>The default implementation does nothing.</p> 43 */ 44 override public void exitStmt(RuleTranslatorParser.StmtContext ctx) { 45 debug(TokenStreamRewriter) { 46 import std.stdio : writefln; 47 writefln("exitStmt ctx.start = %s", ctx.start); 48 } 49 rewriter.replace(ctx.start, ctx.stop, "gamma"); 50 } 51 } 52 53 public class InsertTestListenerDelete : RuleTranslatorBaseListener { 54 55 TokenStreamRewriter rewriter; 56 57 this(TokenStream tokens) 58 { 59 rewriter = new TokenStreamRewriter(tokens); 60 } 61 /** 62 * <p>The default implementation does nothing.</p> 63 */ 64 override public void enterFile_input(RuleTranslatorParser.File_inputContext ctx) { 65 writefln("enterFile"); 66 } 67 /** 68 * {@inheritDoc} 69 * 70 * <p>The default implementation does nothing.</p> 71 */ 72 override public void exitStmt(RuleTranslatorParser.StmtContext ctx) { 73 debug(TokenStreamRewriter) { 74 import std.stdio : writefln; 75 writefln("exitStmt ctx.start = %s", ctx.start); 76 } 77 rewriter.deleteT(ctx.start, ctx.stop); 78 } 79 } 80 81 public class InsertTestListener : RuleTranslatorBaseListener { 82 83 TokenStreamRewriter rewriter; 84 85 this(TokenStream tokens) 86 { 87 rewriter = new TokenStreamRewriter(tokens); 88 } 89 /** 90 * <p>The default implementation does nothing.</p> 91 */ 92 override public void enterFile_input(RuleTranslatorParser.File_inputContext ctx) { 93 writefln("enterFile"); 94 } 95 /** 96 * {@inheritDoc} 97 * 98 * <p>The default implementation does nothing.</p> 99 */ 100 override public void exitStmt(RuleTranslatorParser.StmtContext ctx) { 101 auto str = "alpha"; 102 rewriter.insertAfter(ctx.start, "beta"); 103 rewriter.insertBefore(ctx.start, str); 104 } 105 } 106 107 class Test { 108 @Tags("TokenStreamRewriter") 109 @("replace") 110 unittest { 111 auto input = 112 `# Text definition DEFAS 113 # for automatic announcements 114 # Version 2018-02-21 115 116 rule Delay as DELAY de 117 base de.Phrases 118 119 "Information zu" 120 ` 121 ; 122 123 auto expected = 124 ` 125 ruleDelayasDELAYde 126 basede.Phrases 127 gamma`; 128 129 auto antlrInput = new ANTLRInputStream(input); 130 auto lexer = new RuleTranslatorLexer(antlrInput); 131 auto cts = new CommonTokenStream(lexer); 132 cts.fill; 133 auto tokens = cts.getTokens; 134 foreach (i, t; tokens) { 135 writefln("token %s: %s", i, t); 136 } 137 cts.getNumberOfOnChannelTokens.should.equal(15); 138 auto parser = new RuleTranslatorParser(cts); 139 // Specify entry point 140 auto rootContext = parser.file_input; 141 parser.numberOfSyntaxErrors.should.equal(0); 142 auto extractor = new InsertTestListenerReplace(cts); 143 auto walker = new ParseTreeWalker; 144 walker.walk(extractor, rootContext); 145 auto str = extractor.rewriter.getText; 146 str.should.equal(expected); 147 } 148 149 @Tags("TokenStreamRewriter") 150 @("insert after and before") 151 unittest { 152 auto input = 153 `# Text definition DEFAS 154 # for automatic announcements 155 # Version 2018-02-21 156 157 rule Delay as DELAY de 158 base de.Phrases 159 160 "Information zu" 161 ` 162 ; 163 164 auto expected = 165 ` 166 ruleDelayasDELAYde 167 basede.Phrases 168 alpha"Information zu"beta 169 `; 170 171 auto antlrInput = new ANTLRInputStream(input); 172 auto lexer = new RuleTranslatorLexer(antlrInput); 173 auto cts = new CommonTokenStream(lexer); 174 cts.fill; 175 auto tokens = cts.getTokens; 176 foreach (i, t; tokens) { 177 writefln("token %s: %s", i, t); 178 } 179 cts.getNumberOfOnChannelTokens.should.equal(15); 180 auto parser = new RuleTranslatorParser(cts); 181 // Specify entry point 182 auto rootContext = parser.file_input; 183 parser.numberOfSyntaxErrors.should.equal(0); 184 auto extractor = new InsertTestListener(cts); 185 auto walker = new ParseTreeWalker; 186 walker.walk(extractor, rootContext); 187 auto str = extractor.rewriter.getText; 188 str.should.equal(expected); 189 } 190 } 191 @Tags("TokenStreamRewriter") 192 @("deleteT") 193 unittest { 194 auto input = 195 `# Text definition DEFAS 196 # for automatic announcements 197 # Version 2018-02-21 198 199 rule Delay as DELAY de 200 base de.Phrases 201 202 "Information zu" 203 ` 204 ; 205 206 auto expected = 207 ` 208 ruleDelayasDELAYde 209 basede.Phrases 210 `; 211 212 auto antlrInput = new ANTLRInputStream(input); 213 auto lexer = new RuleTranslatorLexer(antlrInput); 214 auto cts = new CommonTokenStream(lexer); 215 cts.fill; 216 auto tokens = cts.getTokens; 217 foreach (i, t; tokens) { 218 writefln("token %s: %s", i, t); 219 } 220 cts.getNumberOfOnChannelTokens.should.equal(15); 221 auto parser = new RuleTranslatorParser(cts); 222 // Specify entry point 223 auto rootContext = parser.file_input; 224 parser.numberOfSyntaxErrors.should.equal(0); 225 auto extractor = new InsertTestListenerDelete(cts); 226 auto walker = new ParseTreeWalker; 227 walker.walk(extractor, rootContext); 228 auto str = extractor.rewriter.getText; 229 str.should.equal(expected); 230 } 231 }