blob: 5c12affa5e72c58c8e9abb6e0e2f0076b38e352f [file] [log] [blame]
/*
* Copyright 2000-2013 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.core.CoreJavaFileManager;
import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.testFramework.PsiTestCase;
import com.intellij.testFramework.PsiTestUtil;
import java.util.LinkedList;
import java.util.Queue;
public class CoreJavaFileManagerTest extends PsiTestCase {
private VirtualFile prepareClasses(String clazzName, String clazzData) throws Exception {
VirtualFile root = PsiTestUtil.createTestProjectStructure(myProject, myModule, myFilesToDelete);
VirtualFile pkg = root.createChildDirectory(this, "foo");
PsiDirectory dir = myPsiManager.findDirectory(pkg);
assertNotNull(dir);
dir.add(PsiFileFactory.getInstance(getProject()).createFileFromText(clazzName + ".java", JavaFileType.INSTANCE, clazzData));
return root;
}
public void testNotNullInnerClass() throws Exception {
String text = "package foo;\n\n" +
"public class Nested {\n" +
"public class InnerGeneral {}\n" +
"public class Inner$ {" +
"}\n" +
"\n" +
"public Inner$ inner() {\n" +
" return new Inner$();\n" +
"}\n" +
"\n" +
"}";
VirtualFile root = prepareClasses("Nested", text);
GlobalSearchScope scope = GlobalSearchScope.allScope(getProject());
CoreJavaFileManager manager = new CoreJavaFileManager(myPsiManager);
manager.addToClasspath(root);
PsiClass clazz = manager.findClass("foo.Nested", scope);
assertNotNull(clazz);
PsiClass clazzInnerGeneral = manager.findClass("foo.Nested.InnerGeneral", scope);
assertNotNull(clazzInnerGeneral);
PsiClass clazzInner$ = manager.findClass("foo.Nested.Inner$", scope);
assertNotNull(clazzInner$);
PsiClass clazzInner$Wrong1 = manager.findClass("foo.Nested.Inner$X", scope);
assertNull(clazzInner$Wrong1);
PsiClass clazzInner$Wrong2 = manager.findClass("foo.Nested.Inner$$X", scope);
assertNull(clazzInner$Wrong2);
PsiClass clazzInner$Wrong3 = manager.findClass("foo.Nested.Inner$$", scope);
assertNull(clazzInner$Wrong3);
}
public void testNotNullInnerClass2() throws Exception {
String text = "package foo;\n\n" +
"public class Nested {\n" +
"public class Inner {" +
" public class XInner{}" +
" public class XInner${}" +
"}\n" +
"public class Inner$ {" +
" public class XInner{}" +
" public class XInner${}" +
"}\n" +
"\n" +
"}";
VirtualFile root = prepareClasses("Nested", text);
GlobalSearchScope scope = GlobalSearchScope.allScope(getProject());
CoreJavaFileManager manager = new CoreJavaFileManager(myPsiManager);
manager.addToClasspath(root);
PsiClass clazzInner = manager.findClass("foo.Nested.Inner", scope);
assertNotNull(clazzInner);
PsiClass clazzXInner = manager.findClass("foo.Nested.Inner.XInner", scope);
assertNotNull(clazzXInner);
PsiClass clazzXInner$ = manager.findClass("foo.Nested.Inner.XInner$", scope);
assertNotNull(clazzXInner$);
PsiClass clazz$XInner = manager.findClass("foo.Nested.Inner$.XInner", scope);
assertNotNull(clazz$XInner);
PsiClass clazz$XInner$ = manager.findClass("foo.Nested.Inner$.XInner$", scope);
assertNotNull(clazz$XInner$);
}
public void testNotNullInnerClass3() throws Exception {
String text = "package foo;\n\n" +
"public class NestedX {\n" +
"public class XX {" +
" public class XXX{" +
" public class XXXX{ }" +
" public class XXXX${ }" +
" }" +
" public class XXX${" +
" public class XXXX{ }" +
" public class XXXX${ }" +
" }" +
"}\n" +
"public class XX$ {" +
" public class XXX{" +
" public class XXXX{ }" +
" public class XXXX${ }" +
" }" +
" public class XXX${" +
" public class XXXX{ }" +
" public class XXXX${ }" +
" }" +
"}\n" +
"\n" +
"}";
VirtualFile root = prepareClasses("NestedX", text);
GlobalSearchScope scope = GlobalSearchScope.allScope(getProject());
CoreJavaFileManager manager = new CoreJavaFileManager(myPsiManager);
manager.addToClasspath(root);
Queue<String> queue = new LinkedList<String>();
queue.add("foo.NestedX");
while(!queue.isEmpty()) {
String head = queue.remove();
PsiClass clazzInner = manager.findClass(head, scope);
assertNotNull(head, clazzInner);
String lastSegment = head.substring(head.lastIndexOf('.'));
String xs = lastSegment.substring(lastSegment.indexOf("X")).replace("$", "");
if (xs.length() < 4) {
queue.add(head + "." + xs + "X");
queue.add(head + "." + xs + "X$");
}
}
}
}