141 lines
4.2 KiB
Java
141 lines
4.2 KiB
Java
/*******************************************************************************
|
|
* Copyright (c) 2013 IBM Corporation.
|
|
* 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
|
|
*
|
|
* Contributors:
|
|
* IBM Corporation - initial API and implementation
|
|
*******************************************************************************/
|
|
package com.ibm.wala.cast.js.html;
|
|
|
|
import java.io.IOException;
|
|
import java.io.InputStreamReader;
|
|
import java.io.Reader;
|
|
import java.net.URL;
|
|
|
|
import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position;
|
|
import com.ibm.wala.cast.tree.impl.AbstractSourcePosition;
|
|
|
|
public class RangeFileMapping implements FileMapping {
|
|
|
|
public final static class Range {
|
|
private final int rangeStart;
|
|
private final int rangeEnd;
|
|
private final int rangeStartingLine;
|
|
private final int rangeEndingLine;
|
|
|
|
public boolean includes(Position offset) {
|
|
return
|
|
offset.getFirstOffset() != -1?
|
|
rangeStart <= offset.getFirstOffset() && offset.getLastOffset() <= rangeEnd:
|
|
rangeStartingLine <= offset.getFirstLine() &&
|
|
(offset.getLastLine() == -1? offset.getFirstLine(): offset.getLastLine()) <= rangeEndingLine;
|
|
}
|
|
|
|
public Range(int rangeStart, int rangeEnd, int rangeStartingLine, int rangeEndingLine) {
|
|
super();
|
|
this.rangeStart = rangeStart;
|
|
this.rangeEnd = rangeEnd;
|
|
this.rangeStartingLine = rangeStartingLine;
|
|
this.rangeEndingLine = rangeEndingLine;
|
|
}
|
|
|
|
public int getStart() {
|
|
return rangeStart;
|
|
}
|
|
|
|
public int getEnd() {
|
|
return rangeEnd;
|
|
}
|
|
|
|
public int getStartingLine() {
|
|
return rangeStartingLine;
|
|
}
|
|
|
|
public int getEndingLine() {
|
|
return rangeEndingLine;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return "{"+rangeStart+"->"+rangeEnd+"}";
|
|
}
|
|
}
|
|
|
|
private final Range range;
|
|
private final URL includedURL;
|
|
private final Position includePosition;
|
|
|
|
public RangeFileMapping(int rangeStart, int rangeEnd, int rangeStartingLine, int rangeEndingLine, Position parentPosition, URL url) {
|
|
assert parentPosition != null;
|
|
this.range = new Range(rangeStart, rangeEnd, rangeStartingLine, rangeEndingLine);
|
|
this.includePosition = parentPosition;
|
|
includedURL = url;
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return range + ":" + includePosition;
|
|
}
|
|
|
|
@Override
|
|
public IncludedPosition getIncludedPosition(final Position offset) {
|
|
if (range.includes(offset)) {
|
|
class Pos extends AbstractSourcePosition implements IncludedPosition {
|
|
@Override
|
|
public int getFirstLine() {
|
|
// line numbers are decreed to start at 1, rather than 0
|
|
return offset.getFirstLine() - range.getStartingLine() + 1;
|
|
}
|
|
@Override
|
|
public int getLastLine() {
|
|
return offset.getLastLine() == -1? -1: offset.getLastLine()-range.getStartingLine()+1;
|
|
}
|
|
@Override
|
|
public int getFirstCol() {
|
|
return offset.getFirstCol();
|
|
}
|
|
@Override
|
|
public int getLastCol() {
|
|
return offset.getLastCol();
|
|
}
|
|
@Override
|
|
public int getFirstOffset() {
|
|
return offset.getFirstOffset() == -1? -1: offset.getFirstOffset()-range.getStart();
|
|
}
|
|
@Override
|
|
public int getLastOffset() {
|
|
return offset.getLastOffset() == -1? -1: offset.getLastOffset()-range.getStart();
|
|
}
|
|
@Override
|
|
public URL getURL() {
|
|
return includedURL;
|
|
}
|
|
@Override
|
|
public Reader getReader() throws IOException {
|
|
return RangeFileMapping.this.getInputStream();
|
|
}
|
|
@Override
|
|
public Position getIncludePosition() {
|
|
return includePosition;
|
|
}
|
|
@Override
|
|
public String toString() {
|
|
return "[include:"+includePosition+"]"+super.toString();
|
|
}
|
|
}
|
|
|
|
return new Pos();
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public Reader getInputStream() throws IOException {
|
|
return new InputStreamReader(includedURL.openStream());
|
|
}
|
|
|
|
}
|