/*******************************************************************************
* Copyright (c) 2004 Lukas Larsson 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: Lukas Larsson
*******************************************************************************/
package org.erlide.ui.wizards.templates;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.templates.DocumentTemplateContext;
import org.eclipse.jface.text.templates.Template;
import org.eclipse.jface.text.templates.TemplateBuffer;
import org.eclipse.jface.text.templates.TemplateContext;
import org.eclipse.jface.text.templates.TemplateException;
import org.eclipse.jface.text.templates.TemplateVariable;
import org.eclipse.jface.text.templates.TemplateVariableResolver;
import org.erlide.util.ErlLogger;
public class FunctionVariableResolver extends TemplateVariableResolver {
protected List<Object[]> functions = new ArrayList<>();
@Override
public void resolve(final TemplateVariable variable, final TemplateContext context) {
@SuppressWarnings("unchecked")
final Iterator<TemplateVariableResolver> it = ErlangSourceContextTypeLayout
.getDefault().resolvers();
FunctionNameVariableResolver name_var = null;
// !TODO: Use BodyVariableResolver
// BodyVariableResolver body_var = null;
ArgumentsVariableResolver arg_var = null;
while (it.hasNext()) {
final TemplateVariableResolver element = it.next();
if (element instanceof FunctionNameVariableResolver) {
name_var = (FunctionNameVariableResolver) element;
} else if (element instanceof BodyVariableResolver) {
// body_var = (BodyVariableResolver) element;
} else if (element instanceof ArgumentsVariableResolver) {
arg_var = (ArgumentsVariableResolver) element;
}
}
if (arg_var == null || name_var == null
// || body_var == null
) {
variable.setValue("");
return;
}
final StringBuilder buff = new StringBuilder();
for (final Object[] element : functions) {
arg_var.setArity(((Integer) element[1]).intValue());
name_var.setFunctionName((String) element[0]);
final Template commentTemplate = ErlangSourceContextTypeComment.getDefault()
.getTemplateStore()
.getTemplateData("org.erlide.ui.erlangsource.functioncomment")
.getTemplate();
DocumentTemplateContext commentContext = new DocumentTemplateContext(
ErlangSourceContextTypeLayout.getDefault(),
new Document(commentTemplate.getPattern()), 0,
commentTemplate.getPattern().length());
TemplateBuffer tb = null;
try {
tb = commentContext.evaluate(commentTemplate);
} catch (final BadLocationException e) {
ErlLogger.warn(e);
buff.append("Error: " + e.getMessage());
} catch (final TemplateException e) {
ErlLogger.warn(e);
buff.append("Error: " + commentTemplate.getName()
+ " could not be validated!");
}
if (tb != null) {
buff.append(tb.getString() + "\n");
}
final Template template = ErlangSourceContextTypeComment.getDefault()
.getTemplateStore()
.getTemplateData("org.erlide.ui.erlangsource.functionlayout")
.getTemplate();
commentContext = new DocumentTemplateContext(
ErlangSourceContextTypeLayout.getDefault(),
new Document(template.getPattern()), 0,
template.getPattern().length());
try {
tb = commentContext.evaluate(template);
} catch (final BadLocationException e) {
ErlLogger.warn(e);
buff.append("Error: " + e.getMessage());
} catch (final TemplateException e) {
ErlLogger.warn(e);
buff.append("Error: " + template.getName() + " could not be validated!");
}
if (tb != null) {
buff.append(tb.getString() + "\n");
}
}
variable.setValue(buff.toString());
}
public void doAddFunction(final String name, final int arity) {
final Object[] data = { name, Integer.valueOf(arity) };
functions.add(data);
}
public void doClearFunctions() {
functions.clear();
}
}