mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-01 06:05:24 +02:00
Relative include search paths, bug 243170.
This commit is contained in:
parent
031bf4556a
commit
88c5aa9a43
3 changed files with 67 additions and 43 deletions
|
@ -81,7 +81,7 @@ public class InclusionTests extends PreprocessorTestsBase {
|
|||
// #include "one.h"
|
||||
// #include "f1/two.h"
|
||||
// #include "f1/f2/three.h"
|
||||
public void testIncludeVariables() throws Exception {
|
||||
public void testIncludeVariables_69529() throws Exception {
|
||||
String content= getAboveComment();
|
||||
|
||||
IFolder f0 = importFolder(".framework");
|
||||
|
@ -232,4 +232,22 @@ public class InclusionTests extends PreprocessorTestsBase {
|
|||
validateEOF();
|
||||
}
|
||||
|
||||
// #include <inc/test.h>
|
||||
public void testRelativeIncludes_243170() throws Exception {
|
||||
String content= getAboveComment();
|
||||
|
||||
IFolder f0 = importFolder("f1");
|
||||
importFolder("f1/f2");
|
||||
importFolder("f1/f2/inc");
|
||||
importFile("f1/f2/inc/test.h", "1");
|
||||
IFile base = importFile("f1/base.cpp", getAboveComment());
|
||||
|
||||
String[] path = {"f2"}; // relative include
|
||||
IScannerInfo scannerInfo = new ExtendedScannerInfo(Collections.EMPTY_MAP, path, new String[]{}, null);
|
||||
CodeReader reader= new CodeReader(base.getLocation().toString());
|
||||
initializeScanner(reader, ParserLanguage.C, ParserMode.COMPLETE_PARSE, scannerInfo);
|
||||
|
||||
validateInteger("1");
|
||||
validateEOF();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2007 Intel Corporation and others.
|
||||
* Copyright (c) 2007, 2009 Intel 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
|
||||
|
@ -33,6 +33,7 @@ import org.eclipse.cdt.core.settings.model.ICProjectDescription;
|
|||
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionListener;
|
||||
import org.eclipse.cdt.core.settings.model.ICResourceDescription;
|
||||
import org.eclipse.cdt.core.settings.model.ICSettingBase;
|
||||
import org.eclipse.cdt.core.settings.model.ICSettingEntry;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.resources.IWorkspaceRoot;
|
||||
|
@ -44,7 +45,7 @@ public class DescriptionScannerInfoProvider implements IScannerInfoProvider, ICP
|
|||
private IProject fProject;
|
||||
private ICProjectDescription fProjDes;
|
||||
private ICConfigurationDescription fCfgDes;
|
||||
private Map fIdToLanguageSettingsMap = Collections.synchronizedMap(new HashMap());
|
||||
private Map<Object, IScannerInfo> fIdToLanguageSettingsMap = Collections.synchronizedMap(new HashMap<Object, IScannerInfo>());
|
||||
private String fCurrentFileDescriptionId;
|
||||
private IScannerInfo fCurrentFileScannerInfo;
|
||||
private static final ScannerInfo INEXISTENT_SCANNER_INFO = new ScannerInfo();
|
||||
|
@ -109,9 +110,9 @@ public class DescriptionScannerInfoProvider implements IScannerInfoProvider, ICP
|
|||
|
||||
IScannerInfo info;
|
||||
if(useMap)
|
||||
info = (IScannerInfo)fIdToLanguageSettingsMap.get(mapKey);
|
||||
info = fIdToLanguageSettingsMap.get(mapKey);
|
||||
else {
|
||||
if(fCurrentFileScannerInfo != null){
|
||||
if(fCurrentFileScannerInfo != null && rcDes != null){
|
||||
if(rcDes.getId().equals(fCurrentFileDescriptionId))
|
||||
info = fCurrentFileScannerInfo;
|
||||
else {
|
||||
|
@ -127,7 +128,7 @@ public class DescriptionScannerInfoProvider implements IScannerInfoProvider, ICP
|
|||
info = createScannerInfo(ls);
|
||||
if(useMap)
|
||||
fIdToLanguageSettingsMap.put(mapKey, info);
|
||||
else {
|
||||
else if (rcDes != null){
|
||||
fCurrentFileScannerInfo = info;
|
||||
fCurrentFileDescriptionId = rcDes.getId();
|
||||
}
|
||||
|
@ -144,7 +145,7 @@ public class DescriptionScannerInfoProvider implements IScannerInfoProvider, ICP
|
|||
}
|
||||
|
||||
private static ICMacroEntry[] getMacroEntries(ICLanguageSetting ls){
|
||||
ICLanguageSettingEntry entries[] = ls.getResolvedSettingEntries(ICLanguageSettingEntry.MACRO);
|
||||
ICLanguageSettingEntry entries[] = ls.getResolvedSettingEntries(ICSettingEntry.MACRO);
|
||||
ICMacroEntry macroEntries[] = new ICMacroEntry[entries.length];
|
||||
System.arraycopy(entries, 0, macroEntries, 0, entries.length);
|
||||
|
||||
|
@ -154,37 +155,37 @@ public class DescriptionScannerInfoProvider implements IScannerInfoProvider, ICP
|
|||
private IScannerInfo createProjectScannerInfo(){
|
||||
ICFolderDescription foDes = fCfgDes.getRootFolderDescription();
|
||||
ICLanguageSetting[] lSettings = foDes.getLanguageSettings();
|
||||
ICLanguageSettingPathEntry pathEntries[] = getPathEntries(lSettings, ICLanguageSettingEntry.INCLUDE_PATH);
|
||||
ICLanguageSettingPathEntry pathEntries[] = getPathEntries(lSettings, ICSettingEntry.INCLUDE_PATH);
|
||||
String incs[] = getValues(pathEntries);
|
||||
|
||||
pathEntries = getPathEntries(lSettings, ICLanguageSettingEntry.INCLUDE_FILE);
|
||||
pathEntries = getPathEntries(lSettings, ICSettingEntry.INCLUDE_FILE);
|
||||
String incFiles[] = getValues(pathEntries);
|
||||
|
||||
pathEntries = getPathEntries(lSettings, ICLanguageSettingEntry.MACRO_FILE);
|
||||
pathEntries = getPathEntries(lSettings, ICSettingEntry.MACRO_FILE);
|
||||
String macroFiles[] = getValues(pathEntries);
|
||||
|
||||
ICMacroEntry macroEntries[] = getMacroEntries(lSettings);
|
||||
Map macrosMap = getValues(macroEntries);
|
||||
Map<String, String> macrosMap = getValues(macroEntries);
|
||||
|
||||
return new ExtendedScannerInfo(macrosMap, incs, macroFiles, incFiles);
|
||||
}
|
||||
|
||||
|
||||
private ICMacroEntry[] getMacroEntries(ICLanguageSetting[] settings){
|
||||
LinkedHashSet set = getEntriesSet(ICLanguageSettingEntry.MACRO, settings);
|
||||
return (ICMacroEntry[])set.toArray(new ICMacroEntry[set.size()]);
|
||||
LinkedHashSet<ICLanguageSettingEntry> set = getEntriesSet(ICSettingEntry.MACRO, settings);
|
||||
return set.toArray(new ICMacroEntry[set.size()]);
|
||||
}
|
||||
|
||||
private ICLanguageSettingPathEntry[] getPathEntries(ICLanguageSetting[] settings, int kind){
|
||||
LinkedHashSet set = getEntriesSet(kind, settings);
|
||||
return (ICLanguageSettingPathEntry[])set.toArray(new ICLanguageSettingPathEntry[set.size()]);
|
||||
LinkedHashSet<ICLanguageSettingEntry> set = getEntriesSet(kind, settings);
|
||||
return set.toArray(new ICLanguageSettingPathEntry[set.size()]);
|
||||
}
|
||||
|
||||
private LinkedHashSet getEntriesSet(int kind, ICLanguageSetting[] settings){
|
||||
LinkedHashSet set = new LinkedHashSet();
|
||||
private LinkedHashSet<ICLanguageSettingEntry> getEntriesSet(int kind, ICLanguageSetting[] settings){
|
||||
LinkedHashSet<ICLanguageSettingEntry> set = new LinkedHashSet<ICLanguageSettingEntry>();
|
||||
ICLanguageSettingEntry[] langEntries;
|
||||
for(int i = 0; i < settings.length; i++){
|
||||
langEntries = settings[i].getResolvedSettingEntries(kind);
|
||||
for (ICLanguageSetting setting : settings) {
|
||||
langEntries = setting.getResolvedSettingEntries(kind);
|
||||
if(langEntries.length != 0){
|
||||
set.addAll(Arrays.asList(langEntries));
|
||||
}
|
||||
|
@ -196,29 +197,29 @@ public class DescriptionScannerInfoProvider implements IScannerInfoProvider, ICP
|
|||
if(ls == null)
|
||||
return createProjectScannerInfo();
|
||||
|
||||
ICLanguageSettingPathEntry pathEntries[] = getPathEntries(ls, ICLanguageSettingEntry.INCLUDE_PATH);
|
||||
ICLanguageSettingPathEntry pathEntries[] = getPathEntries(ls, ICSettingEntry.INCLUDE_PATH);
|
||||
String incs[] = getValues(pathEntries);
|
||||
|
||||
pathEntries = getPathEntries(ls, ICLanguageSettingEntry.INCLUDE_FILE);
|
||||
pathEntries = getPathEntries(ls, ICSettingEntry.INCLUDE_FILE);
|
||||
String incFiles[] = getValues(pathEntries);
|
||||
|
||||
pathEntries = getPathEntries(ls, ICLanguageSettingEntry.MACRO_FILE);
|
||||
pathEntries = getPathEntries(ls, ICSettingEntry.MACRO_FILE);
|
||||
String macroFiles[] = getValues(pathEntries);
|
||||
|
||||
ICMacroEntry macroEntries[] = getMacroEntries(ls);
|
||||
Map macrosMap = getValues(macroEntries);
|
||||
Map<String, String> macrosMap = getValues(macroEntries);
|
||||
|
||||
return new ExtendedScannerInfo(macrosMap, incs, macroFiles, incFiles);
|
||||
}
|
||||
|
||||
private Map getValues(ICMacroEntry macroEntries[]){
|
||||
Map macrosMap = new HashMap(macroEntries.length);
|
||||
private Map<String, String> getValues(ICMacroEntry macroEntries[]){
|
||||
Map<String, String> macrosMap = new HashMap<String, String>(macroEntries.length);
|
||||
String name;
|
||||
String value;
|
||||
|
||||
for(int i = 0; i < macroEntries.length; i++){
|
||||
name = macroEntries[i].getName();
|
||||
value = macroEntries[i].getValue();
|
||||
for (ICMacroEntry macroEntry : macroEntries) {
|
||||
name = macroEntry.getName();
|
||||
value = macroEntry.getValue();
|
||||
macrosMap.put(name, value);
|
||||
}
|
||||
return macrosMap;
|
||||
|
@ -228,24 +229,22 @@ public class DescriptionScannerInfoProvider implements IScannerInfoProvider, ICP
|
|||
String values[] = new String[pathEntries.length];
|
||||
IPath path;
|
||||
int num = 0;
|
||||
for(int i = 0; i < pathEntries.length; i++){
|
||||
String p = pathEntries[i].getValue();
|
||||
for (ICLanguageSettingPathEntry pathEntry : pathEntries) {
|
||||
String p = pathEntry.getValue();
|
||||
if(p == null)
|
||||
continue;
|
||||
//TODO: obtain location from pathEntries when entries are resolved
|
||||
path = new Path(p);//pathEntries[i].getLocation();
|
||||
if(pathEntries[i].isValueWorkspacePath()){
|
||||
if(pathEntry.isValueWorkspacePath()){
|
||||
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
|
||||
IResource rc = root.findMember(path);
|
||||
if(rc != null){
|
||||
path = rc.getLocation();
|
||||
}
|
||||
} else if (!path.isAbsolute()) {
|
||||
IPath projLocation = fProject != null ? fProject.getLocation() : null;
|
||||
if(projLocation != null)
|
||||
path = projLocation.append(path);
|
||||
}
|
||||
if(path != null)
|
||||
}
|
||||
// do not make paths absolute, that's the preprocessor's job and is done differently
|
||||
// depending on the entry
|
||||
if(path != null)
|
||||
values[num++] = path.toOSString();
|
||||
}
|
||||
|
||||
|
|
|
@ -203,7 +203,6 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
|
|||
fKeywords= new CharArrayIntMap(40, -1);
|
||||
fPPKeywords= new CharArrayIntMap(40, -1);
|
||||
configureKeywords(language, configuration);
|
||||
configureIncludeSearchPath(info);
|
||||
|
||||
fExpressionEvaluator= new ExpressionEvaluator();
|
||||
fMacroDefinitionParser= new MacroDefinitionParser();
|
||||
|
@ -213,9 +212,10 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
|
|||
fIncludeFileResolutionHeuristics= (IIncludeFileResolutionHeuristics) ((IAdaptable) readerFactory).getAdapter(IIncludeFileResolutionHeuristics.class);
|
||||
}
|
||||
|
||||
final String filePath= new String(reader.filename);
|
||||
configureIncludeSearchPath(new File(filePath).getParentFile(), info);
|
||||
setupMacroDictionary(configuration, info, language);
|
||||
|
||||
final String filePath= new String(reader.filename);
|
||||
fAllIncludedFiles.add(filePath);
|
||||
ILocationCtx ctx= fLocationMap.pushTranslationUnit(filePath, reader.buffer);
|
||||
fCodeReaderFactory.reportTranslationUnitFile(filePath);
|
||||
|
@ -313,7 +313,7 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
|
|||
return array == null ? EMPTY_CHAR_ARRAY : array;
|
||||
}
|
||||
|
||||
private void configureIncludeSearchPath(IScannerInfo info) {
|
||||
private void configureIncludeSearchPath(File directory, IScannerInfo info) {
|
||||
String[] searchPath= info.getIncludePaths();
|
||||
int idx= 0;
|
||||
if (info instanceof IExtendedScannerInfo) {
|
||||
|
@ -322,7 +322,7 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
|
|||
if (quoteIncludeSearchPath != null && quoteIncludeSearchPath.length > 0) {
|
||||
fIncludeSearchPath= new IncludeSearchPathElement[quoteIncludeSearchPath.length + searchPath.length];
|
||||
for (String qip : quoteIncludeSearchPath) {
|
||||
fIncludeSearchPath[idx++]= new IncludeSearchPathElement(qip, true);
|
||||
fIncludeSearchPath[idx++]= new IncludeSearchPathElement(makeAbsolute(directory, qip), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -330,11 +330,18 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
|
|||
fIncludeSearchPath= new IncludeSearchPathElement[searchPath.length];
|
||||
}
|
||||
for (String path : searchPath) {
|
||||
fIncludeSearchPath[idx++]= new IncludeSearchPathElement(path, false);
|
||||
fIncludeSearchPath[idx++]= new IncludeSearchPathElement(makeAbsolute(directory, path), false);
|
||||
}
|
||||
}
|
||||
|
||||
private void setupMacroDictionary(IScannerExtensionConfiguration config, IScannerInfo info, ParserLanguage lang) {
|
||||
private String makeAbsolute(File directory, String inlcudePath) {
|
||||
if (directory == null || new File(inlcudePath).isAbsolute()) {
|
||||
return inlcudePath;
|
||||
}
|
||||
return ScannerUtility.createReconciledPath(directory.getAbsolutePath(), inlcudePath);
|
||||
}
|
||||
|
||||
private void setupMacroDictionary(IScannerExtensionConfiguration config, IScannerInfo info, ParserLanguage lang) {
|
||||
// built in macros
|
||||
fMacroDictionary.put(__CDT_PARSER__.getNameCharArray(), __CDT_PARSER__);
|
||||
fMacroDictionary.put(__STDC__.getNameCharArray(), __STDC__);
|
||||
|
|
Loading…
Add table
Reference in a new issue