--- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Tue Mar 01 12:00:06 2011 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java Wed Mar 02 10:56:39 2011 +0000
@@ -1736,24 +1736,26 @@
*/
Symbol resolveSelfContaining(DiagnosticPosition pos,
Env<AttrContext> env,
- Symbol member) {
+ Symbol member,
+ boolean isSuperCall) {
Name name = names._this;
- Env<AttrContext> env1 = env;
+ Env<AttrContext> env1 = isSuperCall ? env.outer : env;
boolean staticOnly = false;
- while (env1.outer != null) {
- if (isStatic(env1)) staticOnly = true;
- if (env1.enclClass.sym.isSubClass(member.owner, types) &&
- isAccessible(env, env1.enclClass.sym.type, member)) {
- Symbol sym = env1.info.scope.lookup(name).sym;
- if (sym != null) {
- if (staticOnly) sym = new StaticError(sym);
- return access(sym, pos, env.enclClass.sym.type,
- name, true);
+ if (env1 != null) {
+ while (env1 != null && env1.outer != null) {
+ if (isStatic(env1)) staticOnly = true;
+ if (env1.enclClass.sym.isSubClass(member.owner, types)) {
+ Symbol sym = env1.info.scope.lookup(name).sym;
+ if (sym != null) {
+ if (staticOnly) sym = new StaticError(sym);
+ return access(sym, pos, env.enclClass.sym.type,
+ name, true);
+ }
}
+ if ((env1.enclClass.sym.flags() & STATIC) != 0)
+ staticOnly = true;
+ env1 = env1.outer;
}
- if ((env1.enclClass.sym.flags() & STATIC) != 0)
- staticOnly = true;
- env1 = env1.outer;
}
log.error(pos, "encl.class.required", member);
return syms.errSymbol;
@@ -1764,9 +1766,13 @@
* JLS2 8.8.5.1 and 15.9.2
*/
Type resolveImplicitThis(DiagnosticPosition pos, Env<AttrContext> env, Type t) {
+ return resolveImplicitThis(pos, env, t, false);
+ }
+
+ Type resolveImplicitThis(DiagnosticPosition pos, Env<AttrContext> env, Type t, boolean isSuperCall) {
Type thisType = (((t.tsym.owner.kind & (MTH|VAR)) != 0)
? resolveSelf(pos, env, t.getEnclosingType().tsym, names._this)
- : resolveSelfContaining(pos, env, t.tsym)).type;
+ : resolveSelfContaining(pos, env, t.tsym, isSuperCall)).type;
if (env.info.isSelfCall && thisType.tsym == env.enclClass.sym)
log.error(pos, "cant.ref.before.ctor.called", "this");
return thisType;