OLD | NEW |
| (Empty) |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 library analysis_server.src.services.completion.completion_dart; | |
6 | |
7 import 'dart:async'; | |
8 | |
9 import 'package:analysis_server/src/provisional/completion/completion_core.dart' | |
10 show CompletionRequest; | |
11 import 'package:analysis_server/src/provisional/completion/completion_dart.dart'
; | |
12 import 'package:analysis_server/src/provisional/completion/dart/completion_targe
t.dart'; | |
13 import 'package:analysis_server/src/services/completion/completion_core.dart'; | |
14 import 'package:analyzer/file_system/file_system.dart'; | |
15 import 'package:analyzer/src/context/context.dart' | |
16 show AnalysisFutureHelper, AnalysisContextImpl; | |
17 import 'package:analyzer/src/generated/ast.dart'; | |
18 import 'package:analyzer/src/generated/engine.dart' hide AnalysisContextImpl; | |
19 import 'package:analyzer/src/generated/source.dart'; | |
20 import 'package:analyzer/src/task/dart.dart'; | |
21 import 'package:analyzer/task/dart.dart'; | |
22 | |
23 /** | |
24 * The information about a requested list of completions within a Dart file. | |
25 */ | |
26 class DartCompletionRequestImpl extends CompletionRequestImpl | |
27 implements DartCompletionRequest { | |
28 /** | |
29 * The cached completion target or `null` if not computed yet. | |
30 */ | |
31 CompletionTarget _target; | |
32 | |
33 /** | |
34 * `true` if [resolveDeclarationsInScope] has partially resolved the unit | |
35 * referenced by [target], else `false`. | |
36 */ | |
37 bool _haveResolveDeclarationsInScope = false; | |
38 | |
39 /** | |
40 * Initialize a newly created completion request based on the given request. | |
41 */ | |
42 factory DartCompletionRequestImpl.forRequest(CompletionRequest request) { | |
43 return new DartCompletionRequestImpl._(request.context, | |
44 request.resourceProvider, request.source, request.offset); | |
45 } | |
46 | |
47 DartCompletionRequestImpl._(AnalysisContext context, | |
48 ResourceProvider resourceProvider, Source source, int offset) | |
49 : super(context, resourceProvider, source, offset); | |
50 | |
51 @override | |
52 Future<CompilationUnit> resolveDeclarationsInScope() async { | |
53 CompilationUnit unit = target.unit; | |
54 if (_haveResolveDeclarationsInScope) { | |
55 return unit; | |
56 } | |
57 | |
58 // Determine the library source | |
59 Source librarySource; | |
60 if (unit.directives.any((d) => d is PartOfDirective)) { | |
61 List<Source> libraries = context.getLibrariesContaining(source); | |
62 if (libraries.isEmpty) { | |
63 return null; | |
64 } | |
65 librarySource = libraries[0]; | |
66 } else { | |
67 librarySource = source; | |
68 } | |
69 | |
70 // Resolve declarations in the target unit | |
71 CompilationUnit resolvedUnit = | |
72 await new AnalysisFutureHelper<CompilationUnit>( | |
73 context, | |
74 new LibrarySpecificUnit(librarySource, source), | |
75 RESOLVED_UNIT3).computeAsync(); | |
76 | |
77 // TODO(danrubel) determine if the underlying source has been modified | |
78 // in a way that invalidates the completion request | |
79 // and return null | |
80 | |
81 // Gracefully degrade if unit cannot be resolved | |
82 if (resolvedUnit == null) { | |
83 return null; | |
84 } | |
85 | |
86 // Recompute the target for the newly resolved unit | |
87 _target = new CompletionTarget.forOffset(resolvedUnit, offset); | |
88 _haveResolveDeclarationsInScope = true; | |
89 return resolvedUnit; | |
90 } | |
91 | |
92 @override | |
93 CompletionTarget get target { | |
94 if (_target == null) { | |
95 CompilationUnit unit = context.computeResult(source, PARSED_UNIT); | |
96 _target = new CompletionTarget.forOffset(unit, offset); | |
97 } | |
98 return _target; | |
99 } | |
100 } | |
OLD | NEW |