Home | History | Annotate | Download | only in proguard
      1 /*
      2  * ProGuard -- shrinking, optimization, obfuscation, and preverification
      3  *             of Java bytecode.
      4  *
      5  * Copyright (c) 2002-2014 Eric Lafortune (eric (at) graphics.cornell.edu)
      6  *
      7  * This program is free software; you can redistribute it and/or modify it
      8  * under the terms of the GNU General Public License as published by the Free
      9  * Software Foundation; either version 2 of the License, or (at your option)
     10  * any later version.
     11  *
     12  * This program is distributed in the hope that it will be useful, but WITHOUT
     13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
     15  * more details.
     16  *
     17  * You should have received a copy of the GNU General Public License along
     18  * with this program; if not, write to the Free Software Foundation, Inc.,
     19  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
     20  */
     21 package proguard;
     22 
     23 import proguard.classfile.*;
     24 import proguard.classfile.constant.*;
     25 import proguard.classfile.constant.visitor.ConstantVisitor;
     26 import proguard.classfile.util.*;
     27 
     28 /**
     29  * This constant visitor checks whether visited method references try to
     30  * access enclosing methods.
     31  *
     32  * @author Eric Lafortune
     33  */
     34 public class GetEnclosingMethodChecker
     35 extends      SimplifiedVisitor
     36 implements   ConstantVisitor
     37 {
     38     private final WarningPrinter notePrinter;
     39 
     40 
     41     /**
     42      * Creates a new GetEnclosingMethodChecker.
     43      */
     44     public GetEnclosingMethodChecker(WarningPrinter notePrinter)
     45     {
     46         this.notePrinter = notePrinter;
     47     }
     48 
     49 
     50     // Implementations for ConstantVisitor.
     51 
     52     public void visitAnyConstant(Clazz clazz, Constant constant) {}
     53 
     54 
     55     public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant)
     56     {
     57         String className = methodrefConstant.getClassName(clazz);
     58 
     59         if (className.equals(ClassConstants.NAME_JAVA_LANG_CLASS))
     60         {
     61             String methodName = methodrefConstant.getName(clazz);
     62 
     63             if (methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_ENCLOSING_CONSTRUCTOR) ||
     64                 methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_ENCLOSING_METHOD))
     65             {
     66                 notePrinter.print(clazz.getName(),
     67                                   "Note: " +
     68                                   ClassUtil.externalClassName(clazz.getName()) +
     69                                   " calls '" +
     70                                   ClassUtil.externalShortClassName(ClassUtil.externalClassName(className)) +
     71                                   "." +
     72                                   methodName + "'");
     73             }
     74         }
     75     }
     76 }
     77