/*******************************************************************************
* Copyright (c) 2007 IBM Corporation.
* 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:
* Robert Fuhrer (rfuhrer@watson.ibm.com) - initial API and implementation
*******************************************************************************/
package org.eclipse.imp.services.base;
import java.util.Stack;
import org.eclipse.imp.core.ErrorHandler;
import org.eclipse.imp.editor.ModelTreeNode;
import org.eclipse.imp.language.ILanguageService;
public abstract class TreeModelBuilderBase implements ILanguageService {
protected ModelTreeNode fModelRoot;
private Stack<ModelTreeNode> fItemStack= new Stack<ModelTreeNode>();
public final ModelTreeNode buildTree(Object rootASTNode) {
fItemStack.push(fModelRoot= createTopItem(new ModelTreeNode(rootASTNode)));
try {
visitTree(rootASTNode);
} catch (Exception e) {
ErrorHandler.reportError("Exception caught from invocation of language-specific tree model builder implementation", e);
}
fItemStack.pop();
return fModelRoot;
}
protected abstract void visitTree(Object root);
protected ModelTreeNode createTopItem(Object n) {
return createTopItem(n, ModelTreeNode.DEFAULT_CATEGORY);
}
protected ModelTreeNode createTopItem(Object n, int category) {
ModelTreeNode treeNode= new ModelTreeNode(n, category);
return treeNode;
}
protected ModelTreeNode createSubItem(Object n) {
return createSubItem(n, ModelTreeNode.DEFAULT_CATEGORY);
}
protected ModelTreeNode createSubItem(Object n, int category) {
final ModelTreeNode parent= fItemStack.peek();
ModelTreeNode treeNode= new ModelTreeNode(n, parent, category);
parent.addChild(treeNode);
return treeNode;
}
protected ModelTreeNode pushSubItem(Object n) {
return pushSubItem(n, ModelTreeNode.DEFAULT_CATEGORY);
}
protected ModelTreeNode pushSubItem(Object n, int category) {
return fItemStack.push(createSubItem(n, category));
}
protected void popSubItem() {
fItemStack.pop();
}
}