| /******************************************************************************* |
| * Copyright (c) 2007, 2008 Wind River Systems, Inc. and others. |
| * 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: |
| * UIUC - Photran modifications |
| * Markus Schorn - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.photran.internal.core.preprocessor.c; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| |
| import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; |
| import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit.IDependencyTree.IASTInclusionNode; |
| |
| /** |
| * Various location contexts which are suitable for interpreting local offsets. These offsets are |
| * converted in a global sequence-number to make all ast nodes comparable with each other. |
| * @since 5.0 |
| */ |
| abstract class LocationCtx implements ILocationCtx { |
| final LocationCtxContainer fParent; |
| /** |
| * The first sequence number used by this context. |
| */ |
| final int fSequenceNumber; |
| /** |
| * The offset of the denotation of this context in the parent's source. This is no sequence number. |
| */ |
| final int fOffsetInParent; |
| /** |
| * The end-offset of the denotation of this context in the parent's source. This is no sequence number. |
| */ |
| final int fEndOffsetInParent; |
| |
| public LocationCtx(LocationCtxContainer parent, int parentOffset, int parentEndOffset, int sequenceNumber) { |
| fParent= parent; |
| fOffsetInParent= parentOffset; |
| fEndOffsetInParent= parentEndOffset; |
| fSequenceNumber= sequenceNumber; |
| if (parent != null) { |
| parent.addChild(this); |
| } |
| } |
| |
| public String getFilePath() { |
| return fParent.getFilePath(); |
| } |
| |
| final public ILocationCtx getParent() { |
| return fParent; |
| } |
| /** |
| * Returns the amount of sequence numbers occupied by this context including its children. |
| */ |
| public abstract int getSequenceLength(); |
| |
| /** |
| * Converts an offset within this context to the sequence number. In case there are child-contexts |
| * behind the given offset, you need to set checkChildren to <code>true</code>. |
| */ |
| public int getSequenceNumberForOffset(int offset, boolean checkChildren) { |
| return fSequenceNumber+offset; |
| } |
| |
| /** |
| * When a child-context is finished it reports its total sequence length, such that offsets in this |
| * context can be converted to sequence numbers. |
| */ |
| public void addChildSequenceLength(int childLength) { |
| assert false; |
| } |
| |
| /** |
| * Returns the line number for an offset within this context. Not all contexts support line numbers, |
| * so this may return 0. |
| */ |
| public int getLineNumber(int offset) { |
| return 0; |
| } |
| |
| /** |
| * Returns the minimal context containing the specified range, assuming that it is contained in |
| * this context. |
| */ |
| public LocationCtx findSurroundingContext(int sequenceNumber, int length) { |
| return this; |
| } |
| |
| /** |
| * Returns the macro-expansion surrounding or augmenting the given range, or <code>null</code>. |
| */ |
| public LocationCtxMacroExpansion findEnclosingMacroExpansion(int sequenceNumber, int length) { |
| return null; |
| } |
| |
| /** |
| * Returns the minimal file location containing the specified sequence number range, assuming |
| * that it is contained in this context. |
| */ |
| public ASTFileLocation findMappedFileLocation(int sequenceNumber, int length) { |
| return fParent.createMappedFileLocation(fOffsetInParent, fEndOffsetInParent-fOffsetInParent); |
| } |
| |
| /** |
| * Returns the file location containing the specified offset range in this context. |
| */ |
| public ASTFileLocation createMappedFileLocation(int offset, int length) { |
| return fParent.createMappedFileLocation(fOffsetInParent, fEndOffsetInParent-fOffsetInParent); |
| } |
| |
| /** |
| * Returns the sequence of file locations spanning the given range. |
| * Assumes that the range starts within this context. |
| */ |
| public abstract boolean collectLocations(int sequenceNumber, int length, ArrayList<IASTNodeLocation> sofar); |
| |
| /** |
| * Support for the dependency tree, add inclusion statements found in this context. |
| */ |
| public void getInclusions(ArrayList<IASTInclusionNode> result) { |
| } |
| |
| /** |
| * Support for the dependency tree, returns inclusion statement that created this context, or <code>null</code>. |
| */ |
| public ASTInclusionStatement getInclusionStatement() { |
| return null; |
| } |
| |
| public Collection<LocationCtx> getChildren() { |
| return Collections.emptySet(); |
| } |
| } |