Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8364393

Allow templates to have # character without variable replacement

XMLWordPrintable

      Some templates might include java code containing the `#` character and not get it replaced by a variable, e.g.

      ```
      static final String POSTFIX = "#I_";
      ```

      The template framework thinks there's an argument missing:

      ```
      compiler.lib.template_framework.RendererException: Missing hashtag replacement for #I_
      at compiler.lib.template_framework.TemplateFrame.getHashtagReplacement(TemplateFrame.java:93)
      at compiler.lib.template_framework.Renderer.getHashtagReplacement(Renderer.java:167)
      at compiler.lib.template_framework.Renderer.lambda$renderStringWithDollarAndHashtagReplacementsPart$0(Renderer.java:420)
      at java.base/java.util.regex.Matcher.replaceFirst(Matcher.java:1514)
      at compiler.lib.template_framework.Renderer.renderStringWithDollarAndHashtagReplacementsPart(Renderer.java:412)
      at compiler.lib.template_framework.Renderer.renderStringWithDollarAndHashtagReplacements(Renderer.java:366)
      at compiler.lib.template_framework.Renderer.renderToken(Renderer.java:262)
      at compiler.lib.template_framework.Renderer.renderTokenList(Renderer.java:328)
      at compiler.lib.template_framework.Renderer.renderTemplateToken(Renderer.java:251)
      at compiler.lib.template_framework.Renderer.renderToken(Renderer.java:314)
      at compiler.lib.template_framework.Renderer.renderTokenList(Renderer.java:328)
      at compiler.lib.template_framework.Renderer.renderToken(Renderer.java:281)
      at compiler.lib.template_framework.Renderer.renderTokenList(Renderer.java:328)
      at compiler.lib.template_framework.Renderer.renderTemplateToken(Renderer.java:251)
      at compiler.lib.template_framework.Renderer.render(Renderer.java:132)
      at compiler.lib.template_framework.Renderer.render(Renderer.java:122)
      at compiler.lib.template_framework.TemplateToken.render(TemplateToken.java:163)
      at compiler.lib.template_framework.Template$ZeroArgs.render(Template.java:308)
      at compiler.lib.template_framework.library.TestFrameworkClass.render(TestFrameworkClass.java:117)
      at compiler.valhalla.inlinetypes.templating.TestOne.generate(TestOne.java:69)
      at compiler.valhalla.inlinetypes.templating.TestOne.main(TestOne.java:132)
      at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
      at java.base/java.lang.reflect.Method.invoke(Method.java:565)
      at com.sun.javatest.regtest.agent.MainActionHelper$AgentVMRunnable.run(MainActionHelper.java:335)
      at java.base/java.lang.Thread.run(Thread.java:1447)
      ```

      The way this problem is solved in String.format() is by doubling up. So, if you want to add the `%` character, you just double it: `%%`:

      https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html
      ```
      The format specifiers which do not correspond to arguments have the following syntax:
         %[flags][width]conversion
      ...
      Conversions

      Conversions are divided into the following categories:
      ...
      * Percent - produces a literal '%' ('\u0025')
      ```

      I've tried to see if `##` works but it doesn't:

      ```
      TEST RESULT: Failed. Execution failed: `main' threw exception: compiler.lib.template_framework.RendererException: Is not a valid '#' replacement pattern: '#' in '...'.
      ```

      So I'm proposing to add the capability to convert `##` into `#` and avoid hashtag replacement.

      A similar thing might be required for `$` too

      Thoughts [~epeter]? If you're happy with it I can give it a go

            Unassigned Unassigned
            galder Galder ZamarreƱo
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated: