//
// Copyright (C) 2017 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// This file specifies additional annotations that are applied to libcore
// code before generating android stubs and documentation. This data
// is human-maintained and is based on jdk annotations shipped in Android
// Studio.

// If this file is changed, please update libcore/annotated_java_files.bp file by running:
// libcore/annotations/generate_annotated_java_files.py libcore/annotations/ojluni.jaif > libcore/annotated_java_files.bp
//
// For arrray syntax, please see https://checkerframework.org/jsr308/specification/java-annotation-design.html#array-syntax
// @Nullable String @NonNull[] <- Non-null array of nullable strings can be expressed as:
//
//    type: @libcore.util.NonNull
//      inner-type 0, 0: @libcore.util.Nullable

package libcore.util:
annotation @NonNull: @java.lang.annotation.Retention(value=SOURCE) @java.lang.annotation.Target(value={TYPE_USE})
    int from
    int to
annotation @Nullable: @java.lang.annotation.Retention(value=SOURCE) @java.lang.annotation.Target(value={TYPE_USE})
    int from
    int to
annotation @NullFromTypeParam: @java.lang.annotation.Retention(value=SOURCE) @java.lang.annotation.Target(value={TYPE_USE})
    int from
    int to

package java.io:
class PrintWriter:

    method <init>(Ljava/io/Writer;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method <init>(Ljava/io/Writer;Z)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method <init>(Ljava/io/OutputStream;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method <init>(Ljava/io/OutputStream;Z)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method <init>(Ljava/lang/String;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method <init>(Ljava/nio/charset/Charset;Ljava/io/File;)V:
        return:

    method <init>(Ljava/lang/String;Ljava/lang/String;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull
        parameter #1:
            type: @libcore.util.NonNull

    method <init>(Ljava/io/File;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method <init>(Ljava/io/File;Ljava/lang/String;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull
        parameter #1:
            type: @libcore.util.NonNull

    method write([CII)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method write([C)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method write(Ljava/lang/String;II)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method write(Ljava/lang/String;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method print([C)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method print(Ljava/lang/String;)V:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method print(Ljava/lang/Object;)V:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method println(Ljava/lang/String;)V:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method println(Ljava/lang/Object;)V:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.NonNull
        parameter #1:
            type: @libcore.util.NonNull
                inner-type 0, 0: @libcore.util.Nullable

    method printf(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.Nullable
        parameter #1:
            type: @libcore.util.NonNull
        parameter #2:
            type: @libcore.util.NonNull
                inner-type 0, 0: @libcore.util.Nullable

    method format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.NonNull
        parameter #1:
            type: @libcore.util.NonNull
                inner-type 0, 0: @libcore.util.Nullable

    method format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.Nullable
        parameter #1:
            type: @libcore.util.NonNull
        parameter #2:
            type: @libcore.util.NonNull
                inner-type 0, 0: @libcore.util.Nullable

    method append(Ljava/lang/CharSequence;)Ljava/io/PrintWriter;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.Nullable

    method append(Ljava/lang/CharSequence;II)Ljava/io/PrintWriter;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.Nullable

    method append(C)Ljava/io/PrintWriter;:
        return: @libcore.util.NonNull

    method append(C)Ljava/io/Writer;:
        return: @libcore.util.NonNull

    method append(Ljava/lang/CharSequence;II)Ljava/io/Writer;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.Nullable

    method append(Ljava/lang/CharSequence;)Ljava/io/Writer;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.Nullable

    method append(C)Ljava/lang/Appendable;:
        return: @libcore.util.NonNull

    method append(Ljava/lang/CharSequence;II)Ljava/lang/Appendable;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.Nullable

    method append(Ljava/lang/CharSequence;)Ljava/lang/Appendable;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.Nullable

package java.lang:
class Appendable:
    method append(Ljava/lang/CharSequence;)Ljava/lang/Appendable;:
        parameter #0:
          type: @libcore.util.Nullable
        // Is expected to return self
        return: @libcore.util.NonNull

    method append(Ljava/lang/CharSequence;II)Ljava/lang/Appendable;:
        parameter #0:
          type: @libcore.util.Nullable
        // Is expected to return self
        return: @libcore.util.NonNull

    method append(C)Ljava/lang/Appendable;:
        // Is expected to return self
        return: @libcore.util.NonNull

class Boolean:
    method <init>(Ljava/lang/String;)V:
        // In contrast to other type classes, doesn't NPE on null, but sets value to false
        parameter #0:
          type: @libcore.util.Nullable

    method parseBoolean(Ljava/lang/String;)Z:
        // In contrast to other type classes, doesn't NPE on null, but sets value to false
        parameter #0:
          type: @libcore.util.Nullable

    method valueOf(Z)Ljava/lang/Boolean;:
        // Always return value
        return: @libcore.util.NonNull

    method valueOf(Ljava/lang/String;)Ljava/lang/Boolean;:
        // Null == false
        parameter #0:
          type: @libcore.util.Nullable
        // Always return value
        return: @libcore.util.NonNull

    method toString(Z)Ljava/lang/String;:
        // Always return value
        return: @libcore.util.NonNull

    method toString()Ljava/lang/String;:
        // Always return value
        return: @libcore.util.NonNull

    method equals(Ljava/lang/Object;)Z:
        // Can be null
        parameter #0:
          type: @libcore.util.Nullable

    method getBoolean(Ljava/lang/String;)Z:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Returns null in case of failure
        return: @libcore.util.Nullable

    method compareTo(Ljava/lang/Boolean;)I:
        // NPE on null
        parameter #0:
          type: @libcore.util.NonNull

class Byte:
    method toString(B)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method valueOf(B)Ljava/lang/Byte;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method parseByte(Ljava/lang/String;I)B:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method parseByte(Ljava/lang/String;)B:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method valueOf(Ljava/lang/String;I)Ljava/lang/Byte;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Always returns an instance
        return: @libcore.util.NonNull

    method valueOf(Ljava/lang/String;)Ljava/lang/Byte;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Always returns an instance
        return: @libcore.util.NonNull

    method decode(Ljava/lang/String;)Ljava/lang/Byte;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        return:
        // Always returns an instance
        return: @libcore.util.NonNull

    method <init>(Ljava/lang/String;)V:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method toString()Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method equals(Ljava/lang/Object;)Z:
        // Can be null
        parameter #0:
          type: @libcore.util.Nullable

    method compareTo(Ljava/lang/Byte;)I:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method toHexString(BZ)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

class Character:
    method valueOf(C)Ljava/lang/Character;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method equals(Ljava/lang/Object;)Z:
        // Can be null
        parameter #0:
          type: @libcore.util.Nullable

    method toString()Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method toString(C)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method codePointAt(Ljava/lang/CharSequence;I)I:
        // throws NPE
        parameter #0:
          type: @libcore.util.NonNull

    method codePointAt([CI)I:
        // throws NPE
        parameter #0:
          type: @libcore.util.NonNull

    method codePointAt([CII)I:
        // throws NPE
        parameter #0:
          type: @libcore.util.NonNull

    method codePointBefore(Ljava/lang/CharSequence;I)I:
        // throws NPE
        parameter #0:
          type: @libcore.util.NonNull

    method codePointBefore([CI)I:
        // throws NPE
        parameter #0:
          type: @libcore.util.NonNull

    method codePointBefore([CII)I:
        // throws NPE
        parameter #0:
          type: @libcore.util.NonNull

    method toChars(I[CI)I:
        // throws NPE
        parameter #1:
          type: @libcore.util.NonNull

    method toChars(I)[C:
        // Always returns an instance
        return: @libcore.util.NonNull

    method codePointCount(Ljava/lang/CharSequence;II)I:
        // throws NPE
        parameter #0:
          type: @libcore.util.NonNull

    method codePointCount([CII)I:
        // throws NPE
        parameter #0:
          type: @libcore.util.NonNull

    method offsetByCodePoints(Ljava/lang/CharSequence;II)I:
        // throws NPE
        parameter #0:
          type: @libcore.util.NonNull

    method offsetByCodePoints([CIIII)I:
        // throws NPE
        parameter #0:
          type: @libcore.util.NonNull

    method compareTo(Ljava/lang/Character;)I:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method getName(I)Ljava/lang/String;:
        // Null is a valid return value
        return: @libcore.util.Nullable

class Character$Subset:
    method <init>(Ljava/lang/String;)V:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method equals(Ljava/lang/Object;)Z:
        // Can be null
        parameter #0:
          type: @libcore.util.Nullable

    method hashCode()I:
        return:

    method toString()Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

class Character$UnicodeBlock:
    method of(C)Ljava/lang/Character$UnicodeBlock;:
        // Null is valid return value
        return: @libcore.util.Nullable

    method of(I)Ljava/lang/Character$UnicodeBlock;:
        // Null is valid return value
        return: @libcore.util.Nullable

    method forName(Ljava/lang/String;)Ljava/lang/Character$UnicodeBlock;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Always returns an instance
        return: @libcore.util.NonNull

class Character$UnicodeScript:
    method of(I)Ljava/lang/Character$UnicodeScript;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method forName(Ljava/lang/String;)Ljava/lang/Character$UnicodeScript;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Always returns an instance
        return: @libcore.util.NonNull

class CharSequence:
    // Always returns a string instance
    method toString()Ljava/lang/String;:
        return: @libcore.util.NonNull

class Enum:
    // Always returns an instance or throws
    method valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;:
        return: @libcore.util.NonNull

class Iterable:
    // Always returns an instance
    method iterator()Ljava/util/Iterator;:
        return: @libcore.util.NonNull

class Integer:
    method toString(II)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method toUnsignedString(II)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method toHexString(I)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method toOctalString(I)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method toBinaryString(I)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method toString(I)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method toUnsignedString(I)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

   method parseInt(Ljava/lang/String;I)I:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method parseInt(Ljava/lang/String;)I:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method parseUnsignedInt(Ljava/lang/String;I)I:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method parseUnsignedInt(Ljava/lang/String;)I:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method valueOf(Ljava/lang/String;I)Ljava/lang/Integer;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Always returns an instance
        return: @libcore.util.NonNull

    method valueOf(Ljava/lang/String;)Ljava/lang/Integer;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Always returns an instance
        return: @libcore.util.NonNull

    method valueOf(I)Ljava/lang/Integer;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method <init>(Ljava/lang/String;)V:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method toString()Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method equals(Ljava/lang/Object;)Z:
        // Can be null
        parameter #0:
          type: @libcore.util.Nullable

    method getInteger(Ljava/lang/String;)Ljava/lang/Integer;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Returns null in case of failure
        return: @libcore.util.Nullable

    method getInteger(Ljava/lang/String;I)Ljava/lang/Integer;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Returns null in case of failure
        return: @libcore.util.Nullable

    method getInteger(Ljava/lang/String;Ljava/lang/Integer;)Ljava/lang/Integer;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Can be null
        parameter #1:
          type: @libcore.util.Nullable
        // Returns null in case of failure
        return: @libcore.util.Nullable

    method decode(Ljava/lang/String;)Ljava/lang/Integer;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        return:
        // Always returns an instance
        return: @libcore.util.NonNull

    method compareTo(Ljava/lang/Integer;)I:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

class Float:
    method toString(F)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method toHexString(F)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method valueOf(Ljava/lang/String;)Ljava/lang/Float;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Always returns an instance
        return: @libcore.util.NonNull

    method valueOf(F)Ljava/lang/Float;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method parseFloat(Ljava/lang/String;)F:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method <init>(Ljava/lang/String;)V:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method toString()Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method equals(Ljava/lang/Object;)Z:
        // Can be null
        parameter #0:
          type: @libcore.util.Nullable

    method compareTo(Ljava/lang/Float;)I:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

class Double:
    method toString(D)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method toHexString(D)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method valueOf(Ljava/lang/String;)Ljava/lang/Double;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Always returns an instance
        return: @libcore.util.NonNull

    method valueOf(D)Ljava/lang/Double;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method parseDouble(Ljava/lang/String;)D:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method <init>(Ljava/lang/String;)V:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method toString()Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method equals(Ljava/lang/Object;)Z:
        // Can be null
        parameter #0:
          type: @libcore.util.Nullable

    method compareTo(Ljava/lang/Double;)I:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

class Long:
    method toString(JI)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method toUnsignedString(JI)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method toHexString(J)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method toOctalString(J)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method toBinaryString(J)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method toString(J)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method toUnsignedString(J)Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method parseLong(Ljava/lang/String;I)J:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method parseLong(Ljava/lang/String;)J:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method parseUnsignedLong(Ljava/lang/String;I)J:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method parseUnsignedLong(Ljava/lang/String;)J:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method valueOf(Ljava/lang/String;I)Ljava/lang/Long;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Always returns an instance
        return: @libcore.util.NonNull

    method valueOf(Ljava/lang/String;)Ljava/lang/Long;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Always returns an instance
        return: @libcore.util.NonNull

    method valueOf(J)Ljava/lang/Long;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method decode(Ljava/lang/String;)Ljava/lang/Long;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        return:
        // Always returns an instance
        return: @libcore.util.NonNull

    method <init>(Ljava/lang/String;)V:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method toString()Ljava/lang/String;:
        // Always returns an instance
        return: @libcore.util.NonNull

    method equals(Ljava/lang/Object;)Z:
        // Can be null
        parameter #0:
          type: @libcore.util.Nullable

    method getLong(Ljava/lang/String;)Ljava/lang/Long;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Returns null in case of failure
        return: @libcore.util.Nullable

    method getLong(Ljava/lang/String;J)Ljava/lang/Long;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Returns null in case of failure
        return: @libcore.util.Nullable

    method getLong(Ljava/lang/String;Ljava/lang/Long;)Ljava/lang/Long;:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull
        // Can be null
        parameter #1:
          type: @libcore.util.Nullable
        // Returns null in case of failure
        return: @libcore.util.Nullable

    method compareTo(Ljava/lang/Long;)I:
        // Throws NPE on null
        parameter #0:
          type: @libcore.util.NonNull

class String:
    method <init>(Ljava/lang/String;)V:
        parameter #0:
          type: @libcore.util.NonNull
        return:
    method <init>([C)V:
        parameter #0:
          type: @libcore.util.NonNull
        return:
    method <init>([CII)V:
        parameter #0:
          type: @libcore.util.NonNull
        return:
    method <init>([III)V:
        parameter #0:
          type: @libcore.util.NonNull
        return:
    method <init>([BIII)V:
        parameter #0:
          type: @libcore.util.NonNull
        return:
    method <init>([BI)V:
        parameter #0:
          type: @libcore.util.NonNull
        return:
    method <init>([BIILjava/lang/String;)V:
        parameter #0:
          type: @libcore.util.NonNull
        parameter #3:
          type: @libcore.util.NonNull
        return:
    method <init>([BIILjava/nio/charset/Charset;)V:
        parameter #0:
          type: @libcore.util.NonNull
        parameter #3:
          type: @libcore.util.NonNull
        return:
    method <init>([BLjava/lang/String;)V:
        parameter #0:
          type: @libcore.util.NonNull
        parameter #1:
          type: @libcore.util.NonNull
        return:
    method <init>([BLjava/nio/charset/Charset;)V:
        parameter #0:
          type: @libcore.util.NonNull
        parameter #1:
          type: @libcore.util.NonNull
        return:
    method <init>([BII)V:
        parameter #0:
          type: @libcore.util.NonNull
        return:
    method <init>([B)V:
        parameter #0:
          type: @libcore.util.NonNull
        return:
    method <init>(Ljava/lang/StringBuffer;)V:
        parameter #0:
          type: @libcore.util.NonNull
        return:
    method <init>(Ljava/lang/StringBuilder;)V:
        parameter #0:
          type: @libcore.util.NonNull
        return:
    method <init>(II[C)V:
        parameter #2:
          type: @libcore.util.NonNull
        return:
    method getChars(II[CI)V:
        parameter #2:
          type: @libcore.util.NonNull
        return:

    // Always returns a string instance
    method toString()Ljava/lang/String;:
        return: @libcore.util.NonNull

    method getBytes(II[BI)V:
        parameter #2:
          type: @libcore.util.NonNull
    // Empty array in worst case
    method getBytes(Ljava/lang/String;)[B:
        parameter #0:
          type: @libcore.util.NonNull
        return: @libcore.util.NonNull
    // Empty array in worst case
    method getBytes(Ljava/nio/charset/Charset;)[B:
        parameter #0:
          type: @libcore.util.NonNull
        return: @libcore.util.NonNull
    // Empty array in worst case (or throws)
    method getBytes(Ljava/lang/String;)[B:
        parameter #0:
          type: @libcore.util.NonNull
        return: @libcore.util.NonNull
    // Empty array in worst case
    method getBytes()[B:
        return: @libcore.util.NonNull
    method equals(Ljava/lang/Object;)Z:
        parameter #0:
          type: @libcore.util.Nullable
    // Empty array in worst case
    method toCharArray()[C:
        return: @libcore.util.NonNull
    // Empty char sequence in worst case
    method subSequence(II)Ljava/lang/CharSequence;:
        return: @libcore.util.NonNull
    // Always returns a string instance
    method concat(Ljava/lang/String;)Ljava/lang/String;:
        parameter #0:
          type: @libcore.util.NonNull
        return: @libcore.util.NonNull
    // Always returns a string instance
    method copyValueOf([CII)Ljava/lang/String;:
        parameter #0:
          type: @libcore.util.NonNull
        return: @libcore.util.NonNull
    // Always returns a string instance
    method copyValueOf([C)Ljava/lang/String;:
        parameter #0:
          type: @libcore.util.NonNull
        return: @libcore.util.NonNull
    // Always returns a string instance
    method intern()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns a string instance
    method replace(CC)Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns a string instance
    method substring(I)Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns a string instance
    method substring(II)Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns a string instance
    method toLowerCase(Ljava/util/Locale;)Ljava/lang/String;:
        parameter #0:
          type: @libcore.util.NonNull
        return: @libcore.util.NonNull
    // Always returns a string instance
    method toLowerCase()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns a string instance
    method toUpperCase(Ljava/util/Locale;)Ljava/lang/String;:
        parameter #0:
          type: @libcore.util.NonNull
        return: @libcore.util.NonNull
    // Always returns a string instance
    method toUpperCase()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns a string instance
    method trim()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns a string instance
    method valueOf(Z)Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns a string instance
    method valueOf(C)Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns a string instance
    method valueOf(I)Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns a string instance
    method valueOf(J)Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns a string instance
    method valueOf(F)Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns a string instance
    method valueOf(D)Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns a string instance
    method valueOf(Ljava/lang/Object;)Ljava/lang/String;:
        parameter #0:
          type: @libcore.util.Nullable
        return:@libcore.util.NonNull
    // Always returns a string instance
    method valueOf([C)Ljava/lang/String;:
        parameter #0:
          type: @libcore.util.NonNull
        return: @libcore.util.NonNull
    // Always returns a string instance
    method valueOf([CII)Ljava/lang/String;:
        parameter #0:
          type: @libcore.util.NonNull
        return: @libcore.util.NonNull
    // Always returns a string instance
    method split(Ljava/lang/String;I)[Ljava/lang/String;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.NonNull
    // Always returns a string instance
    method split(Ljava/lang/String;)[Ljava/lang/String;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.NonNull
    // Always returns a string instance
    method join(Ljava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/String;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.NonNull
        parameter #1:
            type: @libcore.util.NonNull
                inner-type 0, 0: @libcore.util.Nullable
    // Always returns a string instance
    method join(Ljava/lang/CharSequence;Ljava/lang/Iterable;)Ljava/lang/String;:
        parameter #0:
          type: @libcore.util.NonNull
        parameter #1:
            type: @libcore.util.NonNull
            inner-type 3, 0, 2, 0: @libcore.util.Nullable
        return: @libcore.util.NonNull
    // Always returns a string instance
    method replaceAll(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;:
        parameter #0:
          type: @libcore.util.NonNull
        parameter #1:
          type: @libcore.util.NonNull
        return: @libcore.util.NonNull
    // Always returns a string instance
    method replaceFirst(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;:
        parameter #0:
          type: @libcore.util.NonNull
        parameter #1:
          type: @libcore.util.NonNull
        return: @libcore.util.NonNull
   method replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;:
        parameter #0:
          type: @libcore.util.NonNull
        parameter #1:
          type: @libcore.util.NonNull
        return: @libcore.util.NonNull
    method contentEquals(Ljava/lang/StringBuffer;)Z:
        parameter #0:
          type: @libcore.util.NonNull
    method contentEquals(Ljava/lang/CharSequence;)Z:
        parameter #0:
          type: @libcore.util.NonNull
    method equalsIgnoreCase(Ljava/lang/String;)Z:
        parameter #0:
          type: @libcore.util.Nullable
    method compareTo(Ljava/lang/String;)I:
        parameter #0:
          type: @libcore.util.NonNull
    method compareToIgnoreCase(Ljava/lang/String;)I:
        parameter #0:
          type: @libcore.util.NonNull
    method regionMatches(ILjava/lang/String;II)Z:
        parameter #1:
          type: @libcore.util.NonNull
    method regionMatches(ZILjava/lang/String;II)Z:
        parameter #2:
          type: @libcore.util.NonNull
    method startsWith(Ljava/lang/String;I)Z:
        parameter #0:
          type: @libcore.util.NonNull
    method startsWith(Ljava/lang/String;)Z:
        parameter #0:
          type: @libcore.util.NonNull
    method endsWith(Ljava/lang/String;)Z:
        parameter #0:
          type: @libcore.util.NonNull
    method indexOf(Ljava/lang/String;)I:
        parameter #0:
          type: @libcore.util.NonNull
    method indexOf(Ljava/lang/String;I)I:
        parameter #0:
          type: @libcore.util.NonNull
    method lastIndexOf(Ljava/lang/String;)I:
        parameter #0:
          type: @libcore.util.NonNull
    method lastIndexOf(Ljava/lang/String;I)I:
        parameter #0:
          type: @libcore.util.NonNull
    method matches(Ljava/lang/String;)Z:
        parameter #0:
          type: @libcore.util.NonNull
    method contains(Ljava/lang/CharSequence;)Z:
        parameter #0:
          type: @libcore.util.NonNull
    method format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;:
        parameter #0:
          type: @libcore.util.NonNull
        parameter #1:
            type: @libcore.util.NonNull
                inner-type 0, 0: @libcore.util.Nullable
        return: @libcore.util.NonNull
    method format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;:
        parameter #0:
          type: @libcore.util.NonNull
        parameter #1:
          type: @libcore.util.NonNull
        parameter #2:
            type: @libcore.util.NonNull
                inner-type 0, 0: @libcore.util.Nullable
        return: @libcore.util.NonNull

class System:
    // Ideally, in should be made NonNull - but it IS possible to make this final field
    // a null using setIn(null). It makes sense to leave this field as a platform
    // type for convenience reasons - no one sane should expect this to be null,
    // but it's nice to have kotlin check it.
    field in:

    // Same as in "in" field
    field out:

    // Same as in "in" field
    field err:


    method setIn(Ljava/io/InputStream;)V:
        // While it makes little sense, it's possible to set System.in to null.
        parameter #0:
          type: @libcore.util.Nullable

    method setOut(Ljava/io/PrintStream;)V:
        // While it makes little sense, it's possible to set System.out to null.
        parameter #0:
          type: @libcore.util.Nullable

    method setErr(Ljava/io/PrintStream;)V:
        // While it makes little sense, it's possible to set System.err to null.
        parameter #0:
          type: @libcore.util.Nullable

    method console()Ljava/io/Console;:
        // Always returns an instance
        return: @libcore.util.Nullable

    method inheritedChannel()Ljava/nio/channels/Channel;:
        // Null if there's no inherited channel
        return: @libcore.util.Nullable

    method setSecurityManager(Ljava/lang/SecurityManager;)V:
        // Null is a valid argument.
        parameter #0:
          type: @libcore.util.Nullable

    method getSecurityManager()Ljava/lang/SecurityManager;:
        // Null is valid return value.
        return: @libcore.util.Nullable

    method arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V:
        // NPE on null src
        parameter #0:
          type: @libcore.util.NonNull
        // NPE on null dst
        parameter #1:
          type: @libcore.util.NonNull

    method identityHashCode(Ljava/lang/Object;)I:
        // Null is a valid argument.
        parameter #0:
          type: @libcore.util.Nullable

    method getProperties()Ljava/util/Properties;:
        // There's always a properties object
        return: @libcore.util.NonNull

    method lineSeparator()Ljava/lang/String;:
        // There's always a line separator string (empty in worst case)
        return: @libcore.util.NonNull

    method setProperties(Ljava/util/Properties;)V:
        // Null is a valid argument (will reset to defaults)
        parameter #0:
          type: @libcore.util.Nullable

    method getProperty(Ljava/lang/String;)Ljava/lang/String;:
        // Property key can't be null
        parameter #0:
          type: @libcore.util.NonNull
        // Null is valid return value
        return: @libcore.util.Nullable

    method getProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;:
        // Property key can't be null
        parameter #0:
          type: @libcore.util.NonNull
        // Property value can be null
        parameter #1:
          type: @libcore.util.Nullable
        // Null is valid return value
        return: @libcore.util.Nullable

    method setProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;:
        // Property key can't be null
        parameter #0:
          type: @libcore.util.NonNull
        // Property value can be null
        parameter #1:
          type: @libcore.util.Nullable
        // Null is valid return value
        return: @libcore.util.Nullable

    method clearProperty(Ljava/lang/String;)Ljava/lang/String;:
        // Property key can't be null
        parameter #0:
          type: @libcore.util.NonNull
        // Null is valid return value
        return: @libcore.util.Nullable

    method getenv(Ljava/lang/String;)Ljava/lang/String;:
        // Name can't be null
        parameter #0:
          type: @libcore.util.NonNull
        // Null is valid return value
        return: @libcore.util.Nullable

    method getenv()Ljava/util/Map;:
        // Never null
        return: @libcore.util.NonNull

    method load(Ljava/lang/String;)V:
        // Filename can't be null
        parameter #0:
          type: @libcore.util.NonNull

    method loadLibrary(Ljava/lang/String;)V:
        // Libname can't be null
        parameter #0:
          type: @libcore.util.NonNull

    method mapLibraryName(Ljava/lang/String;)Ljava/lang/String;:
        // Libname can't be null
        parameter #0:
          type: @libcore.util.NonNull
        // Never null
        return: @libcore.util.NonNull

class StringBuffer:
    method <init>(Ljava/lang/String;)V:
        // NPE on null argument
        parameter #0:
          type: @libcore.util.NonNull

    method <init>(Ljava/lang/CharSequence;)V:
        // NPE on null argument
        parameter #0:
          type: @libcore.util.NonNull

    method getChars(II[CI)V:
        // NPE on null argument
        parameter #2:
          type: @libcore.util.NonNull

    method append(Ljava/lang/Object;)Ljava/lang/StringBuffer;:
        // null -> "null"
        parameter #0:
          type: @libcore.util.Nullable
        // returns self
        return: @libcore.util.NonNull

    method append(Ljava/lang/String;)Ljava/lang/StringBuffer;:
        // null -> "null"
        parameter #0:
          type: @libcore.util.Nullable
        // returns self
        return: @libcore.util.NonNull

    method append(Ljava/lang/StringBuffer;)Ljava/lang/StringBuffer;:
        // null -> "null"
        parameter #0:
          type: @libcore.util.Nullable
        // Returns self
        return: @libcore.util.NonNull

    method append(Ljava/lang/AbstractStringBuilder;)Ljava/lang/StringBuffer;:
        // null -> "null"
        parameter #0:
          type: @libcore.util.Nullable
        // Returns self
        return: @libcore.util.NonNull

    method append(Ljava/lang/CharSequence;)Ljava/lang/StringBuffer;:
        // null -> "null"
        parameter #0:
          type: @libcore.util.Nullable
        // Returns self
        return: @libcore.util.NonNull

    method append(Ljava/lang/CharSequence;II)Ljava/lang/StringBuffer;:
        // null -> "null"
        parameter #0:
          type: @libcore.util.Nullable
        // Returns self
        return: @libcore.util.NonNull

    method append([C)Ljava/lang/StringBuffer;:
        // Null for char[] methods result in NPE
        parameter #0:
          type: @libcore.util.NonNull
        // Returns self
        return: @libcore.util.NonNull

    method append([CII)Ljava/lang/StringBuffer;:
        // Null for char[] methods result in NPE
        parameter #0:
          type: @libcore.util.NonNull
        // Returns self
        return: @libcore.util.NonNull

    method append(Z)Ljava/lang/StringBuffer;:
        // Returns self
        return: @libcore.util.NonNull

    method append(C)Ljava/lang/StringBuffer;:
        // Returns self
        return: @libcore.util.NonNull

    method append(I)Ljava/lang/StringBuffer;:
        // Returns self
        return: @libcore.util.NonNull

    method appendCodePoint(I)Ljava/lang/StringBuffer;:
        // Returns self
        return: @libcore.util.NonNull

    method append(J)Ljava/lang/StringBuffer;:
        // Returns self
        return: @libcore.util.NonNull

    method append(F)Ljava/lang/StringBuffer;:
        // Returns self
        return: @libcore.util.NonNull

    method append(D)Ljava/lang/StringBuffer;:
        // Returns self
        return: @libcore.util.NonNull

    method delete(II)Ljava/lang/StringBuffer;:
        // Returns self
        return: @libcore.util.NonNull

    method deleteCharAt(I)Ljava/lang/StringBuffer;:
        // Returns self
        return: @libcore.util.NonNull

    method replace(IILjava/lang/String;)Ljava/lang/StringBuffer;:
        // NPE from null
        parameter #2:
          type: @libcore.util.NonNull
        // Returns self
        return: @libcore.util.NonNull

    method substring(I)Ljava/lang/String;:
        // Never null
        return: @libcore.util.NonNull

    method subSequence(II)Ljava/lang/CharSequence;:
        // Never null
        return: @libcore.util.NonNull

    method substring(II)Ljava/lang/String;:
        // Never null
        return: @libcore.util.NonNull

    method insert(I[CII)Ljava/lang/StringBuffer;:
        // Null for char[] methods result in NPE
        parameter #1:
          type: @libcore.util.NonNull
        // Returns self
        return: @libcore.util.NonNull

    method insert(ILjava/lang/Object;)Ljava/lang/StringBuffer;:
        // null -> "null"
        parameter #1:
          type: @libcore.util.Nullable
        // Returns self
        return: @libcore.util.NonNull

    method insert(ILjava/lang/String;)Ljava/lang/StringBuffer;:
        // null -> "null"
        parameter #1:
          type: @libcore.util.Nullable
        // Returns self
        return: @libcore.util.NonNull

    method insert(I[C)Ljava/lang/StringBuffer;:
        // Null for char[] methods result in NPE
        parameter #1:
          type: @libcore.util.NonNull
        // Returns self
        return: @libcore.util.NonNull

    method insert(ILjava/lang/CharSequence;)Ljava/lang/StringBuffer;:
        // null -> "null"
        parameter #1:
          type: @libcore.util.Nullable
        // Returns self
        return: @libcore.util.NonNull

    method insert(ILjava/lang/CharSequence;II)Ljava/lang/StringBuffer;:
        // null -> "null"
        parameter #1:
          type: @libcore.util.Nullable
        // Returns self
        return: @libcore.util.NonNull

    method insert(IZ)Ljava/lang/StringBuffer;:
        // Returns self
        return: @libcore.util.NonNull

    method insert(IC)Ljava/lang/StringBuffer;:
        // Returns self
        return: @libcore.util.NonNull

    method insert(II)Ljava/lang/StringBuffer;:
        // Returns self
        return: @libcore.util.NonNull

    method insert(IJ)Ljava/lang/StringBuffer;:
        // Returns self
        return: @libcore.util.NonNull

    method insert(IF)Ljava/lang/StringBuffer;:
        // Returns self
        return: @libcore.util.NonNull

    method insert(ID)Ljava/lang/StringBuffer;:
        // Returns self
        return: @libcore.util.NonNull

    method indexOf(Ljava/lang/String;)I:
        parameter #0:
          type: @libcore.util.NonNull

    method indexOf(Ljava/lang/String;I)I:
        // NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method lastIndexOf(Ljava/lang/String;)I:
        // NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method lastIndexOf(Ljava/lang/String;I)I:
        // NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method reverse()Ljava/lang/StringBuffer;:
        // Never null
        return: @libcore.util.NonNull

    method toString()Ljava/lang/String;:
        // Never null
        return: @libcore.util.NonNull

class StringBuilder:

    method <init>(Ljava/lang/String;)V:
        // NPE on null argument
        parameter #0:
          type: @libcore.util.NonNull

    method <init>(Ljava/lang/CharSequence;)V:
        // NPE on null argument
        parameter #0:
          type: @libcore.util.NonNull

    method append(Ljava/lang/Object;)Ljava/lang/StringBuilder;:
        // null -> "null"
        parameter #0:
          type: @libcore.util.Nullable
        // returns self
        return: @libcore.util.NonNull

    method append(Ljava/lang/String;)Ljava/lang/StringBuilder;:
        // null -> "null"
        parameter #0:
          type: @libcore.util.Nullable
        // returns self
        return: @libcore.util.NonNull

    method append(Ljava/lang/StringBuffer;)Ljava/lang/StringBuilder;:
        // null -> "null"
        parameter #0:
          type: @libcore.util.Nullable
        // Returns self
        return: @libcore.util.NonNull

    method append(Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;:
        // null -> "null"
        parameter #0:
          type: @libcore.util.Nullable
        // Returns self
        return: @libcore.util.NonNull

    method append(Ljava/lang/CharSequence;II)Ljava/lang/StringBuilder;:
        // null -> "null"
        parameter #0:
          type: @libcore.util.Nullable
        // Returns self
        return: @libcore.util.NonNull

    method append([C)Ljava/lang/StringBuilder;:
        // Null for char[] methods result in NPE
        parameter #0:
          type: @libcore.util.NonNull
        // Returns self
        return: @libcore.util.NonNull

    method append([CII)Ljava/lang/StringBuilder;:
        // Null for char[] methods result in NPE
        parameter #0:
          type: @libcore.util.NonNull
        // Returns self
        return: @libcore.util.NonNull

    method append(Z)Ljava/lang/StringBuilder;:
        // Returns self
        return: @libcore.util.NonNull

    method append(C)Ljava/lang/StringBuilder;:
        // Returns self
        return: @libcore.util.NonNull

    method append(I)Ljava/lang/StringBuilder;:
        // Returns self
        return: @libcore.util.NonNull

    method append(J)Ljava/lang/StringBuilder;:
        // Returns self
        return: @libcore.util.NonNull

    method append(F)Ljava/lang/StringBuilder;:
        // Returns self
        return: @libcore.util.NonNull

    method append(D)Ljava/lang/StringBuilder;:
        // Returns self
        return: @libcore.util.NonNull

    method appendCodePoint(I)Ljava/lang/StringBuilder;:
        // Returns self
        return: @libcore.util.NonNull

    method delete(II)Ljava/lang/StringBuilder;:
        // Returns self
        return: @libcore.util.NonNull

    method deleteCharAt(I)Ljava/lang/StringBuilder;:
        // Returns self
        return: @libcore.util.NonNull

    method replace(IILjava/lang/String;)Ljava/lang/StringBuilder;:
        // NPE from null
        parameter #2:
          type: @libcore.util.NonNull
        // Returns self
        return: @libcore.util.NonNull

    method insert(I[CII)Ljava/lang/StringBuilder;:
        // Null for char[] methods result in NPE
        parameter #1:
          type: @libcore.util.NonNull
        // Returns self
        return: @libcore.util.NonNull

    method insert(ILjava/lang/Object;)Ljava/lang/StringBuilder;:
        // null -> "null"
        parameter #1:
          type: @libcore.util.Nullable
        // Returns self
        return: @libcore.util.NonNull

    method insert(ILjava/lang/String;)Ljava/lang/StringBuilder;:
        // null -> "null"
        parameter #1:
          type: @libcore.util.Nullable
        // Returns self
        return: @libcore.util.NonNull

    method insert(I[C)Ljava/lang/StringBuilder;:
        // Null for char[] methods result in NPE
        parameter #1:
          type: @libcore.util.NonNull
        // Returns self
        return: @libcore.util.NonNull

    method insert(ILjava/lang/CharSequence;)Ljava/lang/StringBuilder;:
        // null -> "null"
        parameter #1:
          type: @libcore.util.Nullable
        // Returns self
        return: @libcore.util.NonNull

    method insert(ILjava/lang/CharSequence;II)Ljava/lang/StringBuilder;:
        // null -> "null"
        parameter #1:
          type: @libcore.util.Nullable
        // Returns self
        return: @libcore.util.NonNull

    method insert(IZ)Ljava/lang/StringBuilder;:
        // Returns self
        return: @libcore.util.NonNull

    method insert(IC)Ljava/lang/StringBuilder;:
        // Returns self
        return: @libcore.util.NonNull

    method insert(II)Ljava/lang/StringBuilder;:
        // Returns self
        return: @libcore.util.NonNull

    method insert(IJ)Ljava/lang/StringBuilder;:
        // Returns self
        return: @libcore.util.NonNull

    method insert(IF)Ljava/lang/StringBuilder;:
        // Returns self
        return: @libcore.util.NonNull

    method insert(ID)Ljava/lang/StringBuilder;:
        // Returns self
        return: @libcore.util.NonNull

    method indexOf(Ljava/lang/String;)I:
        // NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method indexOf(Ljava/lang/String;I)I:
        // NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method lastIndexOf(Ljava/lang/String;)I:
        // NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method lastIndexOf(Ljava/lang/String;I)I:
        // NPE on null
        parameter #0:
          type: @libcore.util.NonNull

    method reverse()Ljava/lang/StringBuilder;:
        // Never null
        return: @libcore.util.NonNull

    method toString()Ljava/lang/String;:
        // Never null
        return: @libcore.util.NonNull

class Thread:
    // Always returns a string instance
    method toString()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always return an instance
    method currentThread()Ljava/lang/Thread;:
        return: @libcore.util.NonNull

// It would be nice to use @NullFromTypeParam in ThreadLocal
// everywhere its <T> is used, buy sadly the code below makes it impossible:
//
// ThreadLocal<@NonNull Object> foo = new ThreadLocal<>();
// assertNull(foo.get())
//
// Hence @Nullable T is used heavily
class ThreadLocal:
    method withInitial(Ljava/util/function/Supplier;)Ljava/lang/ThreadLocal;:
        // NPE on null supplier
        parameter #0:
          type: @libcore.util.NonNull
	// Always returns instance
        return: @libcore.util.NonNull

    method initialValue()Ljava/lang/Object;:
        // Returns null by default
        return: @libcore.util.Nullable

    method get()Ljava/lang/Object;:
        // May return null
        return: @libcore.util.Nullable

    method set(Ljava/lang/Object;)V:
        // Depends on type param
        parameter #0:
          type: @libcore.util.NullFromTypeParam

class Object:

    method getClass()Ljava/lang/Class;:
        return: @libcore.util.NonNull

    method equals(Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method toString()Ljava/lang/String;:
        return: @libcore.util.NonNull

class Class:

    method toString()Ljava/lang/String;:
        return: @libcore.util.NonNull

    method toGenericString()Ljava/lang/String;:
        return: @libcore.util.NonNull

    method forName(Ljava/lang/String;)Ljava/lang/Class;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.NonNull

    method forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.NonNull
        parameter #2:
            type: @libcore.util.Nullable

    method newInstance()Ljava/lang/Object;:
        return: @libcore.util.NonNull

    method isInstance(Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method isAssignableFrom(Ljava/lang/Class;)Z:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method getName()Ljava/lang/String;:
        return: @libcore.util.NonNull

    method getClassLoader()Ljava/lang/ClassLoader;:
        return: @libcore.util.Nullable

    method getTypeParameters()[Ljava/lang/reflect/TypeVariable;:
        return: @libcore.util.NonNull
            inner-type 0, 0,3, 0: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull

    method getSuperclass()Ljava/lang/Class;:
        return: @libcore.util.Nullable

    method getGenericSuperclass()Ljava/lang/reflect/Type;:
        return: @libcore.util.Nullable

    method getPackage()Ljava/lang/Package;:
        return: @libcore.util.Nullable

    method getInterfaces()[Ljava/lang/Class;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull

    method getGenericInterfaces()[Ljava/lang/reflect/Type;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull

    method getComponentType()Ljava/lang/Class;:
        return: @libcore.util.Nullable

    method getSigners()[Ljava/lang/Object;:
        return: @libcore.util.Nullable
            inner-type 0, 0: @libcore.util.NonNull

    method getEnclosingMethod()Ljava/lang/reflect/Method;:
        return: @libcore.util.Nullable

    method getEnclosingConstructor()Ljava/lang/reflect/Constructor;:
        return: @libcore.util.Nullable

    method getDeclaringClass()Ljava/lang/Class;:
        return: @libcore.util.Nullable

    method getEnclosingClass()Ljava/lang/Class;:
        return: @libcore.util.Nullable

    method getSimpleName()Ljava/lang/String;:
        return: @libcore.util.NonNull

    method getTypeName()Ljava/lang/String;:
        return: @libcore.util.NonNull

    method getCanonicalName()Ljava/lang/String;:
        return: @libcore.util.Nullable

    method getClasses()[Ljava/lang/Class;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull

    method getFields()[Ljava/lang/reflect/Field;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull

    method getMethods()[Ljava/lang/reflect/Method;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull

    method getConstructors()[Ljava/lang/reflect/Constructor;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull

    method getField(Ljava/lang/String;)Ljava/lang/reflect/Field;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.NonNull

    method getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.NonNull
        parameter #1:
            type: @libcore.util.Nullable
                inner-type 0, 0: @libcore.util.NonNull

    method getConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.Nullable
                inner-type 0, 0: @libcore.util.NonNull

    method getDeclaredClasses()[Ljava/lang/Class;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull

    method getDeclaredFields()[Ljava/lang/reflect/Field;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull

    method getDeclaredMethods()[Ljava/lang/reflect/Method;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull

    method getDeclaredConstructors()[Ljava/lang/reflect/Constructor;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull

    method getDeclaredField(Ljava/lang/String;)Ljava/lang/reflect/Field;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.NonNull

    method getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.NonNull
        parameter #1:
            type: @libcore.util.Nullable
                inner-type 0, 0: @libcore.util.NonNull

    method getDeclaredConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;:
        return: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.Nullable
                inner-type 0, 0: @libcore.util.NonNull

    method getResourceAsStream(Ljava/lang/String;)Ljava/io/InputStream;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NonNull

    method getResource(Ljava/lang/String;)Ljava/net/URL;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NonNull

    method getProtectionDomain()Ljava/security/ProtectionDomain;:
        return: @libcore.util.Nullable

    method getEnumConstants()[Ljava/lang/Object;:
        return: @libcore.util.Nullable
            inner-type 0, 0: @libcore.util.NonNull

    method cast(Ljava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.Nullable

    method asSubclass(Ljava/lang/Class;)Ljava/lang/Class;:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NonNull

    method isAnnotationPresent(Ljava/lang/Class;)Z:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method getAnnotationsByType(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull
        parameter #0:
            type: @libcore.util.NonNull

    method getAnnotations()[Ljava/lang/annotation/Annotation;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull

    method getDeclaredAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NonNull

    method getDeclaredAnnotations()[Ljava/lang/annotation/Annotation;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.NonNull

    method isDeclaredAnnotationPresent(Ljava/lang/Class;)Z:
        return:

package java.lang.reflect:

class AccessibleObject:
    // Empty array in the worst case
    method getAnnotations()[Ljava/lang/annotation/Annotation;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Empty array in the worst case
    method getDeclaredAnnotations()[Ljava/lang/annotation/Annotation;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull

class AnnotatedElement:
    // Empty array in the worst case
    method getAnnotations()[Ljava/lang/annotation/Annotation;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Empty array in the worst case
    method getDeclaredAnnotations()[Ljava/lang/annotation/Annotation;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull

class Array:
    // Returns instance or throws
    method newInstance(Ljava/lang/Class;I)Ljava/lang/Object;:
        return: @libcore.util.NonNull
    // Returns instance or throws
    method newInstance(Ljava/lang/Class;[I)Ljava/lang/Object;:
        return: @libcore.util.NonNull

class Constructor:
    // Always returns an instance
    method toString()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns an instance
    method toGenericString()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns an instance
    method getName()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // There's always a declaring class
    method getDeclaringClass()Ljava/lang/Class;:
        return: @libcore.util.NonNull
    // Empty array in the worst case
    method getParameterTypes()[Ljava/lang/Class;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Returns instance or throws
    method newInstance([Ljava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.NonNull

class Executable:
    // There's always a declaring class
    method getDeclaringClass()Ljava/lang/Class;:
        return: @libcore.util.NonNull
    // Always returns an instance
    method getName()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Empty array in the worst case
    method getParameterTypes()[Ljava/lang/Class;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Empty array in the worst case
    method getTypeParameters()[Ljava/lang/reflect/TypeVariable;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Empty array in the worst case
    method getGenericParameterTypes()[Ljava/lang/reflect/Type;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Empty array in the worst case
    method getParameters()[Ljava/lang/reflect/Parameter;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Empty array in the worst case
    method getExceptionTypes()[Ljava/lang/Class;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Empty array in the worst case
    method getGenericExceptionTypes()[Ljava/lang/reflect/Type;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Always returns an instance
    method toGenericString()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Empty array in the worst case
    method getDeclaredAnnotations()[Ljava/lang/annotation/Annotation;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Empty array in the worst case
    method getParameterAnnotations()[[Ljava/lang/annotation/Annotation;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
          inner-type 0, 0, 0, 0:  @libcore.util.NonNull

class Field:
    // Always returns an instance
    method getName()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // There's always a type of a field
    method getType()Ljava/lang/Class;:
        return: @libcore.util.NonNull
    // Always returns an instance
    method toString()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns an instance
    method toGenericString()Ljava/lang/String;:
        return: @libcore.util.NonNull

class GenericArrayType:
    // There's always a type for array
    method getGenericComponentType()Ljava/lang/reflect/Type;:
        return: @libcore.util.NonNull

class GenericDeclaration:
    // Empty array in the worst case
    method getTypeParameters()[Ljava/lang/reflect/TypeVariable;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull

class Member:
    method getDeclaringClass()Ljava/lang/Class;:
        return: @libcore.util.NonNull
    // Always returns an instance
    method getName()Ljava/lang/String;:
        return: @libcore.util.NonNull

class Method:
    // There's always a declaring class
    method getDeclaringClass()Ljava/lang/Class;:
        return: @libcore.util.NonNull
    // Empty array in the worst case
    method getTypeParameters()[Ljava/lang/reflect/TypeVariable;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // There's always a return type (such as Void.class)
    method getReturnType()Ljava/lang/Class;:
        return: @libcore.util.NonNull
    // There's always a return type (such as Void.class)
    method getGenericReturnType()Ljava/lang/reflect/Type;:
        return: @libcore.util.NonNull
    // Empty array in the worst case
    method getParameterTypes()[Ljava/lang/Class;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Empty array in the worst case
    method getGenericParameterTypes()[Ljava/lang/reflect/Type;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Empty array in the worst case
    method getExceptionTypes()[Ljava/lang/Class;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Empty array in the worst case
    method getGenericExceptionTypes()[Ljava/lang/reflect/Type;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Always returns an instance
    method toString()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Always returns an instance
    method toGenericString()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // Empty array in the worst case
    method getDeclaredAnnotations()[Ljava/lang/annotation/Annotation;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Empty array in the worst case
    method getParameterAnnotations()[[Ljava/lang/annotation/Annotation;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
          inner-type 0, 0, 0, 0:  @libcore.util.NonNull


class ParameterizedType:
    // Empty array in the worst case
    method getActualTypeArguments()[Ljava/lang/reflect/Type;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Always returns an instance
    method getRawType()Ljava/lang/reflect/Type;:
        return: @libcore.util.NonNull

class Parameter:
    // Always returns an instance
    method toString()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // There's always a declaring executable
    method getDeclaringExecutable()Ljava/lang/reflect/Executable;:
        return: @libcore.util.NonNull
    // Always returns an instance
    method getRealName()Ljava/lang/String;:
        return: @libcore.util.NonNull
    // There's always a type
    method getParameterizedType()Ljava/lang/reflect/Type;:
        return: @libcore.util.NonNull
    // There's always a type
    method getType()Ljava/lang/Class;:
        return: @libcore.util.NonNull
    // Empty array in the worst case
    method getDeclaredAnnotations()[Ljava/lang/annotation/Annotation;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Empty array in the worst case
    method getAnnotations()[Ljava/lang/annotation/Annotation;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull

class Proxy:
    // Always returns an instance (or throws)
    method getProxyClass(Ljava/lang/ClassLoader;[Ljava/lang/Class;)Ljava/lang/Class;:
        return: @libcore.util.NonNull
    // Always returns an instance (or throws)
    method newProxyInstance(Ljava/lang/ClassLoader;[Ljava/lang/Class;Ljava/lang/reflect/InvocationHandler;)Ljava/lang/Object;:
        return: @libcore.util.NonNull
    // Always returns an instance (or throws)
    method getInvocationHandler(Ljava/lang/Object;)Ljava/lang/reflect/InvocationHandler;:
        return: @libcore.util.NonNull

class Type:
    // Always returns an instance
    method getTypeName()Ljava/lang/String;:
        return: @libcore.util.NonNull

class TypeVariable:
    // Empty array in the worst case
    method getBounds()[Ljava/lang/reflect/Type;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Always returns an instance
    method getGenericDeclaration()Ljava/lang/reflect/GenericDeclaration;:
        return: @libcore.util.NonNull
    // Always returns an instance
    method getName()Ljava/lang/String;:
        return: @libcore.util.NonNull

class WildcardType:
    // Empty array in the worst case
    method getUpperBounds()[Ljava/lang/reflect/Type;:
        return: @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull
    // Empty array in the worst case
    method getLowerBounds()[Ljava/lang/reflect/Type;:
        return:  @libcore.util.NonNull
          inner-type 0, 0:  @libcore.util.NonNull

package java.util:

class ArrayList:

    method <init>(Ljava/util/Collection;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam

    method contains(Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method indexOf(Ljava/lang/Object;)I:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method lastIndexOf(Ljava/lang/Object;)I:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method clone()Ljava/lang/Object;:
        return: @libcore.util.NonNull

    method toArray()[Ljava/lang/Object;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.Nullable

    method toArray([Ljava/lang/Object;)[Ljava/lang/Object;:
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 0, 0: @libcore.util.Nullable
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.Nullable

    method get(I)Ljava/lang/Object;:
        return: @libcore.util.NullFromTypeParam

    method set(ILjava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.NullFromTypeParam

    method add(Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.NullFromTypeParam

    method add(ILjava/lang/Object;)V:
        return:
        parameter #1:
            type: @libcore.util.NullFromTypeParam

    method remove(I)Ljava/lang/Object;:
        return: @libcore.util.NullFromTypeParam

    method remove(Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method addAll(Ljava/util/Collection;)Z:
        return:
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam

    method addAll(ILjava/util/Collection;)Z:
        return:
        parameter #1:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam

    method removeAll(Ljava/util/Collection;)Z:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method retainAll(Ljava/util/Collection;)Z:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method listIterator(I)Ljava/util/ListIterator;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam

    method listIterator()Ljava/util/ListIterator;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam

    method iterator()Ljava/util/Iterator;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam

    method subList(II)Ljava/util/List;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam

    method forEach(Ljava/util/function/Consumer;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam

    method spliterator()Ljava/util/Spliterator;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam

    method removeIf(Ljava/util/function/Predicate;)Z:
        return:
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam

    method replaceAll(Ljava/util/function/UnaryOperator;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0: @libcore.util.NullFromTypeParam

    method sort(Ljava/util/Comparator;)V:
        return:
        parameter #0:
            type: @libcore.util.Nullable
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam

class HashMap:

    method <init>(Ljava/util/Map;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam
                inner-type 3, 1,2, 0: @libcore.util.NullFromTypeParam

    method get(Ljava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.Nullable

    method containsKey(Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.NullFromTypeParam

    method putAll(Ljava/util/Map;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam
                inner-type 3, 1,2, 0: @libcore.util.NullFromTypeParam

    method remove(Ljava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.Nullable

    method containsValue(Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method keySet()Ljava/util/Set;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam

    method values()Ljava/util/Collection;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam

    method entrySet()Ljava/util/Set;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NonNull
            inner-type 3, 0,3, 0: @libcore.util.NullFromTypeParam
            inner-type 3, 0,3, 1: @libcore.util.NullFromTypeParam

    method getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.Nullable
        parameter #1:
            type: @libcore.util.Nullable

    method putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.NullFromTypeParam

    method remove(Ljava/lang/Object;Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.Nullable
        parameter #1:
            type: @libcore.util.Nullable

    method replace(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.Nullable
        parameter #2:
            type: @libcore.util.NullFromTypeParam

    method replace(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.NullFromTypeParam

    method computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam
                inner-type 3, 1,2, 0: @libcore.util.Nullable

    method computeIfPresent(Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam
                inner-type 3, 1,2, 0: @libcore.util.NonNull
                inner-type 3, 2,2, 0: @libcore.util.Nullable

    method compute(Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam
                inner-type 3, 1,2, 0: @libcore.util.Nullable
                inner-type 3, 2,2, 0: @libcore.util.Nullable

    method merge(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.NonNull
        parameter #2:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NonNull
                inner-type 3, 1,2, 0: @libcore.util.NonNull
                inner-type 3, 2,2, 0: @libcore.util.Nullable

    method forEach(Ljava/util/function/BiConsumer;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam
                inner-type 3, 1,2, 0: @libcore.util.NullFromTypeParam

    method replaceAll(Ljava/util/function/BiFunction;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam
                inner-type 3, 1,2, 0: @libcore.util.NullFromTypeParam
                inner-type 3, 2,2, 0: @libcore.util.NullFromTypeParam

    method clone()Ljava/lang/Object;:
        return: @libcore.util.NonNull

class Iterator:

    method next()Ljava/lang/Object;:
        return: @libcore.util.NullFromTypeParam

    method forEachRemaining(Ljava/util/function/Consumer;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam

class List:
    method contains(Ljava/lang/Object;)Z:
        // May be null
        parameter #0:
          type: @libcore.util.Nullable
        return:

    method iterator()Ljava/util/Iterator;:
        // Javadoc doesn't mention possiblity of a null result
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam

    method toArray()[Ljava/lang/Object;:
        // Never returns null
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.Nullable

    method toArray([Ljava/lang/Object;)[Ljava/lang/Object;:
        // Javadoc mention NPE for param #0
        parameter #0:
          type: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.Nullable
        // Never returns null
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.Nullable

    method add(Ljava/lang/Object;)Z:
        // Nullness depends on type parameter nullness
        parameter #0:
          type: @libcore.util.NullFromTypeParam

    method remove(Ljava/lang/Object;)Z:
        // param #0 has to allow nulls
        parameter #0:
          type: @libcore.util.Nullable

    method containsAll(Ljava/util/Collection;)Z:
        // Javadoc mention NPE for null param #0
        parameter #0:
          type: @libcore.util.NonNull

    method addAll(Ljava/util/Collection;)Z:
        // Javadoc mention NPE for null param #0
        parameter #0:
          type: @libcore.util.NonNull
          // boolean addAll(Collection<? extends E> c);
          // Nullness depends on type parameter nullness
          inner-type 3, 0, 2, 0: @libcore.util.NullFromTypeParam

    method addAll(ILjava/util/Collection;)Z:
        // Javadoc mention NPE for null param #1
        parameter #1:
          type: @libcore.util.NonNull
          // boolean addAll(int, Collection<? extends E> c);
          inner-type 3, 0, 2, 0: @libcore.util.NullFromTypeParam

    method removeAll(Ljava/util/Collection;)Z:
        // Javadoc mention NPE for null param #0
        parameter #0:
          type: @libcore.util.NonNull

    method retainAll(Ljava/util/Collection;)Z:
        // Javadoc mention NPE for null param #0
        parameter #0:
          type: @libcore.util.NonNull

    method replaceAll(Ljava/util/function/UnaryOperator;)V:
        // Javadoc mention NPE for null param #0
        parameter #0:
          type: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam

    method sort(Ljava/util/Comparator;)V:
        // Javadoc mention null as valid param #0
        parameter #0:
          type: @libcore.util.Nullable
          inner-type 3, 0, 2, 0: @libcore.util.NullFromTypeParam

    method equals(Ljava/lang/Object;)Z:
        // Null is valid argument #0
        parameter #0:
          type: @libcore.util.Nullable

    method get(I)Ljava/lang/Object;:
        // Nullness depends on type parameter nullness
        // E get(int index);
        return: @libcore.util.NullFromTypeParam

    method set(ILjava/lang/Object;)Ljava/lang/Object;:
        // Nullness depends on type parameter nullness
        // E set(int index, E element);
        parameter #1:
          type: @libcore.util.NullFromTypeParam
        return: @libcore.util.NullFromTypeParam

    method add(ILjava/lang/Object;)V:
        // Nullness depends on type parameter nullness
        // void add(int index, E element);
        parameter #1:
          type: @libcore.util.NullFromTypeParam

    method remove(I)Ljava/lang/Object;:
        // Nullness depends on type parameter nullness
        // E remove(int index);
        return: @libcore.util.NullFromTypeParam

    method indexOf(Ljava/lang/Object;)I:
        // Null is valid argument
        parameter #0:
          type: @libcore.util.Nullable

    method lastIndexOf(Ljava/lang/Object;)I:
        // Null is valid argument
        parameter #0:
          type: @libcore.util.Nullable

    method listIterator()Ljava/util/ListIterator;:
        // Javadoc doesn't mention possiblity of a null result
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam

    method listIterator(I)Ljava/util/ListIterator;:
        // Javadoc doesn't mention possiblity of a null result
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam

    method subList(II)Ljava/util/List;:
         // Javadoc doesn't mention possiblity of a null result
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam

    method spliterator()Ljava/util/Spliterator;:
        // Javadoc doesn't mention possiblity of a null result
        return: @libcore.util.NonNull

class Map:

    method containsKey(Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method containsValue(Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method get(Ljava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.Nullable

    method put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.NullFromTypeParam

    method remove(Ljava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.Nullable

    method putAll(Ljava/util/Map;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam
                inner-type 3, 1,2, 0: @libcore.util.NullFromTypeParam

    method keySet()Ljava/util/Set;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam

    method values()Ljava/util/Collection;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam

    method entrySet()Ljava/util/Set;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NonNull
            inner-type 3, 0,3, 0: @libcore.util.NullFromTypeParam
            inner-type 3, 0,3, 1: @libcore.util.NullFromTypeParam

    method equals(Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.Nullable
        parameter #1:
            type: @libcore.util.Nullable

    method forEach(Ljava/util/function/BiConsumer;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam
                inner-type 3, 1,2, 0: @libcore.util.NullFromTypeParam

    method replaceAll(Ljava/util/function/BiFunction;)V:
        return:
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam
                inner-type 3, 1,2, 0: @libcore.util.NullFromTypeParam
                inner-type 3, 2,2, 0: @libcore.util.NullFromTypeParam

    method putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.NullFromTypeParam

    method remove(Ljava/lang/Object;Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.Nullable
        parameter #1:
            type: @libcore.util.Nullable

    method replace(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.Nullable
        parameter #2:
            type: @libcore.util.NullFromTypeParam

    method replace(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.NullFromTypeParam

    method computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam
                inner-type 3, 1,2, 0: @libcore.util.Nullable

    method computeIfPresent(Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam
                inner-type 3, 1,2, 0: @libcore.util.NonNull
                inner-type 3, 2,2, 0: @libcore.util.Nullable

    method compute(Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam
                inner-type 3, 1,2, 0: @libcore.util.Nullable
                inner-type 3, 2,2, 0: @libcore.util.Nullable

    method merge(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;:
        return: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NullFromTypeParam
        parameter #1:
            type: @libcore.util.NonNull
        parameter #2:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NonNull
                inner-type 3, 1,2, 0: @libcore.util.NonNull
                inner-type 3, 2,2, 0: @libcore.util.Nullable

class Map$Entry:

    method getKey()Ljava/lang/Object;:
        return: @libcore.util.NullFromTypeParam

    method getValue()Ljava/lang/Object;:
        return: @libcore.util.NullFromTypeParam

    method setValue(Ljava/lang/Object;)Ljava/lang/Object;:
        return: @libcore.util.NullFromTypeParam
        parameter #0:
            type: @libcore.util.NullFromTypeParam

    method equals(Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method comparingByKey()Ljava/util/Comparator;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NonNull
            inner-type 3, 0,3, 0: @libcore.util.NonNull
            inner-type 3, 0,3, 1: @libcore.util.Nullable

    method comparingByValue()Ljava/util/Comparator;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NonNull
            inner-type 3, 0,3, 0: @libcore.util.Nullable
            inner-type 3, 0,3, 1: @libcore.util.NonNull

    method comparingByKey(Ljava/util/Comparator;)Ljava/util/Comparator;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NonNull
            inner-type 3, 0,3, 0: @libcore.util.NullFromTypeParam
            inner-type 3, 0,3, 1: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam

    method comparingByValue(Ljava/util/Comparator;)Ljava/util/Comparator;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NonNull
            inner-type 3, 0,3, 0: @libcore.util.Nullable
            inner-type 3, 0,3, 1: @libcore.util.NullFromTypeParam
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam

class Set:

    method contains(Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method iterator()Ljava/util/Iterator;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam

    method toArray()[Ljava/lang/Object;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.Nullable

    method toArray([Ljava/lang/Object;)[Ljava/lang/Object;:
        return: @libcore.util.NonNull
            inner-type 0, 0: @libcore.util.Nullable
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 0, 0: @libcore.util.Nullable

    method add(Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.NullFromTypeParam

    method remove(Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method containsAll(Ljava/util/Collection;)Z:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method addAll(Ljava/util/Collection;)Z:
        return:
        parameter #0:
            type: @libcore.util.NonNull
                inner-type 3, 0,2, 0: @libcore.util.NullFromTypeParam

    method retainAll(Ljava/util/Collection;)Z:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method removeAll(Ljava/util/Collection;)Z:
        return:
        parameter #0:
            type: @libcore.util.NonNull

    method equals(Ljava/lang/Object;)Z:
        return:
        parameter #0:
            type: @libcore.util.Nullable

    method spliterator()Ljava/util/Spliterator;:
        return: @libcore.util.NonNull
            inner-type 3, 0: @libcore.util.NullFromTypeParam