private SourcePattern getSourcePattern(final SourceRange partRange) { String originalSource = utils.getText(partRange.getOffset(), partRange.getLength()); final SourcePattern pattern = new SourcePattern(); final List<ReplaceEdit> replaceEdits = Lists.newArrayList(); unitNode.accept( new ASTVisitor<Void>() { @Override public Void visitIdentifier(DartIdentifier node) { SourceRange nodeRange = SourceRangeFactory.create(node); if (SourceRangeUtils.covers(partRange, nodeRange)) { VariableElement variableElement = ASTNodes.getVariableOrParameterElement(node); if (variableElement != null) { String originalName = variableElement.getName(); String patternName = pattern.originalToPatternNames.get(originalName); if (patternName == null) { patternName = "__dartEditorVariable" + pattern.originalToPatternNames.size(); pattern.originalToPatternNames.put(originalName, patternName); } replaceEdits.add( new ReplaceEdit( nodeRange.getOffset() - partRange.getOffset(), nodeRange.getLength(), patternName)); } } return null; } }); pattern.patternSource = ExtractUtils.applyReplaceEdits(originalSource, replaceEdits); return pattern; }
/** @return the selected {@link DartExpression} source, with applying new parameter names. */ private String getMethodBodySource() { String source = utils.getText(selectionStart, selectionLength); // prepare ReplaceEdit operators to replace variables with parameters List<ReplaceEdit> replaceEdits = Lists.newArrayList(); for (Entry<String, List<SourceRange>> entry : selectionParametersToRanges.entrySet()) { String name = entry.getKey(); for (ParameterInfo parameter : parameters) { if (StringUtils.equals(name, parameter.getOldName())) { for (SourceRange range : entry.getValue()) { replaceEdits.add( new ReplaceEdit( range.getOffset() - selectionStart, range.getLength(), parameter.getNewName())); } } } } // apply replacements source = ExtractUtils.applyReplaceEdits(source, replaceEdits); // change indentation if (selectionStatements != null) { String eol = utils.getEndOfLine(); String selectionIndent = utils.getNodePrefix(selectionStatements.get(0)); String targetIndent = utils.getNodePrefix(parentMember) + " "; String[] lines = StringUtils.splitPreserveAllTokens(source, eol); StringBuilder sb = new StringBuilder(); for (int i = 0; i < lines.length; i++) { String line = lines[i]; line = targetIndent + StringUtils.removeStart(line, selectionIndent); sb.append(line); sb.append(eol); } source = sb.toString(); source = StringUtils.stripEnd(source, null); source += eol; } // done return source; }