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:
parent
69d3c7b754
commit
b7cb3c0945
@ -64,6 +64,10 @@ runPluginVerifier {
|
||||
teamCityOutputFormat = true
|
||||
}
|
||||
|
||||
runIde {
|
||||
jvmArgs '-Dfus.internal.test.mode=true'
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
jcenter()
|
||||
|
@ -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/*)"/>
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
61
src/com/maddyhome/idea/vim/statistic/OptionsCollector.kt
Normal file
61
src/com/maddyhome/idea/vim/statistic/OptionsCollector.kt
Normal 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,
|
||||
}
|
Loading…
Reference in New Issue
Block a user