Skip to content

Commit

Permalink
Version 3.5.0-72.0.dev
Browse files Browse the repository at this point in the history
Merge ad8f4b0 into dev
  • Loading branch information
Dart CI committed Apr 18, 2024
2 parents 45dd87c + ad8f4b0 commit 415669e
Show file tree
Hide file tree
Showing 174 changed files with 6,573 additions and 1,600 deletions.
2 changes: 1 addition & 1 deletion DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ vars = {
"flute_rev": "a531c96a8b43d015c6bfbbfe3ab54867b0763b8b",
"glob_rev": "25ee2c20a3c7b93f4096036939a59e40916a3890",
"html_rev": "5b99b43f71da0c6b0f962244c7f5dfa8ca970fef",
"http_rev": "b7477b1e1bc5c8f850299b7abcc58d08ddea9e4a",
"http_rev": "34d7087ed2361dbe68faae6af8e7874fb805311d",
"http_multi_server_rev": "6ce0a137aa20cc12b883a386bb7c0ae677cb3429",
"http_parser_rev": "8ffcaec6fedfac5274cfa57e133d47d499bdabc0",
"intl_rev": "5d65e3808ce40e6282e40881492607df4e35669f",
Expand Down
15 changes: 15 additions & 0 deletions pkg/analysis_server/lib/src/lsp/handlers/handler_rename.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,22 @@ import 'package:analysis_server/src/lsp/registration/feature_registration.dart';
import 'package:analysis_server/src/services/refactoring/legacy/refactoring.dart';
import 'package:analysis_server/src/services/refactoring/legacy/rename_unit_member.dart';
import 'package:analysis_server/src/utilities/extensions/string.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/ast/utilities.dart';

AstNode? _tweakLocatedNode(AstNode? node, int offset) {
if (node is RepresentationDeclaration) {
var extensionTypeDeclaration = node.parent;
if (extensionTypeDeclaration is ExtensionTypeDeclaration) {
if (extensionTypeDeclaration.name.end == offset) {
node = extensionTypeDeclaration;
}
}
}
return node;
}

typedef StaticOptions = Either2<bool, RenameOptions>;

class PrepareRenameHandler extends LspMessageHandler<TextDocumentPositionParams,
Expand Down Expand Up @@ -44,6 +57,7 @@ class PrepareRenameHandler extends LspMessageHandler<TextDocumentPositionParams,

return (unit, offset).mapResults((unit, offset) async {
var node = NodeLocator(offset).searchWithin(unit.unit);
node = _tweakLocatedNode(node, offset);
var element = server.getElementOfNode(node);
if (node == null || element == null) {
return success(null);
Expand Down Expand Up @@ -132,6 +146,7 @@ class RenameHandler extends LspMessageHandler<RenameParams, WorkspaceEdit?>
return (path, docIdentifier, unit, offset)
.mapResults((path, docIdentifier, unit, offset) async {
var node = NodeLocator(offset).searchWithin(unit.unit);
node = _tweakLocatedNode(node, offset);
var element = server.getElementOfNode(node);
if (node == null || element == null) {
return success(null);
Expand Down
195 changes: 1 addition & 194 deletions pkg/analysis_server/lib/src/services/correction/util.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,10 @@ import 'dart:io';
import 'dart:math';

import 'package:_fe_analyzer_shared/src/scanner/token.dart';
import 'package:analysis_server/src/protocol_server.dart'
show doSourceChange_addElementEdit;
import 'package:analysis_server/src/utilities/extensions/ast.dart';
import 'package:analysis_server/src/utilities/strings.dart';
import 'package:analyzer/dart/analysis/features.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/analysis/session.dart';
import 'package:analyzer/dart/ast/precedence.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/dart/element/element.dart';
Expand All @@ -24,125 +21,10 @@ import 'package:analyzer/src/dart/ast/extensions.dart';
import 'package:analyzer/src/dart/ast/utilities.dart';
import 'package:analyzer/src/dart/scanner/reader.dart';
import 'package:analyzer/src/dart/scanner/scanner.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart'
show SourceChange, SourceEdit;
import 'package:analyzer_plugin/src/utilities/string_utilities.dart';
import 'package:analyzer_plugin/utilities/range_factory.dart';
import 'package:path/path.dart' as path;

/// Adds edits to the given [change] that ensure that all the [libraries] are
/// imported into the given [targetLibrary].
Future<void> addLibraryImports(AnalysisSession session, SourceChange change,
LibraryElement targetLibrary, Set<Source> libraries) async {
var libraryPath = targetLibrary.source.fullName;

var resolveResult = await session.getResolvedUnit(libraryPath);
if (resolveResult is! ResolvedUnitResult) {
return;
}

var libUtils = CorrectionUtils(resolveResult);
var eol = libUtils.endOfLine;
// Prepare information about existing imports.
LibraryDirective? libraryDirective;
var importDirectives = <_ImportDirectiveInfo>[];
var directives = <NamespaceDirective>[];
for (var directive in libUtils.unit.directives) {
if (directive is LibraryDirective) {
libraryDirective = directive;
} else if (directive is NamespaceDirective) {
directives.add(directive);
if (directive is ImportDirective) {
var uriStr = directive.uri.stringValue;
if (uriStr != null) {
importDirectives.add(
_ImportDirectiveInfo(uriStr, directive.offset, directive.end),
);
}
}
}
}

// Prepare all URIs to import.
var uriList = libraries
.map((library) => getLibrarySourceUri(
session.resourceProvider.pathContext, targetLibrary, library.uri))
.toList();
uriList.sort((a, b) => a.compareTo(b));

var analysisOptions =
session.analysisContext.getAnalysisOptionsForFile(resolveResult.file);
var quote =
analysisOptions.codeStyleOptions.preferredQuoteForUris(directives);

// Insert imports: between existing imports.
if (importDirectives.isNotEmpty) {
var isFirstPackage = true;
for (var importUri in uriList) {
var inserted = false;
var isPackage = importUri.startsWith('package:');
var isAfterDart = false;
for (var existingImport in importDirectives) {
if (existingImport.uri.startsWith('dart:')) {
isAfterDart = true;
}
if (existingImport.uri.startsWith('package:')) {
isFirstPackage = false;
}
if (importUri.compareTo(existingImport.uri) < 0) {
var importCode = 'import $quote$importUri$quote;$eol';
doSourceChange_addElementEdit(change, targetLibrary,
SourceEdit(existingImport.offset, 0, importCode));
inserted = true;
break;
}
}
if (!inserted) {
var importCode = '${eol}import $quote$importUri$quote;';
if (isPackage && isFirstPackage && isAfterDart) {
importCode = eol + importCode;
}
doSourceChange_addElementEdit(change, targetLibrary,
SourceEdit(importDirectives.last.end, 0, importCode));
}
if (isPackage) {
isFirstPackage = false;
}
}
return;
}

// Insert imports: after the library directive.
if (libraryDirective != null) {
var prefix = eol + eol;
for (var importUri in uriList) {
var importCode = '${prefix}import $quote$importUri$quote;';
prefix = eol;
doSourceChange_addElementEdit(change, targetLibrary,
SourceEdit(libraryDirective.end, 0, importCode));
}
return;
}

// If still at the beginning of the file, skip shebang and line comments.
{
var desc = libUtils._getInsertionLocationTop();
var offset = desc.offset;
for (var i = 0; i < uriList.length; i++) {
var importUri = uriList[i];
var importCode = 'import $quote$importUri$quote;$eol';
if (i == 0) {
importCode = desc.prefix + importCode;
}
if (i == uriList.length - 1) {
importCode = importCode + desc.suffix;
}
doSourceChange_addElementEdit(
change, targetLibrary, SourceEdit(offset, 0, importCode));
}
}
}

/// Climbs up [PrefixedIdentifier] and [PropertyAccess] nodes that include
/// [node].
Expression climbPropertyAccess(Expression node) {
Expand Down Expand Up @@ -880,61 +762,7 @@ final class CorrectionUtils {
selection, range.node(node));
}

/// Returns a description of the place in which to insert a new directive or a
/// top-level declaration at the top of the file.
_InsertionLocation _getInsertionLocationTop() {
// skip leading line comments
var offset = 0;
var insertEmptyLineBefore = false;
var insertEmptyLineAfter = false;
var source = _buffer;
// skip hash-bang
if (offset < source.length - 2) {
var linePrefix = getText(offset, 2);
if (linePrefix == '#!') {
insertEmptyLineBefore = true;
offset = getLineNext(offset);
// skip empty lines to first line comment
var emptyOffset = offset;
while (emptyOffset < source.length - 2) {
var nextLineOffset = getLineNext(emptyOffset);
var line = source.substring(emptyOffset, nextLineOffset);
if (line.trim().isEmpty) {
emptyOffset = nextLineOffset;
continue;
} else if (line.startsWith('//')) {
offset = emptyOffset;
break;
} else {
break;
}
}
}
}
// skip line comments
while (offset < source.length - 2) {
var linePrefix = getText(offset, 2);
if (linePrefix == '//') {
insertEmptyLineBefore = true;
offset = getLineNext(offset);
} else {
break;
}
}
// determine if empty line is required after
var nextLineOffset = getLineNext(offset);
var insertLine = source.substring(offset, nextLineOffset);
if (insertLine.trim().isNotEmpty) {
insertEmptyLineAfter = true;
}
return _InsertionLocation(
prefix: insertEmptyLineBefore ? endOfLine : '',
offset: offset,
suffix: insertEmptyLineAfter ? endOfLine : '',
);
}

/// @return the [InvertedCondition] for the given logical expression.
/// Returns the [_InvertedCondition] for the given logical expression.
_InvertedCondition _invertCondition0(Expression expression) {
if (expression is BooleanLiteral) {
if (expression.value) {
Expand Down Expand Up @@ -1128,27 +956,6 @@ class _ElementReferenceCollector extends RecursiveAstVisitor<void> {
}
}

class _ImportDirectiveInfo {
final String uri;
final int offset;
final int end;

_ImportDirectiveInfo(this.uri, this.offset, this.end);
}

/// Describes where to insert new text.
class _InsertionLocation {
final String prefix;
final int offset;
final String suffix;

_InsertionLocation({
required this.prefix,
required this.offset,
required this.suffix,
});
}

/// A container with a source and its precedence.
class _InvertedCondition {
final int _precedence;
Expand Down
Loading

0 comments on commit 415669e

Please sign in to comment.