| Index: pkg/analysis_services/lib/src/refactoring/rename.dart
|
| diff --git a/pkg/analysis_services/lib/src/refactoring/rename.dart b/pkg/analysis_services/lib/src/refactoring/rename.dart
|
| deleted file mode 100644
|
| index 8fba920fc0e13a0379cbb1b09788c29ca4cc7f78..0000000000000000000000000000000000000000
|
| --- a/pkg/analysis_services/lib/src/refactoring/rename.dart
|
| +++ /dev/null
|
| @@ -1,250 +0,0 @@
|
| -// 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.src.refactoring.rename;
|
| -
|
| -import 'dart:async';
|
| -import 'dart:collection';
|
| -
|
| -import 'package:analysis_services/correction/change.dart';
|
| -import 'package:analysis_services/correction/status.dart';
|
| -import 'package:analysis_services/refactoring/refactoring.dart';
|
| -import 'package:analysis_services/search/search_engine.dart';
|
| -import 'package:analysis_services/src/correction/source_range.dart';
|
| -import 'package:analysis_services/src/refactoring/refactoring.dart';
|
| -import 'package:analyzer/src/generated/element.dart';
|
| -import 'package:analyzer/src/generated/engine.dart';
|
| -import 'package:analyzer/src/generated/source.dart';
|
| -
|
| -
|
| -/**
|
| - * Returns the [Edit] to replace the given [SearchMatch] reference.
|
| - */
|
| -Edit createReferenceEdit(SourceReference reference, String newText) {
|
| - return new Edit.range(reference.range, newText);
|
| -}
|
| -
|
| -
|
| -/**
|
| - * Returns the file containing declaration of the given [Element].
|
| - */
|
| -String getElementFile(Element element) {
|
| - return element.source.fullName;
|
| -}
|
| -
|
| -
|
| -/**
|
| - * When a [Source] (a file) is used in more than one context, [SearchEngine]
|
| - * will return separate [SearchMatch]s for each context. But in rename
|
| - * refactorings we want to update each [Source] only once.
|
| - */
|
| -List<SourceReference> getSourceReferences(List<SearchMatch> matches) {
|
| - var uniqueReferences = new HashMap<SourceReference, SourceReference>();
|
| - for (SearchMatch match in matches) {
|
| - Element element = match.element;
|
| - String file = getElementFile(element);
|
| - SourceRange range = match.sourceRange;
|
| - SourceReference newReference =
|
| - new SourceReference(file, range, element, match.isResolved, match.isQualified);
|
| - SourceReference oldReference = uniqueReferences[newReference];
|
| - if (oldReference == null) {
|
| - uniqueReferences[newReference] = newReference;
|
| - oldReference = newReference;
|
| - }
|
| - }
|
| - return uniqueReferences.keys.toList();
|
| -}
|
| -
|
| -
|
| -/**
|
| - * Returns `true` if two given [Element]s are [LocalElement]s and have
|
| - * intersecting with visibility ranges.
|
| - */
|
| -bool haveIntersectingRanges(LocalElement localElement, Element element) {
|
| - if (element is! LocalElement) {
|
| - return false;
|
| - }
|
| - LocalElement localElement2 = element as LocalElement;
|
| - Source localSource = localElement.source;
|
| - Source localSource2 = localElement2.source;
|
| - SourceRange localRange = localElement.visibleRange;
|
| - SourceRange localRange2 = localElement2.visibleRange;
|
| - return localSource2 == localSource &&
|
| - localRange != null &&
|
| - localRange2 != null &&
|
| - localRange2.intersects(localRange);
|
| -}
|
| -
|
| -
|
| -/**
|
| - * Checks if [element] is defined in the library containing [source].
|
| - */
|
| -bool isDefinedInLibrary(Element element, AnalysisContext context, Source source)
|
| - {
|
| - // should be the same AnalysisContext
|
| - if (!isInContext(element, context)) {
|
| - return false;
|
| - }
|
| - // private elements are visible only in their library
|
| - List<Source> librarySourcesOfSource = context.getLibrariesContaining(source);
|
| - Source librarySourceOfElement = element.library.source;
|
| - return librarySourcesOfSource.contains(librarySourceOfElement);
|
| -}
|
| -
|
| -
|
| -/**
|
| - * Checks if the given [Element] is in the given [AnalysisContext].
|
| - */
|
| -bool isInContext(Element element, AnalysisContext context) {
|
| - AnalysisContext elementContext = element.context;
|
| - if (elementContext == context) {
|
| - return true;
|
| - }
|
| - if (context is InstrumentedAnalysisContextImpl) {
|
| - return elementContext == context.basis;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -
|
| -/**
|
| - * Checks if the given unqualified [SearchMatch] intersects with visibility
|
| - * range of [localElement].
|
| - */
|
| -bool isReferenceInLocalRange(LocalElement localElement, SearchMatch reference) {
|
| - if (reference.isQualified) {
|
| - return false;
|
| - }
|
| - Source localSource = localElement.source;
|
| - Source referenceSource = reference.element.source;
|
| - SourceRange localRange = localElement.visibleRange;
|
| - SourceRange referenceRange = reference.sourceRange;
|
| - return referenceSource == localSource &&
|
| - referenceRange.intersects(localRange);
|
| -}
|
| -
|
| -
|
| -/**
|
| - * Checks if [element] is visible in the library containing [source].
|
| - */
|
| -bool isVisibleInLibrary(Element element, AnalysisContext context, Source source)
|
| - {
|
| - // should be the same AnalysisContext
|
| - if (!isInContext(element, context)) {
|
| - return false;
|
| - }
|
| - // public elements are always visible
|
| - if (element.isPublic) {
|
| - return true;
|
| - }
|
| - // private elements are visible only in their library
|
| - return isDefinedInLibrary(element, context, source);
|
| -}
|
| -
|
| -
|
| -
|
| -/**
|
| - * An abstract implementation of [RenameRefactoring].
|
| - */
|
| -abstract class RenameRefactoringImpl extends RefactoringImpl implements
|
| - RenameRefactoring {
|
| - final SearchEngine searchEngine;
|
| - final Element element;
|
| - final AnalysisContext context;
|
| - final String oldName;
|
| -
|
| - String newName;
|
| -
|
| - RenameRefactoringImpl(SearchEngine searchEngine, Element element)
|
| - : searchEngine = searchEngine,
|
| - element = element,
|
| - context = element.context,
|
| - oldName = _getDisplayName(element);
|
| -
|
| - /**
|
| - * Adds the "Update declaration" [Edit] to [change].
|
| - */
|
| - void addDeclarationEdit(Change change, Element element) {
|
| - if (element != null) {
|
| - String file = getElementFile(element);
|
| - Edit edit = new Edit.range(rangeElementName(element), newName);
|
| - change.addEdit(file, edit);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Adds an "Update reference" [Edit] to [change].
|
| - */
|
| - void addReferenceEdit(Change change, SourceReference reference) {
|
| - Edit edit = createReferenceEdit(reference, newName);
|
| - change.addEdit(reference.file, edit);
|
| - }
|
| -
|
| - @override
|
| - Future<RefactoringStatus> checkInitialConditions() {
|
| - var result = new RefactoringStatus();
|
| - return new Future.value(result);
|
| - }
|
| -
|
| - @override
|
| - RefactoringStatus checkNewName() {
|
| - RefactoringStatus result = new RefactoringStatus();
|
| - if (newName == oldName) {
|
| - result.addFatalError(
|
| - "The new name must be different than the current name.");
|
| - }
|
| - return result;
|
| - }
|
| -
|
| - @override
|
| - bool requiresPreview() {
|
| - return false;
|
| - }
|
| -
|
| - static String _getDisplayName(Element element) {
|
| - if (element is ImportElement) {
|
| - PrefixElement prefix = element.prefix;
|
| - if (prefix != null) {
|
| - return prefix.displayName;
|
| - }
|
| - }
|
| - return element.displayName;
|
| - }
|
| -}
|
| -
|
| -
|
| -/**
|
| - * The [SourceRange] in some [Source].
|
| - */
|
| -class SourceReference {
|
| - final String file;
|
| - final SourceRange range;
|
| - final Element element;
|
| - final bool isResolved;
|
| - final bool isQualified;
|
| -
|
| - SourceReference(this.file, this.range, this.element, this.isResolved,
|
| - this.isQualified);
|
| -
|
| - @override
|
| - int get hashCode {
|
| - int hash = file.hashCode;
|
| - hash = ((hash << 16) & 0xFFFFFFFF) + range.hashCode;
|
| - return hash;
|
| - }
|
| -
|
| - @override
|
| - bool operator ==(Object other) {
|
| - if (identical(other, this)) {
|
| - return true;
|
| - }
|
| - if (other is SourceReference) {
|
| - return other.file == file && other.range == range;
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - @override
|
| - String toString() => '${file}@${range}';
|
| -}
|
|
|