/*******************************************************************************
* Copyright (c) 2009-2011 CWI
* 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:
* * Jurgen J. Vinju - Jurgen.Vinju@cwi.nl - CWI
*******************************************************************************/
package org.rascalmpl.eclipse.terms;
import org.rascalmpl.eclipse.Activator;
import org.rascalmpl.interpreter.result.ICallableValue;
import org.rascalmpl.interpreter.types.RascalTypeFactory;
import io.usethesource.vallang.IBool;
import io.usethesource.vallang.IConstructor;
import io.usethesource.vallang.IDateTime;
import io.usethesource.vallang.IExternalValue;
import io.usethesource.vallang.IInteger;
import io.usethesource.vallang.IList;
import io.usethesource.vallang.IMap;
import io.usethesource.vallang.INode;
import io.usethesource.vallang.IRational;
import io.usethesource.vallang.IReal;
import io.usethesource.vallang.ISet;
import io.usethesource.vallang.ISourceLocation;
import io.usethesource.vallang.IString;
import io.usethesource.vallang.ITuple;
import io.usethesource.vallang.IValue;
import io.usethesource.vallang.type.Type;
import io.usethesource.vallang.visitors.IValueVisitor;
import org.rascalmpl.values.uptr.ITree;
import io.usethesource.impulse.language.ILanguageService;
import io.usethesource.impulse.language.Language;
import io.usethesource.impulse.services.base.TreeModelBuilderBase;
public class TreeModelBuilder extends TreeModelBuilderBase implements ILanguageService{
private Language lang;
public TreeModelBuilder(){
super();
}
@Override
protected void visitTree(Object root) {
Language lang = initLanguage(root);
if (lang == null || root == null) return;
IConstructor pt = (IConstructor) root;
ICallableValue outliner = TermLanguageRegistry.getInstance().getOutliner(lang);
if (outliner == null) {
return;
}
try {
IValue outline;
synchronized(outliner.getEval()){
outline = outliner.call(new Type[] {RascalTypeFactory.getInstance().nonTerminalType(pt)}, new IValue[] {pt}, null).getValue();
}
if (outline instanceof INode) {
convertModel(outline);
}
}
catch (Throwable e) {
Activator.getInstance().logException("outliner failed: " + e.getMessage(), e);
return;
}
}
protected void convertModel(IValue outline) {
INode node = (INode) outline;
createTopItem(outline);
for (IValue child : node) {
child.accept(new IValueVisitor<Object, RuntimeException>() {
public Object visitBoolean(IBool o)
{
createSubItem(o);
return null;
}
public Object visitConstructor(IConstructor o)
{
pushSubItem(o);
for (IValue child : o) {
child.accept(this);
}
popSubItem();
return null;
}
public Object visitDateTime(IDateTime o)
{
createSubItem(o);
return null;
}
public Object visitExternal(IExternalValue o)
{
createSubItem(o);
return null;
}
public Object visitInteger(IInteger o) {
createSubItem(o);
return null;
}
public Object visitRational(IRational o) {
createSubItem(o);
return null;
}
public Object visitList(IList o) {
for (IValue elem : o) {
elem.accept(this);
}
return null;
}
public Object visitMap(IMap o) {
for (IValue key : o) {
pushSubItem(key);
o.get(key).accept(this);
popSubItem();
}
return null;
}
public Object visitNode(INode o) {
pushSubItem(o);
for (IValue child : o) {
child.accept(this);
}
popSubItem();
return null;
}
public Object visitReal(IReal o) {
return createSubItem(o);
}
public Object visitRelation(ISet o)
{
for (IValue tuple : o) {
tuple.accept(this);
}
return null;
}
public Object visitListRelation(IList o)
{
for (IValue tuple : o) {
tuple.accept(this);
}
return null;
}
public Object visitSet(ISet o) {
for (IValue tuple : o) {
tuple.accept(this);
}
return null;
}
public Object visitSourceLocation(ISourceLocation o)
{
return createSubItem(o);
}
public Object visitString(IString o) {
return createSubItem(o);
}
public Object visitTuple(ITuple o) {
for (IValue field : o) {
field.accept(this);
}
return null;
}
});
}
}
private Language initLanguage(Object root) {
if (lang == null) {
if (root instanceof ITree) {
lang = TermLanguageRegistry.getInstance().getLanguage((ITree) root);
}
}
return lang;
}
}