public Object visit(final Lookup node) {
            // generate expression
            final Expression expr = node.getExpression();
            generate(expr);

            // generate line number
            setLineNumber(node.getSourceInfo());

            // handle class references
            if (expr instanceof TypeExpression &&
                "class".equals(node.getLookupName().getName())) {

                mBuilder.loadClass(makeDesc(expr.getType()));
                return null;
            }

            // generate static field lookup if provided
            Field field = node.getReadProperty();
            if (field != null) {
            	mBuilder.loadStaticField(field.getDeclaringClass().getName(),
            			                 field.getName(),
            			                 makeDesc(node.getType()));

            	return null;
            }

            // generate null-safe check if necessary
            generateNullSafe(node, expr, new NullSafeCallback() {
                public Type execute() {
                    Method readMethod = node.getReadMethod();
                    String lookupName = node.getLookupName().getName();

                    if (expr.getType().getObjectClass().isArray() &&
                        lookupName.equals("length")) {

                        mBuilder.arrayLength();
                        return Type.INT_TYPE;
                    }
                    else {
                        if (Modifier.isStatic(readMethod.getModifiers())) {
                            // Discard the object to call method on.
                            mBuilder.pop();
                        }

                        mBuilder.invoke(readMethod);
                        return new Type(readMethod.getReturnType(),
                                        readMethod.getGenericReturnType());
                    }
                }
            });

            // nothing to update
            return null;
        }