Ensure that SmaliModifierList's direct parent is a PsiModifierListOwner

This commit is contained in:
Ben Gruver 2015-04-02 19:48:22 -07:00
parent 912a474644
commit 4f16feb476
3 changed files with 69 additions and 2 deletions

View File

@ -32,14 +32,17 @@
package org.jf.smalidea.psi.iface;
import com.intellij.psi.PsiAnnotationOwner;
import com.intellij.psi.PsiModifierListOwner;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jf.smalidea.psi.impl.SmaliAnnotation;
import org.jf.smalidea.psi.impl.SmaliModifierList;
public interface SmaliModifierListOwner extends PsiAnnotationOwner {
public interface SmaliModifierListOwner extends PsiModifierListOwner, PsiAnnotationOwner {
@NotNull @Override SmaliAnnotation[] getAnnotations();
@NotNull @Override SmaliAnnotation[] getApplicableAnnotations();
@Nullable @Override SmaliAnnotation findAnnotation(@NotNull @NonNls String qualifiedName);
@NotNull @Override SmaliAnnotation addAnnotation(@NotNull @NonNls String qualifiedName);
@Nullable @Override SmaliModifierList getModifierList();
}

View File

@ -32,13 +32,16 @@
package org.jf.smalidea.psi.impl;
import com.intellij.lang.ASTNode;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jf.smalidea.psi.SmaliElementTypes;
import org.jf.smalidea.psi.iface.SmaliModifierListOwner;
import org.jf.smalidea.psi.leaf.SmaliClassDescriptor;
import org.jf.smalidea.psi.stub.SmaliClassStatementStub;
public class SmaliClassStatement extends SmaliStubBasedPsiElement<SmaliClassStatementStub> {
public class SmaliClassStatement extends SmaliStubBasedPsiElement<SmaliClassStatementStub>
implements SmaliModifierListOwner {
public SmaliClassStatement(@NotNull SmaliClassStatementStub stub) {
super(stub, SmaliElementTypes.CLASS_STATEMENT);
}
@ -52,6 +55,11 @@ public class SmaliClassStatement extends SmaliStubBasedPsiElement<SmaliClassStat
return findChildByClass(SmaliClassTypeElement.class);
}
@Nullable
public SmaliClass getContainingClass() {
return getStubOrPsiParentOfType(SmaliClass.class);
}
@Nullable
public SmaliClassDescriptor getNameIdentifier() {
SmaliClassTypeElement classTypeElement = getNameElement();
@ -82,4 +90,54 @@ public class SmaliClassStatement extends SmaliStubBasedPsiElement<SmaliClassStat
public SmaliModifierList getModifierList() {
return getStubOrPsiChild(SmaliElementTypes.MODIFIER_LIST);
}
@NotNull
@Override
public SmaliAnnotation addAnnotation(@NotNull @NonNls String qualifiedName) {
SmaliClass containingClass = getContainingClass();
if (containingClass == null) {
// TODO: what should we do here?
return null;
}
return containingClass.addAnnotation(qualifiedName);
}
@NotNull
@Override
public SmaliAnnotation[] getAnnotations() {
SmaliClass containingClass = getContainingClass();
if (containingClass == null) {
return new SmaliAnnotation[0];
}
return containingClass.getAnnotations();
}
@NotNull
@Override
public SmaliAnnotation[] getApplicableAnnotations() {
SmaliClass containingClass = getContainingClass();
if (containingClass == null) {
return new SmaliAnnotation[0];
}
return containingClass.getApplicableAnnotations();
}
@Nullable
@Override
public SmaliAnnotation findAnnotation(@NotNull @NonNls String qualifiedName) {
SmaliClass containingClass = getContainingClass();
if (containingClass == null) {
return null;
}
return containingClass.findAnnotation(qualifiedName);
}
@Override
public boolean hasModifierProperty(@NonNls @NotNull String name) {
SmaliClass containingClass = getContainingClass();
if (containingClass == null) {
return false;
}
return containingClass.hasModifierProperty(name);
}
}

View File

@ -32,6 +32,7 @@
package org.jf.smalidea;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.psi.PsiModifierListOwner;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
import org.jf.dexlib2.AccessFlags;
import org.jf.smalidea.psi.impl.SmaliAnnotation;
@ -163,6 +164,11 @@ public class SmaliClassModifierListTest extends LightCodeInsightFixtureTestCase
SmaliClass smaliClass = file.getPsiClass();
SmaliModifierList modifierList = smaliClass.getModifierList();
// Ensures that the parent of the modifier list is a PsiModifierListOwner
// e.g. for code like JavaSuppressionUtil.getInspectionIdsSuppressedInAnnotation,
// which assumes the parent is a PsiModifierListOwner
Assert.assertTrue(modifierList.getParent() instanceof PsiModifierListOwner);
Assert.assertEquals(0, modifierList.getAnnotations().length);
Assert.assertEquals(0, modifierList.getApplicableAnnotations().length);
}