|
26 | 26 | import org.eclipse.dltk.compiler.env.IModuleSource;
|
27 | 27 | import org.eclipse.dltk.compiler.problem.IValidationStatus;
|
28 | 28 | import org.eclipse.dltk.compiler.problem.ValidationStatus;
|
| 29 | +import org.eclipse.dltk.core.CompletionContext; |
29 | 30 | import org.eclipse.dltk.core.CompletionProposal;
|
30 | 31 | import org.eclipse.dltk.core.DLTKCore;
|
31 | 32 | import org.eclipse.dltk.core.IAccessRule;
|
@@ -151,6 +152,58 @@ public void completeTypes(ISourceModule module, TypeMode mode,
|
151 | 152 | Collections.<IValidatorExtension> emptyList()));
|
152 | 153 | }
|
153 | 154 |
|
| 155 | + public void completeGlobals(ISourceModule module, final String prefix, |
| 156 | + final int offset, boolean jsdoc) { |
| 157 | + final CompletionContext completionContext = new CompletionContext(); |
| 158 | + completionContext.setOffset(offset); |
| 159 | + completionContext.setDoc(jsdoc); |
| 160 | + requestor.acceptContext(completionContext); |
| 161 | + setSourceRange(offset - prefix.length(), offset); |
| 162 | + final TypeInferencer2 inferencer2 = new TypeInferencer2(); |
| 163 | + inferencer2.setModelElement(module); |
| 164 | + final CompletionVisitor visitor = new CompletionVisitor(inferencer2, |
| 165 | + Integer.MAX_VALUE); |
| 166 | + inferencer2.setVisitor(visitor); |
| 167 | + final Script script = JavaScriptParserUtil.parse(module, null); |
| 168 | + try { |
| 169 | + inferencer2.doInferencing(script); |
| 170 | + } catch (PositionReachedException e) { |
| 171 | + // e.printStackTrace(); |
| 172 | + } |
| 173 | + ITypeSystem.CURRENT.runWith(inferencer2, new Runnable() { |
| 174 | + public void run() { |
| 175 | + final Reporter reporter = new Reporter(inferencer2, prefix, |
| 176 | + offset, visitor.createValidatorExtensions()); |
| 177 | + doGlobalCompletion(visitor.getCollection(), reporter); |
| 178 | + } |
| 179 | + }); |
| 180 | + } |
| 181 | + |
| 182 | + /** |
| 183 | + * Generate completion proposals for the matching members from the specified |
| 184 | + * {@link Iterable}. |
| 185 | + */ |
| 186 | + public void completeMembers(ISourceModule module, String prefix, |
| 187 | + int offset, boolean jsdoc, Iterable<Member> memers) { |
| 188 | + final CompletionContext completionContext = new CompletionContext(); |
| 189 | + completionContext.setOffset(offset); |
| 190 | + completionContext.setDoc(jsdoc); |
| 191 | + requestor.acceptContext(completionContext); |
| 192 | + setSourceRange(offset - prefix.length(), offset); |
| 193 | + final TypeInferencer2 inferencer2 = new TypeInferencer2(); |
| 194 | + inferencer2.setModelElement(module); |
| 195 | + final CompletionVisitor visitor = new CompletionVisitor(inferencer2, |
| 196 | + offset); |
| 197 | + final Reporter reporter = new Reporter(inferencer2, prefix, offset, |
| 198 | + visitor.createValidatorExtensions()); |
| 199 | + for (Member member : memers) { |
| 200 | + final String name = member.getName(); |
| 201 | + if (reporter.matches(name)) { |
| 202 | + reporter.report(name, member); |
| 203 | + } |
| 204 | + } |
| 205 | + } |
| 206 | + |
154 | 207 | private void doCompletionOnType(TypeMode mode, Reporter reporter) {
|
155 | 208 | final ITypeInferenceContext context = reporter.context;
|
156 | 209 | Set<String> typeNames = context.listTypes(mode, reporter.getPrefix());
|
@@ -342,9 +395,7 @@ public void reportValueTypeMembers(IValueReference valueRef) {
|
342 | 395 | reportMember(member, member.getName(), true);
|
343 | 396 | }
|
344 | 397 | for (Member member : typeQuery.ignoreDuplicates(processed)) {
|
345 |
| - if (member.isVisible() |
346 |
| - && CharOperation.prefixEquals(prefix, member.getName(), |
347 |
| - false)) { |
| 398 | + if (member.isVisible() && matches(member.getName())) { |
348 | 399 | reportMember(member, member.getName(),
|
349 | 400 | typeQuery.contains(member.getDeclaringType()));
|
350 | 401 | }
|
@@ -461,7 +512,7 @@ private void reportMember(Member member, String memberName,
|
461 | 512 | relevance += computeRelevanceForRestrictions(IAccessRule.K_ACCESSIBLE);
|
462 | 513 | proposal.setRelevance(relevance);
|
463 | 514 |
|
464 |
| - proposal.setCompletion(memberName); |
| 515 | + proposal.setCompletion(isFunction ? memberName + "()" : memberName); |
465 | 516 | proposal.setName(memberName);
|
466 | 517 | proposal.setExtraInfo(member);
|
467 | 518 | proposal.setReplaceRange(startPosition - offset, endPosition
|
@@ -521,7 +572,9 @@ private void reportReference(IValueReference reference) {
|
521 | 572 | relevance += computeRelevanceForRestrictions(IAccessRule.K_ACCESSIBLE);
|
522 | 573 | proposal.setRelevance(relevance);
|
523 | 574 |
|
524 |
| - proposal.setCompletion(reference.getName()); |
| 575 | + proposal.setCompletion(proposalKind == CompletionProposal.METHOD_REF ? reference |
| 576 | + .getName() + "()" |
| 577 | + : reference.getName()); |
525 | 578 | proposal.setName(reference.getName());
|
526 | 579 | proposal.setExtraInfo(reference);
|
527 | 580 | proposal.setReplaceRange(startPosition - offset, endPosition
|
@@ -592,8 +645,13 @@ private void doGlobalCompletion(IValueCollection collection,
|
592 | 645 | Reporter reporter) {
|
593 | 646 | reportItems(reporter, collection);
|
594 | 647 | if (allowGlobals) {
|
595 |
| - doCompletionOnType(TypeMode.CODE, reporter); |
596 |
| - doCompletionOnKeyword(reporter.getPrefix(), reporter.getPosition()); |
| 648 | + if (!requestor.isIgnored(CompletionProposal.TYPE_REF)) { |
| 649 | + doCompletionOnType(TypeMode.CODE, reporter); |
| 650 | + } |
| 651 | + if (!requestor.isIgnored(CompletionProposal.KEYWORD)) { |
| 652 | + doCompletionOnKeyword(reporter.getPrefix(), |
| 653 | + reporter.getPosition()); |
| 654 | + } |
597 | 655 | reportGlobals(reporter);
|
598 | 656 | }
|
599 | 657 | }
|
|
0 commit comments