Fix bug in support for resources

This commit is contained in:
Alexey Andreev 2021-08-31 12:35:56 +03:00
parent c2f90d3cfc
commit ada2bf9c58
3 changed files with 26 additions and 2 deletions

View File

@ -25,4 +25,8 @@ final class StringAmplifier {
@PluggableDependency(StringAmplifierDependencyPlugin.class) @PluggableDependency(StringAmplifierDependencyPlugin.class)
@Unmanaged @Unmanaged
static native String amplify(String string); static native String amplify(String string);
@PluggableDependency(StringAmplifierDependencyPlugin.class)
@Unmanaged
static native String[] amplifyArray(String[] strings);
} }

View File

@ -22,6 +22,11 @@ import org.teavm.dependency.MethodDependency;
public class StringAmplifierDependencyPlugin implements DependencyPlugin { public class StringAmplifierDependencyPlugin implements DependencyPlugin {
@Override @Override
public void methodReached(DependencyAgent agent, MethodDependency method) { public void methodReached(DependencyAgent agent, MethodDependency method) {
method.getResult().propagate(agent.getType("java.lang.String")); if (method.getMethod().getName().equals("amplify")) {
method.getResult().propagate(agent.getType("java.lang.String"));
} else {
method.getResult().propagate(agent.getType("[Ljava/lang/String;"));
method.getResult().getArrayItem().propagate(agent.getType("java.lang.String"));
}
} }
} }

View File

@ -28,6 +28,7 @@ import org.teavm.model.Variable;
import org.teavm.model.instructions.InvocationType; import org.teavm.model.instructions.InvocationType;
import org.teavm.model.instructions.InvokeInstruction; import org.teavm.model.instructions.InvokeInstruction;
import org.teavm.platform.metadata.Resource; import org.teavm.platform.metadata.Resource;
import org.teavm.platform.metadata.ResourceMap;
public class StringAmplifierTransformer implements ClassHolderTransformer { public class StringAmplifierTransformer implements ClassHolderTransformer {
@Override @Override
@ -54,7 +55,21 @@ public class StringAmplifierTransformer implements ClassHolderTransformer {
MethodReference method = invoke.getMethod(); MethodReference method = invoke.getMethod();
String owningClass = method.getClassName(); String owningClass = method.getClassName();
if (hierarchy.isSuperType(Resource.class.getName(), owningClass, false)) { if (hierarchy.isSuperType(Resource.class.getName(), owningClass, false)) {
if (method.getReturnType().isObject(String.class)) { if (method.getClassName().equals(ResourceMap.class.getName())) {
if (method.getName().equals("keys")) {
Variable var = program.createVariable();
InvokeInstruction amplifyInstruction = new InvokeInstruction();
amplifyInstruction.setMethod(new MethodReference(StringAmplifier.class, "amplifyArray",
String[].class, String[].class));
amplifyInstruction.setType(InvocationType.SPECIAL);
amplifyInstruction.setArguments(var);
amplifyInstruction.setReceiver(invoke.getReceiver());
amplifyInstruction.setLocation(invoke.getLocation());
invoke.setReceiver(var);
invoke.insertNext(amplifyInstruction);
}
} else if (method.getReturnType().isObject(String.class)) {
Variable var = program.createVariable(); Variable var = program.createVariable();
InvokeInstruction amplifyInstruction = new InvokeInstruction(); InvokeInstruction amplifyInstruction = new InvokeInstruction();
amplifyInstruction.setMethod(new MethodReference(StringAmplifier.class, "amplify", amplifyInstruction.setMethod(new MethodReference(StringAmplifier.class, "amplify",