/* * Copyright (C) 2011 Laurent Caillette * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either * version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.novelang.parser.antlr; import org.antlr.runtime.Token; import org.antlr.runtime.tree.CommonTreeAdaptor; import org.novelang.common.Location; import org.novelang.common.LocationFactory; /** * See <a href="http://www.antlr.org/api/Java" >online doco</a>. * * @author Laurent Caillette */ /*package*/ class CustomTreeAdaptor extends CommonTreeAdaptor { private final LocationFactory locationFactory ; public CustomTreeAdaptor( final LocationFactory locationFactory ) { this.locationFactory = locationFactory; } @Override public Object create( final Token payload ) { final Location location ; if( payload == null ) { location = locationFactory.createLocation() ; } else { location = locationFactory.createLocation( payload.getLine(), payload.getCharPositionInLine() ); } return new CustomTree( payload, location ) ; } /** * Parent's doco says: * "If oldRoot is a nil root, just copy or move the children to newRoot. * If not a nil root, make oldRoot a child of newRoot." */ @Override public Object becomeRoot( final Object newRoot, final Object oldRoot ) { final CustomTree result = ( CustomTree ) super.becomeRoot( newRoot, oldRoot ) ; result.setLocation( ( ( CustomTree ) oldRoot ).getLocation() ) ; return result ; } }