import org.checkerframework.common.value.qual.ArrayLen;
import org.checkerframework.common.value.qual.ArrayLenRange;
import org.checkerframework.common.value.qual.IntRange;
import org.checkerframework.common.value.qual.IntVal;
import org.checkerframework.common.value.qual.MinLen;
import org.checkerframework.common.value.qual.StringVal;

public class StringLenConcats {

  void stringLenConcat(@ArrayLen(3) String a, @ArrayLen(5) String b) {
    @ArrayLen({7, 8, 9}) String ab = a + b;
    @ArrayLen({6, 7}) String bxx = b + "xx";
  }

  void stringLenRangeConcat(
      @ArrayLenRange(from = 3, to = 5) String a, @ArrayLenRange(from = 11, to = 19) String b) {
    @ArrayLenRange(from = 14, to = 24) String ab = a + b;
    @ArrayLenRange(from = 13, to = 21) String bxx = b + "xx";
  }

  void stringLenLenRangeConcat(
      @ArrayLen({3, 4, 5}) String a, @ArrayLenRange(from = 10, to = 100) String b) {
    @ArrayLenRange(from = 13, to = 105) String ab = a + b;
  }

  void stringValLenConcat(
      @StringVal("constant") String a,
      @StringVal({"a", "b", "c"}) String b,
      @StringVal({"a", "xxx"}) String c,
      @ArrayLen(11) String d) {

    @ArrayLen({8, 12, 15, 19}) String ad = a + d;
    @ArrayLen({5, 8, 12, 15}) String bd = b + d;
    @ArrayLenRange(from = 4, to = 15) String cd = c + d;
  }

  void stringValLenRangeConcat(
      @StringVal("constant") String a,
      @StringVal({"a", "b", "c"}) String b,
      @StringVal({"a", "xxx"}) String c,
      @ArrayLenRange(from = 11, to = 19) String d) {

    @ArrayLenRange(from = 19, to = 27) String ad = a + d;
    @ArrayLenRange(from = 12, to = 20) String bd = b + d;
    @ArrayLenRange(from = 12, to = 22) String cd = c + d;
  }

  void tooManyStringValConcat(
      @StringVal({"a", "b", "c", "d"}) String a,
      @StringVal({"ee", "ff", "gg", "hh", "ii"}) String b) {
    @ArrayLen({2, 5, 8}) String aa = a + a;
    @ArrayLen({3, 5, 6, 8}) String ab = a + b;
  }

  void charConversions(
      char c,
      @IntVal({1, 100, 10000}) char d,
      @ArrayLen({100, 200}) String s,
      @ArrayLenRange(from = 100, to = 200) String t,
      @StringVal({"a", "bb", "ccc", "dddd"}) String u) {
    @ArrayLen({5, 101, 201}) String sc = s + c;
    @ArrayLen({5, 101, 201}) String sd = s + d;

    @ArrayLenRange(from = 101, to = 201) String tc = t + c;

    @ArrayLen({2, 3, 4, 5}) String uc = u + c;
    @ArrayLen({2, 3, 4, 5}) String ud = u + d;
  }

  void intConversions(
      @IntVal(123) int intConst,
      @IntRange(from = -100000, to = 100) int intRange,
      @IntRange(from = 100, to = 100000) int positiveRange,
      int unknownInt,
      @ArrayLen(10) String a,
      @ArrayLenRange(from = 10, to = 20) String b,
      @StringVal({"aaa", "bbbbb"}) String c) {
    @ArrayLen({7, 13}) String aConst = a + intConst;
    @ArrayLenRange(from = 5, to = 17) String aRange = a + intRange;
    @ArrayLen({7, 8, 9, 10, 13, 14, 15, 16}) String aPositive = a + positiveRange;
    @ArrayLenRange(from = 11, to = 21) String aUnknown = a + unknownInt;

    @ArrayLenRange(from = 13, to = 23) String bConst = b + intConst;
    @ArrayLenRange(from = 11, to = 27) String bRange = b + intRange;
    @ArrayLenRange(from = 13, to = 26) String bPositive = b + positiveRange;
    @ArrayLenRange(from = 11, to = 31) String bUnknown = b + unknownInt;

    @StringVal({"aaa123", "bbbbb123", "null123"}) String cConst = c + intConst;
    @ArrayLen({4, 5, 6, 7, 8, 9, 10, 11, 12}) String cRange = c + intRange;
    @ArrayLen({6, 7, 8, 9, 10, 11}) String cPositive = c + positiveRange;
  }

  void longConversions(
      @IntVal(1000000000000l) long longConst,
      @IntRange(from = 10, to = 1000000000000l) long longRange,
      long unknownLong,
      @ArrayLen(10) String a) {

    @ArrayLen({17, 23}) String aConst = a + longConst;
    @ArrayLenRange(from = 12, to = 23) String aRange = a + longRange;
    @ArrayLenRange(from = 11, to = 30) String aUnknown = a + unknownLong;
  }

  void byteConversions(
      @IntVal(100) byte byteConst,
      @IntRange(from = 2, to = 10) byte byteRange,
      byte unknownByte,
      @ArrayLen(10) String a) {

    @ArrayLen({7, 13}) String aConst = a + byteConst;
    @ArrayLenRange(from = 5, to = 12) String aRange = a + byteRange;
    @ArrayLenRange(from = 5, to = 14) String aUnknown = a + unknownByte;
  }

  void minLenConcat(@MinLen(5) String s, @MinLen(7) String t) {
    @MinLen(12) String st = s + t;
  }
}
