/*******************************************************************************
* Copyright (c) 2007, 2008 Edgar Espina.
* 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
*
*******************************************************************************/
package org.deved.antlride.debug.breakpoints;
import org.deved.antlride.core.model.IGrammar;
import org.deved.antlride.core.model.IModelElement;
import org.deved.antlride.core.model.IToken;
import org.deved.antlride.core.model.ast.ModelElementQuery;
import org.deved.antlride.debug.model.AntlrDebugTarget;
import org.deved.antlride.debug.model.event.AntlrDebugEvent;
import org.deved.antlride.debug.model.event.AntlrDebugEventKind;
import org.deved.antlride.debug.model.event.AntlrDebugLTEvent;
import org.deved.antlride.debug.model.event.AntlrDebugLocationEvent;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
public class AntlrLTBreakpoint extends AntlrTokenBreakpoint {
public static final String ID = "org.deved.antlride.debug.LTBreakpoint";
public AntlrLTBreakpoint() {
}
public AntlrLTBreakpoint(final IResource resource,
final String elementName, final int lineNumber,
final int columnNumber) throws CoreException {
super(resource, elementName, lineNumber, columnNumber);
}
@Override
public String getId() {
return ID;
}
@Override
public String getName() {
return "LT";
}
@Override
protected boolean match(AntlrDebugEvent event) {
if (event.getEventKind() == AntlrDebugEventKind.LT) {
AntlrDebugTarget debugTarget = event.getDebugTarget();
try {
if(debugTarget.isInDecision()) {
return false;
}
String elementName = getElementName();
AntlrDebugLTEvent lt = (AntlrDebugLTEvent) event;
IGrammar grammar = debugTarget.getGrammar();
IToken token = grammar.findToken(lt.getTokenName());
if (elementName.equals(lt.getTokenName()) || (token!=null && elementName.equals(token.getValueAsString()))) {
AntlrDebugEvent[] events = debugTarget.getEvents();
AntlrDebugEvent le = events[events.length - 2];
if (le.getEventKind() != AntlrDebugEventKind.LOCATION) {
return false;
}
AntlrDebugLocationEvent location = (AntlrDebugLocationEvent) le;
IModelElement element = ModelElementQuery.getElementAt(
grammar, location.getLine(), location.getColumn());
if (element != null)
return element.getElementName().equals(elementName);
}
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
}