From c8556ec1f790f2fbce29285816f90525a5979f5c Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Thu, 23 Oct 2014 15:28:57 +0400 Subject: [PATCH] JS frontend: suppress UNUSED_PARAM for native declarations. #KT-2141 Fixed --- .../jetbrains/jet/cli/js/K2JSCompiler.java | 7 +++- .../cli/jvm/compiler/JetCoreEnvironment.java | 9 +++++ .../resolve/DiagnosticsWithSuppression.java | 22 +++++++++--- idea/src/META-INF/plugin.xml | 18 +++++----- .../jetbrains/k2js/PredefinedAnnotation.kt} | 24 +++---------- .../SuppressUnusedParameterForJsNative.kt | 35 +++++++++++++++++++ .../translate/utils/AnnotationsUtils.java | 5 +-- 7 files changed, 85 insertions(+), 35 deletions(-) rename js/{js.translator/src/org/jetbrains/k2js/translate/utils/PredefinedAnnotation.java => js.frontend/src/org/jetbrains/k2js/PredefinedAnnotation.kt} (56%) create mode 100644 js/js.frontend/src/org/jetbrains/k2js/analyze/SuppressUnusedParameterForJsNative.kt diff --git a/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java index cff54d63843..58e8677184e 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/js/K2JSCompiler.java @@ -19,6 +19,7 @@ package org.jetbrains.jet.cli.js; import com.google.common.base.Joiner; import com.google.common.base.Predicates; import com.intellij.openapi.Disposable; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -43,10 +44,11 @@ import org.jetbrains.jet.cli.common.messages.MessageCollector; import org.jetbrains.jet.cli.common.output.outputUtils.OutputUtilsPackage; import org.jetbrains.jet.cli.jvm.compiler.CompileEnvironmentUtil; import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; -import org.jetbrains.jet.config.CommonConfigurationKeys; import org.jetbrains.jet.config.CompilerConfiguration; import org.jetbrains.jet.config.Services; import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.resolve.DiagnosticsWithSuppression; +import org.jetbrains.k2js.analyze.SuppressUnusedParameterForJsNative; import org.jetbrains.k2js.analyze.TopDownAnalyzerFacadeForJS; import org.jetbrains.k2js.config.*; import org.jetbrains.k2js.facade.MainCallParameters; @@ -91,6 +93,9 @@ public class K2JSCompiler extends CLICompiler { CompileEnvironmentUtil.addSourceFilesCheckingForDuplicates(configuration, arguments.freeArgs); JetCoreEnvironment environmentForJS = JetCoreEnvironment.createForProduction(rootDisposable, configuration); + Extensions.getRootArea() + .getExtensionPoint(DiagnosticsWithSuppression.SuppressStringProvider.EP_NAME) + .registerExtension(new SuppressUnusedParameterForJsNative()); Project project = environmentForJS.getProject(); List sourcesFiles = environmentForJS.getSourceFiles(); diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java index 39862ca9c4e..c49fca931e5 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java @@ -53,6 +53,7 @@ import org.jetbrains.jet.config.CompilerConfiguration; import org.jetbrains.jet.lang.parsing.JetParserDefinition; import org.jetbrains.jet.lang.parsing.JetScriptDefinitionProvider; import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.resolve.DiagnosticsWithSuppression; import org.jetbrains.jet.lang.resolve.kotlin.KotlinBinaryClassCache; import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinderFactory; import org.jetbrains.jet.lang.resolve.lazy.declarations.CliDeclarationProviderFactoryService; @@ -64,6 +65,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; +import static com.intellij.core.CoreApplicationEnvironment.registerApplicationExtensionPoint; import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.ERROR; import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.WARNING; @@ -139,12 +141,19 @@ public class JetCoreEnvironment { private static JavaCoreApplicationEnvironment createApplicationEnvironment(@NotNull Disposable parentDisposable) { JavaCoreApplicationEnvironment applicationEnvironment = new JavaCoreApplicationEnvironment(parentDisposable); + registerApplicationExtensionPointsForCLI(); + registerApplicationServicesForCLI(applicationEnvironment); registerApplicationServices(applicationEnvironment); return applicationEnvironment; } + private static void registerApplicationExtensionPointsForCLI() { + registerApplicationExtensionPoint(DiagnosticsWithSuppression.SuppressStringProvider.EP_NAME, + DiagnosticsWithSuppression.SuppressStringProvider.class); + } + private static void registerApplicationServicesForCLI(@NotNull JavaCoreApplicationEnvironment applicationEnvironment) { // ability to get text from annotations xml files applicationEnvironment.registerFileType(PlainTextFileType.INSTANCE, "xml"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DiagnosticsWithSuppression.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DiagnosticsWithSuppression.java index 3701bfa1e2e..0e699ec0e72 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DiagnosticsWithSuppression.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DiagnosticsWithSuppression.java @@ -18,6 +18,8 @@ package org.jetbrains.jet.lang.resolve; import com.google.common.collect.ImmutableSet; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.ModificationTracker; import com.intellij.psi.PsiElement; @@ -34,23 +36,29 @@ import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.diagnostics.Severity; import org.jetbrains.jet.lang.psi.JetAnnotated; import org.jetbrains.jet.lang.psi.JetAnnotationEntry; -import org.jetbrains.jet.lang.psi.JetStubbedPsiUtil; import org.jetbrains.jet.lang.psi.JetFile; +import org.jetbrains.jet.lang.psi.JetStubbedPsiUtil; import org.jetbrains.jet.lang.psi.codeFragmentUtil.CodeFragmentUtilPackage; import org.jetbrains.jet.lang.resolve.constants.ArrayValue; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.constants.StringValue; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; +import java.util.*; public class DiagnosticsWithSuppression implements Diagnostics { + public interface SuppressStringProvider { + ExtensionPointName EP_NAME = ExtensionPointName.create("org.jetbrains.kotlin.suppressStringProvider"); + + @NotNull + List get(@NotNull AnnotationDescriptor annotationDescriptor); + } + private static final Logger LOG = Logger.getInstance(DiagnosticsWithSuppression.class); + private static final SuppressStringProvider[] ADDITIONAL_SUPPRESS_STRING_PROVIDERS = Extensions.getExtensions(SuppressStringProvider.EP_NAME); + private final BindingContext context; private final Collection diagnostics; @@ -197,6 +205,10 @@ public class DiagnosticsWithSuppression implements Diagnostics { AnnotationDescriptor annotationDescriptor = context.get(BindingContext.ANNOTATION, annotationEntry); if (annotationDescriptor == null) continue; + for (SuppressStringProvider suppressStringProvider : ADDITIONAL_SUPPRESS_STRING_PROVIDERS) { + builder.addAll(suppressStringProvider.get(annotationDescriptor)); + } + if (!KotlinBuiltIns.getInstance().isSuppressAnnotation(annotationDescriptor)) continue; // We only add strings and skip other values to facilitate recovery in presence of erroneous code diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 4bdc64b1358..39884dafd0c 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -806,13 +806,15 @@ - - - - + + + + + - - - - + + + + + diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/PredefinedAnnotation.java b/js/js.frontend/src/org/jetbrains/k2js/PredefinedAnnotation.kt similarity index 56% rename from js/js.translator/src/org/jetbrains/k2js/translate/utils/PredefinedAnnotation.java rename to js/js.frontend/src/org/jetbrains/k2js/PredefinedAnnotation.kt index 2cfcbb18005..55072cfd0c2 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/PredefinedAnnotation.java +++ b/js/js.frontend/src/org/jetbrains/k2js/PredefinedAnnotation.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2013 JetBrains s.r.o. + * Copyright 2010-2014 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. @@ -14,23 +14,9 @@ * limitations under the License. */ -package org.jetbrains.k2js.translate.utils; +package org.jetbrains.k2js -import org.jetbrains.annotations.NotNull; - -public enum PredefinedAnnotation { - LIBRARY("kotlin.js.library"), - NATIVE("kotlin.js.native"); - - PredefinedAnnotation(@NotNull String fqName) { - this.fqName = fqName; - } - - @NotNull - private final String fqName; - - @NotNull - public String getFQName() { - return fqName; - } +public enum class PredefinedAnnotation(public val fqName: String) { + LIBRARY : PredefinedAnnotation("kotlin.js.library") + NATIVE : PredefinedAnnotation("kotlin.js.native") } diff --git a/js/js.frontend/src/org/jetbrains/k2js/analyze/SuppressUnusedParameterForJsNative.kt b/js/js.frontend/src/org/jetbrains/k2js/analyze/SuppressUnusedParameterForJsNative.kt new file mode 100644 index 00000000000..7bbd6fa67ff --- /dev/null +++ b/js/js.frontend/src/org/jetbrains/k2js/analyze/SuppressUnusedParameterForJsNative.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2010-2014 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.k2js.analyze + +import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor +import org.jetbrains.jet.lang.resolve.DescriptorUtils +import org.jetbrains.jet.lang.diagnostics.Errors +import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe +import org.jetbrains.jet.lang.resolve.DiagnosticsWithSuppression +import org.jetbrains.k2js.PredefinedAnnotation + +class SuppressUnusedParameterForJsNative : DiagnosticsWithSuppression.SuppressStringProvider { + override fun get(annotationDescriptor: AnnotationDescriptor): List { + val descriptor = DescriptorUtils.getClassDescriptorForType(annotationDescriptor.getType()) + if (PredefinedAnnotation.NATIVE.fqName == DescriptorUtils.getFqName(descriptor).asString()) { + return listOf(Errors.UNUSED_PARAMETER.getName().toLowerCase()) + } + + return listOf() + } +} \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/AnnotationsUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/AnnotationsUtils.java index 80dcf98747a..d2e6cfadbbe 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/AnnotationsUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/AnnotationsUtils.java @@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.k2js.PredefinedAnnotation; import java.util.List; import java.util.Set; @@ -108,7 +109,7 @@ public final class AnnotationsUtils { @Nullable private static AnnotationDescriptor getAnnotationByName(@NotNull DeclarationDescriptor descriptor, @NotNull PredefinedAnnotation annotation) { - return getAnnotationByName(descriptor, annotation.getFQName()); + return getAnnotationByName(descriptor, annotation.getFqName()); } @Nullable @@ -135,7 +136,7 @@ public final class AnnotationsUtils { public static boolean hasAnnotationOrInsideAnnotatedClass(@NotNull DeclarationDescriptor descriptor, @NotNull PredefinedAnnotation annotation) { - return hasAnnotationOrInsideAnnotatedClass(descriptor, annotation.getFQName()); + return hasAnnotationOrInsideAnnotatedClass(descriptor, annotation.getFqName()); } private static boolean hasAnnotationOrInsideAnnotatedClass(@NotNull DeclarationDescriptor descriptor, @NotNull String fqn) {