1f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver/* 2f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * Copyright 2012, Google Inc. 3f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * All rights reserved. 4f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * 5f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * Redistribution and use in source and binary forms, with or without 6f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * modification, are permitted provided that the following conditions are 7f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * met: 8f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * 9f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * * Redistributions of source code must retain the above copyright 10f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * notice, this list of conditions and the following disclaimer. 11f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * * Redistributions in binary form must reproduce the above 12f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * copyright notice, this list of conditions and the following disclaimer 13f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * in the documentation and/or other materials provided with the 14f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * distribution. 15f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * * Neither the name of Google Inc. nor the names of its 16f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * contributors may be used to endorse or promote products derived from 17f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * this software without specific prior written permission. 18f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * 19f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver */ 31f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver 32f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruverpackage org.jf.dexlib2.immutable.reference; 33f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver 34f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruverimport org.jf.dexlib2.ReferenceType; 35f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruverimport org.jf.dexlib2.iface.reference.*; 36f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruverimport org.jf.util.ExceptionWithContext; 37f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver 38f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruverimport javax.annotation.Nonnull; 39f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver 40f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruverpublic class ImmutableReferenceFactory { 41f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver @Nonnull 42f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver public static ImmutableReference of(Reference reference) { 43f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver if (reference instanceof StringReference) { 44f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver return ImmutableStringReference.of((StringReference)reference); 45f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver } 46f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver if (reference instanceof TypeReference) { 47f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver return ImmutableTypeReference.of((TypeReference)reference); 48f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver } 49f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver if (reference instanceof FieldReference) { 50f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver return ImmutableFieldReference.of((FieldReference)reference); 51f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver } 52f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver if (reference instanceof MethodReference) { 53f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver return ImmutableMethodReference.of((MethodReference)reference); 54f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver } 55f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver throw new ExceptionWithContext("Invalid reference type"); 56f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver } 57f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver 58f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver @Nonnull 59f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver public static ImmutableReference of(int referenceType, Reference reference) { 60f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver switch (referenceType) { 61f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver case ReferenceType.STRING: 62f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver return ImmutableStringReference.of((StringReference)reference); 63f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver case ReferenceType.TYPE: 64f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver return ImmutableTypeReference.of((TypeReference)reference); 65f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver case ReferenceType.FIELD: 66f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver return ImmutableFieldReference.of((FieldReference)reference); 67f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver case ReferenceType.METHOD: 68f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver return ImmutableMethodReference.of((MethodReference)reference); 69f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver } 70f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver throw new ExceptionWithContext("Invalid reference type: %d", referenceType); 71f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver } 72f81150ad43efac4d590f6b7ea1425896b7ffb011Ben Gruver} 73