blob: 94a6be66bd6dcfba7ac55aed22eb43035f49be58 [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.dev.jjs;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.dev.javac.CompilationState;
import com.google.gwt.dev.javac.testing.impl.JavaResourceBase;
import com.google.gwt.dev.javac.testing.impl.MockJavaResource;
import com.google.gwt.dev.jjs.ast.JDeclaredType;
import com.google.gwt.dev.jjs.ast.JMethod;
import com.google.gwt.dev.jjs.ast.JProgram;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Constructs a Java AST for testing.
*/
public class JavaAstConstructor {
public static final MockJavaResource ASYNCFRAGMENTLOADER = new MockJavaResource(
"com.google.gwt.core.client.impl.AsyncFragmentLoader") {
@Override
public CharSequence getContent() {
StringBuilder code = new StringBuilder();
code.append("package com.google.gwt.core.client.impl;\n");
code.append("import com.google.gwt.core.client.RunAsyncCallback;\n");
code.append("public class AsyncFragmentLoader {\n");
code.append(" public static void onLoad(int fragment) { }\n");
code.append(" public static void runAsync(int fragment, RunAsyncCallback callback) { }\n");
code.append(" public static AsyncFragmentLoader BROWSER_LOADER =\n");
code.append(" makeBrowserLoader(1, new int[] {});\n");
code.append(" private static AsyncFragmentLoader makeBrowserLoader(\n");
code.append(" int numSp, int[] initial) {\n");
code.append(" return null;\n");
code.append(" }\n");
code.append("}\n");
return code;
}
};
public static final MockJavaResource ARRAY = new MockJavaResource("com.google.gwt.lang.Array") {
@Override
public CharSequence getContent() {
StringBuilder code = new StringBuilder();
code.append("package com.google.gwt.lang;\n");
code.append("import com.google.gwt.core.client.JavaScriptObject;\n");
code.append("public final class Array {\n");
code.append(" static void setCheck(Array array, int index, Object value) { }\n");
code.append(" static void initDim(Class arrayClass, JavaScriptObject castableTypeMap, int queryId, int length, int seedType) { }\n");
code.append(" static void initDims(Class arrayClasses[], JavaScriptObject[] castableTypeMapExprs, int[] queryIdExprs, int[] dimExprs, int count, int seedType) { }\n");
code.append(" static void initValues(Class arrayClass, JavaScriptObject castableTypeMap, int queryId, Array array) { }\n");
code.append(" public int length = 0;\n");
code.append(" protected Class<?> arrayClass = null;\n");
code.append("}\n");
return code;
}
};
public static final MockJavaResource CAST = new MockJavaResource("com.google.gwt.lang.Cast") {
@Override
public CharSequence getContent() {
StringBuilder code = new StringBuilder();
code.append("package com.google.gwt.lang;\n");
code.append("public final class Cast {\n");
code.append(" public static Object dynamicCast(Object src, int dstId) { return src;}\n");
code.append(" public static boolean instanceOf(Object src, int dstId) { return false;}\n");
code.append(" public static native boolean isNull(Object a) /*-{ }-*/;\n");
code.append(" public static native boolean isNotNull(Object a) /*-{ }-*/;\n");
code.append(" public static native boolean jsEquals(Object a, Object b) /*-{ }-*/;\n");
code.append(" public static native boolean jsNotEquals(Object a, Object b) /*-{ }-*/;\n");
code.append("}\n");
return code;
}
};
public static final MockJavaResource CLASS = new MockJavaResource("java.lang.Class") {
@Override
public CharSequence getContent() {
StringBuilder code = new StringBuilder();
code.append("package java.lang;\n");
code.append("import com.google.gwt.core.client.JavaScriptObject;\n");
code.append("public final class Class<T> {\n");
code.append(" static <T> Class<T> createForArray(String packageName, String className, String seedName, Class<?> componentType) { return new Class<T>(); }\n");
code.append(" static <T> Class<T> createForClass(String packageName, String className, String seedName, Class<? super T> superclass) { return new Class<T>(); }\n");
code.append(" static <T> Class<T> createForEnum(String packageName, String className, String seedName, Class<? super T> superclass, JavaScriptObject enumConstantsFunc, JavaScriptObject enumValueOfFunc) { return new Class<T>(); }\n");
code.append(" static <T> Class<T> createForInterface(String packageName, String className) { return new Class<T>(); }\n");
code.append(" static <T> Class<T> createForPrimitive(String packageName, String className, String jni) { return new Class<T>(); }\n");
code.append(" static boolean isClassMetadataEnabled() { return true; }\n");
code.append(" public boolean desiredAssertionStatus() { return true; }\n");
code.append(" public String getName() { return null; }\n");
code.append("}\n");
return code;
}
};
public static final MockJavaResource CLASSLITERALHOLDER = new MockJavaResource(
"com.google.gwt.lang.ClassLiteralHolder") {
@Override
public CharSequence getContent() {
StringBuilder code = new StringBuilder();
code.append("package com.google.gwt.lang;\n");
code.append("final class ClassLiteralHolder {\n");
code.append("}\n");
return code;
}
};
public static final MockJavaResource ENUM = new MockJavaResource("java.lang.Enum") {
@Override
public CharSequence getContent() {
StringBuilder code = new StringBuilder();
code.append("package java.lang;\n");
code.append("import java.io.Serializable;\n");
code.append("import com.google.gwt.core.client.JavaScriptObject;\n");
code.append("public abstract class Enum<E extends Enum<E>> implements Serializable {\n");
code.append(" public static native <T extends Enum<T>> T valueOf(Class<T> enumType, String name) /*-{ }-*/;\n");
code.append(" protected static native <T extends Enum<T>> JavaScriptObject createValueOfMap(T[] enumConstants) /*-{ }-*/;\n");
code.append(" protected static native <T extends Enum<T>> T valueOf(JavaScriptObject map, String name) /*-{ }-*/;\n");
code.append(" protected Enum(String name, int ordinal) { \n");
code.append(" this.name = name;\n");
code.append(" this.ordinal = ordinal;}\n");
code.append(" private final String name;\n");
code.append(" private final int ordinal;\n");
code.append(" public final String name() { return name; }\n");
code.append(" public final int ordinal() { return ordinal; }\n");
code.append("}\n");
return code;
}
};
public static final MockJavaResource GWT =
new MockJavaResource("com.google.gwt.core.client.GWT") {
@Override
public CharSequence getContent() {
StringBuilder code = new StringBuilder();
code.append("package com.google.gwt.core.client;\n");
code.append("public final class GWT {\n");
code.append(" public static <T> T create(Class<?> classLiteral) { return null; }");
code.append(" public static boolean isClient() { return true; };\n");
code.append(" public static boolean isProdMode() { return true; };\n");
code.append(" public static boolean isScript() { return true; };\n");
code.append(" public static void runAsync(RunAsyncCallback callback) { }\n");
code.append(" public static void runAsync(Class<?> name, RunAsyncCallback callback) { }\n");
code.append("}\n");
return code;
}
};
public static final MockJavaResource RUNASYNCCALLBACK = new MockJavaResource(
"com.google.gwt.core.client.RunAsyncCallback") {
@Override
public CharSequence getContent() {
StringBuilder code = new StringBuilder();
code.append("package com.google.gwt.core.client;\n");
code.append("public interface RunAsyncCallback {\n");
code.append(" void onSuccess();\n");
code.append("}\n");
return code;
}
};
public static final MockJavaResource RUNASYNCCODE = new MockJavaResource(
"com.google.gwt.core.client.prefetch.RunAsyncCode") {
@Override
public CharSequence getContent() {
StringBuilder code = new StringBuilder();
code.append("package com.google.gwt.core.client.prefetch;\n");
code.append("public class RunAsyncCode {\n");
code.append(" public static RunAsyncCode runAsyncCode(Class<?> splitPoint) {\n");
code.append(" return null;\n");
code.append(" }");
code.append("}");
return code;
}
};
public static final MockJavaResource STATS = new MockJavaResource("com.google.gwt.lang.Stats") {
@Override
public CharSequence getContent() {
StringBuilder code = new StringBuilder();
code.append("package com.google.gwt.lang;\n");
code.append("public class Stats {\n");
code.append(" static boolean isStatsAvailable() { return false; };\n");
code.append(" static boolean onModuleStart(String mainClassName) { return false; }\n");
code.append("}\n");
return code;
}
};
public static JProgram construct(TreeLogger logger, CompilationState state, String... entryPoints)
throws UnableToCompleteException {
JJSOptionsImpl options = new JJSOptionsImpl();
options.setEnableAssertions(true);
JProgram jprogram = AstConstructor.construct(logger, state, options);
// Add entry methods for entry points.
for (String entryPoint : entryPoints) {
JDeclaredType entryType = jprogram.getFromTypeMap(entryPoint);
for (JMethod method : entryType.getMethods()) {
if (method.isStatic() && JProgram.isClinit(method)) {
jprogram.addEntryMethod(method);
}
}
}
// Tree is now ready to optimize.
return jprogram;
}
public static MockJavaResource[] getCompilerTypes() {
List<MockJavaResource> result = new ArrayList<MockJavaResource>();
Collections.addAll(result, JavaResourceBase.getStandardResources());
// Replace the basic Class and Enum with a compiler-specific one.
result.remove(JavaResourceBase.CLASS);
result.remove(JavaResourceBase.ENUM);
Collections.addAll(result, ASYNCFRAGMENTLOADER, ARRAY, CAST, CLASS, CLASSLITERALHOLDER, ENUM,
GWT, RUNASYNCCALLBACK, RUNASYNCCODE);
return result.toArray(new MockJavaResource[result.size()]);
}
}