From 9918e4a7233f199203f50f3206de58f6a08c0e2c Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 5 Apr 2012 18:47:11 +0400 Subject: [PATCH] Made LibrariesWithSourcesTest possible to be executed with multi-file test library. --- .../libraries/usercode/ClassObject.kt | 1 + idea/testData/libraries/usercode/Enum.kt | 1 + .../libraries/usercode/ExtensionFunction.kt | 1 + .../libraries/usercode/ExtensionProperty.kt | 1 + .../libraries/usercode/GlobalFunction.kt | 1 + .../libraries/usercode/GlobalProperty.kt | 1 + idea/testData/libraries/usercode/Property.kt | 1 + .../libraries/AbstractLibrariesTest.java | 19 ++-- .../libraries/LibrariesWithSourcesTest.java | 97 ++++++++++++------- .../LibrariesWithoutSourcesTest.java | 2 +- 10 files changed, 78 insertions(+), 47 deletions(-) diff --git a/idea/testData/libraries/usercode/ClassObject.kt b/idea/testData/libraries/usercode/ClassObject.kt index e31dab2b058..ec70406f533 100644 --- a/idea/testData/libraries/usercode/ClassObject.kt +++ b/idea/testData/libraries/usercode/ClassObject.kt @@ -4,6 +4,7 @@ fun foo() { WithInnerAndObject.foo() } +// library.kt //public class <1>WithInnerAndObject { // class object { // fun <2>foo() { \ No newline at end of file diff --git a/idea/testData/libraries/usercode/Enum.kt b/idea/testData/libraries/usercode/Enum.kt index fa08d4d3d6b..8c3075e084a 100644 --- a/idea/testData/libraries/usercode/Enum.kt +++ b/idea/testData/libraries/usercode/Enum.kt @@ -3,4 +3,5 @@ import testData.libraries.* val color: Color? = Color.RED val rgb = color?.rgb +// library.kt //public enum class <1><2>Color(val <3>rgb : Int) { \ No newline at end of file diff --git a/idea/testData/libraries/usercode/ExtensionFunction.kt b/idea/testData/libraries/usercode/ExtensionFunction.kt index 622ae474636..cb80c7091c5 100644 --- a/idea/testData/libraries/usercode/ExtensionFunction.kt +++ b/idea/testData/libraries/usercode/ExtensionFunction.kt @@ -2,5 +2,6 @@ import testData.libraries.* val v = 5.filter { it % 2 == 1 } +// library.kt //public inline fun T.<1>filter(predicate: (T)-> Boolean) : T? = this diff --git a/idea/testData/libraries/usercode/ExtensionProperty.kt b/idea/testData/libraries/usercode/ExtensionProperty.kt index 795876b3845..bbbdd160868 100644 --- a/idea/testData/libraries/usercode/ExtensionProperty.kt +++ b/idea/testData/libraries/usercode/ExtensionProperty.kt @@ -5,6 +5,7 @@ fun foo() { println(#(1, 2).exProp) } +// library.kt //public val String.<1>exProp : String //get() { // return this diff --git a/idea/testData/libraries/usercode/GlobalFunction.kt b/idea/testData/libraries/usercode/GlobalFunction.kt index 0e2230d3f2e..7fb35e1aba6 100644 --- a/idea/testData/libraries/usercode/GlobalFunction.kt +++ b/idea/testData/libraries/usercode/GlobalFunction.kt @@ -7,6 +7,7 @@ fun foo() { func() } +// library.kt //public fun <1><2>func(a : Int, b : String = "55") { //} // diff --git a/idea/testData/libraries/usercode/GlobalProperty.kt b/idea/testData/libraries/usercode/GlobalProperty.kt index 9aa6df11f33..618f28821cc 100644 --- a/idea/testData/libraries/usercode/GlobalProperty.kt +++ b/idea/testData/libraries/usercode/GlobalProperty.kt @@ -5,6 +5,7 @@ fun foo() { println(globalValWithGetter) } +// library.kt //public val <1>globalVal : #(Int, String) = #(239, "239") // //public val <2>globalValWithGetter : Long \ No newline at end of file diff --git a/idea/testData/libraries/usercode/Property.kt b/idea/testData/libraries/usercode/Property.kt index b4fa22ffbaf..4eb1e3aaa1c 100644 --- a/idea/testData/libraries/usercode/Property.kt +++ b/idea/testData/libraries/usercode/Property.kt @@ -5,6 +5,7 @@ fun foo(a : ClassWithAbstractAndOpenMembers) { println(a.abstractVar) } +// library.kt //public abstract class <1>ClassWithAbstractAndOpenMembers { // public abstract fun abstractFun() // public open fun openFun() { diff --git a/idea/tests/org/jetbrains/jet/plugin/libraries/AbstractLibrariesTest.java b/idea/tests/org/jetbrains/jet/plugin/libraries/AbstractLibrariesTest.java index 700102d6f39..0ca6fa27074 100644 --- a/idea/tests/org/jetbrains/jet/plugin/libraries/AbstractLibrariesTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/libraries/AbstractLibrariesTest.java @@ -35,18 +35,21 @@ import org.jetbrains.jet.plugin.PluginTestCaseBase; public abstract class AbstractLibrariesTest extends PlatformTestCase { protected static final String PACKAGE = "testData.libraries"; protected static final String TEST_DATA_PATH = PluginTestCaseBase.getTestDataPathBase() + "/libraries"; - protected VirtualFile myLibraryDir; + protected VirtualFile libraryDir; + protected VirtualFile librarySourceDir; protected abstract boolean isWithSources(); @Override protected void setUp() throws Exception { super.setUp(); - String libraryDir = FileUtil.getTempDirectory(); - KotlinCompiler.ExitCode compilerExec = new KotlinCompiler().exec("-src", TEST_DATA_PATH + "/library", "-output", libraryDir); + String libraryPath = FileUtil.getTempDirectory(); + librarySourceDir = LocalFileSystem.getInstance().findFileByPath(TEST_DATA_PATH + "/library"); + assertNotNull(librarySourceDir); + KotlinCompiler.ExitCode compilerExec = new KotlinCompiler().exec("-src", librarySourceDir.getPath(), "-output", libraryPath); assertEquals(KotlinCompiler.ExitCode.OK, compilerExec); - myLibraryDir = LocalFileSystem.getInstance().findFileByPath(libraryDir); - assertNotNull(myLibraryDir); + libraryDir = LocalFileSystem.getInstance().findFileByPath(libraryPath); + assertNotNull(libraryDir); ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override @@ -54,11 +57,9 @@ public abstract class AbstractLibrariesTest extends PlatformTestCase { ModifiableRootModel moduleModel = ModuleRootManager.getInstance(myModule).getModifiableModel(); Library.ModifiableModel libraryModel = moduleModel.getModuleLibraryTable().getModifiableModel().createLibrary("myKotlinLib").getModifiableModel(); - libraryModel.addRoot(myLibraryDir, OrderRootType.CLASSES); + libraryModel.addRoot(libraryDir, OrderRootType.CLASSES); if (isWithSources()) { - VirtualFile sourceDir = LocalFileSystem.getInstance().findFileByPath(TEST_DATA_PATH + "/library"); - assert sourceDir != null; - libraryModel.addRoot(sourceDir, OrderRootType.SOURCES); + libraryModel.addRoot(librarySourceDir, OrderRootType.SOURCES); } libraryModel.commit(); diff --git a/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesWithSourcesTest.java b/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesWithSourcesTest.java index ac66d2d4f07..40ecca65f59 100644 --- a/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesWithSourcesTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesWithSourcesTest.java @@ -20,11 +20,15 @@ import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiReference; +import com.intellij.util.containers.MultiMap; import jet.Tuple2; +import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.plugin.references.JetPsiReference; import java.util.*; @@ -36,8 +40,6 @@ import java.util.*; * @since 3/23/12 */ public class LibrariesWithSourcesTest extends AbstractLibrariesTest { - - private VirtualFile librarySourceFile; private VirtualFile userFile; public void testEnum() { @@ -69,8 +71,6 @@ public class LibrariesWithSourcesTest extends AbstractLibrariesTest { } private void doTest() { - librarySourceFile = LocalFileSystem.getInstance().findFileByPath(TEST_DATA_PATH + "/library/library.kt"); - assertNotNull(librarySourceFile); userFile = LocalFileSystem.getInstance().findFileByPath(TEST_DATA_PATH + "/usercode/" + getTestName(false) + ".kt"); assertNotNull(userFile); @@ -87,14 +87,12 @@ public class LibrariesWithSourcesTest extends AbstractLibrariesTest { PsiReference ref = psiFile.findReferenceAt(offset); if (ref instanceof JetPsiReference && !referenceContainersToReferences.containsKey(ref.getElement())) { PsiElement target = ref.resolve(); - if (target == null) { - continue; - } + if (target == null) continue; PsiFile targetNavPsiFile = target.getNavigationElement().getContainingFile(); - if (targetNavPsiFile == null) { - continue; - } - if (librarySourceFile.equals(targetNavPsiFile.getVirtualFile())) { + if (targetNavPsiFile == null) continue; + VirtualFile targetNavFile = targetNavPsiFile.getVirtualFile(); + if (targetNavFile == null) continue; + if (VfsUtilCore.isAncestor(librarySourceDir, targetNavFile, true)) { referenceContainersToReferences.put(ref.getElement(), (JetPsiReference)ref); } } @@ -102,44 +100,69 @@ public class LibrariesWithSourcesTest extends AbstractLibrariesTest { return referenceContainersToReferences.values(); } + @NotNull + private String getRelativePath(@NotNull PsiFile librarySourceFile) { + VirtualFile virtualFile = librarySourceFile.getVirtualFile(); + if (virtualFile == null) { + return ""; + } + String relativePath = VfsUtilCore.getRelativePath(virtualFile, librarySourceDir, '/'); + return relativePath == null ? "" : relativePath; + } + private String getActualAnnotatedLibraryCode() { - List> numbersAndOffsets = new ArrayList>(); + MultiMap> filesToNumbersAndOffsets = new MultiMap>(); + int refNumber = 1; for (JetPsiReference ref : collectInterestingReferences()) { PsiElement target = ref.resolve(); assertNotNull(target); PsiElement navigationElement = target.getNavigationElement(); - numbersAndOffsets.add(new Tuple2(numbersAndOffsets.size() + 1, navigationElement.getTextOffset())); + Tuple2 numberAndOffset = new Tuple2(refNumber++, navigationElement.getTextOffset()); + filesToNumbersAndOffsets.putValue(navigationElement.getContainingFile(), numberAndOffset); } - Collections.sort(numbersAndOffsets, Collections.reverseOrder(new Comparator>() { + List files = new ArrayList(filesToNumbersAndOffsets.keySet()); + Collections.sort(files, new Comparator() { @Override - public int compare(Tuple2 t1, Tuple2 t2) { - int offsets = t1._2.compareTo(t2._2); - return offsets == 0 ? t1._1.compareTo(t2._1) : offsets; + public int compare(PsiFile o1, PsiFile o2) { + return getRelativePath(o1).compareTo(getRelativePath(o2)); } - })); + }); - Document document = FileDocumentManager.getInstance().getDocument(librarySourceFile); - assertNotNull(document); - StringBuilder result = new StringBuilder(document.getText()); - for (Tuple2 numberOffset : numbersAndOffsets) { - result.insert(numberOffset._2, String.format("<%d>", numberOffset._1)); - } + StringBuilder result = new StringBuilder(); + for (PsiFile file : files) { + List> numbersAndOffsets = new ArrayList>(filesToNumbersAndOffsets.get(file)); - if (numbersAndOffsets.isEmpty()) { - return ""; - } - int minLine = Integer.MAX_VALUE; - int maxLine = Integer.MIN_VALUE; - for (Tuple2 numberOffset : numbersAndOffsets) { - int lineNumber = document.getLineNumber(numberOffset._2); - minLine = Math.min(minLine, lineNumber); - maxLine = Math.max(maxLine, lineNumber); - } + Collections.sort(numbersAndOffsets, Collections.reverseOrder(new Comparator>() { + @Override + public int compare(Tuple2 t1, Tuple2 t2) { + int offsets = t1._2.compareTo(t2._2); + return offsets == 0 ? t1._1.compareTo(t2._1) : offsets; + } + })); - Document annotated = EditorFactory.getInstance().createDocument(result); - return annotated.getText().substring(annotated.getLineStartOffset(minLine), - annotated.getLineEndOffset(maxLine)); + Document document = PsiDocumentManager.getInstance(getProject()).getDocument(file); + assertNotNull(document); + StringBuilder resultForFile = new StringBuilder(document.getText()); + for (Tuple2 numberOffset : numbersAndOffsets) { + resultForFile.insert(numberOffset._2, String.format("<%d>", numberOffset._1)); + } + + int minLine = Integer.MAX_VALUE; + int maxLine = Integer.MIN_VALUE; + for (Tuple2 numberOffset : numbersAndOffsets) { + int lineNumber = document.getLineNumber(numberOffset._2); + minLine = Math.min(minLine, lineNumber); + maxLine = Math.max(maxLine, lineNumber); + } + + Document annotated = EditorFactory.getInstance().createDocument(resultForFile); + String filePart = annotated.getText().substring(annotated.getLineStartOffset(minLine), + annotated.getLineEndOffset(maxLine)); + result.append(" ").append(getRelativePath(file)).append("\n"); + result.append(filePart).append("\n"); + } + return result.toString(); } private String getExpectedAnnotatedLibraryCode() { diff --git a/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesWithoutSourcesTest.java b/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesWithoutSourcesTest.java index c830d784064..0c768695979 100644 --- a/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesWithoutSourcesTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/libraries/LibrariesWithoutSourcesTest.java @@ -125,7 +125,7 @@ public class LibrariesWithoutSourcesTest extends AbstractLibrariesTest { } private VirtualFile getClassFile() { - VirtualFile packageDir = myLibraryDir.findFileByRelativePath(PACKAGE.replace(".", "/")); + VirtualFile packageDir = libraryDir.findFileByRelativePath(PACKAGE.replace(".", "/")); assertNotNull(packageDir); VirtualFile classFile = packageDir.findChild(getTestName(false) + ".class"); assertNotNull(classFile);