# 4.0

BIG THANKS to Sam Harwell and, again, to Udo Borkowski for debugging help and
suggestions. Sam is doing the C# implementation. Benjamin Niemann is doing
the Python port. Alan Condit is doing Objective-C.

4.0 – March 27, 2011

* ST.add() returns self now so we can chain. t.add("x", 1).add("y", "hi");
* import from files in jar didn't work.
* removed field tokens from STGroupString
* improved imports lookup
* made fields of events public final.
* augmented debug event toString and fixed start/stop issue with eval
events. renamed fields to be more clear.
* Added IndentEvent for dbg
* ^(INDENT expr-sub-tree) is now ^(INDENTED_EXPR INDENT expr-sub-tree)
with changes to grammars. More consistent with subtree root being operator.
STViz now highlights indentation properly in template pane.
* Altered CodeGenerator.g to pass AST node for indentation not just string.
This way we get INDENT operations into the sourceMap for indent debug events.

4.0b5 – March 6, 2011

* true/false were only allowed as default args; now allowed as template
arg expressions in templates. Works as dictionary value too.
* couldn't have anonymous templates inside a region.
* parentheses were a bit weird in conditions. Now, conditions cannot
use parentheses to mean "early evaluation" except as obj.(propName)
* nativeGroup of all implicit templates was STGroup.defaultGroup.
* removed all writes of the enclosingInstance at evaluation time; fixed
issue for STViz.
* comments on line by themselves don't emit \n to output
* STViz tried to highlight AST pane even when we switched ASTs
* combined load_str, write into write_str single op. minor optimizations too.
Seems a tiny bit faster per benchmarks.
* Added ST.VERSION auto-updated by ANT.
* added STGroupString
* Added support for this in group.g:

 ```
oldStyleHeader // ignore but lets us use this parser in AW for both v3 and v4
  :   'group' ID ( ':' ID )? ( 'implements' ID (',' ID)\* )? ';'
  ;
```

* IndexOutOfBounds Exception when using "cap" format on empty string
* @t.() ::= "" caused NPE
* Region redefinition caused NPE. "<@r>a<@end><@r()>"
* STViz couldn't see first subtemplate when computing template range in output.
* Was incorrectly computing filename to load template .st files from group dir.
* Listener was not notified upon "no such template" in group dir.
* Redid how ST found imported files, dir, etc.. Can now import a template
file even. Can be absolute path or relative path. If relative, it
looks in dir of .stg file with import then CLASSPATH.
* The listener of import groups is now set to that of group that imports
them.
* Regions behave like <if> tags now. Indent respected if <@r>...<@end> on
indented single line. Indent/newlines ignored after those tags if
on separate lines.

4.0b4 – February 5, 2011

BIG THANKS to Udo Borkowski for his help debugging these betas and his
suggestions.

* added write to file methods
* had infinite loop for expr: "<t()$"
* the default file encoding is now UTF-8
* early eval <(x) > using new STWriter derived from type of current STWriter.
e.g., AutoIndentWriter.
* didn't detect nonterminated comment. <!bad comment>
* added two literals "true" and "false" to the template argument syntax; e.g.,
stat(name,x=true,y=false) ::= "..."
* it was treating "..." default arg as a template not string.
* throws STException now upon not finding group file or group dir instead
of sending err to listener.
* default args couldn't have subtemplates
t(x,y={<x:{s|<s>}>}) ::= "..."
* Added a new benchmark from Oliver Zeigermann. Discovered 60% of time is
spent using reflection invoke() for properties.

4.0b3 – January 28, 2011

* exception in lexer blew out of parsing
* missing '}' in {...} caused infinite loop
* NPE in storeArgs if empty arg list
* removed debugging prints.
* x={<(...)>} default arg was hardcoded to <...> not $..$ or whatever.
* The grammar needed to match and ignore an optional INDENT before region @end
* when redefining a region (template) the newline before the >> was kept.
* WS not ignored in front of STRING token in expressions.
* closing STViz doesn't exit vm now.
* throws exception if registering renderer or model adaptor for primitive

4.0b2 – January 22, 2011

* Order of static init issue; an error mgr was null.
* Fixed some unit testing the Windows friendly
* Fix bug in triple if-elseif-elseif-elseif; added unit tests
* bug where I did not say current_ip when calling exec() from writeObject
* Updated README to include install information

4.0b1 – January 14, 2011
