package com.jetbrains.lang.dart.ide.completion; import com.intellij.CommonBundle; import com.intellij.codeInsight.editorActions.smartEnter.SmartEnterProcessor; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.jetbrains.lang.dart.analyzer.DartAnalysisServerService; import com.jetbrains.lang.dart.assists.AssistUtils; import com.jetbrains.lang.dart.assists.DartSourceEditException; import org.dartlang.analysis.server.protocol.Position; import org.dartlang.analysis.server.protocol.SourceChange; import org.dartlang.analysis.server.protocol.SourceEdit; import org.dartlang.analysis.server.protocol.SourceFileEdit; import org.jetbrains.annotations.NotNull; public class DartServerStatementCompletionProcessor extends SmartEnterProcessor { @Override public boolean process(@NotNull Project project, @NotNull Editor editor, @NotNull PsiFile psiFile) { final int offset = editor.getCaretModel().getOffset(); final DartAnalysisServerService service = DartAnalysisServerService.getInstance(psiFile.getProject()); service.updateFilesContent(); SourceChange sourceChange = service.edit_getStatementCompletion(psiFile.getVirtualFile(), offset); if (sourceChange != null && !isNoop(sourceChange)) { try { AssistUtils.applySourceChange(project, sourceChange, true); Position position = sourceChange.getSelection(); if (position != null) { // The position should never be null but it might be if unit tests are flaky. editor.getCaretModel().moveToOffset(service.getConvertedOffset(psiFile.getVirtualFile(), position.getOffset())); } } catch (DartSourceEditException e) { CommonRefactoringUtil.showErrorHint(project, editor, e.getMessage(), CommonBundle.getErrorTitle(), null); } return true; } return false; } private static boolean isNoop(@NotNull final SourceChange sourceChange) { for (SourceFileEdit fileEdit : sourceChange.getEdits()) { for (SourceEdit edit : fileEdit.getEdits()) { if (edit.getLength() != 0 || !edit.getReplacement().isEmpty()) { return false; } } } return true; } }