diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java index 6efb80221f1..ed08624e4a0 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java @@ -137,7 +137,7 @@ public enum TopDownAnalyzerFacadeForJVM { AnalysisCompletedHandlerExtension.Companion.getInstances(moduleContext.getProject()); for (AnalysisCompletedHandlerExtension extension : analysisCompletedHandlerExtensions) { - AnalysisResult result = extension.analysisCompleted(project, module, bindingContext, files); + AnalysisResult result = extension.analysisCompleted(project, module, trace, files); if (result != null) return result; } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/extensions/AnalysisCompletedHandlerExtension.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/extensions/AnalysisCompletedHandlerExtension.kt index 94b84e30b2d..b405d4c3dd4 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/extensions/AnalysisCompletedHandlerExtension.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/extensions/AnalysisCompletedHandlerExtension.kt @@ -18,11 +18,10 @@ package org.jetbrains.kotlin.resolve.jvm.extensions import com.intellij.openapi.project.Project import org.jetbrains.kotlin.analyzer.AnalysisResult -import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.BindingTrace interface AnalysisCompletedHandlerExtension { companion object : ProjectExtensionDescriptor( @@ -33,6 +32,6 @@ interface AnalysisCompletedHandlerExtension { fun analysisCompleted( project: Project, module: ModuleDescriptor, - bindingContext: BindingContext, + bindingTrace: BindingTrace, files: Collection): AnalysisResult? } \ No newline at end of file diff --git a/plugins/annotation-collector/src/org/jetbrains/kotlin/annotation/StubProducerExtension.kt b/plugins/annotation-collector/src/org/jetbrains/kotlin/annotation/StubProducerExtension.kt index 70d58a79936..069629fb359 100644 --- a/plugins/annotation-collector/src/org/jetbrains/kotlin/annotation/StubProducerExtension.kt +++ b/plugins/annotation-collector/src/org/jetbrains/kotlin/annotation/StubProducerExtension.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisCompletedHandlerExtension import org.jetbrains.org.objectweb.asm.ClassWriter @@ -35,11 +36,16 @@ class StubProducerExtension(val stubsOutputDir: File, val messageCollector: Mess override fun analysisCompleted( project: Project, module: ModuleDescriptor, - bindingContext: BindingContext, + bindingTrace: BindingTrace, files: Collection ): AnalysisResult? { - val generationState = - GenerationState(project, StubClassBuilderFactory(), module, bindingContext, files.toList(), CompilerConfiguration.EMPTY) + val generationState = GenerationState( + project, + StubClassBuilderFactory(), + module, + bindingTrace.bindingContext, + files.toList(), + CompilerConfiguration.EMPTY) KotlinCodegenFacade.compileCorrectFiles(generationState, CompilationErrorHandler.THROW_EXCEPTION) diff --git a/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingExtension.kt b/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingExtension.kt index 07353e49413..ec44bb0aeef 100755 --- a/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingExtension.kt +++ b/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingExtension.kt @@ -21,6 +21,7 @@ import com.intellij.openapi.vfs.StandardFileSystems import com.intellij.psi.* import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analyzer.AnalysisResult +import org.jetbrains.kotlin.annotation.processing.diagnostic.ErrorsAnnotationProcessing import org.jetbrains.kotlin.annotation.processing.impl.* import org.jetbrains.kotlin.asJava.findFacadeClass import org.jetbrains.kotlin.asJava.toLightClass @@ -30,6 +31,7 @@ import org.jetbrains.kotlin.java.model.internal.getAnnotationsWithInherited import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisCompletedHandlerExtension import java.io.File import java.net.URLClassLoader @@ -66,7 +68,7 @@ abstract class AbstractAnnotationProcessingExtension( override fun analysisCompleted( project: Project, module: ModuleDescriptor, - bindingContext: BindingContext, + bindingTrace: BindingTrace, files: Collection ): AnalysisResult? { if (annotationProcessingComplete) { @@ -150,9 +152,19 @@ abstract class AbstractAnnotationProcessingExtension( fun Int.count(noun: String) = if (this == 1) "$this $noun" else "$this ${noun}s" log { "Annotation processing complete, ${messager.errorCount.count("error")}, ${messager.warningCount.count("warning")}" } + + if (messager.errorCount != 0) { + val reportFile = files.firstOrNull() + if (reportFile != null) { + bindingTrace.report(ErrorsAnnotationProcessing.ANNOTATION_PROCESSING_ERROR.on(reportFile)) + } + + // Do not restart analysis + return null + } annotationProcessingComplete = true - return AnalysisResult.RetryWithAdditionalJavaRoots(bindingContext, module, listOf(generatedSourcesOutputDir)) + return AnalysisResult.RetryWithAdditionalJavaRoots(bindingTrace.bindingContext, module, listOf(generatedSourcesOutputDir)) } protected abstract fun loadAnnotationProcessors(): List diff --git a/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingPlugin.kt b/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingPlugin.kt index c60ce606213..5ec7d91d09a 100755 --- a/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingPlugin.kt +++ b/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/AnnotationProcessingPlugin.kt @@ -17,7 +17,9 @@ package org.jetbrains.kotlin.annotation.processing import com.intellij.mock.MockProject +import com.intellij.openapi.extensions.Extensions import org.jetbrains.kotlin.annotation.ClasspathBasedAnnotationProcessingExtension +import org.jetbrains.kotlin.annotation.processing.diagnostic.DefaultErrorMessagesAnnotationProcessing import org.jetbrains.kotlin.compiler.plugin.CliOption import org.jetbrains.kotlin.compiler.plugin.CliOptionProcessingException import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor @@ -26,6 +28,7 @@ import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfigurationKey import org.jetbrains.kotlin.config.ContentRoot import org.jetbrains.kotlin.config.JVMConfigurationKeys +import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisCompletedHandlerExtension import java.io.File @@ -109,6 +112,9 @@ class AnnotationProcessingComponentRegistrar : ComponentRegistrar { ?: configuration[JVMConfigurationKeys.MODULES]!!.first().getOutputDirectory()) val verboseOutput = configuration.get(AnnotationProcessingConfigurationKeys.VERBOSE_MODE) == "true" + + Extensions.getRootArea().getExtensionPoint(DefaultErrorMessages.Extension.EP_NAME) + .registerExtension(DefaultErrorMessagesAnnotationProcessing()) val annotationProcessingExtension = ClasspathBasedAnnotationProcessingExtension( classpath, generatedOutputDirFile, classesOutputDir, javaRoots, verboseOutput) diff --git a/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/diagnostic/DefaultErrorMessagesAnnotationProcessing.kt b/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/diagnostic/DefaultErrorMessagesAnnotationProcessing.kt new file mode 100644 index 00000000000..0837b57b7c7 --- /dev/null +++ b/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/diagnostic/DefaultErrorMessagesAnnotationProcessing.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2016 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.kotlin.annotation.processing.diagnostic + +import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages +import org.jetbrains.kotlin.diagnostics.rendering.DiagnosticFactoryToRendererMap + +class DefaultErrorMessagesAnnotationProcessing : DefaultErrorMessages.Extension { + + private companion object { + val MAP = DiagnosticFactoryToRendererMap("AnnotationProcessing") + + init { + MAP.put(ErrorsAnnotationProcessing.ANNOTATION_PROCESSING_ERROR, + "Some error(s) occurred while processing annotations. Please see the error messages above.") + } + } + + override fun getMap() = MAP +} \ No newline at end of file diff --git a/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/diagnostic/ErrorsAnnotationProcessing.java b/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/diagnostic/ErrorsAnnotationProcessing.java new file mode 100644 index 00000000000..5b3ff52a303 --- /dev/null +++ b/plugins/annotation-processing/src/org/jetbrains/kotlin/annotation/processing/diagnostic/ErrorsAnnotationProcessing.java @@ -0,0 +1,35 @@ +/* + * Copyright 2010-2016 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.kotlin.annotation.processing.diagnostic; + +import org.jetbrains.kotlin.diagnostics.DiagnosticFactory0; +import org.jetbrains.kotlin.diagnostics.Errors; +import org.jetbrains.kotlin.psi.KtElement; + +import static org.jetbrains.kotlin.diagnostics.Severity.ERROR; + +public interface ErrorsAnnotationProcessing { + DiagnosticFactory0 ANNOTATION_PROCESSING_ERROR = DiagnosticFactory0.create(ERROR); + + @SuppressWarnings("UnusedDeclaration") + Object _initializer = new Object() { + { + Errors.Initializer.initializeFactoryNames(ErrorsAnnotationProcessing.class); + } + }; + +}