⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 resolve.java

📁 java编译器gjc源码 java编译环境
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
        return syms.errSymbol;
    }

    /**
      * Resolve an appropriate implicit this instance for t's container.
      *  JLS2 8.8.5.1 and 15.9.2
      */
    Type resolveImplicitThis(int pos, Env env, Type t) {
        Type thisType = (((t.tsym.owner.kind & (MTH | VAR)) != 0) ?
                resolveSelf(pos, env, t.outer().tsym, names._this) :
                resolveSelfContaining(pos, env, t.tsym)).type;
        if (((AttrContext) env.info).isSelfCall && thisType.tsym == env.enclClass.sym)
            log.error(pos, "cant.ref.before.ctor.called", "this");
        return thisType;
    }

    /**
      * A localized string describing a given kind.
      */
    static String kindName(int kind) {
        switch (kind) {
        case PCK:
            return Log.getLocalizedString("kindname.package");

        case TYP:
            return Log.getLocalizedString("kindname.class");

        case VAR:
            return Log.getLocalizedString("kindname.variable");

        case VAL:
            return Log.getLocalizedString("kindname.value");

        case MTH:
            return Log.getLocalizedString("kindname.method");

        default:
            return Log.getLocalizedString("kindname.default", Integer.toString(kind));

        }
    }

    /**
      * A localized string describing a given set of kinds.
      */
    static String kindNames(int kind) {
        String[] s = new String[4];
        int i = 0;
        if ((kind & VAL) != 0)
            s[i++] = ((kind & VAL) == VAR) ?
                    Log.getLocalizedString("kindname.variable") :
                    Log.getLocalizedString("kindname.value");
        if ((kind & MTH) != 0)
            s[i++] = Log.getLocalizedString("kindname.method");
        if ((kind & TYP) != 0)
            s[i++] = Log.getLocalizedString("kindname.class");
        if ((kind & PCK) != 0)
            s[i++] = Log.getLocalizedString("kindname.package");
        String names = "";
        for (int j = 0; j < i - 1; j++)
            names = names + s[j] + ", ";
        if (i >= 1)
            names = names + s[i - 1];
        else
            names = Log.getLocalizedString("kindname.default",
                    Integer.toString(kind));
        return names;
    }

    /**
      * A localized string describing the kind -- either class or interface --
      *  of a given type.
      */
    static String typeKindName(Type t) {
        if (t.tag == CLASS && (t.tsym.flags() & COMPOUND) != 0)
            return Log.getLocalizedString("kindname.type.variable");
        else if (t.tag == PACKAGE)
            return Log.getLocalizedString("kindname.package");
        else if ((t.tsym.flags_field & INTERFACE) != 0)
            return Log.getLocalizedString("kindname.interface");
        else
            return Log.getLocalizedString("kindname.class");
    }

    /**
      * A localized string describing the kind of a missing symbol, given an
      *  error kind.
      */
    static String absentKindName(int kind) {
        switch (kind) {
        case ABSENT_VAR:
            return Log.getLocalizedString("kindname.variable");

        case WRONG_MTHS:

        case WRONG_MTH:

        case ABSENT_MTH:
            return Log.getLocalizedString("kindname.method");

        case ABSENT_TYP:
            return Log.getLocalizedString("kindname.class");

        default:
            return Log.getLocalizedString("kindname.identifier");

        }
    }

    /**
      * Root class for resolve errors.
      *  Instances of this class indicate "Symbol not found".
      *  Instances of subclass indicate other errors.
      */
    private static class ResolveError extends Symbol implements TypeTags {

        ResolveError(int kind, Symbol sym, String debugName) {
            super(kind, 0, null, null, null);
            this.debugName = debugName;
            this.sym = sym;
        }

        /**
          * The name of the kind of error, for debugging only.
          */
        final String debugName;

        /**
         * The symbol that was determined by resolution, or errSymbol if none
         *  was found.
         */
        final Symbol sym;

        /**
         * The symbol that was a close mismatch, or null if none was found.
         *  wrongSym is currently set if a simgle method with the correct name, but
         *  the wrong parameters was found.
         */
        Symbol wrongSym;

        /**
         * Print the (debug only) name of the kind of error.
         */
        public String toString() {
            return debugName + " wrongSym=" + wrongSym;
        }

        /**
          * Update wrongSym and return this
          */
        ResolveError setWrongSym(Symbol sym) {
            this.wrongSym = sym;
            return this;
        }

        /**
          * Report error.
          *  @param log       The error log to be used for error reporting.
          *  @param pos       The position to be used for error reporting.
          *  @param site      The original type from where the selection took place.
          *  @param name      The name of the symbol to be resolved.
          *  @param argtypes  The invocation's value parameters,
          *                   if we looked for a method.
          */
        void report(Log log, int pos, Type site, Name name, List argtypes) {
            if (name != name.table.error) {
                String kindname = absentKindName(kind);
                String idname = name.toJava();
                String args = "";
                if (kind >= WRONG_MTHS && kind <= ABSENT_MTH) {
                    if (isOperator(name)) {
                        log.error(pos, "operator.cant.be.applied", name.toJava(),
                                Type.toJavaList(argtypes));
                        return;
                    }
                    if (name == name.table.init) {
                        kindname = log.getLocalizedString("kindname.constructor");
                        idname = site.tsym.name.toJava();
                    }
                    args = "(" + Type.toJavaList(argtypes) + ")";
                }
                if (kind == WRONG_MTH) {
                    log.error(pos, "cant.apply.symbol",
                            wrongSym.asMemberOf(site).toJava(),
                            wrongSym.javaLocation(site), Type.toJavaList(argtypes));
                } else if (site.tsym.name.len != 0) {
                    if (site.tsym.kind == PCK && !site.tsym.exists())
                        log.error(pos, "doesnt.exist", site.tsym.toJava());
                    else if (idname.indexOf('$') != -1)
                        log.error(pos, "cant.resolve.location.perchance",
                                kindname, idname, args, typeKindName(site),
                                site.toJava(), idname.replace('$', '.'));
                    else
                        log.error(pos, "cant.resolve.location", kindname, idname,
                                args, typeKindName(site), site.toJava());
                } else
                    log.error(pos, "cant.resolve", kindname, idname, args);
            }
        }

        /**
          * 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.
      */
    static class AccessError extends ResolveError {

        AccessError(Symbol sym) {
            super(HIDDEN, sym, "access error");
        }

        /**
          * Report error.
          *  @param log       The error log to be used for error reporting.
          *  @param pos       The position to be used for error reporting.
          *  @param site      The original type from where the selection took place.
          *  @param name      The name of the symbol to be resolved.
          *  @param argtypes  The invocation's value parameters,
          *                   if we looked for a method.
          */
        void report(Log log, int pos, Type site, Name name, List argtypes) {
            if (sym.owner.type.tag != ERROR) {
                if (sym.name == sym.name.table.init && sym.owner != site.tsym)
                    new ResolveError(ABSENT_MTH, sym.owner,
                            "absent method " + sym).report(log, pos, site, name,
                            argtypes);
                if ((sym.flags() & PUBLIC) != 0)
                    log.error(pos, "not.def.public.class.intf.cant.access",
                            sym.toJava(), sym.javaLocation());
                else if ((sym.flags() & (PRIVATE | PROTECTED)) != 0)
                    log.error(pos, "report.access", sym.toJava(),
                            TreeInfo.flagNames(sym.flags() &
                            (PRIVATE | PROTECTED)), sym.javaLocation());
                else
                    log.error(pos, "not.def.public.cant.access", sym.toJava(),
                            sym.javaLocation());
            }
        }
    }

    /**
      * Resolve error class indicating that an instance member was accessed
      *  from a static context.
      */
    static class StaticError extends ResolveError {

        StaticError(Symbol sym) {
            super(HIDDEN, sym, "static error");
        }

        /**
          * Report error.
          *  @param log       The error log to be used for error reporting.
          *  @param pos       The position to be used for error reporting.
          *  @param site      The original type from where the selection took place.
          *  @param name      The name of the symbol to be resolved.
          *  @param argtypes  The invocation's value parameters,
          *                   if we looked for a method.
          */
        void report(Log log, int pos, Type site, Name name, List argtypes) {
            String symstr = sym.kind == TYP & sym.type.tag == CLASS ?
                    sym.type.toJava() : sym.toJava();
            log.error(pos, "non-static.cant.be.ref", kindName(sym.kind), symstr);
        }
    }

    /**
      * Resolve error class indicating an ambiguous reference.
      */
    static class AmbiguityError extends ResolveError {
        Symbol sym1;
        Symbol sym2;

        AmbiguityError(Symbol sym1, Symbol sym2) {
            super(AMBIGUOUS, sym1, "ambiguity error");
            this.sym1 = sym1;
            this.sym2 = sym2;
        }

        /**
          * Report error.
          *  @param log       The error log to be used for error reporting.
          *  @param pos       The position to be used for error reporting.
          *  @param site      The original type from where the selection took place.
          *  @param name      The name of the symbol to be resolved.
          *  @param argtypes  The invocation's value parameters,
          *                   if we looked for a method.
          */
        void report(Log log, int pos, Type site, Name name, List argtypes) {
            AmbiguityError pair = this;
            while (true) {
                if (pair.sym1.kind == AMBIGUOUS)
                    pair = (AmbiguityError) pair.sym1;
                else if (pair.sym2.kind == AMBIGUOUS)
                    pair = (AmbiguityError) pair.sym2;
                else
                    break;
            }
            Name sname = pair.sym1.name;
            if (sname == sname.table.init)
                sname = pair.sym1.owner.name;
            log.error(pos, "ref.ambiguous", sname.toJava(),
                    kindName(pair.sym1.kind), pair.sym1.toJava(),
                    pair.sym1.javaLocation(site), kindName(pair.sym2.kind),
                    pair.sym2.toJava(), pair.sym2.javaLocation(site));
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -