blob: be600065822106df1d20149a74ccea7fa8ea87f2 [file] [log] [blame]
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.psi;
import com.intellij.openapi.application.ex.PathManagerEx;
import com.intellij.openapi.projectRoots.impl.JavaSdkImpl;
import com.intellij.openapi.roots.LanguageLevelProjectExtension;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileFilter;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.searches.AnnotatedMembersSearch;
import com.intellij.psi.search.searches.AnnotatedPackagesSearch;
import com.intellij.psi.search.searches.ClassInheritorsSearch;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.testFramework.IdeaTestUtil;
import com.intellij.testFramework.PlatformTestCase;
import com.intellij.testFramework.PsiTestCase;
import com.intellij.testFramework.PsiTestUtil;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
/**
* @author dsl
*/
@PlatformTestCase.WrapInCommand
public class Src15RepositoryUseTest extends PsiTestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
LanguageLevelProjectExtension.getInstance(myProject).setLanguageLevel(LanguageLevel.JDK_1_5);
String root = PathManagerEx.getTestDataPath() + "/psi/repositoryUse/src15";
PsiTestUtil.removeAllRoots(myModule, IdeaTestUtil.getMockJdk17("mock 1.5"));
PsiTestUtil.createTestProjectStructure(myProject, myModule, root, myFilesToDelete);
}
@Override
protected void tearDown() throws Exception {
LanguageLevelProjectExtension.getInstance(myProject).setLanguageLevel(LanguageLevel.JDK_1_5);
super.tearDown();
}
public void testStaticImports() throws IOException {
setupLoadingFilter();
final PsiClass aClass = findClass("staticImports.StaticImports");
final PsiJavaFile javaFile = (PsiJavaFile)aClass.getContainingFile();
doTestStaticImports(javaFile, false);
tearDownLoadingFilter();
doTestStaticImports(javaFile, true);
}
public void testDeprecatedAnnotation() throws IOException {
setupLoadingFilter();
final PsiClass aClass = findClass("annotations.DeprecatedAnnotation");
assertTrue(aClass.isDeprecated());
PsiMethod method = aClass.getMethods()[0];
assertTrue(method.isDeprecated());
PsiField field = aClass.getFields()[0];
assertTrue(field.isDeprecated());
tearDownLoadingFilter();
}
public void testEnumImplements() {
setupLoadingFilter();
final PsiClass aClass = findClass("enumImplements.MyEnum");
final PsiClassType[] implementsListTypes = aClass.getImplementsListTypes();
assertEquals(1, implementsListTypes.length);
final PsiClass baseInterface = implementsListTypes[0].resolve();
assertNotNull(baseInterface);
assertEquals("I", baseInterface.getName());
tearDownLoadingFilter();
}
private static void doTestStaticImports(final PsiJavaFile javaFile, boolean okToLoadTree) {
final PsiImportList importList = javaFile.getImportList();
assertNotNull(importList);
final PsiImportStatementBase[] allImportStatements = importList.getAllImportStatements();
assertEquals(6, allImportStatements.length);
final PsiImportStatement[] importStatements = importList.getImportStatements();
assertEquals(2, importStatements.length);
final PsiImportStaticStatement[] importStaticStatements = importList.getImportStaticStatements();
assertEquals(4, importStaticStatements.length);
assertFalse(importStatements[0].isOnDemand());
assertTrue(importStaticStatements[0].isOnDemand());
assertFalse(importStatements[0].isOnDemand());
assertTrue(importStaticStatements[1].isOnDemand());
assertFalse(importStaticStatements[2].isOnDemand());
assertFalse(importStaticStatements[3].isOnDemand());
assertEquals("sort", importStaticStatements[2].getReferenceName());
assertEquals("sort", importStaticStatements[3].getReferenceName());
final PsiImportStaticStatement classReference1 = importStaticStatements[1];
final PsiElement element1 = classReference1.resolveTargetClass();
assertNotNull(element1);
assertTrue(element1 instanceof PsiClass);
assertEquals("java.util.Arrays", ((PsiClass)element1).getQualifiedName());
final PsiImportStaticStatement classReference3 = importStaticStatements[3];
final PsiElement element3 = classReference3.resolveTargetClass();
assertNotNull(element3);
assertTrue(element3 instanceof PsiClass);
assertEquals("java.util.Arrays", ((PsiClass)element3).getQualifiedName());
if (okToLoadTree) {
assertEquals("java.util.Collections", getText(importStaticStatements[0]));
assertEquals("java.util.Arrays", getText(importStaticStatements[1]));
assertEquals("java.util.Collections.sort", getText(importStaticStatements[2]));
assertEquals("java.util.Arrays.sort", getText(importStaticStatements[3]));
}
}
private static String getText(PsiImportStaticStatement statement) {
final PsiJavaCodeReferenceElement reference = statement.getImportReference();
return reference != null ? reference.getText() : "(null ref)";
}
public void testEnum() throws Exception {
setupLoadingFilter();
final PsiClass enumClass = findClass("enums.OurEnum");
assertTrue(enumClass.isEnum());
final PsiClass superClass = enumClass.getSuperClass();
assertNotNull(superClass);
assertEquals("java.lang.Enum", superClass.getQualifiedName());
assertTrue(enumClass.isInheritor(superClass, false));
final PsiClassType[] superTypes = enumClass.getSuperTypes();
assertEquals(1, superTypes.length);
assertEquals("java.lang.Enum<enums.OurEnum>", superTypes[0].getCanonicalText());
final PsiClass[] supers = enumClass.getSupers();
assertEquals(1, supers.length);
assertEquals("java.lang.Enum", supers[0].getQualifiedName());
final PsiClassType[] extendsListTypes = enumClass.getExtendsListTypes();
assertEquals(1, extendsListTypes.length);
assertEquals("java.lang.Enum<enums.OurEnum>", extendsListTypes[0].getCanonicalText());
final PsiSubstitutor superClassSubstitutor = TypeConversionUtil.getSuperClassSubstitutor(superClass, enumClass, PsiSubstitutor.EMPTY);
assertEquals("java.lang.Enum<enums.OurEnum>", myJavaFacade.getElementFactory().createType(superClass, superClassSubstitutor).getCanonicalText());
tearDownLoadingFilter();
}
public void testEnumWithConstants() throws Exception {
setupLoadingFilter();
PsiClass enumClass = findClass("enums.OurEnumWithConstants");
assertTrue(enumClass.isEnum());
checkEnumWithConstants(enumClass, false);
tearDownLoadingFilter();
checkEnumWithConstants(enumClass, true);
}
public void testEnumWithInitializedConstants() throws Exception {
setupLoadingFilter();
final GlobalSearchScope moduleScope = GlobalSearchScope.moduleScope(myModule);
PsiClass enumClass = findClass("enums.OurEnumWithInitializedConstants");
assertTrue(enumClass.isEnum());
PsiField[] fields = enumClass.getFields();
assertEquals(3, fields.length);
assertTrue(fields[0] instanceof PsiEnumConstant);
assertTrue(fields[1] instanceof PsiEnumConstant);
assertTrue(fields[2] instanceof PsiEnumConstant);
PsiAnonymousClass initializingClass0 = ((PsiEnumConstant)fields[0]).getInitializingClass();
assertNotNull(initializingClass0);
PsiClass baseClass0 = initializingClass0.getBaseClassType().resolve();
assertTrue(baseClass0 == enumClass);
PsiAnonymousClass initializingClass1 = ((PsiEnumConstant)fields[1]).getInitializingClass();
assertNotNull(initializingClass1);
PsiClass baseClass1 = initializingClass1.getBaseClassType().resolve();
assertTrue(baseClass1 == enumClass);
PsiAnonymousClass initializingClass2 = ((PsiEnumConstant)fields[1]).getInitializingClass();
assertNotNull(initializingClass2);
PsiClass baseClass2 = initializingClass2.getBaseClassType().resolve();
assertTrue(baseClass2 == enumClass);
assertTrue(initializingClass0.isInheritor(enumClass, false));
assertTrue(initializingClass1.isInheritor(enumClass, false));
assertTrue(initializingClass2.isInheritor(enumClass, false));
final PsiClass[] enumInheritors = ClassInheritorsSearch.search(enumClass, moduleScope, false).toArray(PsiClass.EMPTY_ARRAY);
assertEquals(3, enumInheritors.length);
assertTrue(Arrays.asList(enumInheritors).contains(initializingClass0));
assertTrue(Arrays.asList(enumInheritors).contains(initializingClass1));
assertTrue(Arrays.asList(enumInheritors).contains(initializingClass2));
PsiMethod[] methods1 = initializingClass2.getMethods();
assertEquals(1, methods1.length);
assertEquals("foo", methods1[0].getName());
final PsiClass baseInterfaceClass = findClass("enums.OurBaseInterface");
final PsiClass[] inheritors = ClassInheritorsSearch.search(baseInterfaceClass, moduleScope, false).toArray(PsiClass.EMPTY_ARRAY);
assertEquals(1, inheritors.length);
assertTrue(inheritors[0] instanceof PsiAnonymousClass);
tearDownLoadingFilter();
assertTrue(inheritors[0].getParent().getParent() instanceof PsiExpressionList);
assertTrue(inheritors[0].getParent().getParent().getParent() == fields[2]);
final PsiExpressionList argumentList = ((PsiEnumConstant)fields[2]).getArgumentList();
assertNotNull(argumentList);
final PsiExpression[] expressions2 = argumentList.getExpressions();
assertEquals(1, expressions2.length);
assertTrue(expressions2[0] instanceof PsiNewExpression);
final PsiAnonymousClass anonymousClass2 = ((PsiNewExpression)expressions2[0]).getAnonymousClass();
assertTrue(anonymousClass2 != null);
assertTrue(anonymousClass2.isInheritor(baseInterfaceClass, false));
}
private static void checkEnumWithConstants(PsiClass enumClass, boolean okToLoadTree) {
PsiField[] fields = enumClass.getFields();
assertEquals(3, fields.length);
checkEnumConstant("A", fields[0]);
checkEnumConstant("B", fields[1]);
checkEnumConstant("C", fields[2]);
if (okToLoadTree) {
assertEquals("A", fields[0].getText());
assertEquals("B", fields[1].getText());
assertEquals("C", fields[2].getText());
}
}
private static void checkEnumConstant(String expectedName, PsiField field) {
assertTrue(field instanceof PsiEnumConstant);
assertEquals(expectedName, field.getName());
assertTrue(field.hasModifierProperty(PsiModifier.PUBLIC));
assertTrue(field.hasModifierProperty(PsiModifier.FINAL));
assertTrue(field.hasModifierProperty(PsiModifier.STATIC));
}
public void testEnumWithConstantsAndStaticFields() throws Exception {
setupLoadingFilter();
PsiClass enumClass = findClass("enums.OurEnumWithConstantsAndStaticFields");
PsiField[] fields = enumClass.getFields();
assertTrue(fields[0] instanceof PsiEnumConstant);
assertTrue(fields[1] instanceof PsiEnumConstant);
assertTrue(fields[2] instanceof PsiEnumConstant);
assertFalse(fields[3] instanceof PsiEnumConstant);
tearDownLoadingFilter();
assertEquals("public static final int A1 = 1;", fields[3].getText());
}
public void testEnumWithConstantsAndStaticFields2() throws Exception {
setupLoadingFilter();
PsiClass enumClass = findClass("enums.OurEnumWithConstantsAndStaticFields2");
PsiField[] fields = enumClass.getFields();
assertTrue(fields[0] instanceof PsiEnumConstant);
assertTrue(fields[1] instanceof PsiEnumConstant);
assertTrue(fields[2] instanceof PsiEnumConstant);
assertFalse(fields[3] instanceof PsiEnumConstant);
tearDownLoadingFilter();
assertEquals("public static final int A1 = 10;", fields[3].getText());
enumClass.accept(new JavaRecursiveElementWalkingVisitor(){
@Override public void visitReferenceExpression(PsiReferenceExpression expression) {
visitExpression(expression);
}
});
enumClass.getText();
}
public void testAnnotationType() throws Exception {
setupLoadingFilter();
final PsiClass annotationTypeClass = findClass("annotations.AnnotationType");
assertTrue(annotationTypeClass.isAnnotationType());
tearDownLoadingFilter();
}
public void testAnnotationIndex() throws Exception {
getJavaFacade().setAssertOnFileLoadingFilter(new VirtualFileFilter() {
@Override
public boolean accept(final VirtualFile file) {
return !"package-info.java".equals(file.getName());
}
}, myTestRootDisposable);
final PsiClass annotationTypeClass = findClass("annotations.AnnotationType");
assertTrue(annotationTypeClass.isAnnotationType());
final Collection<PsiMember> all = AnnotatedMembersSearch.search(annotationTypeClass, GlobalSearchScope.moduleScope(myModule)).findAll();
assertEquals(2, all.size());
Set<String> correctNames = new HashSet<String>(Arrays.asList("AnnotatedClass", "correctMethod"));
for (PsiMember member : all) {
assertTrue(correctNames.contains(member.getName()));
}
final Collection<PsiPackage> packages =
AnnotatedPackagesSearch.search(annotationTypeClass, GlobalSearchScope.moduleScope(myModule)).findAll();
assertEquals(1, packages.size());
assertEquals("annotated", packages.iterator().next().getQualifiedName());
tearDownLoadingFilter();
}
private void setupLoadingFilter() {
getJavaFacade().setAssertOnFileLoadingFilter(VirtualFileFilter.ALL, myTestRootDisposable);
}
private void tearDownLoadingFilter() {
getJavaFacade().setAssertOnFileLoadingFilter(VirtualFileFilter.NONE, myTestRootDisposable);
}
@NotNull
private PsiClass findClass(final String name) {
PsiClass aClass = myJavaFacade.findClass(name, GlobalSearchScope.moduleScope(myModule));
assertNotNull(name, aClass);
return aClass;
}
}