/******************************************************************************* * Copyright (c) 2007, 2009 Wind River Systems 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: * Wind River Systems - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.dsf.debug.internal.ui.disassembly.presentation; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ISourceReference; /** * A source tag based on C Model elements. */ public class CSourceTag implements ISourceTag { /** * The zero-length source range. */ public class NullRange implements ISourceRange { public boolean contains(int offset) { return false; } public int getBeginOffset() { return 0; } public int getEndOffset() { return -1; } public int compareTo(ISourceRange other) { if (this == other) { return 0; } return -1; } } /** * The source range. */ public class CSourceRange implements ISourceRange { private org.eclipse.cdt.core.model.ISourceRange fRange; /** * @param sourceRange */ public CSourceRange(org.eclipse.cdt.core.model.ISourceRange sourceRange) { fRange= sourceRange; } public boolean contains(int offset) { return fRange.getStartPos() <= offset && offset - fRange.getStartPos() < fRange.getLength(); } public int getBeginOffset() { return fRange.getStartPos(); } public int getEndOffset() { return fRange.getStartPos() + fRange.getLength() - 1; } public int compareTo(ISourceRange other) { int delta= this.getBeginOffset() - other.getBeginOffset(); if (delta == 0) { delta= this.getEndOffset() - other.getEndOffset(); } return delta; } } /** * The identifier range. */ public class CIdentifierRange implements ISourceRange { private org.eclipse.cdt.core.model.ISourceRange fRange; public CIdentifierRange(org.eclipse.cdt.core.model.ISourceRange sourceRange) { fRange= sourceRange; } public boolean contains(int offset) { return fRange.getIdStartPos() <= offset && offset - fRange.getIdStartPos() < fRange.getIdLength(); } public int getBeginOffset() { return fRange.getIdStartPos(); } public int getEndOffset() { return fRange.getIdStartPos() + fRange.getIdLength() - 1; } public int compareTo(ISourceRange other) { int delta= this.getBeginOffset() - other.getBeginOffset(); if (delta == 0) { delta= this.getEndOffset() - other.getEndOffset(); } return delta; } } private ISourceReference fReference; private int fType; /** * Create a new source tag for the given element and type. * * @param element * @param elementType */ public CSourceTag(ISourceReference element, int elementType) { fReference= element; fType= elementType; } public ISourceRange getFullRange() { try { return new CSourceRange(fReference.getSourceRange()); } catch (CModelException e) { } return new NullRange(); } public String getName() { return ((ICElement)fReference).getElementName(); } public String getQualifiedName() { return getName(); } public ISourceRange getRangeOfIdentifier() { try { return new CIdentifierRange(fReference.getSourceRange()); } catch (CModelException e) { } return new NullRange(); } public long getSnapshotTime() { return 0; } public int getStyleCode() { switch (fType) { case ICElement.C_METHOD : case ICElement.C_METHOD_DECLARATION: case ICElement.C_TEMPLATE_METHOD: case ICElement.C_TEMPLATE_METHOD_DECLARATION: return ISourceTag.STYLE_Method; case ICElement.C_FUNCTION: case ICElement.C_FUNCTION_DECLARATION: case ICElement.C_TEMPLATE_FUNCTION: case ICElement.C_TEMPLATE_FUNCTION_DECLARATION: return ISourceTag.STYLE_Function; case ICElement.C_FIELD : return ISourceTag.STYLE_MemberVariable; case ICElement.C_VARIABLE: case ICElement.C_VARIABLE_DECLARATION: return ISourceTag.STYLE_Variable; case ICElement.C_CLASS: case ICElement.C_TEMPLATE_CLASS: case ICElement.C_TEMPLATE_CLASS_DECLARATION: return ISourceTag.STYLE_Class; case ICElement.C_STRUCT: case ICElement.C_TEMPLATE_STRUCT: case ICElement.C_TEMPLATE_STRUCT_DECLARATION: return ISourceTag.STYLE_Struct; case ICElement.C_UNION: case ICElement.C_TEMPLATE_UNION: case ICElement.C_TEMPLATE_UNION_DECLARATION: return ISourceTag.STYLE_Union; case ICElement.C_ENUMERATION: return ISourceTag.STYLE_Enumeration; case ICElement.C_ENUMERATOR: return ISourceTag.STYLE_Enumerator; case ICElement.C_NAMESPACE: return ISourceTag.STYLE_None; case ICElement.C_TYPEDEF: return ISourceTag.STYLE_Typedef; case ICElement.C_MACRO: return ISourceTag.STYLE_Macro; default: return ISourceTag.STYLE_None; } } public ISourceTag getSourceTagAdapter() { return this; } }