/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.dx.command.annotool; import com.android.dx.cf.direct.ClassPathOpener; import com.android.dx.cf.direct.DirectClassFile; import com.android.dx.cf.direct.StdAttributeFactory; import com.android.dx.cf.iface.AttributeList; import com.android.dx.cf.iface.Attribute; import com.android.dx.cf.attrib.AttRuntimeInvisibleAnnotations; import com.android.dx.cf.attrib.BaseAnnotations; import com.android.dx.cf.attrib.AttRuntimeVisibleAnnotations; import com.android.dx.util.ByteArray; import com.android.dx.rop.annotation.Annotation; import java.io.File; import java.lang.annotation.ElementType; import java.util.EnumSet; import java.util.Arrays; public class Main { private static class InvalidArgumentException extends Exception { InvalidArgumentException() { super(); } InvalidArgumentException(String s) { super(s); } } enum PrintType { CLASS, INNERCLASS, METHOD, PACKAGE } static class Arguments { /** * from --annotation, dot-seperated classname * of annotation to look for */ String aclass; /** from --eTypes */ EnumSet<ElementType> eTypes = EnumSet.noneOf(ElementType.class); /** from --print */ EnumSet<PrintType> printTypes = EnumSet.noneOf(PrintType.class); /** remaining positional arguments */ String[] files; Arguments() { } void parse (String[] argArray) throws InvalidArgumentException { for (int i = 0; i < argArray.length; i++) { String arg = argArray[i]; if (arg.startsWith("--annotation=")) { String argParam = arg.substring(arg.indexOf('=') + 1); if (aclass != null) { throw new InvalidArgumentException( "--annotation can only be specified once."); } aclass = argParam.replace('.','/'); } else if (arg.startsWith("--element=")) { String argParam = arg.substring(arg.indexOf('=') + 1); try { for (String p : argParam.split(",")) { eTypes.add(ElementType.valueOf(p.toUpperCase())); } } catch (IllegalArgumentException ex) { throw new InvalidArgumentException( "invalid --element"); } } else if (arg.startsWith("--print=")) { String argParam = arg.substring(arg.indexOf('=') + 1); try { for (String p : argParam.split(",")) { printTypes.add(PrintType.valueOf(p.toUpperCase())); } } catch (IllegalArgumentException ex) { throw new InvalidArgumentException("invalid --print"); } } else { files = new String[argArray.length - i]; System.arraycopy(argArray, i, files, 0, files.length); break; } } if (aclass == null) { throw new InvalidArgumentException( "--annotation must be specified"); } if (printTypes.isEmpty()) { printTypes.add(PrintType.CLASS); } if (eTypes.isEmpty()) { eTypes.add(ElementType.TYPE); } EnumSet<ElementType> set = eTypes.clone(); set.remove(ElementType.TYPE); set.remove(ElementType.PACKAGE); if (!set.isEmpty()) { throw new InvalidArgumentException( "only --element parameters 'type' and 'package' " + "supported"); } } } /** * This class is uninstantiable. */ private Main() { // This space intentionally left blank. } public static void main(String[] argArray) { final Arguments args = new Arguments(); try { args.parse(argArray); } catch (InvalidArgumentException ex) { System.err.println(ex.getMessage()); throw new RuntimeException("usage"); } new AnnotationLister(args).process(); } }