1920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson/* 2920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Copyright (C) 2010 Google Inc. 3920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 4920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Licensed under the Apache License, Version 2.0 (the "License"); 5920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * you may not use this file except in compliance with the License. 6920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * You may obtain a copy of the License at 7920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 8920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * http://www.apache.org/licenses/LICENSE-2.0 9920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * 10920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * Unless required by applicable law or agreed to in writing, software 11920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * distributed under the License is distributed on an "AS IS" BASIS, 12920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * See the License for the specific language governing permissions and 14920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson * limitations under the License. 15920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson */ 16920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 17920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodsonpackage com.google.doclava; 18920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 19d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.ArrayList; 20d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinimport java.util.Arrays; 21d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 22d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sappersteinpublic class AnnotationInstanceInfo implements Resolvable { 23920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson private ClassInfo mType; 246ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein private String mAnnotationName; // for debugging purposes TODO - remove 25d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<AnnotationValueInfo> mElementValues; 26d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein private ArrayList<Resolution> mResolutions; 27d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 28d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public AnnotationInstanceInfo() { 29d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mType = null; 30d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mElementValues = new ArrayList<AnnotationValueInfo>(); 31d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 32920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 33920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public AnnotationInstanceInfo(ClassInfo type, AnnotationValueInfo[] elementValues) { 34920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson mType = type; 35d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mElementValues = new ArrayList<AnnotationValueInfo>(Arrays.asList(elementValues)); 36920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 37920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 38920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson ClassInfo type() { 39920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mType; 40920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 41920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 42d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void setClass(ClassInfo cl) { 43d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mType = cl; 44d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 45d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 466ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein public void setSimpleAnnotationName(String name) { 476ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein mAnnotationName = name; 48d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 49d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 50d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein ArrayList<AnnotationValueInfo> elementValues() { 51920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return mElementValues; 52920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 53920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson 54d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void addElementValue(AnnotationValueInfo info) { 55d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mElementValues.add(info); 56d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 57d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 58920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson @Override 59920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson public String toString() { 60920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson StringBuilder str = new StringBuilder(); 61920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson str.append("@"); 62d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (mType == null) { 636ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein str.append(mAnnotationName); 64d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } else { 65d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein str.append(mType.qualifiedName()); 66d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 67920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson str.append("("); 68d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 69d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (AnnotationValueInfo value : mElementValues) { 70d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (value.element() != null) { 71d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein str.append(value.element().name()); 72d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein str.append("="); 73d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 74d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 75920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson str.append(value.valueString()); 76d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (value != mElementValues.get(mElementValues.size()-1)) { 77920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson str.append(","); 78920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 79920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 80920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson str.append(")"); 81920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson return str.toString(); 82920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson } 83d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 84d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void addResolution(Resolution resolution) { 85d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein if (mResolutions == null) { 86d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mResolutions = new ArrayList<Resolution>(); 87d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 88d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 89d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein mResolutions.add(resolution); 90d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 91d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein 92d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein public void printResolutions() { 93d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein System.out.println("Resolutions for Annotation:"); 94d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein for (Resolution r : mResolutions) { 95d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein System.out.println(r); 96d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 97d6eaacbb9eb56763d38a3815fc509b92ed98a585Andrew Sapperstein } 986ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 996ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein public boolean resolveResolutions() { 1006ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein ArrayList<Resolution> resolutions = mResolutions; 1016ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein mResolutions = new ArrayList<Resolution>(); 1026ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1036ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein boolean allResolved = true; 1046ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein for (Resolution resolution : resolutions) { 1056ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein StringBuilder qualifiedClassName = new StringBuilder(); 1066ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein InfoBuilder.resolveQualifiedName(resolution.getValue(), qualifiedClassName, 1076ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein resolution.getInfoBuilder()); 1086ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1096ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein // if we still couldn't resolve it, save it for the next pass 1106ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein if ("".equals(qualifiedClassName.toString())) { 1116ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein mResolutions.add(resolution); 1126ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein allResolved = false; 1136ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } else if ("annotationTypeName".equals(resolution.getVariable())) { 1146ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein setClass(InfoBuilder.Caches.obtainClass(qualifiedClassName.toString())); 1156ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 1166ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 1176ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein 1186ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein return allResolved; 1196ba612efffba42bec102ac58a1540496158f747eAndrew Sapperstein } 120920dbbbaca6aa578f3b26d89e99d12754c26ed60Ben Dodson} 121