PageRenderTime 26ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/eclipse_SDK-3.7.1/plugins/org.eclipse.jdt.ui.source_3.7.1.r371_v20110824-0800/org/eclipse/jdt/internal/ui/refactoring/contentassist/CUPositionCompletionProcessor.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Java | 266 lines | 168 code | 40 blank | 58 comment | 17 complexity | d5012d201138eb0494da2be49a89bc5a MD5 | raw file
  1. /*******************************************************************************
  2. * Copyright (c) 2000, 2011 IBM Corporation and others.
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the Eclipse Public License v1.0
  5. * which accompanies this distribution, and is available at
  6. * http://www.eclipse.org/legal/epl-v10.html
  7. *
  8. * Contributors:
  9. * IBM Corporation - initial API and implementation
  10. *******************************************************************************/
  11. package org.eclipse.jdt.internal.ui.refactoring.contentassist;
  12. import java.util.ArrayList;
  13. import java.util.Arrays;
  14. import java.util.List;
  15. import org.eclipse.swt.graphics.Image;
  16. import org.eclipse.core.runtime.Assert;
  17. import org.eclipse.core.runtime.NullProgressMonitor;
  18. import org.eclipse.jface.contentassist.IContentAssistSubjectControl;
  19. import org.eclipse.jface.contentassist.ISubjectControlContentAssistProcessor;
  20. import org.eclipse.jface.preference.IPreferenceStore;
  21. import org.eclipse.jface.resource.ImageDescriptor;
  22. import org.eclipse.jface.viewers.StyledString;
  23. import org.eclipse.jface.text.ITextViewer;
  24. import org.eclipse.jface.text.contentassist.ICompletionProposal;
  25. import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
  26. import org.eclipse.jface.text.contentassist.IContextInformation;
  27. import org.eclipse.jface.text.contentassist.IContextInformationValidator;
  28. import org.eclipse.jdt.core.CompletionRequestor;
  29. import org.eclipse.jdt.core.ICompilationUnit;
  30. import org.eclipse.jdt.core.JavaModelException;
  31. import org.eclipse.jdt.core.WorkingCopyOwner;
  32. import org.eclipse.jdt.core.compiler.IProblem;
  33. import org.eclipse.jdt.internal.corext.refactoring.StubTypeContext;
  34. import org.eclipse.jdt.ui.PreferenceConstants;
  35. import org.eclipse.jdt.ui.text.java.CompletionProposalComparator;
  36. import org.eclipse.jdt.internal.ui.JavaPlugin;
  37. import org.eclipse.jdt.internal.ui.refactoring.RefactoringMessages;
  38. import org.eclipse.jdt.internal.ui.text.java.JavaCompletionProposal;
  39. import org.eclipse.jdt.internal.ui.text.java.JavaTypeCompletionProposal;
  40. import org.eclipse.jdt.internal.ui.viewsupport.ImageDescriptorRegistry;
  41. public class CUPositionCompletionProcessor implements IContentAssistProcessor, ISubjectControlContentAssistProcessor {
  42. private static final ImageDescriptorRegistry IMAGE_DESC_REGISTRY= JavaPlugin.getImageDescriptorRegistry();
  43. private String fErrorMessage;
  44. private char[] fProposalAutoActivationSet;
  45. private CompletionProposalComparator fComparator;
  46. private CompletionContextRequestor fCompletionContextRequestor;
  47. private CUPositionCompletionRequestor fCompletionRequestor;
  48. /**
  49. * Creates a <code>CUPositionCompletionProcessor</code>.
  50. * The completion context must be set via {@link #setCompletionContext(ICompilationUnit,String,String)}.
  51. * @param completionRequestor the completion requestor
  52. */
  53. public CUPositionCompletionProcessor(CUPositionCompletionRequestor completionRequestor) {
  54. fCompletionRequestor= completionRequestor;
  55. fComparator= new CompletionProposalComparator();
  56. IPreferenceStore preferenceStore= JavaPlugin.getDefault().getPreferenceStore();
  57. String triggers= preferenceStore.getString(PreferenceConstants.CODEASSIST_AUTOACTIVATION_TRIGGERS_JAVA);
  58. fProposalAutoActivationSet = triggers.toCharArray();
  59. }
  60. /**
  61. * @param cuHandle the {@link ICompilationUnit} in whose context codeComplete will be invoked.
  62. * The given cu doesn't have to exist (and if it exists, it will not be modified).
  63. * An independent working copy consisting of
  64. * <code>beforeString</code> + ${current_input} + <code>afterString</code> will be used.
  65. * @param beforeString the string before the input position
  66. * @param afterString the string after the input position
  67. */
  68. public void setCompletionContext(final ICompilationUnit cuHandle, final String beforeString, final String afterString) {
  69. fCompletionContextRequestor= new CompletionContextRequestor() {
  70. final StubTypeContext fStubTypeContext= new StubTypeContext(cuHandle, beforeString, afterString);
  71. @Override
  72. public StubTypeContext getStubTypeContext() {
  73. return fStubTypeContext;
  74. }
  75. };
  76. }
  77. public void setCompletionContextRequestor(CompletionContextRequestor completionContextRequestor) {
  78. fCompletionContextRequestor= completionContextRequestor;
  79. }
  80. /**
  81. * Computing proposals on a <code>ITextViewer</code> is not supported.
  82. * @see #computeCompletionProposals(IContentAssistSubjectControl, int)
  83. * @see IContentAssistProcessor#computeCompletionProposals(ITextViewer, int)
  84. */
  85. public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) {
  86. Assert.isTrue(false, "ITextViewer not supported"); //$NON-NLS-1$
  87. return null;
  88. }
  89. /**
  90. * Computing context information on a <code>ITextViewer</code> is not supported.
  91. * @see #computeContextInformation(IContentAssistSubjectControl, int)
  92. * @see IContentAssistProcessor#computeContextInformation(ITextViewer, int)
  93. */
  94. public IContextInformation[] computeContextInformation(ITextViewer viewer, int documentOffset) {
  95. Assert.isTrue(false, "ITextViewer not supported"); //$NON-NLS-1$
  96. return null;
  97. }
  98. /* (non-Javadoc)
  99. * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getCompletionProposalAutoActivationCharacters()
  100. */
  101. public char[] getCompletionProposalAutoActivationCharacters() {
  102. return fProposalAutoActivationSet;
  103. }
  104. /* (non-Javadoc)
  105. * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationAutoActivationCharacters()
  106. */
  107. public char[] getContextInformationAutoActivationCharacters() {
  108. return null;
  109. }
  110. /* (non-Javadoc)
  111. * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getErrorMessage()
  112. */
  113. public String getErrorMessage() {
  114. return fErrorMessage;
  115. }
  116. /* (non-Javadoc)
  117. * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationValidator()
  118. */
  119. public IContextInformationValidator getContextInformationValidator() {
  120. return null; //no context
  121. }
  122. /*
  123. * @see ISubjectControlContentAssistProcessor#computeContextInformation(IContentAssistSubjectControl, int)
  124. */
  125. public IContextInformation[] computeContextInformation(IContentAssistSubjectControl contentAssistSubjectControl, int documentOffset) {
  126. return null;
  127. }
  128. /*
  129. * @see ISubjectControlContentAssistProcessor#computeCompletionProposals(IContentAssistSubjectControl, int)
  130. */
  131. public ICompletionProposal[] computeCompletionProposals(IContentAssistSubjectControl contentAssistSubjectControl, int documentOffset) {
  132. if (fCompletionContextRequestor.getOriginalCu() == null)
  133. return null;
  134. String input= contentAssistSubjectControl.getDocument().get();
  135. if (documentOffset == 0)
  136. return null;
  137. ICompletionProposal[] proposals= internalComputeCompletionProposals(documentOffset, input);
  138. Arrays.sort(proposals, fComparator);
  139. return proposals;
  140. }
  141. private ICompletionProposal[] internalComputeCompletionProposals(int documentOffset, String input) {
  142. String cuString= fCompletionContextRequestor.getBeforeString() + input + fCompletionContextRequestor.getAfterString();
  143. ICompilationUnit cu= null;
  144. try {
  145. /*
  146. * Explicitly create a new non-shared working copy.
  147. *
  148. * The WorkingCopy cannot easily be shared between calls, since IContentAssistProcessor
  149. * has no dispose() lifecycle method. A workaround could be to pass in a WorkingCopyOwner
  150. * and dispose the owner's working copies from the caller's dispose().
  151. */
  152. cu= fCompletionContextRequestor.getOriginalCu().getWorkingCopy(new WorkingCopyOwner() {/*subclass*/}, new NullProgressMonitor());
  153. cu.getBuffer().setContents(cuString);
  154. int cuPrefixLength= fCompletionContextRequestor.getBeforeString().length();
  155. fCompletionRequestor.setOffsetReduction(cuPrefixLength);
  156. cu.codeComplete(cuPrefixLength + documentOffset, fCompletionRequestor);
  157. JavaCompletionProposal[] proposals= fCompletionRequestor.getResults();
  158. if (proposals.length == 0) {
  159. String errorMsg= fCompletionRequestor.getErrorMessage();
  160. if (errorMsg == null || errorMsg.trim().length() == 0)
  161. errorMsg= RefactoringMessages.JavaTypeCompletionProcessor_no_completion;
  162. fErrorMessage= errorMsg;
  163. } else {
  164. fErrorMessage= fCompletionRequestor.getErrorMessage();
  165. }
  166. return proposals;
  167. } catch (JavaModelException e) {
  168. JavaPlugin.log(e);
  169. return null;
  170. } finally {
  171. try {
  172. if (cu != null)
  173. cu.discardWorkingCopy();
  174. } catch (JavaModelException e) {
  175. JavaPlugin.log(e);
  176. }
  177. }
  178. }
  179. protected abstract static class CUPositionCompletionRequestor extends CompletionRequestor {
  180. public static final char[] TRIGGER_CHARACTERS= new char[] { '.' };
  181. private int fOffsetReduction;
  182. private List<JavaCompletionProposal> fProposals;
  183. private String fErrorMessage2;
  184. private void setOffsetReduction(int offsetReduction) {
  185. fOffsetReduction= offsetReduction;
  186. fProposals= new ArrayList<JavaCompletionProposal>();
  187. }
  188. @Override
  189. public final void completionFailure(IProblem error) {
  190. fErrorMessage2= error.getMessage();
  191. }
  192. public final JavaCompletionProposal[] getResults() {
  193. return fProposals.toArray(new JavaCompletionProposal[fProposals.size()]);
  194. }
  195. public final String getErrorMessage() {
  196. return fErrorMessage2;
  197. }
  198. protected final void addAdjustedCompletion(String name, String completion,
  199. int start, int end, int relevance, ImageDescriptor descriptor) {
  200. JavaCompletionProposal javaCompletionProposal= new JavaCompletionProposal(completion, start - fOffsetReduction, end - start,
  201. getImage(descriptor), new StyledString(name), relevance);
  202. javaCompletionProposal.setTriggerCharacters(TRIGGER_CHARACTERS);
  203. fProposals.add(javaCompletionProposal);
  204. }
  205. protected final void addAdjustedTypeCompletion(String name, String completion,
  206. int start, int end, int relevance, ImageDescriptor descriptor, String fullyQualifiedName) {
  207. String replacementString= fullyQualifiedName == null || completion.length() == 0 ? completion : fullyQualifiedName;
  208. int replacementOffset= start - fOffsetReduction;
  209. int replacementLength= end - start;
  210. JavaTypeCompletionProposal javaCompletionProposal= new JavaTypeCompletionProposal(
  211. replacementString,
  212. null,
  213. replacementOffset,
  214. replacementLength,
  215. getImage(descriptor),
  216. new StyledString(name),
  217. relevance,
  218. fullyQualifiedName);
  219. javaCompletionProposal.setTriggerCharacters(TRIGGER_CHARACTERS);
  220. fProposals.add(javaCompletionProposal);
  221. }
  222. private static Image getImage(ImageDescriptor descriptor) {
  223. return (descriptor == null) ? null : CUPositionCompletionProcessor.IMAGE_DESC_REGISTRY.get(descriptor);
  224. }
  225. }
  226. }