package org.eclipse.imp.services.base; import lpg.runtime.IAst; import lpg.runtime.IToken; import org.eclipse.imp.services.IASTMatchAdapter; public abstract class LPGASTMatchAdapterBase implements IASTMatchAdapter { private final Class<?> fNodeListBaseClass; public LPGASTMatchAdapterBase(Class<?> nodeListBaseClass) { fNodeListBaseClass= nodeListBaseClass; } public Object[] getChildren(Object astNode) { return ((IAst) astNode).getChildren().toArray(); } public int getOffset(Object astNode) { return ((IAst) astNode).getLeftIToken().getStartOffset(); } public int getLength(Object astNode) { IAst ast = (IAst) astNode; IToken left = ast.getLeftIToken(); IToken right = ast.getRightIToken(); // special case for epsilon trees if (left.getTokenIndex() > right.getTokenIndex()) { return 0; } else { int start = left.getStartOffset(); int end = right.getEndOffset(); return end - start + 1; } } public Object getChildAtPosition(int pos, Object astNode) { return ((IAst) astNode).getChildren().get(pos); } public boolean isList(Object astNode) { return fNodeListBaseClass.isInstance(astNode); } }