langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java
changeset 939 38e24969c7e9
parent 735 372aa565a221
child 1040 c0f5acfd9d15
--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java	Thu Jul 24 11:12:41 2008 +0100
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java	Thu Jul 24 19:06:57 2008 +0100
@@ -1442,107 +1442,6 @@
     }
 
 /* ***************************************************************************
- *  Methods related to kinds
- ****************************************************************************/
-
-    /** A localized string describing a given kind.
-     */
-    static JCDiagnostic kindName(int kind) {
-        switch (kind) {
-        case PCK: return JCDiagnostic.fragment("kindname.package");
-        case TYP: return JCDiagnostic.fragment("kindname.class");
-        case VAR: return JCDiagnostic.fragment("kindname.variable");
-        case VAL: return JCDiagnostic.fragment("kindname.value");
-        case MTH: return JCDiagnostic.fragment("kindname.method");
-        default : return JCDiagnostic.fragment("kindname",
-                                               Integer.toString(kind)); //debug
-        }
-    }
-
-    static JCDiagnostic kindName(Symbol sym) {
-        switch (sym.getKind()) {
-        case PACKAGE:
-            return JCDiagnostic.fragment("kindname.package");
-
-        case ENUM:
-        case ANNOTATION_TYPE:
-        case INTERFACE:
-        case CLASS:
-            return JCDiagnostic.fragment("kindname.class");
-
-        case TYPE_PARAMETER:
-            return JCDiagnostic.fragment("kindname.type.variable");
-
-        case ENUM_CONSTANT:
-        case FIELD:
-        case PARAMETER:
-        case LOCAL_VARIABLE:
-        case EXCEPTION_PARAMETER:
-            return JCDiagnostic.fragment("kindname.variable");
-
-        case METHOD:
-        case CONSTRUCTOR:
-        case STATIC_INIT:
-        case INSTANCE_INIT:
-            return JCDiagnostic.fragment("kindname.method");
-
-        default:
-            if (sym.kind == VAL)
-                // I don't think this can happen but it can't harm
-                // playing it safe --ahe
-                return JCDiagnostic.fragment("kindname.value");
-            else
-                return JCDiagnostic.fragment("kindname", sym.getKind()); // debug
-        }
-    }
-
-    /** A localized string describing a given set of kinds.
-     */
-    static JCDiagnostic kindNames(int kind) {
-        StringBuffer key = new StringBuffer();
-        key.append("kindname");
-        if ((kind & VAL) != 0)
-            key.append(((kind & VAL) == VAR) ? ".variable" : ".value");
-        if ((kind & MTH) != 0) key.append(".method");
-        if ((kind & TYP) != 0) key.append(".class");
-        if ((kind & PCK) != 0) key.append(".package");
-        return JCDiagnostic.fragment(key.toString(), kind);
-    }
-
-    /** A localized string describing the kind -- either class or interface --
-     *  of a given type.
-     */
-    static JCDiagnostic typeKindName(Type t) {
-        if (t.tag == TYPEVAR ||
-            t.tag == CLASS && (t.tsym.flags() & COMPOUND) != 0)
-            return JCDiagnostic.fragment("kindname.type.variable.bound");
-        else if (t.tag == PACKAGE)
-            return JCDiagnostic.fragment("kindname.package");
-        else if ((t.tsym.flags_field & ANNOTATION) != 0)
-            return JCDiagnostic.fragment("kindname.annotation");
-        else if ((t.tsym.flags_field & INTERFACE) != 0)
-            return JCDiagnostic.fragment("kindname.interface");
-        else
-            return JCDiagnostic.fragment("kindname.class");
-    }
-
-    /** A localized string describing the kind of a missing symbol, given an
-     *  error kind.
-     */
-    static JCDiagnostic absentKindName(int kind) {
-        switch (kind) {
-        case ABSENT_VAR:
-            return JCDiagnostic.fragment("kindname.variable");
-        case WRONG_MTHS: case WRONG_MTH: case ABSENT_MTH:
-            return JCDiagnostic.fragment("kindname.method");
-        case ABSENT_TYP:
-            return JCDiagnostic.fragment("kindname.class");
-        default:
-            return JCDiagnostic.fragment("kindname", kind);
-        }
-    }
-
-/* ***************************************************************************
  *  ResolveError classes, indicating error situations when accessing symbols
  ****************************************************************************/
 
