JS frontend: suppress UNUSED_PARAM for native declarations.
#KT-2141 Fixed
This commit is contained in:
@@ -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<K2JSCompilerArguments> {
|
||||
|
||||
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<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.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");
|
||||
|
||||
+17
-5
@@ -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<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 SuppressStringProvider[] ADDITIONAL_SUPPRESS_STRING_PROVIDERS = Extensions.getExtensions(SuppressStringProvider.EP_NAME);
|
||||
|
||||
private final BindingContext context;
|
||||
private final Collection<Diagnostic> 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
|
||||
|
||||
@@ -806,13 +806,15 @@
|
||||
|
||||
</extensions>
|
||||
|
||||
<extensionPoints>
|
||||
<extensionPoint name="updater" beanClass="com.intellij.openapi.fileTypes.FileTypeExtensionPoint"/>
|
||||
<extensionPoint name="projectConfigurator" interface="org.jetbrains.jet.plugin.configuration.KotlinProjectConfigurator"/>
|
||||
</extensionPoints>
|
||||
<extensionPoints>
|
||||
<extensionPoint name="updater" beanClass="com.intellij.openapi.fileTypes.FileTypeExtensionPoint"/>
|
||||
<extensionPoint name="projectConfigurator" interface="org.jetbrains.jet.plugin.configuration.KotlinProjectConfigurator"/>
|
||||
<extensionPoint name="suppressStringProvider" interface="org.jetbrains.jet.lang.resolve.DiagnosticsWithSuppression$SuppressStringProvider"/>
|
||||
</extensionPoints>
|
||||
|
||||
<extensions defaultExtensionNs="org.jetbrains.kotlin">
|
||||
<projectConfigurator implementation="org.jetbrains.jet.plugin.configuration.KotlinJavaModuleConfigurator"/>
|
||||
<projectConfigurator implementation="org.jetbrains.jet.plugin.configuration.KotlinJsModuleConfigurator"/>
|
||||
</extensions>
|
||||
<extensions defaultExtensionNs="org.jetbrains.kotlin">
|
||||
<projectConfigurator implementation="org.jetbrains.jet.plugin.configuration.KotlinJavaModuleConfigurator"/>
|
||||
<projectConfigurator implementation="org.jetbrains.jet.plugin.configuration.KotlinJsModuleConfigurator"/>
|
||||
<suppressStringProvider implementation="org.jetbrains.k2js.analyze.SuppressUnusedParameterForJsNative"/>
|
||||
</extensions>
|
||||
</idea-plugin>
|
||||
|
||||
+5
-19
@@ -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")
|
||||
}
|
||||
@@ -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.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) {
|
||||
|
||||
Reference in New Issue
Block a user