blob: 1374bd97bfd75352a44f8bb5ace08cd21a14f89e [file] [log] [blame]
/*
* Copyright 2014 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.impl;
import com.google.gwt.dev.jjs.SourceOrigin;
import com.google.gwt.dev.jjs.ast.Context;
import com.google.gwt.dev.jjs.ast.JBinaryOperation;
import com.google.gwt.dev.jjs.ast.JBinaryOperator;
import com.google.gwt.dev.jjs.ast.JConditional;
import com.google.gwt.dev.jjs.ast.JConstructor;
import com.google.gwt.dev.jjs.ast.JDeclaredType;
import com.google.gwt.dev.jjs.ast.JField;
import com.google.gwt.dev.jjs.ast.JMethod;
import com.google.gwt.dev.jjs.ast.JPrimitiveType;
import com.google.gwt.dev.jjs.ast.JProgram;
import com.google.gwt.dev.jjs.ast.JVariable;
import com.google.gwt.thirdparty.guava.common.base.Function;
import com.google.gwt.thirdparty.guava.common.collect.FluentIterable;
import com.google.gwt.thirdparty.guava.common.collect.ImmutableSet;
import com.google.gwt.thirdparty.guava.common.collect.Sets;
import java.util.Arrays;
import java.util.Set;
/**
* Test for {@link JChangeTrackingVisitor}.
*/
public class JChangeTrackingVisitorTest extends JJSTestBase {
private static final class AddParamWhenEnterMethodVisitor extends JChangeTrackingVisitor {
public AddParamWhenEnterMethodVisitor(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public boolean enter(JMethod x, Context ctx) {
x.createParameter(SourceOrigin.UNKNOWN, "_newParam_enter", JPrimitiveType.INT);
return true;
}
}
private static final class AddParamWhenExitMethodVisitor extends JChangeTrackingVisitor {
public AddParamWhenExitMethodVisitor(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public void exit(JMethod x, Context ctx) {
x.createParameter(SourceOrigin.UNKNOWN, "_newParam_exit", JPrimitiveType.INT);
}
}
private static final class AddParamsWhenEnterAndExitMethodVisitor extends JChangeTrackingVisitor {
public AddParamsWhenEnterAndExitMethodVisitor(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public boolean enter(JMethod x, Context ctx) {
x.createParameter(SourceOrigin.UNKNOWN, "_newParam_enter", JPrimitiveType.INT);
return true;
}
@Override
public void exit(JMethod x, Context ctx) {
x.createParameter(SourceOrigin.UNKNOWN, "_newParam_exit", JPrimitiveType.INT);
}
}
private static final class AddParamWhenEnterNonConstructorMethodVisitor extends
JChangeTrackingVisitor {
public AddParamWhenEnterNonConstructorMethodVisitor(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public boolean enter(JMethod x, Context ctx) {
x.createParameter(SourceOrigin.UNKNOWN, "_newParam_enter", JPrimitiveType.INT);
return true;
}
@Override
public boolean enter(JConstructor x, Context ctx) {
return true;
}
}
private static final class AddParamWhenExitNonConstructorMethodVisitor extends
JChangeTrackingVisitor {
public AddParamWhenExitNonConstructorMethodVisitor(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public void exit(JMethod x, Context ctx) {
x.createParameter(SourceOrigin.UNKNOWN, "_newParam_exit", JPrimitiveType.INT);
}
@Override
public void exit(JConstructor x, Context ctx) {
return;
}
}
private static final class SetVariableOfIntToLongByEnterVisitor extends JChangeTrackingVisitor {
public SetVariableOfIntToLongByEnterVisitor(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public boolean enter(JVariable x, Context ctx) {
if (x.getType().equals(JPrimitiveType.INT)) {
x.setType(JPrimitiveType.LONG);
madeChanges();
}
return true;
}
}
private static final class SetVariableOfIntToLongByExitVisitor extends JChangeTrackingVisitor {
public SetVariableOfIntToLongByExitVisitor(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public void exit(JVariable x, Context ctx) {
if (x.getType().equals(JPrimitiveType.INT)) {
x.setType(JPrimitiveType.LONG);
madeChanges();
}
}
}
private static final class SetNonFieldVariableOfIntToLongByEnterVisitor extends
JChangeTrackingVisitor {
public SetNonFieldVariableOfIntToLongByEnterVisitor(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public boolean enter(JVariable x, Context ctx) {
if (x.getType().equals(JPrimitiveType.INT)) {
x.setType(JPrimitiveType.LONG);
madeChanges();
}
return true;
}
@Override
public boolean enter(JField x, Context ctx) {
return true;
}
}
private static final class SetNonFieldVariableOfIntToLongByExitVisitor extends
JChangeTrackingVisitor {
public SetNonFieldVariableOfIntToLongByExitVisitor(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public void exit(JVariable x, Context ctx) {
if (x.getType().equals(JPrimitiveType.INT)) {
x.setType(JPrimitiveType.LONG);
madeChanges();
}
}
@Override
public void exit(JField x, Context ctx) {
return;
}
}
private static final class SetFieldOfIntToLongByEnterVisitor extends JChangeTrackingVisitor {
public SetFieldOfIntToLongByEnterVisitor(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public boolean enter(JField x, Context ctx) {
if (x.getType().equals(JPrimitiveType.INT)) {
x.setType(JPrimitiveType.LONG);
madeChanges();
}
return true;
}
}
private static final class SetFieldOfIntToLongByExitVisitor extends JChangeTrackingVisitor {
public SetFieldOfIntToLongByExitVisitor(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public void exit(JField x, Context ctx) {
if (x.getType().equals(JPrimitiveType.INT)) {
x.setType(JPrimitiveType.LONG);
madeChanges();
}
}
}
private static final class ReplaceConditionalExprWithItsThenExprVisitor extends
JChangeTrackingVisitor {
public ReplaceConditionalExprWithItsThenExprVisitor(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public void endVisit(JConditional x, Context ctx) {
ctx.replaceMe(x.getThenExpr());
}
}
private static final class ReplaceAddOperationWithItsFirstOperandVisitor extends
JChangeTrackingVisitor {
public ReplaceAddOperationWithItsFirstOperandVisitor(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public void endVisit(JBinaryOperation x, Context ctx) {
if (x.getOp() == JBinaryOperator.ADD) {
ctx.replaceMe(x.getLhs());
}
}
}
private static final class SetFieldOfIntToLongVisitor extends JChangeTrackingVisitor {
public SetFieldOfIntToLongVisitor(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public void exit(JField x, Context ctx) {
if (x.getType().equals(JPrimitiveType.INT)) {
x.setType(JPrimitiveType.LONG);
madeChanges();
}
}
}
private static final class RemoveMethodsWithThreeParamsVisitor extends JChangeTrackingVisitor {
public RemoveMethodsWithThreeParamsVisitor(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public boolean visit(JDeclaredType x, Context ctx) {
for (int i = 1; i < x.getMethods().size(); ++i) {
JMethod method = x.getMethods().get(i);
if (method.getParams().size() == 3) {
wasRemoved(method);
x.removeMethod(i);
madeChanges();
--i;
}
}
return false;
}
}
private static final class RemoveFieldsOfLongType extends JChangeTrackingVisitor {
public RemoveFieldsOfLongType(OptimizerContext optimizerCtx) {
super(optimizerCtx);
}
@Override
public boolean visit(JDeclaredType x, Context ctx) {
for (int i = 0; i < x.getFields().size(); ++i) {
JField field = x.getFields().get(i);
if (field.getType().equals(JPrimitiveType.LONG)) {
wasRemoved(field);
x.removeField(i);
madeChanges();
--i;
}
}
return false;
}
}
public void testAddParamWhenEnterMethodVisitor() throws Exception {
addSnippetClassDecl("static class A {", " public int field;",
" public A(int f) { field = f; }",
" public void fun () { for(int i = 3; i < 4; i++) i = 8; }", "}");
JProgram program = compileSnippet("void", "");
AddParamWhenEnterMethodVisitor addParamWhenEnterMethodVisitor =
new AddParamWhenEnterMethodVisitor(new FullOptimizerContext(program));
addParamWhenEnterMethodVisitor.accept(program);
assertParameterTypes(program, "test.EntryPoint$A.fun()V", "int");
assertParameterTypes(program, "test.EntryPoint$A.EntryPoint$A(I) <init>", "int", "int");
}
public void testAddParamWhenExitMethodVisitor() throws Exception {
addSnippetClassDecl("static class A {", " public int field;",
" public A(int f) { field = f; }",
" public void fun () { for(int i = 3; i < 4; i++) i = 8; }", "}");
JProgram program = compileSnippet("void", "");
AddParamWhenExitMethodVisitor addParamWhenExitMethodVisitor =
new AddParamWhenExitMethodVisitor(new FullOptimizerContext(program));
addParamWhenExitMethodVisitor.accept(program);
assertParameterTypes(program, "test.EntryPoint$A.fun()V", "int");
assertParameterTypes(program, "test.EntryPoint$A.EntryPoint$A(I) <init>", "int", "int");
}
public void testAddParamsWhenEnterAndExitMethodVisitor() throws Exception {
addSnippetClassDecl("static class A {", " public int field;",
" public A(int f) { field = f; }",
" public void fun () { for(int i = 3; i < 4; i++) i = 8; }", "}");
JProgram program = compileSnippet("void", "");
AddParamsWhenEnterAndExitMethodVisitor addParamsWhenEnterAndExitMethodVisitor =
new AddParamsWhenEnterAndExitMethodVisitor(new FullOptimizerContext(program));
addParamsWhenEnterAndExitMethodVisitor.accept(program);
assertParameterTypes(program, "test.EntryPoint$A.fun()V", "int", "int");
assertParameterTypes(program, "test.EntryPoint$A.EntryPoint$A(I) <init>", "int", "int", "int");
}
public void testAddParamWhenEnterNonConstructorMethodVisitor() throws Exception {
addSnippetClassDecl("static class A {", " public int field;",
" public A(int f) { field = f; }",
" public void fun () { for(int i = 3; i < 4; i++) i = 8; }", "}");
JProgram program = compileSnippet("void", "");
AddParamWhenEnterNonConstructorMethodVisitor addParamsWhenEnterNonConstructorMethodVisitor =
new AddParamWhenEnterNonConstructorMethodVisitor(new FullOptimizerContext(program));
addParamsWhenEnterNonConstructorMethodVisitor.accept(program);
assertParameterTypes(program, "test.EntryPoint$A.fun()V", "int");
assertParameterTypes(program, "test.EntryPoint$A.EntryPoint$A(I) <init>", "int");
}
public void testAddParamWhenExitNonConstructorMethodVisitor() throws Exception {
addSnippetClassDecl("static class A {", " public int field;",
" public A(int f) { field = f; }",
" public void fun () { for(int i = 3; i < 4; i++) i = 8; }", "}");
JProgram program = compileSnippet("void", "");
AddParamWhenExitNonConstructorMethodVisitor addParamsWhenExitNonConstructorMethodVisitor =
new AddParamWhenExitNonConstructorMethodVisitor(new FullOptimizerContext(program));
addParamsWhenExitNonConstructorMethodVisitor.accept(program);
assertParameterTypes(program, "test.EntryPoint$A.fun()V", "int");
assertParameterTypes(program, "test.EntryPoint$A.EntryPoint$A(I) <init>", "int");
}
public void testSetVariableOfIntToLongByEnterVisitor() throws Exception {
addSnippetClassDecl("static class A {", "public int field1;", "public double field2;",
"public void fun(int a) { a++; }", "}");
JProgram program = compileSnippet("void", "");
SetVariableOfIntToLongByEnterVisitor setVariableOfIntToLongByEnterVisitor =
new SetVariableOfIntToLongByEnterVisitor(new FullOptimizerContext(program));
setVariableOfIntToLongByEnterVisitor.accept(program);
assertEquals("long field1",
findField(program.getFromTypeMap("test.EntryPoint$A"), "field1").toString());
assertEquals("double field2",
findField(program.getFromTypeMap("test.EntryPoint$A"), "field2").toString());
assertParameterTypes(program, "test.EntryPoint$A.fun(I)V", "long");
}
public void testSetVariableOfIntToLongByExitVisitor() throws Exception {
addSnippetClassDecl("static class A {", "public int field1;", "public double field2;",
"public void fun(int a) { a++; }", "}");
JProgram program = compileSnippet("void", "");
SetVariableOfIntToLongByExitVisitor setVariableOfIntToLongByExitVisitor =
new SetVariableOfIntToLongByExitVisitor(new FullOptimizerContext(program));
setVariableOfIntToLongByExitVisitor.accept(program);
assertEquals("long field1",
findField(program.getFromTypeMap("test.EntryPoint$A"), "field1").toString());
assertEquals("double field2",
findField(program.getFromTypeMap("test.EntryPoint$A"), "field2").toString());
assertParameterTypes(program, "test.EntryPoint$A.fun(I)V", "long");
}
public void testSetNonFieldVariableOfIntToLongByEnterVisitor() throws Exception {
addSnippetClassDecl("static class A {", "public int field1;", "public double field2;",
"public void fun(int a) { a++; }", "}");
JProgram program = compileSnippet("void", "");
SetNonFieldVariableOfIntToLongByEnterVisitor setNonFieldVariableOfIntToLongByEnterVisitor =
new SetNonFieldVariableOfIntToLongByEnterVisitor(new FullOptimizerContext(program));
setNonFieldVariableOfIntToLongByEnterVisitor.accept(program);
assertEquals("int field1",
findField(program.getFromTypeMap("test.EntryPoint$A"), "field1").toString());
assertEquals("double field2",
findField(program.getFromTypeMap("test.EntryPoint$A"), "field2").toString());
assertParameterTypes(program, "test.EntryPoint$A.fun(I)V", "long");
}
public void testSetNonFieldVariableOfIntToLongByExitVisitor() throws Exception {
addSnippetClassDecl("static class A {", "public int field1;", "public double field2;",
"public void fun(int a) { a++; }", "}");
JProgram program = compileSnippet("void", "");
SetNonFieldVariableOfIntToLongByExitVisitor setNonFieldVariableOfIntToLongByExitVisitor =
new SetNonFieldVariableOfIntToLongByExitVisitor(new FullOptimizerContext(program));
setNonFieldVariableOfIntToLongByExitVisitor.accept(program);
assertEquals("int field1",
findField(program.getFromTypeMap("test.EntryPoint$A"), "field1").toString());
assertEquals("double field2",
findField(program.getFromTypeMap("test.EntryPoint$A"), "field2").toString());
assertParameterTypes(program, "test.EntryPoint$A.fun(I)V", "long");
}
public void testSetFieldOfIntToLongByEnterVisitor() throws Exception {
addSnippetClassDecl("static class A {", "public int field1;", "public double field2;",
"public void fun(int a) { a++; }", "}");
JProgram program = compileSnippet("void", "");
SetFieldOfIntToLongByEnterVisitor setFieldOfIntToLongByEnterVisitor =
new SetFieldOfIntToLongByEnterVisitor(new FullOptimizerContext(program));
setFieldOfIntToLongByEnterVisitor.accept(program);
assertEquals("long field1",
findField(program.getFromTypeMap("test.EntryPoint$A"), "field1").toString());
assertEquals("double field2",
findField(program.getFromTypeMap("test.EntryPoint$A"), "field2").toString());
assertParameterTypes(program, "test.EntryPoint$A.fun(I)V", "int");
}
public void testSetFieldOfIntToLongByExitVisitor() throws Exception {
addSnippetClassDecl("static class A {", "public int field1;", "public double field2;",
"public void fun(int a) { a++; }", "}");
JProgram program = compileSnippet("void", "");
SetFieldOfIntToLongByExitVisitor setFieldOfIntToLongByExitVisitor =
new SetFieldOfIntToLongByExitVisitor(new FullOptimizerContext(program));
setFieldOfIntToLongByExitVisitor.accept(program);
assertEquals("long field1",
findField(program.getFromTypeMap("test.EntryPoint$A"), "field1").toString());
assertEquals("double field2",
findField(program.getFromTypeMap("test.EntryPoint$A"), "field2").toString());
assertParameterTypes(program, "test.EntryPoint$A.fun(I)V", "int");
}
public void testInitialModifications() throws Exception {
addSnippetClassDecl("static class A {", " public int field;",
" public A(int f) { field = f; }",
" public void fun () { for(int i = 3; i < 4; i++) i = 8; }", "}");
JProgram program = compileSnippet("void", "");
OptimizerContext optimizerCtx = new FullOptimizerContext(program);
int countMethod = 0;
int countField = 0;
for (JDeclaredType type : program.getModuleDeclaredTypes()) {
for (JMethod method : type.getMethods()) {
assertTrue(optimizerCtx.getModifiedMethodsSince(0).contains(method));
}
for (JField field : type.getFields()) {
assertTrue(optimizerCtx.getModifiedFieldsSince(0).contains(field));
}
countMethod += type.getMethods().size();
countField += type.getFields().size();
}
assertEquals(countMethod, optimizerCtx.getModifiedMethodsSince(0).size());
assertEquals(countField, optimizerCtx.getModifiedFieldsSince(0).size());
}
public void testModificationTracking() throws Exception {
addSnippetClassDecl("static class A {",
" public double field;",
" public static int staticField = 1 < 2 ? 1 : 0;",
" public int instanceField = 1 + 1;",
" public A(double f) { field = f; }",
" public void fun1 () { for(int i = 3; i < 4; i++) i = 8; }",
" public int fun2 (int a) { return a > 1 ? 1 : 0; }",
" public void fun3 () { int a; for(int i = 3; i < 4; i++) a = i < 4 ? 1 : 0; }",
" public int fun4 (int a, int b) { return a + b; }",
" public int fun5 (int a, int b, int c) { return c > 0 ? a + b : a - b; }",
"}");
addSnippetClassDecl("static class B{",
" public int field1;",
" public boolean field2;",
" public char field3;",
" public short field5;",
"}");
JProgram program = compileSnippet("void", "");
OptimizerContext optimizerCtx = new FullOptimizerContext(program);
int first = optimizerCtx.getOptimizationStep();
ReplaceConditionalExprWithItsThenExprVisitor repalceConditionalExprVisitor =
new ReplaceConditionalExprWithItsThenExprVisitor(optimizerCtx);
repalceConditionalExprVisitor.accept(program.getFromTypeMap("test.EntryPoint$A"));
optimizerCtx.incOptimizationStep();
Set<JMethod> modifiedMethodsInIteration1 =
ImmutableSet.copyOf(getMethods(program, "test.EntryPoint$A",
"fun2", "fun3", "fun5", GwtAstBuilder.CLINIT_METHOD_NAME));
Set<JField> modifiedFieldsInIteration1 =
ImmutableSet.copyOf(getFields(program, "test.EntryPoint$A",
"staticField"));
assertEquals(modifiedFieldsInIteration1, optimizerCtx.getModifiedFieldsSince(first));
assertEquals(modifiedMethodsInIteration1, optimizerCtx.getModifiedMethodsSince(first));
int second = optimizerCtx.getOptimizationStep();
ReplaceAddOperationWithItsFirstOperandVisitor replaceAddOperationVisitor =
new ReplaceAddOperationWithItsFirstOperandVisitor(optimizerCtx);
replaceAddOperationVisitor.accept(program.getFromTypeMap("test.EntryPoint$A"));
optimizerCtx.incOptimizationStep();
Set<JMethod> modifiedMethodsInIteration2 =
ImmutableSet.copyOf(getMethods(program, "test.EntryPoint$A",
"fun4", "fun5", GwtAstBuilder.INIT_NAME_METHOD_NAME));
Set<JField> modifiedFieldsInIteration2 =
ImmutableSet.copyOf(getFields(program, "test.EntryPoint$A",
"instanceField", "field"));
assertEquals(modifiedFieldsInIteration2, optimizerCtx.getModifiedFieldsSince(second));
assertEquals(modifiedMethodsInIteration2, optimizerCtx.getModifiedMethodsSince(second));
assertEquals(Sets.union(modifiedFieldsInIteration1, modifiedFieldsInIteration2),
optimizerCtx.getModifiedFieldsSince(first));
assertEquals(Sets.union(modifiedMethodsInIteration1, modifiedMethodsInIteration2),
optimizerCtx.getModifiedMethodsSince(first));
int third = optimizerCtx.getOptimizationStep();
SetFieldOfIntToLongVisitor setFieldOfIntToLongVisitor =
new SetFieldOfIntToLongVisitor(optimizerCtx);
setFieldOfIntToLongVisitor.accept(program.getFromTypeMap("test.EntryPoint$B"));
optimizerCtx.incOptimizationStep();
Set<JMethod> modifiedMethodsInIteration3 = ImmutableSet.of();
Set<JField> modifiedFieldsInIteration3 =
ImmutableSet.copyOf(getFields(program, "test.EntryPoint$B",
"field1"));
assertEquals(modifiedFieldsInIteration3, optimizerCtx.getModifiedFieldsSince(third));
assertEquals(modifiedMethodsInIteration3, optimizerCtx.getModifiedMethodsSince(third));
assertEquals(Sets.union(modifiedFieldsInIteration2, modifiedFieldsInIteration3),
optimizerCtx.getModifiedFieldsSince(second));
assertEquals(Sets.union(modifiedMethodsInIteration2, modifiedMethodsInIteration3),
optimizerCtx.getModifiedMethodsSince(second));
assertEquals(Sets.union(Sets.union(
modifiedFieldsInIteration1, modifiedFieldsInIteration2), modifiedFieldsInIteration3),
optimizerCtx.getModifiedFieldsSince(first));
assertEquals(Sets.union(Sets.union(
modifiedMethodsInIteration1, modifiedMethodsInIteration2), modifiedMethodsInIteration3),
optimizerCtx.getModifiedMethodsSince(first));
Set<JMethod> methodsDeletedInIteration4 = getMethods(program, "test.EntryPoint$A", "fun5");
RemoveMethodsWithThreeParamsVisitor removeMethodsWithThreeParamsVisitor =
new RemoveMethodsWithThreeParamsVisitor(optimizerCtx);
removeMethodsWithThreeParamsVisitor.accept(program.getFromTypeMap("test.EntryPoint$A"));
assertEquals(Sets.difference(Sets.union(Sets.union(
modifiedMethodsInIteration1, modifiedMethodsInIteration2),
modifiedMethodsInIteration3),methodsDeletedInIteration4),
optimizerCtx.getModifiedMethodsSince(first));
Set<JField> fieldsDeletedInIteration4 = getFields(program, "test.EntryPoint$B", "field1");
RemoveFieldsOfLongType removeFieldsOfLongType = new RemoveFieldsOfLongType(optimizerCtx);
removeFieldsOfLongType.accept(program.getFromTypeMap("test.EntryPoint$B"));
assertEquals(Sets.difference(Sets.union(Sets.union(
modifiedFieldsInIteration1, modifiedFieldsInIteration2),
modifiedFieldsInIteration3),fieldsDeletedInIteration4),
optimizerCtx.getModifiedFieldsSince(first));
}
private Set<JMethod> getMethods(
final JProgram program, final String clazz, String... methodNames) {
return FluentIterable.from(Arrays.asList(methodNames)).transform(
new Function<String, JMethod>() {
@Override
public JMethod apply(String methodName) {
return JJSTestBase.findMethod(program.getFromTypeMap(clazz), methodName);
}
}).toSet();
}
private Set<JField> getFields(final JProgram program, final String clazz, String... fieldNames) {
return FluentIterable.from(Arrays.asList(fieldNames)).transform(
new Function<String, JField>() {
@Override
public JField apply(String fieldName) {
return JJSTestBase.findField(program.getFromTypeMap(clazz), fieldName);
}
}).toSet();
}
}