import org.checkerframework.checker.signature.qual.*;

public class Conversion {

  class CharChar {
    @InternalForm String binaryNameToInternalForm(@BinaryName String bn) {
      return bn.replace('.', '/');
    }

    @BinaryName String internalFormToBinaryName(@InternalForm String iform) {
      return iform.replace('/', '.');
    }

    @InternalForm String binaryNameToInternalFormWRONG1(@BinaryName String bn) {
      // :: error: (return)
      return bn.replace('/', '.');
    }

    @InternalForm String binaryNameToInternalFormWRONG2(@BinaryName String bn) {
      // :: error: (return)
      return bn.replace(':', '/');
    }

    @InternalForm String binaryNameToInternalFormWRONG3(String bn) {
      // :: error: (return)
      return bn.replace('.', '/');
    }

    @BinaryName String internalFormToBinaryNameWRONG1(@InternalForm String iform) {
      // :: error: (return)
      return iform.replace('.', '/');
    }

    @BinaryName String internalFormToBinaryNameWRONG2(@InternalForm String iform) {
      // :: error: (return)
      return iform.replace('/', ':');
    }

    @BinaryName String internalFormToBinaryNameWRONG3(String iform) {
      // :: error: (return)
      return iform.replace('/', '.');
    }

    @DotSeparatedIdentifiers String binaryNameToDotSeparatedIdentifiers(@BinaryName String bn) {
      // :: error: (return)
      return bn.replace('$', '.');
    }

    @FullyQualifiedName String binaryNameToFullyQualifiedName(@BinaryName String bn) {
      // :: error: (return)
      return bn.replace('$', '.');
    }
  }

  class CharSequenceCharSequence {
    @InternalForm String binaryNameToInternalForm(@BinaryName String bn) {
      return bn.replace(".", "/");
    }

    @BinaryName String internalFormToBinaryName(@InternalForm String iform) {
      return iform.replace("/", ".");
    }

    @InternalForm String binaryNameToInternalFormWRONG1(@BinaryName String bn) {
      // :: error: (return)
      return bn.replace("/", ".");
    }

    @InternalForm String binaryNameToInternalFormWRONG2(@BinaryName String bn) {
      // :: error: (return)
      return bn.replace(":", "/");
    }

    @InternalForm String binaryNameToInternalFormWRONG3(String bn) {
      // :: error: (return)
      return bn.replace(".", "/");
    }

    @BinaryName String internalFormToBinaryNameWRONG1(@InternalForm String iform) {
      // :: error: (return)
      return iform.replace(".", "/");
    }

    @BinaryName String internalFormToBinaryNameWRONG2(@InternalForm String iform) {
      // :: error: (return)
      return iform.replace("/", ":");
    }

    @BinaryName String internalFormToBinaryNameWRONG3(String iform) {
      // :: error: (return)
      return iform.replace("/", ".");
    }

    @DotSeparatedIdentifiers String binaryNameToDotSeparatedIdentifiers(@BinaryName String bn) {
      // :: error: (return)
      return bn.replace("$", ".");
    }

    @FullyQualifiedName String binaryNameToFullyQualifiedName(@BinaryName String bn) {
      // :: error: (return)
      return bn.replace("$", ".");
    }
  }
}
