in nullaway/src/main/java/com/uber/nullaway/handlers/StubxCacheUtil.java [120:191]
public void parseStubStream(InputStream stubxInputStream, String stubxLocation)
throws IOException {
String[] strings;
DataInputStream in = new DataInputStream(stubxInputStream);
// Read and check the magic version number
if (in.readInt() != VERSION_1_FILE_MAGIC_NUMBER) {
throw new Error("Invalid file version/magic number for stubx file!" + stubxLocation);
}
// Read the number of strings in the string dictionary
int numStrings = in.readInt();
// Populate the string dictionary {idx => value}, where idx is encoded by the string position
// inside this section.
strings = new String[numStrings];
for (int i = 0; i < numStrings; ++i) {
strings[i] = in.readUTF();
}
// Read the number of (package, annotation) entries
int numPackages = in.readInt();
// Read each (package, annotation) entry, where the int values point into the string
// dictionary loaded before.
for (int i = 0; i < numPackages; ++i) {
in.readInt(); // String packageName = strings[in.readInt()];
in.readInt(); // String annotation = strings[in.readInt()];
}
// Read the number of (type, annotation) entries
int numTypes = in.readInt();
// Read each (type, annotation) entry, where the int values point into the string
// dictionary loaded before.
for (int i = 0; i < numTypes; ++i) {
in.readInt(); // String typeName = strings[in.readInt()];
in.readInt(); // String annotation = strings[in.readInt()];
}
// Read the number of (method, annotation) entries
int numMethods = in.readInt();
// Read each (method, annotation) record
for (int i = 0; i < numMethods; ++i) {
String methodSig = strings[in.readInt()];
String annotation = strings[in.readInt()];
LOG(DEBUG, "DEBUG", "method: " + methodSig + ", return annotation: " + annotation);
cacheAnnotation(methodSig, RETURN, annotation);
}
// Read the number of (method, argument, annotation) entries
int numArgumentRecords = in.readInt();
// Read each (method, argument, annotation) record
for (int i = 0; i < numArgumentRecords; ++i) {
String methodSig = strings[in.readInt()];
if (methodSig.lastIndexOf(':') == -1 || methodSig.split(":")[0].lastIndexOf('.') == -1) {
throw new Error(
"Invalid method signature " + methodSig + " in stubx file " + stubxLocation);
}
int argNum = in.readInt();
String annotation = strings[in.readInt()];
LOG(
DEBUG,
"DEBUG",
"method: " + methodSig + ", argNum: " + argNum + ", arg annotation: " + annotation);
cacheAnnotation(methodSig, argNum, annotation);
}
// reading the NullMarked classes
int numNullMarkedClasses = in.readInt();
for (int i = 0; i < numNullMarkedClasses; i++) {
this.nullMarkedClassesCache.add(strings[in.readInt()]);
}
// read the number of nullable upper bound entries
int numClassesWithNullableUpperBounds = in.readInt();
for (int i = 0; i < numClassesWithNullableUpperBounds; i++) {
int numParams = in.readInt();
for (int j = 0; j < numParams; j++) {
cacheUpperBounds(strings[in.readInt()], in.readInt());
}
}
}