1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-06 17:26:01 +02:00

JavaDoc and clean-up

This commit is contained in:
Andrew Gvozdev 2012-04-07 07:27:58 -04:00
parent 6411690b76
commit 58721c65b9
21 changed files with 954 additions and 565 deletions

View file

@ -13,6 +13,9 @@ package org.eclipse.cdt.managedbuilder.language.settings.providers.tests;
import junit.framework.TestSuite;
/**
* Test suite to test language settings providers defined in cdt.managedbuilder.core.
*/
public class AllLanguageSettingsProvidersMBSTests extends TestSuite {
public static TestSuite suite() {

View file

@ -44,6 +44,9 @@ import org.eclipse.core.runtime.jobs.Job;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* Test cases to test built-in specs detectors.
*/
public class BuiltinSpecsDetectorTest extends BaseTestCase {
private static final String PROVIDER_ID = "provider.id";
private static final String PROVIDER_NAME = "provider name";
@ -56,6 +59,9 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
private static final String ATTR_PARAMETER = "parameter"; //$NON-NLS-1$
private static final String ATTR_CONSOLE = "console"; //$NON-NLS-1$
/**
* Mock built-in specs detector to test basic functionality of {@link AbstractBuiltinSpecsDetector}.
*/
private class MockBuiltinSpecsDetector extends AbstractBuiltinSpecsDetector {
@Override
protected List<String> parseOptions(String line) {
@ -80,6 +86,9 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
}
}
/**
* Mock built-in specs detector to test execute() functionality.
*/
private class MockBuiltinSpecsDetectorExecutedFlag extends AbstractBuiltinSpecsDetector {
@Override
protected List<String> parseOptions(String line) {
@ -103,6 +112,9 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
}
}
/**
* Mock built-in specs detector to test parsing functionality.
*/
private class MockConsoleBuiltinSpecsDetector extends AbstractBuiltinSpecsDetector {
@SuppressWarnings("nls")
private final AbstractOptionParser[] optionParsers = {
@ -148,6 +160,9 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
super.tearDown();
}
/**
* Helper method to fetch configuration descriptions.
*/
private ICConfigurationDescription[] getConfigurationDescriptions(IProject project) {
CoreModel coreModel = CoreModel.getDefault();
ICProjectDescriptionManager mngr = coreModel.getProjectDescriptionManager();
@ -160,6 +175,9 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
return cfgDescriptions;
}
/**
* Test configure, getters and setters.
*/
public void testAbstractBuiltinSpecsDetector_GettersSetters() throws Exception {
{
// provider configured with null parameters
@ -206,6 +224,9 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
}
}
/**
* Test clone() and equals().
*/
public void testAbstractBuiltinSpecsDetector_CloneAndEquals() throws Exception {
// define mock detector
class MockDetectorCloneable extends MockBuiltinSpecsDetectorExecutedFlag implements Cloneable {
@ -302,8 +323,9 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
}
/**
* Test basic serialization functionality.
*/
public void testAbstractBuiltinSpecsDetector_Serialize() throws Exception {
public void testAbstractBuiltinSpecsDetector_SerializeDOM() throws Exception {
{
// create empty XML
Document doc = XmlUtil.newDocument();
@ -344,6 +366,9 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
}
}
/**
* Smoke test exercising passing {@code null} to the functions.
*/
public void testAbstractBuiltinSpecsDetector_Nulls() throws Exception {
{
// test AbstractBuiltinSpecsDetector.processLine(...) flow
@ -363,6 +388,9 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
}
}
/**
* Test basic parsing functionality.
*/
public void testAbstractBuiltinSpecsDetector_RunConfiguration() throws Exception {
// Create model project and accompanied descriptions
String projectName = getName();
@ -373,6 +401,7 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
MockConsoleBuiltinSpecsDetector provider = new MockConsoleBuiltinSpecsDetector();
provider.setLanguageScope(new ArrayList<String>() {{add(LANGUAGE_ID);}});
// Run provider
provider.startup(cfgDescription, null);
provider.runForEachLanguage(null);
provider.shutdown();
@ -382,26 +411,36 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
List<ICLanguageSettingEntry> noentries = provider.getSettingEntries(null, null, null);
assertNull(noentries);
// Check parsed entries
List<ICLanguageSettingEntry> entries = provider.getSettingEntries(cfgDescription, null, LANGUAGE_ID);
ICLanguageSettingEntry expected = new CMacroEntry("MACRO", "VALUE", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
assertEquals(expected, entries.get(0));
}
/**
* Smoke test running as global provider on workspace level.
*/
public void testAbstractBuiltinSpecsDetector_RunGlobal() throws Exception {
// Create provider
MockConsoleBuiltinSpecsDetector provider = new MockConsoleBuiltinSpecsDetector();
provider.setLanguageScope(new ArrayList<String>() {{add(LANGUAGE_ID);}});
// Run provider
provider.startup(null, null);
provider.runForEachLanguage(null);
provider.shutdown();
assertFalse(provider.isEmpty());
// Check parsed entries
List<ICLanguageSettingEntry> entries = provider.getSettingEntries(null, null, LANGUAGE_ID);
ICLanguageSettingEntry expected = new CMacroEntry("MACRO", "VALUE", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
assertEquals(expected, entries.get(0));
}
/**
* Check that entries get grouped by kinds by stock built-in specs detector.
*/
public void testAbstractBuiltinSpecsDetector_GroupSettings() throws Exception {
// define benchmarks
final CIncludePathEntry includePath_1 = new CIncludePathEntry("/include/path_1", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY);
@ -448,7 +487,7 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase {
// compare benchmarks, expected well-sorted
List<ICLanguageSettingEntry> entries = provider.getSettingEntries(null, null, null);
int i=0;
int i = 0;
assertEquals(includePath_1, entries.get(i++));
assertEquals(includePath_2, entries.get(i++));
assertEquals(includeFile_1, entries.get(i++));

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2009, 2011 Andrew Gvozdev and others.
* Copyright (c) 2009, 2012 Andrew Gvozdev 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
@ -54,6 +54,9 @@ import org.eclipse.core.runtime.jobs.Job;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* Test cases to test build command parsers.
*/
public class GCCBuildCommandParserTest extends BaseTestCase {
// ID of the parser taken from the extension point
private static final String GCC_BUILD_COMMAND_PARSER_EXT = "org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"; //$NON-NLS-1$
@ -70,6 +73,9 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
private static final String ATTR_PARAMETER = "parameter"; //$NON-NLS-1$
private static final String ATTR_KEEP_RELATIVE_PATHS = "keep-relative-paths"; //$NON-NLS-1$
/**
* Mock build command parser.
*/
private class MockBuildCommandParser extends AbstractBuildCommandParser implements Cloneable {
@Override
protected AbstractOptionParser[] getOptionParsers() {
@ -100,6 +106,9 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
super.tearDown();
}
/**
* Helper method to fetch configuration descriptions.
*/
private ICConfigurationDescription[] getConfigurationDescriptions(IProject project) {
CoreModel coreModel = CoreModel.getDefault();
ICProjectDescriptionManager mngr = coreModel.getProjectDescriptionManager();
@ -139,6 +148,9 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
}
/**
* Helper method to set reference project.
*/
private void setReference(IProject project, final IProject projectReferenced) throws CoreException {
{
CoreModel coreModel = CoreModel.getDefault();
@ -169,6 +181,9 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test getters and setters.
*/
public void testAbstractBuildCommandParser_GettersSetters() throws Exception {
{
// provider configured with null parameters
@ -206,6 +221,9 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
}
/**
* Test clone() and equals().
*/
public void testAbstractBuildCommandParser_CloneAndEquals() throws Exception {
// create instance to compare to
MockBuildCommandParser parser = new MockBuildCommandParser();
@ -242,7 +260,10 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
public void testAbstractBuildCommandParser_Serialize() throws Exception {
/**
* Test basic serialization functionality.
*/
public void testAbstractBuildCommandParser_SerializeDOM() throws Exception {
{
// create empty XML
Document doc = XmlUtil.newDocument();
@ -283,6 +304,9 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
}
/**
* Smoke test exercising passing {@code null} to the functions.
*/
public void testAbstractBuildCommandParser_Nulls() throws Exception {
MockBuildCommandParser parser = new MockBuildCommandParser();
parser.startup(null, null);
@ -293,6 +317,9 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
assertNull(entries);
}
/**
* Test basic parsing functionality.
*/
public void testAbstractBuildCommandParser_Basic() throws Exception {
// Create model project and accompanied descriptions
String projectName = getName();
@ -333,17 +360,8 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
assertEquals(expected, entries.get(0));
}
// public void testGCCBuildCommandParser_Nulls() throws Exception {
// GCCBuildCommandParser parser = (GCCBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(GCC_BUILD_COMMAND_PARSER_EXT);
// parser.startup(null);
// parser.processLine(null);
// parser.shutdown();
//
// List<ICLanguageSettingEntry> entries = parser.getSettingEntries(null, null, null);
// assertNull(entries);
// }
/**
* Test parsing of one typical entry.
*/
public void testOneEntry() throws Exception {
// Create model project and accompanied descriptions
@ -379,6 +397,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test possible variations of compiler command.
*/
public void testGccFlavors() throws Exception {
// Create model project and accompanied descriptions
@ -450,6 +469,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Parse variations of -I options.
*/
public void testCIncludePathEntry() throws Exception {
// Create model project and accompanied descriptions
@ -522,6 +542,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Parse variations of -D options.
*/
public void testCMacroEntry() throws Exception {
// Create model project and accompanied descriptions
@ -600,6 +621,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Parse -U option.
*/
public void testCMacroEntry_undef() throws Exception {
// Create model project and accompanied descriptions
@ -630,6 +652,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Parse variations of -include options.
*/
public void testCIncludeFileEntry() throws Exception {
// Create model project and accompanied descriptions
@ -681,6 +704,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Parse variations of -macros options.
*/
public void testCMacroFileEntry() throws Exception {
// Create model project and accompanied descriptions
@ -726,6 +750,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Parse variations of -L options.
*/
public void testCLibraryPathEntry() throws Exception {
// Create model project and accompanied descriptions
@ -770,6 +795,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Parse variations of -l options.
*/
public void testCLibraryFileEntry() throws Exception {
// Create model project and accompanied descriptions
@ -802,6 +828,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Parse mixed options in the same command.
*/
public void testMixedSettingEntries() throws Exception {
// Create model project and accompanied descriptions
@ -856,6 +883,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Parse command where resource is missing.
*/
public void testFileMissing() throws Exception {
// Create model project and accompanied descriptions
@ -877,6 +905,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Parsing of absolute path to the file being compiled.
*/
public void testFileAbsolutePath() throws Exception {
// Create model project and accompanied descriptions
@ -910,6 +939,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Parsing of absolute path to the file being compiled where provider is global.
*/
public void testFileAbsolutePath_NoProject() throws Exception {
// Create model project and accompanied descriptions
@ -943,6 +973,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Parsing where the name of the file being compiled contains spaces.
*/
public void testFileWithSpaces() throws Exception {
// Create model project and accompanied descriptions
@ -998,6 +1029,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Resolve disagreement between working directory and path to the file being compiled.
*/
public void testFileIgnoreWrongBuildDir() throws Exception {
// Create model project and accompanied descriptions
@ -1015,6 +1047,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
GCCBuildCommandParser parser = (GCCBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(GCC_BUILD_COMMAND_PARSER_EXT, true);
ErrorParserManager epm = new ErrorParserManager(project, null);
// Shift build directory, that could happen if Make Target from folder1 was run
// Build directory points to /project/Folder1/
IFolder buildDir = folder1;
epm.pushDirectoryURI(buildDir.getLocationURI());
@ -1023,6 +1056,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
parser.processLine("gcc "
+ "-I/path0 "
+ "-I. "
// This implies the build working directory is /project/
+ "Folder1/Folder2/file.cpp");
parser.shutdown();
@ -1037,6 +1071,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test various ends of lines for the lines being parsed.
*/
public void testEndOfLine() throws Exception {
// Create model project and accompanied descriptions
@ -1084,6 +1119,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test parsing of paths located on a different drive on Windows.
*/
public void testPathEntry_DriveLetter() throws Exception {
// do not test on non-windows systems where drive letters are not supported
@ -1117,6 +1153,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test various relative paths provided in options with resolving.
*/
public void testPathEntry_ExpandRelativePath() throws Exception {
// Create model project and accompanied descriptions
@ -1157,6 +1194,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test various relative paths provided in options without resolving.
*/
public void testPathEntry_DoNotExpandRelativePath() throws Exception {
// Create model project and accompanied descriptions
@ -1194,6 +1232,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Ensure that duplicate paths are ignored.
*/
public void testPathEntry_DuplicatePath() throws Exception {
// Create model project and accompanied descriptions
@ -1228,6 +1267,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test that working directory supplied by ErrorParserManager is considered.
*/
public void testPathEntry_FollowCWD() throws Exception {
// Create model project and accompanied descriptions
@ -1247,6 +1287,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
// create GCCBuildCommandParser
GCCBuildCommandParser parser = (GCCBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(GCC_BUILD_COMMAND_PARSER_EXT, true);
ErrorParserManager epm = new ErrorParserManager(project, null);
// Set different working directory
epm.pushDirectoryURI(buildDir.getLocationURI());
// parse line
@ -1272,6 +1313,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Determine working directory basing on file being compiled.
*/
public void testPathEntry_GuessCWD() throws Exception {
// Create model project and accompanied descriptions
@ -1303,6 +1345,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test case when build command indicates impossible working directory.
*/
public void testPathEntry_NonExistentCWD_Workspace() throws Exception {
// Create model project and accompanied descriptions
@ -1320,6 +1363,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
GCCBuildCommandParser parser = (GCCBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(GCC_BUILD_COMMAND_PARSER_EXT, true);
ErrorParserManager epm = new ErrorParserManager(project, null);
// define working directory
epm.pushDirectoryURI(buildDir.getLocationURI());
// parse line
@ -1328,6 +1372,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
+ " -I."
+ " -I.."
+ " -IFolder"
// indicates non-existing working directory
+ " ../file.cpp");
parser.shutdown();
@ -1341,6 +1386,8 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test case when build command indicates impossible working directory and
* ErrorParserManager indicates non-existing working directory.
*/
public void testPathEntry_NonExistentCWD_Filesystem() throws Exception {
// Create model project and accompanied descriptions
@ -1358,6 +1405,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
ErrorParserManager epm = new ErrorParserManager(project, null);
URI uriBuildDir = new URI("file:/non-existing/path");
// define non-existing working directory
epm.pushDirectoryURI(uriBuildDir);
// parse line
@ -1366,6 +1414,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
+ " -I."
+ " -I.."
+ " -IFolder"
// indicates non-existing working directory
+ " ../file.cpp");
parser.shutdown();
@ -1380,6 +1429,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Simulate mapping of a sub-folder in the project to remote URI.
*/
public void testPathEntry_MappedRemoteFolder() throws Exception {
// Create model project and accompanied descriptions
@ -1399,6 +1449,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
GCCBuildCommandParser parser = (GCCBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(GCC_BUILD_COMMAND_PARSER_EXT, true);
ErrorParserManager epm = new ErrorParserManager(project, null);
// define working directory as URI pointing outside workspace
URI uriBuildDir = new URI("file:/BuildDir");
epm.pushDirectoryURI(uriBuildDir);
@ -1425,6 +1476,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test mapping folders heuristics - inside a project.
*/
public void testPathEntry_MappedFolderInProject() throws Exception {
// Create model project and accompanied descriptions
@ -1475,6 +1527,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test mapping folders heuristics - mapping to another project.
*/
public void testPathEntry_MappedFolderInAnotherProject() throws Exception {
// Create model project and accompanied descriptions
@ -1526,6 +1579,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test mapping folders heuristics - mapping to a referenced project.
*/
public void testPathEntry_MappedFolderInReferencedProject() throws Exception {
// Create model project and accompanied descriptions
@ -1579,6 +1633,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test ".." in symbolic links where the symbolic link is present as absolute path.
*/
public void testPathEntry_NavigateSymbolicLinkUpAbsolute() throws Exception {
// do not test on systems where symbolic links are not supported
@ -1619,6 +1674,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test ".." in symbolic links where the symbolic link is present as relative path.
*/
public void testPathEntry_NavigateSymbolicLinkUpRelative() throws Exception {
// do not test on systems where symbolic links are not supported
@ -1659,6 +1715,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Determine working directory from configuration builder settings.
*/
public void testPathEntry_BuildDirDefinedByConfiguration_RelativePath() throws Exception {
// Create model project and accompanied descriptions
@ -1702,6 +1759,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test where working directory from command line disagrees with configuration builder settings.
*/
public void testPathEntry_BuildDirDefinedByConfiguration_AbsolutePath() throws Exception {
// Create model project and accompanied descriptions
@ -1746,6 +1804,9 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Smoke test when non-C files appear in output, should not choke.
*/
public void testContentType_None() throws Exception {
MockBuildCommandParser parser = new MockBuildCommandParser() {
@Override
@ -1762,6 +1823,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test that unsupported language is ignored.
*/
public void testContentType_Mismatch() throws Exception {
// Create model project and accompanied descriptions
@ -1785,6 +1847,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test custom file extensions defined in content type.
*/
public void testContentType_FileExtensions() throws Exception {
// Create model project and accompanied descriptions
@ -1824,6 +1887,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test filenames appearing in upper-case.
*/
public void testUpperCase() throws Exception {
// Create model project and accompanied descriptions
@ -1855,6 +1919,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test sample output of boost builder utility bjam.
*/
public void testBoostBjam() throws Exception {
// Create model project and accompanied descriptions
@ -1897,6 +1962,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test resource file residing on EFS file-system.
*/
public void testPathEntry_Efs() throws Exception {
// Create model project and accompanied descriptions
@ -1935,6 +2001,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase {
}
/**
* Test mapping entries to EFS.
*/
public void testPathEntry_EfsMappedFolder() throws Exception {
// Create model project and accompanied descriptions

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2010, 2011 Andrew Gvozdev and others.
* Copyright (c) 2010, 2012 Andrew Gvozdev 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
@ -24,6 +24,7 @@ import org.eclipse.cdt.core.settings.model.ICProjectDescriptionManager;
import org.eclipse.cdt.core.settings.model.ICSettingEntry;
import org.eclipse.cdt.core.testplugin.ResourceHelper;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.internal.core.Cygwin;
import org.eclipse.cdt.managedbuilder.internal.language.settings.providers.GCCBuiltinSpecsDetectorCygwin;
import org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector;
import org.eclipse.core.resources.IProject;
@ -31,9 +32,15 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
/**
* Test cases to test GCC built-in specs detector.
*/
public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
private static final String LANGUAGE_ID_C = GCCLanguage.ID;
/**
* Mock GCCBuiltinSpecsDetector to gain access to protected methods.
*/
class MockGCCBuiltinSpecsDetector extends GCCBuiltinSpecsDetector {
@Override
public void startupForLanguage(String languageId) throws CoreException {
@ -45,6 +52,9 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
}
}
/**
* Mock GCCBuiltinSpecsDetectorCygwin to gain access to protected methods.
*/
class MockGCCBuiltinSpecsDetectorCygwin extends GCCBuiltinSpecsDetectorCygwin {
@Override
public void startupForLanguage(String languageId) throws CoreException {
@ -66,6 +76,9 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
super.tearDown();
}
/**
* Helper method to fetch configuration descriptions.
*/
private ICConfigurationDescription[] getConfigurationDescriptions(IProject project) {
CoreModel coreModel = CoreModel.getDefault();
ICProjectDescriptionManager mngr = coreModel.getProjectDescriptionManager();
@ -78,6 +91,9 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
return cfgDescriptions;
}
/**
* Test expansion of variables in build command.
*/
public void testGCCBuiltinSpecsDetector_ResolvedCommand() throws Exception {
class MockGCCBuiltinSpecsDetectorLocal extends GCCBuiltinSpecsDetector {
@Override
@ -105,6 +121,9 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
}
}
/**
* Test parsing of macro without value.
*/
public void testGCCBuiltinSpecsDetector_Macro_NoValue() throws Exception {
MockGCCBuiltinSpecsDetector detector = new MockGCCBuiltinSpecsDetector();
@ -119,6 +138,9 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
assertEquals(1, entries.size());
}
/**
* Test parsing of macro with ordinary value.
*/
public void testGCCBuiltinSpecsDetector_Macro_Simple() throws Exception {
MockGCCBuiltinSpecsDetector detector = new MockGCCBuiltinSpecsDetector();
@ -133,6 +155,9 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
assertEquals(1, entries.size());
}
/**
* Test parsing of macro with value in round brackets.
*/
public void testGCCBuiltinSpecsDetector_Macro_Const() throws Exception {
MockGCCBuiltinSpecsDetector detector = new MockGCCBuiltinSpecsDetector();
@ -147,6 +172,9 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
assertEquals(1, entries.size());
}
/**
* Test parsing of macro definition with tabs.
*/
public void testGCCBuiltinSpecsDetector_Macro_WhiteSpaces() throws Exception {
MockGCCBuiltinSpecsDetector detector = new MockGCCBuiltinSpecsDetector();
@ -166,6 +194,9 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
assertEquals(index, entries.size());
}
/**
* Test parsing of macro definition with empty argument list.
*/
public void testGCCBuiltinSpecsDetector_Macro_EmptyArgList() throws Exception {
MockGCCBuiltinSpecsDetector detector = new MockGCCBuiltinSpecsDetector();
@ -180,6 +211,9 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
assertEquals(1, entries.size());
}
/**
* Test parsing of macro definition with unused parameter.
*/
public void testGCCBuiltinSpecsDetector_Macro_ParamUnused() throws Exception {
MockGCCBuiltinSpecsDetector detector = new MockGCCBuiltinSpecsDetector();
@ -194,6 +228,9 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
assertEquals(1, entries.size());
}
/**
* Test parsing of macro definition with multiple parameters.
*/
public void testGCCBuiltinSpecsDetector_Macro_ParamSpace() throws Exception {
MockGCCBuiltinSpecsDetector detector = new MockGCCBuiltinSpecsDetector();
@ -208,6 +245,9 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
assertEquals(1, entries.size());
}
/**
* Test parsing of macro definition with multiple parameters and no value.
*/
public void testGCCBuiltinSpecsDetector_Macro_ArgsNoValue() throws Exception {
MockGCCBuiltinSpecsDetector detector = new MockGCCBuiltinSpecsDetector();
@ -222,6 +262,9 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
assertEquals(1, entries.size());
}
/**
* Test parsing of macro definition having white spaces in various places.
*/
public void testGCCBuiltinSpecsDetector_Macro_Args_WhiteSpaces() throws Exception {
MockGCCBuiltinSpecsDetector detector = new MockGCCBuiltinSpecsDetector();
@ -241,6 +284,9 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
assertEquals(index, entries.size());
}
/**
* Test parsing of include directives.
*/
public void testGCCBuiltinSpecsDetector_Includes() throws Exception {
// Create model project and folders to test
String projectName = getName();
@ -288,6 +334,9 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
assertEquals(index, entries.size());
}
/**
* Test parsing of macro definition of include directives having white spaces.
*/
public void testGCCBuiltinSpecsDetector_Includes_WhiteSpaces() throws Exception {
String loc = ResourceHelper.createTemporaryFolder().toString();
@ -316,6 +365,9 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
assertEquals(index, entries.size());
}
/**
* Test parsing of include directives incorporating symbolic links.
*/
public void testGCCBuiltinSpecsDetector_Includes_SymbolicLinkUp() throws Exception {
// do not test on systems where symbolic links are not supported
if (!ResourceHelper.isSymbolicLinkSupported())
@ -347,15 +399,17 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
assertEquals(1, entries.size());
}
/**
* Test parsing of include directives for Cygwin for global provider.
*/
public void testGCCBuiltinSpecsDetector_Cygwin_NoProject() throws Exception {
String windowsLocation;
String cygwinLocation = "/usr/include";
try {
windowsLocation = ResourceHelper.cygwinToWindowsPath(cygwinLocation);
} catch (UnsupportedOperationException e) {
if (!Cygwin.isAvailable()) {
// Skip the test if Cygwin is not available.
return;
}
String cygwinLocation = "/usr/include";
String windowsLocation = ResourceHelper.cygwinToWindowsPath(cygwinLocation);
assertTrue("windowsLocation=["+windowsLocation+"]", new Path(windowsLocation).getDevice()!=null);
MockGCCBuiltinSpecsDetectorCygwin detector = new MockGCCBuiltinSpecsDetectorCygwin();
@ -374,15 +428,17 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase {
assertEquals(1, entries.size());
}
/**
* Test parsing of include directives for Cygwin for provider running for a configuration.
*/
public void testGCCBuiltinSpecsDetector_Cygwin_Configuration() throws Exception {
String windowsLocation;
String cygwinLocation = "/usr/include";
try {
windowsLocation = ResourceHelper.cygwinToWindowsPath(cygwinLocation);
} catch (UnsupportedOperationException e) {
if (!Cygwin.isAvailable()) {
// Skip the test if Cygwin is not available.
return;
}
String cygwinLocation = "/usr/include";
String windowsLocation = ResourceHelper.cygwinToWindowsPath(cygwinLocation);
assertTrue("windowsLocation=["+windowsLocation+"]", new Path(windowsLocation).getDevice()!=null);
// Create model project and folders to test

View file

@ -30,6 +30,9 @@ import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
/**
* Test creation of a new project in respect with language settings providers.
*/
public class LanguageSettingsProvidersMBSTest extends BaseTestCase {
private static final String MBS_LANGUAGE_SETTINGS_PROVIDER_ID = ScannerDiscoveryLegacySupport.MBS_LANGUAGE_SETTINGS_PROVIDER_ID;
private static final String USER_LANGUAGE_SETTINGS_PROVIDER_ID = ScannerDiscoveryLegacySupport.USER_LANGUAGE_SETTINGS_PROVIDER_ID;
@ -50,7 +53,7 @@ public class LanguageSettingsProvidersMBSTest extends BaseTestCase {
}
/**
* New Project Wizards do all these things
* Imitate a new Project Wizard. New Project Wizards really do these things in CDT.
*/
private static IProject imitateNewProjectWizard(String name, String projectTypeId) throws CoreException {
IProject project = ManagedBuildTestHelper.createProject(name, projectTypeId);
@ -76,10 +79,13 @@ public class LanguageSettingsProvidersMBSTest extends BaseTestCase {
}
/**
* Test new GNU Executable project.
*/
public void testGnuToolchainProviders() throws Exception {
// create a new project imitating wizard
IProject project = imitateNewProjectWizard(this.getName(), PROJECT_TYPE_EXECUTABLE_GNU);
// check that the language settings providers are in place.
ICProjectDescription prjDescription = CoreModel.getDefault().getProjectDescription(project, false);
assertNotNull(prjDescription);
ICConfigurationDescription[] cfgDescriptions = prjDescription.getConfigurations();
@ -114,37 +120,14 @@ public class LanguageSettingsProvidersMBSTest extends BaseTestCase {
}
/**
*/
public void testProjectPersistence_NoProviders() throws Exception {
IProject project = imitateNewProjectWizard(this.getName(), PROJECT_TYPE_EXECUTABLE_GNU);
ICProjectDescription prjDescription = CoreModel.getDefault().getProjectDescription(project, true);
assertNotNull(prjDescription);
ICConfigurationDescription[] cfgDescriptions = prjDescription.getConfigurations();
for (ICConfigurationDescription cfgDescription : cfgDescriptions) {
assertNotNull(cfgDescription);
assertTrue(cfgDescription instanceof ILanguageSettingsProvidersKeeper);
((ILanguageSettingsProvidersKeeper) cfgDescription).setLanguageSettingProviders(new ArrayList<ILanguageSettingsProvider>());
assertTrue(((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders().size() == 0);
}
CoreModel.getDefault().setProjectDescription(project, prjDescription);
IFile xmlStorageFile = project.getFile(LANGUAGE_SETTINGS_PROJECT_XML);
assertEquals(true, xmlStorageFile.exists());
String xmlPrjWspStorageFileLocation = LanguageSettingsPersistenceProjectTests.getStoreLocationInWorkspaceArea(project.getName()+'.'+LANGUAGE_SETTINGS_WORKSPACE_XML);
java.io.File xmlStorageFilePrjWsp = new java.io.File(xmlPrjWspStorageFileLocation);
assertEquals(false, xmlStorageFilePrjWsp.exists());
}
/**
* Test that no unnecessary storage file is created for language settings for default set
* of language settings providers.
*/
public void testProjectPersistence_Defaults() throws Exception {
// create a new project imitating wizard
IProject project = imitateNewProjectWizard(this.getName(), PROJECT_TYPE_EXECUTABLE_GNU);
// double-check that the project contains language settings providers
ICProjectDescription prjDescription = CoreModel.getDefault().getProjectDescription(project, false);
assertNotNull(prjDescription);
ICConfigurationDescription[] cfgDescriptions = prjDescription.getConfigurations();
@ -161,13 +144,47 @@ public class LanguageSettingsProvidersMBSTest extends BaseTestCase {
assertTrue(defaultIds.length > 0);
}
// no settings file in project area
IFile xmlStorageFile = project.getFile(LANGUAGE_SETTINGS_PROJECT_XML);
assertEquals(false, xmlStorageFile.exists());
assertEquals(false, xmlStorageFile.getParent().exists()); // .settings folder
// no settings file in workspace area
String xmlPrjWspStorageFileLocation = LanguageSettingsPersistenceProjectTests.getStoreLocationInWorkspaceArea(project.getName()+'.'+LANGUAGE_SETTINGS_WORKSPACE_XML);
java.io.File xmlStorageFilePrjWsp = new java.io.File(xmlPrjWspStorageFileLocation);
assertEquals(false, xmlStorageFilePrjWsp.exists());
}
/**
* Test that storage file is created for language settings for empty set of language settings providers.
*/
public void testProjectPersistence_NoProviders() throws Exception {
// create a new project imitating wizard
IProject project = imitateNewProjectWizard(this.getName(), PROJECT_TYPE_EXECUTABLE_GNU);
// remove language settings providers from the project
ICProjectDescription prjDescription = CoreModel.getDefault().getProjectDescription(project, true);
assertNotNull(prjDescription);
ICConfigurationDescription[] cfgDescriptions = prjDescription.getConfigurations();
for (ICConfigurationDescription cfgDescription : cfgDescriptions) {
assertNotNull(cfgDescription);
assertTrue(cfgDescription instanceof ILanguageSettingsProvidersKeeper);
((ILanguageSettingsProvidersKeeper) cfgDescription).setLanguageSettingProviders(new ArrayList<ILanguageSettingsProvider>());
assertTrue(((ILanguageSettingsProvidersKeeper) cfgDescription).getLanguageSettingProviders().size() == 0);
}
CoreModel.getDefault().setProjectDescription(project, prjDescription);
// settings file appears in project area
IFile xmlStorageFile = project.getFile(LANGUAGE_SETTINGS_PROJECT_XML);
assertEquals(true, xmlStorageFile.exists());
// no settings file in workspace area
String xmlPrjWspStorageFileLocation = LanguageSettingsPersistenceProjectTests.getStoreLocationInWorkspaceArea(project.getName()+'.'+LANGUAGE_SETTINGS_WORKSPACE_XML);
java.io.File xmlStorageFilePrjWsp = new java.io.File(xmlPrjWspStorageFileLocation);
assertEquals(false, xmlStorageFilePrjWsp.exists());
}
}

View file

@ -289,5 +289,4 @@ public class ExternalBuildRunner extends AbstractBuildRunner {
CfgInfoContext context, IPath workingDirectory, IMarkerGenerator markerGenerator) {
return ScannerInfoConsoleParserFactory.getScannerInfoConsoleParser(project, context.toInfoContext(), workingDirectory, map.get(context), markerGenerator, null);
}
}

View file

@ -15,7 +15,6 @@ import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import org.eclipse.cdt.build.internal.core.scannerconfig.CfgDiscoveredPathManager;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.managedbuilder.internal.buildmodel.BuildStateManager;
import org.eclipse.cdt.managedbuilder.internal.buildmodel.DbgUtil;
import org.eclipse.cdt.managedbuilder.internal.core.BuilderFactory;
@ -27,7 +26,6 @@ import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
@ -285,10 +283,4 @@ public class ManagedBuilderCorePlugin extends Plugin {
ProjectConverter.convertOldStdMakeToNewStyle(project, monitor);
}
/**
* @since 8.1
*/
public static IPath getWorkingDirectory() {
return MakeCorePlugin.getDefault().getStateLocation();
}
}

View file

@ -152,7 +152,6 @@ public class CommonBuilder extends ACBuilder {
private final IConfiguration fCfg;
private final IBuilder fBuilder;
private IConsole fConsole;
CfgBuildInfo(IBuilder builder, boolean isForegound){
this.fBuilder = builder;
this.fCfg = builder.getParent().getParent();

View file

@ -169,3 +169,15 @@ MultiResourceInfo.MultiResourceInfo.UnhandledIHoldsOptionsType=Unhandled parent
ResourceChangeHandler2.0=project build settings update job
ToolInfo.0=conversion failure
ToolInfo.1=the tool is removed
#Language settings providers messages
AbstractBuildCommandParser.SerializeJobName=Serialize CDT language settings entries
AbstractBuiltinSpecsDetector.AddScannerDiscoveryMarkers=Adding Scanner Discovery markers
AbstractBuiltinSpecsDetector.ClearingMarkers=Clearing markers for {0}
AbstractBuiltinSpecsDetector.DiscoverBuiltInSettingsJobName=Discover compiler built-in language settings
AbstractBuiltinSpecsDetector.RunningScannerDiscovery=Running scanner discovery: {0}
AbstractBuiltinSpecsDetector.ScannerDiscoveryMarkerLocationPreferences=Preferences, C++/Build/Settings/Discovery, [{0}] options
AbstractBuiltinSpecsDetector.ScannerDiscoveryMarkerLocationProperties=Project Properties, C++ Preprocessor Include.../Providers, [{0}] options
AbstractBuiltinSpecsDetector.ScannerDiscoveryTaskTitle=CDT Scanner Discovery
AbstractBuiltinSpecsDetector.SerializingResults=Serializing results

View file

@ -41,7 +41,7 @@ public class MBSLanguageSettingsProvider extends AbstractExecutableExtensionBase
if (rc instanceof IFile) {
ICLanguageSetting ls = cfgDescription.getLanguageSettingForFile(projectPath, true);
if (ls != null) {
languageSettings = new ICLanguageSetting[] {ls};
languageSettings = new ICLanguageSetting[] { ls };
} else {
return getSettingEntries(cfgDescription, rc.getParent(), languageId);
}
@ -54,26 +54,25 @@ public class MBSLanguageSettingsProvider extends AbstractExecutableExtensionBase
if (languageSettings != null) {
for (ICLanguageSetting langSetting : languageSettings) {
if (langSetting!=null) {
if (langSetting != null) {
String id = langSetting.getLanguageId();
if (id!=null && id.equals(languageId)) {
if (id != null && id.equals(languageId)) {
int kindsBits = langSetting.getSupportedEntryKinds();
for (int kind=1;kind<=kindsBits;kind<<=1) {
for (int kind=1; kind <= kindsBits; kind <<= 1) {
if ((kindsBits & kind) != 0) {
list.addAll(langSetting.getSettingEntriesList(kind));
}
}
} else {
// System.err.println("languageSetting id=null: name=" + languageSetting.getName());
}
} else {
System.err.println("languageSetting=null: rc=" + rc);
}
}
}
return LanguageSettingsStorage.getPooledList(list);
}
/**
* Get language settings for resource description.
*/
private ICLanguageSetting[] getLanguageSettings(ICResourceDescription rcDescription) {
ICLanguageSetting[] array = null;
switch (rcDescription.getType()) {
@ -86,48 +85,16 @@ public class MBSLanguageSettingsProvider extends AbstractExecutableExtensionBase
case ICSettingBase.SETTING_FILE:
ICFileDescription fiDes = (ICFileDescription)rcDescription;
ICLanguageSetting ls = fiDes.getLanguageSetting();
if (ls!=null) {
if (ls != null) {
array = new ICLanguageSetting[] { ls };
}
}
if (array==null) {
if (array == null) {
array = new ICLanguageSetting[0];
}
return array;
}
public void setSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId,
List<ICLanguageSettingEntry> entries) {
// lang.setSettingEntries(kind, entries);
IPath projectPath = rc.getProjectRelativePath();
ICResourceDescription rcDescription = cfgDescription.getResourceDescription(projectPath, false);
for (ICLanguageSetting languageSetting : getLanguageSettings(rcDescription)) {
if (languageSetting!=null) {
String id = languageSetting.getLanguageId();
if (id!=null && id.equals(languageId)) {
int kindsBits = languageSetting.getSupportedEntryKinds();
for (int kind=1;kind<=kindsBits;kind<<=1) {
if ((kindsBits & kind) != 0) {
List<ICLanguageSettingEntry> list = new ArrayList<ICLanguageSettingEntry>(entries.size());
for (ICLanguageSettingEntry entry : entries) {
if (entry.getKind()==kind) {
list.add(entry);
}
}
languageSetting.setSettingEntries(kind, list);
}
}
} else {
// System.err.println("languageSetting id=null: name=" + languageSetting.getName());
}
} else {
System.err.println("languageSetting=null: rcDescription=" + rcDescription.getName());
}
}
}
@Override
public LanguageSettingsStorage copyStorage() {
class PretendStorage extends LanguageSettingsStorage {

View file

@ -12,14 +12,10 @@
package org.eclipse.cdt.managedbuilder.language.settings.providers;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.IErrorParser2;
import org.eclipse.cdt.core.IMarkerGenerator;
import org.eclipse.cdt.core.errorparsers.RegexErrorParser;
@ -27,20 +23,17 @@ import org.eclipse.cdt.core.errorparsers.RegexErrorPattern;
import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsManager;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin;
import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.content.IContentTypeManager;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.core.runtime.jobs.Job;
/**
* Abstract class for providers parsing compiler option from build command when it
* is present in build output.
* Abstract class for providers parsing compiler option from build command when present in build output.
*
* @since 8.1
*/
@ -56,7 +49,7 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
* Note: design patterns to keep file group the same and matching {@link #FILE_GROUP}
*/
@SuppressWarnings("nls")
private static final String[] PATTERN_TEMPLATES = {
private static final String[] COMPILER_COMMAND_PATTERN_TEMPLATES = {
"${COMPILER_PATTERN}.*\\s" + "()([^'\"\\s]*\\.${EXTENSIONS_PATTERN})(\\s.*)?[\r\n]*", // compiling unquoted file
"${COMPILER_PATTERN}.*\\s" + "(['\"])(.*\\.${EXTENSIONS_PATTERN})\\${COMPILER_GROUPS+1}(\\s.*)?[\r\n]*" // compiling quoted file
};
@ -84,16 +77,25 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
setProperty(ATTR_PARAMETER, commandPattern);
}
/**
* Sub-expression for compiler command pattern accounting for spaces, quotes etc.
*/
@SuppressWarnings("nls")
private String getCompilerPatternExtended() {
String compilerPattern = getCompilerPattern();
return "\\s*\"?("+LEADING_PATH_PATTERN+")?(" + compilerPattern + ")\"?";
}
/**
* Adjust count for file group taking into consideration extra groups added by {@link #getCompilerPatternExtended()}.
*/
private int adjustFileGroup() {
return countGroups(getCompilerPatternExtended()) + FILE_GROUP;
}
/**
* Make search pattern for compiler command based on template.
*/
private String makePattern(String template) {
@SuppressWarnings("nls")
String pattern = template
@ -103,46 +105,13 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
return pattern;
}
@SuppressWarnings("nls")
private static String expressionLogicalOr(Set<String> fileExts) {
String pattern = "(";
for (String ext : fileExts) {
if (pattern.length() != 1)
pattern += "|";
pattern += "(" + Pattern.quote(ext) + ")";
ext = ext.toUpperCase();
if (!fileExts.contains(ext)) {
pattern += "|(" + Pattern.quote(ext) + ")";
}
}
pattern += ")";
return pattern;
}
protected String getPatternFileExtensions() {
IContentTypeManager manager = Platform.getContentTypeManager();
Set<String> fileExts = new HashSet<String>();
IContentType contentTypeCpp = manager.getContentType(CCorePlugin.CONTENT_TYPE_CXXSOURCE);
fileExts.addAll(Arrays.asList(contentTypeCpp.getFileSpecs(IContentType.FILE_EXTENSION_SPEC)));
IContentType contentTypeC = manager.getContentType(CCorePlugin.CONTENT_TYPE_CSOURCE);
fileExts.addAll(Arrays.asList(contentTypeC.getFileSpecs(IContentType.FILE_EXTENSION_SPEC)));
String pattern = expressionLogicalOr(fileExts);
return pattern;
}
@Override
protected String parseResourceName(String line) {
if (line == null) {
return null;
}
for (String template : PATTERN_TEMPLATES) {
for (String template : COMPILER_COMMAND_PATTERN_TEMPLATES) {
String pattern = makePattern(template);
Matcher fileMatcher = Pattern.compile(pattern).matcher(line);
if (fileMatcher.matches()) {
@ -171,12 +140,6 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
return options;
}
// This is redundant but let us keep it here to navigate in java code easier
@Override
public boolean processLine(String line) {
return super.processLine(line);
}
@Override
public void shutdown() {
scheduleSerializingJob(currentCfgDescription);
@ -185,7 +148,7 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
private void scheduleSerializingJob(final ICConfigurationDescription cfgDescription) {
Job job = new Job("Serialize CDT language settings entries") {
Job job = new Job(ManagedMakeMessages.getResourceString("AbstractBuildCommandParser.SerializeJobName")) { //$NON-NLS-1$
@Override
protected IStatus run(IProgressMonitor monitor) {
return serializeLanguageSettings(cfgDescription);
@ -219,18 +182,25 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting
/**
* Trivial Error Parser which allows highlighting of output lines matching the patterns
* of this parser. Intended for better troubleshooting experience.
* Implementers are supposed to add the error parser as an extension. Initialize with
* build command parser extension ID.
* Implementers are supposed to add the error parser via extension point {@code org.eclipse.cdt.core.ErrorParser}.
*/
protected static abstract class AbstractBuildCommandPatternHighlighter extends RegexErrorParser implements IErrorParser2 {
public AbstractBuildCommandPatternHighlighter(String buildCommandParserPluginExtension) {
init(buildCommandParserPluginExtension);
/**
* Constructor.
* @param parserId - build command parser ID specified in the extension {@code org.eclipse.cdt.core.LanguageSettingsProvider}.
*/
public AbstractBuildCommandPatternHighlighter(String parserId) {
init(parserId);
}
protected void init(String buildCommandParserId) {
AbstractBuildCommandParser buildCommandParser = (AbstractBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(buildCommandParserId, false);
/**
* Initialize the error parser.
* @param parserId - language settings provider (the build command parser) ID.
*/
protected void init(String parserId) {
AbstractBuildCommandParser buildCommandParser = (AbstractBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(parserId, false);
if (buildCommandParser != null) {
for (String template : PATTERN_TEMPLATES) {
for (String template : COMPILER_COMMAND_PATTERN_TEMPLATES) {
String pattern = buildCommandParser.makePattern(template);
String fileExpr = "$"+buildCommandParser.adjustFileGroup(); //$NON-NLS-1$
String descExpr = "$0"; //$NON-NLS-1$

View file

@ -38,6 +38,7 @@ import org.eclipse.cdt.internal.core.BuildRunnerHelper;
import org.eclipse.cdt.internal.core.XmlUtil;
import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsLogger;
import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin;
import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages;
import org.eclipse.cdt.utils.CommandLineUtil;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
@ -67,7 +68,6 @@ import org.w3c.dom.Element;
* @since 8.1
*/
public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSettingsOutputScanner implements ICListenerAgent {
// TODO - refine id after settling with the plugin
public static final String JOB_FAMILY_BUILTIN_SPECS_DETECTOR = "org.eclipse.cdt.managedbuilder.AbstractBuiltinSpecsDetector"; //$NON-NLS-1$
protected static final String COMPILER_MACRO = "${COMMAND}"; //$NON-NLS-1$
@ -75,6 +75,15 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
protected static final String SPEC_EXT_MACRO = "${EXT}"; //$NON-NLS-1$
protected static final String SPEC_FILE_BASE = "spec"; //$NON-NLS-1$
private static final String CDT_MANAGEDBUILDER_UI_PLUGIN_ID = "org.eclipse.cdt.managedbuilder.ui"; //$NON-NLS-1$
private static final String SCANNER_DISCOVERY_CONSOLE = "org.eclipse.cdt.managedbuilder.ScannerDiscoveryConsole"; //$NON-NLS-1$
private static final String SCANNER_DISCOVERY_GLOBAL_CONSOLE = "org.eclipse.cdt.managedbuilder.ScannerDiscoveryGlobalConsole"; //$NON-NLS-1$
private static final String DEFAULT_CONSOLE_ICON = "icons/obj16/inspect_system.gif"; //$NON-NLS-1$
private static final String GMAKE_ERROR_PARSER_ID = "org.eclipse.cdt.core.GmakeErrorParser"; //$NON-NLS-1$
private static final String ATTR_PARAMETER = "parameter"; //$NON-NLS-1$
private static final String ATTR_CONSOLE = "console"; //$NON-NLS-1$
private static final int MONITOR_SCALE = 100;
private static final int TICKS_REMOVE_MARKERS = 1 * MONITOR_SCALE;
private static final int TICKS_RUN_FOR_ONE_LANGUAGE = 10 * MONITOR_SCALE;
@ -82,13 +91,6 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
private static final int TICKS_OUTPUT_PARSING = 1 * MONITOR_SCALE;
private static final int TICKS_EXECUTE_COMMAND = 1 * MONITOR_SCALE;
private static final String CDT_MANAGEDBUILDER_UI_PLUGIN_ID = "org.eclipse.cdt.managedbuilder.ui"; //$NON-NLS-1$
private static final String DEFAULT_CONSOLE_ICON = "icons/obj16/inspect_system.gif"; //$NON-NLS-1$
private static final String GMAKE_ERROR_PARSER_ID = "org.eclipse.cdt.core.GmakeErrorParser"; //$NON-NLS-1$
private static final String ATTR_PARAMETER = "parameter"; //$NON-NLS-1$
private static final String ATTR_CONSOLE = "console"; //$NON-NLS-1$
protected URI mappedRootURI = null;
protected URI buildDirURI = null;
protected java.io.File specFile = null;
@ -103,9 +105,8 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
private String currentCommandResolved = null;
private class SDMarkerGenerator implements IMarkerGenerator {
// TODO - define own markers types after settling with the plugin
// Scanner discovery markers are defined in org.eclipse.cdt.managedbuilder.core plugin.xml
protected static final String SCANNER_DISCOVERY_PROBLEM_MARKER = "org.eclipse.cdt.managedbuilder.core.scanner.discovery.problem";
// Reuse scanner discovery markers defined in org.eclipse.cdt.managedbuilder.core plugin.xml
protected static final String SCANNER_DISCOVERY_PROBLEM_MARKER = "org.eclipse.cdt.managedbuilder.core.scanner.discovery.problem"; //$NON-NLS-1$
protected static final String ATTR_PROVIDER = "provider"; //$NON-NLS-1$
@Override
@ -118,10 +119,8 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
public void addMarker(final ProblemMarkerInfo problemMarkerInfo) {
final String providerName = getName();
final String providerId = getId();
// we have to add the marker in the job or we can deadlock other
// threads that are responding to a resource delta by doing something
// that accesses the project description
Job markerJob = new Job("Adding Scanner Discovery markers") {
// Add markers in a job to avoid deadlocks
Job markerJob = new Job(ManagedMakeMessages.getResourceString("AbstractBuiltinSpecsDetector.AddScannerDiscoveryMarkers")) { //$NON-NLS-1$
@Override
protected IStatus run(IProgressMonitor monitor) {
// Avoid duplicates as different languages can generate identical errors
@ -147,9 +146,11 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
marker.setAttribute(SDMarkerGenerator.ATTR_PROVIDER, providerId);
if (problemMarkerInfo.file instanceof IWorkspaceRoot) {
marker.setAttribute(IMarker.LOCATION, "Preferences, C++/Build/Settings/Discovery, [" + providerName + "] options");
String msgPreferences = ManagedMakeMessages.getFormattedString("AbstractBuiltinSpecsDetector.ScannerDiscoveryMarkerLocationPreferences", providerName); //$NON-NLS-1$
marker.setAttribute(IMarker.LOCATION, msgPreferences);
} else {
marker.setAttribute(IMarker.LOCATION, "Project Properties, C++ Preprocessor Include.../Providers, [" + providerName + "] options");
String msgProperties = ManagedMakeMessages.getFormattedString("AbstractBuiltinSpecsDetector.ScannerDiscoveryMarkerLocationProperties", providerName); //$NON-NLS-1$
marker.setAttribute(IMarker.LOCATION, msgProperties);
}
} catch (CoreException e) {
return new Status(Status.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, "Error adding markers.", e); //$NON-NLS-1$
@ -163,6 +164,11 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
markerJob.schedule();
}
/**
* Delete markers previously set by this provider for the resource.
*
* @param rc - resource to check markers.
*/
public void deleteMarkers(IResource rc) {
String providerId = getId();
try {
@ -180,7 +186,7 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
}
/**
* This ICConsoleParser handles each individual run for one language TODO
* Internal ICConsoleParser to handle individual run for one language.
*/
private class ConsoleParserAdapter implements ICBuildOutputParser {
@Override
@ -198,16 +204,20 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
}
/**
* TODO
* @param languageId
* @return
* Compiler command without arguments. This value is used to replace macro ${COMMAND}.
* In particular, this method is implemented in {@link ToolchainBuiltinSpecsDetector}
* which retrieves the command from tool-chain.
*
* @param languageId - language ID.
* @return compiler command without arguments, i.e. compiler program.
*/
protected abstract String getCompilerCommand(String languageId);
/**
* The command to run. Some macros could be specified in there:
* <ul>
* <b>${COMMAND}</b> - compiler command taken from the toolchain.<br>
* <b>${COMMAND}</b> - compiler command without arguments (compiler program).
* Normally would come from the tool-chain.<br>
* <b>${INPUTS}</b> - path to spec file which will be placed in workspace area.<br>
* <b>${EXT}</b> - file extension calculated from language ID.
* </ul>
@ -228,14 +238,30 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
setProperty(ATTR_PARAMETER, command);
}
public void setConsoleEnabled(boolean enable) {
isConsoleEnabled = enable;
}
/**
* @return {@code true} if console output is enabled for this provider, {@code false} otherwise.
*/
public boolean isConsoleEnabled() {
return isConsoleEnabled;
}
/**
* Enable or disable console output for this provider.
*
* @param enable - {@code true} to enable console output or {@code false} to disable.
*/
public void setConsoleEnabled(boolean enable) {
isConsoleEnabled = enable;
}
/**
* Expand macros specified in the compiler command. See {@link #getCommand()} for
* the recognized list of macros.
*
* @param languageId - language ID.
* @return - resolved command to run.
* @throws CoreException if something goes wrong.
*/
protected String resolveCommand(String languageId) throws CoreException {
String cmd = getCommand();
if (cmd != null) {
@ -258,12 +284,10 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
return cmd;
}
/**
* TODO
*/
@Override
protected String parseResourceName(String line) {
// Returning null works as if workspace-wide
// Normally built-in specs detectors are per-language and the result applies for the whole workspace.
// Returning null works workspace-wide here.
return null;
}
@ -275,6 +299,7 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
@Override
protected URI getMappedRootURI(IResource sourceFile, String parsedResourceName) {
// Do not calculate mappedRootURI for each line
if (mappedRootURI == null) {
mappedRootURI = super.getMappedRootURI(sourceFile, parsedResourceName);
}
@ -283,7 +308,8 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
@Override
protected URI getBuildDirURI(URI mappedRootURI) {
if (buildDirURI==null) {
// Do not calculate buildDirURI for each line
if (buildDirURI == null) {
buildDirURI = super.getBuildDirURI(mappedRootURI);
}
return buildDirURI;
@ -320,6 +346,10 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
super.shutdown();
}
/**
* Execute provider's command which is expected to print built-in compiler options (specs) to build output.
* The parser will parse output and generate language settings for corresponding resources.
*/
protected void execute() {
if (isExecuted) {
// AG FIXME - temporary log to remove before CDT Juno release
@ -328,7 +358,7 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
}
isExecuted = true;
Job job = new Job("Discover compiler's built-in language settings") {
Job job = new Job(ManagedMakeMessages.getResourceString("AbstractBuiltinSpecsDetector.DiscoverBuiltInSettingsJobNam")) { //$NON-NLS-1$
@Override
protected IStatus run(IProgressMonitor monitor) {
IStatus status;
@ -337,7 +367,7 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
status = runForEachLanguage(monitor);
} catch (CoreException e) {
ManagedBuilderCorePlugin.log(e);
status = new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, IStatus.ERROR, "Error running Builtin Specs Detector", e);
status = new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, IStatus.ERROR, "Error running Builtin Specs Detector", e); //$NON-NLS-1$
} finally {
shutdown();
}
@ -372,10 +402,14 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
}
/**
* TODO
* Run built-in specs command for each language.
*
* @param monitor - progress monitor in the initial state where {@link IProgressMonitor#beginTask(String, int)}
* has not been called yet.
* @return status of operation.
*/
protected IStatus runForEachLanguage(IProgressMonitor monitor) {
MultiStatus status = new MultiStatus(ManagedBuilderCorePlugin.PLUGIN_ID, IStatus.OK, "Problem running CDT Scanner Discovery provider " + getId(), null);
MultiStatus status = new MultiStatus(ManagedBuilderCorePlugin.PLUGIN_ID, IStatus.OK, "Problem running CDT Scanner Discovery provider " + getId(), null); //$NON-NLS-1$
if (monitor == null) {
monitor = new NullProgressMonitor();
@ -386,11 +420,12 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
List<String> languageIds = getLanguageScope();
if (languageIds != null) {
monitor.beginTask("CDT Scanner Discovery", TICKS_REMOVE_MARKERS + languageIds.size()*TICKS_RUN_FOR_ONE_LANGUAGE + TICKS_SERIALIZATION);
monitor.beginTask(ManagedMakeMessages.getResourceString("AbstractBuiltinSpecsDetector.ScannerDiscoveryTaskTitle"), //$NON-NLS-1$
TICKS_REMOVE_MARKERS + languageIds.size()*TICKS_RUN_FOR_ONE_LANGUAGE + TICKS_SERIALIZATION);
IResource markersResource = currentProject != null ? currentProject : ResourcesPlugin.getWorkspace().getRoot();
monitor.subTask("Clearing markers for " + markersResource.getFullPath());
monitor.subTask(ManagedMakeMessages.getFormattedString("AbstractBuiltinSpecsDetector.ClearingMarkers", markersResource.getFullPath().toString())); //$NON-NLS-1$
markerGenerator.deleteMarkers(markersResource);
if (monitor.isCanceled())
throw new OperationCanceledException();
@ -419,7 +454,7 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
}
}
monitor.subTask("Serializing results");
monitor.subTask(ManagedMakeMessages.getResourceString("AbstractBuiltinSpecsDetector.SerializingResults")); //$NON-NLS-1$
if (isChanged) { // avoids resource and settings change notifications
IStatus s = serializeLanguageSettings(currentCfgDescription);
status.merge(s);
@ -429,7 +464,7 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
} catch (OperationCanceledException e) {
// user chose to cancel operation, do not threaten them with red error signs
} catch (Exception e) {
status.merge(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, IStatus.ERROR, "Error running Builtin Specs Detector", e));
status.merge(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, IStatus.ERROR, "Error running Builtin Specs Detector", e)); //$NON-NLS-1$
ManagedBuilderCorePlugin.log(status);
} finally {
monitor.done();
@ -438,16 +473,25 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
return status;
}
/**
* Initialize provider before running for a language.
*
* @param languageId - language ID.
* @throws CoreException if something goes wrong.
*/
protected void startupForLanguage(String languageId) throws CoreException {
currentLanguageId = languageId;
specFile = null; // init *before* calling resolveCommand(), can be set there
specFile = null; // init specFile *before* calling resolveCommand(), can be changed in there
currentCommandResolved = resolveCommand(currentLanguageId);
detectedSettingEntries = new ArrayList<ICLanguageSettingEntry>();
collected = 0;
}
/**
* Save collected entries and dispose temporary data used during run for the language.
*/
protected void shutdownForLanguage() {
if (detectedSettingEntries != null && detectedSettingEntries.size() > 0) {
collected = detectedSettingEntries.size();
@ -469,6 +513,12 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
currentLanguageId = null;
}
/**
* Run built-in specs command for one language.
*
* @param monitor - progress monitor in the initial state where {@link IProgressMonitor#beginTask(String, int)}
* has not been called yet.
*/
private void runForLanguage(IProgressMonitor monitor) throws CoreException {
buildRunnerHelper = new BuildRunnerHelper(currentProject);
@ -476,7 +526,8 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
monitor = new NullProgressMonitor();
}
try {
monitor.beginTask("Running scanner discovery: " + getName(), TICKS_EXECUTE_COMMAND + TICKS_OUTPUT_PARSING);
monitor.beginTask(ManagedMakeMessages.getFormattedString("AbstractBuiltinSpecsDetector.RunningScannerDiscovery", getName()), //$NON-NLS-1$
TICKS_EXECUTE_COMMAND + TICKS_OUTPUT_PARSING);
IConsole console;
if (isConsoleEnabled) {
@ -513,7 +564,7 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
buildRunnerHelper.setLaunchParameters(launcher, program, args, buildDirURI, envp);
buildRunnerHelper.prepareStreams(epm, parsers, console, new SubProgressMonitor(monitor, TICKS_OUTPUT_PARSING));
buildRunnerHelper.greeting("Running scanner discovery: " + getName());
buildRunnerHelper.greeting(ManagedMakeMessages.getFormattedString("AbstractBuiltinSpecsDetector.RunningScannerDiscovery", getName())); //$NON-NLS-1$
OutputStream outStream = buildRunnerHelper.getOutputStream();
OutputStream errStream = buildRunnerHelper.getErrorStream();
@ -524,8 +575,7 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
buildRunnerHelper.goodbye();
} catch (Exception e) {
Status status = new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, "Internal error running scanner discovery", e);
ManagedBuilderCorePlugin.log(new CoreException(status));
ManagedBuilderCorePlugin.log(new CoreException(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.PLUGIN_ID, "Error running Builtin Specs Detector" , e))); //$NON-NLS-1$
} finally {
try {
buildRunnerHelper.close();
@ -540,31 +590,33 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
return buildRunnerHelper.build(monitor);
}
/**
* TODO
*/
@Override
protected void setSettingEntries(List<ICLanguageSettingEntry> entries) {
// Builtin specs detectors collect entries not per line but for the whole output
if (entries != null)
// Built-in specs detectors collect entries not per line but for the whole output
// so collect them to save later when output finishes
if (entries != null) {
detectedSettingEntries.addAll(entries);
}
}
/**
* Create and start the provider console.
* @return CDT console.
*/
private IConsole startProviderConsole() {
IConsole console = null;
if (isConsoleEnabled && currentLanguageId != null) {
String extConsoleId;
if (currentProject != null) {
extConsoleId = "org.eclipse.cdt.managedbuilder.ScannerDiscoveryConsole";
extConsoleId = SCANNER_DISCOVERY_CONSOLE;
} else {
// TODO This console is not colored!
extConsoleId = "org.eclipse.cdt.managedbuilder.ScannerDiscoveryGlobalConsole";
extConsoleId = SCANNER_DISCOVERY_GLOBAL_CONSOLE;
}
ILanguage ld = LanguageManager.getInstance().getLanguage(currentLanguageId);
if (ld != null) {
String consoleId = ManagedBuilderCorePlugin.PLUGIN_ID + '.' + getId() + '.' + currentLanguageId;
String consoleName = getName() + ", " + ld.getName();
String consoleName = getName() + ", " + ld.getName(); //$NON-NLS-1$
URL defaultIcon = Platform.getBundle(CDT_MANAGEDBUILDER_UI_PLUGIN_ID).getEntry(DEFAULT_CONSOLE_ICON);
if (defaultIcon == null) {
@SuppressWarnings("nls")
@ -581,11 +633,16 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
console = CCorePlugin.getDefault().getConsole(ManagedBuilderCorePlugin.PLUGIN_ID + ".console.hidden"); //$NON-NLS-1$
}
return console;
}
/**
* Get path to spec file which normally would be placed in workspace area.
* This value is used to replace macro ${INPUTS}.
*
* @param languageId - language ID.
* @return full path to the specs file.
*/
protected String getSpecFile(String languageId) {
String specExt = getSpecFileExtension(languageId);
String ext = ""; //$NON-NLS-1$
@ -594,7 +651,7 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
}
String specFileName = SPEC_FILE_BASE + ext;
IPath workingLocation = ManagedBuilderCorePlugin.getWorkingDirectory();
IPath workingLocation = ManagedBuilderCorePlugin.getDefault().getStateLocation();
IPath fileLocation = workingLocation.append(specFileName);
specFile = new java.io.File(fileLocation.toOSString());
@ -602,6 +659,7 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
preserveSpecFile = specFile.exists();
if (!preserveSpecFile) {
try {
// In the typical case it is sufficient to have an empty file.
specFile.createNewFile();
} catch (IOException e) {
ManagedBuilderCorePlugin.log(e);
@ -614,6 +672,7 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti
/**
* Determine file extension by language id. This implementation retrieves first extension
* from the list as there could be multiple extensions associated with the given language.
* This value is used to replace macro ${EXT}.
*
* @param languageId - given language ID.
* @return file extension associated with the language or {@code null} if not found.

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2009, 2011 Andrew Gvozdev and others.
* Copyright (c) 2009, 2012 Andrew Gvozdev 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
@ -16,6 +16,9 @@ import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsEditabl
import org.eclipse.cdt.core.settings.model.ICSettingEntry;
/**
* Build command parser capable to parse gcc command in build output and generate
* language settings per file being compiled.
*
* @since 8.1
*/
public class GCCBuildCommandParser extends AbstractBuildCommandParser implements ILanguageSettingsEditableProvider {
@ -51,10 +54,17 @@ public class GCCBuildCommandParser extends AbstractBuildCommandParser implements
return (GCCBuildCommandParser) super.clone();
}
/**
* Error Parser which allows highlighting of output lines matching the patterns of this parser.
* Intended for better troubleshooting experience.
*/
public static class GCCBuildCommandPatternHighlighter extends AbstractBuildCommandParser.AbstractBuildCommandPatternHighlighter {
// ID of the parser taken from the existing extension point
private static final String GCC_BUILD_COMMAND_PARSER_EXT = "org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"; //$NON-NLS-1$
/**
* Default constructor.
*/
public GCCBuildCommandPatternHighlighter() {
super(GCC_BUILD_COMMAND_PARSER_EXT);
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2009, 2011 Andrew Gvozdev and others.
* Copyright (c) 2009, 2012 Andrew Gvozdev 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
@ -26,7 +26,7 @@ import org.eclipse.core.runtime.CoreException;
* @since 8.1
*/
public class GCCBuiltinSpecsDetector extends ToolchainBuiltinSpecsDetector implements ILanguageSettingsEditableProvider {
// ID must match the toolchain definition in org.eclipse.cdt.managedbuilder.core.buildDefinitions extension point
// ID must match the tool-chain definition in org.eclipse.cdt.managedbuilder.core.buildDefinitions extension point
private static final String GCC_TOOLCHAIN_ID = "cdt.managedbuild.toolchain.gnu.base"; //$NON-NLS-1$
private enum State {NONE, EXPECTING_LOCAL_INCLUDE, EXPECTING_SYSTEM_INCLUDE, EXPECTING_FRAMEWORKS}
@ -51,12 +51,16 @@ public class GCCBuiltinSpecsDetector extends ToolchainBuiltinSpecsDetector imple
return optionParsers;
}
/**
* Create a list from one item.
*/
private List<String> makeList(String line) {
List<String> list = new ArrayList<String>();
list.add(line);
return list;
}
@SuppressWarnings("nls")
@Override
protected List<String> parseOptions(String line) {
line = line.trim();

View file

@ -31,7 +31,7 @@ public abstract class ToolchainBuiltinSpecsDetector extends AbstractBuiltinSpecs
private Map<String, ITool> toolMap = new HashMap<String, ITool>();
/**
* Concrete compiler specs detectors need to supply Toolchain ID.
* Concrete compiler specs detectors need to supply tool-chain ID.
*
* Tool-chain id must be supplied for global providers where we don't
* have configuration description to figure that out programmatically.
@ -39,7 +39,7 @@ public abstract class ToolchainBuiltinSpecsDetector extends AbstractBuiltinSpecs
protected abstract String getToolchainId();
/**
* Finds a tool handling given language in the tool-chain.
* Finds a tool handling given language in the tool-chain of the provider.
* This returns the first tool found.
*/
private ITool getTool(String languageId) {
@ -55,10 +55,14 @@ public abstract class ToolchainBuiltinSpecsDetector extends AbstractBuiltinSpecs
return tool;
}
}
ManagedBuilderCorePlugin.error("Unable to find tool in toolchain="+toolchainId+" for language="+languageId);
ManagedBuilderCorePlugin.error("Unable to find tool in toolchain=" + toolchainId + " for language=" + languageId); //$NON-NLS-1$ //$NON-NLS-2$
return null;
}
/**
* Finds a tool handling given language in the tool-chain.
* This returns the first tool found.
*/
private ITool getTool(String languageId, IToolChain toolchain) {
ITool[] tools = toolchain.getTools();
for (ITool tool : tools) {
@ -79,8 +83,7 @@ public abstract class ToolchainBuiltinSpecsDetector extends AbstractBuiltinSpecs
ITool tool = getTool(languageId);
String compilerCommand = tool.getToolCommand();
if (compilerCommand.isEmpty()) {
String msg = "Unable to find compiler command in toolchain="+getToolchainId();
ManagedBuilderCorePlugin.error(msg);
ManagedBuilderCorePlugin.error("Unable to find compiler command in toolchain=" + getToolchainId()); //$NON-NLS-1$
}
return compilerCommand;
}
@ -94,7 +97,7 @@ public abstract class ToolchainBuiltinSpecsDetector extends AbstractBuiltinSpecs
ext = srcFileExtensions[0];
}
if (ext == null || ext.isEmpty()) {
ManagedBuilderCorePlugin.error("Unable to find file extension for language "+languageId);
ManagedBuilderCorePlugin.error("Unable to find file extension for language " + languageId); //$NON-NLS-1$
}
return ext;
}

View file

@ -28,6 +28,12 @@ import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.MessageConsole;
import org.eclipse.ui.console.MessageConsoleStream;
/**
* TODO
*
* Note that this console is not colored.
*
*/
public class ScannerDiscoveryGlobalConsole implements ICConsole {
private MessageConsole console;
private ConsoleOutputStreamAdapter stream;
@ -56,14 +62,7 @@ public class ScannerDiscoveryGlobalConsole implements ICConsole {
@Override
public void close() throws IOException {
// FIXME - clean way of closing the streams. Currently the stream could get being used after closing
fConsoleStream.close();
// if (!isOpen) {
// fConsoleStream.close();
// IStatus s = new Status(IStatus.ERROR, MakeCorePlugin.PLUGIN_ID, IStatus.ERROR, "Attempt to close stream second time", new Exception());
// MakeCorePlugin.log(s);
// flush();
// }
isOpen = false;
}
}

View file

@ -334,10 +334,8 @@ public class CDataUtil {
}
/**
* Convenience method to create {@link ICLanguageSettingEntry} depending on kind.
* Convenience method to create {@link ICSettingEntry} depending on kind.
* Note that this method keeps the entries in the pool to avoid proliferation of duplicates.
*
* Note that the method always returns {@link ICLanguageSettingEntry}.
*/
public static ICSettingEntry createEntry(int kind, String name, String value, IPath[] exclusionPatterns, int flags) {
return createEntry(kind, name, value, exclusionPatterns, flags, null, null, null);

View file

@ -31,13 +31,23 @@ public class Cygwin {
* Check if cygwin path conversion utilities are available in the path.
*
* @param envPath - list of directories to search for cygwin utilities separated
* by path separator (format of environment variable $PATH).
* by path separator (format of environment variable $PATH)
* or {@code null} to use current $PATH.
* @return {@code true} if cygwin is available, {@code false} otherwise.
*/
public static boolean isAvailable(String envPath) {
return Platform.getOS().equals(Platform.OS_WIN32) && findCygpathLocation(envPath) != null;
}
/**
* Check if cygwin path conversion utilities are available in $PATH.
*
* @return {@code true} if cygwin is available, {@code false} otherwise.
*/
public static boolean isAvailable() {
return Platform.getOS().equals(Platform.OS_WIN32) && findCygpathLocation(null) != null;
}
/**
* Conversion from Cygwin path to Windows path.
*

View file

@ -24,7 +24,6 @@ import org.eclipse.cdt.managedbuilder.language.settings.providers.ToolchainBuilt
/**
* Language settings provider to detect built-in compiler settings for IBM XLC compiler.
* Note that currently this class is hardwired to GCC toolchain {@code cdt.managedbuild.toolchain.gnu.base}.
*/
public class XlcBuiltinSpecsDetector extends ToolchainBuiltinSpecsDetector implements ILanguageSettingsEditableProvider {
// must match the toolchain definition in org.eclipse.cdt.managedbuilder.core.buildDefinitions extension point