/** * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ /* * Created on Sep 12, 2005 * * @author Fabio Zadrozny */ package com.python.pydev.analysis.additionalinfo; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.eclipse.core.resources.IMarker; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.ui.texteditor.MarkerAnnotation; import org.python.pydev.core.ICompletionState; import org.python.pydev.core.IToken; import org.python.pydev.core.MisconfigurationException; import org.python.pydev.core.ModulesKey; import org.python.pydev.editor.codecompletion.CompletionRequest; import org.python.pydev.editor.codecompletion.IPyDevCompletionParticipant; import org.python.pydev.editor.codecompletion.PyCodeCompletionUtils; import org.python.pydev.editor.codecompletion.revisited.CompletionCache; import org.python.pydev.editor.codecompletion.revisited.CompletionStateFactory; import org.python.pydev.editor.codecompletion.revisited.ModulesManager; import org.python.pydev.editor.codecompletion.revisited.modules.AbstractModule; import org.python.pydev.editor.codecompletion.revisited.modules.SourceModule; import org.python.pydev.editor.codefolding.MarkerAnnotationAndPosition; import org.python.pydev.parser.jython.SimpleNode; import org.python.pydev.plugin.nature.PythonNature; import com.python.pydev.analysis.AnalysisTestsBase; import com.python.pydev.analysis.MarkerStub; import com.python.pydev.analysis.builder.AnalysisRunner; public class AdditionalInfoTestsBase extends AnalysisTestsBase { protected IPyDevCompletionParticipant participant; protected boolean useOriginalRequestCompl = false; protected ArrayList<IToken> imports; public ICompletionProposal[] requestCompl(File file, String strDoc, int documentOffset, int returned, String[] retCompl, PythonNature nature) throws Exception { if (useOriginalRequestCompl) { return super.requestCompl(file, strDoc, documentOffset, returned, retCompl, nature); } if (documentOffset == -1) { documentOffset = strDoc.length(); } IDocument doc = new Document(strDoc); CompletionRequest request = new CompletionRequest(file, nature, doc, documentOffset, codeCompletion); ICompletionState state = CompletionStateFactory.getEmptyCompletionState(nature, new CompletionCache()); state.setTokenImportedModules(imports); List<Object> props = new ArrayList<Object>(participant.getGlobalCompletions(request, state)); ICompletionProposal[] codeCompletionProposals = PyCodeCompletionUtils.onlyValidSorted(props, request.qualifier, request.isInCalltip); for (int i = 0; i < retCompl.length; i++) { assertContains(retCompl[i], codeCompletionProposals); } if (returned > -1) { StringBuffer buffer = getAvailableAsStr(codeCompletionProposals); assertEquals("Expected " + returned + " received: " + codeCompletionProposals.length + "\n" + buffer, returned, codeCompletionProposals.length); } return codeCompletionProposals; } /** * This method creates a marker stub * * @param start start char * @param end end char * @param type the marker type * @return the created stub */ @SuppressWarnings("unchecked") protected MarkerAnnotationAndPosition createMarkerStub(int start, int end, int type) { HashMap attrs = new HashMap(); attrs.put(AnalysisRunner.PYDEV_ANALYSIS_TYPE, type); attrs.put(IMarker.CHAR_START, start); attrs.put(IMarker.CHAR_END, end); MarkerStub marker = new MarkerStub(attrs); return new MarkerAnnotationAndPosition( new MarkerAnnotation("org.eclipse.core.resources.problemmarker", marker), new Position(start, end - start)); } protected void addFooModule(final SimpleNode ast, File f) { String modName = "foo"; PythonNature natureToAdd = nature; addModuleToNature(ast, modName, natureToAdd, f); } /** * @param ast the ast that defines the module * @param modName the module name * @param natureToAdd the nature where the module should be added */ protected void addModuleToNature(final SimpleNode ast, String modName, PythonNature natureToAdd, File f) { //this is to add the info from the module that we just created... AbstractAdditionalDependencyInfo additionalInfo; try { additionalInfo = AdditionalProjectInterpreterInfo.getAdditionalInfoForProject(natureToAdd); } catch (MisconfigurationException e) { throw new RuntimeException(e); } additionalInfo.addAstInfo(ast, new ModulesKey(modName, f), false); ModulesManager modulesManager = (ModulesManager) natureToAdd.getAstManager().getModulesManager(); SourceModule mod = (SourceModule) AbstractModule.createModule(ast, f, modName); modulesManager.doAddSingleModule(new ModulesKey(modName, f), mod); } }