blob: f1c9f940023124d03f4b5460daf448b49ffe6807 [file] [log] [blame]
// Copyright (c) 2015, 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 analysis_server.edit.refactoring.refactoring_core;
import 'dart:async';
import 'package:analysis_server/src/protocol.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/source.dart';
/**
* Abstract interface for all refactorings.
*/
abstract class Refactoring {
/**
* Return the ids of source edits that are not known to be valid.
*
* An edit is not known to be valid if there was insufficient type information
* for the server to be able to determine whether or not the code needs to be
* modified, such as when a member is being renamed and there is a reference
* to a member from an unknown type. This field will be omitted if the change
* field is omitted or if there are no potential edits for the refactoring.
*/
List<String> get potentialEditIds;
/**
* Return 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();
/**
* Return the [Change] to apply to perform this refactoring.
*/
Future<SourceChange> createChange();
/**
* Return `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();
}
/**
*
*
* Clients are expected to subtype this class when implementing plugins.
*/
abstract class RefactoringContributor {
/**
*
*/
Refactoring createRefactoring(AnalysisContext context, RefactoringKind kind,
Source source, int offset, int length);
/**
*
*/
List<RefactoringKind> getAvailableRefactorings(
AnalysisContext context, Source source, int offset, int length);
}
/**
*
*
* Clients are not expected to subtype this class.
*/
abstract class RefactoringKind {
factory RefactoringKind(String name, bool requiresOptions) {
} // TODO(brianwilkerson) Redirect to impl class.
bool get requiresOptions;
}
/**
*
*
* Clients are not expected to subtype this class.
*/
abstract class RefactoringStatus {
// TODO(brianwilkerson) Fill this in.
}