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

Use injector to create execution context

This commit is contained in:
Alex Plate 2023-03-08 13:06:36 +02:00
parent b7d5ee9a75
commit 2cb6fb041e
No known key found for this signature in database
GPG Key ID: 0B97153C8FFEC09F
16 changed files with 57 additions and 36 deletions

View File

@ -16,7 +16,6 @@ import com.intellij.openapi.editor.actionSystem.TypedActionHandlerEx
import com.intellij.openapi.progress.ProcessCanceledException
import com.maddyhome.idea.vim.api.globalOptions
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.helper.EditorDataContext
import com.maddyhome.idea.vim.helper.inInsertMode
import com.maddyhome.idea.vim.helper.isIdeaVimDisabledHere
import com.maddyhome.idea.vim.key.KeyHandlerKeeper
@ -76,7 +75,7 @@ class VimTypedActionHandler(origHandler: TypedActionHandler) : TypedActionHandle
val modifiers = if (charTyped == ' ' && VimKeyListener.isSpaceShift) KeyEvent.SHIFT_DOWN_MASK else 0
val keyStroke = KeyStroke.getKeyStroke(charTyped, modifiers)
val startTime = if (traceTime) System.currentTimeMillis() else null
handler.handleKey(editor.vim, keyStroke, EditorDataContext.init(editor, context).vim)
handler.handleKey(editor.vim, keyStroke, injector.executionContextManager.onEditor(editor.vim, context.vim))
if (startTime != null) {
val duration = System.currentTimeMillis() - startTime
LOG.info("VimTypedAction '$charTyped': $duration ms")

View File

@ -28,7 +28,6 @@ import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.globalOptions
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.api.options
import com.maddyhome.idea.vim.helper.EditorDataContext
import com.maddyhome.idea.vim.helper.EditorHelper
import com.maddyhome.idea.vim.helper.HandlerInjector
import com.maddyhome.idea.vim.helper.inInsertMode
@ -69,7 +68,11 @@ class VimShortcutKeyAction : AnAction(), DumbAware/*, LightEditCompatible*/ {
// Should we use HelperKt.getTopLevelEditor(editor) here, as we did in former EditorKeyHandler?
try {
val start = if (traceTime) System.currentTimeMillis() else null
KeyHandler.getInstance().handleKey(editor.vim, keyStroke, EditorDataContext.init(editor, e.dataContext).vim)
KeyHandler.getInstance().handleKey(
editor.vim,
keyStroke,
injector.executionContextManager.onEditor(editor.vim, e.dataContext.vim)
)
if (start != null) {
val duration = System.currentTimeMillis() - start
LOG.info("VimShortcut update '$keyStroke': $duration ms")

View File

@ -15,12 +15,12 @@ import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.action.change.Extension
import com.maddyhome.idea.vim.api.ImmutableVimCaret
import com.maddyhome.idea.vim.api.VimCaret
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.MappingMode
import com.maddyhome.idea.vim.command.SelectionType
import com.maddyhome.idea.vim.common.CommandAlias
import com.maddyhome.idea.vim.common.CommandAliasHandler
import com.maddyhome.idea.vim.helper.CommandLineHelper
import com.maddyhome.idea.vim.helper.EditorDataContext
import com.maddyhome.idea.vim.helper.TestInputModel
import com.maddyhome.idea.vim.helper.vimStateMachine
import com.maddyhome.idea.vim.key.MappingOwner
@ -130,8 +130,8 @@ object VimExtensionFacade {
*/
@JvmStatic
fun executeNormalWithoutMapping(keys: List<KeyStroke>, editor: Editor) {
val context = EditorDataContext.init(editor)
keys.forEach { KeyHandler.getInstance().handleKey(editor.vim, it, context.vim, false, false) }
val context = injector.executionContextManager.onEditor(editor.vim)
keys.forEach { KeyHandler.getInstance().handleKey(editor.vim, it, context, false, false) }
}
/** Returns a single key stroke from the user input similar to 'getchar()'. */

View File

@ -28,7 +28,6 @@ import com.maddyhome.idea.vim.extension.VimExtensionFacade.executeNormalWithoutM
import com.maddyhome.idea.vim.extension.VimExtensionFacade.putKeyMappingIfMissing
import com.maddyhome.idea.vim.extension.VimExtensionFacade.setOperatorFunction
import com.maddyhome.idea.vim.group.visual.VimSelection
import com.maddyhome.idea.vim.helper.EditorDataContext
import com.maddyhome.idea.vim.helper.editorMode
import com.maddyhome.idea.vim.helper.exitVisualMode
import com.maddyhome.idea.vim.helper.mode
@ -169,7 +168,7 @@ class ReplaceWithRegister : VimExtension {
ClipboardOptionHelper.IdeaputDisabler().use {
VimPlugin.getPut().putText(
IjVimEditor(editor),
IjEditorExecutionContext(EditorDataContext.init(editor)),
injector.executionContextManager.onEditor(editor.vim),
putData,
operatorArguments = OperatorArguments(
editor.vimStateMachine?.isOperatorPending ?: false,

View File

@ -13,17 +13,20 @@ import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.editor.*;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorGutter;
import com.intellij.openapi.editor.EditorSettings;
import com.intellij.openapi.editor.LineNumberConverter;
import com.intellij.openapi.editor.event.CaretEvent;
import com.intellij.openapi.editor.event.CaretListener;
import com.intellij.openapi.editor.ex.EditorGutterComponentEx;
import com.intellij.openapi.project.Project;
import com.maddyhome.idea.vim.KeyHandler;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.api.ExecutionContext;
import com.maddyhome.idea.vim.api.VimEditor;
import com.maddyhome.idea.vim.api.VimEditorGroup;
import com.maddyhome.idea.vim.helper.*;
import com.maddyhome.idea.vim.newapi.IjEditorExecutionContext;
import com.maddyhome.idea.vim.newapi.IjVimEditor;
import com.maddyhome.idea.vim.options.LocalOptionChangeListener;
import com.maddyhome.idea.vim.options.OptionConstants;
@ -214,7 +217,8 @@ public class EditorGroup implements PersistentStateComponent<Element>, VimEditor
if (!EditorHelper.isFileEditor(editor) &&
editor.getDocument().isWritable() &&
!CommandStateHelper.inInsertMode(editor)) {
VimPlugin.getChange().insertBeforeCursor(new IjVimEditor(editor), new IjEditorExecutionContext(EditorDataContext.init(editor, null)));
ExecutionContext.Editor context = injector.getExecutionContextManager().onEditor(new IjVimEditor(editor), null);
VimPlugin.getChange().insertBeforeCursor(new IjVimEditor(editor), context);
KeyHandler.getInstance().reset(new IjVimEditor(editor));
}
updateCaretsVisualAttributes(editor);

View File

@ -803,7 +803,7 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo
if (expression != null) {
try {
match = expression
.evaluate(editor, new IjEditorExecutionContext(EditorDataContext.init(((IjVimEditor) editor).getEditor(), null)), parent)
.evaluate(editor, injector.getExecutionContextManager().onEditor(editor, null), parent)
.toInsertableString();
} catch (Exception e) {
exceptions.add((ExException) e);
@ -979,7 +979,8 @@ public class SearchGroup extends VimSearchGroupBase implements PersistentStateCo
else {
// XXX: The Ex entry panel is used only for UI here, its logic might be inappropriate for this method
final ExEntryPanel exEntryPanel = ExEntryPanel.getInstanceWithoutShortcuts();
exEntryPanel.activate(editor, EditorDataContext.init(editor, null), MessageHelper.message("replace.with.0", match), "", 1);
ExecutionContext.Editor context = injector.getExecutionContextManager().onEditor(new IjVimEditor(editor), null);
exEntryPanel.activate(editor, ((IjEditorExecutionContext)context).getContext(), MessageHelper.message("replace.with.0", match), "", 1);
new IjVimCaret(caret).moveToOffset(startoff);
ModalEntry.INSTANCE.activate(new IjVimEditor(editor), keyStrokeProcessor);
exEntryPanel.deactivate(true, false);

View File

@ -116,7 +116,7 @@ object IdeaSelectionControl {
.enterSelectMode(editor.vim, VimPlugin.getVisualMotion().autodetectVisualSubmode(editor.vim))
VimStateMachine.Mode.INSERT -> VimPlugin.getChange().insertBeforeCursor(
editor.vim,
EditorDataContext.init(editor).vim
injector.executionContextManager.onEditor(editor.vim)
)
VimStateMachine.Mode.COMMAND -> Unit
else -> error("Unexpected mode: $mode")

View File

@ -12,6 +12,7 @@ import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.components.Service
import com.maddyhome.idea.vim.action.change.Extension
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.newapi.ij
import com.maddyhome.idea.vim.newapi.vim
import com.maddyhome.idea.vim.ui.ModalEntry
@ -52,7 +53,7 @@ class CommandLineHelper : VimCommandLineHelper {
var text: String? = null
// XXX: The Ex entry panel is used only for UI here, its logic might be inappropriate for input()
val exEntryPanel = ExEntryPanel.getInstanceWithoutShortcuts()
exEntryPanel.activate(editor, EditorDataContext.init(editor), prompt.ifEmpty { " " }, "", 1)
exEntryPanel.activate(editor, injector.executionContextManager.onEditor(editor.vim).ij, prompt.ifEmpty { " " }, "", 1)
ModalEntry.activate(editor.vim) { key: KeyStroke ->
return@activate when {
key.isCloseKeyStroke() -> {

View File

@ -34,7 +34,6 @@ import com.maddyhome.idea.vim.api.globalOptions
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.command.VimStateMachine
import com.maddyhome.idea.vim.group.NotificationService
import com.maddyhome.idea.vim.helper.EditorDataContext
import com.maddyhome.idea.vim.helper.inNormalMode
import com.maddyhome.idea.vim.helper.isIdeaVimDisabledHere
import com.maddyhome.idea.vim.helper.vimStateMachine
@ -163,7 +162,10 @@ object IdeaSpecifics {
// Enable insert mode if there is no selection in template
// Template with selection is handled by [com.maddyhome.idea.vim.group.visual.VisualMotionGroup.controlNonVimSelectionChange]
if (editor.inNormalMode) {
VimPlugin.getChange().insertBeforeCursor(editor.vim, EditorDataContext.init(editor).vim)
VimPlugin.getChange().insertBeforeCursor(
editor.vim,
injector.executionContextManager.onEditor(editor.vim)
)
KeyHandler.getInstance().reset(editor.vim)
}
}

View File

@ -11,11 +11,11 @@ package com.maddyhome.idea.vim.newapi
import com.intellij.openapi.actionSystem.DataContext
import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.helper.EditorDataContext
import com.maddyhome.idea.vim.api.injector
open class IjEditorExecutionContext(override val context: DataContext) : ExecutionContext.Editor {
override fun updateEditor(editor: VimEditor): ExecutionContext {
return IjEditorExecutionContext(EditorDataContext.init((editor as IjVimEditor).editor, context))
return IjEditorExecutionContext(injector.executionContextManager.onEditor(editor, context.vim).ij)
}
}

View File

@ -14,6 +14,7 @@ import com.maddyhome.idea.vim.api.ExecutionContext
import com.maddyhome.idea.vim.api.ExecutionContextManagerBase
import com.maddyhome.idea.vim.api.VimCaret
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.helper.EditorDataContext
import com.maddyhome.idea.vim.options.helpers.StrictMode
@ -21,8 +22,6 @@ import com.maddyhome.idea.vim.options.helpers.StrictMode
class IjExecutionContextManager : ExecutionContextManagerBase() {
override fun onEditor(editor: VimEditor, prevContext: ExecutionContext?): ExecutionContext.Editor {
if (prevContext is ExecutionContext.CaretAndEditor) {
StrictMode.fail("You should not create context on editor from the context on caret and editor")
prevContext.updateEditor(editor)
return prevContext
}
return IjEditorExecutionContext(EditorDataContext.init((editor as IjVimEditor).editor, prevContext?.ij))

View File

@ -17,8 +17,11 @@ import com.intellij.ui.components.JBScrollPane;
import com.intellij.util.IJSwingUtilities;
import com.maddyhome.idea.vim.KeyHandler;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.helper.*;
import com.maddyhome.idea.vim.newapi.IjEditorExecutionContext;
import com.maddyhome.idea.vim.api.ExecutionContext;
import com.maddyhome.idea.vim.helper.HelperKt;
import com.maddyhome.idea.vim.helper.MessageHelper;
import com.maddyhome.idea.vim.helper.UiHelper;
import com.maddyhome.idea.vim.helper.UserDataManager;
import com.maddyhome.idea.vim.newapi.IjVimEditor;
import com.maddyhome.idea.vim.options.OptionConstants;
import org.jetbrains.annotations.Nls;
@ -296,8 +299,8 @@ public class ExOutputPanel extends JPanel {
final List<KeyStroke> keys = new ArrayList<>(1);
keys.add(key);
KeyHandler.getInstance().getKeyStack().addKeys(keys);
VimPlugin.getMacro().playbackKeys(new IjVimEditor(myEditor), new IjEditorExecutionContext(EditorDataContext.init(myEditor, null)),
1);
ExecutionContext.Editor context = injector.getExecutionContextManager().onEditor(new IjVimEditor(myEditor), null);
VimPlugin.getMacro().playbackKeys(new IjVimEditor(myEditor), context, 1);
}
});
}

View File

@ -10,7 +10,7 @@ package com.maddyhome.idea.vim.ui.ex
import com.intellij.openapi.diagnostic.debug
import com.intellij.openapi.diagnostic.logger
import com.maddyhome.idea.vim.KeyHandler
import com.maddyhome.idea.vim.helper.EditorDataContext
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.newapi.vim
import org.jetbrains.annotations.NonNls
import java.awt.event.ActionEvent
@ -125,7 +125,11 @@ object ExEditorKit : DefaultEditorKit() {
if (target.useHandleKeyFromEx) {
val entry = ExEntryPanel.getInstance().entry
val editor = entry.editor
KeyHandler.getInstance().handleKey(editor.vim, key, EditorDataContext.init(editor, entry.context).vim)
KeyHandler.getInstance().handleKey(
editor.vim,
key,
injector.executionContextManager.onEditor(editor.vim, entry.context.vim)
)
} else {
val event = ActionEvent(e.source, e.id, c.toString(), e.getWhen(), e.modifiers)
super.actionPerformed(event)

View File

@ -13,7 +13,7 @@ import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.KeyboardShortcut
import com.intellij.openapi.project.DumbAwareAction
import com.maddyhome.idea.vim.KeyHandler
import com.maddyhome.idea.vim.helper.EditorDataContext
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.newapi.vim
import java.awt.event.KeyEvent
import javax.swing.KeyStroke
@ -36,7 +36,11 @@ class ExShortcutKeyAction(private val exEntryPanel: ExEntryPanel) : DumbAwareAct
val keyStroke = getKeyStroke(e)
if (keyStroke != null) {
val editor = exEntryPanel.entry.editor
KeyHandler.getInstance().handleKey(editor.vim, keyStroke, EditorDataContext.init(editor, e.dataContext).vim)
KeyHandler.getInstance().handleKey(
editor.vim,
keyStroke,
injector.executionContextManager.onEditor(editor.vim, e.dataContext.vim)
)
}
}

View File

@ -46,7 +46,6 @@ import com.maddyhome.idea.vim.command.VimStateMachine.SubMode
import com.maddyhome.idea.vim.ex.ExException
import com.maddyhome.idea.vim.ex.ExOutputModel.Companion.getInstance
import com.maddyhome.idea.vim.group.visual.VimVisualTimer.swingTimer
import com.maddyhome.idea.vim.helper.EditorDataContext
import com.maddyhome.idea.vim.helper.EditorHelper
import com.maddyhome.idea.vim.helper.GuicursorChangeListener
import com.maddyhome.idea.vim.helper.RunnableHelper.runWriteCommand
@ -59,6 +58,7 @@ import com.maddyhome.idea.vim.key.MappingOwner
import com.maddyhome.idea.vim.key.ToKeysMappingInfo
import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor
import com.maddyhome.idea.vim.newapi.IjVimEditor
import com.maddyhome.idea.vim.newapi.ij
import com.maddyhome.idea.vim.newapi.vim
import com.maddyhome.idea.vim.options.OptionConstants
import com.maddyhome.idea.vim.options.OptionScope
@ -645,7 +645,7 @@ abstract class VimTestCase : UsefulTestCase() {
val e = AnActionEvent(
event,
EditorDataContext.init(editor),
injector.executionContextManager.onEditor(editor.vim).ij,
ActionPlaces.KEYBOARD_SHORTCUT,
VimShortcutKeyAction.instance.templatePresentation.clone(),
ActionManager.getInstance(),
@ -666,7 +666,7 @@ abstract class VimTestCase : UsefulTestCase() {
fun typeText(keys: List<KeyStroke?>, editor: Editor, project: Project?) {
val keyHandler = KeyHandler.getInstance()
val dataContext = EditorDataContext.init(editor)
val dataContext = injector.executionContextManager.onEditor(editor.vim)
TestInputModel.getInstance(editor).setKeyStrokes(keys.filterNotNull())
runWriteCommand(
project,
@ -674,7 +674,7 @@ abstract class VimTestCase : UsefulTestCase() {
val inputModel = TestInputModel.getInstance(editor)
var key = inputModel.nextKeyStroke()
while (key != null) {
keyHandler.handleKey(editor.vim, key, dataContext.vim)
keyHandler.handleKey(editor.vim, key, dataContext)
key = inputModel.nextKeyStroke()
}
},

View File

@ -14,7 +14,6 @@ import com.intellij.openapi.editor.VisualPosition
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.api.injector
import com.maddyhome.idea.vim.helper.EditorDataContext
import com.maddyhome.idea.vim.helper.VimBehaviorDiffers
import com.maddyhome.idea.vim.newapi.vim
import junit.framework.TestCase
@ -286,7 +285,10 @@ class CaretVisualAttributesHelperTest : VimTestCase() {
|all rocks and lavender and tufted grass,
""".trimMargin()
)
injector.actionExecutor.executeAction("EditorCloneCaretBelow", EditorDataContext.init(myFixture.editor).vim)
injector.actionExecutor.executeAction(
"EditorCloneCaretBelow",
injector.executionContextManager.onEditor(myFixture.editor.vim)
)
TestCase.assertEquals(2, myFixture.editor.caretModel.caretCount)
assertCaretVisualAttributes(CaretVisualAttributes.Shape.BLOCK, 0f)
}