Skip to content

Commit 4258e46

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Make DartCompletionRequestImpl immutable.
Change-Id: I4828bf7b1f3c23eab9c8ca079a88e976013c7109 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/217840 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 913ca2a commit 4258e46

File tree

2 files changed

+94
-129
lines changed

2 files changed

+94
-129
lines changed

pkg/analysis_server/lib/src/provisional/completion/dart/completion_dart.dart

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,6 @@ abstract class DartCompletionRequest extends CompletionRequest {
6464
/// is occurring.
6565
LibraryElement get libraryElement;
6666

67-
/// The source for the library containing the completion request.
68-
/// This may be different from the source in which the completion is requested
69-
/// if the completion is being requested in a part file.
70-
/// This may be `null` if the library for a part file cannot be determined.
71-
Source? get librarySource;
72-
7367
/// Answer the [DartType] for Object in dart:core
7468
DartType get objectType;
7569

pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart

Lines changed: 94 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,10 @@ class DartCompletionManager {
104104

105105
request.checkAborted();
106106

107-
var range = dartRequest.replacementRange;
107+
var replacementRange = dartRequest.replacementRange;
108108
(request as CompletionRequestImpl)
109-
..replacementOffset = range.offset
110-
..replacementLength = range.length;
109+
..replacementOffset = replacementRange.offset
110+
..replacementLength = replacementRange.length;
111111

112112
// Request Dart specific completions from each contributor
113113
var builder = SuggestionBuilder(dartRequest, listener: listener);
@@ -244,87 +244,61 @@ class DartCompletionManager {
244244

245245
/// The information about a requested list of completions within a Dart file.
246246
class DartCompletionRequestImpl implements DartCompletionRequest {
247-
final CompletionRequest request;
248-
249-
@override
250-
final ResolvedUnitResult result;
251-
252247
@override
253-
final ResourceProvider resourceProvider;
248+
final CompletionPreference completionPreference;
254249

255250
@override
256-
final InterfaceType objectType;
251+
final DartType? contextType;
257252

258253
@override
259-
final Source source;
254+
final DartdocDirectiveInfo dartdocDirectiveInfo;
260255

261-
@override
262-
final int offset;
256+
final DocumentationCache? documentationCache;
263257

264258
@override
265-
Expression? dotTarget;
259+
final Expression? dotTarget;
266260

267261
@override
268-
final Source librarySource;
262+
final FeatureComputer featureComputer;
269263

270264
@override
271-
late CompletionTarget target;
272-
273-
OpType? _opType;
265+
final int offset;
274266

275267
@override
276-
final FeatureComputer featureComputer;
268+
final OpType opType;
277269

278270
@override
279-
final DartdocDirectiveInfo dartdocDirectiveInfo;
280-
281-
/// A flag indicating whether the [_contextType] has been computed.
282-
bool _hasComputedContextType = false;
283-
284-
/// The context type associated with the target's `containingNode`.
285-
DartType? _contextType;
271+
final SourceRange replacementRange;
286272

287-
final CompletionRequest _originalRequest;
288-
289-
SourceRange? _replacementRange;
273+
final CompletionRequest request;
290274

291275
@override
292-
final CompletionPreference completionPreference;
293-
294-
final DocumentationCache? documentationCache;
276+
final ResolvedUnitResult result;
295277

296-
DartCompletionRequestImpl._(
297-
this.request,
298-
this.result,
299-
this.resourceProvider,
300-
this.objectType,
301-
this.librarySource,
302-
this.source,
303-
this.offset,
304-
CompilationUnit unit,
305-
this.dartdocDirectiveInfo,
306-
this._originalRequest,
307-
{CompletionPreference? completionPreference,
308-
this.documentationCache})
309-
: featureComputer =
310-
FeatureComputer(result.typeSystem, result.typeProvider),
311-
completionPreference =
312-
completionPreference ?? CompletionPreference.insert {
313-
_updateTargets(unit);
314-
}
278+
@override
279+
final Source source;
315280

316281
@override
317-
DartType? get contextType {
318-
if (!_hasComputedContextType) {
319-
_contextType = featureComputer.computeContextType(
320-
target.containingNode, target.offset);
321-
_hasComputedContextType = true;
322-
}
323-
return _contextType;
324-
}
282+
final CompletionTarget target;
283+
284+
DartCompletionRequestImpl._({
285+
required this.completionPreference,
286+
required this.contextType,
287+
required this.dartdocDirectiveInfo,
288+
required this.documentationCache,
289+
required this.dotTarget,
290+
required this.featureComputer,
291+
required this.offset,
292+
required this.opType,
293+
required this.replacementRange,
294+
required this.request,
295+
required this.result,
296+
required this.source,
297+
required this.target,
298+
});
325299

326300
@override
327-
FeatureSet get featureSet => result.libraryElement.featureSet;
301+
FeatureSet get featureSet => libraryElement.featureSet;
328302

329303
@override
330304
bool get includeIdentifiers {
@@ -341,28 +315,10 @@ class DartCompletionRequestImpl implements DartCompletionRequest {
341315
LibraryElement get libraryElement => result.libraryElement;
342316

343317
@override
344-
OpType get opType {
345-
var opType = _opType;
346-
if (opType == null) {
347-
opType = OpType.forCompletion(target, offset);
348-
var contextType = this.contextType;
349-
if (contextType is FunctionType) {
350-
contextType = contextType.returnType;
351-
}
352-
if (contextType != null && contextType.isVoid) {
353-
opType.includeVoidReturnSuggestions = true;
354-
}
355-
_opType = opType;
356-
}
357-
return opType;
358-
}
318+
DartType get objectType => libraryElement.typeProvider.objectType;
359319

360-
/// The source range that represents the region of text that should be
361-
/// replaced when a suggestion is selected.
362320
@override
363-
SourceRange get replacementRange {
364-
return _replacementRange ??= target.computeReplacementRange(offset);
365-
}
321+
ResourceProvider get resourceProvider => result.session.resourceProvider;
366322

367323
@override
368324
String? get sourceContents => result.content;
@@ -402,35 +358,7 @@ class DartCompletionRequestImpl implements DartCompletionRequest {
402358
/// Throw [AbortCompletion] if the completion request has been aborted.
403359
@override
404360
void checkAborted() {
405-
_originalRequest.checkAborted();
406-
}
407-
408-
/// Update the completion [target] and [dotTarget] based on the given [unit].
409-
void _updateTargets(CompilationUnit unit) {
410-
_opType = null;
411-
dotTarget = null;
412-
target = CompletionTarget.forOffset(unit, offset);
413-
var node = target.containingNode;
414-
if (node is MethodInvocation) {
415-
if (identical(node.methodName, target.entity)) {
416-
dotTarget = node.realTarget;
417-
} else if (node.isCascaded &&
418-
node.operator!.offset + 1 == target.offset) {
419-
dotTarget = node.realTarget;
420-
}
421-
}
422-
if (node is PropertyAccess) {
423-
if (identical(node.propertyName, target.entity)) {
424-
dotTarget = node.realTarget;
425-
} else if (node.isCascaded && node.operator.offset + 1 == target.offset) {
426-
dotTarget = node.realTarget;
427-
}
428-
}
429-
if (node is PrefixedIdentifier) {
430-
if (identical(node.identifier, target.entity)) {
431-
dotTarget = node.prefix;
432-
}
433-
}
361+
request.checkAborted();
434362
}
435363

436364
/// Return a newly created completion request based on the given [request].
@@ -439,28 +367,71 @@ class DartCompletionRequestImpl implements DartCompletionRequest {
439367
static Future<DartCompletionRequestImpl> from(
440368
CompletionRequest request, {
441369
DartdocDirectiveInfo? dartdocDirectiveInfo,
442-
CompletionPreference? completionPreference,
370+
CompletionPreference completionPreference = CompletionPreference.insert,
443371
DocumentationCache? documentationCache,
444372
}) async {
445373
request.checkAborted();
446374

447-
var unit = request.result.unit;
448-
var libSource = unit.declaredElement!.library.source;
449-
var objectType = request.result.typeProvider.objectType;
375+
var result = request.result;
376+
var offset = request.offset;
377+
378+
var target = CompletionTarget.forOffset(result.unit, offset);
379+
var dotTarget = _dotTarget(target);
380+
381+
var featureComputer = FeatureComputer(
382+
result.typeSystem,
383+
result.typeProvider,
384+
);
385+
386+
var contextType = featureComputer.computeContextType(
387+
target.containingNode,
388+
offset,
389+
);
390+
391+
var opType = OpType.forCompletion(target, offset);
392+
if (contextType != null && contextType.isVoid) {
393+
opType.includeVoidReturnSuggestions = true;
394+
}
450395

451396
return DartCompletionRequestImpl._(
452-
request,
453-
request.result,
454-
request.resourceProvider,
455-
objectType,
456-
libSource,
457-
request.source,
458-
request.offset,
459-
unit,
460-
dartdocDirectiveInfo ?? DartdocDirectiveInfo(),
461-
request,
462397
completionPreference: completionPreference,
398+
contextType: contextType,
399+
dartdocDirectiveInfo: dartdocDirectiveInfo ?? DartdocDirectiveInfo(),
463400
documentationCache: documentationCache,
401+
dotTarget: dotTarget,
402+
featureComputer: featureComputer,
403+
offset: offset,
404+
opType: opType,
405+
replacementRange: target.computeReplacementRange(offset),
406+
request: request,
407+
result: request.result,
408+
source: request.source,
409+
target: target,
464410
);
465411
}
412+
413+
/// TODO(scheglov) Should this be a property of [CompletionTarget]?
414+
static Expression? _dotTarget(CompletionTarget target) {
415+
var node = target.containingNode;
416+
var offset = target.offset;
417+
if (node is MethodInvocation) {
418+
if (identical(node.methodName, target.entity)) {
419+
return node.realTarget;
420+
} else if (node.isCascaded && node.operator!.offset + 1 == offset) {
421+
return node.realTarget;
422+
}
423+
}
424+
if (node is PropertyAccess) {
425+
if (identical(node.propertyName, target.entity)) {
426+
return node.realTarget;
427+
} else if (node.isCascaded && node.operator.offset + 1 == offset) {
428+
return node.realTarget;
429+
}
430+
}
431+
if (node is PrefixedIdentifier) {
432+
if (identical(node.identifier, target.entity)) {
433+
return node.prefix;
434+
}
435+
}
436+
}
466437
}

0 commit comments

Comments
 (0)