Unifying the o.a.f.core and o.a.f.core.ast

Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/7d784b2b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/7d784b2b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/7d784b2b

Branch: refs/heads/3
Commit: 7d784b2be471a1131ce8d96915367184d30b5f28
Parents: 612c42d
Author: ddekany <[email protected]>
Authored: Tue Feb 21 21:38:52 2017 +0100
Committer: ddekany <[email protected]>
Committed: Thu Feb 23 12:44:51 2017 +0100

----------------------------------------------------------------------
 build.xml                                       |    2 +-
 .../core/APINotSupportedTemplateException.java  |   70 +
 .../org/apache/freemarker/core/ASTComment.java  |   87 +
 .../freemarker/core/ASTDirAssignment.java       |  280 ++
 .../core/ASTDirAssignmentsContainer.java        |  115 +
 .../core/ASTDirAttemptRecoverContainer.java     |   88 +
 .../apache/freemarker/core/ASTDirAutoEsc.java   |   77 +
 .../org/apache/freemarker/core/ASTDirBreak.java |   70 +
 .../core/ASTDirCapturingAssignment.java         |  183 ++
 .../org/apache/freemarker/core/ASTDirCase.java  |   91 +
 .../apache/freemarker/core/ASTDirCompress.java  |   87 +
 .../freemarker/core/ASTDirElseOfList.java       |   75 +
 .../apache/freemarker/core/ASTDirEscape.java    |  111 +
 .../apache/freemarker/core/ASTDirFallback.java  |   70 +
 .../org/apache/freemarker/core/ASTDirFlush.java |   65 +
 .../core/ASTDirIfElseIfElseContainer.java       |  107 +
 .../freemarker/core/ASTDirIfOrElseOrElseIf.java |  114 +
 .../apache/freemarker/core/ASTDirImport.java    |  125 +
 .../apache/freemarker/core/ASTDirInclude.java   |  257 ++
 .../org/apache/freemarker/core/ASTDirItems.java |  120 +
 .../org/apache/freemarker/core/ASTDirList.java  |  476 +++
 .../core/ASTDirListElseContainer.java           |   88 +
 .../org/apache/freemarker/core/ASTDirMacro.java |  325 ++
 .../apache/freemarker/core/ASTDirNested.java    |  159 +
 .../apache/freemarker/core/ASTDirNoAutoEsc.java |   77 +
 .../apache/freemarker/core/ASTDirNoEscape.java  |   78 +
 .../freemarker/core/ASTDirOutputFormat.java     |   85 +
 .../apache/freemarker/core/ASTDirRecover.java   |   75 +
 .../apache/freemarker/core/ASTDirRecurse.java   |  131 +
 .../apache/freemarker/core/ASTDirReturn.java    |   91 +
 .../org/apache/freemarker/core/ASTDirSep.java   |   89 +
 .../apache/freemarker/core/ASTDirSetting.java   |  172 +
 .../org/apache/freemarker/core/ASTDirStop.java  |   81 +
 .../apache/freemarker/core/ASTDirSwitch.java    |  127 +
 .../apache/freemarker/core/ASTDirTOrTrOrTl.java |  109 +
 .../apache/freemarker/core/ASTDirTransform.java |  162 +
 .../freemarker/core/ASTDirUserDefined.java      |  344 ++
 .../org/apache/freemarker/core/ASTDirVisit.java |  127 +
 .../freemarker/core/ASTDollarInterpolation.java |  148 +
 .../freemarker/core/ASTExpAddOrConcat.java      |  312 ++
 .../org/apache/freemarker/core/ASTExpAnd.java   |   82 +
 .../apache/freemarker/core/ASTExpBoolean.java   |   34 +
 .../freemarker/core/ASTExpBooleanLiteral.java   |   91 +
 .../apache/freemarker/core/ASTExpBuiltIn.java   |  485 +++
 .../freemarker/core/ASTExpBuiltInVariable.java  |  297 ++
 .../freemarker/core/ASTExpComparison.java       |  104 +
 .../apache/freemarker/core/ASTExpDefault.java   |  144 +
 .../org/apache/freemarker/core/ASTExpDot.java   |   92 +
 .../freemarker/core/ASTExpDynamicKeyName.java   |  287 ++
 .../apache/freemarker/core/ASTExpExists.java    |   91 +
 .../freemarker/core/ASTExpHashLiteral.java      |  221 ++
 .../freemarker/core/ASTExpListLiteral.java      |  197 ++
 .../freemarker/core/ASTExpMethodCall.java       |  147 +
 .../freemarker/core/ASTExpNegateOrPlus.java     |  108 +
 .../org/apache/freemarker/core/ASTExpNot.java   |   76 +
 .../freemarker/core/ASTExpNumberLiteral.java    |   92 +
 .../org/apache/freemarker/core/ASTExpOr.java    |   82 +
 .../freemarker/core/ASTExpParenthesis.java      |   88 +
 .../org/apache/freemarker/core/ASTExpRange.java |  119 +
 .../freemarker/core/ASTExpStringLiteral.java    |  208 ++
 .../apache/freemarker/core/ASTExpVariable.java  |  105 +
 .../apache/freemarker/core/ASTExpression.java   |  207 ++
 .../freemarker/core/ASTHashInterpolation.java   |  172 +
 .../freemarker/core/ASTImplicitParent.java      |  101 +
 .../freemarker/core/ASTInterpolation.java       |   49 +
 .../org/apache/freemarker/core/ASTNode.java     |  233 ++
 .../apache/freemarker/core/ASTStaticText.java   |  408 +++
 ...AliasTargetTemplateValueFormatException.java |   36 +
 .../core/AliasTemplateDateFormatFactory.java    |   92 +
 .../core/AliasTemplateNumberFormatFactory.java  |   91 +
 .../freemarker/core/ArithmeticEngine.java       |  549 ++++
 .../freemarker/core/ArithmeticExpression.java   |  128 +
 .../BackwardCompatibleTemplateNumberFormat.java |   31 +
 .../freemarker/core/BoundedRangeModel.java      |   70 +
 .../core/BuiltInBannedWhenAutoEscaping.java     |   27 +
 .../apache/freemarker/core/BuiltInForDate.java  |   56 +
 .../freemarker/core/BuiltInForHashEx.java       |   55 +
 .../core/BuiltInForLegacyEscaping.java          |   47 +
 .../freemarker/core/BuiltInForLoopVariable.java |   48 +
 .../freemarker/core/BuiltInForMarkupOutput.java |   39 +
 .../apache/freemarker/core/BuiltInForNode.java  |   39 +
 .../freemarker/core/BuiltInForNodeEx.java       |   37 +
 .../freemarker/core/BuiltInForNumber.java       |   35 +
 .../freemarker/core/BuiltInForSequence.java     |   38 +
 .../freemarker/core/BuiltInForString.java       |   36 +
 .../core/BuiltInWithParseTimeParameters.java    |  111 +
 .../freemarker/core/BuiltInsForDates.java       |  212 ++
 .../core/BuiltInsForExistenceHandling.java      |  133 +
 .../freemarker/core/BuiltInsForHashes.java      |   59 +
 .../core/BuiltInsForLoopVariables.java          |  156 +
 .../core/BuiltInsForMarkupOutputs.java          |   40 +
 .../core/BuiltInsForMultipleTypes.java          |  726 +++++
 .../freemarker/core/BuiltInsForNodes.java       |  156 +
 .../freemarker/core/BuiltInsForNumbers.java     |  319 ++
 .../core/BuiltInsForOutputFormatRelated.java    |   82 +
 .../freemarker/core/BuiltInsForSequences.java   |  878 ++++++
 .../core/BuiltInsForStringsBasic.java           |  698 ++++
 .../core/BuiltInsForStringsEncoding.java        |  185 ++
 .../freemarker/core/BuiltInsForStringsMisc.java |  301 ++
 .../core/BuiltInsForStringsRegexp.java          |  317 ++
 .../core/BuiltInsWithParseTimeParameters.java   |  158 +
 .../apache/freemarker/core/CSSOutputFormat.java |   52 +
 ...lPlaceCustomDataInitializationException.java |   33 +
 .../core/CombinedMarkupOutputFormat.java        |  106 +
 .../core/CommonMarkupOutputFormat.java          |  124 +
 .../core/CommonTemplateMarkupOutputModel.java   |   67 +
 .../apache/freemarker/core/Configurable.java    | 2751 ++++++++++++++++
 .../apache/freemarker/core/Configuration.java   |   26 +-
 .../apache/freemarker/core/CustomAttribute.java |  264 ++
 .../freemarker/core/DirectiveCallPlace.java     |  137 +
 .../org/apache/freemarker/core/Environment.java | 2977 +++++++++++++++++
 .../org/apache/freemarker/core/EvalUtil.java    |  540 ++++
 .../core/ExtendedDecimalFormatParser.java       |  525 +++
 .../freemarker/core/HTMLOutputFormat.java       |   75 +
 .../core/ISOLikeTemplateDateFormat.java         |  264 ++
 .../core/ISOLikeTemplateDateFormatFactory.java  |   52 +
 .../freemarker/core/ISOTemplateDateFormat.java  |   87 +
 .../core/ISOTemplateDateFormatFactory.java      |   43 +
 .../core/InvalidFormatParametersException.java  |   37 +
 .../core/InvalidFormatStringException.java      |   37 +
 .../core/InvalidReferenceException.java         |  167 +
 .../freemarker/core/JSONOutputFormat.java       |   52 +
 .../freemarker/core/JavaScriptOutputFormat.java |   53 +
 .../freemarker/core/JavaTemplateDateFormat.java |   72 +
 .../core/JavaTemplateDateFormatFactory.java     |  173 +
 .../core/JavaTemplateNumberFormat.java          |   66 +
 .../core/JavaTemplateNumberFormatFactory.java   |  120 +
 .../core/ListableRightUnboundedRangeModel.java  |   97 +
 .../apache/freemarker/core/LocalContext.java    |   36 +
 .../freemarker/core/LocalContextStack.java      |   57 +
 ...eleaserTemplateSpecifiedEncodingHandler.java |   56 +
 .../freemarker/core/MarkupOutputFormat.java     |  131 +
 .../core/MarkupOutputFormatBoundBuiltIn.java    |   45 +
 .../org/apache/freemarker/core/MessageUtil.java |  350 ++
 .../org/apache/freemarker/core/MiscUtil.java    |   69 +
 .../NestedContentNotSupportedException.java     |   67 +
 .../freemarker/core/NonBooleanException.java    |   62 +
 .../freemarker/core/NonDateException.java       |   58 +
 .../core/NonExtendedHashException.java          |   62 +
 .../core/NonExtendedNodeException.java          |   64 +
 .../freemarker/core/NonHashException.java       |   64 +
 .../core/NonMarkupOutputException.java          |   63 +
 .../freemarker/core/NonMethodException.java     |   64 +
 .../freemarker/core/NonNamespaceException.java  |   63 +
 .../freemarker/core/NonNodeException.java       |   64 +
 .../freemarker/core/NonNumericalException.java  |   74 +
 .../freemarker/core/NonSequenceException.java   |   64 +
 .../core/NonSequenceOrCollectionException.java  |   92 +
 .../freemarker/core/NonStringException.java     |   74 +
 .../NonStringOrTemplateOutputException.java     |   77 +
 .../NonUserDefinedDirectiveLikeException.java   |   67 +
 .../core/OptInTemplateClassResolver.java        |  156 +
 .../apache/freemarker/core/OutputFormat.java    |   83 +
 .../core/OutputFormatBoundBuiltIn.java          |   47 +
 .../apache/freemarker/core/ParameterRole.java   |   93 +
 .../apache/freemarker/core/ParseException.java  |  513 +++
 .../freemarker/core/ParserConfiguration.java    |   77 +
 .../core/ParsingNotSupportedException.java      |   37 +
 .../freemarker/core/PlainTextOutputFormat.java  |   56 +
 .../apache/freemarker/core/RTFOutputFormat.java |   75 +
 .../org/apache/freemarker/core/RangeModel.java  |   59 +
 .../apache/freemarker/core/RegexpHelper.java    |  207 ++
 .../core/RightUnboundedRangeModel.java          |   48 +
 .../apache/freemarker/core/SpecialBuiltIn.java  |   27 +
 .../apache/freemarker/core/StopException.java   |   64 +
 .../org/apache/freemarker/core/Template.java    |   37 +-
 .../freemarker/core/TemplateClassResolver.java  |   82 +
 .../core/TemplateCombinedMarkupOutputModel.java |   50 +
 .../freemarker/core/TemplateConfiguration.java  |  921 ++++++
 .../freemarker/core/TemplateDateFormat.java     |  108 +
 .../core/TemplateDateFormatFactory.java         |   91 +
 .../core/TemplateElementArrayBuilder.java       |  102 +
 .../core/TemplateElementsToVisit.java           |   48 +
 .../freemarker/core/TemplateException.java      |   22 +-
 .../core/TemplateExceptionHandler.java          |    3 -
 .../freemarker/core/TemplateFormatUtil.java     |   76 +
 .../core/TemplateHTMLOutputModel.java           |   40 +
 .../core/TemplateMarkupOutputModel.java         |   52 +
 .../freemarker/core/TemplateNumberFormat.java   |   90 +
 .../core/TemplateNumberFormatFactory.java       |   62 +
 .../freemarker/core/TemplatePostProcessor.java  |   31 +
 .../core/TemplatePostProcessorException.java    |   35 +
 .../freemarker/core/TemplateRTFOutputModel.java |   40 +
 .../core/TemplateSpecifiedEncodingHandler.java  |   60 +
 .../freemarker/core/TemplateValueFormat.java    |   33 +
 .../core/TemplateValueFormatException.java      |   37 +
 .../core/TemplateValueFormatFactory.java        |   28 +
 .../core/TemplateXHTMLOutputModel.java          |   40 +
 .../freemarker/core/TemplateXMLOutputModel.java |   40 +
 ...nterruptionSupportTemplatePostProcessor.java |  140 +
 .../apache/freemarker/core/TokenMgrError.java   |  249 ++
 .../core/UndefinedCustomFormatException.java    |   34 +
 .../freemarker/core/UndefinedOutputFormat.java  |   55 +
 .../core/UnexpectedTypeException.java           |  109 +
 .../core/UnformattableValueException.java       |   41 +
 ...nDateTypeFormattingUnsupportedException.java |   35 +
 ...nownDateTypeParsingUnsupportedException.java |   36 +
 .../core/UnparsableValueException.java          |   38 +
 .../core/UnregisteredOutputFormatException.java |   34 +
 .../freemarker/core/XHTMLOutputFormat.java      |   75 +
 .../apache/freemarker/core/XMLOutputFormat.java |   75 +
 .../freemarker/core/XSTemplateDateFormat.java   |   91 +
 .../core/XSTemplateDateFormatFactory.java       |   43 +
 .../apache/freemarker/core/_ASTDebugBreak.java  |   90 +
 .../org/apache/freemarker/core/_ASTElement.java |  473 +++
 .../org/apache/freemarker/core/_CoreAPI.java    |  227 ++
 .../apache/freemarker/core/_DelayedAOrAn.java   |   35 +
 .../core/_DelayedConversionToString.java        |   52 +
 .../core/_DelayedFTLTypeDescription.java        |   37 +
 .../core/_DelayedGetCanonicalForm.java          |   39 +
 .../freemarker/core/_DelayedGetMessage.java     |   35 +
 .../core/_DelayedGetMessageWithoutStackTop.java |   34 +
 .../apache/freemarker/core/_DelayedJQuote.java  |   36 +
 .../freemarker/core/_DelayedJoinWithComma.java  |   48 +
 .../apache/freemarker/core/_DelayedOrdinal.java |   47 +
 .../freemarker/core/_DelayedShortClassName.java |   35 +
 .../freemarker/core/_DelayedToString.java       |   37 +
 .../core/_ErrorDescriptionBuilder.java          |  357 +++
 .../freemarker/core/_MiscTemplateException.java |  124 +
 ...ObjectBuilderSettingEvaluationException.java |   46 +
 .../core/_ObjectBuilderSettingEvaluator.java    | 1057 +++++++
 ..._ParserConfigurationWithInheritedFormat.java |   82 +
 .../core/_SettingEvaluationEnvironment.java     |   61 +
 .../apache/freemarker/core/_TemplateAPI.java    |    7 +-
 .../core/_TemplateModelException.java           |  133 +
 .../freemarker/core/_TimeZoneBuilder.java       |   43 +
 ...expectedTypeErrorExplainerTemplateModel.java |   36 +
 .../ast/APINotSupportedTemplateException.java   |   71 -
 .../core/ast/AddConcatExpression.java           |  313 --
 ...AliasTargetTemplateValueFormatException.java |   36 -
 .../ast/AliasTemplateDateFormatFactory.java     |   92 -
 .../ast/AliasTemplateNumberFormatFactory.java   |   91 -
 .../freemarker/core/ast/AndExpression.java      |   81 -
 .../freemarker/core/ast/ArithmeticEngine.java   |  549 ----
 .../core/ast/ArithmeticExpression.java          |  129 -
 .../apache/freemarker/core/ast/Assignment.java  |  280 --
 .../core/ast/AssignmentInstruction.java         |  117 -
 .../freemarker/core/ast/AttemptBlock.java       |   89 -
 .../freemarker/core/ast/AutoEscBlock.java       |   79 -
 .../BackwardCompatibleTemplateNumberFormat.java |   30 -
 .../freemarker/core/ast/BlockAssignment.java    |  184 --
 .../freemarker/core/ast/BodyInstruction.java    |  160 -
 .../freemarker/core/ast/BooleanExpression.java  |   32 -
 .../freemarker/core/ast/BooleanLiteral.java     |   88 -
 .../freemarker/core/ast/BoundedRangeModel.java  |   70 -
 .../freemarker/core/ast/BreakInstruction.java   |   70 -
 .../freemarker/core/ast/BugException.java       |   52 -
 .../org/apache/freemarker/core/ast/BuiltIn.java |  486 ---
 .../core/ast/BuiltInBannedWhenAutoEscaping.java |   27 -
 .../freemarker/core/ast/BuiltInForDate.java     |   57 -
 .../freemarker/core/ast/BuiltInForHashEx.java   |   56 -
 .../core/ast/BuiltInForLegacyEscaping.java      |   48 -
 .../core/ast/BuiltInForLoopVariable.java        |   49 -
 .../core/ast/BuiltInForMarkupOutput.java        |   40 -
 .../freemarker/core/ast/BuiltInForNode.java     |   40 -
 .../freemarker/core/ast/BuiltInForNodeEx.java   |   38 -
 .../freemarker/core/ast/BuiltInForNumber.java   |   36 -
 .../freemarker/core/ast/BuiltInForSequence.java |   39 -
 .../freemarker/core/ast/BuiltInForString.java   |   37 -
 .../ast/BuiltInWithParseTimeParameters.java     |  111 -
 .../freemarker/core/ast/BuiltInsForDates.java   |  213 --
 .../freemarker/core/ast/BuiltInsForHashes.java  |   58 -
 .../core/ast/BuiltInsForLoopVariables.java      |  157 -
 .../core/ast/BuiltInsForMarkupOutputs.java      |   40 -
 .../core/ast/BuiltInsForMultipleTypes.java      |  726 -----
 .../freemarker/core/ast/BuiltInsForNodes.java   |  156 -
 .../freemarker/core/ast/BuiltInsForNumbers.java |  320 --
 .../ast/BuiltInsForOutputFormatRelated.java     |   83 -
 .../core/ast/BuiltInsForSequences.java          |  877 -----
 .../core/ast/BuiltInsForStringsBasic.java       |  699 ----
 .../core/ast/BuiltInsForStringsEncoding.java    |  185 --
 .../core/ast/BuiltInsForStringsMisc.java        |  129 -
 .../core/ast/BuiltInsForStringsRegexp.java      |  318 --
 .../ast/BuiltInsWithParseTimeParameters.java    |  159 -
 .../freemarker/core/ast/BuiltinVariable.java    |  299 --
 .../freemarker/core/ast/CSSOutputFormat.java    |   52 -
 ...lPlaceCustomDataInitializationException.java |   33 -
 .../org/apache/freemarker/core/ast/Case.java    |   91 -
 .../core/ast/CollectionAndSequence.java         |  109 -
 .../core/ast/CombinedMarkupOutputFormat.java    |  106 -
 .../org/apache/freemarker/core/ast/Comment.java |   87 -
 .../core/ast/CommonMarkupOutputFormat.java      |  124 -
 .../ast/CommonTemplateMarkupOutputModel.java    |   67 -
 .../core/ast/ComparisonExpression.java          |  104 -
 .../freemarker/core/ast/CompressedBlock.java    |   86 -
 .../freemarker/core/ast/ConditionalBlock.java   |  114 -
 .../freemarker/core/ast/Configurable.java       | 2758 ----------------
 .../freemarker/core/ast/CustomAttribute.java    |  265 --
 .../core/ast/DefaultToExpression.java           |  145 -
 .../freemarker/core/ast/DirectiveCallPlace.java |  139 -
 .../freemarker/core/ast/DollarVariable.java     |  149 -
 .../org/apache/freemarker/core/ast/Dot.java     |   94 -
 .../freemarker/core/ast/DynamicKeyName.java     |  288 --
 .../apache/freemarker/core/ast/ElseOfList.java  |   77 -
 .../apache/freemarker/core/ast/Environment.java | 2982 ------------------
 .../apache/freemarker/core/ast/EscapeBlock.java |  112 -
 .../apache/freemarker/core/ast/EvalUtil.java    |  540 ----
 .../freemarker/core/ast/ExistenceBuiltins.java  |  134 -
 .../freemarker/core/ast/ExistsExpression.java   |   90 -
 .../apache/freemarker/core/ast/Expression.java  |  214 --
 .../core/ast/ExtendedDecimalFormatParser.java   |  525 ---
 .../core/ast/FallbackInstruction.java           |   69 -
 .../freemarker/core/ast/FlushInstruction.java   |   65 -
 .../freemarker/core/ast/HTMLOutputFormat.java   |   75 -
 .../apache/freemarker/core/ast/HashLiteral.java |  218 --
 .../core/ast/ISOLikeTemplateDateFormat.java     |  263 --
 .../ast/ISOLikeTemplateDateFormatFactory.java   |   52 -
 .../core/ast/ISOTemplateDateFormat.java         |   87 -
 .../core/ast/ISOTemplateDateFormatFactory.java  |   43 -
 .../apache/freemarker/core/ast/Identifier.java  |  106 -
 .../org/apache/freemarker/core/ast/IfBlock.java |  109 -
 .../org/apache/freemarker/core/ast/Include.java |  259 --
 .../freemarker/core/ast/Interpolation.java      |   48 -
 .../apache/freemarker/core/ast/Interpret.java   |  157 -
 .../ast/InvalidFormatParametersException.java   |   37 -
 .../core/ast/InvalidFormatStringException.java  |   37 -
 .../core/ast/InvalidReferenceException.java     |  169 -
 .../org/apache/freemarker/core/ast/Items.java   |  121 -
 .../freemarker/core/ast/IteratorBlock.java      |  476 ---
 .../freemarker/core/ast/JSONOutputFormat.java   |   52 -
 .../core/ast/JavaScriptOutputFormat.java        |   53 -
 .../core/ast/JavaTemplateDateFormat.java        |   72 -
 .../core/ast/JavaTemplateDateFormatFactory.java |  174 -
 .../core/ast/JavaTemplateNumberFormat.java      |   66 -
 .../ast/JavaTemplateNumberFormatFactory.java    |  121 -
 .../apache/freemarker/core/ast/LibraryLoad.java |  131 -
 .../freemarker/core/ast/ListElseContainer.java  |   87 -
 .../apache/freemarker/core/ast/ListLiteral.java |  196 --
 .../ast/ListableRightUnboundedRangeModel.java   |   97 -
 .../freemarker/core/ast/LocalContext.java       |   38 -
 .../freemarker/core/ast/LocalContextStack.java  |   57 -
 .../org/apache/freemarker/core/ast/Macro.java   |  330 --
 ...eleaserTemplateSpecifiedEncodingHandler.java |   56 -
 .../freemarker/core/ast/MarkupOutputFormat.java |  132 -
 .../ast/MarkupOutputFormatBoundBuiltIn.java     |   46 -
 .../apache/freemarker/core/ast/MessageUtil.java |  352 ---
 .../apache/freemarker/core/ast/MethodCall.java  |  149 -
 .../apache/freemarker/core/ast/MiscUtil.java    |   69 -
 .../freemarker/core/ast/MixedContent.java       |  102 -
 .../ast/NestedContentNotSupportedException.java |   68 -
 .../org/apache/freemarker/core/ast/NewBI.java   |   74 -
 .../freemarker/core/ast/NoAutoEscBlock.java     |   79 -
 .../freemarker/core/ast/NoEscapeBlock.java      |   79 -
 .../core/ast/NonBooleanException.java           |   62 -
 .../freemarker/core/ast/NonDateException.java   |   58 -
 .../core/ast/NonExtendedHashException.java      |   62 -
 .../core/ast/NonExtendedNodeException.java      |   64 -
 .../freemarker/core/ast/NonHashException.java   |   64 -
 .../core/ast/NonMarkupOutputException.java      |   63 -
 .../freemarker/core/ast/NonMethodException.java |   64 -
 .../core/ast/NonNamespaceException.java         |   63 -
 .../freemarker/core/ast/NonNodeException.java   |   64 -
 .../core/ast/NonNumericalException.java         |   74 -
 .../core/ast/NonSequenceException.java          |   64 -
 .../ast/NonSequenceOrCollectionException.java   |   92 -
 .../freemarker/core/ast/NonStringException.java |   74 -
 .../ast/NonStringOrTemplateOutputException.java |   77 -
 .../NonUserDefinedDirectiveLikeException.java   |   67 -
 .../freemarker/core/ast/NotExpression.java      |   75 -
 .../freemarker/core/ast/NumberLiteral.java      |   94 -
 .../freemarker/core/ast/NumericalOutput.java    |  173 -
 .../core/ast/OptInTemplateClassResolver.java    |  158 -
 .../freemarker/core/ast/OrExpression.java       |   81 -
 .../freemarker/core/ast/OutputFormat.java       |   84 -
 .../freemarker/core/ast/OutputFormatBlock.java  |   87 -
 .../core/ast/OutputFormatBoundBuiltIn.java      |   48 -
 .../freemarker/core/ast/ParameterRole.java      |   93 -
 .../core/ast/ParentheticalExpression.java       |   86 -
 .../freemarker/core/ast/ParseException.java     |  513 ---
 .../core/ast/ParserConfiguration.java           |   80 -
 .../core/ast/ParsingNotSupportedException.java  |   37 -
 .../core/ast/PlainTextOutputFormat.java         |   56 -
 .../freemarker/core/ast/PropertySetting.java    |  177 --
 .../freemarker/core/ast/RTFOutputFormat.java    |   75 -
 .../org/apache/freemarker/core/ast/Range.java   |  119 -
 .../apache/freemarker/core/ast/RangeModel.java  |   59 -
 .../freemarker/core/ast/RecoveryBlock.java      |   74 -
 .../apache/freemarker/core/ast/RecurseNode.java |  132 -
 .../freemarker/core/ast/RegexpHelper.java       |  208 --
 .../freemarker/core/ast/ReturnInstruction.java  |   93 -
 .../core/ast/RightUnboundedRangeModel.java      |   48 -
 .../org/apache/freemarker/core/ast/Sep.java     |   90 -
 .../freemarker/core/ast/SpecialBuiltIn.java     |   27 -
 .../freemarker/core/ast/StopException.java      |   66 -
 .../freemarker/core/ast/StopInstruction.java    |   83 -
 .../core/ast/StringArraySequence.java           |   60 -
 .../freemarker/core/ast/StringLiteral.java      |  207 --
 .../apache/freemarker/core/ast/SwitchBlock.java |  132 -
 .../core/ast/TemplateClassResolver.java         |   84 -
 .../ast/TemplateCombinedMarkupOutputModel.java  |   50 -
 .../core/ast/TemplateConfiguration.java         |  926 ------
 .../freemarker/core/ast/TemplateDateFormat.java |  108 -
 .../core/ast/TemplateDateFormatFactory.java     |   92 -
 .../freemarker/core/ast/TemplateElement.java    |  476 ---
 .../core/ast/TemplateElementArrayBuilder.java   |  102 -
 .../core/ast/TemplateElementsToVisit.java       |   48 -
 .../freemarker/core/ast/TemplateFormatUtil.java |   76 -
 .../core/ast/TemplateHTMLOutputModel.java       |   40 -
 .../core/ast/TemplateMarkupOutputModel.java     |   52 -
 .../core/ast/TemplateNumberFormat.java          |   90 -
 .../core/ast/TemplateNumberFormatFactory.java   |   64 -
 .../freemarker/core/ast/TemplateObject.java     |  243 --
 .../core/ast/TemplatePostProcessor.java         |   34 -
 .../ast/TemplatePostProcessorException.java     |   35 -
 .../core/ast/TemplateRTFOutputModel.java        |   40 -
 .../ast/TemplateSpecifiedEncodingHandler.java   |   61 -
 .../core/ast/TemplateValueFormat.java           |   33 -
 .../core/ast/TemplateValueFormatException.java  |   37 -
 .../core/ast/TemplateValueFormatFactory.java    |   28 -
 .../core/ast/TemplateXHTMLOutputModel.java      |   40 -
 .../core/ast/TemplateXMLOutputModel.java        |   40 -
 .../apache/freemarker/core/ast/TextBlock.java   |  409 ---
 ...nterruptionSupportTemplatePostProcessor.java |  142 -
 .../freemarker/core/ast/TokenMgrError.java      |  251 --
 .../freemarker/core/ast/TransformBlock.java     |  168 -
 .../freemarker/core/ast/TrimInstruction.java    |  110 -
 .../core/ast/UnaryPlusMinusExpression.java      |  106 -
 .../ast/UndefinedCustomFormatException.java     |   34 -
 .../core/ast/UndefinedOutputFormat.java         |   57 -
 .../core/ast/UnexpectedTypeException.java       |  110 -
 .../core/ast/UnformattableValueException.java   |   41 -
 .../apache/freemarker/core/ast/UnifiedCall.java |  344 --
 ...nDateTypeFormattingUnsupportedException.java |   35 -
 ...nownDateTypeParsingUnsupportedException.java |   36 -
 .../core/ast/UnparsableValueException.java      |   38 -
 .../ast/UnregisteredOutputFormatException.java  |   34 -
 .../apache/freemarker/core/ast/VisitNode.java   |  128 -
 .../freemarker/core/ast/XHTMLOutputFormat.java  |   75 -
 .../freemarker/core/ast/XMLOutputFormat.java    |   75 -
 .../core/ast/XSTemplateDateFormat.java          |   91 -
 .../core/ast/XSTemplateDateFormatFactory.java   |   43 -
 .../apache/freemarker/core/ast/_CoreAPI.java    |  223 --
 .../apache/freemarker/core/ast/_DebugBreak.java |   91 -
 .../freemarker/core/ast/_DelayedAOrAn.java      |   35 -
 .../core/ast/_DelayedConversionToString.java    |   52 -
 .../core/ast/_DelayedFTLTypeDescription.java    |   37 -
 .../core/ast/_DelayedGetCanonicalForm.java      |   39 -
 .../freemarker/core/ast/_DelayedGetMessage.java |   35 -
 .../ast/_DelayedGetMessageWithoutStackTop.java  |   36 -
 .../freemarker/core/ast/_DelayedJQuote.java     |   36 -
 .../core/ast/_DelayedJoinWithComma.java         |   48 -
 .../freemarker/core/ast/_DelayedOrdinal.java    |   47 -
 .../core/ast/_DelayedShortClassName.java        |   35 -
 .../freemarker/core/ast/_DelayedToString.java   |   37 -
 .../core/ast/_ErrorDescriptionBuilder.java      |  360 ---
 .../core/ast/_MiscTemplateException.java        |  126 -
 ...ObjectBuilderSettingEvaluationException.java |   46 -
 .../ast/_ObjectBuilderSettingEvaluator.java     | 1058 -------
 ..._ParserConfigurationWithInheritedFormat.java |   84 -
 .../core/ast/_SettingEvaluationEnvironment.java |   62 -
 .../core/ast/_TemplateModelException.java       |  133 -
 .../freemarker/core/ast/_TimeZoneBuilder.java   |   43 -
 ...expectedTypeErrorExplainerTemplateModel.java |   36 -
 .../org/apache/freemarker/core/ast/package.html |   26 -
 .../core/debug/DebuggedEnvironment.java         |    6 +-
 .../core/debug/impl/DebuggerService.java        |    2 +-
 .../debug/impl/RmiDebuggedEnvironmentImpl.java  |    4 +-
 .../core/debug/impl/RmiDebuggerService.java     |   44 +-
 .../core/model/TemplateDirectiveBody.java       |    2 +-
 .../core/model/TemplateDirectiveModel.java      |    2 +-
 .../core/model/TemplateMethodModel.java         |    2 +-
 .../core/model/TemplateMethodModelEx.java       |    2 +-
 .../core/model/TemplateModelException.java      |    4 +-
 .../core/model/TemplateNumberModel.java         |    2 +-
 .../core/model/impl/CollectionAndSequence.java  |  108 +
 .../core/model/impl/DefaultMapAdapter.java      |    4 +-
 .../impl/DefaultNonListCollectionAdapter.java   |    4 +-
 .../freemarker/core/model/impl/SimpleHash.java  |    4 +-
 .../core/model/impl/beans/ArgumentTypes.java    |    2 +-
 .../core/model/impl/beans/BeanModel.java        |    8 +-
 .../core/model/impl/beans/BeansWrapper.java     |    8 +-
 .../model/impl/beans/ClassIntrospector.java     |    2 +-
 .../impl/beans/EmptyMemberAndArguments.java     |    2 +-
 .../model/impl/beans/OverloadedMethods.java     |    8 +-
 .../impl/beans/OverloadedVarArgsMethods.java    |    2 +-
 .../model/impl/beans/ResourceBundleModel.java   |    4 +-
 .../core/model/impl/beans/SimpleMapModel.java   |    2 +-
 .../core/model/impl/beans/SimpleMethod.java     |   10 +-
 .../model/impl/beans/SimpleMethodModel.java     |    2 +-
 .../core/model/impl/beans/_BeansAPI.java        |    2 +-
 .../core/model/impl/beans/_MethodUtil.java      |    8 +-
 .../core/model/impl/dom/AttributeNodeModel.java |    2 +-
 .../core/model/impl/dom/DocumentModel.java      |    2 +-
 .../core/model/impl/dom/DomStringUtil.java      |    2 +-
 .../core/model/impl/dom/ElementModel.java       |    2 +-
 .../core/model/impl/dom/JaxenXPathSupport.java  |    4 +-
 .../core/model/impl/dom/NodeListModel.java      |    4 +-
 .../core/model/impl/dom/NodeModel.java          |    2 +-
 .../core/model/impl/dom/NodeOutputter.java      |    4 +-
 .../impl/dom/SunInternalXalanXPathSupport.java  |    2 +-
 .../core/model/impl/dom/XalanXPathSupport.java  |    2 +-
 .../core/model/impl/dom/_ExtDomApi.java         |    2 +-
 ...ConditionalTemplateConfigurationFactory.java |    2 +-
 .../FirstMatchTemplateConfigurationFactory.java |    2 +-
 .../MergingTemplateConfigurationFactory.java    |    2 +-
 .../TemplateConfigurationFactory.java           |    2 +-
 .../templateresolver/TemplateLoadingResult.java |    2 +-
 .../core/templateresolver/TemplateResolver.java |    2 +-
 .../impl/DefaultTemplateResolver.java           |    8 +-
 .../freemarker/core/util/BugException.java      |   52 +
 .../freemarker/core/util/CaptureOutput.java     |    2 +-
 .../apache/freemarker/core/util/DeepUnwrap.java |    2 +-
 .../apache/freemarker/core/util/FTLUtil.java    |   10 +-
 .../core/util/GenericParseException.java        |    2 +-
 .../apache/freemarker/core/util/_ClassUtil.java |   35 -
 .../freemarker/core/util/_StringUtil.java       |    3 +-
 .../freemarker/servlet/FreemarkerServlet.java   |   10 +-
 .../apache/freemarker/servlet/IncludePage.java  |    6 +-
 .../freemarker/servlet/InitParamParser.java     |    4 +-
 .../jsp/CustomTagAndELFunctionCombiner.java     |    6 +-
 .../servlet/jsp/FreeMarkerPageContext.java      |    2 +-
 .../freemarker/servlet/jsp/JspTagModelBase.java |    8 +-
 .../servlet/jsp/PageContextFactory.java         |    2 +-
 .../servlet/jsp/SimpleTagDirectiveModel.java    |    2 +-
 .../freemarker/servlet/jsp/TaglibFactory.java   |    4 +-
 src/main/javacc/FTL.jj                          |  688 ++--
 .../core/ASTBasedErrorMessagesTest.java         |   74 +
 .../org/apache/freemarker/core/ASTPrinter.java  |  445 +++
 .../org/apache/freemarker/core/ASTTest.java     |   98 +
 .../core/AppMetaTemplateDateFormatFactory.java  |  129 +
 .../core/BaseNTemplateNumberFormatFactory.java  |  128 +
 .../freemarker/core/BreakPlacementTest.java     |   65 +
 .../apache/freemarker/core/CamelCaseTest.java   |  493 +++
 .../freemarker/core/CanonicalFormTest.java      |   71 +
 .../freemarker/core/CoercionToTextualTest.java  |  137 +
 .../core/CombinedMarkupOutputFormatTest.java    |  198 ++
 .../freemarker/core/ConfigurableTest.java       |  183 ++
 .../freemarker/core/ConfigurationTest.java      |   26 +-
 .../freemarker/core/CoreLocaleUtilsTest.java    |   73 +
 .../freemarker/core/CustomAttributeTest.java    |    2 -
 .../freemarker/core/CustomHTMLOutputFormat.java |   72 +
 .../core/CustomTemplateHTMLModel.java           |   34 +
 .../apache/freemarker/core/DateFormatTest.java  |  438 +++
 .../freemarker/core/DirectiveCallPlaceTest.java |  260 ++
 .../freemarker/core/DummyOutputFormat.java      |   65 +
 .../freemarker/core/EncodingOverrideTest.java   |   69 +
 .../core/EnvironmentCustomStateTest.java        |   51 +
 .../EnvironmentGetTemplateVariantsTest.java     |  218 ++
 ...EpochMillisDivTemplateDateFormatFactory.java |  102 +
 .../EpochMillisTemplateDateFormatFactory.java   |   92 +
 .../apache/freemarker/core/ExceptionTest.java   |    1 -
 .../core/ExtendedDecimalFormatTest.java         |  341 ++
 .../core/HTMLISOTemplateDateFormatFactory.java  |  114 +
 .../freemarker/core/HTMLOutputFormatTest.java   |  187 ++
 .../freemarker/core/HeaderParsingTest.java      |   64 +
 .../core/HexTemplateNumberFormatFactory.java    |   77 +
 .../IncludeAndImportConfigurableLayersTest.java |  336 ++
 .../freemarker/core/IncludeAndImportTest.java   |  255 ++
 .../core/InterpretAndEvalTemplateNameTest.java  |   70 +
 .../core/InterpretSettingInheritanceTest.java   |   95 +
 .../freemarker/core/IteratorIssuesTest.java     |   89 +
 .../apache/freemarker/core/ListErrorsTest.java  |  138 +
 ...AndTZSensitiveTemplateDateFormatFactory.java |   97 +
 ...aleSensitiveTemplateNumberFormatFactory.java |   78 +
 .../freemarker/core/MiscErrorMessagesTest.java  |   47 +
 .../core/MistakenlyPublicImportAPIsTest.java    |    9 +-
 .../core/MistakenlyPublicMacroAPIsTest.java     |   10 +-
 .../freemarker/core/NumberFormatTest.java       |  326 ++
 .../core/ObjectBuilderSettingsTest.java         | 1519 +++++++++
 .../core/OptInTemplateClassResolverTest.java    |  211 ++
 .../freemarker/core/OutputFormatTest.java       | 1031 ++++++
 .../ParseTimeParameterBIErrorMessagesTest.java  |   46 +
 .../core/ParsingErrorMessagesTest.java          |  119 +
 .../PrintfGTemplateNumberFormatFactory.java     |  138 +
 .../freemarker/core/RTFOutputFormatTest.java    |  129 +
 .../apache/freemarker/core/SQLTimeZoneTest.java |  362 +++
 .../core/SeldomEscapedOutputFormat.java         |   71 +
 .../freemarker/core/SettingDirectiveTest.java   |   41 +
 .../freemarker/core/SpecialVariableTest.java    |  105 +
 .../core/StringLiteralInterpolationTest.java    |  133 +
 .../org/apache/freemarker/core/TabSizeTest.java |   97 +
 .../core/TagSyntaxVariationsTest.java           |  181 ++
 .../freemarker/core/TemplatGetEncodingTest.java |   89 +
 .../core/TemplateConfigurationTest.java         |  940 ++++++
 ...teConfigurationWithTemplateResolverTest.java |  327 ++
 .../core/TemplateDummyOutputModel.java          |   34 +
 .../freemarker/core/TemplateLevelSettings.java  |  107 +
 .../core/TemplateLookupStrategyTest.java        |    1 -
 .../core/TemplateNameSpecialVariablesTest.java  |  169 +
 .../core/TemplateSeldomEscapedOutputModel.java  |   34 +
 .../core/TheadInterruptingSupportTest.java      |  166 +
 .../freemarker/core/TypeErrorMessagesTest.java  |  105 +
 .../freemarker/core/UnclosedCommentTest.java    |   44 +
 .../core/WhitespaceStrippingTest.java           |   71 +
 .../freemarker/core/XHTMLOutputFormatTest.java  |   59 +
 .../freemarker/core/XMLOutputFormatTest.java    |   59 +
 .../core/ast/ASTBasedErrorMessagesTest.java     |   74 -
 .../apache/freemarker/core/ast/ASTPrinter.java  |  439 ---
 .../org/apache/freemarker/core/ast/ASTTest.java |   98 -
 .../ast/AppMetaTemplateDateFormatFactory.java   |  129 -
 .../ast/BaseNTemplateNumberFormatFactory.java   |  128 -
 .../freemarker/core/ast/BreakPlacementTest.java |   65 -
 .../freemarker/core/ast/CamelCaseTest.java      |  489 ---
 .../freemarker/core/ast/CanonicalFormTest.java  |   70 -
 .../core/ast/CoercionToTextualTest.java         |  137 -
 .../ast/CombinedMarkupOutputFormatTest.java     |  198 --
 .../freemarker/core/ast/ConfigurableTest.java   |  182 --
 .../core/ast/CoreLocaleUtilsTest.java           |   73 -
 .../core/ast/CustomHTMLOutputFormat.java        |   72 -
 .../core/ast/CustomTemplateHTMLModel.java       |   34 -
 .../freemarker/core/ast/DateFormatTest.java     |  441 ---
 .../core/ast/DirectiveCallPlaceTest.java        |  256 --
 .../freemarker/core/ast/DummyOutputFormat.java  |   65 -
 .../core/ast/EncodingOverrideTest.java          |   69 -
 .../core/ast/EnvironmentCustomStateTest.java    |   50 -
 .../ast/EnvironmentGetTemplateVariantsTest.java |  217 --
 ...EpochMillisDivTemplateDateFormatFactory.java |  102 -
 .../EpochMillisTemplateDateFormatFactory.java   |   92 -
 .../core/ast/ExtendedDecimalFormatTest.java     |  341 --
 .../ast/HTMLISOTemplateDateFormatFactory.java   |  104 -
 .../core/ast/HTMLOutputFormatTest.java          |  187 --
 .../freemarker/core/ast/HeaderParsingTest.java  |   64 -
 .../ast/HexTemplateNumberFormatFactory.java     |   77 -
 .../IncludeAndImportConfigurableLayersTest.java |  333 --
 .../core/ast/IncludeAndImportTest.java          |  254 --
 .../ast/InterpretAndEvalTemplateNameTest.java   |   70 -
 .../ast/InterpretSettingInheritanceTest.java    |   95 -
 .../freemarker/core/ast/IteratorIssuesTest.java |   89 -
 .../freemarker/core/ast/ListErrorsTest.java     |  138 -
 ...AndTZSensitiveTemplateDateFormatFactory.java |   97 -
 ...aleSensitiveTemplateNumberFormatFactory.java |   78 -
 .../core/ast/MiscErrorMessagesTest.java         |   47 -
 .../freemarker/core/ast/NumberFormatTest.java   |  320 --
 .../core/ast/ObjectBuilderSettingsTest.java     | 1524 ---------
 .../ast/OptInTemplateClassResolverTest.java     |  209 --
 .../freemarker/core/ast/OutputFormatTest.java   | 1022 ------
 .../ParseTimeParameterBIErrorMessagesTest.java  |   46 -
 .../core/ast/ParsingErrorMessagesTest.java      |  118 -
 .../ast/PrintfGTemplateNumberFormatFactory.java |  138 -
 .../core/ast/RTFOutputFormatTest.java           |  129 -
 .../freemarker/core/ast/SQLTimeZoneTest.java    |  362 ---
 .../core/ast/SeldomEscapedOutputFormat.java     |   71 -
 .../core/ast/SettingDirectiveTest.java          |   41 -
 .../core/ast/SpecialVariableTest.java           |  101 -
 .../ast/StringLiteralInterpolationTest.java     |  131 -
 .../apache/freemarker/core/ast/TabSizeTest.java |   96 -
 .../core/ast/TagSyntaxVariationsTest.java       |  180 --
 .../core/ast/TemplatGetEncodingTest.java        |   88 -
 .../core/ast/TemplateConfigurationTest.java     |  928 ------
 ...teConfigurationWithTemplateResolverTest.java |  325 --
 .../core/ast/TemplateDummyOutputModel.java      |   34 -
 .../core/ast/TemplateLevelSettings.java         |  107 -
 .../ast/TemplateNameSpecialVariablesTest.java   |  169 -
 .../ast/TemplateSeldomEscapedOutputModel.java   |   34 -
 .../core/ast/TheadInterruptingSupportTest.java  |  164 -
 .../core/ast/TypeErrorMessagesTest.java         |  105 -
 .../core/ast/UnclosedCommentTest.java           |   44 -
 .../core/ast/WhitespaceStrippingTest.java       |   71 -
 .../core/ast/XHTMLOutputFormatTest.java         |   59 -
 .../core/ast/XMLOutputFormatTest.java           |   59 -
 .../model/impl/beans/ErrorMessagesTest.java     |    4 +-
 .../DefaultTemplateResolverTest.java            |    2 +-
 .../TemplateConfigurationFactoryTest.java       |    2 +-
 .../TemplateNameFormatTest.java                 |    2 +-
 .../ConfigureOutputFormatExamples.java          |    8 +-
 .../manualtest/CustomFormatsExample.java        |   10 +-
 .../TemplateConfigurationExamples.java          |   10 +-
 .../UnitAwareTemplateNumberFormatFactory.java   |    8 +-
 .../servlet/FreemarkerServletTest.java          |    4 +-
 .../apache/freemarker/test/TemplateTest.java    |    2 +-
 .../test/templatesuite/TemplateTestCase.java    |    2 +-
 .../models/OverloadedMethods2.java              |    2 +-
 .../freemarker/test/util/AssertDirective.java   |    4 +-
 .../test/util/AssertEqualsDirective.java        |    4 +-
 .../test/util/AssertFailsDirective.java         |    2 +-
 .../AssertationFailedInTemplateException.java   |    2 +-
 .../test/util/BadParameterTypeException.java    |    2 +-
 .../util/MissingRequiredParameterException.java |    2 +-
 .../freemarker/test/util/NoOutputDirective.java |    2 +-
 .../test/util/ParameterException.java           |    2 +-
 .../util/UnsupportedParameterException.java     |    2 +-
 .../org/apache/freemarker/core/ast-1.ast        |  187 ++
 .../org/apache/freemarker/core/ast-1.ftl        |   29 +
 .../apache/freemarker/core/ast-assignments.ast  |  172 +
 .../apache/freemarker/core/ast-assignments.ftl  |   29 +
 .../org/apache/freemarker/core/ast-builtins.ast |   59 +
 .../org/apache/freemarker/core/ast-builtins.ftl |   23 +
 .../apache/freemarker/core/ast-locations.ast    |  155 +
 .../apache/freemarker/core/ast-locations.ftl    |   36 +
 .../core/ast-mixedcontentsimplifications.ast    |   38 +
 .../core/ast-mixedcontentsimplifications.ftl    |   26 +
 .../core/ast-multipleignoredchildren.ast        |   30 +
 .../core/ast-multipleignoredchildren.ftl        |   33 +
 .../core/ast-nestedignoredchildren.ast          |   20 +
 .../core/ast-nestedignoredchildren.ftl          |   19 +
 .../org/apache/freemarker/core/ast-range.ast    |  281 ++
 .../org/apache/freemarker/core/ast-range.ftl    |   47 +
 .../freemarker/core/ast-strlitinterpolation.ast |   82 +
 .../freemarker/core/ast-strlitinterpolation.ftl |   25 +
 .../freemarker/core/ast-whitespacestripping.ast |   70 +
 .../freemarker/core/ast-whitespacestripping.ftl |   40 +
 .../org/apache/freemarker/core/ast/ast-1.ast    |  187 --
 .../org/apache/freemarker/core/ast/ast-1.ftl    |   29 -
 .../freemarker/core/ast/ast-assignments.ast     |  172 -
 .../freemarker/core/ast/ast-assignments.ftl     |   29 -
 .../apache/freemarker/core/ast/ast-builtins.ast |   59 -
 .../apache/freemarker/core/ast/ast-builtins.ftl |   23 -
 .../freemarker/core/ast/ast-locations.ast       |  155 -
 .../freemarker/core/ast/ast-locations.ftl       |   36 -
 .../ast/ast-mixedcontentsimplifications.ast     |   38 -
 .../ast/ast-mixedcontentsimplifications.ftl     |   26 -
 .../core/ast/ast-multipleignoredchildren.ast    |   30 -
 .../core/ast/ast-multipleignoredchildren.ftl    |   33 -
 .../core/ast/ast-nestedignoredchildren.ast      |   20 -
 .../core/ast/ast-nestedignoredchildren.ftl      |   19 -
 .../apache/freemarker/core/ast/ast-range.ast    |  281 --
 .../apache/freemarker/core/ast/ast-range.ftl    |   47 -
 .../core/ast/ast-strlitinterpolation.ast        |   82 -
 .../core/ast/ast-strlitinterpolation.ftl        |   25 -
 .../core/ast/ast-whitespacestripping.ast        |   70 -
 .../core/ast/ast-whitespacestripping.ftl        |   40 -
 .../freemarker/core/ast/cano-assignments.ftl    |   35 -
 .../core/ast/cano-assignments.ftl.out           |   34 -
 .../freemarker/core/ast/cano-builtins.ftl       |   23 -
 .../freemarker/core/ast/cano-builtins.ftl.out   |   23 -
 .../core/ast/cano-identifier-escaping.ftl       |   76 -
 .../core/ast/cano-identifier-escaping.ftl.out   |   44 -
 .../apache/freemarker/core/ast/cano-macros.ftl  |   29 -
 .../freemarker/core/ast/cano-macros.ftl.out     |   28 -
 .../core/ast/cano-strlitinterpolation.ftl       |   19 -
 .../core/ast/cano-strlitinterpolation.ftl.out   |   19 -
 .../core/ast/encodingOverride-ISO-8859-1.ftl    |   20 -
 .../core/ast/encodingOverride-UTF-8.ftl         |   20 -
 .../apache/freemarker/core/cano-assignments.ftl |   35 +
 .../freemarker/core/cano-assignments.ftl.out    |   34 +
 .../apache/freemarker/core/cano-builtins.ftl    |   23 +
 .../freemarker/core/cano-builtins.ftl.out       |   23 +
 .../core/cano-identifier-escaping.ftl           |   76 +
 .../core/cano-identifier-escaping.ftl.out       |   44 +
 .../org/apache/freemarker/core/cano-macros.ftl  |   29 +
 .../apache/freemarker/core/cano-macros.ftl.out  |   28 +
 .../core/cano-strlitinterpolation.ftl           |   19 +
 .../core/cano-strlitinterpolation.ftl.out       |   19 +
 .../core/encodingOverride-ISO-8859-1.ftl        |   20 +
 .../freemarker/core/encodingOverride-UTF-8.ftl  |   20 +
 .../basic/WEB-INF/expected/customTags1.txt      |    2 +-
 736 files changed, 49045 insertions(+), 49388 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/build.xml
