/** Checks if the parameter names are valid. */ public RefactoringStatus checkParameterNames() { RefactoringStatus result = new RefactoringStatus(); for (ParameterInfo parameter : parameters) { result.merge(Checks.checkParameter(parameter.getNewName())); for (ParameterInfo other : parameters) { if (parameter != other && StringUtils.equals(other.getNewName(), parameter.getNewName())) { result.addError( Messages.format( RefactoringCoreMessages.ExtractMethodRefactoring_error_sameParameter, other.getNewName())); return result; } } if (parameter.isRenamed() && usedNames.contains(parameter.getNewName())) { result.addError( Messages.format( RefactoringCoreMessages.ExtractMethodRefactoring_error_nameInUse, parameter.getNewName())); return result; } } return result; }
@Override public void createControl(Composite parent) { fRefactoring = (ExtractMethodRefactoring) getRefactoring(); loadSettings(); Composite result = new Composite(parent, SWT.NONE); setControl(result); GridLayout layout = new GridLayout(); layout.numColumns = 2; result.setLayout(layout); RowLayouter layouter = new RowLayouter(2); GridData gd = null; initializeDialogUnits(result); Label label = new Label(result, SWT.NONE); label.setText(getLabelText()); fTextField = createTextInputField(result, SWT.BORDER); fTextField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); layouter.perform(label, fTextField, 1); if (!fRefactoring.getParameters().isEmpty()) { ChangeParametersControl cp = new ChangeParametersControl( result, SWT.NONE, RefactoringMessages.ExtractMethodInputPage_parameters, new IParameterListChangeListener.Empty() { @Override public void parameterChanged(ParameterInfo parameter) { parameterModified(); } @Override public void parameterListChanged() { parameterModified(); } }, ChangeParametersControl.Mode.EXTRACT_METHOD); gd = new GridData(GridData.FILL_BOTH); gd.horizontalSpan = 2; cp.setLayoutData(gd); cp.setInput(fRefactoring.getParameters()); } // checkBox = new Button(result, SWT.CHECK); // checkBox.setText(RefactoringMessages.ExtractMethodInputPage_generateJavadocComment); // boolean generate = computeGenerateJavadoc(); // setGenerateJavadoc(generate); // checkBox.setSelection(generate); // checkBox.addSelectionListener(new SelectionAdapter() { // @Override // public void widgetSelected(SelectionEvent e) { // setGenerateJavadoc(((Button) e.widget).getSelection()); // } // }); // layouter.perform(checkBox); int duplicates = fRefactoring.getNumberOfDuplicates(); Button checkBox = new Button(result, SWT.CHECK); if (duplicates == 0) { checkBox.setText(RefactoringMessages.ExtractMethodInputPage_duplicates_none); } else if (duplicates == 1) { checkBox.setText(RefactoringMessages.ExtractMethodInputPage_duplicates_single); } else { checkBox.setText( Messages.format( RefactoringMessages.ExtractMethodInputPage_duplicates_multi, new Integer(duplicates))); } checkBox.setSelection(fRefactoring.getReplaceAllOccurrences()); checkBox.setEnabled(duplicates > 0); checkBox.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { fRefactoring.setReplaceAllOccurrences(((Button) e.widget).getSelection()); } }); layouter.perform(checkBox); label = new Label(result, SWT.SEPARATOR | SWT.HORIZONTAL); label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); layouter.perform(label); createSignaturePreview(result, layouter); Dialog.applyDialogFont(result); PlatformUI.getWorkbench() .getHelpSystem() .setHelp(getControl(), DartHelpContextIds.EXTRACT_METHOD_WIZARD_PAGE); }
/** * Fills {@link #parameters} with information about used variables, which should be turned into * parameters. */ private RefactoringStatus initializeParameters() { RefactoringStatus result = new RefactoringStatus(); final List<VariableElement> assignedUsedVariables = Lists.newArrayList(); unitNode.accept( new ASTVisitor<Void>() { @Override public Void visitIdentifier(DartIdentifier node) { SourceRange nodeRange = SourceRangeFactory.create(node); if (SourceRangeUtils.covers(selectionRange, nodeRange)) { // analyze local variable VariableElement variableElement = ASTNodes.getVariableOrParameterElement(node); if (variableElement != null) { // if declared outside, add parameter if (!isDeclaredInSelection(variableElement)) { String variableName = variableElement.getName(); // add parameter if (!selectionParametersToRanges.containsKey(variableName)) { parameters.add(new ParameterInfo(variableElement)); } // add reference to parameter { List<SourceRange> ranges = selectionParametersToRanges.get(variableName); if (ranges == null) { ranges = Lists.newArrayList(); selectionParametersToRanges.put(variableName, ranges); } ranges.add(nodeRange); } } // remember, if assigned and used after seleciton if (isLeftHandOfAssignment(node) && isUsedAfterSelection(variableElement)) { if (!assignedUsedVariables.contains(variableElement)) { assignedUsedVariables.add(variableElement); } } } // remember declaration names if (ASTNodes.isNameOfDeclaration(node)) { usedNames.add(node.getName()); } } return null; } }); // may be single variable to return if (assignedUsedVariables.size() == 1) { returnVariable = assignedUsedVariables.get(0); } // fatal, if multiple variables assigned and used after selection if (assignedUsedVariables.size() > 1) { StringBuilder sb = new StringBuilder(); for (VariableElement variable : assignedUsedVariables) { sb.append(variable.getName()); sb.append("\n"); } result.addFatalError( Messages.format( RefactoringCoreMessages.ExtractMethodAnalyzer_assignments_to_local, sb.toString().trim())); } // done return result; }
@Override public Change createChange(IProgressMonitor pm) throws CoreException { pm.beginTask("", 1 + occurrences.size()); // $NON-NLS-1$ try { // configure Change { change = new CompilationUnitChange(unit.getElementName(), unit); change.setEdit(new MultiTextEdit()); change.setKeepPreviewEdits(true); } // replace occurrences with method invocation for (Occurrence occurence : occurrences) { pm.worked(1); SourceRange range = occurence.range; // may be replacement of duplicates disabled if (!replaceAllOccurrences && !occurence.isSelection) { continue; } // prepare invocation source String invocationSource; { StringBuilder sb = new StringBuilder(); // may be returns value if (returnVariable != null) { String varTypeName = ExtractUtils.getTypeSource(returnVariable.getType()); String originalName = returnVariable.getName(); String occurrenceName = occurence.parameterOldToOccurrenceName.get(originalName); if (varTypeName.equals("dynamic")) { sb.append("var "); } else { sb.append(varTypeName); sb.append(" "); } sb.append(occurrenceName); sb.append(" = "); } // invocation itself sb.append(methodName); sb.append("("); boolean firstParameter = true; for (ParameterInfo parameter : parameters) { // may be comma if (firstParameter) { firstParameter = false; } else { sb.append(", "); } // argument name { String parameterOldName = parameter.getOldName(); String argumentName = occurence.parameterOldToOccurrenceName.get(parameterOldName); sb.append(argumentName); } } sb.append(")"); invocationSource = sb.toString(); // statements as extracted with their ";", so add new one after invocation if (selectionStatements != null) { invocationSource += ";"; } } // add replace edit TextEdit edit = new ReplaceEdit(range.getOffset(), range.getLength(), invocationSource); change.addEdit(edit); String msg = Messages.format( occurence.isSelection ? RefactoringCoreMessages.ExtractMethodRefactoring_substitute_with_call : RefactoringCoreMessages.ExtractMethodRefactoring_duplicates_single, methodName); change.addTextEditGroup(new TextEditGroup(msg, edit)); } // add method declaration { // prepare environment String prefix = utils.getNodePrefix(parentMember); String eol = utils.getEndOfLine(); // prepare annotations String annotations = ""; { // may be "static" if (staticContext) { annotations = "static "; } } // prepare declaration source String declarationSource = null; { String returnExpressionSource = getMethodBodySource(); // expression if (selectionExpression != null) { // add return type String returnTypeName = ExtractUtils.getTypeSource(selectionExpression); if (returnTypeName != null && !returnTypeName.equals("dynamic")) { annotations += returnTypeName + " "; } // just return expression declarationSource = annotations + getSignature() + " => " + returnExpressionSource + ";"; } // statements if (selectionStatements != null) { if (returnVariable != null) { String returnTypeName = ExtractUtils.getTypeSource(returnVariable.getType()); if (returnTypeName != null && !returnTypeName.equals("dynamic")) { annotations += returnTypeName + " "; } } else { annotations += "void "; } declarationSource = annotations + getSignature() + " {" + eol; declarationSource += returnExpressionSource; if (returnVariable != null) { declarationSource += prefix + " return " + returnVariable.getName() + ";" + eol; } declarationSource += prefix + "}"; } } // insert declaration if (declarationSource != null) { int offset = parentMember.getSourceInfo().getEnd(); TextEdit edit = new ReplaceEdit(offset, 0, eol + eol + prefix + declarationSource); change.addEdit(edit); change.addTextEditGroup( new TextEditGroup( Messages.format( selectionExpression != null ? RefactoringCoreMessages.ExtractMethodRefactoring_add_method_expression : RefactoringCoreMessages.ExtractMethodRefactoring_add_method, methodName), edit)); } } pm.worked(1); // done return change; } finally { pm.done(); } }