1 /* 2 * Copyright 2012, Google LLC 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google LLC nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 package com.android.tools.smali.dexlib2.immutable; 32 33 import com.android.tools.smali.dexlib2.base.BaseAnnotationElement; 34 import com.android.tools.smali.dexlib2.iface.AnnotationElement; 35 import com.android.tools.smali.dexlib2.iface.value.EncodedValue; 36 import com.android.tools.smali.dexlib2.immutable.value.ImmutableEncodedValue; 37 import com.android.tools.smali.dexlib2.immutable.value.ImmutableEncodedValueFactory; 38 import com.android.tools.smali.util.ImmutableConverter; 39 40 import javax.annotation.Nonnull; 41 import javax.annotation.Nullable; 42 import java.util.Set; 43 44 public class ImmutableAnnotationElement extends BaseAnnotationElement { 45 @Nonnull protected final String name; 46 @Nonnull protected final ImmutableEncodedValue value; 47 ImmutableAnnotationElement(@onnull String name, @Nonnull EncodedValue value)48 public ImmutableAnnotationElement(@Nonnull String name, 49 @Nonnull EncodedValue value) { 50 this.name = name; 51 this.value = ImmutableEncodedValueFactory.of(value); 52 } 53 ImmutableAnnotationElement(@onnull String name, @Nonnull ImmutableEncodedValue value)54 public ImmutableAnnotationElement(@Nonnull String name, 55 @Nonnull ImmutableEncodedValue value) { 56 this.name = name; 57 this.value = value; 58 } 59 of(AnnotationElement annotationElement)60 public static ImmutableAnnotationElement of(AnnotationElement annotationElement) { 61 if (annotationElement instanceof ImmutableAnnotationElement) { 62 return (ImmutableAnnotationElement)annotationElement; 63 } 64 return new ImmutableAnnotationElement( 65 annotationElement.getName(), 66 annotationElement.getValue()); 67 } 68 getName()69 @Nonnull @Override public String getName() { return name; } getValue()70 @Nonnull @Override public EncodedValue getValue() { return value; } 71 72 @Nonnull immutableSetOf( @ullable Iterable<? extends AnnotationElement> list)73 public static Set<ImmutableAnnotationElement> immutableSetOf( 74 @Nullable Iterable<? extends AnnotationElement> list) { 75 return CONVERTER.toSet(list); 76 } 77 78 private static final ImmutableConverter<ImmutableAnnotationElement, AnnotationElement> CONVERTER = 79 new ImmutableConverter<ImmutableAnnotationElement, AnnotationElement>() { 80 @Override 81 protected boolean isImmutable(@Nonnull AnnotationElement item) { 82 return item instanceof ImmutableAnnotationElement; 83 } 84 85 @Nonnull 86 @Override 87 protected ImmutableAnnotationElement makeImmutable(@Nonnull AnnotationElement item) { 88 return ImmutableAnnotationElement.of(item); 89 } 90 }; 91 } 92