/* * Copyright (C) 2006, 2007 Dennis Hunziker, Ueli Kistler * Copyright (C) 2007 Reto Schuettel, Robin Stocker * * IFS Institute for Software, HSR Rapperswil, Switzerland * */ package org.python.pydev.refactoring.ast.visitors.info; import java.util.ArrayList; import java.util.List; import java.util.SortedMap; import java.util.TreeMap; import org.python.pydev.parser.jython.SimpleNode; import org.python.pydev.parser.jython.ast.Import; import org.python.pydev.parser.jython.ast.ImportFrom; import org.python.pydev.parser.jython.ast.Module; import org.python.pydev.parser.jython.ast.NameTok; import org.python.pydev.parser.jython.ast.VisitorBase; import org.python.pydev.parser.jython.ast.aliasType; import org.python.pydev.refactoring.ast.FQIdentifier; /** * This visitor will resolve module aliases to real module names and also map alias identifiers to real identifier. For the last mapping * list, key consists of "modulename.identifier" * */ public class ImportVisitor extends VisitorBase { private SortedMap<String, String> importedModules; private List<FQIdentifier> aliasToFQIdentifier; public ImportVisitor() { importedModules = new TreeMap<String, String>(); aliasToFQIdentifier = new ArrayList<FQIdentifier>(); } @Override public void traverse(SimpleNode node) throws Exception { // ignore } @Override public Object visitImport(Import node) throws Exception { visitImportModules(node.names); return null; } private void visitImportModules(aliasType[] names) { for (aliasType alias : names) { NameTok name = (NameTok) alias.name; NameTok asName = (NameTok) alias.asname; String realName = name.id; String aliasName = name.id; if (asName != null) { aliasName = asName.id; } addModuleImport(aliasName, realName); } } @Override public Object visitImportFrom(ImportFrom node) throws Exception { NameTok moduleName = (NameTok) node.module; visitAlias(moduleName.id, node.names); return null; } private void visitAlias(String prefix, aliasType[] names) { if (names != null && names.length > 0) { for (aliasType alias : names) { NameTok name = (NameTok) alias.name; NameTok asName = (NameTok) alias.asname; String realName = name.id; String aliasName = name.id; if (asName != null) { aliasName = asName.id; } aliasToFQIdentifier.add(new FQIdentifier(prefix, realName, aliasName)); } } else { // from <smthing> import * importedModules.put(prefix, prefix); } } private void addModuleImport(String moduleAlias, String realName) { if (!(importedModules.containsKey(moduleAlias))) { importedModules.put(moduleAlias, realName); } } @Override protected Object unhandled_node(SimpleNode node) throws Exception { return null; } @Override public Object visitModule(Module node) throws Exception { node.traverse(this); return null; } public List<FQIdentifier> getAliasToFQIdentifier() { return aliasToFQIdentifier; } public SortedMap<String, String> getImportedModules() { return importedModules; } }