/* * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.flex.compiler.internal.parsing; import org.apache.flex.compiler.common.ISourceLocation; /** * This class is an implementation of the {@code ISourceFragment} interface. * It also adds the ability to split a fragment at a list of character indices * within the logical text. */ public class SourceFragment implements ISourceFragment { public SourceFragment(String physicalText, String logicalText, int physicalStart, int physicalLine, int physicalColumn) { this.physicalText = physicalText; this.logicalText = logicalText; this.physicalStart = physicalStart; this.physicalLine = physicalLine; this.physicalColumn = physicalColumn; } public SourceFragment(String physicalText, String logicalText, ISourceLocation location) { this(physicalText, logicalText, location.getStart(), location.getLine(), location.getColumn()); } public SourceFragment(String text, ISourceLocation location) { this(text, text, location); } private String physicalText; private String logicalText; private int physicalStart; private int physicalLine; private int physicalColumn; @Override public String getPhysicalText() { return physicalText; } @Override public String getLogicalText() { return logicalText; } @Override public int getPhysicalStart() { return physicalStart; } /** * Sets the physical starting offset. * <p> * This is used for mapping it from a local to an absolute offset, * when we account for include statements and source attributes. */ public void setPhysicalStart(int physicalStart) { this.physicalStart = physicalStart; } @Override public int getPhysicalLine() { return physicalLine; } @Override public int getPhysicalColumn() { return physicalColumn; } /** * Returns a subfragment from the fragment. * * @param beginIndex The beginning character index within the logical text. * * @param endIndex The ending character index within the logical txext. * * @return The resulting subfragment. */ public ISourceFragment subfragment(int beginIndex, int endIndex) { assert 0 <= beginIndex && beginIndex <= logicalText.length() : "Invalid beginIndex"; assert 0 <= endIndex && endIndex <= logicalText.length() : "Invalid endIndex"; if (beginIndex == endIndex) return null; return new SourceFragment( physicalText.substring(beginIndex, endIndex), logicalText.substring(beginIndex, endIndex), physicalStart + beginIndex, physicalLine, physicalColumn + beginIndex); } /** * For debugging only. */ @Override public String toString() { return "\"" + physicalText + "\""; } }