1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

Updated handling of frameworks, bug 69529.

This commit is contained in:
Markus Schorn 2009-07-13 08:57:35 +00:00
parent e5fa863d5c
commit a75ebb1cf4
3 changed files with 27 additions and 31 deletions

View file

@ -87,16 +87,16 @@ public class InclusionTests extends PreprocessorTestsBase {
IFolder f0 = importFolder(".framework");
importFolder("f1.framework");
importFolder("f1");
importFolder("f1/f2.framework");
importFolder("f1.framework/f2");
importFolder("f3");
IFile base = importFile("base.cpp", content);
importFile(".framework/one.h", "1");
importFile("f1.framework/two.h", "2");
importFile("f1/f2.framework/three.h", "3");
importFile("f1.framework/f2/three.h", "3");
String[] path = {
f0.getLocation().removeLastSegments(1) + "/__framework__.framework/__filename__"
f0.getLocation().removeLastSegments(1) + "/__framework__.framework/__header__"
};
IScannerInfo scannerInfo = new ExtendedScannerInfo(Collections.EMPTY_MAP, path, new String[]{}, null);
CodeReader reader= new CodeReader(base.getLocation().toString());
@ -104,7 +104,7 @@ public class InclusionTests extends PreprocessorTestsBase {
// first file is not picked up (no framework)
validateInteger("2");
// third file is not picked up (framework must be a single folder)
validateInteger("3");
validateEOF();
}
@ -210,8 +210,8 @@ public class InclusionTests extends PreprocessorTestsBase {
CodeReader reader= new CodeReader(base.getLocation().toString());
ParserLanguage lang[]= {ParserLanguage.C, ParserLanguage.CPP};
for (int i = 0; i < lang.length; i++) {
initializeScanner(reader, lang[i], ParserMode.COMPLETE_PARSE, new ScannerInfo());
for (ParserLanguage element : lang) {
initializeScanner(reader, element, ParserMode.COMPLETE_PARSE, new ScannerInfo());
validateToken(IToken.t_int);
validateIdentifier("var");
validateToken(IToken.tASSIGN);

View file

@ -30,15 +30,15 @@ public interface IScannerInfo {
/**
* Returns an array of paths that are searched when processing an include directive.
* see {@link IExtendedScannerInfo#getLocalIncludePath()}
*
* <p>
* In order to handle framework includes used on Apple Computers you can make use of
* the two variables: '__framework__' and '__filename__'.
* <br> E.g.: /System/Library/Frameworks/__framework__.framework/Headers/__filename__,
* /System/Library/Frameworks/__framework__.framework/PrivateHeaders/__filename__
* the two variables: '__framework__' and '__header__'.
* <br> E.g.: /System/Library/Frameworks/__framework__.framework/Headers/__header__,
* /System/Library/Frameworks/__framework__.framework/PrivateHeaders/__header__
* would handle the framework search for '/System/Library/Frameworks'
*
* The variables are handled only, if a search path element makes use of both of the variables.
* Such a search path element is not used for directives that are not of the form 'folder/name'.
* <br> The variables are handled only, if a search path element makes use of both of the variables.
* The __framework__ variable will receive the first segment of the include, the __header__ variable
* the rest. Such a search path element is not used for directives with a single segment (e.g. 'header.h')
*/
public String[] getIncludePaths();
}

View file

@ -18,7 +18,7 @@ import java.io.File;
final class IncludeSearchPathElement {
private static final boolean NON_SLASH_SEPARATOR = File.separatorChar != '/';
public static final String FRAMEWORK_VAR = "__framework__"; //$NON-NLS-1$
public static final String FILE_VAR = "__filename__"; //$NON-NLS-1$
public static final String FILE_VAR = "__header__"; //$NON-NLS-1$
private final String fPath;
@ -42,39 +42,35 @@ final class IncludeSearchPathElement {
public String getLocation(String includeDirective) {
if (fIsFrameworkDirectory) {
int lastSep = lastSeparator(includeDirective);
if (lastSep < 0) {
int firstSep = firstSeparator(includeDirective);
if (firstSep < 1) {
return null;
}
String framework = includeDirective.substring(0, lastSep);
if (lastSeparator(framework) != -1 || framework.length() == 0) {
return null;
}
String file= includeDirective.substring(lastSep+1);
String framework = includeDirective.substring(0, firstSep);
String file= includeDirective.substring(firstSep+1);
if (file.length() == 0)
return null;
StringBuilder buf= new StringBuilder(fPath);
replaceAll(buf, FRAMEWORK_VAR, framework);
replaceAll(buf, FILE_VAR, file);
replace(buf, FRAMEWORK_VAR, framework);
replace(buf, FILE_VAR, file);
return ScannerUtility.reconcilePath(buf.toString());
}
return ScannerUtility.createReconciledPath(fPath, includeDirective);
}
private int lastSeparator(String path) {
int lastSep= path.lastIndexOf('/');
private int firstSeparator(String path) {
int firstSep= path.indexOf('/');
if (NON_SLASH_SEPARATOR) {
lastSep= Math.max(lastSep, path.lastIndexOf(File.separatorChar));
firstSep= Math.max(firstSep, path.indexOf(File.separatorChar));
}
return lastSep;
return firstSep;
}
private void replaceAll(StringBuilder buf, String find, final String replace) {
for (int idx= buf.indexOf(find); idx > 0; idx= buf.indexOf(find, idx)) {
private void replace(StringBuilder buf, String find, final String replace) {
int idx= buf.indexOf(find);
if (idx >= 0) {
buf.replace(idx, idx+find.length(), replace);
idx+= replace.length();
}
}
}