blob: fed873c3a5d2d79497085e383aeb607ff8746b5f [file] [log] [blame]
/*
* Copyright 2008 Google Inc.
*
* Licensed 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 com.google.gwt.i18n.rebind;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.typeinfo.JMethod;
import com.google.gwt.core.ext.typeinfo.JPrimitiveType;
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.gwt.i18n.rebind.AbstractResource.ResourceList;
import com.google.gwt.i18n.shared.GwtLocale;
import com.google.gwt.user.rebind.AbstractGeneratorClassCreator;
import com.google.gwt.user.rebind.AbstractMethodCreator;
import com.google.gwt.user.rebind.AbstractSourceCreator;
import java.text.MessageFormat;
/**
* Method creator to call the correct Map for the given Dictionary.
*/
class LookupMethodCreator extends AbstractMethodCreator {
private JType returnType;
/**
* Constructor for <code>LookupMethodCreator</code>.
*
* @param classCreator parent class creator
* @param returnType associated return type
*/
public LookupMethodCreator(AbstractGeneratorClassCreator classCreator,
JType returnType) {
super(classCreator);
this.returnType = returnType;
}
@Override
public void createMethodFor(TreeLogger logger, JMethod targetMethod,
String key, ResourceList resourceList, GwtLocale locale) {
createMethodFor(targetMethod);
}
/**
* Returns a {@code String} containing the return type name.
*/
protected String getReturnTypeName() {
String type;
JPrimitiveType s = returnType.isPrimitive();
if (s != null) {
type = AbstractSourceCreator.getJavaObjectTypeFor(s);
} else {
type = returnType.getParameterizedQualifiedSourceName();
}
return type;
}
void createMethodFor(JMethod targetMethod) {
String template = "{0} target = ({0}) cache.get(arg0);";
String returnTypeName = getReturnTypeName();
String lookup = MessageFormat.format(template, new Object[] {returnTypeName});
println(lookup);
println("if (target != null) {");
indent();
printReturnTarget();
outdent();
println("}");
JMethod[] methods = ((ConstantsWithLookupImplCreator) currentCreator).allInterfaceMethods;
JType erasedType = returnType.getErasedType();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getReturnType().getErasedType().equals(erasedType)
&& methods[i] != targetMethod) {
String methodName = methods[i].getName();
String body = "if(arg0.equals(" + wrap(methodName) + ")) {";
println(body);
indent();
printFound(methodName);
outdent();
println("}");
}
}
String format = "throw new java.util.MissingResourceException(\"Cannot find constant ''\" +"
+ "{0} + \"''; expecting a method name\", \"{1}\", {0});";
String result = MessageFormat.format(format, "arg0",
this.currentCreator.getTarget().getQualifiedSourceName());
println(result);
}
void printFound(String methodName) {
println(MessageFormat.format(returnTemplate(), new Object[] {methodName}));
}
void printReturnTarget() {
println("return target;");
}
String returnTemplate() {
return "return {0}();";
}
}