Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6722234

javac diagnostics need better integration with the type-system

XMLWordPrintable

    • Icon: Enhancement Enhancement
    • Resolution: Fixed
    • Icon: P3 P3
    • 7
    • 6, 7
    • tools
    • b62
    • generic
    • generic
    • Verified

      Javac diagnostics do not cope well with the type-system. Javac diagnostic system falls short when representing complex JDK 5 types such as intersection types, captured types, type-variables and so on.

      Examples:

      1) ********************

      CODE:

      class Foo<T extends String> {
        <T extends Integer> void foo(T t) {
            test(t);
        }
        void test(T t) {}
      }

      RESULTS:

      Test.java:6: test(T) in Foo<T> cannot be applied to (T)
            test(t);
            ^
      1 error

      PROBLEM:
      The diagnostic is ambiguous (as also reported in 5101303). Please add some info about the site in which the type-variable has been declared.

      2) **********************************************

      CODE:

      import javax.tools.*;
      class Test {
        static void test() {
         JavaCompiler compiler = null;
         compiler.getTask(null, null, null,
                       "Bad Argument", null, null);
      } }

      RESULTS:

      Test.java:6: getTask(java.io.Writer,javax.tools.JavaFileManager,
      javax.tools.DiagnosticListener<? super javax.tools.JavaFileObject>,
      java.lang.Iterable<java.lang.String>,java.lang.Iterable<java.lang.String>,
      java.lang.Iterable<? extends javax.tools.JavaFileObject>) in javax.tools.
      JavaCompiler cannot be applied to (<nulltype>,<nulltype>,<nulltype>,
      java.lang.String,<nulltype>,<nulltype>)
          compiler.getTask(null,null,null,"Bad Argument",null,null);
                   ^
      1 error

      PROBLEMS

      Too verbose. Can be improved by dropping qualified names in favor of simple names.

      3) **********************************************************************

      CODE:

      interface List<E> {}

      class Test {
          <T> void merge(List<T> l1, List<T> l2) {}
          void test(List<? extends Test> list) {
      merge(list, list);
          }
      }

      RESULTS:

      Test.java:6: <T>merge(List<T>,List<T>) in Test cannot be applied to (List<capture#173 of ? extends Test>,List<capture#228 of ? extends Test>)
      merge(list, list);
      ^
      1 error

      PROBLEMS

      The diagnostic is too unfriendly for a non-generics guru.

            mcimadamore Maurizio Cimadamore
            mcimadamore Maurizio Cimadamore
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: