blob: 1c42668e9fee479559c1dbe5c4d97467d84b4cb5 [file] [log] [blame]
/*
* Copyright 2007 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.dev.js;
/**
* Indicates inability to parse JavaScript source.
*/
public class JsParserException extends Exception {
/**
* Represents the location of a parser exception.
*/
public static class SourceDetail {
private final String fileName;
private final int line;
private final int lineOffset;
private final String lineSource;
public SourceDetail(int line, String lineSource, int lineOffset,
String fileName) {
this.line = line;
this.lineSource = lineSource;
this.lineOffset = lineOffset;
this.fileName = fileName;
}
public String getFileName() {
return fileName;
}
public int getLine() {
return line;
}
public int getLineOffset() {
return lineOffset;
}
public String getLineSource() {
return lineSource;
}
}
private static String createMessageWithDetail(String msg,
SourceDetail sourceDetail) {
if (sourceDetail == null) {
return msg;
}
StringBuffer sb = new StringBuffer();
sb.append(sourceDetail.getFileName());
sb.append('(');
sb.append(sourceDetail.getLine());
sb.append(')');
sb.append(": ");
sb.append(msg);
if (sourceDetail.getLineSource() != null) {
sb.append("\n> ");
sb.append(sourceDetail.getLineSource());
sb.append("\n> ");
for (int i = 0, n = sourceDetail.getLineOffset(); i < n; ++i) {
sb.append('-');
}
sb.append('^');
}
return sb.toString();
}
private final SourceDetail sourceDetail;
public JsParserException(String msg) {
this(msg, null);
}
public JsParserException(String msg, int line, String lineSource,
int lineOffset, String fileName) {
this(msg, new SourceDetail(line, lineSource, lineOffset, fileName));
}
public JsParserException(String msg, SourceDetail sourceDetail) {
super(createMessageWithDetail(msg, sourceDetail));
this.sourceDetail = sourceDetail;
}
/**
* Provides additional source detail in some cases.
*
* @return additional detail regarding the error, or <code>null</code> if no
* additional detail is available
*/
public SourceDetail getSourceDetail() {
return sourceDetail;
}
}