/*
* <copyright>
*
* Copyright (c) 2005-2008 Sven Efftinge and others.
* 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:
* Sven Efftinge - Initial API and implementation
* Alexander Shatalin (Borland)
*
* </copyright>
*/
package org.eclipse.gmf.internal.xpand.xtend.ast;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.eclipse.gmf.internal.xpand.ResourceManager;
import org.eclipse.gmf.internal.xpand.expression.AnalysationIssue;
import org.eclipse.gmf.internal.xpand.expression.ExecutionContext;
import org.eclipse.gmf.internal.xpand.expression.ast.SyntaxElement;
public class ExtensionFile extends SyntaxElement implements XtendResource {
private final List<ImportStatement> nsImports;
private final List<ImportStatement> extImports;
private final List<Extension> extensions;
@SuppressWarnings("unchecked")
public ExtensionFile(final int start, final int end, final int line, final int startOffset, final int endOffset, final List<? extends SyntaxElement> nsImports, final List<? extends SyntaxElement> extImports,
final List<? extends SyntaxElement> extensions) {
super(start, end, line, startOffset, endOffset);
this.nsImports = (List<ImportStatement>) nsImports;
this.extImports = (List<ImportStatement>) extImports;
this.extensions = (List<Extension>) extensions;
for (Extension ext: this.extensions) {
ext.setExtensionFile(this);
}
}
public List<Extension> getExtensions() {
return extensions;
}
public List<ImportStatement> getExtImports() {
return extImports;
}
public List<ImportStatement> getNsImports() {
return nsImports;
}
public String[] getImportedNamespaces() {
final List<String> namespaces = new ArrayList<String>(getNsImports().size());
for (ImportStatement nsImport : getNsImports()) {
namespaces.add(nsImport.getValue());
}
return namespaces.toArray(new String[namespaces.size()]);
}
public String[] getImportedExtensions() {
final List<String> result = new ArrayList<String>(getExtImports().size());
for (ImportStatement nsImport : getExtImports()) {
result.add(nsImport.getValue());
}
return result.toArray(new String[result.size()]);
}
public void analyze(ExecutionContext ctx, final Set<AnalysationIssue> issues) {
ctx = ctx.cloneWithResource(this);
for (Extension ext : getExtensions()) {
ext.analyze(ctx, issues);
}
}
private String fullyQualifiedName;
public void setFullyQualifiedName(final String fullyQualifiedName) {
this.fullyQualifiedName = fullyQualifiedName;
}
/**
* XXX who cares?
*/
public String getFullyQualifiedName() {
return fullyQualifiedName;
}
public List<Extension> getPublicExtensions(ResourceManager rm) {
final List<Extension> result = new ArrayList<Extension>();
for (Extension element : getExtensions()) {
if (!element.isPrivate()) {
result.add(element);
}
}
for (ImportStatement imp : getExtImports()) {
if (imp.isExported()) {
final XtendResource xf = rm.loadXtendResource(imp.getImportedId().getValue());
result.addAll(xf.getPublicExtensions(rm));
}
}
return result;
}
public boolean isReexported(String importedExtensionName) {
for (ImportStatement extensionImport : getExtImports()) {
if (extensionImport.getValue().equals(importedExtensionName)) {
return extensionImport.isExported();
}
}
return false;
}
}