/*******************************************************************************
* Copyright (c) 2008 committers of openArchitectureWare 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:
* committers of openArchitectureWare - initial API and implementation
*******************************************************************************/
package org.eclipse.xtend.middleend.xtend;
import org.eclipse.internal.xtend.xtend.ast.Around;
import org.eclipse.internal.xtend.xtend.ast.Extension;
import org.eclipse.internal.xtend.xtend.ast.ExtensionFile;
import org.eclipse.internal.xtend.xtend.ast.ExtensionImportStatement;
import org.eclipse.xtend.backend.common.BackendTypesystem;
import org.eclipse.xtend.backend.common.NamedFunction;
import org.eclipse.xtend.check.CheckUtils;
import org.eclipse.xtend.expression.ExecutionContext;
import org.eclipse.xtend.middleend.MiddleEnd;
import org.eclipse.xtend.middleend.plugins.ImportedResource;
import org.eclipse.xtend.middleend.plugins.LanguageSpecificMiddleEnd;
import org.eclipse.xtend.middleend.plugins.ParsedResource;
import org.eclipse.xtend.middleend.xtend.internal.TypeToBackendType;
import org.eclipse.xtend.middleend.xtend.internal.xtend.CheckConverter;
import org.eclipse.xtend.middleend.xtend.internal.xtend.OldExtensionConverter;
import org.eclipse.xtend.middleend.xtend.internal.xtendlib.XtendLibContributor;
public class OldCheckRegistry implements LanguageSpecificMiddleEnd {
private final ExecutionContext _ctx;
private MiddleEnd _middleEnd;
private BackendTypesystem _ts;
public OldCheckRegistry(Object specificData) {
if (specificData == null)
throw new IllegalArgumentException(getName()
+ " middle end is not initialized - will not contribute");
_ctx = (ExecutionContext) specificData;
}
public boolean canHandle(String resourceName) {
resourceName = OldHelper.normalizeCheckResourceName (resourceName);
try {
final ExtensionFile checkFile = (ExtensionFile) _ctx.getResourceManager().loadResource (resourceName,CheckUtils.FILE_EXTENSION);
return checkFile != null;
}
catch (Exception exc) {
return false;
}
}
public boolean mayHandle(String resourceName) {
return resourceName.endsWith (CheckUtils.FILE_EXTENSION);
}
public String getName() {
return "Check";
}
public ParsedResource parseResource(String checkFileName) {
ParsedResource result = new ParsedResource();
checkFileName = OldHelper.normalizeCheckResourceName(checkFileName);
ExtensionFile checkFile = (ExtensionFile) _ctx.getResourceManager()
.loadResource(checkFileName, CheckUtils.FILE_EXTENSION);
if (checkFile == null)
throw new IllegalArgumentException("could not find check file '"
+ checkFile + "'");
final ExecutionContext ctx = _ctx.cloneWithResource(checkFile);
final TypeToBackendType typeConverter = new TypeToBackendType(_ts, ctx);
final OldExtensionConverter extensionFactory = new OldExtensionConverter(
ctx, typeConverter);
for (Extension ext : checkFile.getExtensions())
ext.init(ctx);
// register the XtendLib. Do this first so the extension can override
// functions
registerXtendLib (result);
result.getPublicFunctions().add(
new CheckConverter(ctx, typeConverter).createCheckFunction(_ts,
checkFile));
for (Extension ext : checkFile.getExtensions()) {
final NamedFunction f = extensionFactory.createUnregistered(ext);
if (ext.isPrivate())
result.getPrivateFunctions().add(f);
else
result.getPublicFunctions().add(f);
}
for (ExtensionImportStatement imp : checkFile.getExtImports())
result.getImports().add(
new ImportedResource(OldHelper
.normalizeXtendResourceName(imp.getImportedId()
.getValue()), imp.isExported()));
for (Around a : checkFile.getArounds())
result.getAdvice().add(extensionFactory.create(a));
return result;
}
private void registerXtendLib(ParsedResource result) {
XtendLibContributor xtendLibContrib = new XtendLibContributor (_middleEnd);
for (String contrib : xtendLibContrib.getContributingResources())
result.getImports().add (new ImportedResource (contrib, false));
result.getPrivateFunctions().addAll (xtendLibContrib.getContributedFunctions());
}
public void setMiddleEnd(MiddleEnd middleEnd) {
_middleEnd = middleEnd;
_ts = middleEnd.getTypesystem();
}
}