From 10660f35d729761e6b6d69bb0c6f3109faa378d8 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 4 Aug 2016 19:12:53 +0300 Subject: [PATCH] Add tests for script configuration machinery, namely ScriptTemplateProvider EP Test highlighting and navigation depending on provided script definition --- .../kotlin/generators/tests/GenerateTests.kt | 10 ++ .../KotlinScriptConfigurationManager.kt | 10 ++ .../highlighting/additionalImports/script.kts | 7 + .../additionalImports/template/template.kt | 24 +++ .../highlighting/customBaseClass/script.kts | 3 + .../customBaseClass/template/template.kt | 28 ++++ .../highlighting/customLibrary/lib/lib.kt | 5 + .../highlighting/customLibrary/script.kts | 8 + .../customLibrary/template/template.kt | 27 ++++ .../definition/highlighting/simple/script.kts | 7 + .../highlighting/simple/template/template.kt | 23 +++ .../navigation/customBaseClass/script.kts | 4 + .../customBaseClass/template/template.kt | 28 ++++ .../navigation/javaLib/lib/test/Utils.java | 7 + .../definition/navigation/javaLib/script.kts | 3 + .../navigation/javaLib/template/template.kt | 23 +++ .../javaLibWithSources/lib/test/Utils.java | 7 + .../navigation/javaLibWithSources/script.kts | 3 + .../javaLibWithSources/template/template.kt | 24 +++ .../definition/navigation/stdlib/script.kts | 4 + .../navigation/stdlib/template/template.kt | 23 +++ .../navigation/stdlibWithSources/script.kts | 4 + .../stdlibWithSources/template/template.kt | 24 +++ .../checkers/AbstractPsiCheckerTest.java | 7 + .../BuiltInsReferenceResolverTest.java | 15 +- .../script/AbstractScriptConfigurationTest.kt | 148 ++++++++++++++++++ ...onfigurationHighlightingTestGenerated.java | 61 ++++++++ ...tConfigurationNavigationTestGenerated.java | 67 ++++++++ .../jetbrains/kotlin/test/ReferenceUtils.java | 11 +- 29 files changed, 602 insertions(+), 13 deletions(-) create mode 100644 idea/testData/script/definition/highlighting/additionalImports/script.kts create mode 100644 idea/testData/script/definition/highlighting/additionalImports/template/template.kt create mode 100644 idea/testData/script/definition/highlighting/customBaseClass/script.kts create mode 100644 idea/testData/script/definition/highlighting/customBaseClass/template/template.kt create mode 100644 idea/testData/script/definition/highlighting/customLibrary/lib/lib.kt create mode 100644 idea/testData/script/definition/highlighting/customLibrary/script.kts create mode 100644 idea/testData/script/definition/highlighting/customLibrary/template/template.kt create mode 100644 idea/testData/script/definition/highlighting/simple/script.kts create mode 100644 idea/testData/script/definition/highlighting/simple/template/template.kt create mode 100644 idea/testData/script/definition/navigation/customBaseClass/script.kts create mode 100644 idea/testData/script/definition/navigation/customBaseClass/template/template.kt create mode 100644 idea/testData/script/definition/navigation/javaLib/lib/test/Utils.java create mode 100644 idea/testData/script/definition/navigation/javaLib/script.kts create mode 100644 idea/testData/script/definition/navigation/javaLib/template/template.kt create mode 100644 idea/testData/script/definition/navigation/javaLibWithSources/lib/test/Utils.java create mode 100644 idea/testData/script/definition/navigation/javaLibWithSources/script.kts create mode 100644 idea/testData/script/definition/navigation/javaLibWithSources/template/template.kt create mode 100644 idea/testData/script/definition/navigation/stdlib/script.kts create mode 100644 idea/testData/script/definition/navigation/stdlib/template/template.kt create mode 100644 idea/testData/script/definition/navigation/stdlibWithSources/script.kts create mode 100644 idea/testData/script/definition/navigation/stdlibWithSources/template/template.kt create mode 100644 idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt create mode 100644 idea/tests/org/jetbrains/kotlin/idea/script/ScriptConfigurationHighlightingTestGenerated.java create mode 100644 idea/tests/org/jetbrains/kotlin/idea/script/ScriptConfigurationNavigationTestGenerated.java diff --git a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index a43d800e30f..1d813f9687a 100644 --- a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -106,6 +106,8 @@ import org.jetbrains.kotlin.idea.refactoring.rename.AbstractRenameTest import org.jetbrains.kotlin.idea.refactoring.safeDelete.AbstractSafeDeleteTest import org.jetbrains.kotlin.idea.repl.AbstractIdeReplCompletionTest import org.jetbrains.kotlin.idea.resolve.* +import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationHighlightingTest +import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationNavigationTest import org.jetbrains.kotlin.idea.structureView.AbstractKotlinFileStructureTest import org.jetbrains.kotlin.idea.stubs.AbstractMultiFileHighlightingTest import org.jetbrains.kotlin.idea.stubs.AbstractResolveByStubTest @@ -830,6 +832,14 @@ fun main(args: Array) { testClass() { model("repl/completion") } + + testClass { + model("script/definition/highlighting", extension = null, recursive = false) + } + + testClass { + model("script/definition/navigation", extension = null, recursive = false) + } } testGroup("idea/idea-maven/test", "idea/idea-maven/testData") { diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/KotlinScriptConfigurationManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/KotlinScriptConfigurationManager.kt index ea9d4d13c31..174a317c74a 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/KotlinScriptConfigurationManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/KotlinScriptConfigurationManager.kt @@ -32,6 +32,7 @@ import com.intellij.psi.search.FileTypeIndex import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.NonClasspathDirectoriesScope import com.intellij.util.io.URLUtil +import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.script.* @@ -152,6 +153,15 @@ class KotlinScriptConfigurationManager( return res } internal val log = Logger.getInstance(KotlinScriptConfigurationManager::class.java) + + @TestOnly + fun reloadScriptDefinitions(project: Project) { + with (getInstance(project)) { + reloadScriptDefinitions() + scriptExternalImportsProvider.invalidateCaches() + invalidateLocalCaches() + } + } } } diff --git a/idea/testData/script/definition/highlighting/additionalImports/script.kts b/idea/testData/script/definition/highlighting/additionalImports/script.kts new file mode 100644 index 00000000000..115ee1e05da --- /dev/null +++ b/idea/testData/script/definition/highlighting/additionalImports/script.kts @@ -0,0 +1,7 @@ +val c = 3 + +val g = listOf("a", "b", "c") + +val time = measureNanoTime { + println("text") +} diff --git a/idea/testData/script/definition/highlighting/additionalImports/template/template.kt b/idea/testData/script/definition/highlighting/additionalImports/template/template.kt new file mode 100644 index 00000000000..be9447a12fe --- /dev/null +++ b/idea/testData/script/definition/highlighting/additionalImports/template/template.kt @@ -0,0 +1,24 @@ +package custom.scriptDefinition + +import org.jetbrains.kotlin.script.* +import java.io.File +import java.util.concurrent.CompletableFuture +import java.util.concurrent.Future + +class TestDependenciesResolver : ScriptDependenciesResolver { + override fun resolve( + script: ScriptContents, + environment: Map?, + report: (ScriptDependenciesResolver.ReportSeverity, String, ScriptContents.Position?) -> Unit, previousDependencies: KotlinScriptExternalDependencies? + ): Future { + return CompletableFuture.completedFuture( + object : KotlinScriptExternalDependencies { + override val classpath: Iterable = listOf(environment?.get("runtime-classes") as File) + override val imports: Iterable = listOf("kotlin.system.*") + }) + + } +} + +@ScriptTemplateDefinition(TestDependenciesResolver::class, scriptFilePattern = "script.kts") +class Template \ No newline at end of file diff --git a/idea/testData/script/definition/highlighting/customBaseClass/script.kts b/idea/testData/script/definition/highlighting/customBaseClass/script.kts new file mode 100644 index 00000000000..328e15eb5f1 --- /dev/null +++ b/idea/testData/script/definition/highlighting/customBaseClass/script.kts @@ -0,0 +1,3 @@ +val j: Int = i + +val s: String = str \ No newline at end of file diff --git a/idea/testData/script/definition/highlighting/customBaseClass/template/template.kt b/idea/testData/script/definition/highlighting/customBaseClass/template/template.kt new file mode 100644 index 00000000000..44a014cbcc3 --- /dev/null +++ b/idea/testData/script/definition/highlighting/customBaseClass/template/template.kt @@ -0,0 +1,28 @@ +package custom.scriptDefinition + +import org.jetbrains.kotlin.script.* +import java.io.File +import java.util.concurrent.CompletableFuture +import java.util.concurrent.Future + +class TestDependenciesResolver : ScriptDependenciesResolver { + override fun resolve( + script: ScriptContents, + environment: Map?, + report: (ScriptDependenciesResolver.ReportSeverity, String, ScriptContents.Position?) -> Unit, previousDependencies: KotlinScriptExternalDependencies? + ): Future { + return CompletableFuture.completedFuture( + object : KotlinScriptExternalDependencies { + override val classpath: Iterable = listOf(environment?.get("template-classes") as File) + }) + + } +} + +@ScriptTemplateDefinition(TestDependenciesResolver::class, scriptFilePattern = "script.kts") +class Template: Base() + +open class Base { + val i = 3 + val str = "" +} \ No newline at end of file diff --git a/idea/testData/script/definition/highlighting/customLibrary/lib/lib.kt b/idea/testData/script/definition/highlighting/customLibrary/lib/lib.kt new file mode 100644 index 00000000000..5716e21f7a3 --- /dev/null +++ b/idea/testData/script/definition/highlighting/customLibrary/lib/lib.kt @@ -0,0 +1,5 @@ +package custom.library + +class C() + +fun doStuff(c1: C, c2: C) {} \ No newline at end of file diff --git a/idea/testData/script/definition/highlighting/customLibrary/script.kts b/idea/testData/script/definition/highlighting/customLibrary/script.kts new file mode 100644 index 00000000000..2dd961dbe8f --- /dev/null +++ b/idea/testData/script/definition/highlighting/customLibrary/script.kts @@ -0,0 +1,8 @@ +val c1 = C() + +val c2 = C() + +doStuff(c1, c2) + +doStuff(c1, 3) + diff --git a/idea/testData/script/definition/highlighting/customLibrary/template/template.kt b/idea/testData/script/definition/highlighting/customLibrary/template/template.kt new file mode 100644 index 00000000000..efadd99f85f --- /dev/null +++ b/idea/testData/script/definition/highlighting/customLibrary/template/template.kt @@ -0,0 +1,27 @@ +package custom.scriptDefinition + +import org.jetbrains.kotlin.script.* +import java.io.File +import java.util.concurrent.CompletableFuture +import java.util.concurrent.Future + +class TestDependenciesResolver : ScriptDependenciesResolver { + override fun resolve( + script: ScriptContents, + environment: Map?, + report: (ScriptDependenciesResolver.ReportSeverity, String, ScriptContents.Position?) -> Unit, previousDependencies: KotlinScriptExternalDependencies? + ): Future { + return CompletableFuture.completedFuture( + object : KotlinScriptExternalDependencies { + override val classpath: Iterable = listOf( + environment?.get("lib-classes") as File + ) + + override val imports: Iterable = listOf("custom.library.*") + }) + + } +} + +@ScriptTemplateDefinition(TestDependenciesResolver::class, scriptFilePattern = "script.kts") +class Template \ No newline at end of file diff --git a/idea/testData/script/definition/highlighting/simple/script.kts b/idea/testData/script/definition/highlighting/simple/script.kts new file mode 100644 index 00000000000..7560fe48c1a --- /dev/null +++ b/idea/testData/script/definition/highlighting/simple/script.kts @@ -0,0 +1,7 @@ +val c = 3 + +val g = listOf("a", "b", "c") + +val time = measureNanoTime { + println("text") +} \ No newline at end of file diff --git a/idea/testData/script/definition/highlighting/simple/template/template.kt b/idea/testData/script/definition/highlighting/simple/template/template.kt new file mode 100644 index 00000000000..585ed9a9f6d --- /dev/null +++ b/idea/testData/script/definition/highlighting/simple/template/template.kt @@ -0,0 +1,23 @@ +package custom.scriptDefinition + +import org.jetbrains.kotlin.script.* +import java.io.File +import java.util.concurrent.CompletableFuture +import java.util.concurrent.Future + +class TestDependenciesResolver : ScriptDependenciesResolver { + override fun resolve( + script: ScriptContents, + environment: Map?, + report: (ScriptDependenciesResolver.ReportSeverity, String, ScriptContents.Position?) -> Unit, previousDependencies: KotlinScriptExternalDependencies? + ): Future { + return CompletableFuture.completedFuture( + object : KotlinScriptExternalDependencies { + override val classpath: Iterable = listOf(environment?.get("runtime-classes") as File) + }) + + } +} + +@ScriptTemplateDefinition(TestDependenciesResolver::class, scriptFilePattern = "script.kts") +class Template \ No newline at end of file diff --git a/idea/testData/script/definition/navigation/customBaseClass/script.kts b/idea/testData/script/definition/navigation/customBaseClass/script.kts new file mode 100644 index 00000000000..079232e7b82 --- /dev/null +++ b/idea/testData/script/definition/navigation/customBaseClass/script.kts @@ -0,0 +1,4 @@ +str + +// REF: (in custom.scriptDefinition.Base).str +// FILE: scriptDefinition/Base.class \ No newline at end of file diff --git a/idea/testData/script/definition/navigation/customBaseClass/template/template.kt b/idea/testData/script/definition/navigation/customBaseClass/template/template.kt new file mode 100644 index 00000000000..44a014cbcc3 --- /dev/null +++ b/idea/testData/script/definition/navigation/customBaseClass/template/template.kt @@ -0,0 +1,28 @@ +package custom.scriptDefinition + +import org.jetbrains.kotlin.script.* +import java.io.File +import java.util.concurrent.CompletableFuture +import java.util.concurrent.Future + +class TestDependenciesResolver : ScriptDependenciesResolver { + override fun resolve( + script: ScriptContents, + environment: Map?, + report: (ScriptDependenciesResolver.ReportSeverity, String, ScriptContents.Position?) -> Unit, previousDependencies: KotlinScriptExternalDependencies? + ): Future { + return CompletableFuture.completedFuture( + object : KotlinScriptExternalDependencies { + override val classpath: Iterable = listOf(environment?.get("template-classes") as File) + }) + + } +} + +@ScriptTemplateDefinition(TestDependenciesResolver::class, scriptFilePattern = "script.kts") +class Template: Base() + +open class Base { + val i = 3 + val str = "" +} \ No newline at end of file diff --git a/idea/testData/script/definition/navigation/javaLib/lib/test/Utils.java b/idea/testData/script/definition/navigation/javaLib/lib/test/Utils.java new file mode 100644 index 00000000000..7a7f234c677 --- /dev/null +++ b/idea/testData/script/definition/navigation/javaLib/lib/test/Utils.java @@ -0,0 +1,7 @@ +package test; + +public class Utils { + public static void foo(String str) { + + } +} \ No newline at end of file diff --git a/idea/testData/script/definition/navigation/javaLib/script.kts b/idea/testData/script/definition/navigation/javaLib/script.kts new file mode 100644 index 00000000000..d93c75fa993 --- /dev/null +++ b/idea/testData/script/definition/navigation/javaLib/script.kts @@ -0,0 +1,3 @@ +test.Utils.foo("asd") +// REF: (in test.Utils).foo(String) +// FILE: test/Utils.class \ No newline at end of file diff --git a/idea/testData/script/definition/navigation/javaLib/template/template.kt b/idea/testData/script/definition/navigation/javaLib/template/template.kt new file mode 100644 index 00000000000..ffe507697d7 --- /dev/null +++ b/idea/testData/script/definition/navigation/javaLib/template/template.kt @@ -0,0 +1,23 @@ +package custom.scriptDefinition + +import org.jetbrains.kotlin.script.* +import java.io.File +import java.util.concurrent.CompletableFuture +import java.util.concurrent.Future + +class TestDependenciesResolver : ScriptDependenciesResolver { + override fun resolve( + script: ScriptContents, + environment: Map?, + report: (ScriptDependenciesResolver.ReportSeverity, String, ScriptContents.Position?) -> Unit, previousDependencies: KotlinScriptExternalDependencies? + ): Future { + return CompletableFuture.completedFuture( + object : KotlinScriptExternalDependencies { + override val classpath: Iterable = listOf(environment?.get("lib-classes") as File) + }) + + } +} + +@ScriptTemplateDefinition(TestDependenciesResolver::class, scriptFilePattern = "script.kts") +class Template diff --git a/idea/testData/script/definition/navigation/javaLibWithSources/lib/test/Utils.java b/idea/testData/script/definition/navigation/javaLibWithSources/lib/test/Utils.java new file mode 100644 index 00000000000..7a7f234c677 --- /dev/null +++ b/idea/testData/script/definition/navigation/javaLibWithSources/lib/test/Utils.java @@ -0,0 +1,7 @@ +package test; + +public class Utils { + public static void foo(String str) { + + } +} \ No newline at end of file diff --git a/idea/testData/script/definition/navigation/javaLibWithSources/script.kts b/idea/testData/script/definition/navigation/javaLibWithSources/script.kts new file mode 100644 index 00000000000..4d33fafa8b3 --- /dev/null +++ b/idea/testData/script/definition/navigation/javaLibWithSources/script.kts @@ -0,0 +1,3 @@ +test.Utils.foo("asd") +// REF: (in test.Utils).foo(String) +// FILE: test/Utils.java \ No newline at end of file diff --git a/idea/testData/script/definition/navigation/javaLibWithSources/template/template.kt b/idea/testData/script/definition/navigation/javaLibWithSources/template/template.kt new file mode 100644 index 00000000000..16fb5b01cc3 --- /dev/null +++ b/idea/testData/script/definition/navigation/javaLibWithSources/template/template.kt @@ -0,0 +1,24 @@ +package custom.scriptDefinition + +import org.jetbrains.kotlin.script.* +import java.io.File +import java.util.concurrent.CompletableFuture +import java.util.concurrent.Future + +class TestDependenciesResolver : ScriptDependenciesResolver { + override fun resolve( + script: ScriptContents, + environment: Map?, + report: (ScriptDependenciesResolver.ReportSeverity, String, ScriptContents.Position?) -> Unit, previousDependencies: KotlinScriptExternalDependencies? + ): Future { + return CompletableFuture.completedFuture( + object : KotlinScriptExternalDependencies { + override val classpath: Iterable = listOf(environment?.get("lib-classes") as File) + override val sources: Iterable = listOf(environment?.get("lib-source") as File) + }) + + } +} + +@ScriptTemplateDefinition(TestDependenciesResolver::class, scriptFilePattern = "script.kts") +class Template diff --git a/idea/testData/script/definition/navigation/stdlib/script.kts b/idea/testData/script/definition/navigation/stdlib/script.kts new file mode 100644 index 00000000000..9bde386bf9f --- /dev/null +++ b/idea/testData/script/definition/navigation/stdlib/script.kts @@ -0,0 +1,4 @@ +val g = listOf("a", "b", "c") + +// REF: (kotlin.collections).listOf(T) +// FILE: collections/CollectionsKt.class \ No newline at end of file diff --git a/idea/testData/script/definition/navigation/stdlib/template/template.kt b/idea/testData/script/definition/navigation/stdlib/template/template.kt new file mode 100644 index 00000000000..585ed9a9f6d --- /dev/null +++ b/idea/testData/script/definition/navigation/stdlib/template/template.kt @@ -0,0 +1,23 @@ +package custom.scriptDefinition + +import org.jetbrains.kotlin.script.* +import java.io.File +import java.util.concurrent.CompletableFuture +import java.util.concurrent.Future + +class TestDependenciesResolver : ScriptDependenciesResolver { + override fun resolve( + script: ScriptContents, + environment: Map?, + report: (ScriptDependenciesResolver.ReportSeverity, String, ScriptContents.Position?) -> Unit, previousDependencies: KotlinScriptExternalDependencies? + ): Future { + return CompletableFuture.completedFuture( + object : KotlinScriptExternalDependencies { + override val classpath: Iterable = listOf(environment?.get("runtime-classes") as File) + }) + + } +} + +@ScriptTemplateDefinition(TestDependenciesResolver::class, scriptFilePattern = "script.kts") +class Template \ No newline at end of file diff --git a/idea/testData/script/definition/navigation/stdlibWithSources/script.kts b/idea/testData/script/definition/navigation/stdlibWithSources/script.kts new file mode 100644 index 00000000000..41b67953fab --- /dev/null +++ b/idea/testData/script/definition/navigation/stdlibWithSources/script.kts @@ -0,0 +1,4 @@ +val g = listOf("a", "b", "c") + +// REF: (kotlin.collections).listOf(T) +// FILE: collections/Collections.kt \ No newline at end of file diff --git a/idea/testData/script/definition/navigation/stdlibWithSources/template/template.kt b/idea/testData/script/definition/navigation/stdlibWithSources/template/template.kt new file mode 100644 index 00000000000..890b0801db8 --- /dev/null +++ b/idea/testData/script/definition/navigation/stdlibWithSources/template/template.kt @@ -0,0 +1,24 @@ +package custom.scriptDefinition + +import org.jetbrains.kotlin.script.* +import java.io.File +import java.util.concurrent.CompletableFuture +import java.util.concurrent.Future + +class TestDependenciesResolver : ScriptDependenciesResolver { + override fun resolve( + script: ScriptContents, + environment: Map?, + report: (ScriptDependenciesResolver.ReportSeverity, String, ScriptContents.Position?) -> Unit, previousDependencies: KotlinScriptExternalDependencies? + ): Future { + return CompletableFuture.completedFuture( + object : KotlinScriptExternalDependencies { + override val classpath: Iterable = listOf(environment?.get("runtime-classes") as File) + override val sources: Iterable = listOf(environment?.get("runtime-source") as File) + }) + + } +} + +@ScriptTemplateDefinition(TestDependenciesResolver::class, scriptFilePattern = "script.kts") +class Template \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/checkers/AbstractPsiCheckerTest.java b/idea/tests/org/jetbrains/kotlin/checkers/AbstractPsiCheckerTest.java index 442f6ea3afd..e8581c0f4ba 100644 --- a/idea/tests/org/jetbrains/kotlin/checkers/AbstractPsiCheckerTest.java +++ b/idea/tests/org/jetbrains/kotlin/checkers/AbstractPsiCheckerTest.java @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.checkers; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.rt.execution.junit.FileComparisonFailure; import com.intellij.spellchecker.inspections.SpellCheckingInspection; import com.intellij.testFramework.LightProjectDescriptor; @@ -32,6 +33,12 @@ import java.io.File; import static org.jetbrains.kotlin.resolve.lazy.ResolveSession.areDescriptorsCreatedForDeclaration; public abstract class AbstractPsiCheckerTest extends KotlinLightCodeInsightFixtureTestCase { + public void doTest(@NotNull VirtualFile file) throws Exception { + myFixture.configureFromExistingVirtualFile(file); + checkHighlighting(true, false, false); + checkResolveToDescriptor(); + } + public void doTest(@NotNull String filePath) throws Exception { myFixture.configureByFile(filePath); checkHighlighting(true, false, false); diff --git a/idea/tests/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolverTest.java b/idea/tests/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolverTest.java index 554e7bc8d73..ee9182e33da 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolverTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/references/BuiltInsReferenceResolverTest.java @@ -40,6 +40,9 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import static org.jetbrains.kotlin.test.ReferenceUtils.getFileWithDir; +import static org.jetbrains.kotlin.test.ReferenceUtils.renderAsGotoImplementation; + public class BuiltInsReferenceResolverTest extends KotlinLightCodeInsightFixtureTestCase { public void testAny() throws Exception { doTest(); @@ -124,19 +127,11 @@ public class BuiltInsReferenceResolverTest extends KotlinLightCodeInsightFixture String expectedTarget = InTextDirectivesUtils.findStringWithPrefixes(text, "// TARGET:"); assertEquals(expectedBinaryFile, getFileWithDir(resolved)); - assertEquals(expectedTarget, ReferenceUtils.renderAsGotoImplementation(resolved)); + assertEquals(expectedTarget, renderAsGotoImplementation(resolved)); PsiElement srcElement = resolved.getNavigationElement(); Assert.assertNotEquals(srcElement, resolved); assertEquals(expectedSourceFile, getFileWithDir(srcElement)); - assertEquals(expectedTarget, ReferenceUtils.renderAsGotoImplementation(srcElement)); - } - - @NotNull - private static String getFileWithDir(@NotNull PsiElement resolved) { - PsiFile targetFile = resolved.getContainingFile(); - PsiDirectory targetDir = targetFile.getParent(); - assertNotNull(targetDir); - return targetDir.getName() + "/" + targetFile.getName(); + assertEquals(expectedTarget, renderAsGotoImplementation(srcElement)); } @Override diff --git a/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt b/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt new file mode 100644 index 00000000000..71dbe5e989a --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/script/AbstractScriptConfigurationTest.kt @@ -0,0 +1,148 @@ +/* + * Copyright 2010-2016 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 org.jetbrains.kotlin.idea.script + +import com.intellij.openapi.extensions.Extensions +import com.intellij.openapi.util.io.FileUtil +import com.intellij.openapi.util.text.StringUtil +import com.intellij.openapi.vfs.LocalFileSystem +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.testFramework.PlatformTestUtil +import org.jetbrains.kotlin.checkers.AbstractPsiCheckerTest +import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime +import org.jetbrains.kotlin.idea.core.script.KotlinScriptConfigurationManager +import org.jetbrains.kotlin.idea.test.KotlinLightProjectDescriptor +import org.jetbrains.kotlin.script.ScriptTemplatesProvider +import org.jetbrains.kotlin.test.InTextDirectivesUtils +import org.jetbrains.kotlin.test.KotlinTestUtils +import org.jetbrains.kotlin.test.MockLibraryUtil +import org.jetbrains.kotlin.test.ReferenceUtils +import org.jetbrains.kotlin.utils.PathUtil +import org.junit.Assert +import java.io.File +import java.util.regex.Pattern + + +abstract class AbstractScriptConfigurationHighlightingTest : AbstractScriptConfigurationTest() { + override fun doTest(path: String) { + configureScriptEnvironment(path) + + super.doTest(copyScriptFile(path)) + } +} + +abstract class AbstractScriptConfigurationNavigationTest : AbstractScriptConfigurationTest() { + + override fun doTest(path: String) { + configureScriptEnvironment(path) + + myFixture.configureFromExistingVirtualFile(copyScriptFile(path)) + val reference = myFixture.getReferenceAtCaretPosition()!! + + val resolved = reference.resolve()!!.navigationElement!! + + val expectedReference = InTextDirectivesUtils.findStringWithPrefixes(myFixture.file.text, "// REF:") + val actualReference = ReferenceUtils.renderAsGotoImplementation(resolved) + + Assert.assertEquals(expectedReference, actualReference) + + val expectedFile = InTextDirectivesUtils.findStringWithPrefixes(myFixture.file.text, "// FILE:") + val actualFile = ReferenceUtils.getFileWithDir(resolved) + + Assert.assertEquals(expectedFile, actualFile) + } +} + +abstract class AbstractScriptConfigurationTest : AbstractPsiCheckerTest() { + protected fun configureScriptEnvironment(path: String) { + val templateOutDir = compileLibToDir( + File("${path}template"), + classpath = listOf(PathUtil.getKotlinPathsForDistDirectory().compilerPath.path) + ) + + val libSrcDir = File("${path}lib") + val libClasses = if (libSrcDir.isDirectory) { + compileLibToDir(libSrcDir, classpath = listOf()) + } + else null + + registerScriptTemplateProvider(templateOutDir, libClasses, libSrcDir) + } + + protected fun copyScriptFile(path: String): VirtualFile { + val scriptDir = KotlinTestUtils.tmpDir("scriptDir") + val target = File(scriptDir, "script.kts") + File("${path}script.kts").copyTo(target) + val vFile = LocalFileSystem.getInstance().findFileByPath(target.path)!! + return vFile + } + + private fun compileLibToDir(srcDir: File, classpath: List): File { + val outDir = KotlinTestUtils.tmpDir("${getTestName(false)}${srcDir.name}Out") + + val kotlinSourceFiles = FileUtil.findFilesByMask(Pattern.compile(".+\\.kt$"), srcDir) + if (kotlinSourceFiles.isNotEmpty()) { + MockLibraryUtil.compileKotlin( + srcDir.path, outDir, + *classpath.toTypedArray() + ) + } + + val javaSourceFiles = FileUtil.findFilesByMask(Pattern.compile(".+\\.java$"), srcDir) + if (javaSourceFiles.isNotEmpty()) { + KotlinTestUtils.compileJavaFiles( + javaSourceFiles, + listOf("-cp", StringUtil.join(classpath + outDir, File.pathSeparator), "-d", outDir.path) + ) + } + return outDir + } + + private fun registerScriptTemplateProvider(templateDir: File, libClasses: File?, libSource: File?) { + val provider = TestScriptTemplateProvider( + templateDir, + mapOf( + "runtime-classes" to ForTestCompileRuntime.runtimeJarForTests(), + "runtime-source" to File("libraries/stdlib/src"), + "lib-classes" to libClasses, + "lib-source" to libSource, + "template-classes" to templateDir + ) + ) + + PlatformTestUtil.registerExtension( + Extensions.getArea(project), + ScriptTemplatesProvider.EP_NAME, + provider, + myTestRootDisposable + ) + KotlinScriptConfigurationManager.reloadScriptDefinitions(project) + } + + override fun getProjectDescriptor() = KotlinLightProjectDescriptor.INSTANCE +} + +class TestScriptTemplateProvider( + compiledTemplateDir: File, + override val environment: Map +) : ScriptTemplatesProvider { + override val id = "Test" + override val version = 0 + override val isValid = true + override val templateClassNames = listOf("custom.scriptDefinition.Template") + override val dependenciesClasspath = listOf(compiledTemplateDir.canonicalPath) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/script/ScriptConfigurationHighlightingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/script/ScriptConfigurationHighlightingTestGenerated.java new file mode 100644 index 00000000000..07da414f9c6 --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/script/ScriptConfigurationHighlightingTestGenerated.java @@ -0,0 +1,61 @@ +/* + * Copyright 2010-2016 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 org.jetbrains.kotlin.idea.script; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("idea/testData/script/definition/highlighting") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class ScriptConfigurationHighlightingTestGenerated extends AbstractScriptConfigurationHighlightingTest { + @TestMetadata("additionalImports") + public void testAdditionalImports() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/script/definition/highlighting/additionalImports/"); + doTest(fileName); + } + + public void testAllFilesPresentInHighlighting() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/script/definition/highlighting"), Pattern.compile("^([^\\.]+)$"), false); + } + + @TestMetadata("customBaseClass") + public void testCustomBaseClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/script/definition/highlighting/customBaseClass/"); + doTest(fileName); + } + + @TestMetadata("customLibrary") + public void testCustomLibrary() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/script/definition/highlighting/customLibrary/"); + doTest(fileName); + } + + @TestMetadata("simple") + public void testSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/script/definition/highlighting/simple/"); + doTest(fileName); + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/script/ScriptConfigurationNavigationTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/script/ScriptConfigurationNavigationTestGenerated.java new file mode 100644 index 00000000000..490de52eb14 --- /dev/null +++ b/idea/tests/org/jetbrains/kotlin/idea/script/ScriptConfigurationNavigationTestGenerated.java @@ -0,0 +1,67 @@ +/* + * Copyright 2010-2016 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 org.jetbrains.kotlin.idea.script; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("idea/testData/script/definition/navigation") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class ScriptConfigurationNavigationTestGenerated extends AbstractScriptConfigurationNavigationTest { + public void testAllFilesPresentInNavigation() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/script/definition/navigation"), Pattern.compile("^([^\\.]+)$"), false); + } + + @TestMetadata("customBaseClass") + public void testCustomBaseClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/script/definition/navigation/customBaseClass/"); + doTest(fileName); + } + + @TestMetadata("javaLib") + public void testJavaLib() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/script/definition/navigation/javaLib/"); + doTest(fileName); + } + + @TestMetadata("javaLibWithSources") + public void testJavaLibWithSources() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/script/definition/navigation/javaLibWithSources/"); + doTest(fileName); + } + + @TestMetadata("stdlib") + public void testStdlib() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/script/definition/navigation/stdlib/"); + doTest(fileName); + } + + @TestMetadata("stdlibWithSources") + public void testStdlibWithSources() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/script/definition/navigation/stdlibWithSources/"); + doTest(fileName); + } +} diff --git a/idea/tests/org/jetbrains/kotlin/test/ReferenceUtils.java b/idea/tests/org/jetbrains/kotlin/test/ReferenceUtils.java index 205f6418e7b..4b6d3a6036a 100644 --- a/idea/tests/org/jetbrains/kotlin/test/ReferenceUtils.java +++ b/idea/tests/org/jetbrains/kotlin/test/ReferenceUtils.java @@ -18,9 +18,7 @@ package org.jetbrains.kotlin.test; import com.intellij.navigation.ItemPresentation; import com.intellij.navigation.NavigationItem; -import com.intellij.psi.PsiAnonymousClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiPackage; +import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.psi.KtClass; @@ -65,4 +63,11 @@ public final class ReferenceUtils { ? presentableText : locationString + "." + presentableText; } + + @NotNull + public static String getFileWithDir(@NotNull PsiElement resolved) { + PsiFile targetFile = resolved.getContainingFile(); + PsiDirectory targetDir = targetFile.getParent(); + return targetDir.getName() + "/" + targetFile.getName(); + } }