12270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom/*
22270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * ProGuard -- shrinking, optimization, obfuscation, and preverification
32270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom *             of Java bytecode.
42270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom *
52270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
62270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom *
72270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * This program is free software; you can redistribute it and/or modify it
82270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * under the terms of the GNU General Public License as published by the Free
92270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Software Foundation; either version 2 of the License, or (at your option)
102270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * any later version.
112270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom *
122270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * This program is distributed in the hope that it will be useful, but WITHOUT
132270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
142270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
152270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * more details.
162270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom *
172270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * You should have received a copy of the GNU General Public License along
182270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * with this program; if not, write to the Free Software Foundation, Inc.,
192270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom */
212270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrompackage proguard;
222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.*;
242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.constant.*;
252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.constant.visitor.ConstantVisitor;
262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.util.*;
272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
282270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom/**
292270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * This constant visitor checks whether visited method references try to
302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * access enclosing classes.
312270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom *
322270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * @author Eric Lafortune
332270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom */
342270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrompublic class GetEnclosingClassChecker
352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromextends      SimplifiedVisitor
362270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimplements   ConstantVisitor
372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom{
382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    private final WarningPrinter notePrinter;
392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
402270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    /**
422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     * Creates a new GetEnclosingMethodChecker.
432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom     */
442270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    public GetEnclosingClassChecker(WarningPrinter notePrinter)
452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    {
462270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        this.notePrinter = notePrinter;
472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    }
482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
502270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    // Implementations for ConstantVisitor.
512270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
522270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    public void visitAnyConstant(Clazz clazz, Constant constant) {}
532270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
542270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant)
562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    {
572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        String className = methodrefConstant.getClassName(clazz);
582270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
592270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        if (className.equals(ClassConstants.NAME_JAVA_LANG_CLASS))
602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        {
612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            String methodName = methodrefConstant.getName(clazz);
622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom
632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            if (methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_ENCLOSING_CLASS) ||
642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_DECLARING_CLASS))
652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            {
662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                notePrinter.print(clazz.getName(),
672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                  "Note: " +
682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                  ClassUtil.externalClassName(clazz.getName()) +
692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                  " calls '" +
702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                  ClassUtil.externalShortClassName(ClassUtil.externalClassName(className)) +
712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                  "." +
722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom                                  methodName + "'");
732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom            }
742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom        }
752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom    }
762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom}
77