1 /* 2 * Copyright 2014, Google Inc. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * * Redistributions in binary form must reproduce the above 12 * copyright notice, this list of conditions and the following disclaimer 13 * in the documentation and/or other materials provided with the 14 * distribution. 15 * * Neither the name of Google Inc. nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 package org.jf.smalidea.psi.impl; 33 34 import com.intellij.lang.ASTNode; 35 import com.intellij.psi.*; 36 import com.intellij.psi.impl.PsiImplUtil; 37 import com.intellij.psi.meta.PsiMetaData; 38 import org.jetbrains.annotations.NonNls; 39 import org.jetbrains.annotations.NotNull; 40 import org.jetbrains.annotations.Nullable; 41 import org.jf.smalidea.psi.SmaliElementTypes; 42 import org.jf.smalidea.psi.stub.SmaliAnnotationStub; 43 44 public class SmaliAnnotation extends SmaliStubBasedPsiElement<SmaliAnnotationStub> implements PsiAnnotation { 45 public SmaliAnnotation(@NotNull SmaliAnnotationStub stub) { 46 super(stub, SmaliElementTypes.ANNOTATION); 47 } 48 49 public SmaliAnnotation(@NotNull ASTNode node) { 50 super(node); 51 } 52 53 @NotNull @Override public SmaliAnnotationParameterList getParameterList() { 54 SmaliAnnotationParameterList paramList = findChildByClass(SmaliAnnotationParameterList.class); 55 // The structure of the parser should ensure the param list is always present, even if there are syntax errors 56 assert paramList != null; 57 return paramList; 58 } 59 60 @Nullable @Override public String getQualifiedName() { 61 PsiJavaCodeReferenceElement nameElement = getNameReferenceElement(); 62 if (nameElement != null) { 63 return nameElement.getQualifiedName(); 64 } 65 return null; 66 } 67 68 @Nullable public String getSmaliName() { 69 SmaliAnnotationStub stub = getStub(); 70 if (stub != null) { 71 return stub.getAnnotationSmaliTypeName(); 72 } 73 74 SmaliClassTypeElement classType = findChildByClass(SmaliClassTypeElement.class); 75 if (classType == null) { 76 return null; 77 } 78 return classType.getSmaliName(); 79 } 80 81 @Nullable @Override public PsiJavaCodeReferenceElement getNameReferenceElement() { 82 SmaliAnnotationStub stub = getStub(); 83 if (stub != null) { 84 String smaliName = stub.getAnnotationSmaliTypeName(); 85 if (smaliName != null) { 86 return new LightSmaliClassTypeElement(getManager(), smaliName); 87 } 88 } 89 return findChildByClass(SmaliClassTypeElement.class); 90 } 91 92 @Nullable @Override public PsiAnnotationMemberValue findAttributeValue(@Nullable @NonNls String attributeName) { 93 return PsiImplUtil.findAttributeValue(this, attributeName); 94 } 95 96 @Nullable @Override 97 public PsiAnnotationMemberValue findDeclaredAttributeValue(@Nullable @NonNls String attributeName) { 98 return PsiImplUtil.findDeclaredAttributeValue(this, attributeName); 99 } 100 101 @Override 102 public <T extends PsiAnnotationMemberValue> T setDeclaredAttributeValue( 103 @Nullable @NonNls String attributeName, @Nullable T value) { 104 // TODO: implement this 105 throw new UnsupportedOperationException(); 106 } 107 108 @Nullable @Override public PsiAnnotationOwner getOwner() { 109 return (PsiAnnotationOwner)getParentByStub(); 110 } 111 112 @Nullable @Override public PsiMetaData getMetaData() { 113 // I have no idea what this is 114 return null; 115 } 116 } 117