blob: 71bf65b3e6c20802bc4a8c2f030560cc3bc60c1c [file] [log] [blame]
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library services.refactoring;
import 'dart:async';
import 'package:analysis_services/correction/change.dart';
import 'package:analysis_services/correction/status.dart';
import 'package:analysis_services/search/search_engine.dart';
import 'package:analysis_services/src/refactoring/rename_import.dart';
import 'package:analysis_services/src/refactoring/rename_library.dart';
import 'package:analysis_services/src/refactoring/rename_local.dart';
import 'package:analyzer/src/generated/element.dart';
/**
* Abstract interface for all refactorings.
*/
abstract class Refactoring {
/**
* Returns the human readable name of this [Refactoring].
*/
String get refactoringName;
/**
* Checks all conditions - [checkInitialConditions] and
* [checkFinalConditions] to decide if refactoring can be performed.
*/
Future<RefactoringStatus> checkAllConditions();
/**
* Validates environment to check if this refactoring can be performed.
*
* This check may be slow, because many refactorings use search engine.
*/
Future<RefactoringStatus> checkFinalConditions();
/**
* Validates arguments to check if this refactoring can be performed.
*
* This check should be quick because it is used often as arguments change.
*/
Future<RefactoringStatus> checkInitialConditions();
/**
* Returns the [Change] to apply to perform this refactoring.
*/
Future<Change> createChange();
/**
* Returs `true` if the [Change] created by refactoring may be unsafe,
* so we want user to review the [Change] to ensure that he understands it.
*/
bool requiresPreview();
}
/**
* Abstract [Refactoring] for renaming some [Element].
*/
abstract class RenameRefactoring implements Refactoring {
/**
* Returns a new [RenameRefactoring] instance for renaming [element],
* maybe `null` if there is no support for renaming [Element]s of the given
* type.
*/
factory RenameRefactoring(SearchEngine searchEngine, Element element) {
if (element is ImportElement) {
return new RenameImportRefactoringImpl(searchEngine, element);
}
if (element is LibraryElement) {
return new RenameLibraryRefactoringImpl(searchEngine, element);
}
if (element is LocalElement) {
return new RenameLocalRefactoringImpl(searchEngine, element);
}
return null;
}
/**
* Sets the new name for the [Element].
*/
void set newName(String newName);
/**
* Returns the old name of the [Element] being renamed.
*/
String get oldName;
/**
* Validates that the [newName] is a valid identifier and is appropriate for
* the type of the [Element] being renamed.
*
* It does not perform all the checks (such as checking for conflicts with any
* existing names in any of the scopes containing the current name), as many
* of these checkes require search engine. Use [checkFinalConditions] for this
* level of checking.
*/
RefactoringStatus checkNewName();
}