/* * Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC * All rights reserved. * * The source code of this document is proprietary work, and is not licensed for * distribution. For information about licensing, contact Sam Harwell at: * sam@tunnelvisionlabs.com */ package org.antlr.works.editor.antlr3.parsing; import org.antlr.netbeans.editor.parsing.SyntaxError; import org.antlr.netbeans.editor.text.DocumentSnapshot; import org.antlr.netbeans.editor.text.DocumentSnapshotLine; import org.antlr.netbeans.editor.text.OffsetRegion; import org.antlr.netbeans.editor.text.SnapshotPosition; import org.antlr.netbeans.editor.text.SnapshotPositionRegion; import org.antlr.runtime.CommonToken; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.Token; import org.netbeans.api.annotations.common.NonNull; import org.netbeans.spi.editor.hints.Severity; import org.openide.util.Parameters; /** * * @author Sam Harwell */ public class AntlrSyntaxErrorV3 extends SyntaxError { private final Token offendingToken; private final RecognitionException exception; public AntlrSyntaxErrorV3(@NonNull DocumentSnapshot snapshot, Token offendingToken, RecognitionException exception, String message, Severity severity) { super(getLocationFromToken(snapshot, offendingToken, exception), message, severity); this.offendingToken = offendingToken; this.exception = exception; } private static SnapshotPositionRegion getLocationFromToken(@NonNull DocumentSnapshot snapshot, Token offendingToken, RecognitionException exception) { Parameters.notNull("snapshot", snapshot); if (offendingToken != null) { int line = offendingToken.getLine(); DocumentSnapshotLine snapshotLine = line > 0 && line <= snapshot.getLineCount() ? snapshot.findLineFromLineNumber(line - 1) : null; int charPositionInLine = offendingToken.getCharPositionInLine(); SnapshotPosition startPosition = null; if (snapshotLine != null && charPositionInLine >= 0 && charPositionInLine <= snapshotLine.getLength()) { startPosition = snapshotLine.getStart().add(charPositionInLine); } CommonToken token = offendingToken instanceof CommonToken ? (CommonToken)offendingToken : null; if (token != null) { int startOffset = token.getStartIndex(); int endOffset = token.getStopIndex() + 1; if (startOffset >= 0 && endOffset >= startOffset) { startOffset = Math.min(startOffset, snapshot.length()); endOffset = Math.min(endOffset, snapshot.length()); if (startPosition != null) { return new SnapshotPositionRegion(startPosition, endOffset - startOffset); } else { OffsetRegion offsetRegion = OffsetRegion.fromBounds(startOffset, endOffset); return new SnapshotPositionRegion(snapshot, offsetRegion); } } } if (startPosition != null) { return new SnapshotPositionRegion(startPosition, 0); } else { return new SnapshotPositionRegion(snapshot, 0, 0); } } int line = exception != null ? exception.line : -1; if (line <= 0) { return new SnapshotPositionRegion(snapshot, 0, 0); } DocumentSnapshotLine snapshotLine = snapshot.findLineFromLineNumber(line); return snapshotLine.getRegion(); } public Token getOffendingToken() { return offendingToken; } public RecognitionException getException() { return exception; } }