/* * Copyright 2003-2016 JetBrains s.r.o. * * 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 jetbrains.mps.textgen.trace; import jetbrains.mps.util.InternUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; import org.jetbrains.mps.openapi.model.SNodeId; import java.util.Comparator; import java.util.Objects; public abstract class PositionInfo implements Comparable<PositionInfo> { private String myFileName; private String myNodeId; private int myStartLine; private int myStartPosition; private int myEndLine; private int myEndPosition; public PositionInfo() { } @Nullable public String getFileName() { return myFileName; } @Nullable public String getNodeId() { return myNodeId; } /** * Replacement for <code>getNodeId().equals(nodePointer.getNodeId().toString())</code>. * @param nodeId tolerates null * @return <code>true</code> iff is the same as the one associated with this position. */ public boolean matches(@Nullable SNodeId nodeId) { return Objects.equals(myNodeId, nodeId == null ? null : nodeId.toString()); } public int getStartLine() { return myStartLine; } public int getStartPosition() { return myStartPosition; } public int getEndLine() { return myEndLine; } public int getEndPosition() { return myEndPosition; } public void setFileName(String fileName) { myFileName = InternUtil.intern(fileName); } public void setNodeId(@NonNls String nodeId) { myNodeId = InternUtil.intern(nodeId); } public void setStartLine(int startLine) { myStartLine = startLine; } public void setStartPosition(int startPosition) { myStartPosition = startPosition; } public void setEndLine(int endLine) { myEndLine = endLine; } public void setEndPosition(int endPosition) { myEndPosition = endPosition; } public int getLineDistance() { return myEndLine - myStartLine; } @Override public String toString() { return myFileName + "(" + myStartLine + ":" + myStartPosition + " " + myEndLine + ":" + myEndPosition + ")"; } @Override public int compareTo(PositionInfo p) { if (myFileName == null) { if (p.myFileName != null) { return 1; } } else { if (p.myFileName == null) { return -1; } int compareTo = myFileName.compareTo(p.myFileName); if (compareTo != 0) { return compareTo; } } if (getLineDistance() == p.getLineDistance()) { if (myStartLine == p.myStartLine) { if (myStartPosition == p.myStartPosition) { if (myEndPosition == p.myEndPosition) { if (myNodeId == null) { if (p.myNodeId == null) { return 0; } return -1; } if (p.myNodeId == null) { return 1; } return myNodeId.compareTo(p.myNodeId); } else { return myEndPosition - p.myEndPosition; } } else { return myStartPosition - p.myStartPosition; } } else { return myStartLine - p.myStartLine; } } else { return getLineDistance() - p.getLineDistance(); } } public boolean isOccupyTheSameSpace(PositionInfo p) { return (myStartLine == p.myStartLine) && (myEndLine == p.myEndLine) && (myStartPosition == p.myStartPosition) && (myEndPosition == p.myEndPosition); } public boolean contains(String file, int line) { return Objects.equals(myFileName, file) && myStartLine <= line && line <= myEndLine; } public boolean contains(PositionInfo position) { if (!(contains(position.getFileName(), position.getStartLine()))) { return false; } if (!(contains(position.getFileName(), position.getEndLine()))) { return false; } if (myStartLine == position.getStartLine()) { if (myStartPosition > position.getStartPosition()) { return false; } } if (myEndLine == position.getEndLine()) { if (myEndPosition > position.getEndPosition()) { return false; } } return true; } public void fillFrom(PositionInfo position) { myNodeId = position.myNodeId; myFileName = position.myFileName; myStartLine = position.myStartLine; myStartPosition = position.myStartPosition; myEndLine = position.myEndLine; myEndPosition = position.myEndPosition; } static final class StartLineComparator implements Comparator<PositionInfo> { @Override public int compare(PositionInfo p1, PositionInfo p2) { return p1.getStartLine() - p2.getStartLine(); } } }