@@ -1633,55 +1532,77 @@
          */
         void report(Log log, DiagnosticPosition pos, Type site, Name name,
                     List<Type> argtypes, List<Type> typeargtypes) {
+            if (argtypes == null)
+                argtypes = List.nil();
+            if (typeargtypes == null)
+                typeargtypes = List.nil();
             if (name != name.table.error) {
-                JCDiagnostic kindname = absentKindName(kind);
-                String idname = name.toString();
-                String args = "";
-                String typeargs = "";
+                KindName kindname = absentKind(kind);
+                Name idname = name;
                 if (kind >= WRONG_MTHS && kind <= ABSENT_MTH) {
                     if (isOperator(name)) {
                         log.error(pos, "operator.cant.be.applied",
-                                  name, Type.toString(argtypes));
+                                  name, argtypes);
                         return;
                     }
                     if (name == name.table.init) {
-                        kindname = JCDiagnostic.fragment("kindname.constructor");
-                        idname = site.tsym.name.toString();
+                        kindname = KindName.CONSTRUCTOR;
+                        idname = site.tsym.name;
                     }
-                    args = "(" + Type.toString(argtypes) + ")";
-                    if (typeargtypes != null && typeargtypes.nonEmpty())
-                        typeargs = "<" + Type.toString(typeargtypes) + ">";
                 }
                 if (kind == WRONG_MTH) {
+                    Symbol ws = wrongSym.asMemberOf(site, types);
                     log.error(pos,
                               "cant.apply.symbol" + (explanation != null ? ".1" : ""),
-                              wrongSym.asMemberOf(site, types),
-                              wrongSym.location(site, types),
-                              typeargs,
-                              Type.toString(argtypes),
+                              kindname,
+                              ws.name == names.init ? ws.owner.name : ws.name,
+                              ws.type.getParameterTypes(),
+                              argtypes,
+                              kindName(ws.owner),
+                              ws.owner.type,
                               explanation);
                 } else if (site.tsym.name.len != 0) {
                     if (site.tsym.kind == PCK && !site.tsym.exists())
                         log.error(pos, "doesnt.exist", site.tsym);
-                    else
-                        log.error(pos, "cant.resolve.location",
-                                  kindname, idname, args, typeargs,
-                                  typeKindName(site), site);
+                    else {
+                        String errKey = getErrorKey("cant.resolve.location",
+                                                    argtypes, typeargtypes,
+                                                    kindname);
+                        log.error(pos, errKey, kindname, idname, //symbol kindname, name
+                                  typeargtypes, argtypes, //type parameters and arguments (if any)
+                                  typeKindName(site), site); //location kindname, type
+                    }
                 } else {
-                    log.error(pos, "cant.resolve", kindname, idname, args, typeargs);
+                    String errKey = getErrorKey("cant.resolve",
+                                                argtypes, typeargtypes,
+                                                kindname);
+                    log.error(pos, errKey, kindname, idname, //symbol kindname, name
+                              typeargtypes, argtypes); //type parameters and arguments (if any)
                 }
             }
         }
-//where
-            /** A name designates an operator if it consists
-             *  of a non-empty sequence of operator symbols +-~!/*%&|^<>=
-             */
-            boolean isOperator(Name name) {
-                int i = 0;
-                while (i < name.len &&
-                       "+-~!*/%&|^<>=".indexOf(name.byteAt(i)) >= 0) i++;
-                return i > 0 && i == name.len;
+        //where
+        String getErrorKey(String key, List<Type> argtypes, List<Type> typeargtypes, KindName kindname) {
+            String suffix = "";
+            switch (kindname) {
+                case METHOD:
+                case CONSTRUCTOR: {
+                    suffix += ".args";
+                    suffix += typeargtypes.nonEmpty() ? ".params" : "";
+                }
             }
+            return key + suffix;
+        }
+
+        /** A name designates an operator if it consists
+         *  of a non-empty sequence of operator symbols +-~!/*%&|^<>=
+         */
+        boolean isOperator(Name name) {
+            int i = 0;
+            while (i < name.len &&
+                   "+-~!*/%&|^<>=".indexOf(name.byteAt(i)) >= 0) i++;
+            return i > 0 && i == name.len;
+        }
     }
 
     /** Resolve error class indicating that a symbol is not accessible.
@@ -1726,7 +1647,7 @@
                         sym, sym.location());
                 else if ((sym.flags() & (PRIVATE | PROTECTED)) != 0)
                     log.error(pos, "report.access", sym,
-                              TreeInfo.flagNames(sym.flags() & (PRIVATE | PROTECTED)),
+                              asFlagSet(sym.flags() & (PRIVATE | PROTECTED)),
                               sym.location());
                 else
                     log.error(pos, "not.def.public.cant.access",
@@ -1759,11 +1680,11 @@
                     Name name,
                     List<Type> argtypes,
                     List<Type> typeargtypes) {
-            String symstr = ((sym.kind == TYP && sym.type.tag == CLASS)
-                ? types.erasure(sym.type)
-                : sym).toString();
+            Symbol errSym = ((sym.kind == TYP && sym.type.tag == CLASS)
+                ? types.erasure(sym.type).tsym
+                : sym);
             log.error(pos, "non-static.cant.be.ref",
-                      kindName(sym), symstr);
+                      kindName(sym), errSym);
         }
     }