/******************************************************************************* * Copyright (c) 2004, 2010 IBM Corporation 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: * IBM Rational Software - Initial API and implementation * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.corext.util; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICContainer; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICModelStatus; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ISourceRoot; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.IWorkingCopy; import org.eclipse.cdt.internal.ui.util.EditorUtility; public class CModelUtil { /** * Returns the working copy TU of the given TU. If the TU is already a * working copy or the TU has no working copy the input TU is returned. */ public static ITranslationUnit toWorkingCopy(ITranslationUnit unit) { if (!unit.isWorkingCopy()) { ITranslationUnit workingCopy= EditorUtility.getWorkingCopy(unit); if (workingCopy != null) { return workingCopy; } } return unit; } public static ITranslationUnit toOriginal(ITranslationUnit unit) { if (unit.isWorkingCopy()) { return (((IWorkingCopy) unit).getOriginalElement()); } return unit; } /** * Returns the source root of <code>ICElement</code>. If the given * element is already a source root, the element itself is returned. */ public static ISourceRoot getSourceRoot(ICElement element) { ICElement root = element; while (root != null) { if (root instanceof ISourceRoot) return (ISourceRoot)root; ICElement parent = root.getAncestor(ICElement.C_CCONTAINER); if (parent == root) return null; root = parent; } return null; } /** * Returns the source folder of <code>ICElement</code>. If the given * element is already a source folder, the element itself is returned. */ public static ICContainer getSourceFolder(ICElement element) { ICContainer folder = null; if (element != null) { ICElement curr = element; while (curr != null && !(curr instanceof ISourceRoot)) { curr = curr.getParent(); } folder = (ISourceRoot)curr; if (folder == null) { ICProject cproject = element.getCProject(); folder = cproject.findSourceRoot(cproject.getProject()); } } return folder; } /** * Returns <code>true</code> if the given source root is * referenced. This means it is own by a different project but is referenced * by the root's parent. Returns <code>false</code> if the given root * doesn't have an underlying resource. */ public static boolean isReferenced(ISourceRoot root) { IResource resource= root.getResource(); if (resource != null) { IProject project= resource.getProject(); IProject container= root.getCProject().getProject(); return !container.equals(project); } return false; } /** * Returns the translation unit the element belongs to or <code>null</code> if it does not. */ public static ITranslationUnit getTranslationUnit(ICElement elem) { while (elem != null) { if (elem instanceof ITranslationUnit) { return (ITranslationUnit) elem; } elem= elem.getParent(); } return null; } /* * Don't log not-exists exceptions */ public static boolean isExceptionToBeLogged(CoreException exception) { if (!(exception instanceof CModelException)) return true; CModelException ce= (CModelException)exception; ICModelStatus status = ce.getCModelStatus(); if (status == null || !status.doesNotExist()) return true; return false; } }