----------------------------------------------------------------------
diff --git a/build.xml b/build.xml
index 1ca68b4..2e34ce6 100644
--- a/build.xml
+++ b/build.xml
@@ -131,7 +131,7 @@
     />
     
     <property name="_javaccOutputDir"
-      value="build/generated-sources/java/org/apache/freemarker/core/ast"
+      value="build/generated-sources/java/org/apache/freemarker/core"
     />
 
     <mkdir dir="${_javaccOutputDir}" />

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/APINotSupportedTemplateException.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/freemarker/core/APINotSupportedTemplateException.java
 
b/src/main/java/org/apache/freemarker/core/APINotSupportedTemplateException.java
new file mode 100644
index 0000000..b7fc12b
--- /dev/null
+++ 
b/src/main/java/org/apache/freemarker/core/APINotSupportedTemplateException.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.core;
+
+import org.apache.freemarker.core.model.ObjectWrapper;
+import org.apache.freemarker.core.model.TemplateModel;
+import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
+import org.apache.freemarker.core.model.impl.SimpleHash;
+import org.apache.freemarker.core.model.impl.SimpleSequence;
+
+/**
+ * Thrown when {@code ?api} is not supported by a value.
+ */
+class APINotSupportedTemplateException extends TemplateException {
+
+    APINotSupportedTemplateException(Environment env, ASTExpression 
blamedExpr, TemplateModel model) {
+        super(null, env, blamedExpr, buildDescription(env, blamedExpr, model));
+    }
+
+    protected static _ErrorDescriptionBuilder buildDescription(Environment 
env, ASTExpression blamedExpr,
+            TemplateModel tm) {
+        final _ErrorDescriptionBuilder desc = new _ErrorDescriptionBuilder(
+                "The value doesn't support ?api. See requirements in the 
FreeMarker Manual. ("
+                + "FTL type: ", new _DelayedFTLTypeDescription(tm),
+                ", TemplateModel class: ", new 
_DelayedShortClassName(tm.getClass()),
+                ", ObjectWapper: ", new 
_DelayedToString(env.getObjectWrapper()), ")"
+        ).blame(blamedExpr);
+
+        if (blamedExpr.isLiteral()) {
+            desc.tip("Only adapted Java objects can possibly have API, not 
values created inside templates.");
+        } else {
+            ObjectWrapper ow = env.getObjectWrapper();
+            if (ow instanceof DefaultObjectWrapper
+                    && (tm instanceof SimpleHash || tm instanceof 
SimpleSequence)) {
+                DefaultObjectWrapper dow = (DefaultObjectWrapper) ow;
+                if (!dow.getUseAdaptersForContainers()) {
+                    desc.tip("In the FreeMarker configuration, \"", 
Configurable.OBJECT_WRAPPER_KEY,
+                            "\" is a DefaultObjectWrapper with its 
\"useAdaptersForContainers\" property set to "
+                            + "false. Setting it to true might solves this 
problem.");
+                } else if (tm instanceof SimpleSequence && 
dow.getForceLegacyNonListCollections()) {
+                    desc.tip("In the FreeMarker configuration, \"",
+                            Configurable.OBJECT_WRAPPER_KEY,
+                            "\" is a DefaultObjectWrapper with its 
\"forceLegacyNonListCollections\" property set "
+                            + "to true. If you are trying to access the API of 
a non-List Collection, setting the "
+                            + "\"forceLegacyNonListCollections\" property to 
false might solves this problem.");
+                }
+            }
+        }
+
+        return desc;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTComment.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/freemarker/core/ASTComment.java 
b/src/main/java/org/apache/freemarker/core/ASTComment.java
new file mode 100644
index 0000000..439bc81
--- /dev/null
+++ b/src/main/java/org/apache/freemarker/core/ASTComment.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.core;
+
+import org.apache.freemarker.core.util._StringUtil;
+
+/**
+ * AST comment node
+ */
+final class ASTComment extends _ASTElement {
+
+    private final String text;
+
+    ASTComment(String text) {
+        this.text = text;
+    }
+
+    @Override
+    _ASTElement[] accept(Environment env) {
+        // do nothing, skip the body
+        return null;
+    }
+
+    @Override
+    protected String dump(boolean canonical) {
+        if (canonical) {
+            return "<#--" + text + "-->";
+        } else {
+            return "comment " + _StringUtil.jQuote(text.trim());
+        }
+    }
+    
+    @Override
+    String getNodeTypeSymbol() {
+        return "#--...--";
+    }
+    
+
+    @Override
+    int getParameterCount() {
+        return 1;
+    }
+
+    @Override
+    Object getParameterValue(int idx) {
+        if (idx != 0) throw new IndexOutOfBoundsException();
+        return text;
+    }
+
+    @Override
+    ParameterRole getParameterRole(int idx) {
+        if (idx != 0) throw new IndexOutOfBoundsException();
+        return ParameterRole.CONTENT;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    @Override
+    boolean isOutputCacheable() {
+        return true;
+    }
+
+    @Override
+    boolean isNestedBlockRepeater() {
+        return false;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirAssignment.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/freemarker/core/ASTDirAssignment.java 
b/src/main/java/org/apache/freemarker/core/ASTDirAssignment.java
new file mode 100644
index 0000000..8b85fc6
--- /dev/null
+++ b/src/main/java/org/apache/freemarker/core/ASTDirAssignment.java
@@ -0,0 +1,280 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.core;
+
+import org.apache.freemarker.core.model.TemplateModel;
+import org.apache.freemarker.core.model.TemplateNumberModel;
+import org.apache.freemarker.core.util.BugException;
+import org.apache.freemarker.core.util._StringUtil;
+
+/**
+ * AST directive node: An instruction that makes a single assignment, like 
{@code <#local x=1>}, {@code <#global x=1>},
+ * {@code <#assign x=1>}.
+ * This is also used as the child of {@link ASTDirAssignmentsContainer}, if 
there are multiple assignments in the same
+ * tag, like in {@code <#local x=1 y=2>}.
+ */
+final class ASTDirAssignment extends _ASTElement {
+
+    // These must not clash with ArithmeticExpression.TYPE_... constants: 
+    private static final int OPERATOR_TYPE_EQUALS = 0x10000;
+    private static final int OPERATOR_TYPE_PLUS_EQUALS = 0x10001;
+    private static final int OPERATOR_TYPE_PLUS_PLUS = 0x10002;
+    private static final int OPERATOR_TYPE_MINUS_MINUS = 0x10003;
+    
+    private final int/*enum*/ scope;
+    private final String variableName;
+    private final int operatorType;
+    private final ASTExpression valueExp;
+    private ASTExpression namespaceExp;
+
+    static final int NAMESPACE = 1;
+    static final int LOCAL = 2;
+    static final int GLOBAL = 3;
+    
+    private static final Number ONE = Integer.valueOf(1);
+
+    /**
+     * @param variableName the variable name to assign to.
+     * @param valueExp the expression to assign.
+     * @param scope the scope of the assignment, one of NAMESPACE, LOCAL, or 
GLOBAL
+     */
+    ASTDirAssignment(String variableName,
+            int operator,
+            ASTExpression valueExp,
+            int scope) {
+        this.scope = scope;
+        
+        this.variableName = variableName;
+        
+        if (operator == FMParserConstants.EQUALS) {
+            operatorType = OPERATOR_TYPE_EQUALS;
+        } else {
+            switch (operator) {
+            case FMParserConstants.PLUS_PLUS:
+                operatorType = OPERATOR_TYPE_PLUS_PLUS;
+                break;
+            case FMParserConstants.MINUS_MINUS:
+                operatorType = OPERATOR_TYPE_MINUS_MINUS;
+                break;
+            case FMParserConstants.PLUS_EQUALS:
+                operatorType = OPERATOR_TYPE_PLUS_EQUALS;
+                break;
+            case FMParserConstants.MINUS_EQUALS:
+                operatorType = ArithmeticExpression.TYPE_SUBSTRACTION;
+                break;
+            case FMParserConstants.TIMES_EQUALS:
+                operatorType = ArithmeticExpression.TYPE_MULTIPLICATION;
+                break;
+            case FMParserConstants.DIV_EQUALS:
+                operatorType = ArithmeticExpression.TYPE_DIVISION;
+                break;
+            case FMParserConstants.MOD_EQUALS:
+                operatorType = ArithmeticExpression.TYPE_MODULO;
+                break;
+            default:
+                throw new BugException();
+            }
+        }
+        
+        this.valueExp = valueExp;
+    }
+    
+    void setNamespaceExp(ASTExpression namespaceExp) {
+        if (scope != NAMESPACE && namespaceExp != null) throw new 
BugException();
+        this.namespaceExp =  namespaceExp;
+    }
+
+    @Override
+    _ASTElement[] accept(Environment env) throws TemplateException {
+        final Environment.Namespace namespace;
+        if (namespaceExp == null) {
+            switch (scope) {
+            case LOCAL:
+                namespace = null;
+                break;
+            case GLOBAL:
+                namespace = env.getGlobalNamespace();
+                break;
+            case NAMESPACE:
+                namespace = env.getCurrentNamespace();
+                break;
+            default:
+                throw new BugException("Unexpected scope type: " + scope);
+            }
+        } else {
+            TemplateModel namespaceTM = namespaceExp.eval(env);
+            try {
+                namespace = (Environment.Namespace) namespaceTM;
+            } catch (ClassCastException e) {
+                throw new NonNamespaceException(namespaceExp, namespaceTM, 
env);
+            }
+            if (namespace == null) {
+                throw InvalidReferenceException.getInstance(namespaceExp, env);
+            }
+        }
+        
+        TemplateModel value;
+        if (operatorType == OPERATOR_TYPE_EQUALS) {
+            value = valueExp.eval(env);
+            valueExp.assertNonNull(value, env);
+        } else {
+            TemplateModel lhoValue;
+            if (namespace == null) {
+                lhoValue = env.getLocalVariable(variableName);
+            } else {
+                lhoValue = namespace.get(variableName);
+            }
+            
+            if (operatorType == OPERATOR_TYPE_PLUS_EQUALS) {  // Add or concat 
operation
+                if (lhoValue == null) {
+                    throw InvalidReferenceException.getInstance(
+                            variableName, getOperatorTypeAsString(), env);
+                }
+                
+                value = valueExp.eval(env);
+                valueExp.assertNonNull(value, env);
+                value = ASTExpAddOrConcat._eval(env, namespaceExp, null, 
lhoValue, valueExp, value);
+            } else {  // Numerical operation
+                Number lhoNumber;
+                if (lhoValue instanceof TemplateNumberModel) {
+                    lhoNumber = EvalUtil.modelToNumber((TemplateNumberModel) 
lhoValue, null);
+                } else if (lhoValue == null) {
+                    throw InvalidReferenceException.getInstance(variableName, 
getOperatorTypeAsString(), env);
+                } else {
+                    throw new NonNumericalException(variableName, lhoValue, 
null, env);
+                }
+
+                if (operatorType == OPERATOR_TYPE_PLUS_PLUS) {
+                    value  = ASTExpAddOrConcat._evalOnNumbers(env, 
getParentElement(), lhoNumber, ONE);
+                } else if (operatorType == OPERATOR_TYPE_MINUS_MINUS) {
+                    value = ArithmeticExpression._eval(
+                            env, getParentElement(), lhoNumber, 
ArithmeticExpression.TYPE_SUBSTRACTION, ONE);
+                } else { // operatorType == ArithmeticExpression.TYPE_...
+                    Number rhoNumber = valueExp.evalToNumber(env);
+                    value = ArithmeticExpression._eval(env, this, lhoNumber, 
operatorType, rhoNumber);
+                }
+            }
+        }
+        
+        if (namespace == null) {
+            env.setLocalVariable(variableName, value);
+        } else {
+            namespace.put(variableName, value);
+        }
+        return null;
+    }
+
+    @Override
+    protected String dump(boolean canonical) {
+        StringBuilder buf = new StringBuilder();
+        String dn = getParentElement() instanceof ASTDirAssignmentsContainer ? 
null : getNodeTypeSymbol();
+        if (dn != null) {
+            if (canonical) buf.append("<");
+            buf.append(dn);
+            buf.append(' ');
+        }
+        
+        buf.append(_StringUtil.toFTLTopLevelTragetIdentifier(variableName));
+        
+        if (valueExp != null) {
+            buf.append(' ');
+        }
+        buf.append(getOperatorTypeAsString());
+        if (valueExp != null) {
+            buf.append(' ');
+            buf.append(valueExp.getCanonicalForm());
+        }
+        if (dn != null) {
+            if (namespaceExp != null) {
+                buf.append(" in ");
+                buf.append(namespaceExp.getCanonicalForm());
+            }
+            if (canonical) buf.append(">");
+        }
+        String result = buf.toString();
+        return result;
+    }
+    
+    @Override
+    String getNodeTypeSymbol() {
+        return getDirectiveName(scope);
+    }
+    
+    static String getDirectiveName(int scope) {
+        if (scope == ASTDirAssignment.LOCAL) {
+            return "#local";
+        } else if (scope == ASTDirAssignment.GLOBAL) {
+            return "#global";
+        } else if (scope == ASTDirAssignment.NAMESPACE) {
+            return "#assign";
+        } else {
+            return "#{unknown_assignment_type}";
+        }
+    }
+    
+    @Override
+    int getParameterCount() {
+        return 5;
+    }
+
+    @Override
+    Object getParameterValue(int idx) {
+        switch (idx) {
+        case 0: return variableName;
+        case 1: return getOperatorTypeAsString();
+        case 2: return valueExp;
+        case 3: return Integer.valueOf(scope);
+        case 4: return namespaceExp;
+        default: throw new IndexOutOfBoundsException();
+        }
+    }
+
+    @Override
+    ParameterRole getParameterRole(int idx) {
+        switch (idx) {
+        case 0: return ParameterRole.ASSIGNMENT_TARGET;
+        case 1: return ParameterRole.ASSIGNMENT_OPERATOR;
+        case 2: return ParameterRole.ASSIGNMENT_SOURCE;
+        case 3: return ParameterRole.VARIABLE_SCOPE;
+        case 4: return ParameterRole.NAMESPACE;
+        default: throw new IndexOutOfBoundsException();
+        }
+    }
+
+    @Override
+    boolean isNestedBlockRepeater() {
+        return false;
+    }
+    
+    private String getOperatorTypeAsString() {
+        if (operatorType == OPERATOR_TYPE_EQUALS) {
+            return "=";
+        } else if (operatorType == OPERATOR_TYPE_PLUS_EQUALS) {
+            return "+=";
+        } else if (operatorType == OPERATOR_TYPE_PLUS_PLUS) {
+            return "++";
+        } else if (operatorType == OPERATOR_TYPE_MINUS_MINUS) {
+            return "--";
+        } else {
+            return ArithmeticExpression.getOperatorSymbol(operatorType) + "=";
+        }
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirAssignmentsContainer.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/freemarker/core/ASTDirAssignmentsContainer.java 
b/src/main/java/org/apache/freemarker/core/ASTDirAssignmentsContainer.java
new file mode 100644
index 0000000..d0a1a2a
--- /dev/null
+++ b/src/main/java/org/apache/freemarker/core/ASTDirAssignmentsContainer.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.core;
+
+import java.io.IOException;
+
+/**
+ * AST directive node: An instruction that does multiple assignments, like 
[#local x=1 x=2].
+ * Each assignment is represented by a {@link ASTDirAssignment} child element.
+ * If there's only one assignment, its usually just a {@link ASTDirAssignment} 
without parent {@link ASTDirAssignmentsContainer}.
+ */
+final class ASTDirAssignmentsContainer extends _ASTElement {
+
+    private int scope;
+    private ASTExpression namespaceExp;
+
+    ASTDirAssignmentsContainer(int scope) {
+        this.scope = scope;
+        setChildBufferCapacity(1);
+    }
+
+    void addAssignment(ASTDirAssignment assignment) {
+        addChild(assignment);
+    }
+    
+    void setNamespaceExp(ASTExpression namespaceExp) {
+        this.namespaceExp = namespaceExp;
+        int ln = getChildCount();
+        for (int i = 0; i < ln; i++) {
+            ((ASTDirAssignment) getChild(i)).setNamespaceExp(namespaceExp);
+        }
+    }
+
+    @Override
+    _ASTElement[] accept(Environment env) throws TemplateException, 
IOException {
+        return getChildBuffer();
+    }
+
+    @Override
+    protected String dump(boolean canonical) {
+        StringBuilder buf = new StringBuilder();
+        if (canonical) buf.append('<');
+        buf.append(ASTDirAssignment.getDirectiveName(scope));
+        if (canonical) {
+            buf.append(' ');
+            int ln = getChildCount();
+            for (int i = 0; i < ln; i++) {
+                if (i != 0) {
+                    buf.append(", ");
+                }
+                ASTDirAssignment assignment = (ASTDirAssignment) getChild(i);
+                buf.append(assignment.getCanonicalForm());
+            }
+        } else {
+            buf.append("-container");
+        }
+        if (namespaceExp != null) {
+            buf.append(" in ");
+            buf.append(namespaceExp.getCanonicalForm());
+        }
+        if (canonical) buf.append(">");
+        return buf.toString();
+    }
+    
+    @Override
+    int getParameterCount() {
+        return 2;
+    }
+
+    @Override
+    Object getParameterValue(int idx) {
+        switch (idx) {
+        case 0: return Integer.valueOf(scope);
+        case 1: return namespaceExp;
+        default: return null;
+        }
+    }
+
+    @Override
+    ParameterRole getParameterRole(int idx) {
+        switch (idx) {
+        case 0: return ParameterRole.VARIABLE_SCOPE;
+        case 1: return ParameterRole.NAMESPACE;
+        default: return null;
+        }
+    }
+    
+    @Override
+    String getNodeTypeSymbol() {
+        return ASTDirAssignment.getDirectiveName(scope);
+    }
+
+    @Override
+    boolean isNestedBlockRepeater() {
+        return false;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirAttemptRecoverContainer.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/freemarker/core/ASTDirAttemptRecoverContainer.java 
b/src/main/java/org/apache/freemarker/core/ASTDirAttemptRecoverContainer.java
new file mode 100644
index 0000000..e1eeb61
--- /dev/null
+++ 
b/src/main/java/org/apache/freemarker/core/ASTDirAttemptRecoverContainer.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.core;
+
+import java.io.IOException;
+
+/**
+ * AST directive node: Holder for the attempted section of the {@code 
#attempt} element and of the nested
+ * {@code #recover} element ({@link ASTDirRecover}).
+ */
+final class ASTDirAttemptRecoverContainer extends _ASTElement {
+    
+    private _ASTElement attemptedSection;
+    private ASTDirRecover recoverySection;
+    
+    ASTDirAttemptRecoverContainer(TemplateElements attemptedSectionChildren, 
ASTDirRecover recoverySection) {
+        _ASTElement attemptedSection = 
attemptedSectionChildren.asSingleElement();
+        this.attemptedSection = attemptedSection;
+        this.recoverySection = recoverySection;
+        setChildBufferCapacity(2);
+        addChild(attemptedSection); // for backward compatibility
+        addChild(recoverySection);
+    }
+
+    @Override
+    _ASTElement[] accept(Environment env) throws TemplateException, 
IOException {
+        env.visitAttemptRecover(this, attemptedSection, recoverySection);
+        return null;
+    }
+
+    @Override
+    protected String dump(boolean canonical) {
+        if (!canonical) {
+            return getNodeTypeSymbol();
+        } else {
+            StringBuilder buf = new StringBuilder();
+            buf.append("<").append(getNodeTypeSymbol()).append(">");
+            buf.append(getChildrenCanonicalForm());            
+            buf.append("</").append(getNodeTypeSymbol()).append(">");
+            return buf.toString();
+        }
+    }
+    
+    @Override
+    int getParameterCount() {
+        return 1;
+    }
+
+    @Override
+    Object getParameterValue(int idx) {
+        if (idx != 0) throw new IndexOutOfBoundsException();
+        return recoverySection;
+    }
+
+    @Override
+    ParameterRole getParameterRole(int idx) {
+        if (idx != 0) throw new IndexOutOfBoundsException();
+        return ParameterRole.ERROR_HANDLER;
+    }
+    
+    @Override
+    String getNodeTypeSymbol() {
+        return "#attempt";
+    }
+    
+    @Override
+    boolean isNestedBlockRepeater() {
+        return false;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirAutoEsc.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/freemarker/core/ASTDirAutoEsc.java 
b/src/main/java/org/apache/freemarker/core/ASTDirAutoEsc.java
new file mode 100644
index 0000000..ed79109
--- /dev/null
+++ b/src/main/java/org/apache/freemarker/core/ASTDirAutoEsc.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.core;
+
+import java.io.IOException;
+
+/**
+ * AST directive node: {@code #autoEsc}
+ */
+final class ASTDirAutoEsc extends _ASTElement {
+    
+    ASTDirAutoEsc(TemplateElements children) { 
+        setChildren(children);
+    }
+
+    @Override
+    _ASTElement[] accept(Environment env) throws TemplateException, 
IOException {
+        return getChildBuffer();
+    }
+
+    @Override
+    protected String dump(boolean canonical) {
+        if (canonical) {
+            return "<" + getNodeTypeSymbol() + "\">" + 
getChildrenCanonicalForm() + "</" + getNodeTypeSymbol() + ">";
+        } else {
+            return getNodeTypeSymbol();
+        }
+    }
+    
+    @Override
+    String getNodeTypeSymbol() {
+        return "#autoesc";
+    }
+    
+    @Override
+    int getParameterCount() {
+        return 0;
+    }
+
+    @Override
+    Object getParameterValue(int idx) {
+        throw new IndexOutOfBoundsException();
+    }
+
+    @Override
+    ParameterRole getParameterRole(int idx) {
+        throw new IndexOutOfBoundsException();
+    }
+
+    @Override
+    boolean isIgnorable(boolean stripWhitespace) {
+        return getChildCount() == 0;
+    }
+
+    @Override
+    boolean isNestedBlockRepeater() {
+        return false;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirBreak.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/freemarker/core/ASTDirBreak.java 
b/src/main/java/org/apache/freemarker/core/ASTDirBreak.java
new file mode 100644
index 0000000..df10697
--- /dev/null
+++ b/src/main/java/org/apache/freemarker/core/ASTDirBreak.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.core;
+
+/**
+ * AST directive node: {@code #break}
+ */
+final class ASTDirBreak extends _ASTElement {
+
+    @Override
+    _ASTElement[] accept(Environment env) {
+        throw Break.INSTANCE;
+    }
+
+    @Override
+    protected String dump(boolean canonical) {
+        return canonical ? "<" + getNodeTypeSymbol() + "/>" : 
getNodeTypeSymbol();
+    }
+    
+    @Override
+    String getNodeTypeSymbol() {
+        return "#break";
+    }
+
+    @Override
+    int getParameterCount() {
+        return 0;
+    }
+
+    @Override
+    Object getParameterValue(int idx) {
+        throw new IndexOutOfBoundsException();
+    }
+
+    @Override
+    ParameterRole getParameterRole(int idx) {
+        throw new IndexOutOfBoundsException();
+    }
+    
+    static class Break extends RuntimeException {
+        static final Break INSTANCE = new Break();
+        private Break() {
+        }
+    }
+
+    @Override
+    boolean isNestedBlockRepeater() {
+        return false;
+    }
+    
+}
+
+

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java 
b/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java
new file mode 100644
index 0000000..d6ff929
--- /dev/null
+++ b/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.core;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Map;
+
+import org.apache.freemarker.core.model.TemplateModel;
+import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.model.TemplateTransformModel;
+import org.apache.freemarker.core.model.impl.SimpleScalar;
+
+/**
+ * AST directive node: Like {@code <#local x>...</#local>}.
+ */
+final class ASTDirCapturingAssignment extends _ASTElement {
+
+    private final String varName;
+    private final ASTExpression namespaceExp;
+    private final int scope;
+    private final MarkupOutputFormat<?> markupOutputFormat;
+
+    ASTDirCapturingAssignment(TemplateElements children, String varName, int 
scope, ASTExpression namespaceExp, MarkupOutputFormat<?> markupOutputFormat) {
+        setChildren(children);
+        this.varName = varName;
+        this.namespaceExp = namespaceExp;
+        this.scope = scope;
+        this.markupOutputFormat = markupOutputFormat;
+    }
+
+    @Override
+    _ASTElement[] accept(Environment env) throws TemplateException, 
IOException {
+        _ASTElement[] children = getChildBuffer();
+        if (children != null) {
+            env.visitAndTransform(children, new CaptureOutput(env), null);
+        } else {
+            TemplateModel value = capturedStringToModel("");
+            if (namespaceExp != null) {
+                Environment.Namespace ns = (Environment.Namespace) 
namespaceExp.eval(env);
+                ns.put(varName, value);
+            } else if (scope == ASTDirAssignment.NAMESPACE) {
+                env.setVariable(varName, value);
+            } else if (scope == ASTDirAssignment.GLOBAL) {
+                env.setGlobalVariable(varName, value);
+            } else if (scope == ASTDirAssignment.LOCAL) {
+                env.setLocalVariable(varName, value);
+            }
+        }
+        return null;
+    }
+
+    private TemplateModel capturedStringToModel(String s) throws 
TemplateModelException {
+        return markupOutputFormat == null ? new SimpleScalar(s) : 
markupOutputFormat.fromMarkup(s);
+    }
+
+    private class CaptureOutput implements TemplateTransformModel {
+        private final Environment env;
+        private final Environment.Namespace fnsModel;
+        
+        CaptureOutput(Environment env) throws TemplateException {
+            this.env = env;
+            TemplateModel nsModel = null;
+            if (namespaceExp != null) {
+                nsModel = namespaceExp.eval(env);
+                if (!(nsModel instanceof Environment.Namespace)) {
+                    throw new NonNamespaceException(namespaceExp, nsModel, 
env);
+                }
+            }
+            fnsModel = (Environment.Namespace ) nsModel; 
+        }
+        
+        @Override
+        public Writer getWriter(Writer out, Map args) {
+            return new StringWriter() {
+                @Override
+                public void close() throws IOException {
+                    TemplateModel result;
+                    try {
+                        result = capturedStringToModel(toString());
+                    } catch (TemplateModelException e) {
+                        // [Java 1.6] e to cause
+                        throw new IOException("Failed to create FTL value from 
captured string: " + e);
+                    }
+                    switch(scope) {
+                        case ASTDirAssignment.NAMESPACE: {
+                            if (fnsModel != null) {
+                                fnsModel.put(varName, result);
+                            } else {
+                                env.setVariable(varName, result);
+                            }
+                            break;
+                        }
+                        case ASTDirAssignment.LOCAL: {
+                            env.setLocalVariable(varName, result);
+                            break;
+                        }
+                        case ASTDirAssignment.GLOBAL: {
+                            env.setGlobalVariable(varName, result);
+                            break;
+                        }
+                    }
+                }
+            };
+        }
+    }
+    
+    @Override
+    protected String dump(boolean canonical) {
+        StringBuilder sb = new StringBuilder();
+        if (canonical) sb.append("<");
+        sb.append(getNodeTypeSymbol());
+        sb.append(' ');
+        sb.append(varName);
+        if (namespaceExp != null) {
+            sb.append(" in ");
+            sb.append(namespaceExp.getCanonicalForm());
+        }
+        if (canonical) {
+            sb.append('>');
+            sb.append(getChildrenCanonicalForm());
+            sb.append("</");
+            sb.append(getNodeTypeSymbol());
+            sb.append('>');
+        } else {
+            sb.append(" = .nested_output");
+        }
+        return sb.toString();
+    }
+    
+    @Override
+    String getNodeTypeSymbol() {
+        return ASTDirAssignment.getDirectiveName(scope);
+    }
+    
+    @Override
+    int getParameterCount() {
+        return 3;
+    }
+
+    @Override
+    Object getParameterValue(int idx) {
+        switch (idx) {
+        case 0: return varName;
+        case 1: return Integer.valueOf(scope);
+        case 2: return namespaceExp;
+        default: throw new IndexOutOfBoundsException();
+        }
+    }
+
+    @Override
+    ParameterRole getParameterRole(int idx) {
+        switch (idx) {
+        case 0: return ParameterRole.ASSIGNMENT_TARGET;
+        case 1: return ParameterRole.VARIABLE_SCOPE;
+        case 2: return ParameterRole.NAMESPACE;
+        default: throw new IndexOutOfBoundsException();
+        }
+    }
+
+    @Override
+    boolean isNestedBlockRepeater() {
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirCase.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/freemarker/core/ASTDirCase.java 
b/src/main/java/org/apache/freemarker/core/ASTDirCase.java
new file mode 100644
index 0000000..7e8eff5
--- /dev/null
+++ b/src/main/java/org/apache/freemarker/core/ASTDirCase.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.core;
+
+/**
+ * AST directive node: {@code #case} (inside a {@code #switch}) 
+ */
+final class ASTDirCase extends _ASTElement {
+
+    final int TYPE_CASE = 0;
+    final int TYPE_DEFAULT = 1;
+    
+    ASTExpression condition;
+
+    ASTDirCase(ASTExpression matchingValue, TemplateElements children) {
+        condition = matchingValue;
+        setChildren(children);
+    }
+
+    @Override
+    _ASTElement[] accept(Environment env) {
+        return getChildBuffer();
+    }
+
+    @Override
+    protected String dump(boolean canonical) {
+        StringBuilder sb = new StringBuilder();
+        if (canonical) sb.append('<');
+        sb.append(getNodeTypeSymbol());
+        if (condition != null) {
+            sb.append(' ');
+            sb.append(condition.getCanonicalForm());
+        }
+        if (canonical) {
+            sb.append('>');
+            sb.append(getChildrenCanonicalForm());
+        }
+        return sb.toString();
+    }
+    
+    @Override
+    String getNodeTypeSymbol() {
+        return condition != null ? "#case" : "#default";
+    }
+
+    @Override
+    int getParameterCount() {
+        return 2;
+    }
+
+    @Override
+    Object getParameterValue(int idx) {
+        switch (idx) {
+        case 0: return condition;
+        case 1: return Integer.valueOf(condition != null ? TYPE_CASE : 
TYPE_DEFAULT);
+        default: throw new IndexOutOfBoundsException();
+        }
+    }
+
+    @Override
+    ParameterRole getParameterRole(int idx) {
+        switch (idx) {
+        case 0: return ParameterRole.CONDITION;
+        case 1: return ParameterRole.AST_NODE_SUBTYPE;
+        default: throw new IndexOutOfBoundsException();
+        }
+    }
+
+    @Override
+    boolean isNestedBlockRepeater() {
+        return false;
+    }
+        
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ASTDirCompress.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/freemarker/core/ASTDirCompress.java 
b/src/main/java/org/apache/freemarker/core/ASTDirCompress.java
new file mode 100644
index 0000000..fb4c226
--- /dev/null
+++ b/src/main/java/org/apache/freemarker/core/ASTDirCompress.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.core;
+
+import java.io.IOException;
+
+import org.apache.freemarker.core.util.StandardCompress;
+
+/**
+ * AST directive node: {@code #compress}.
+ * An instruction that reduces all sequences of whitespace to a single
+ * space or newline. In addition, leading and trailing whitespace is removed.
+ * 
+ * @see org.apache.freemarker.core.util.StandardCompress
+ */
+final class ASTDirCompress extends _ASTElement {
+
+    ASTDirCompress(TemplateElements children) { 
+        setChildren(children);
+    }
+
+    @Override
+    _ASTElement[] accept(Environment env) throws TemplateException, 
IOException {
+        _ASTElement[] childBuffer = getChildBuffer();
+        if (childBuffer != null) {
+            env.visitAndTransform(childBuffer, StandardCompress.INSTANCE, 
null);
+        }
+        return null;
+    }
+
+    @Override
+    protected String dump(boolean canonical) {
+        if (canonical) {
+            return "<" + getNodeTypeSymbol() + ">" + 
getChildrenCanonicalForm() + "</" + getNodeTypeSymbol() + ">";
+        } else {
+            return getNodeTypeSymbol();
+        }
+    }
+    
+    @Override
+    String getNodeTypeSymbol() {
+        return "#compress";
+    }
+    
+    @Override
+    int getParameterCount() {
+        return 0;
+    }
+
+    @Override
+    Object getParameterValue(int idx) {
+        throw new IndexOutOfBoundsException();
+    }
+
+    @Override
+    ParameterRole getParameterRole(int idx) {
+        throw new IndexOutOfBoundsException();
+    }
+
+    @Override
+    boolean isIgnorable(boolean stripWhitespace) {
+        return getChildCount() == 0 && getParameterCount() == 0;
+    }
+
+    @Override
+    boolean isNestedBlockRepeater() {
+        return false;
+    }
+    
+}


Reply via email to