/******************************************************************************* * Copyright (c) 2008, 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 * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.core.parser.scanner; import java.util.List; import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDirective; import org.eclipse.cdt.core.index.IIndexFile; import org.eclipse.cdt.core.index.IIndexMacro; import org.eclipse.cdt.core.parser.FileContent; import org.eclipse.cdt.core.parser.ISignificantMacros; /** * Instructs the preprocessor on how to handle a file-inclusion. */ public class InternalFileContent extends FileContent { public enum InclusionKind { /** * Instruct the preprocessor to skip this inclusion. */ SKIP_FILE, /** * The file and its dependents are indexed, required information is read * from there. */ FOUND_IN_INDEX, /** * The file has to be scanned, source is provided. */ USE_SOURCE } public static class FileVersion { public final String fPath; public final ISignificantMacros fSigMacros; public FileVersion(String path, ISignificantMacros sig) { fPath= path; fSigMacros= sig; } } private final InclusionKind fKind; private final AbstractCharArray fSource; private final List<IIndexMacro> fMacroDefinitions; private final List<ICPPUsingDirective> fUsingDirectives; private final String fFileLocation; private final List<FileVersion> fNonPragmaOnceFiles; private boolean fHeuristic; private boolean fIsSource; private List<IIndexFile> fFiles; private IncludeSearchPathElement fFoundOnPath; private final long fTimestamp; private final long fFileSize; private final long fReadTime; /** * For skipping include files. * @param fileLocation the location of the file. * @param kind must be {@link InclusionKind#SKIP_FILE}. * @throws IllegalArgumentException if fileLocation is <code>null</code> or the kind value is illegal for * this constructor. */ public InternalFileContent(String fileLocation, InclusionKind kind) throws IllegalArgumentException { if (fileLocation == null || kind != InclusionKind.SKIP_FILE) { throw new IllegalArgumentException(); } fKind= kind; fFileLocation= fileLocation; fMacroDefinitions= null; fUsingDirectives= null; fSource= null; fNonPragmaOnceFiles= null; fTimestamp= NULL_TIMESTAMP; fFileSize= NULL_FILE_SIZE; fReadTime= 0; } /** * For reading include files from disk. * @throws IllegalArgumentException in case the codeReader or its location is <code>null</code>. */ public InternalFileContent(String filePath, AbstractCharArray content, long timestamp, long fileSize, long fileReadTime) throws IllegalArgumentException { if (content == null) { throw new IllegalArgumentException(); } fKind= InclusionKind.USE_SOURCE; fFileLocation= filePath; fSource= content; fMacroDefinitions= null; fUsingDirectives= null; fNonPragmaOnceFiles= null; if (fFileLocation == null) { throw new IllegalArgumentException(); } fTimestamp= timestamp; fFileSize= fileSize; fReadTime= fileReadTime; } /** * For reading in-memory buffers. * @throws IllegalArgumentException in case the codeReader or its location is <code>null</code>. */ public InternalFileContent(String filePath, CharArray content) throws IllegalArgumentException { if (content == null) { throw new IllegalArgumentException(); } fKind= InclusionKind.USE_SOURCE; fFileLocation= filePath; fSource= content; fMacroDefinitions= null; fUsingDirectives= null; fNonPragmaOnceFiles= null; if (fFileLocation == null) { throw new IllegalArgumentException(); } fTimestamp= NULL_TIMESTAMP; fFileSize = NULL_FILE_SIZE; fReadTime= 0; } /** * For using information about an include file from the index. * @param fileLocation the location of the file * @param macroDefinitions a list of macro definitions * @param files * @throws IllegalArgumentException in case the fileLocation or the macroDefinitions are <code>null</code>. */ public InternalFileContent(String fileLocation, List<IIndexMacro> macroDefinitions, List<ICPPUsingDirective> usingDirectives, List<IIndexFile> files, List<FileVersion> nonPragmaOnceVersions) { fKind= InclusionKind.FOUND_IN_INDEX; fFileLocation= fileLocation; fSource= null; fUsingDirectives= usingDirectives; fMacroDefinitions= macroDefinitions; fFiles= files; fNonPragmaOnceFiles= nonPragmaOnceVersions; fTimestamp= NULL_TIMESTAMP; fFileSize = NULL_FILE_SIZE; fReadTime= 0; } /** * @return the kind */ public InclusionKind getKind() { return fKind; } /** * Returns the location of the file to be included. */ @Override public String getFileLocation() { return fFileLocation; } @Override public long getTimestamp() { return fTimestamp; } @Override public long getReadTime() { return fReadTime; } @Override public long getFileSize() { return fFileSize; } @Override public long getContentsHash() { return fSource != null ? fSource.getContentsHash() : 0; } @Override public boolean hasError() { return fSource != null && fSource.hasError(); } /** * Valid with {@link InclusionKind#USE_SOURCE}. * @return the codeReader or <code>null</code> if kind is different to {@link InclusionKind#USE_SOURCE}. */ public AbstractCharArray getSource() { return fSource; } /** * Valid with {@link InclusionKind#FOUND_IN_INDEX}. * @return the macroDefinitions or <code>null</code> if kind is different to {@link InclusionKind#FOUND_IN_INDEX}. */ public List<IIndexMacro> getMacroDefinitions() { return fMacroDefinitions; } /** * Valid with {@link InclusionKind#FOUND_IN_INDEX}. * @return the usingDirectives or <code>null</code> if kind is different to {@link InclusionKind#FOUND_IN_INDEX}. */ public List<ICPPUsingDirective> getUsingDirectives() { return fUsingDirectives; } /** * Valid with {@link InclusionKind#FOUND_IN_INDEX}. * @return the files included or <code>null</code> if kind is different to {@link InclusionKind#FOUND_IN_INDEX}. */ public List<IIndexFile> getFilesIncluded() { return fFiles; } public List<FileVersion> getNonPragmaOnceVersions() { return fNonPragmaOnceFiles; } /** * Returns whether this inclusion was found by a heuristics. */ public boolean isFoundByHeuristics() { return fHeuristic; } public void setFoundByHeuristics(boolean val) { fHeuristic= val; } public boolean isSource() { return fIsSource; } public void setIsSource(boolean isSource) { fIsSource= isSource; } public IncludeSearchPathElement getFoundOnPath() { return fFoundOnPath; } public void setFoundOnPath(IncludeSearchPathElement isp) { fFoundOnPath= isp; } /** * This method is slow. Use only for debugging. */ @Override public String toString() { return getSource().toString(); } }