blob: 6939b7c46a2a709ee518fdca24f1322fc4c36c3d [file] [log] [blame]
/*
* 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 freemarker.core;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
/**
* The type of a value differs from what was expected.
*
* @since 2.3.20
*/
public class UnexpectedTypeException extends TemplateException {
public UnexpectedTypeException(Environment env, String description) {
super(description, env);
}
UnexpectedTypeException(Environment env, _ErrorDescriptionBuilder description) {
super(null, env, null, description);
}
UnexpectedTypeException(
Expression blamed, TemplateModel model, String expectedTypesDesc, Class[] expectedTypes, Environment env)
throws InvalidReferenceException {
super(null, env, blamed, newDesciptionBuilder(blamed, null, model, expectedTypesDesc, expectedTypes, env));
}
UnexpectedTypeException(
Expression blamed, TemplateModel model, String expectedTypesDesc, Class[] expectedTypes, String tip,
Environment env)
throws InvalidReferenceException {
super(null, env, blamed, newDesciptionBuilder(blamed, null, model, expectedTypesDesc, expectedTypes, env)
.tip(tip));
}
UnexpectedTypeException(
Expression blamed, TemplateModel model, String expectedTypesDesc, Class[] expectedTypes, Object[] tips,
Environment env)
throws InvalidReferenceException {
super(null, env, blamed, newDesciptionBuilder(blamed, null, model, expectedTypesDesc, expectedTypes, env)
.tips(tips));
}
UnexpectedTypeException(
String blamedAssignmentTargetVarName, TemplateModel model, String expectedTypesDesc, Class[] expectedTypes,
Object[] tips,
Environment env)
throws InvalidReferenceException {
super(null, env, null, newDesciptionBuilder(
null, blamedAssignmentTargetVarName, model, expectedTypesDesc, expectedTypes, env).tips(tips));
}
/**
* @param blamedAssignmentTargetVarName
* Used for assignments that use {@code +=} and such, in which case the {@code blamed} expression
* parameter will be null {@code null} and this parameter will be non-{null}.
*/
private static _ErrorDescriptionBuilder newDesciptionBuilder(
Expression blamed, String blamedAssignmentTargetVarName,
TemplateModel model, String expectedTypesDesc, Class[] expectedTypes, Environment env)
throws InvalidReferenceException {
if (model == null) throw InvalidReferenceException.getInstance(blamed, env);
_ErrorDescriptionBuilder errorDescBuilder = new _ErrorDescriptionBuilder(
unexpectedTypeErrorDescription(expectedTypesDesc, blamed, blamedAssignmentTargetVarName, model))
.blame(blamed).showBlamer(true);
if (model instanceof _UnexpectedTypeErrorExplainerTemplateModel) {
Object[] tip = ((_UnexpectedTypeErrorExplainerTemplateModel) model).explainTypeError(expectedTypes);
if (tip != null) {
errorDescBuilder.tip(tip);
}
}
return errorDescBuilder;
}
private static Object[] unexpectedTypeErrorDescription(
String expectedTypesDesc,
Expression blamed, String blamedAssignmentTargetVarName,
TemplateModel model) {
return new Object[] {
"Expected ", new _DelayedAOrAn(expectedTypesDesc), ", but ",
(blamedAssignmentTargetVarName == null
? (Object) (blamed != null ? "this" : "the expression")
: new Object[] {
"assignment target variable ",
new _DelayedJQuote(blamedAssignmentTargetVarName) }),
" has evaluated to ",
new _DelayedAOrAn(new _DelayedFTLTypeDescription(model)),
(blamedAssignmentTargetVarName == null ? ":" : ".")};
}
}