blob: 271bd29df4606439f5fb583534be04a4025c8726 [file] [log] [blame]
/*
* Copyright 2009 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.uibinder.rebind;
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.JType;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.uibinder.attributeparsers.CssNameConverter;
import com.google.gwt.uibinder.rebind.model.ImplicitCssResource;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Set;
/**
* Writes the source to implement an {@link ImplicitCssResource} interface.
*/
public class CssResourceWriter {
private static final JType[] NO_PARAMS = new JType[0];
private final ImplicitCssResource css;
private final IndentedWriter writer;
private final JClassType cssResourceType;
private final JClassType stringType;
private final CssNameConverter nameConverter;
private final MortalLogger logger;
public CssResourceWriter(ImplicitCssResource css, TypeOracle types,
PrintWriter writer, MortalLogger logger) {
this.css = css;
this.writer = new IndentedWriter(writer);
this.cssResourceType = types.findType(CssResource.class.getName());
this.stringType = types.findType(String.class.getName());
this.nameConverter = new CssNameConverter();
this.logger = logger;
}
public void write() throws UnableToCompleteException {
// Package declaration
String packageName = css.getPackageName();
if (packageName.length() > 0) {
writer.write("package %1$s;", packageName);
writer.newline();
}
JClassType superType = css.getExtendedInterface();
if (superType == null) {
superType = cssResourceType;
}
writer.write("import %s;", superType.getQualifiedSourceName());
writer.newline();
// Open interface
writer.write("public interface %s extends %s {", css.getClassName(),
superType.getSimpleSourceName());
writer.indent();
writeCssMethods(superType);
// Close interface.
writer.outdent();
writer.write("}");
}
private boolean isOverride(String methodName, JClassType superType) {
JMethod method = superType.findMethod(methodName, NO_PARAMS);
if (method != null && stringType.equals(method.getReturnType())) {
return true;
}
return false;
}
private void writeCssMethods(JClassType superType)
throws UnableToCompleteException {
Set<String> rawClassNames = css.getCssClassNames();
Map<String, String> convertedClassNames = null;
try {
convertedClassNames = nameConverter.convertSet(rawClassNames);
} catch (CssNameConverter.Failure e) {
logger.die(e.getMessage());
}
for (Map.Entry<String, String> entry : convertedClassNames.entrySet()) {
String className = entry.getValue();
/*
* Only write names that we are not overriding from super, or else we'll
* re-obfuscate any @Shared ones
*/
if (!isOverride(className, superType)) {
if (!rawClassNames.contains(className)) {
writer.write("@ClassName(\"%s\")", entry.getKey());
}
writer.write("String %s();", className);
}
}
}
}