JS frontend: suppress UNUSED_PARAM for native declarations.

#KT-2141 Fixed
This commit is contained in:
Zalim Bashorov
2014-10-23 15:28:57 +04:00
parent 624f5c4c34
commit c8556ec1f7
7 changed files with 85 additions and 35 deletions
@@ -19,6 +19,7 @@ package org.jetbrains.jet.cli.js;
import com.google.common.base.Joiner; import com.google.common.base.Joiner;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
import com.intellij.openapi.Disposable; import com.intellij.openapi.Disposable;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile; 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.common.output.outputUtils.OutputUtilsPackage;
import org.jetbrains.jet.cli.jvm.compiler.CompileEnvironmentUtil; import org.jetbrains.jet.cli.jvm.compiler.CompileEnvironmentUtil;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; 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.CompilerConfiguration;
import org.jetbrains.jet.config.Services; import org.jetbrains.jet.config.Services;
import org.jetbrains.jet.lang.psi.JetFile; 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.analyze.TopDownAnalyzerFacadeForJS;
import org.jetbrains.k2js.config.*; import org.jetbrains.k2js.config.*;
import org.jetbrains.k2js.facade.MainCallParameters; import org.jetbrains.k2js.facade.MainCallParameters;
@@ -91,6 +93,9 @@ public class K2JSCompiler extends CLICompiler<K2JSCompilerArguments> {
CompileEnvironmentUtil.addSourceFilesCheckingForDuplicates(configuration, arguments.freeArgs); CompileEnvironmentUtil.addSourceFilesCheckingForDuplicates(configuration, arguments.freeArgs);
JetCoreEnvironment environmentForJS = JetCoreEnvironment.createForProduction(rootDisposable, configuration); JetCoreEnvironment environmentForJS = JetCoreEnvironment.createForProduction(rootDisposable, configuration);
Extensions.getRootArea()
.getExtensionPoint(DiagnosticsWithSuppression.SuppressStringProvider.EP_NAME)
.registerExtension(new SuppressUnusedParameterForJsNative());
Project project = environmentForJS.getProject(); Project project = environmentForJS.getProject();
List<JetFile> sourcesFiles = environmentForJS.getSourceFiles(); List<JetFile> sourcesFiles = environmentForJS.getSourceFiles();
@@ -53,6 +53,7 @@ import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.lang.parsing.JetParserDefinition; import org.jetbrains.jet.lang.parsing.JetParserDefinition;
import org.jetbrains.jet.lang.parsing.JetScriptDefinitionProvider; import org.jetbrains.jet.lang.parsing.JetScriptDefinitionProvider;
import org.jetbrains.jet.lang.psi.JetFile; 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.KotlinBinaryClassCache;
import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinderFactory; import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinderFactory;
import org.jetbrains.jet.lang.resolve.lazy.declarations.CliDeclarationProviderFactoryService; import org.jetbrains.jet.lang.resolve.lazy.declarations.CliDeclarationProviderFactoryService;
@@ -64,6 +65,7 @@ import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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.ERROR;
import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.WARNING; import static org.jetbrains.jet.cli.common.messages.CompilerMessageSeverity.WARNING;
@@ -139,12 +141,19 @@ public class JetCoreEnvironment {
private static JavaCoreApplicationEnvironment createApplicationEnvironment(@NotNull Disposable parentDisposable) { private static JavaCoreApplicationEnvironment createApplicationEnvironment(@NotNull Disposable parentDisposable) {
JavaCoreApplicationEnvironment applicationEnvironment = new JavaCoreApplicationEnvironment(parentDisposable); JavaCoreApplicationEnvironment applicationEnvironment = new JavaCoreApplicationEnvironment(parentDisposable);
registerApplicationExtensionPointsForCLI();
registerApplicationServicesForCLI(applicationEnvironment); registerApplicationServicesForCLI(applicationEnvironment);
registerApplicationServices(applicationEnvironment); registerApplicationServices(applicationEnvironment);
return applicationEnvironment; return applicationEnvironment;
} }
private static void registerApplicationExtensionPointsForCLI() {
registerApplicationExtensionPoint(DiagnosticsWithSuppression.SuppressStringProvider.EP_NAME,
DiagnosticsWithSuppression.SuppressStringProvider.class);
}
private static void registerApplicationServicesForCLI(@NotNull JavaCoreApplicationEnvironment applicationEnvironment) { private static void registerApplicationServicesForCLI(@NotNull JavaCoreApplicationEnvironment applicationEnvironment) {
// ability to get text from annotations xml files // ability to get text from annotations xml files
applicationEnvironment.registerFileType(PlainTextFileType.INSTANCE, "xml"); applicationEnvironment.registerFileType(PlainTextFileType.INSTANCE, "xml");
@@ -18,6 +18,8 @@ package org.jetbrains.jet.lang.resolve;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.intellij.openapi.diagnostic.Logger; 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.Condition;
import com.intellij.openapi.util.ModificationTracker; import com.intellij.openapi.util.ModificationTracker;
import com.intellij.psi.PsiElement; 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.diagnostics.Severity;
import org.jetbrains.jet.lang.psi.JetAnnotated; import org.jetbrains.jet.lang.psi.JetAnnotated;
import org.jetbrains.jet.lang.psi.JetAnnotationEntry; 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.JetFile;
import org.jetbrains.jet.lang.psi.JetStubbedPsiUtil;
import org.jetbrains.jet.lang.psi.codeFragmentUtil.CodeFragmentUtilPackage; import org.jetbrains.jet.lang.psi.codeFragmentUtil.CodeFragmentUtilPackage;
import org.jetbrains.jet.lang.resolve.constants.ArrayValue; import org.jetbrains.jet.lang.resolve.constants.ArrayValue;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.constants.StringValue; import org.jetbrains.jet.lang.resolve.constants.StringValue;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import java.util.Collection; import java.util.*;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class DiagnosticsWithSuppression implements Diagnostics { public class DiagnosticsWithSuppression implements Diagnostics {
public interface SuppressStringProvider {
ExtensionPointName<SuppressStringProvider> EP_NAME = ExtensionPointName.create("org.jetbrains.kotlin.suppressStringProvider");
@NotNull
List<String> get(@NotNull AnnotationDescriptor annotationDescriptor);
}
private static final Logger LOG = Logger.getInstance(DiagnosticsWithSuppression.class); 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 BindingContext context;
private final Collection<Diagnostic> diagnostics; private final Collection<Diagnostic> diagnostics;
@@ -197,6 +205,10 @@ public class DiagnosticsWithSuppression implements Diagnostics {
AnnotationDescriptor annotationDescriptor = context.get(BindingContext.ANNOTATION, annotationEntry); AnnotationDescriptor annotationDescriptor = context.get(BindingContext.ANNOTATION, annotationEntry);
if (annotationDescriptor == null) continue; if (annotationDescriptor == null) continue;
for (SuppressStringProvider suppressStringProvider : ADDITIONAL_SUPPRESS_STRING_PROVIDERS) {
builder.addAll(suppressStringProvider.get(annotationDescriptor));
}
if (!KotlinBuiltIns.getInstance().isSuppressAnnotation(annotationDescriptor)) continue; if (!KotlinBuiltIns.getInstance().isSuppressAnnotation(annotationDescriptor)) continue;
// We only add strings and skip other values to facilitate recovery in presence of erroneous code // We only add strings and skip other values to facilitate recovery in presence of erroneous code
+10 -8
View File
@@ -806,13 +806,15 @@
</extensions> </extensions>
<extensionPoints> <extensionPoints>
<extensionPoint name="updater" beanClass="com.intellij.openapi.fileTypes.FileTypeExtensionPoint"/> <extensionPoint name="updater" beanClass="com.intellij.openapi.fileTypes.FileTypeExtensionPoint"/>
<extensionPoint name="projectConfigurator" interface="org.jetbrains.jet.plugin.configuration.KotlinProjectConfigurator"/> <extensionPoint name="projectConfigurator" interface="org.jetbrains.jet.plugin.configuration.KotlinProjectConfigurator"/>
</extensionPoints> <extensionPoint name="suppressStringProvider" interface="org.jetbrains.jet.lang.resolve.DiagnosticsWithSuppression$SuppressStringProvider"/>
</extensionPoints>
<extensions defaultExtensionNs="org.jetbrains.kotlin"> <extensions defaultExtensionNs="org.jetbrains.kotlin">
<projectConfigurator implementation="org.jetbrains.jet.plugin.configuration.KotlinJavaModuleConfigurator"/> <projectConfigurator implementation="org.jetbrains.jet.plugin.configuration.KotlinJavaModuleConfigurator"/>
<projectConfigurator implementation="org.jetbrains.jet.plugin.configuration.KotlinJsModuleConfigurator"/> <projectConfigurator implementation="org.jetbrains.jet.plugin.configuration.KotlinJsModuleConfigurator"/>
</extensions> <suppressStringProvider implementation="org.jetbrains.k2js.analyze.SuppressUnusedParameterForJsNative"/>
</extensions>
</idea-plugin> </idea-plugin>
@@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -14,23 +14,9 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.k2js.translate.utils; package org.jetbrains.k2js
import org.jetbrains.annotations.NotNull; public enum class PredefinedAnnotation(public val fqName: String) {
LIBRARY : PredefinedAnnotation("kotlin.js.library")
public enum PredefinedAnnotation { NATIVE : PredefinedAnnotation("kotlin.js.native")
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;
}
} }
@@ -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<String> {
val descriptor = DescriptorUtils.getClassDescriptorForType(annotationDescriptor.getType())
if (PredefinedAnnotation.NATIVE.fqName == DescriptorUtils.getFqName(descriptor).asString()) {
return listOf(Errors.UNUSED_PARAMETER.getName().toLowerCase())
}
return listOf()
}
}
@@ -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.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.k2js.PredefinedAnnotation;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@@ -108,7 +109,7 @@ public final class AnnotationsUtils {
@Nullable @Nullable
private static AnnotationDescriptor getAnnotationByName(@NotNull DeclarationDescriptor descriptor, private static AnnotationDescriptor getAnnotationByName(@NotNull DeclarationDescriptor descriptor,
@NotNull PredefinedAnnotation annotation) { @NotNull PredefinedAnnotation annotation) {
return getAnnotationByName(descriptor, annotation.getFQName()); return getAnnotationByName(descriptor, annotation.getFqName());
} }
@Nullable @Nullable
@@ -135,7 +136,7 @@ public final class AnnotationsUtils {
public static boolean hasAnnotationOrInsideAnnotatedClass(@NotNull DeclarationDescriptor descriptor, public static boolean hasAnnotationOrInsideAnnotatedClass(@NotNull DeclarationDescriptor descriptor,
@NotNull PredefinedAnnotation annotation) { @NotNull PredefinedAnnotation annotation) {
return hasAnnotationOrInsideAnnotatedClass(descriptor, annotation.getFQName()); return hasAnnotationOrInsideAnnotatedClass(descriptor, annotation.getFqName());
} }
private static boolean hasAnnotationOrInsideAnnotatedClass(@NotNull DeclarationDescriptor descriptor, @NotNull String fqn) { private static boolean hasAnnotationOrInsideAnnotatedClass(@NotNull DeclarationDescriptor descriptor, @NotNull String fqn) {