TextBuffer (int indent, BytecodeMappingTracer tracer) { TextBuffer buf = new TextBuffer(); if (isStatic) { ClassNode node = (ClassNode)DecompilerContext.getProperty(DecompilerContext.CURRENT_CLASS_NODE); if (node == null || !classname.equals(node.classStruct.qualifiedName) || isAmbiguous()) { buf.append(DecompilerContext.getImportCollector().getNestedNameInClassContext(ExprProcessor.buildJavaClassName(classname))); buf.append("."); } } else { String super_qualifier = null; if (instance != null && instance.type == Exprent.EXPRENT_VAR) { VarExprent instVar = (VarExprent)instance; VarVersionPair pair = new VarVersionPair(instVar); MethodWrapper currentMethod = (MethodWrapper)DecompilerContext.getProperty(DecompilerContext.CURRENT_METHOD_WRAPPER); if (currentMethod != null) { // FIXME: remove String this_classname = currentMethod.varproc.getThisVars().get(pair); if (this_classname != null) { if (!classname.equals(this_classname)) { // TODO: direct comparison to the super class? super_qualifier = this_classname; } } } } if (super_qualifier != null) { TextUtil.writeQualifiedSuper(buf, super_qualifier); } else { TextBuffer buff = new TextBuffer(); boolean casted = ExprProcessor.getCastedExprent(instance, new VarType(CodeConstants.TYPE_OBJECT, 0, classname), buff, indent, true, tracer); String res = buff.toString(); if (casted || instance.getPrecedence() > getPrecedence()) { res = "(" + res + ")"; } buf.append(res); } if (buf.toString().equals( VarExprent.VAR_NAMELESS_ENCLOSURE)) { // FIXME: workaround for field access of an anonymous enclosing class. Find a better way. buf.setLength(0); } else { buf.append("."); } } buf.append(name); tracer.addMapping(bytecode); return buf; }