| // 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 static com.android.tools.r8.utils.FileUtils.CLASS_EXTENSION; |
| |
| import com.android.tools.r8.ClassFileResourceProvider; |
| import com.android.tools.r8.Resource; |
| import com.google.common.collect.Sets; |
| import java.io.File; |
| import java.nio.file.Path; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| /** |
| * Lazy resource provider returning class file resources based |
| * on filesystem directory content. |
| */ |
| public final class DirectoryClassFileProvider implements ClassFileResourceProvider { |
| private final Path root; |
| |
| private DirectoryClassFileProvider(Path root) { |
| this.root = root; |
| } |
| |
| @Override |
| public Set<String> getClassDescriptors() { |
| HashSet<String> result = Sets.newHashSet(); |
| collectClassDescriptors(root, result); |
| return result; |
| } |
| |
| private void collectClassDescriptors(Path dir, Set<String> result) { |
| File file = dir.toFile(); |
| if (file.exists()) { |
| File[] files = file.listFiles(); |
| if (files != null) { |
| for (File child : files) { |
| if (child.isDirectory()) { |
| collectClassDescriptors(child.toPath(), result); |
| } else { |
| String relative = root.relativize(child.toPath()).toString(); |
| if (relative.endsWith(CLASS_EXTENSION)) { |
| result.add("L" + relative.substring( |
| 0, relative.length() - CLASS_EXTENSION.length()) + ";"); |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| @Override |
| public Resource getResource(String descriptor) { |
| assert DescriptorUtils.isClassDescriptor(descriptor); |
| |
| // Build expected file path based on type descriptor. |
| String classBinaryName = DescriptorUtils.getClassBinaryNameFromDescriptor(descriptor); |
| Path filePath = root.resolve(classBinaryName + CLASS_EXTENSION); |
| File file = filePath.toFile(); |
| |
| return (file.exists() && !file.isDirectory()) |
| ? Resource.fromFile(Resource.Kind.CLASSFILE, filePath) : null; |
| } |
| |
| /** Create resource provider from directory path. */ |
| public static ClassFileResourceProvider fromDirectory(Path dir) { |
| return new DirectoryClassFileProvider(dir.toAbsolutePath()); |
| } |
| |
| public Path getRoot() { |
| return root; |
| } |
| |
| @Override |
| public String toString() { |
| return "directory(" + root + ")"; |
| } |
| } |