blob: 89813c981204c84526d56088f085991741cb3e1b [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.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JMethod;
import com.google.gwt.core.ext.typeinfo.JParameter;
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.core.ext.typeinfo.TypeOracleException;
import com.google.gwt.i18n.rebind.AbstractResource.ResourceList;
import com.google.gwt.i18n.shared.GwtLocale;
import com.google.gwt.user.rebind.AbstractMethodCreator;
import com.google.gwt.user.rebind.SourceWriter;
import java.util.HashMap;
import java.util.Map;
class ConstantsWithLookupImplCreator extends ConstantsImplCreator {
final JMethod[] allInterfaceMethods;
private final Map<String, AbstractMethodCreator> namesToMethodCreators = new HashMap<String, AbstractMethodCreator>();
/**
* Constructor for <code>ConstantsWithLookupImplCreator</code>.
*
* @param logger logger to print errors
* @param writer <code>Writer</code> to print to
* @param localizableClass class/interface to conform to
* @param resourceList resource bundle used to generate the class
* @param oracle types
* @throws UnableToCompleteException
*/
ConstantsWithLookupImplCreator(TreeLogger logger, SourceWriter writer,
JClassType localizableClass, ResourceList resourceList, TypeOracle oracle)
throws UnableToCompleteException {
super(logger, writer, localizableClass, resourceList, oracle);
try {
// Boolean
JType booleanType = oracle.parse(boolean.class.getName());
LookupMethodCreator booleanMethod = new LookupMethodCreator(this,
booleanType) {
@Override
public void printReturnTarget() {
println("return target.booleanValue();");
}
@Override
public String returnTemplate() {
return "boolean answer = {0}();\ncache.put(\"{0}\",new Boolean(answer));\nreturn answer;";
}
};
namesToMethodCreators.put("getBoolean", booleanMethod);
// Double
JType doubleType = oracle.parse(double.class.getName());
LookupMethodCreator doubleMethod = new LookupMethodCreator(this,
doubleType) {
@Override
public void printReturnTarget() {
println("return target.doubleValue();");
}
@Override
public String returnTemplate() {
return "double answer = {0}();\ncache.put(\"{0}\",new Double(answer));\nreturn answer;";
}
};
namesToMethodCreators.put("getDouble", doubleMethod);
// Int
JType intType = oracle.parse(int.class.getName());
LookupMethodCreator intMethod = new LookupMethodCreator(this, intType) {
@Override
public void printReturnTarget() {
println("return target.intValue();");
}
@Override
public String returnTemplate() {
return "int answer = {0}();\ncache.put(\"{0}\",new Integer(answer));\nreturn answer;";
}
};
namesToMethodCreators.put("getInt", intMethod);
// Float
JType floatType = oracle.parse(float.class.getName());
LookupMethodCreator floatMethod = new LookupMethodCreator(this, floatType) {
@Override
public String returnTemplate() {
String val = "float answer = {0}();\ncache.put(\"{0}\", new Float(answer));\nreturn answer;";
return val;
}
@Override
protected void printReturnTarget() {
println("return target.floatValue();");
}
};
namesToMethodCreators.put("getFloat", floatMethod);
// Map - use erased type for matching
JType mapType = oracle.parse(Map.class.getName()).getErasedType();
namesToMethodCreators.put("getMap",
new LookupMethodCreator(this, mapType) {
@Override
public String getReturnTypeName() {
return ConstantsMapMethodCreator.GENERIC_STRING_MAP_TYPE;
}
});
// String
JType stringType = oracle.parse(String.class.getName());
LookupMethodCreator stringMethod = new LookupMethodCreator(this,
stringType) {
@Override
public String returnTemplate() {
return "String answer = {0}();\ncache.put(\"{0}\",answer);\nreturn answer;";
}
};
namesToMethodCreators.put("getString", stringMethod);
// String Array
JType stringArray = oracle.getArrayType(stringType);
namesToMethodCreators.put("getStringArray", new LookupMethodCreator(this,
stringArray));
setNeedCache(true);
allInterfaceMethods = getAllInterfaceMethods(localizableClass);
} catch (TypeOracleException e) {
throw error(logger, e);
}
}
/**
* Create the method body associated with the given method. Arguments are
* arg0...argN.
*/
@Override
protected void emitMethodBody(TreeLogger logger, JMethod method,
GwtLocale locale) throws UnableToCompleteException {
checkMethod(logger, method);
if (method.getParameters().length == 1) {
String name = method.getName();
AbstractMethodCreator c = namesToMethodCreators.get(name);
if (c != null) {
c.createMethodFor(logger, method, name, null, locale);
return;
}
}
// fall through
super.emitMethodBody(logger, method, locale);
}
/**
* Checks that the method has the right structure to implement
* <code>Constant</code>.
*
* @param method method to check
*/
private void checkMethod(TreeLogger logger, JMethod method)
throws UnableToCompleteException {
if (namesToMethodCreators.get(method.getName()) != null) {
JParameter[] params = method.getParameters();
// user may have specified a method named getInt/etc with no parameters
// this isn't a conflict, so treat them like any other Constant methods
if (params.length == 0) {
checkConstantMethod(logger, method);
} else {
if (params.length != 1
|| !params[0].getType().getQualifiedSourceName().equals(
"java.lang.String")) {
throw error(logger, method + " must have a single String argument.");
}
checkReturnType(logger, method);
}
} else {
checkConstantMethod(logger, method);
}
}
}