/******************************************************************************* * Copyright (c) 2008 xored software, Inc. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * xored software, Inc. - initial API and Implementation (Alex Panchenko) *******************************************************************************/ package org.eclipse.dltk.tcl.internal.core.packages; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.dltk.ast.ASTVisitor; import org.eclipse.dltk.ast.declarations.ModuleDeclaration; import org.eclipse.dltk.ast.statements.Statement; import org.eclipse.dltk.tcl.core.TclPackagesManager; import org.eclipse.dltk.tcl.core.TclPlugin; import org.eclipse.dltk.tcl.core.ast.TclPackageDeclaration; public class TclBuildPathPackageCollector extends ASTVisitor { private final List<TclPackageDeclaration> requireDirectives = new ArrayList<TclPackageDeclaration>(); private final Set<String> packagesRequired = new HashSet<String>(); private final Set<String> packagesProvided = new HashSet<String>(); public void process(ModuleDeclaration declaration) { try { declaration.traverse(this); } catch (Exception e) { TclPlugin.error(e); } } public boolean visit(Statement s) throws Exception { if (s instanceof TclPackageDeclaration) { final TclPackageDeclaration pkg = (TclPackageDeclaration) s; if (pkg.getStyle() == TclPackageDeclaration.STYLE_REQUIRE) { if (TclPackagesManager.isValidName(pkg.getName())) { requireDirectives.add(new TclPackageDeclaration(pkg)); packagesRequired.add(pkg.getName()); } } else if (pkg.getStyle() == TclPackageDeclaration.STYLE_IFNEEDED || pkg.getStyle() == TclPackageDeclaration.STYLE_PROVIDE) { packagesProvided.add(pkg.getName()); } return false; } return super.visit(s); } /** * @return the requireDirectives */ public List<TclPackageDeclaration> getRequireDirectives() { return requireDirectives; } /** * @return the packagesRequired */ public Set<String> getPackagesRequired() { return packagesRequired; } /** * @return the packagesProvided */ public Set<String> getPackagesProvided() { return packagesProvided; } }