diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/SelfTargetingIntention.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/SelfTargetingIntention.kt index 72b0f0de1bc..31e3c693ce4 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/SelfTargetingIntention.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/SelfTargetingIntention.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.codeInsight.FileModificationService import com.intellij.codeInsight.intention.IntentionAction import com.intellij.codeInspection.IntentionWrapper +import com.intellij.internal.statistic.service.fus.collectors.FUSApplicationUsageTrigger import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project @@ -33,6 +34,7 @@ import org.jetbrains.kotlin.psi.KtBlockExpression import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.psiUtil.containsInside import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf +import org.jetbrains.kotlin.statistics.KotlinIdeIntentionTrigger @Suppress("EqualsOrHashCode") abstract class SelfTargetingIntention( @@ -101,6 +103,10 @@ abstract class SelfTargetingIntention( final override fun invoke(project: Project, editor: Editor?, file: PsiFile) { editor ?: return + FUSApplicationUsageTrigger.getInstance().trigger( + KotlinIdeIntentionTrigger::class.java, + this::class.java.simpleName + ) PsiDocumentManager.getInstance(project).commitAllDocuments() val target = getTarget(editor, file) ?: return if (!FileModificationService.getInstance().preparePsiElementForWrite(target)) return diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinQuickFixAction.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinQuickFixAction.kt index 20b88d006c6..7ce75d9ea9d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinQuickFixAction.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinQuickFixAction.kt @@ -17,11 +17,13 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.codeInsight.FileModificationService +import com.intellij.internal.statistic.service.fus.collectors.FUSApplicationUsageTrigger import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.statistics.KotlinIdeQuickfixTrigger abstract class KotlinQuickFixAction(element: T) : QuickFixActionBase(element) { protected open fun isAvailable(project: Project, editor: Editor?, file: KtFile) = true @@ -34,6 +36,10 @@ abstract class KotlinQuickFixAction(element: T) : QuickFixAc final override fun invoke(project: Project, editor: Editor?, file: PsiFile) { val element = element ?: return if (file is KtFile && FileModificationService.getInstance().prepareFileForWrite(element.containingFile)) { + FUSApplicationUsageTrigger.getInstance().trigger( + KotlinIdeQuickfixTrigger::class.java, + this::class.java.simpleName + ) invoke(project, editor, file) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixWithDelegateFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixWithDelegateFactory.kt index 7dc3a5b7320..05cd19af6cf 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixWithDelegateFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixWithDelegateFactory.kt @@ -20,9 +20,11 @@ import com.intellij.codeInsight.FileModificationService import com.intellij.codeInsight.intention.HighPriorityAction import com.intellij.codeInsight.intention.IntentionAction import com.intellij.codeInsight.intention.LowPriorityAction +import com.intellij.internal.statistic.service.fus.collectors.FUSApplicationUsageTrigger import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiFile +import org.jetbrains.kotlin.statistics.KotlinIdeQuickfixTrigger open class QuickFixWithDelegateFactory( private val delegateFactory: () -> IntentionAction? @@ -54,6 +56,11 @@ open class QuickFixWithDelegateFactory( return } + FUSApplicationUsageTrigger.getInstance().trigger( + KotlinIdeQuickfixTrigger::class.java, + this::class.java.simpleName + ) + val action = delegateFactory() ?: return assert(action.detectPriority() == this.detectPriority()) { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt index 675d1a50e76..d92c798e1c4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/crossLanguage/KotlinElementActionsFactory.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.quickfix.crossLanguage import com.intellij.codeInsight.daemon.QuickFixBundle import com.intellij.codeInsight.intention.IntentionAction import com.intellij.codeInsight.intention.QuickFixFactory +import com.intellij.internal.statistic.service.fus.collectors.FUSApplicationUsageTrigger import com.intellij.lang.java.beans.PropertyKind import com.intellij.lang.jvm.* import com.intellij.lang.jvm.actions.* @@ -72,6 +73,7 @@ import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer import org.jetbrains.kotlin.psi.psiUtil.visibilityModifierType import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform +import org.jetbrains.kotlin.statistics.KotlinIdeIntentionTrigger import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.Variance @@ -470,6 +472,11 @@ class KotlinElementActionsFactory : JvmElementActionsFactory() { override fun invoke(project: Project, editor: Editor?, file: PsiFile?) { + FUSApplicationUsageTrigger.getInstance().trigger( + KotlinIdeIntentionTrigger::class.java, + this::class.java.simpleName + ) + val target = pointer.element ?: return val kotlinAnnotation = JavaPsiFacade.getInstance(project).findClass( request.qualifiedName, diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/KotlinDirectoryAsPackageRenameHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/KotlinDirectoryAsPackageRenameHandler.kt index 399a80bde47..d05fd7a78ef 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/KotlinDirectoryAsPackageRenameHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/KotlinDirectoryAsPackageRenameHandler.kt @@ -16,11 +16,27 @@ package org.jetbrains.kotlin.idea.refactoring.rename +import com.intellij.internal.statistic.service.fus.collectors.FUSApplicationUsageTrigger +import com.intellij.openapi.actionSystem.DataContext +import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile import com.intellij.refactoring.rename.DirectoryAsPackageRenameHandler import org.jetbrains.kotlin.psi.psiUtil.isIdentifier import org.jetbrains.kotlin.psi.psiUtil.quoteIfNeeded +import org.jetbrains.kotlin.statistics.KotlinIdeRefactoringTrigger class KotlinDirectoryAsPackageRenameHandler : DirectoryAsPackageRenameHandler() { override fun isIdentifier(name: String, project: Project): Boolean = name.quoteIfNeeded().isIdentifier() + override fun invoke(project: Project, elements: Array, dataContext: DataContext?) { + super.invoke(project, elements, dataContext) + FUSApplicationUsageTrigger.getInstance().trigger(KotlinIdeRefactoringTrigger::class.java, this.javaClass.simpleName) + } + + override fun invoke(project: Project, editor: Editor?, file: PsiFile?, dataContext: DataContext?) { + super.invoke(project, editor, file, dataContext) + FUSApplicationUsageTrigger.getInstance().trigger(KotlinIdeRefactoringTrigger::class.java, this.javaClass.simpleName) + } + } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/KotlinMemberInplaceRenameHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/KotlinMemberInplaceRenameHandler.kt index 331b4dbd258..50a6485e5ac 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/KotlinMemberInplaceRenameHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/KotlinMemberInplaceRenameHandler.kt @@ -16,8 +16,11 @@ package org.jetbrains.kotlin.idea.refactoring.rename +import com.intellij.internal.statistic.service.fus.collectors.FUSApplicationUsageTrigger import com.intellij.lang.Language +import com.intellij.openapi.actionSystem.DataContext import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project import com.intellij.psi.* import com.intellij.refactoring.RefactoringActionHandler import com.intellij.refactoring.rename.inplace.MemberInplaceRenameHandler @@ -27,6 +30,7 @@ import org.jetbrains.kotlin.idea.core.unquote import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtObjectDeclaration import org.jetbrains.kotlin.psi.KtPrimaryConstructor +import org.jetbrains.kotlin.statistics.KotlinIdeRefactoringTrigger class KotlinMemberInplaceRenameHandler : MemberInplaceRenameHandler() { private class RenamerImpl( @@ -86,4 +90,14 @@ class KotlinMemberInplaceRenameHandler : MemberInplaceRenameHandler() { val currentElement = element?.substitute() as? KtNamedDeclaration ?: return false return currentElement.nameIdentifier != null && !KotlinVariableInplaceRenameHandler.isInplaceRenameAvailable(currentElement) } + + override fun invoke(project: Project, elements: Array, dataContext: DataContext) { + super.invoke(project, elements, dataContext) + FUSApplicationUsageTrigger.getInstance().trigger(KotlinIdeRefactoringTrigger::class.java, this.javaClass.simpleName) + } + + override fun invoke(project: Project, editor: Editor?, file: PsiFile?, dataContext: DataContext?) { + super.invoke(project, editor, file, dataContext) + FUSApplicationUsageTrigger.getInstance().trigger(KotlinIdeRefactoringTrigger::class.java, this.javaClass.simpleName) + } } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPsiProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPsiProcessor.kt index d3b35c9b03b..b02438f8b1f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPsiProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPsiProcessor.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.refactoring.rename +import com.intellij.internal.statistic.service.fus.collectors.FUSApplicationUsageTrigger import com.intellij.openapi.util.Key import com.intellij.psi.* import com.intellij.psi.search.SearchScope @@ -46,6 +47,7 @@ import org.jetbrains.kotlin.psi.psiUtil.isIdentifier import org.jetbrains.kotlin.psi.psiUtil.parents import org.jetbrains.kotlin.psi.psiUtil.quoteIfNeeded import org.jetbrains.kotlin.resolve.ImportPath +import org.jetbrains.kotlin.statistics.KotlinIdeRefactoringTrigger import java.util.ArrayList import kotlin.collections.* @@ -67,6 +69,8 @@ abstract class RenameKotlinPsiProcessor : RenamePsiElementProcessor() { override fun canProcessElement(element: PsiElement): Boolean = element is KtNamedDeclaration override fun findReferences(element: PsiElement): Collection { + FUSApplicationUsageTrigger.getInstance().trigger(KotlinIdeRefactoringTrigger::class.java, this.javaClass.simpleName) + val searchParameters = KotlinReferencesSearchParameters( element, element.project.projectScope() or element.useScope, diff --git a/usage-statistics/build.gradle.kts b/usage-statistics/build.gradle.kts index 744e16b87ef..9e1ef745ac6 100644 --- a/usage-statistics/build.gradle.kts +++ b/usage-statistics/build.gradle.kts @@ -7,6 +7,10 @@ plugins { jvmTarget = "1.6" dependencies { + testCompile(intellijDep()) { + includeJars("platform-api", rootProject = rootProject) + isTransitive = false + } } sourceSets { diff --git a/usage-statistics/src/main/kotlin/org/jetbrains/kotlin/statistics/ProjectScopeStatsReporters.kt b/usage-statistics/src/main/kotlin/org/jetbrains/kotlin/statistics/ProjectScopeStatsReporters.kt new file mode 100644 index 00000000000..28b6af91894 --- /dev/null +++ b/usage-statistics/src/main/kotlin/org/jetbrains/kotlin/statistics/ProjectScopeStatsReporters.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.statistics + +import com.intellij.internal.statistic.service.fus.collectors.ApplicationUsageTriggerCollector +import javax.annotation.processing.AbstractProcessor +import javax.annotation.processing.Processor +import javax.annotation.processing.RoundEnvironment +import javax.lang.model.element.TypeElement + +open class KotlinStatisticsTrigger(private val groupIdSufix: String) : ApplicationUsageTriggerCollector() { + override fun getGroupId() = "statistics.kotlin.$groupIdSufix" +} + +open class KotlinIdeStatisticsTrigger(groupIdSufix: String) : KotlinStatisticsTrigger("ide.$groupIdSufix") + +open class KotlinGradlePluginStatisticsTrigger(groupIdSufix: String) : KotlinStatisticsTrigger("gradle.$groupIdSufix") + +class KotlinVersionTrigger : KotlinGradlePluginStatisticsTrigger("kotlin_version") + +class KotlinProjectLibraryUsageTrigger : KotlinGradlePluginStatisticsTrigger("library") + +open class KotlinIdeActionTrigger(groupIdSufix: String? = null) : KotlinIdeStatisticsTrigger("action" + (groupIdSufix?.let { ".$it" } ?: "")) + +class KotlinIdeUndoTrigger : KotlinIdeActionTrigger("undo") + +class KotlinIdeQuickfixTrigger : KotlinIdeActionTrigger("quickfix") + +class KotlinIdeRefactoringTrigger : KotlinIdeActionTrigger("refactoring") + +class KotlinIdeIntentionTrigger : KotlinIdeActionTrigger("intention") + +class KotlinIdeInspectionTrigger : KotlinIdeActionTrigger("inspection") + +class KotlinIdeExceptionTrigger : KotlinIdeStatisticsTrigger("exception") \ No newline at end of file