| // Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| package com.android.tools.r8.utils; | |
| import com.android.tools.r8.ClassFileResourceProvider; | |
| import com.android.tools.r8.ProgramResource; | |
| import com.android.tools.r8.ProgramResource.Kind; | |
| import com.android.tools.r8.origin.Origin; | |
| import com.google.common.collect.Sets; | |
| import java.util.Collections; | |
| import java.util.HashMap; | |
| import java.util.Map; | |
| import java.util.Set; | |
| /** | |
| * Lazy Java class file resource provider based on preloaded/prebuilt context. | |
| */ | |
| public final class PreloadedClassFileProvider implements ClassFileResourceProvider { | |
| private static class ClassDescriptorOrigin extends Origin { | |
| private final String descriptor; | |
| public ClassDescriptorOrigin(String descriptor) { | |
| super(Origin.unknown()); | |
| this.descriptor = descriptor; | |
| } | |
| @Override | |
| public String part() { | |
| return descriptor; | |
| } | |
| } | |
| private final Map<String, byte[]> content; | |
| private PreloadedClassFileProvider(Map<String, byte[]> content) { | |
| this.content = content; | |
| } | |
| @Override | |
| public Set<String> getClassDescriptors() { | |
| return Sets.newHashSet(content.keySet()); | |
| } | |
| @Override | |
| public ProgramResource getProgramResource(String descriptor) { | |
| byte[] bytes = content.get(descriptor); | |
| if (bytes == null) { | |
| return null; | |
| } | |
| return ProgramResource.fromBytes( | |
| new ClassDescriptorOrigin(descriptor), Kind.CF, bytes, Collections.singleton(descriptor)); | |
| } | |
| public static ClassFileResourceProvider fromClassData(String descriptor, byte[] data) { | |
| Builder builder = builder(); | |
| builder.addResource(descriptor, data); | |
| return builder.build(); | |
| } | |
| @Override | |
| public String toString() { | |
| return content.size() + " preloaded resources"; | |
| } | |
| /** | |
| * Create a new empty builder. | |
| */ | |
| public static Builder builder() { | |
| return new Builder(); | |
| } | |
| public static final class Builder { | |
| private Map<String, byte[]> content = new HashMap<>(); | |
| private Builder() { | |
| } | |
| public Builder addResource(String descriptor, byte[] bytes) { | |
| assert content != null; | |
| assert descriptor != null; | |
| assert bytes != null; | |
| assert !content.containsKey(descriptor); | |
| content.put(descriptor, bytes); | |
| return this; | |
| } | |
| public PreloadedClassFileProvider build() { | |
| assert content != null; | |
| PreloadedClassFileProvider provider = new PreloadedClassFileProvider(content); | |
| content = null; | |
| return provider; | |
| } | |
| } | |
| } |