@@ -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.
246246class 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