/**
* 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.
*/
package com.python.pydev.analysis.scopeanalysis;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.text.BadLocationException;
import org.python.pydev.core.IModule;
import org.python.pydev.core.IPythonNature;
import org.python.pydev.core.IToken;
import org.python.pydev.core.Tuple3;
import org.python.pydev.core.Tuple4;
import org.python.pydev.editor.codecompletion.revisited.modules.SourceModule;
import org.python.pydev.editor.codecompletion.revisited.visitors.Definition;
import org.python.pydev.parser.visitors.scope.ASTEntry;
import com.python.pydev.analysis.visitors.Found;
import com.python.pydev.analysis.visitors.ImportChecker.ImportInfo;
/**
* This scope analyzer works finding definitions that are based on some import.
*/
public final class ScopeAnalyzerVisitorForImports extends ScopeAnalyzerVisitor {
private SourceModule moduleToFind;
/**
* @param importInfo we'll try to find matches for the given import info.
*/
public ScopeAnalyzerVisitorForImports(IPythonNature nature, String moduleName, IModule current,
IProgressMonitor monitor, String nameToFind, String[] tokenAndQual, SourceModule moduleToFind)
throws BadLocationException {
super(nature, moduleName, current, null, monitor, nameToFind, -1, tokenAndQual);
this.moduleToFind = moduleToFind;
}
@Override
protected boolean checkToken(Found found, IToken generator, ASTEntry parent) {
if (found == null) {
return false;
}
//now, there's a catch here... the import checker will make the module 'resolved' for any token it found, even
//if it doesn't end up matching with the token we're looking for... so, we must keep on going with the
//import definitions until we actually find what we're looking for.
ImportInfo info = found.importInfo;
if (info != null && info.wasResolved) {
if (info.rep.length() != 0 && info.token.isImport()) {
//we only actually had a match with a module if the representation found is empty
Definition definition = info.getModuleDefinitionFromImportInfo(nature, this.completionCache);
if (definition != null && definition.module.getName().equals(this.moduleToFind.getName())) {
return true;
}
} else if (info.mod.getName().equals(this.moduleToFind.getName())) {
//ok, exact (and direct) match
return true;
}
}
return false;
}
/**
* All the occurrences we find are correct occurrences (because we check if it was found by the module it resolves to)
*/
protected ArrayList<Tuple4<IToken, Integer, ASTEntry, Found>> getCompleteTokenOccurrences() {
ArrayList<Tuple4<IToken, Integer, ASTEntry, Found>> ret = new ArrayList<Tuple4<IToken, Integer, ASTEntry, Found>>();
addImports(ret, importsFound);
addImports(ret, importsFoundFromModuleName);
return ret;
}
@SuppressWarnings("unchecked")
private void addImports(ArrayList<Tuple4<IToken, Integer, ASTEntry, Found>> ret,
Map<String, List<Tuple3<Found, Integer, ASTEntry>>> map) {
for (List<Tuple3<Found, Integer, ASTEntry>> fList : map.values()) {
for (Tuple3<Found, Integer, ASTEntry> foundInFromModule : fList) {
IToken generator = foundInFromModule.o1.getSingle().generator;
Tuple4<IToken, Integer, ASTEntry, Found> tup3 = new Tuple4(generator, 0, foundInFromModule.o3,
foundInFromModule.o1);
ret.add(tup3);
}
}
}
}