| /* |
| * Copyright 2006 Sascha Weinreuter |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.intellij.lang.regexp.validation; |
| |
| import com.intellij.codeInsight.intention.IntentionAction; |
| import com.intellij.lang.ASTNode; |
| import com.intellij.openapi.editor.Editor; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.util.text.StringUtil; |
| import com.intellij.psi.PsiElement; |
| import com.intellij.psi.PsiFile; |
| import com.intellij.psi.xml.XmlElement; |
| import com.intellij.util.IncorrectOperationException; |
| import com.intellij.xml.util.XmlStringUtil; |
| import org.intellij.lang.regexp.RegExpTT; |
| import org.intellij.lang.regexp.psi.RegExpChar; |
| import org.intellij.lang.regexp.psi.impl.RegExpElementImpl; |
| import org.jetbrains.annotations.NotNull; |
| |
| class RemoveRedundantEscapeAction implements IntentionAction { |
| private final RegExpChar myChar; |
| |
| public RemoveRedundantEscapeAction(RegExpChar ch) { |
| myChar = ch; |
| } |
| |
| @NotNull |
| public String getText() { |
| return "Remove Redundant Escape"; |
| } |
| |
| @NotNull |
| public String getFamilyName() { |
| return "Redundant Character Escape"; |
| } |
| |
| public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) { |
| return myChar.isValid() && myChar.getUnescapedText().startsWith("\\"); |
| } |
| |
| public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException { |
| final Character v = myChar.getValue(); |
| assert v != null; |
| |
| final ASTNode node = myChar.getNode().getFirstChildNode(); |
| final ASTNode parent = node.getTreeParent(); |
| parent.addLeaf(RegExpTT.CHARACTER, replacement(v), node); |
| parent.removeChild(node); |
| } |
| |
| private String replacement(Character v) { |
| final PsiElement context = myChar.getContainingFile().getContext(); |
| return RegExpElementImpl.isLiteralExpression(context) ? |
| StringUtil.escapeStringCharacters(v.toString()) : |
| (context instanceof XmlElement ? |
| XmlStringUtil.escapeString(v.toString()) : |
| v.toString()); |
| } |
| |
| public boolean startInWriteAction() { |
| return true; |
| } |
| } |