/*******************************************************************************
* Copyright (c) 2013 Bruno Medeiros and other Contributors.
* 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:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package dtool.ast.declarations;
import melnorme.lang.tooling.ast.CommonASTNode;
import melnorme.lang.tooling.ast.IASTNode;
import melnorme.lang.tooling.ast.IASTVisitor;
import melnorme.lang.tooling.ast.util.ASTCodePrinter;
import melnorme.lang.tooling.ast.util.NodeVector;
import melnorme.lang.tooling.ast_actual.ASTNode;
import melnorme.lang.tooling.ast_actual.ASTNodeTypes;
import melnorme.lang.tooling.engine.scoping.CommonScopeLookup.ScopeNameResolution;
import melnorme.lang.tooling.engine.scoping.INonScopedContainer;
import melnorme.utilbox.collections.ArrayView;
import melnorme.utilbox.core.CoreUtil;
import dtool.ast.definitions.DefUnit;
import dtool.ast.references.RefModule;
import dtool.ast.statements.IStatement;
/**
* An import Declaration.
* This is considered an INonScopedBlock because it might contain aliasing
* imports and selective imports, which are primary-space {@link DefUnit}s.
*/
public class DeclarationImport extends ASTNode implements INonScopedContainer, IDeclaration, IStatement {
public final NodeVector<IImportFragment> imports;
public final boolean isStatic;
public boolean isPublicImport; // aka public imports
public DeclarationImport(boolean isStatic, NodeVector<IImportFragment> imports) {
this.imports = parentize(imports);
this.isStatic = isStatic;
this.isPublicImport = false; // TODO, should be determined by surrounding analysis
}
public final ArrayView<ASTNode> imports_asNodes() {
return CoreUtil.<ArrayView<ASTNode>>blindCast(imports);
}
@Override
public ASTNodeTypes getNodeType() {
return ASTNodeTypes.DECLARATION_IMPORT;
}
@Override
public void visitChildren(IASTVisitor visitor) {
acceptVisitor(visitor, imports);
}
@Override
protected CommonASTNode doCloneTree() {
return new DeclarationImport(isStatic, clone(imports));
}
public static interface IImportFragment extends IASTNode {
public void evaluateImportsScopeContribution(ScopeNameResolution scopeRes, boolean isSecondaryScope);
public RefModule getModuleRef();
}
@Override
public Iterable<? extends IASTNode> getMembersIterable() {
return imports_asNodes();
}
@Override
public void toStringAsCode(ASTCodePrinter cp) {
cp.append(isStatic, "static ");
cp.append("import ");
cp.appendList(imports_asNodes(), ", ");
cp.append(";");
}
/* ----------------- ----------------- */
@Override
public void evaluateForScopeLookup(ScopeNameResolution scopeRes, boolean isSecondaryScope,
boolean publicImportsOnly) {
if(publicImportsOnly && !isPublicImport)
return; // Don't consider private contributions
for (IImportFragment impFrag : imports) {
impFrag.evaluateImportsScopeContribution(scopeRes, isSecondaryScope);
}
}
}