/******************************************************************************* * Copyright (c) 2007, 2012 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: * Markus Schorn - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.core.parser.scanner; import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTImageLocation; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; /** * Information needed for computing image-locations. An image location exists for a name and * describes where the name came from. This can be: source code, macro-expansion, parameter to * macro-expansion or synthetic. * * @since 5.0 */ public abstract class ImageLocationInfo { public static final ImageLocationInfo[] NO_LOCATION_INFOS= {}; int fTokenOffsetInExpansion= -1; public abstract IASTImageLocation createLocation(LocationMap lm, ImageLocationInfo upto); public abstract boolean canConcatenate(ImageLocationInfo info); public static class MacroImageLocationInfo extends ImageLocationInfo { private final ObjectStyleMacro fMacro; private final int fOffset; private final int fEndOffset; public MacroImageLocationInfo(ObjectStyleMacro macro, int offset, int endOffset) { fMacro= macro; fOffset= offset; fEndOffset= endOffset; } @Override public IASTImageLocation createLocation(LocationMap lm, ImageLocationInfo upto) { IASTPreprocessorMacroDefinition md= lm.getMacroDefinition(fMacro); IASTFileLocation expansionLoc= md.getExpansionLocation(); if (expansionLoc != null) { final int length= ((MacroImageLocationInfo) upto).fEndOffset - fOffset; return new ASTImageLocation(IASTImageLocation.MACRO_DEFINITION, expansionLoc.getFileName(), expansionLoc.getNodeOffset() + fOffset, length); } return null; } @Override public boolean canConcatenate(ImageLocationInfo info) { if (info instanceof MacroImageLocationInfo) { MacroImageLocationInfo mli= (MacroImageLocationInfo) info; if (mli.fMacro == fMacro && fEndOffset <= mli.fOffset) { return true; } } return false; } } public static class ParameterImageLocationInfo extends ImageLocationInfo { public int fSequenceNumber; public int fSequenceEndNumber; public ParameterImageLocationInfo(int sequenceNumber, int sequenceEndNumber) { fSequenceNumber= sequenceNumber; fSequenceEndNumber= sequenceEndNumber; } @Override public IASTImageLocation createLocation(LocationMap lm, ImageLocationInfo upto) { int sequenceEnd= ((ParameterImageLocationInfo) upto).fSequenceEndNumber; IASTFileLocation loc= lm.getMappedFileLocation(fSequenceNumber, sequenceEnd - fSequenceNumber); if (loc != null) { return new ASTImageLocation(IASTImageLocation.ARGUMENT_TO_MACRO_EXPANSION, loc.getFileName(), loc.getNodeOffset(), loc.getNodeLength()); } return null; } @Override public boolean canConcatenate(ImageLocationInfo info) { if (info instanceof ParameterImageLocationInfo) { ParameterImageLocationInfo pli= (ParameterImageLocationInfo) info; if (fSequenceEndNumber <= pli.fSequenceNumber) { return true; } } return false; } } }