blob: 136ae2aad872064dc67ba1849a34d9b1eac8ea72 [file] [log] [blame]
// 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.DescriptorUtils.JAVA_PACKAGE_SEPARATOR;
import static com.android.tools.r8.utils.FileUtils.CLASS_EXTENSION;
import com.android.tools.r8.ResourceException;
import com.android.tools.r8.StringResource;
import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.position.TextPosition;
import com.google.common.collect.Sets;
import java.util.Set;
public class MainDexListParser {
public static DexType parseEntry(String clazz, DexItemFactory itemFactory) {
if (!clazz.endsWith(CLASS_EXTENSION)) {
throw new CompilationError("Illegal main-dex-list entry '" + clazz + "'.");
}
String name = clazz.substring(0, clazz.length() - CLASS_EXTENSION.length());
if (name.contains("" + JAVA_PACKAGE_SEPARATOR)) {
throw new CompilationError("Illegal main-dex-list entry '" + clazz + "'.");
}
String descriptor = "L" + name + ";";
return itemFactory.createType(descriptor);
}
public static Set<DexType> parseList(StringResource resource, DexItemFactory itemFactory) {
String lines;
try {
lines = resource.getString();
} catch (ResourceException e) {
throw new CompilationError("Failed to parse main-dex resource", e, resource.getOrigin());
}
Set<DexType> result = Sets.newIdentityHashSet();
int lineNumber = 0;
for (int offset = 0; offset < lines.length(); ) {
++lineNumber;
int newLineIndex = lines.indexOf('\n', offset);
int lineEnd = newLineIndex == -1 ? lines.length() : newLineIndex;
String line = StringUtils.trim(lines.substring(offset, lineEnd));
if (!line.isEmpty()) {
try {
result.add(parseEntry(line, itemFactory));
} catch (CompilationError e) {
throw new CompilationError(
e.getMessage(),
e,
resource.getOrigin(),
new TextPosition(offset, lineNumber, TextPosition.UNKNOWN_COLUMN));
}
}
offset = lineEnd + 1;
}
return result;
}
}