From df680305ba3031bf78fe033ffaf103237ee0889e Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 3 Oct 2016 12:29:23 +0300 Subject: [PATCH] Improve diagnostic message for UNSUPPORTED_FEATURE Render lowercase words separated by spaces instead of CamelCase in the diagnostic message --- .../kotlin/config/LanguageVersionSettings.kt | 4 ++++ .../rendering/DefaultErrorMessages.java | 9 ++++++++- .../kotlin/resolve/lazy/JvmResolveUtil.kt | 6 +++++- .../diagnosticMessage/unsupportedFeature.kt | 7 +++++++ .../diagnosticMessage/unsupportedFeature1.txt | 2 ++ .../AbstractDiagnosticMessageJsTest.java | 11 ++++++++--- .../AbstractDiagnosticMessageTest.java | 19 ++++++++++++++++--- .../DiagnosticMessageTestGenerated.java | 6 ++++++ 8 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 idea/testData/diagnosticMessage/unsupportedFeature.kt create mode 100644 idea/testData/diagnosticMessage/unsupportedFeature1.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/frontend/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 5a63d29bc8a..286f5cf330a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -31,6 +31,10 @@ enum class LanguageFeature(val sinceVersion: LanguageVersion) { DestructuringLambdaParameters(KOTLIN_1_1), ; + val presentableText: String + // E.g. "DestructuringLambdaParameters" -> ["Destructuring", "Lambda", "Parameters"] -> "destructuring lambda parameters" + get() = name.split("(?() { + @NotNull + @Override + public String render(LanguageFeature feature, @NotNull RenderingContext renderingContext) { + return feature.getSinceVersion().getVersionString() + ": " + feature.getPresentableText(); + } + }); MAP.put(EXCEPTION_FROM_ANALYZER, "Internal Error occurred while analyzing this expression:\n{0}", THROWABLE); MAP.put(UNNECESSARY_SAFE_CALL, "Unnecessary safe call on a non-null receiver of type {0}", RENDER_TYPE); MAP.put(UNEXPECTED_SAFE_CALL, "Safe-call is not allowed here"); diff --git a/compiler/tests-common/org/jetbrains/kotlin/resolve/lazy/JvmResolveUtil.kt b/compiler/tests-common/org/jetbrains/kotlin/resolve/lazy/JvmResolveUtil.kt index c86b4030add..713a668d6c3 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/resolve/lazy/JvmResolveUtil.kt +++ b/compiler/tests-common/org/jetbrains/kotlin/resolve/lazy/JvmResolveUtil.kt @@ -65,7 +65,11 @@ object JvmResolveUtil { @JvmStatic fun analyze(files: Collection, environment: KotlinCoreEnvironment): AnalysisResult = - analyze(environment.project, files, environment.configuration) { scope -> + analyze(files, environment, environment.configuration) + + @JvmStatic + fun analyze(files: Collection, environment: KotlinCoreEnvironment, configuration: CompilerConfiguration): AnalysisResult = + analyze(environment.project, files, configuration) { scope -> JvmPackagePartProvider(environment, scope) } diff --git a/idea/testData/diagnosticMessage/unsupportedFeature.kt b/idea/testData/diagnosticMessage/unsupportedFeature.kt new file mode 100644 index 00000000000..fade7fb6095 --- /dev/null +++ b/idea/testData/diagnosticMessage/unsupportedFeature.kt @@ -0,0 +1,7 @@ +// !DIAGNOSTICS_NUMBER: 1 +// !DIAGNOSTICS: UNSUPPORTED_FEATURE +// LANGUAGE_VERSION: 1.0 + +fun test() { + mapOf("1" to "2").forEach { (key, value) -> } +} diff --git a/idea/testData/diagnosticMessage/unsupportedFeature1.txt b/idea/testData/diagnosticMessage/unsupportedFeature1.txt new file mode 100644 index 00000000000..3b1f04418f7 --- /dev/null +++ b/idea/testData/diagnosticMessage/unsupportedFeature1.txt @@ -0,0 +1,2 @@ + +The feature is only available since Kotlin 1.1: destructuring lambda parameters \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageJsTest.java b/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageJsTest.java index 9c3c2b04560..7dbc57641ba 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageJsTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageJsTest.java @@ -23,6 +23,8 @@ import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; import org.jetbrains.kotlin.config.CommonConfigurationKeys; import org.jetbrains.kotlin.config.CompilerConfiguration; +import org.jetbrains.kotlin.config.LanguageVersion; +import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl; import org.jetbrains.kotlin.idea.test.PluginTestCaseBase; import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS; import org.jetbrains.kotlin.js.config.JSConfigurationKeys; @@ -45,8 +47,8 @@ public abstract class AbstractDiagnosticMessageJsTest extends AbstractDiagnostic @NotNull @Override - protected AnalysisResult analyze(@NotNull KtFile file) { - return TopDownAnalyzerFacadeForJS.analyzeFiles(singletonList(file), getConfig()); + protected AnalysisResult analyze(@NotNull KtFile file, @Nullable LanguageVersion explicitLanguageVersion) { + return TopDownAnalyzerFacadeForJS.analyzeFiles(singletonList(file), getConfig(explicitLanguageVersion)); } @NotNull @@ -62,12 +64,15 @@ public abstract class AbstractDiagnosticMessageJsTest extends AbstractDiagnostic } @NotNull - private JsConfig getConfig() { + private JsConfig getConfig(@Nullable LanguageVersion explicitLanguageVersion) { CompilerConfiguration configuration = getEnvironment().getConfiguration().copy(); configuration.put(CommonConfigurationKeys.MODULE_NAME, KotlinTestUtils.TEST_MODULE_NAME); configuration.put(JSConfigurationKeys.LIBRARY_FILES, LibrarySourcesConfig.JS_STDLIB); configuration.put(CommonConfigurationKeys.DISABLE_INLINE, true); configuration.put(JSConfigurationKeys.UNIT_TEST_CONFIG, true); + if (explicitLanguageVersion != null) { + configuration.put(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS, new LanguageVersionSettingsImpl(explicitLanguageVersion)); + } return new LibrarySourcesConfig(getProject(), configuration); } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageTest.java b/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageTest.java index 3ebf5a59499..c2c543c1b8f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/highlighter/AbstractDiagnosticMessageTest.java @@ -24,6 +24,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.analyzer.AnalysisResult; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; +import org.jetbrains.kotlin.config.CommonConfigurationKeys; +import org.jetbrains.kotlin.config.CompilerConfiguration; +import org.jetbrains.kotlin.config.LanguageVersion; +import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl; import org.jetbrains.kotlin.diagnostics.Diagnostic; import org.jetbrains.kotlin.diagnostics.DiagnosticFactory; import org.jetbrains.kotlin.diagnostics.Errors; @@ -35,11 +39,13 @@ import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm; import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil; import org.jetbrains.kotlin.test.ConfigurationKind; +import org.jetbrains.kotlin.test.InTextDirectivesUtils; import org.jetbrains.kotlin.test.KotlinTestUtils; import org.jetbrains.kotlin.test.KotlinTestWithEnvironment; import java.io.File; import java.lang.reflect.Field; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; @@ -73,8 +79,12 @@ public abstract class AbstractDiagnosticMessageTest extends KotlinTestWithEnviro } @NotNull - protected AnalysisResult analyze(@NotNull KtFile file) { - return JvmResolveUtil.analyze(file, getEnvironment()); + protected AnalysisResult analyze(@NotNull KtFile file, @Nullable LanguageVersion explicitLanguageVersion) { + CompilerConfiguration configuration = getEnvironment().getConfiguration(); + if (explicitLanguageVersion != null) { + configuration.put(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS, new LanguageVersionSettingsImpl(explicitLanguageVersion)); + } + return JvmResolveUtil.analyze(Collections.singleton(file), getEnvironment(), configuration); } public void doTest(String filePath) throws Exception { @@ -87,8 +97,11 @@ public abstract class AbstractDiagnosticMessageTest extends KotlinTestWithEnviro final Set> diagnosticFactories = getDiagnosticFactories(directives); MessageType messageType = getMessageTypeDirective(directives); + String explicitLanguageVersion = InTextDirectivesUtils.findStringWithPrefixes(fileData, "// LANGUAGE_VERSION:"); + LanguageVersion version = explicitLanguageVersion == null ? null : LanguageVersion.fromVersionString(explicitLanguageVersion); + KtFile psiFile = KotlinTestUtils.createFile(fileName, KotlinTestUtils.doLoadFile(getTestDataPath(), fileName), getProject()); - AnalysisResult analysisResult = analyze(psiFile); + AnalysisResult analysisResult = analyze(psiFile, version); BindingContext bindingContext = analysisResult.getBindingContext(); List diagnostics = ContainerUtil.filter(bindingContext.getDiagnostics().all(), new Condition() { diff --git a/idea/tests/org/jetbrains/kotlin/idea/highlighter/DiagnosticMessageTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/highlighter/DiagnosticMessageTestGenerated.java index 277e9eb1367..ec0c493f262 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/highlighter/DiagnosticMessageTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/highlighter/DiagnosticMessageTestGenerated.java @@ -269,6 +269,12 @@ public class DiagnosticMessageTestGenerated extends AbstractDiagnosticMessageTes doTest(fileName); } + @TestMetadata("unsupportedFeature.kt") + public void testUnsupportedFeature() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/diagnosticMessage/unsupportedFeature.kt"); + doTest(fileName); + } + @TestMetadata("unusedParameter.kt") public void testUnusedParameter() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/diagnosticMessage/unusedParameter.kt");