AngelDoReMi / closure-templates

Automatically exported from code.google.com/p/closure-templates
Apache License 2.0
0 stars 0 forks source link

Soy throws ClassCastException rather than SoySyntaxException #16

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
Try to compile the following Soy template (that admittedly contains a
syntax error):

{namespace example}

// There appears to be a bug in Soy where it throws a ClassCastException
// rather than a SoySyntaxException for certain types of input.

/**
 * @param data
 */
{template .bad_template}
  {foreach $entry in $data.entries1}
    <div class="{if index($entry) % 2 == 0}">even{/if}"></div>
  {/foreach}
  {foreach $entry in $data.entries2}
    // Syntax error is on this line
    <div class="{if index($entry + length($data.entries1)) %
2}even{/if}"></div>
  {/foreach}
{/template}

The Java exception is the following ClassCastException, which should be
caught and rethrown as a SoySyntaxException:

     [java] Exception in thread "main" java.lang.ClassCastException:
com.google.template.soy.exprtree.OperatorNodes$PlusOpNode cannot be cast to
com.google.template.soy.exprtree.DataRefNode
     [java]     at
com.google.template.soy.jssrc.internal.TranslateToJsExprVisitor.visitIndexFuncti
on(Unknown
Source)
     [java]     at
com.google.template.soy.jssrc.internal.TranslateToJsExprVisitor.visitInternal(Un
known
Source)
     [java]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     [java]     at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
     [java]     at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav
a:25)
     [java]     at java.lang.reflect.Method.invoke(Method.java:597)
     [java]     at
com.google.template.soy.basetree.AbstractNodeVisitor.visit(Unknown Source)
     [java]     at
com.google.template.soy.jssrc.internal.TranslateToJsExprVisitor.genJsExprUsingSo
ySyntaxWithNewToken(Unknown
Source)
     [java]     at
com.google.template.soy.jssrc.internal.TranslateToJsExprVisitor.genJsExprUsingSo
ySyntax(Unknown
Source)
     [java]     at
com.google.template.soy.jssrc.internal.TranslateToJsExprVisitor.visitInternal(Un
known
Source)
     [java]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     [java]     at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

Original issue reported on code.google.com by mbo...@gmail.com on 30 Apr 2010 at 4:45

GoogleCodeExporter commented 8 years ago
Similarly (but different), trying to use a function like isFirst() within 
{foreach}
rather than {for} results in a NullPointerException rather than a 
SoySyntaxException:

  {for $i in range(1, length($rows) - 1)}
  <div id="{$rows[$i].symbol|id}"
       class="{css row} {if $i % 2 == 0}even-row{else}odd-row{/if}">
    // This assumes that the caller has made sure that the ticker symbol does
    // not contain any malicious HTML.
    {if isFirst($i)}hooray!{/if}
    <div class="{css cell}">{$rows[$i].symbol|noAutoescape}</div>
    <div class="{css cell} {css value-cell}">{$rows[$i].value}</div>
  </div>
  {/for}

     [java] Exception in thread "main" java.lang.NullPointerException
     [java]     at java.util.ArrayDeque.addFirst(ArrayDeque.java:199)
     [java]     at java.util.ArrayDeque.push(ArrayDeque.java:466)
     [java]     at com.google.template.soy.jssrc.internal.TranslateToJsExprVisit
or.visitIsFirstFunction(Unknown Source)
     [java]     at com.google.template.soy.jssrc.internal.TranslateToJsExprVisit
or.visitInternal(Unknown Source)
     [java]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     [java]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcces
sorImpl.java:39)
     [java]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMet
hodAccessorImpl.java:25)

Original comment by bolinf...@gmail.com on 2 May 2010 at 7:55

GoogleCodeExporter commented 8 years ago
Below is a minimal testcase for the first issue:

{namespace example}

/**
 */
{template .bad_template}
  {index(0)}
{/template}

Original comment by msam...@google.com on 18 Feb 2011 at 9:27

GoogleCodeExporter commented 8 years ago

Original comment by kai.hu...@gmail.com on 20 Sep 2011 at 12:07