1
0
mirror of https://github.com/chylex/IntelliJ-IdeaVim.git synced 2025-07-23 01:04:33 +02:00

Add statistic collection for some options

This commit is contained in:
Alex Plate 2020-12-17 23:13:54 +03:00
parent 69d3c7b754
commit b7cb3c0945
No known key found for this signature in database
GPG Key ID: 0B97153C8FFEC09F
6 changed files with 118 additions and 14 deletions
build.gradle
resources/META-INF
src/com/maddyhome/idea/vim

View File

@ -64,6 +64,10 @@ runPluginVerifier {
teamCityOutputFormat = true
}
runIde {
jvmArgs '-Dfus.internal.test.mode=true'
}
repositories {
mavenCentral()
jcenter()

View File

@ -121,6 +121,8 @@
<postStartupActivity implementation="com.maddyhome.idea.vim.PluginStartup" order="first"/>
<editorFloatingToolbarProvider implementation="com.maddyhome.idea.vim.ui.ReloadFloatingToolbar"/>
<statistics.counterUsagesCollector implementationClass="com.maddyhome.idea.vim.statistic.OptionsCollector"/>
</extensions>
<xi:include href="/META-INF/includes/ApplicationServices.xml" xpointer="xpointer(/idea-plugin/*)"/>

View File

@ -19,6 +19,9 @@ package com.maddyhome.idea.vim.ex.vimscript
import com.maddyhome.idea.vim.ex.CommandParser
import com.maddyhome.idea.vim.ex.ExException
import com.maddyhome.idea.vim.option.OptionsManager
import com.maddyhome.idea.vim.statistic.OptionActivation
import com.maddyhome.idea.vim.statistic.OptionsCollector
import com.maddyhome.idea.vim.ui.VimRcFileState
import org.jetbrains.annotations.NonNls
import java.io.File
@ -107,20 +110,28 @@ object VimScriptParser {
}
fun executeText(text: List<String>) {
for (line in text) {
// TODO: Build a proper parse tree for a VimL file instead of ignoring potentially nested lines (VIM-669)
if (line.startsWith(" ") || line.startsWith("\t")) continue
OptionsCollector.fileExecution = true
try {
for (line in text) {
// TODO: Build a proper parse tree for a VimL file instead of ignoring potentially nested lines (VIM-669)
if (line.startsWith(" ") || line.startsWith("\t")) continue
val lineToExecute = if (line.startsWith(":")) line.substring(1) else line
val commandParser = CommandParser.getInstance()
try {
val command = commandParser.parse(lineToExecute)
val commandHandler = commandParser.getCommandHandler(command)
if (commandHandler is VimScriptCommandHandler) {
commandHandler.execute(command)
val lineToExecute = if (line.startsWith(":")) line.substring(1) else line
val commandParser = CommandParser.getInstance()
try {
val command = commandParser.parse(lineToExecute)
val commandHandler = commandParser.getCommandHandler(command)
if (commandHandler is VimScriptCommandHandler) {
commandHandler.execute(command)
}
} catch (ignored: ExException) {
}
} catch (ignored: ExException) {
}
} finally {
OptionsManager.trackedOptions.forEach { option ->
option.statisticCollector?.log(option.value, OptionActivation.DEFAULT)
}
OptionsCollector.fileExecution = false
}
}

View File

@ -18,19 +18,38 @@
package com.maddyhome.idea.vim.option;
import com.intellij.internal.statistic.eventLog.events.EventId2;
import com.maddyhome.idea.vim.statistic.OptionActivation;
import com.maddyhome.idea.vim.statistic.OptionsCollector;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class BoundStringOption extends StringOption {
BoundStringOption(@NonNls String name, @NonNls String abbrev, @NonNls String dflt, String[] values) {
super(name, abbrev, dflt);
this.values = values;
this.statisticCollector = null;
}
BoundStringOption(@NonNls String name, @NonNls String abbrev, @NonNls String dflt, String[] values, @NotNull EventId2<@Nullable String, OptionActivation> statisticCollector) {
super(name, abbrev, dflt);
this.values = values;
this.statisticCollector = statisticCollector;
}
@Override
public boolean set(String val) {
if (isValid(val)) {
if (statisticCollector != null) {
OptionActivation activation = OptionsCollector.Companion.getFileExecution()
? OptionActivation.IDEAVIMRC
: OptionActivation.EX_COMMAND;
OptionsManager.INSTANCE.getTrackedOptions().removeIf(o -> o.getName().equals(this.name));
statisticCollector.log(val, activation);
}
return super.set(val);
}
@ -75,4 +94,5 @@ public class BoundStringOption extends StringOption {
}
protected final String[] values;
public final @Nullable EventId2<@Nullable String, OptionActivation> statisticCollector;
}

View File

@ -36,6 +36,7 @@ import com.maddyhome.idea.vim.helper.isBlockCaretBehaviour
import com.maddyhome.idea.vim.helper.mode
import com.maddyhome.idea.vim.helper.subMode
import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor
import com.maddyhome.idea.vim.statistic.OptionsCollector
import org.jetbrains.annotations.Contract
import org.jetbrains.annotations.NonNls
import java.util.*
@ -49,6 +50,8 @@ object OptionsManager {
private val options: MutableMap<String, Option<*>> = mutableMapOf()
private val abbrevs: MutableMap<String, Option<*>> = mutableMapOf()
val trackedOptions: MutableList<BoundStringOption> = mutableListOf()
val clipboard = addOption(ListOption(ClipboardOptionsData.name, ClipboardOptionsData.abbr, arrayOf(ClipboardOptionsData.ideaput, "autoselect,exclude:cons\\|linux"), null))
val digraph = addOption(ToggleOption("digraph", "dg", false))
val gdefault = addOption(ToggleOption("gdefault", "gd", false))
@ -84,10 +87,10 @@ object OptionsManager {
val visualbell = addOption(ToggleOption("visualbell", "vb", false))
val wrapscan = addOption(ToggleOption("wrapscan", "ws", true))
val visualEnterDelay = addOption(NumberOption("visualdelay", "visualdelay", 100, 0, Int.MAX_VALUE))
val idearefactormode = addOption(BoundStringOption(IdeaRefactorMode.name, IdeaRefactorMode.name, IdeaRefactorMode.select, IdeaRefactorMode.availableValues))
val ideastatusicon = addOption(BoundStringOption(IdeaStatusIcon.name, IdeaStatusIcon.name, IdeaStatusIcon.enabled, IdeaStatusIcon.allValues))
val idearefactormode = addOption(BoundStringOption(IdeaRefactorMode.name, IdeaRefactorMode.name, IdeaRefactorMode.select, IdeaRefactorMode.availableValues, OptionsCollector.IDEA_REFACTOR_MODE))
val ideastatusicon = addOption(BoundStringOption(IdeaStatusIcon.name, IdeaStatusIcon.name, IdeaStatusIcon.enabled, IdeaStatusIcon.allValues, OptionsCollector.STATUS_BAR_ICON))
val ideastrictmode = addOption(ToggleOption("ideastrictmode", "ideastrictmode", false))
val ideawrite = addOption(BoundStringOption("ideawrite", "ideawrite", IdeaWriteData.all, IdeaWriteData.allValues))
val ideawrite = addOption(BoundStringOption("ideawrite", "ideawrite", IdeaWriteData.all, IdeaWriteData.allValues, OptionsCollector.IDEA_WRITE))
val ideavimsupport = addOption(BoundListOption("ideavimsupport", "ideavimsupport", arrayOf("dialog"), arrayOf("dialog", "singleline", "dialoglegacy")))
fun isSet(name: String): Boolean {
@ -357,6 +360,9 @@ object OptionsManager {
fun <T : Option<*>> addOption(option: T): T {
options += option.name to option
abbrevs += option.abbrev to option
if (option is BoundStringOption && option.statisticCollector != null) {
trackedOptions += option
}
return option
}

View File

@ -0,0 +1,61 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2020 The IdeaVim authors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.statistic
import com.intellij.internal.statistic.eventLog.EventLogGroup
import com.intellij.internal.statistic.eventLog.events.EventFields
import com.intellij.internal.statistic.service.fus.collectors.CounterUsagesCollector
import com.maddyhome.idea.vim.option.IdeaRefactorMode
import com.maddyhome.idea.vim.option.IdeaStatusIcon
import com.maddyhome.idea.vim.option.IdeaWriteData
class OptionsCollector : CounterUsagesCollector() {
override fun getGroup(): EventLogGroup = GROUP
companion object {
val GROUP = EventLogGroup("ideavim.options", 1)
val STATUS_BAR_ICON =
GROUP.registerEvent(
"status.bar.icon",
EventFields.String("value", IdeaStatusIcon.allValues.toList()),
EventFields.Enum("option_activation", OptionActivation::class.java)
)
val IDEA_REFACTOR_MODE =
GROUP.registerEvent(
"refactor.mode",
EventFields.String("value", IdeaRefactorMode.availableValues.toList()),
EventFields.Enum("option_activation", OptionActivation::class.java)
)
val IDEA_WRITE =
GROUP.registerEvent(
"write",
EventFields.String("value", IdeaWriteData.allValues.toList()),
EventFields.Enum("option_activation", OptionActivation::class.java)
)
var fileExecution = false;
}
}
enum class OptionActivation {
DEFAULT,
IDEAVIMRC,
EX_COMMAND,
}