diff options
Diffstat (limited to 'plugins/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/Replacer.java')
-rw-r--r-- | plugins/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/Replacer.java | 424 |
1 files changed, 0 insertions, 424 deletions
diff --git a/plugins/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/Replacer.java b/plugins/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/Replacer.java deleted file mode 100644 index 9980e95c77d7..000000000000 --- a/plugins/structuralsearch/source/com/intellij/structuralsearch/plugin/replace/impl/Replacer.java +++ /dev/null @@ -1,424 +0,0 @@ -package com.intellij.structuralsearch.plugin.replace.impl; - -import com.intellij.codeInsight.template.Template; -import com.intellij.codeInsight.template.TemplateManager; -import com.intellij.lang.Language; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.command.CommandProcessor; -import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.*; -import com.intellij.psi.codeStyle.CodeStyleManager; -import com.intellij.psi.search.LocalSearchScope; -import com.intellij.structuralsearch.*; -import com.intellij.structuralsearch.impl.matcher.MatcherImplUtil; -import com.intellij.structuralsearch.impl.matcher.PatternTreeContext; -import com.intellij.structuralsearch.impl.matcher.predicates.ScriptSupport; -import com.intellij.structuralsearch.plugin.replace.ReplaceOptions; -import com.intellij.structuralsearch.plugin.replace.ReplacementInfo; -import com.intellij.structuralsearch.plugin.util.CollectingMatchResultSink; -import com.intellij.util.IncorrectOperationException; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -/** - * @author Maxim.Mossienko - * Date: Mar 4, 2004 - * Time: 9:19:34 PM - */ -public class Replacer { - private final Project project; - private ReplacementBuilder replacementBuilder; - private ReplaceOptions options; - private ReplacementContext context; - private StructuralReplaceHandler replaceHandler; - - public Replacer(Project project, ReplaceOptions options) { - this.project = project; - this.options = options; - } - - public static String stripTypedVariableDecoration(final String type) { - return type.substring(1,type.length()-1); - } - - public static int insertSubstitution(StringBuilder result, int offset, final ParameterInfo info, String image) { - if (image.length() > 0) result.insert(offset+ info.getStartIndex(),image); - offset += image.length(); - return offset; - } - - public String testReplace(String in, String what, String by, ReplaceOptions options) throws IncorrectOperationException { - return testReplace(in, what, by, options,false); - } - - public String testReplace(String in, String what, String by, ReplaceOptions options, boolean filePattern) { - FileType type = options.getMatchOptions().getFileType(); - return testReplace(in, what, by, options, filePattern, false, type, null); - } - - public String testReplace(String in, String what, String by, ReplaceOptions options, boolean filePattern, boolean createPhysicalFile, - FileType sourceFileType, Language sourceDialect) { - this.options = options; - this.options.getMatchOptions().setSearchPattern(what); - this.options.setReplacement(by); - replacementBuilder=null; - context = null; - replaceHandler = null; - - this.options.getMatchOptions().clearVariableConstraints(); - MatcherImplUtil.transform(this.options.getMatchOptions()); - - checkSupportedReplacementPattern(project, options); - - Matcher matcher = new Matcher(project); - try { - PsiElement firstElement, lastElement, parent; - - if (options.getMatchOptions().getScope() == null) { - PsiElement[] elements = MatcherImplUtil.createTreeFromText( - in, - filePattern ? PatternTreeContext.File : PatternTreeContext.Block, - sourceFileType, sourceDialect, null, - project, - createPhysicalFile - ); - - firstElement = elements[0]; - lastElement = elements[elements.length-1]; - parent = firstElement.getParent(); - - this.options.getMatchOptions().setScope( - new LocalSearchScope(parent) - ); - } else { - parent = ((LocalSearchScope)options.getMatchOptions().getScope()).getScope()[0]; - firstElement = parent.getFirstChild(); - lastElement = parent.getLastChild(); - } - - this.options.getMatchOptions().setResultIsContextMatch(true); - CollectingMatchResultSink sink = new CollectingMatchResultSink(); - matcher.testFindMatches(sink, this.options.getMatchOptions()); - - final List<ReplacementInfo> resultPtrList = new ArrayList<ReplacementInfo>(); - - for (final MatchResult result : sink.getMatches()) { - resultPtrList.add(buildReplacement(result)); - } - - sink.getMatches().clear(); - - int startOffset = firstElement.getTextRange().getStartOffset(); - int endOffset = filePattern ?0: parent.getTextLength() - (lastElement.getTextRange().getEndOffset()); - - // get nodes from text may contain - PsiElement prevSibling = firstElement.getPrevSibling(); - if (prevSibling instanceof PsiWhiteSpace) { - startOffset -= prevSibling.getTextLength() - 1; - } - - PsiElement nextSibling = lastElement.getNextSibling(); - if (nextSibling instanceof PsiWhiteSpace) { - endOffset -= nextSibling.getTextLength() - 1; - } - - replaceAll(resultPtrList); - - String result = parent.getText(); - result = result.substring(startOffset); - result = result.substring(0,result.length() - endOffset); - - return result; - } - catch (Exception e) { - throw new IncorrectOperationException(e); - } - finally { - options.getMatchOptions().setScope(null); - } - } - - public void replaceAll(final List<ReplacementInfo> resultPtrList) { - PsiElement lastAffectedElement = null; - PsiElement currentAffectedElement; - - for (ReplacementInfo info : resultPtrList) { - PsiElement element = info.getMatch(0); - initContextAndHandler(element); - if (replaceHandler != null) { - replaceHandler.prepare(info); - } - } - - for (final ReplacementInfo aResultPtrList : resultPtrList) { - currentAffectedElement = doReplace(aResultPtrList); - - if (currentAffectedElement != lastAffectedElement) { - if (lastAffectedElement != null) reformatAndShortenRefs(lastAffectedElement); - lastAffectedElement = currentAffectedElement; - } - } - - reformatAndShortenRefs(lastAffectedElement); - } - - public void replace(ReplacementInfo info) { - PsiElement element = info.getMatch(0); - initContextAndHandler(element); - - if (replaceHandler != null) { - replaceHandler.prepare(info); - } - reformatAndShortenRefs(doReplace(info)); - } - - @Nullable - private PsiElement doReplace(final ReplacementInfo info) { - final ReplacementInfoImpl replacementInfo = (ReplacementInfoImpl)info; - final PsiElement element = replacementInfo.matchesPtrList.get(0).getElement(); - - if (element==null || !element.isWritable() || !element.isValid()) return null; - - final PsiElement elementParent = element.getParent(); - - //noinspection HardCodedStringLiteral - CommandProcessor.getInstance().executeCommand( - project, - new Runnable() { - public void run() { - ApplicationManager.getApplication().runWriteAction( - new Runnable() { - public void run() { - doReplace(element, replacementInfo); - } - } - ); - PsiDocumentManager.getInstance(project).commitAllDocuments(); - } - }, - "ssreplace", - "test" - ); - - if (!elementParent.isValid() || !elementParent.isWritable()) { - return null; - } - - return elementParent; - } - - private void reformatAndShortenRefs(final PsiElement elementParent) { - if (elementParent == null) return; - final Runnable action = new Runnable() { - public void run() { - CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(PsiManager.getInstance(project).getProject()); - final PsiFile containingFile = elementParent.getContainingFile(); - - if (containingFile != null && options.isToReformatAccordingToStyle()) { - if (containingFile.getVirtualFile() != null) { - PsiDocumentManager.getInstance(project) - .commitDocument(FileDocumentManager.getInstance().getDocument(containingFile.getVirtualFile())); - } - - final int parentOffset = elementParent.getTextRange().getStartOffset(); - - codeStyleManager.reformatRange(containingFile, parentOffset, parentOffset + elementParent.getTextLength(), true); - } - } - }; - - CommandProcessor.getInstance().executeCommand( - project, - new Runnable() { - public void run() { - ApplicationManager.getApplication().runWriteAction(action); - } - }, - "reformat and shorten refs after ssr", - "test" - ); - } - - private void doReplace(final PsiElement elementToReplace, - final ReplacementInfoImpl info) { - CodeStyleManager.getInstance(project).performActionWithFormatterDisabled(new Runnable() { - public void run() { - initContextAndHandler(elementToReplace); - - context.replacementInfo = info; - - if (replaceHandler != null) { - replaceHandler.replace(info, options); - } - } - } - ); - } - - private void initContextAndHandler(PsiElement psiContext) { - if (context == null) { - context = new ReplacementContext(options, project); - } - if (replaceHandler == null) { - StructuralSearchProfile profile = StructuralSearchUtil.getProfileByPsiElement(psiContext); - if (profile != null) { - replaceHandler = profile.getReplaceHandler(this.context); - } - } - } - - public static void handleComments(final PsiElement el, final PsiElement replacement, ReplacementContext context) throws IncorrectOperationException { - ReplacementInfoImpl replacementInfo = context.replacementInfo; - if (replacementInfo.elementToVariableNameMap == null) { - replacementInfo.elementToVariableNameMap = new HashMap<PsiElement, String>(1); - Map<String, MatchResult> variableMap = replacementInfo.variableMap; - if (variableMap != null) { - for(String name:variableMap.keySet()) { - fill(name,replacementInfo.variableMap.get(name),replacementInfo.elementToVariableNameMap); - } - } - } - - PsiElement lastChild = el.getLastChild(); - if (lastChild instanceof PsiComment && - replacementInfo.elementToVariableNameMap.get(lastChild) == null && - !(replacement.getLastChild() instanceof PsiComment) - ) { - PsiElement firstElementAfterStatementEnd = lastChild; - for(PsiElement curElement=firstElementAfterStatementEnd.getPrevSibling();curElement!=null;curElement = curElement.getPrevSibling()) { - if (!(curElement instanceof PsiWhiteSpace) && !(curElement instanceof PsiComment)) break; - firstElementAfterStatementEnd = curElement; - } - replacement.addRangeAfter(firstElementAfterStatementEnd,lastChild,replacement.getLastChild()); - } - - final PsiElement firstChild = el.getFirstChild(); - if (firstChild instanceof PsiComment && - !(firstChild instanceof PsiDocCommentBase) && - replacementInfo.elementToVariableNameMap.get(firstChild) == null - ) { - PsiElement lastElementBeforeStatementStart = firstChild; - - for(PsiElement curElement=lastElementBeforeStatementStart.getNextSibling();curElement!=null;curElement = curElement.getNextSibling()) { - if (!(curElement instanceof PsiWhiteSpace) && !(curElement instanceof PsiComment)) break; - lastElementBeforeStatementStart = curElement; - } - replacement.addRangeBefore(firstChild,lastElementBeforeStatementStart,replacement.getFirstChild()); - } - } - - private static void fill(final String name, final MatchResult matchResult, final Map<PsiElement, String> elementToVariableNameMap) { - boolean b = matchResult.isMultipleMatch() || matchResult.isScopeMatch(); - if(matchResult.hasSons() && b) { - for(MatchResult r:matchResult.getAllSons()) { - fill(name, r, elementToVariableNameMap); - } - } else if (!b && matchResult.getMatchRef() != null) { - elementToVariableNameMap.put(matchResult.getMatch(),name); - } - } - - public static void checkSupportedReplacementPattern(Project project, ReplaceOptions options) throws UnsupportedPatternException { - try { - String search = options.getMatchOptions().getSearchPattern(); - String replacement = options.getReplacement(); - FileType fileType = options.getMatchOptions().getFileType(); - Template template = TemplateManager.getInstance(project).createTemplate("","",search); - Template template2 = TemplateManager.getInstance(project).createTemplate("","",replacement); - - int segmentCount = template2.getSegmentsCount(); - for(int i=0;i<segmentCount;++i) { - final String replacementSegmentName = template2.getSegmentName(i); - final int segmentCount2 = template.getSegmentsCount(); - int j; - - for(j=0;j<segmentCount2;++j) { - final String searchSegmentName = template.getSegmentName(j); - - if (replacementSegmentName.equals(searchSegmentName)) break; - - // Reference to - if (replacementSegmentName.startsWith(searchSegmentName) && - replacementSegmentName.charAt(searchSegmentName.length())=='_' - ) { - try { - Integer.parseInt(replacementSegmentName.substring(searchSegmentName.length()+1)); - break; - } catch(NumberFormatException ex) {} - } - } - - if (j==segmentCount2) { - ReplacementVariableDefinition definition = options.getVariableDefinition(replacementSegmentName); - - if (definition == null || definition.getScriptCodeConstraint().length() <= 2 /*empty quotes*/) { - throw new UnsupportedPatternException( - SSRBundle.message("replacement.variable.is.not.defined.message", replacementSegmentName) - ); - } else { - String message = ScriptSupport.checkValidScript(StringUtil.stripQuotesAroundValue(definition.getScriptCodeConstraint())); - if (message != null) { - throw new UnsupportedPatternException( - SSRBundle.message("replacement.variable.is.not.valid", replacementSegmentName, message) - ); - } - } - } - } - - StructuralSearchProfile profile = StructuralSearchUtil.getProfileByFileType(fileType); - - profile.checkReplacementPattern(project, options); - - } catch(IncorrectOperationException ex) { - throw new UnsupportedPatternException(SSRBundle.message("incorrect.pattern.message")); - } - } - - public ReplacementInfo buildReplacement(MatchResult result) { - List<SmartPsiElementPointer> l = new ArrayList<SmartPsiElementPointer>(); - SmartPointerManager manager = SmartPointerManager.getInstance(project); - - if (MatchResult.MULTI_LINE_MATCH.equals(result.getName())) { - for(Iterator<MatchResult> i=result.getAllSons().iterator();i.hasNext();) { - final MatchResult r = i.next(); - - if (MatchResult.LINE_MATCH.equals(r.getName())) { - PsiElement element = r.getMatchRef().getElement(); - - if (element instanceof PsiDocCommentBase) { // doc comment is not collapsed when created in block - if (i.hasNext()) { - MatchResult matchResult = i.next(); - - if (MatchResult.LINE_MATCH.equals(matchResult.getName()) && - StructuralSearchUtil.isDocCommentOwner(matchResult.getMatch())) { - element = matchResult.getMatch(); - } else { - l.add( manager.createSmartPsiElementPointer(element) ); - element = matchResult.getMatch(); - } - } - } - l.add( manager.createSmartPsiElementPointer(element) ); - } - } - } else { - l.add( manager.createSmartPsiElementPointer(result.getMatchRef().getElement())); - } - - ReplacementInfoImpl replacementInfo = new ReplacementInfoImpl(); - - replacementInfo.matchesPtrList = l; - if (replacementBuilder==null) { - replacementBuilder = new ReplacementBuilder(project,options); - } - replacementInfo.result = replacementBuilder.process(result, replacementInfo, options.getMatchOptions().getFileType()); - replacementInfo.matchResult = result; - - return replacementInfo; - } -} |