diff --git a/idea/testData/quickfix/abstract/afterAbstractFunctionInNonAbstractClass.kt b/idea/testData/quickfix/abstract/afterAbstractFunctionInNonAbstractClass.kt index 6ec19a0bac8..86809c0a58f 100644 --- a/idea/testData/quickfix/abstract/afterAbstractFunctionInNonAbstractClass.kt +++ b/idea/testData/quickfix/abstract/afterAbstractFunctionInNonAbstractClass.kt @@ -1,4 +1,4 @@ // "Make 'foo' not abstract" "true" class A() { - fun foo() + fun foo() {} } \ No newline at end of file diff --git a/idea/testData/quickfix/abstract/afterAbstractPropertyInNonAbstractClass2.kt b/idea/testData/quickfix/abstract/afterAbstractPropertyInNonAbstractClass2.kt index 6aa96573108..773ad489ec7 100644 --- a/idea/testData/quickfix/abstract/afterAbstractPropertyInNonAbstractClass2.kt +++ b/idea/testData/quickfix/abstract/afterAbstractPropertyInNonAbstractClass2.kt @@ -1,4 +1,4 @@ // "Make 'i' not abstract" "true" class A() { - var i : Int + var i : Int = 0 } diff --git a/idea/testData/quickfix/abstract/afterAbstractPropertyWithGetter1.kt b/idea/testData/quickfix/abstract/afterAbstractPropertyWithGetter1.kt index ccea9aaf50b..89c68aca986 100644 --- a/idea/testData/quickfix/abstract/afterAbstractPropertyWithGetter1.kt +++ b/idea/testData/quickfix/abstract/afterAbstractPropertyWithGetter1.kt @@ -1,5 +1,5 @@ // "Make 'i' not abstract" "true" class B { - val i: Int + val i: Int = 0 get() = $i } \ No newline at end of file diff --git a/idea/testData/quickfix/abstract/afterAbstractPropertyWithSetter.kt b/idea/testData/quickfix/abstract/afterAbstractPropertyWithSetter.kt index ffbac65767b..cd83c943c58 100644 --- a/idea/testData/quickfix/abstract/afterAbstractPropertyWithSetter.kt +++ b/idea/testData/quickfix/abstract/afterAbstractPropertyWithSetter.kt @@ -1,5 +1,5 @@ // "Make 'j' not abstract" "true" class B { - var j: Int + var j: Int = 0 set(v: Int) {} } diff --git a/idea/testData/quickfix/abstract/afterNonMemberAbstractFunction.kt b/idea/testData/quickfix/abstract/afterNonMemberAbstractFunction.kt index 6724f07e1d7..6ed7d9ab2d9 100644 --- a/idea/testData/quickfix/abstract/afterNonMemberAbstractFunction.kt +++ b/idea/testData/quickfix/abstract/afterNonMemberAbstractFunction.kt @@ -1,2 +1,2 @@ // "Make 'foo' not abstract" "true" -fun foo() \ No newline at end of file +fun foo() {} \ No newline at end of file diff --git a/idea/testData/quickfix/abstract/beforeAbstractFunctionInNonAbstractClass.kt b/idea/testData/quickfix/abstract/beforeAbstractFunctionInNonAbstractClass.kt index 1e408668e99..5c81dea5e1d 100644 --- a/idea/testData/quickfix/abstract/beforeAbstractFunctionInNonAbstractClass.kt +++ b/idea/testData/quickfix/abstract/beforeAbstractFunctionInNonAbstractClass.kt @@ -1,4 +1,4 @@ // "Make 'foo' not abstract" "true" class A() { - abstract fun foo() + abstract fun foo() {} } \ No newline at end of file diff --git a/idea/testData/quickfix/abstract/beforeAbstractPropertyInNonAbstractClass2.kt b/idea/testData/quickfix/abstract/beforeAbstractPropertyInNonAbstractClass2.kt index 21218b3a76c..cdb5a47b594 100644 --- a/idea/testData/quickfix/abstract/beforeAbstractPropertyInNonAbstractClass2.kt +++ b/idea/testData/quickfix/abstract/beforeAbstractPropertyInNonAbstractClass2.kt @@ -1,4 +1,4 @@ // "Make 'i' not abstract" "true" class A() { - abstract var i : Int + abstract var i : Int = 0 } diff --git a/idea/testData/quickfix/abstract/beforeAbstractPropertyWithGetter1.kt b/idea/testData/quickfix/abstract/beforeAbstractPropertyWithGetter1.kt index 1270309c17a..ecbc9a486de 100644 --- a/idea/testData/quickfix/abstract/beforeAbstractPropertyWithGetter1.kt +++ b/idea/testData/quickfix/abstract/beforeAbstractPropertyWithGetter1.kt @@ -1,5 +1,5 @@ // "Make 'i' not abstract" "true" class B { - abstract val i: Int + abstract val i: Int = 0 get() = $i } \ No newline at end of file diff --git a/idea/testData/quickfix/abstract/beforeAbstractPropertyWithSetter.kt b/idea/testData/quickfix/abstract/beforeAbstractPropertyWithSetter.kt index eb13af31fce..cdfb4051f39 100644 --- a/idea/testData/quickfix/abstract/beforeAbstractPropertyWithSetter.kt +++ b/idea/testData/quickfix/abstract/beforeAbstractPropertyWithSetter.kt @@ -1,5 +1,5 @@ // "Make 'j' not abstract" "true" class B { - abstract var j: Int + abstract var j: Int = 0 set(v: Int) {} } diff --git a/idea/testData/quickfix/abstract/beforeNonMemberAbstractFunction.kt b/idea/testData/quickfix/abstract/beforeNonMemberAbstractFunction.kt index f696d0ea6dd..b6144cefffc 100644 --- a/idea/testData/quickfix/abstract/beforeNonMemberAbstractFunction.kt +++ b/idea/testData/quickfix/abstract/beforeNonMemberAbstractFunction.kt @@ -1,2 +1,2 @@ // "Make 'foo' not abstract" "true" -abstract fun foo() \ No newline at end of file +abstract fun foo() {} \ No newline at end of file diff --git a/idea/testData/quickfix/autoImports/afterLibraryTopLevelFunctionImportRuntime.kt b/idea/testData/quickfix/autoImports/afterLibraryTopLevelFunctionImportRuntime.kt index 43e49e0e952..e8d1dc0707b 100644 --- a/idea/testData/quickfix/autoImports/afterLibraryTopLevelFunctionImportRuntime.kt +++ b/idea/testData/quickfix/autoImports/afterLibraryTopLevelFunctionImportRuntime.kt @@ -4,5 +4,5 @@ package some import kotlin.util.measureTimeNano fun testFun() { - measureTimeNano() + measureTimeNano({}) } diff --git a/idea/testData/quickfix/autoImports/afterNoImportAlreadyImported.kt b/idea/testData/quickfix/autoImports/afterNoImportAlreadyImported.kt index 7a44d5248c4..4039e4861d8 100644 --- a/idea/testData/quickfix/autoImports/afterNoImportAlreadyImported.kt +++ b/idea/testData/quickfix/autoImports/afterNoImportAlreadyImported.kt @@ -1,4 +1,6 @@ // "Import Class" "false" +// ERROR: Unresolved reference: some[12] +// ERROR: No get method providing array access package Teting diff --git a/idea/testData/quickfix/autoImports/beforeLibraryTopLevelFunctionImportRuntime.kt b/idea/testData/quickfix/autoImports/beforeLibraryTopLevelFunctionImportRuntime.kt index 002dd24225e..659f35cfecc 100644 --- a/idea/testData/quickfix/autoImports/beforeLibraryTopLevelFunctionImportRuntime.kt +++ b/idea/testData/quickfix/autoImports/beforeLibraryTopLevelFunctionImportRuntime.kt @@ -2,5 +2,5 @@ package some fun testFun() { - measureTimeNano() + measureTimeNano({}) } diff --git a/idea/testData/quickfix/autoImports/beforeNoImportForAlreadyImported.kt b/idea/testData/quickfix/autoImports/beforeNoImportForAlreadyImported.kt index 645e8fe534b..aacb9257a3e 100644 --- a/idea/testData/quickfix/autoImports/beforeNoImportForAlreadyImported.kt +++ b/idea/testData/quickfix/autoImports/beforeNoImportForAlreadyImported.kt @@ -1,4 +1,6 @@ // "Import Class" "false" +// ERROR: Unresolved reference: someFun +// ERROR: Unresolved reference: test package Teting diff --git a/idea/testData/quickfix/autoImports/beforeNoImportForIndex.kt b/idea/testData/quickfix/autoImports/beforeNoImportForIndex.kt index 1b254db93ee..bad742562a9 100644 --- a/idea/testData/quickfix/autoImports/beforeNoImportForIndex.kt +++ b/idea/testData/quickfix/autoImports/beforeNoImportForIndex.kt @@ -1,4 +1,6 @@ // "Import Class" "false" +// ERROR: Unresolved reference: some[12] +// ERROR: No get method providing array access package Teting diff --git a/idea/testData/quickfix/expressions/afterUnnecessaryNonNullAssertion1.kt b/idea/testData/quickfix/expressions/afterUnnecessaryNonNullAssertion1.kt index dd12e4a5f8a..3f6e5bd7ffe 100644 --- a/idea/testData/quickfix/expressions/afterUnnecessaryNonNullAssertion1.kt +++ b/idea/testData/quickfix/expressions/afterUnnecessaryNonNullAssertion1.kt @@ -1,4 +1,4 @@ // "Remove unnecessary non-null assertion (!!)" "true" fun test(value : Int) : Int { - value + return value } diff --git a/idea/testData/quickfix/expressions/afterUnnecessaryNonNullAssertion2.kt b/idea/testData/quickfix/expressions/afterUnnecessaryNonNullAssertion2.kt index 9acdb6fb04b..723fcc294db 100644 --- a/idea/testData/quickfix/expressions/afterUnnecessaryNonNullAssertion2.kt +++ b/idea/testData/quickfix/expressions/afterUnnecessaryNonNullAssertion2.kt @@ -1,4 +1,4 @@ // "Replace with dot call" "true" -fun test(value : String) : Int { - return value.length() +fun test(value : String) { + value.equals("test") } diff --git a/idea/testData/quickfix/expressions/beforeUnnecessaryNonNullAssertion1.kt b/idea/testData/quickfix/expressions/beforeUnnecessaryNonNullAssertion1.kt index fd1312a806e..997fb077345 100644 --- a/idea/testData/quickfix/expressions/beforeUnnecessaryNonNullAssertion1.kt +++ b/idea/testData/quickfix/expressions/beforeUnnecessaryNonNullAssertion1.kt @@ -1,4 +1,4 @@ // "Remove unnecessary non-null assertion (!!)" "true" fun test(value : Int) : Int { - value!! + return value!! } diff --git a/idea/testData/quickfix/expressions/beforeUnnecessaryNonNullAssertion2.kt b/idea/testData/quickfix/expressions/beforeUnnecessaryNonNullAssertion2.kt index 0bfbf91d678..474ea05c733 100644 --- a/idea/testData/quickfix/expressions/beforeUnnecessaryNonNullAssertion2.kt +++ b/idea/testData/quickfix/expressions/beforeUnnecessaryNonNullAssertion2.kt @@ -1,4 +1,4 @@ // "Replace with dot call" "true" -fun test(value : String) : Int { - return value!!.length() +fun test(value : String) { + value!!.equals("test") } diff --git a/idea/testData/quickfix/override/afterVirtualMethodHidden.kt b/idea/testData/quickfix/override/afterVirtualMethodHidden.kt index 9bc0fa63ac2..b1c0b337ce6 100644 --- a/idea/testData/quickfix/override/afterVirtualMethodHidden.kt +++ b/idea/testData/quickfix/override/afterVirtualMethodHidden.kt @@ -1,6 +1,6 @@ // "Add 'override' modifier" "true" open class A() { - fun foo() {} + open fun foo() {} } class B() : A() { diff --git a/idea/testData/quickfix/override/beforeVirtualMethodHidden.kt b/idea/testData/quickfix/override/beforeVirtualMethodHidden.kt index 682cdee3abd..f92e130d8a9 100644 --- a/idea/testData/quickfix/override/beforeVirtualMethodHidden.kt +++ b/idea/testData/quickfix/override/beforeVirtualMethodHidden.kt @@ -1,6 +1,6 @@ // "Add 'override' modifier" "true" open class A() { - fun foo() {} + open fun foo() {} } class B() : A() { diff --git a/idea/testData/quickfix/typeAddition/beforeNoAddErrorType.kt b/idea/testData/quickfix/typeAddition/beforeNoAddErrorType.kt index 6d4ddf1c9d8..df7eeae1aa4 100644 --- a/idea/testData/quickfix/typeAddition/beforeNoAddErrorType.kt +++ b/idea/testData/quickfix/typeAddition/beforeNoAddErrorType.kt @@ -1,4 +1,6 @@ // "Specify type explicitly" "false" +// ERROR: Public or protected member should have specified type +// ERROR: Unresolved reference: foo class A() { public val t = foo() diff --git a/idea/testData/quickfix/typeAddition/beforePublicFunWithoutBody.kt b/idea/testData/quickfix/typeAddition/beforePublicFunWithoutBody.kt index 7933afd2da2..580eed90ae9 100644 --- a/idea/testData/quickfix/typeAddition/beforePublicFunWithoutBody.kt +++ b/idea/testData/quickfix/typeAddition/beforePublicFunWithoutBody.kt @@ -1,4 +1,5 @@ // "Specify return type explicitly" "false" +// ERROR: Function 'foo' without a body must be abstract package a class A() { diff --git a/idea/tests/org/jetbrains/jet/plugin/quickfix/JetQuickFixTest.java b/idea/tests/org/jetbrains/jet/plugin/quickfix/JetQuickFixTest.java index 740992c2afd..7865a2d0186 100644 --- a/idea/tests/org/jetbrains/jet/plugin/quickfix/JetQuickFixTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/quickfix/JetQuickFixTest.java @@ -20,20 +20,25 @@ import com.google.common.collect.Lists; import com.intellij.codeInsight.daemon.quickFix.LightQuickFixTestCase; import com.intellij.openapi.projectRoots.JavaSdk; import com.intellij.openapi.projectRoots.Sdk; +import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestSuite; import org.apache.commons.lang.SystemUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetTestCaseBuilder; +import org.jetbrains.jet.analyzer.AnalyzeExhaust; +import org.jetbrains.jet.lang.diagnostics.Diagnostic; +import org.jetbrains.jet.lang.diagnostics.Severity; +import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.plugin.PluginTestCaseBase; +import org.jetbrains.jet.plugin.highlighter.IdeErrorMessages; +import org.jetbrains.jet.plugin.project.WholeProjectAnalyzerFacade; import org.jetbrains.jet.testing.ConfigRuntimeUtil; +import org.jetbrains.jet.testing.InTextDirectivesUtils; import java.io.File; import java.io.FilenameFilter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.util.*; /** * @author svtk @@ -97,6 +102,7 @@ public class JetQuickFixTest extends LightQuickFixTestCase { return JetTestCaseBuilder.getHomeDirectory() + "/idea/testData/quickfix/"; } + @Override public String getName() { return "test" + name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase()); } @@ -111,6 +117,7 @@ public class JetQuickFixTest extends LightQuickFixTestCase { try { doSingleTest(name.substring("before".length()) + ".kt"); + checkForUnexpectedErrors(); } finally { if (isWithRuntime) { ConfigRuntimeUtil.unConfigureKotlinRuntime(getModule(), getProjectJDK()); @@ -118,6 +125,34 @@ public class JetQuickFixTest extends LightQuickFixTestCase { } } + private static void checkForUnexpectedErrors() { + AnalyzeExhaust exhaust = WholeProjectAnalyzerFacade.analyzeProjectWithCacheOnAFile((JetFile) getFile()); + Collection diagnostics = exhaust.getBindingContext().getDiagnostics(); + + if (diagnostics.size() != 0) { + String[] expectedErrorStrings = InTextDirectivesUtils.findListWithPrefix("// ERROR:", getFile().getText()); + + System.out.println(getFile().getText()); + + Collection expectedErrors = new HashSet(Arrays.asList(expectedErrorStrings)); + + StringBuilder builder = new StringBuilder(); + boolean hasErrors = false; + + for (Diagnostic diagnostic : diagnostics) { + if (diagnostic.getSeverity() == Severity.ERROR) { + String errorText = IdeErrorMessages.RENDERER.render(diagnostic); + if (!expectedErrors.contains(errorText)) { + hasErrors = true; + builder.append("// ERROR: ").append(errorText).append("\n"); + } + } + } + + Assert.assertFalse("There should be no unexpected errors after applying fix (Use \"// ERROR:\" directive): \n" + builder.toString(), hasErrors); + } + } + @Override protected String getBasePath() { return "/quickfix/" + dataPath;