2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.jetbrains.plugins.groovy.compiler
19 import com.intellij.compiler.CompilerConfiguration
20 import com.intellij.compiler.CompilerConfigurationImpl
21 import com.intellij.compiler.CompilerWorkspaceConfiguration
22 import com.intellij.execution.executors.DefaultRunExecutor
23 import com.intellij.execution.impl.DefaultJavaProgramRunner
24 import com.intellij.execution.process.ProcessAdapter
25 import com.intellij.execution.process.ProcessEvent
26 import com.intellij.execution.process.ProcessHandler
27 import com.intellij.execution.process.ProcessOutputTypes
28 import com.intellij.execution.runners.ProgramRunner
29 import com.intellij.openapi.application.ApplicationManager
30 import com.intellij.openapi.application.PathManager
31 import com.intellij.openapi.application.PluginPathManager
32 import com.intellij.openapi.compiler.CompilerMessage
33 import com.intellij.openapi.compiler.CompilerMessageCategory
34 import com.intellij.openapi.compiler.options.ExcludeEntryDescription
35 import com.intellij.openapi.compiler.options.ExcludedEntriesConfiguration
36 import com.intellij.openapi.module.Module
37 import com.intellij.openapi.roots.ModuleRootModificationUtil
38 import com.intellij.openapi.util.Key
39 import com.intellij.openapi.util.Ref
40 import com.intellij.openapi.util.io.FileUtil
41 import com.intellij.openapi.vfs.VirtualFile
42 import com.intellij.psi.PsiFile
43 import com.intellij.testFramework.PsiTestUtil
44 import com.intellij.testFramework.TestLoggerFactory
45 import org.jetbrains.annotations.NotNull
46 import org.jetbrains.plugins.groovy.lang.psi.GroovyFile
51 public abstract class GroovyCompilerTest extends GroovyCompilerTestCase {
52 @Override protected void setUp() {
54 addGroovyLibrary(myModule);
57 public void testPlainGroovy() throws Throwable {
58 myFixture.addFileToProject("A.groovy", "println '239'");
60 assertOutput("A", "239");
63 public void testJavaDependsOnGroovy() throws Throwable {
64 myFixture.addClass("public class Foo {" +
65 "public static void main(String[] args) { " +
66 " System.out.println(new Bar().foo());" +
69 myFixture.addFileToProject("Bar.groovy", "class Bar {" +
75 assertOutput("Foo", "239");
78 public void testCorrectFailAndCorrect() throws Exception {
79 myFixture.addClass("public class Foo {" +
80 "public static void main(String[] args) { " +
81 " System.out.println(new Bar().foo());" +
84 final String barText = "class Bar {" + " def foo() { 239 }" + "}";
85 final PsiFile file = myFixture.addFileToProject("Bar.groovy", barText);
87 assertOutput("Foo", "239");
89 setFileText(file, "class Bar {}");
92 setFileText(file, barText);
94 assertOutput("Foo", "239");
97 private void shouldFail(Closure action) {
98 List<CompilerMessage> messages = action()
99 assert messages.find { it.category == CompilerMessageCategory.ERROR }
102 public void testRenameToJava() throws Throwable {
103 myFixture.addClass("public class Foo {" +
104 "public static void main(String[] args) { " +
105 " System.out.println(new Bar().foo());" +
110 myFixture.addFileToProject("Bar.groovy", "public class Bar {" + "public int foo() { " + " return 239;" + "}" + "}");
113 assertOutput("Foo", "239");
115 setFileName bar, "Bar.java"
118 assertOutput("Foo", "239");
121 public void testTransitiveJavaDependency() throws Throwable {
122 final VirtualFile ifoo = myFixture.addClass("public interface IFoo { int foo(); }").getContainingFile().getVirtualFile();
123 myFixture.addClass("public class Foo implements IFoo {" +
124 " public int foo() { return 239; }" +
126 final PsiFile bar = myFixture.addFileToProject("Bar.groovy", "class Bar {" +
128 "public static void main(String[] args) { " +
129 " System.out.println(new Foo().foo());" +
133 assertOutput("Bar", "239");
136 touch(bar.getVirtualFile());
138 //assertTrue(assertOneElement(make()).contains("WARNING: Groovyc stub generation failed"));
140 assertOutput("Bar", "239");
143 public void testTransitiveJavaDependencyThroughGroovy() throws Throwable {
144 myFixture.addClass("public class IFoo { void foo() {} }").getContainingFile().getVirtualFile();
145 myFixture.addFileToProject("Foo.groovy", "class Foo {\n" +
147 " public int foo() { return 239; }\n" +
149 final PsiFile bar = myFixture.addFileToProject("Bar.groovy", "class Bar extends Foo {" +
150 "public static void main(String[] args) { " +
151 " System.out.println(new Foo().foo());" +
155 assertOutput("Bar", "239");
157 deleteClassFile("IFoo");
158 touch(bar.getVirtualFile());
160 //assertTrue(assertOneElement(make()).contains("WARNING: Groovyc error"));
162 assertOutput("Bar", "239");
165 public void testTransitiveGroovyDependency() throws Throwable {
166 def foo = myFixture.addFileToProject('Foo.groovy', 'class Foo {} ')
167 def bar = myFixture.addFileToProject('Bar.groovy', 'class Bar extends Foo {}')
168 def goo = myFixture.addFileToProject('Goo.groovy', 'class Goo extends Bar {}')
171 touch(foo.virtualFile)
172 touch(goo.virtualFile)
176 public void testJavaDependsOnGroovyEnum() throws Throwable {
177 myFixture.addFileToProject("Foo.groovy", "enum Foo { FOO }")
178 myFixture.addClass("class Bar { Foo f; }")
182 public void testDeleteTransitiveJavaClass() throws Throwable {
183 myFixture.addClass("public interface IFoo { int foo(); }");
184 myFixture.addClass("public class Foo implements IFoo {" +
185 " public int foo() { return 239; }" +
187 final PsiFile bar = myFixture.addFileToProject("Bar.groovy", "class Bar {" +
189 "public static void main(String[] args) { " +
190 " System.out.println(new Foo().foo());" +
194 assertOutput("Bar", "239");
196 deleteClassFile("IFoo");
197 touch(bar.getVirtualFile());
199 //assertTrue(assertOneElement(make()).contains("WARNING: Groovyc stub generation failed"));
201 assertOutput("Bar", "239");
204 public void testGroovyDependsOnGroovy() throws Throwable {
205 myFixture.addClass("public class JustToMakeGroovyGenerateStubs {}");
206 myFixture.addFileToProject("Foo.groovy", "class Foo { }");
207 final PsiFile bar = myFixture.addFileToProject("Bar.groovy", "class Bar {" +
208 "def foo(Foo f) {}\n" +
209 "public static void main(String[] args) { " +
210 " System.out.println(239);" +
214 assertOutput("Bar", "239");
216 touch(bar.getVirtualFile());
219 assertOutput("Bar", "239");
224 new File(TestLoggerFactory.testLogDir, "../log/build-log/build.log").delete()
233 catch (Throwable e) {
239 private static void printLogs() {
240 def ideaLog = new File(TestLoggerFactory.testLogDir, "idea.log")
241 if (ideaLog.exists()) {
242 println "\n\nIdea Log:"
244 def logText = ideaLog.text
245 println(logText.size() < limit ? logText : logText.substring(logText.size() - limit))
247 def makeLog = new File(TestLoggerFactory.testLogDir, "../log/build-log/build.log")
248 if (makeLog.exists()) {
249 println "\n\nServer Log:"
255 public void testMakeInTests() throws Throwable {
257 myFixture.addFileToProject("tests/Super.groovy", "class Super {}");
260 def sub = myFixture.addFileToProject("tests/Sub.groovy", "class Sub {\n" +
261 " Super xxx() {}\n" +
262 " static void main(String[] args) {" +
267 def javaFile = myFixture.addFileToProject("tests/Java.java", "public class Java {}");
270 assertOutput("Sub", "hello");
273 public void testTestsDependOnProduction() throws Throwable {
275 myFixture.addFileToProject("src/com/Bar.groovy", "package com\n" +
277 myFixture.addFileToProject("src/com/ToGenerateStubs.java", "package com;\n" +
278 "public class ToGenerateStubs {}");
279 myFixture.addFileToProject("tests/com/BarTest.groovy", "package com\n" +
280 "class BarTest extends Bar {}");
284 public void testStubForGroovyExtendingJava() throws Exception {
285 def foo = myFixture.addFileToProject("Foo.groovy", "class Foo extends Goo { }");
286 myFixture.addFileToProject("Goo.groovy", "class Goo extends Main { void bar() { println 'hello' } }");
287 def main = myFixture.addClass("public class Main { public static void main(String[] args) { new Goo().bar(); } }");
290 assertOutput 'Main', 'hello'
292 touch(foo.virtualFile)
293 touch(main.containingFile.virtualFile)
296 assertOutput 'Main', 'hello'
299 public void testDontApplyTransformsFromSameModule() throws Exception {
302 myFixture.addClass("public class JavaClassToGenerateStubs {}");
308 private void addTransform() throws IOException {
309 myFixture.addFileToProject("Transf.java", """
310 import org.codehaus.groovy.ast.*;
311 import org.codehaus.groovy.control.*;
312 import org.codehaus.groovy.transform.*;
313 @GroovyASTTransformation(phase = CompilePhase.CONVERSION)
314 public class Transf implements ASTTransformation {
315 public void visit(ASTNode[] nodes, SourceUnit sourceUnit) {
316 ModuleNode module = (ModuleNode)nodes[0];
317 for (ClassNode clazz : module.getClasses()) {
319 if (clazz.getName().contains("Bar")) {
320 module.addStaticStarImport("Foo", ClassHelper.makeWithoutCaching(Foo.class));
323 //throw new RuntimeException("In class " + nodes[0]);
327 myFixture.addFileToProject("Foo.java", "public class Foo {\n" +
328 "public static int autoImported() { return 239; }\n" +
331 CompilerConfiguration.getInstance(getProject()).addResourceFilePattern("*.ASTTransformation");
333 myFixture.addFileToProject("META-INF/services/org.codehaus.groovy.transform.ASTTransformation", "Transf");
336 public void testApplyTransformsFromDependencies() throws Exception {
339 myFixture.addFileToProject("dependent/Bar.groovy", "class Bar {\n" +
340 " static Object zzz = autoImported()\n" +
341 " static void main(String[] args) {\n" +
346 myFixture.addFileToProject("dependent/AJavaClass.java", "class AJavaClass {}");
348 Module dep = addDependentModule();
350 addGroovyLibrary(dep);
353 assertOutput("Bar", "239", dep);
356 public void testIndirectDependencies() throws Exception {
357 myFixture.addFileToProject("dependent1/Bar1.groovy", "class Bar1 {}");
358 myFixture.addFileToProject("dependent2/Bar2.groovy", "class Bar2 extends Bar1 {}");
359 PsiFile main = myFixture.addFileToProject("Main.groovy", "class Main extends Bar2 {}");
361 Module dep1 = addModule('dependent1', true)
362 Module dep2 = addModule('dependent2', true)
363 ModuleRootModificationUtil.addDependency dep2, dep1
364 ModuleRootModificationUtil.addDependency myModule, dep2
366 addGroovyLibrary(dep1);
367 addGroovyLibrary(dep2);
371 touch(main.virtualFile)
375 public void testExtendFromGroovyAbstractClass() throws Exception {
376 myFixture.addFileToProject "Super.groovy", "abstract class Super {}"
377 myFixture.addFileToProject "AJava.java", "public class AJava {}"
380 myFixture.addFileToProject "Sub.groovy", "class Sub extends Super {}"
384 public void test1_7InnerClass() throws Exception {
385 myFixture.addFileToProject "Foo.groovy", """
389 def javaFile = myFixture.addFileToProject("AJava.java", "public class AJava extends Foo.Bar {}")
392 touch(javaFile.virtualFile)
396 public void testRecompileDependentClass() throws Exception {
397 def cloud = myFixture.addFileToProject("Cloud.groovy", """
399 def accessFooProperty(Foo c) {
404 myFixture.addFileToProject "Foo.groovy", """
406 def withGooParameter(Goo x) {}
408 def goo = myFixture.addFileToProject("Goo.groovy", "class Goo {}")
412 touch(cloud.virtualFile)
413 touch(goo.virtualFile)
417 public void testRecompileExpressionReferences() throws Exception {
418 def rusCon = myFixture.addFileToProject('RusCon.groovy', '''
420 Closure foo = { Seq.foo() }
422 myFixture.addFileToProject "Seq.groovy", """
423 class Seq implements RusCon {
428 touch(rusCon.virtualFile)
432 public void testRecompileImportedClass() throws Exception {
433 def bar = myFixture.addFileToProject("pack/Bar.groovy", """
438 myFixture.addFileToProject "pack/Foo.groovy", """
440 class Foo extends Goo {
442 def goo = myFixture.addFileToProject("pack/Goo.groovy", """
448 touch(bar.virtualFile)
449 touch(goo.virtualFile)
453 public void testRecompileDependentClassesWithOnlyOneChanged() throws Exception {
454 def bar = myFixture.addFileToProject("Bar.groovy", """
459 myFixture.addFileToProject "Foo.groovy", """
460 class Foo extends Bar {
465 touch(bar.virtualFile)
469 public void testDollarGroovyInnerClassUsagesInStubs() throws Exception {
470 def javaFile = myFixture.addClass("""
471 public class JavaClass {
472 public static class InnerJavaClass {}
475 myFixture.addFileToProject("WithInner.groovy", """
477 static class Inner {}
482 myFixture.addFileToProject("Usage.groovy", """
484 def foo(WithInner.Inner i) {}
485 def foo(JavaClass.InnerJavaClass i) {}
489 touch(javaFile.containingFile.virtualFile)
493 public void testDollarGroovyInnerClassUsagesInStubs2() throws Exception {
494 myFixture.addClass(""" public class JavaClass { } """)
495 myFixture.addFileToProject("WithInner.groovy", """
497 static class Inner {}
501 myFixture.addFileToProject("Usage.groovy", """
503 def foo(WithInner.Inner i) {}
510 public void testGroovyAnnotations() {
511 myFixture.addClass 'public @interface Anno { Class<?>[] value(); }'
512 myFixture.addFileToProject 'Foo.groovy', '@Anno([String]) class Foo {}'
513 myFixture.addFileToProject 'Bar.java', 'class Bar extends Foo {}'
518 public void testGenericStubs() {
519 myFixture.addFileToProject 'Foo.groovy', 'class Foo { List<String> list }'
520 myFixture.addFileToProject 'Bar.java', 'class Bar {{ for (String s : new Foo().getList()) { s.hashCode(); } }}'
524 public void testDuplicateClassDuringCompilation() throws Exception {
525 def base = myFixture.addFileToProject('p/Base.groovy', 'package p; class Base { }').virtualFile
526 myFixture.addFileToProject('p/Indirect.groovy', '''package p
528 private static class Inner { Base b }
530 private Indirect.Inner foo(Indirect.Inner g1, Inner g2, Base b) {}
532 def foo = myFixture.addFileToProject('Foo.groovy', 'class Foo { p.Indirect foo() {} }').virtualFile
540 public void testDontRecompileUnneeded() {
541 myFixture.addFileToProject('Base.groovy', 'class Base { }')
542 def foo = myFixture.addFileToProject('Foo.groovy', 'class Foo extends Base { }').virtualFile
543 myFixture.addFileToProject('Bar.groovy', 'class Bar extends Foo { }')
544 def main = myFixture.addFileToProject('Main.groovy', 'class Main extends Bar { }').virtualFile
546 long oldBaseStamp = findClassFile("Base").timeStamp
547 long oldMainStamp = findClassFile("Main").timeStamp
552 assert oldMainStamp != findClassFile("Main").timeStamp
553 assert oldBaseStamp == findClassFile("Base").timeStamp
556 public void testPartialCrossRecompile() {
557 def used = myFixture.addFileToProject('Used.groovy', 'class Used { }')
558 def java = myFixture.addFileToProject('Java.java', 'class Java { void foo(Used used) {} }')
559 def main = myFixture.addFileToProject('Main.groovy', 'class Main extends Java { }').virtualFile
561 assertEmpty compileModule(myModule)
563 touch(used.virtualFile)
567 assertEmpty compileModule(myModule)
568 assertEmpty compileModule(myModule)
570 setFileText(used, 'class Used2 {}')
571 shouldFail { make() }
572 assert findClassFile('Used') == null
574 setFileText(used, 'class Used3 {}')
575 setFileText(java, 'class Java { void foo(Used3 used) {} }')
578 assert findClassFile('Used2') == null
581 public void testClassLoadingDuringBytecodeGeneration() {
582 def used = myFixture.addFileToProject('Used.groovy', 'class Used { }')
583 def java = myFixture.addFileToProject('Java.java', '''
584 abstract class Java {
585 Object getProp() { return null; }
586 abstract void foo(Used used);
588 def main = myFixture.addFileToProject('Main.groovy', '''
597 touch(used.virtualFile)
602 public void testMakeInDependentModuleAfterChunkRebuild() {
603 def used = myFixture.addFileToProject('Used.groovy', 'class Used { }')
604 def java = myFixture.addFileToProject('Java.java', 'class Java { void foo(Used used) {} }')
605 def main = myFixture.addFileToProject('Main.groovy', 'class Main extends Java { }').virtualFile
607 addGroovyLibrary(addDependentModule())
609 def dep = myFixture.addFileToProject("dependent/Dep.java", "class Dep { }")
613 setFileText(used, 'class Used { String prop }')
615 setFileText(dep, 'class Dep { String prop = new Used().getProp(); }')
620 public void "test module cycle"() {
621 def dep = addDependentModule()
622 ModuleRootModificationUtil.addDependency(myModule, dep)
623 addGroovyLibrary(dep)
625 myFixture.addFileToProject('Foo.groovy', 'class Foo extends Bar { static void main(String[] args) { println "Hello from Foo" } }')
626 myFixture.addFileToProject('FooX.java', 'class FooX extends Bar { }')
627 myFixture.addFileToProject("dependent/Bar.groovy", "class Bar { Foo f; static void main(String[] args) { println 'Hello from Bar' } }")
628 myFixture.addFileToProject("dependent/BarX.java", "class BarX { Foo f; }")
630 def checkClassFiles = {
631 assert findClassFile('Foo', myModule)
632 assert findClassFile('FooX', myModule)
633 assert findClassFile('Bar', dep)
634 assert findClassFile('BarX', dep)
636 assert !findClassFile('Bar', myModule)
637 assert !findClassFile('BarX', myModule)
638 assert !findClassFile('Foo', dep)
639 assert !findClassFile('FooX', dep)
648 assertOutput('Foo', 'Hello from Foo', myModule)
649 assertOutput('Bar', 'Hello from Bar', dep)
654 public void testCompileTimeConstants() {
655 myFixture.addFileToProject 'Gr.groovy', '''
657 String HELLO = "Hello"
662 myFixture.addFileToProject 'Main.java', '''
664 public static void main(String[] args) {
665 System.out.println(Gr.HELLO + ", " + Gr.BOOL + Gr.bool + Gr.MAGIC);
670 assertOutput 'Main', 'Hello, truetrue239'
673 public void "test reporting rebuild errors caused by missing files excluded from compilation"() {
674 def foo = myFixture.addFileToProject('Foo.groovy', 'class Foo {}')
675 myFixture.addFileToProject 'Bar.groovy', 'class Bar extends Foo {}'
679 excludeFromCompilation(foo)
681 shouldFail { rebuild() }
684 private void excludeFromCompilation(PsiFile foo) {
685 final ExcludedEntriesConfiguration configuration =
686 ((CompilerConfigurationImpl)CompilerConfiguration.getInstance(project)).getExcludedEntriesConfiguration()
687 configuration.addExcludeEntryDescription(new ExcludeEntryDescription(foo.virtualFile, false, true, testRootDisposable))
690 public void "test make stub-level error and correct it"() {
691 def foo = myFixture.addFileToProject('Foo.groovy', 'class Foo { }')
692 myFixture.addFileToProject('Bar.java', 'class Bar extends Foo {}')
696 setFileText(foo, 'class Foo implements Runnabl {}')
698 shouldFail { make() }
700 setFileText(foo, 'class Foo {}')
705 public void "test reporting module compile errors caused by missing files excluded from compilation"() {
706 def foo = myFixture.addFileToProject('Foo.groovy', 'class Foo {}')
707 myFixture.addFileToProject('Bar.groovy', 'class Bar extends Foo {}')
711 excludeFromCompilation(foo)
713 shouldFail { compileModule(myModule) }
716 public void "test stubs generated while processing groovy class file dependencies"() {
717 def foo = myFixture.addFileToProject('Foo.groovy', 'class Foo { }')
718 def bar = myFixture.addFileToProject('Bar.groovy', 'class Bar extends Foo { }')
719 def client = myFixture.addFileToProject('Client.groovy', 'class Client { Bar bar = new Bar() }')
720 def java = myFixture.addFileToProject('Java.java', 'class Java extends Client { String getName(Bar bar) { return bar.toString(); } }')
724 setFileText(bar, 'class Bar { }')
727 assert findClassFile("Client")
730 public void "test ignore groovy internal non-existent interface helper inner class"() {
731 myFixture.addFileToProject 'Foo.groovy', '''
736 static class Inner implements Foo {}
740 def bar = myFixture.addFileToProject('Bar.groovy', 'class Bar { def foo = new Zoo.Inner() {} }')
743 assertEmpty compileFiles(bar.virtualFile)
746 public void "test multiline strings"() {
747 myFixture.addFileToProject 'Foo.groovy', '''class Foo {
748 public static final String s = """
754 myFixture.addFileToProject 'Bar.java', 'class Bar extends Foo {} '
759 public void "test inner java class references with incremental recompilation"() {
760 def bar1 = myFixture.addFileToProject('bar/Bar1.groovy', 'package bar; class Bar1 extends Bar2 { } ')
761 myFixture.addFileToProject('bar/Bar2.java', 'package bar; class Bar2 extends Bar3 { } ')
762 def bar3 = myFixture.addFileToProject('bar/Bar3.groovy', 'package bar; class Bar3 { Bar1 property } ')
764 myFixture.addClass("package foo; public class Outer { public static class Inner extends bar.Bar1 { } }")
765 def using = myFixture.addFileToProject('UsingInner.groovy', 'import foo.Outer; class UsingInner extends bar.Bar1 { Outer.Inner property } ')
769 touch bar1.virtualFile
770 touch bar3.virtualFile
771 touch using.virtualFile
776 public void "test rename class to java and touch its usage"() {
777 def usage = myFixture.addFileToProject('Usage.groovy', 'class Usage { Renamed r } ')
778 def renamed = myFixture.addFileToProject('Renamed.groovy', 'public class Renamed { } ')
781 touch usage.virtualFile
782 setFileName(renamed, 'Renamed.java')
786 public void "test compiling static extension"() {
788 myFixture.addFileToProject "src/extension/Extension.groovy", """
790 import groovy.transform.CompileStatic
792 @CompileStatic class Extension {
793 static <T> T test2(List<T> self) {
797 myFixture.addFileToProject "src/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule", """
798 moduleName=extension-verify
799 moduleVersion=1.0-test
800 extensionClasses=extension.Extension
801 staticExtensionClasses=
803 myFixture.addFileToProject "tests/AppTest.groovy", """
805 @groovy.transform.CompileStatic
807 List<String> list = new ArrayList<>()
815 assertOutput 'AppTest', 'b'
818 public void "test no groovy library"() {
819 myFixture.addFileToProject("dependent/a.groovy", "");
820 addModule("dependent", true)
822 def messages = make()
823 assert messages.find { it.message.contains("Cannot compile Groovy files: no Groovy library is defined for module 'dependent'") }
826 public void testGroovyOutputIsInstrumented() {
827 myFixture.addFileToProject("Bar.groovy",
828 "import org.jetbrains.annotations.NotNull; " +
829 "public class Bar {" +
830 "void xxx(@NotNull String param) { println param }\n" +
831 "static void main(String[] args) { new Bar().xxx(null) }"+
835 File annotations = new File(PathManager.getJarPathForClass(NotNull.class));
836 PsiTestUtil.addLibrary(myModule, "annotations", annotations.getParent(), annotations.getName());
840 final Ref<Boolean> exceptionFound = Ref.create(Boolean.FALSE);
841 ProcessHandler process = runProcess("Bar", myModule, DefaultRunExecutor.class, new ProcessAdapter() {
843 public void onTextAvailable(ProcessEvent event, Key outputType) {
844 if (ProcessOutputTypes.SYSTEM != outputType) {
845 if (!exceptionFound.get()) {
846 exceptionFound.set(event.getText().contains("java.lang.IllegalArgumentException: Argument for @NotNull parameter 'param' of Bar.xxx must not be null"));
850 }, ProgramRunner.PROGRAM_RUNNER_EP.findExtension(DefaultJavaProgramRunner.class));
853 assertTrue(exceptionFound.get());
856 static class GroovycTest extends GroovyCompilerTest {
857 public void "test navigate from stub to source"() {
858 GroovyFile groovyFile = (GroovyFile) myFixture.addFileToProject("a.groovy", "class Groovy3 { InvalidType type }")
859 myFixture.addClass("class Java4 extends Groovy3 {}").containingFile
861 def msg = make().find { it.message.contains('InvalidType') }
862 assert msg?.virtualFile
863 ApplicationManager.application.runWriteAction { msg.virtualFile.delete(this) }
865 def messages = make()
867 def error = messages.find { it.message.contains('InvalidType') }
868 assert error?.virtualFile
869 assert groovyFile.classes[0] == GroovyCompilerLoader.findClassByStub(project, error.virtualFile)
873 static class EclipseTest extends GroovyCompilerTest {
875 protected void setUp() {
878 def conf = CompilerWorkspaceConfiguration.getInstance(project)
879 assert conf.COMPILER_PROCESS_ADDITIONAL_VM_OPTIONS == CompilerWorkspaceConfiguration.DEFAULT_COMPILE_PROCESS_VM_OPTIONS
881 def jarName = "groovy-eclipse-batch-2.3.4-01.jar"
882 def jarPath = FileUtil.toCanonicalPath(PluginPathManager.getPluginHomePath("groovy") + "/lib/" + jarName)
883 conf.COMPILER_PROCESS_ADDITIONAL_VM_OPTIONS = "-Dgroovy.eclipse.batch.jar=" + jarPath
887 protected void tearDown() throws Exception {
888 def conf = CompilerWorkspaceConfiguration.getInstance(project)
889 conf.COMPILER_PROCESS_ADDITIONAL_VM_OPTIONS = CompilerWorkspaceConfiguration.DEFAULT_COMPILE_PROCESS_VM_OPTIONS