| /******************************************************************************* |
| * Copyright (c) 2003, 2016 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM - Initial API and implementation |
| * Baltasar Belyavsky (Texas Instruments) - [279633] Custom option command-generator support |
| * Miwako Tokugawa (Intel Corporation) - bug 222817 (OptionCategoryApplicability) |
| * Liviu Ionescu - [322168] |
| *******************************************************************************/ |
| package org.eclipse.cdt.managedbuilder.internal.core; |
| |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| import java.text.MessageFormat; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.ListIterator; |
| import java.util.Map; |
| import java.util.Set; |
| import java.util.SortedMap; |
| import java.util.StringTokenizer; |
| import java.util.Vector; |
| |
| import org.eclipse.cdt.build.internal.core.scannerconfig.CfgDiscoveredPathManager.PathInfoCache; |
| import org.eclipse.cdt.core.cdtvariables.CdtVariableException; |
| import org.eclipse.cdt.core.settings.model.ICStorageElement; |
| import org.eclipse.cdt.core.settings.model.extension.CLanguageData; |
| import org.eclipse.cdt.internal.core.SafeStringInterner; |
| import org.eclipse.cdt.managedbuilder.buildproperties.IBuildPropertyType; |
| import org.eclipse.cdt.managedbuilder.buildproperties.IBuildPropertyValue; |
| import org.eclipse.cdt.managedbuilder.core.BuildException; |
| import org.eclipse.cdt.managedbuilder.core.IAdditionalInput; |
| import org.eclipse.cdt.managedbuilder.core.IBuildObject; |
| import org.eclipse.cdt.managedbuilder.core.IConfiguration; |
| import org.eclipse.cdt.managedbuilder.core.IEnvVarBuildPath; |
| import org.eclipse.cdt.managedbuilder.core.IFileInfo; |
| import org.eclipse.cdt.managedbuilder.core.IFolderInfo; |
| import org.eclipse.cdt.managedbuilder.core.IHoldsOptions; |
| import org.eclipse.cdt.managedbuilder.core.IInputType; |
| import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineGenerator; |
| import org.eclipse.cdt.managedbuilder.core.IManagedConfigElement; |
| import org.eclipse.cdt.managedbuilder.core.IManagedProject; |
| import org.eclipse.cdt.managedbuilder.core.IOption; |
| import org.eclipse.cdt.managedbuilder.core.IOptionApplicability; |
| import org.eclipse.cdt.managedbuilder.core.IOptionCategory; |
| import org.eclipse.cdt.managedbuilder.core.IOptionCategoryApplicability; |
| import org.eclipse.cdt.managedbuilder.core.IOptionCommandGenerator; |
| import org.eclipse.cdt.managedbuilder.core.IOptionPathConverter; |
| import org.eclipse.cdt.managedbuilder.core.IOutputType; |
| import org.eclipse.cdt.managedbuilder.core.IProjectType; |
| import org.eclipse.cdt.managedbuilder.core.IResourceConfiguration; |
| import org.eclipse.cdt.managedbuilder.core.IResourceInfo; |
| import org.eclipse.cdt.managedbuilder.core.ITool; |
| import org.eclipse.cdt.managedbuilder.core.IToolChain; |
| import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; |
| import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin; |
| import org.eclipse.cdt.managedbuilder.internal.dataprovider.BuildEntryStorage; |
| import org.eclipse.cdt.managedbuilder.internal.dataprovider.BuildLanguageData; |
| import org.eclipse.cdt.managedbuilder.internal.enablement.OptionEnablementExpression; |
| import org.eclipse.cdt.managedbuilder.internal.macros.BuildMacroProvider; |
| import org.eclipse.cdt.managedbuilder.internal.macros.BuildfileMacroSubstitutor; |
| import org.eclipse.cdt.managedbuilder.internal.macros.FileContextData; |
| import org.eclipse.cdt.managedbuilder.internal.macros.IMacroContextInfo; |
| import org.eclipse.cdt.managedbuilder.internal.macros.IMacroContextInfoProvider; |
| import org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider; |
| import org.eclipse.cdt.managedbuilder.makegen.IManagedDependencyGenerator; |
| import org.eclipse.cdt.managedbuilder.makegen.IManagedDependencyGeneratorType; |
| import org.eclipse.cdt.utils.cdtvariables.CdtVariableResolver; |
| import org.eclipse.cdt.utils.cdtvariables.SupplierBasedCdtVariableSubstitutor; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.ProjectScope; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.IExtension; |
| import org.eclipse.core.runtime.IExtensionPoint; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.core.runtime.content.IContentType; |
| import org.eclipse.core.runtime.content.IContentTypeSettings; |
| import org.eclipse.core.runtime.preferences.IScopeContext; |
| import org.osgi.framework.Version; |
| |
| /** |
| * Represents a tool that can be invoked during a build. |
| * Note that this class implements IOptionCategory to represent the top |
| * category. |
| */ |
| public class Tool extends HoldsOptions |
| implements ITool, IOptionCategory, IMatchKeyProvider<Tool>, IRealBuildObjectAssociation { |
| |
| public static final String DEFAULT_PATTERN = "${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}"; //$NON-NLS-1$ |
| public static final String DEFAULT_CBS_PATTERN = "${COMMAND}"; //$NON-NLS-1$ |
| |
| //property name for holding the rebuild state |
| private static final String REBUILD_STATE = "rebuildState"; //$NON-NLS-1$ |
| |
| private static final String DEFAULT_SEPARATOR = ","; //$NON-NLS-1$ |
| //private static final IOptionCategory[] EMPTY_CATEGORIES = new IOptionCategory[0]; |
| //private static final IOption[] EMPTY_OPTIONS = new IOption[0]; |
| private static final String EMPTY_STRING = ""; //$NON-NLS-1$ |
| private static final String EMPTY_QUOTED_STRING = "\"\""; //$NON-NLS-1$ |
| private static final String[] EMPTY_STRING_ARRAY = new String[0]; |
| private static final String DEFAULT_ANNOUNCEMENT_PREFIX = "Tool.default.announcement"; //$NON-NLS-1$ |
| private static final String WHITESPACE = " "; //$NON-NLS-1$ |
| |
| private static final boolean resolvedDefault = true; |
| |
| public static final String DEFAULT_TOOL_ID = "org.eclipse.cdt.build.core.default.tool"; //$NON-NLS-1$ |
| |
| // Superclass |
| // Note that superClass itself is defined in the base and that the methods |
| // getSuperClass() and setSuperClassInternal(), defined in Tool must be used to |
| // access it. This avoids widespread casts from IHoldsOptions to ITool. |
| private String superClassId; |
| // Parent and children |
| private IBuildObject parent; |
| private Vector<InputType> inputTypeList; |
| private Map<String, InputType> inputTypeMap; |
| private Vector<OutputType> outputTypeList; |
| private Map<String, OutputType> outputTypeMap; |
| private List<IEnvVarBuildPath> envVarBuildPathList; |
| // Managed Build model attributes |
| private String unusedChildren; |
| private Boolean isAbstract; |
| private String command; |
| private List<String> inputExtensions; |
| private List<String> interfaceExtensions; |
| private Integer natureFilter; |
| private String outputExtensions; |
| private String outputFlag; |
| private String outputPrefix; |
| private String errorParserIds; |
| private String commandLinePattern; |
| private String versionsSupported; |
| private String convertToId; |
| private Boolean advancedInputCategory; |
| private Boolean customBuildStep; |
| private String announcement; |
| private IConfigurationElement commandLineGeneratorElement = null; |
| private IManagedCommandLineGenerator commandLineGenerator = null; |
| private IConfigurationElement dependencyGeneratorElement = null; |
| private IManagedDependencyGeneratorType dependencyGenerator = null; |
| private URL iconPathURL; |
| private IConfigurationElement pathconverterElement = null; |
| private IOptionPathConverter optionPathConverter = null; |
| private SupportedProperties supportedProperties; |
| private Boolean supportsManagedBuild; |
| private Boolean isHidden; |
| private boolean isTest; |
| // Miscellaneous |
| private boolean isExtensionTool = false; |
| private boolean isDirty = false; |
| private boolean resolved = resolvedDefault; |
| private IConfigurationElement previousMbsVersionConversionElement = null; |
| private IConfigurationElement currentMbsVersionConversionElement = null; |
| private boolean rebuildState; |
| private BooleanExpressionApplicabilityCalculator booleanExpressionCalculator; |
| |
| private HashMap<IInputType, CLanguageData> typeToDataMap = new HashMap<>(2); |
| private boolean fDataMapInited; |
| private List<Tool> identicalList; |
| private HashMap<String, PathInfoCache> discoveredInfoMap = new HashMap<>(2); |
| private String scannerConfigDiscoveryProfileId; |
| |
| /* |
| * C O N S T R U C T O R S |
| */ |
| |
| /** |
| * Constructor to create a tool based on an element from the plugin |
| * manifest. |
| * |
| * @param element The element containing the information about the tool. |
| * @param managedBuildRevision the fileVersion of Managed Build System |
| */ |
| public Tool(IManagedConfigElement element, String managedBuildRevision) { |
| // setup for resolving |
| super(false); |
| resolved = false; |
| |
| isExtensionTool = true; |
| |
| // Set the managedBuildRevision |
| setManagedBuildRevision(managedBuildRevision); |
| |
| loadFromManifest(element); |
| |
| // hook me up |
| ManagedBuildManager.addExtensionTool(this); |
| |
| // set up the category map |
| addOptionCategory(this); |
| |
| IManagedConfigElement enablements[] = element.getChildren(OptionEnablementExpression.NAME); |
| if (enablements.length > 0) |
| booleanExpressionCalculator = new BooleanExpressionApplicabilityCalculator(enablements); |
| |
| // Load children |
| IManagedConfigElement[] toolElements = element.getChildren(); |
| for (int l = 0; l < toolElements.length; ++l) { |
| IManagedConfigElement toolElement = toolElements[l]; |
| if (loadChild(toolElement)) { |
| // do nothing |
| } else if (toolElement.getName().equals(ITool.INPUT_TYPE)) { |
| InputType inputType = new InputType(this, toolElement); |
| addInputType(inputType); |
| } else if (toolElement.getName().equals(ITool.OUTPUT_TYPE)) { |
| OutputType outputType = new OutputType(this, toolElement); |
| addOutputType(outputType); |
| } else if (toolElement.getName().equals(IEnvVarBuildPath.BUILD_PATH_ELEMENT_NAME)) { |
| addEnvVarBuildPath(new EnvVarBuildPath(this, toolElement)); |
| } else if (toolElement.getName().equals(SupportedProperties.SUPPORTED_PROPERTIES)) { |
| loadProperties(toolElement); |
| } |
| } |
| } |
| |
| /** |
| * Constructor to create a new tool for a tool-chain based on the information |
| * defined in the plugin.xml manifest. |
| * |
| * @param parent The parent of this tool. This can be a ToolChain or a |
| * ResourceConfiguration. |
| * @param element The element containing the information about the tool. |
| * @param managedBuildRevision the fileVersion of Managed Build System |
| */ |
| public Tool(IBuildObject parent, IManagedConfigElement element, String managedBuildRevision) { |
| this(element, managedBuildRevision); |
| this.parent = parent; |
| } |
| |
| /** |
| * This constructor is called to create a Tool whose attributes and children will be |
| * added by separate calls. |
| * |
| * @param parent - The parent of the tool, if any |
| * @param superClass - The superClass, if any |
| * @param Id - The id for the new tool |
| * @param name - The name for the new tool |
| * @param isExtensionElement - Indicates whether this is an extension element or a managed project element |
| */ |
| public Tool(ToolChain parent, ITool superClass, String Id, String name, boolean isExtensionElement) { |
| super(resolvedDefault); |
| this.parent = parent; |
| setSuperClassInternal(superClass); |
| setManagedBuildRevision(parent.getManagedBuildRevision()); |
| if (getSuperClass() != null) { |
| superClassId = getSuperClass().getId(); |
| } |
| |
| setId(Id); |
| setName(name); |
| setVersion(getVersionFromId()); |
| |
| // if(!superClass.isExtensionElement()){ |
| // ((Tool)superClass).updateScannerInfoSettingsToInputTypes(); |
| // } |
| |
| isExtensionTool = isExtensionElement; |
| if (isExtensionElement) { |
| // Hook me up to the Managed Build Manager |
| ManagedBuildManager.addExtensionTool(this); |
| } else { |
| setDirty(true); |
| setRebuildState(true); |
| } |
| } |
| |
| /** |
| * This constructor is called to create a Tool whose attributes and children will be |
| * added by separate calls. |
| * |
| * @param parent - The parent of the tool, if any |
| * @param superClass - The superClass, if any |
| * @param Id - The id for the new tool |
| * @param name - The name for the new tool |
| * @param isExtensionElement - Indicates whether this is an extension element or a managed project element |
| */ |
| |
| public Tool(ResourceConfiguration parent, ITool superClass, String Id, String name, boolean isExtensionElement) { |
| super(resolvedDefault); |
| this.parent = parent; |
| setSuperClassInternal(superClass); |
| setManagedBuildRevision(parent.getManagedBuildRevision()); |
| if (getSuperClass() != null) { |
| superClassId = getSuperClass().getId(); |
| } |
| setId(Id); |
| setName(name); |
| setVersion(getVersionFromId()); |
| |
| isExtensionTool = isExtensionElement; |
| // if(superClass != null && !superClass.isExtensionElement()){ |
| // ((Tool)superClass).updateScannerInfoSettingsToInputTypes(); |
| // } |
| if (isExtensionElement) { |
| // Hook me up to the Managed Build Manager |
| ManagedBuildManager.addExtensionTool(this); |
| } else { |
| setDirty(true); |
| setRebuildState(true); |
| } |
| } |
| |
| /** |
| * Create a <code>Tool</code> based on the specification stored in the |
| * project file (.cdtbuild). |
| * |
| * @param parent The <code>IToolChain</code> or <code>IResourceConfiguration</code> |
| * the tool will be added to. |
| * @param element The XML element that contains the tool settings. |
| * @param managedBuildRevision the fileVersion of Managed Build System |
| */ |
| public Tool(IBuildObject parent, ICStorageElement element, String managedBuildRevision) { |
| super(resolvedDefault); |
| this.parent = parent; |
| isExtensionTool = false; |
| |
| // Set the managedBuildRevsion |
| setManagedBuildRevision(managedBuildRevision); |
| |
| // Initialize from the XML attributes |
| loadFromProject(element); |
| |
| // set up the category map |
| addOptionCategory(this); |
| |
| // Load children |
| ICStorageElement toolElements[] = element.getChildren(); |
| for (int i = 0; i < toolElements.length; ++i) { |
| ICStorageElement toolElement = toolElements[i]; |
| if (loadChild(toolElement)) { |
| // do nothing |
| } else if (toolElement.getName().equals(ITool.INPUT_TYPE)) { |
| InputType inputType = new InputType(this, toolElement); |
| addInputType(inputType); |
| } else if (toolElement.getName().equals(ITool.OUTPUT_TYPE)) { |
| OutputType outputType = new OutputType(this, toolElement); |
| addOutputType(outputType); |
| } |
| } |
| |
| String rebuild = PropertyManager.getInstance().getProperty(this, REBUILD_STATE); |
| if (rebuild == null || Boolean.valueOf(rebuild).booleanValue()) |
| rebuildState = true; |
| |
| } |
| |
| /** |
| * Create a {@link Tool} based upon an existing tool. |
| * |
| * @param parent The {@link IToolChain} or {@link IResourceConfiguration} |
| * the tool will be added to. |
| * @param toolSuperClass superclass of the tool |
| * @param Id The new Tool ID |
| * @param name The new Tool name |
| * @param tool The existing tool to clone. |
| */ |
| public Tool(IBuildObject parent, ITool toolSuperClass, String Id, String name, Tool tool) { |
| this(parent, toolSuperClass.getId(), Id, name, tool); |
| |
| setSuperClassInternal(toolSuperClass); |
| } |
| |
| public Tool(IBuildObject parent, String toolSuperClassId, String Id, String name, Tool tool) { |
| super(resolvedDefault); |
| this.parent = parent; |
| // if (toolSuperClass != null) { |
| // setSuperClassInternal( toolSuperClass ); |
| // } else { |
| // setSuperClassInternal( tool.getSuperClass() ); |
| // } |
| // if (getSuperClass() != null) { |
| superClassId = toolSuperClassId;//getSuperClass().getId(); |
| // } |
| setId(Id); |
| setName(name); |
| |
| // Set the managedBuildRevision & the version |
| setManagedBuildRevision(tool.getManagedBuildRevision()); |
| setVersion(getVersionFromId()); |
| |
| isExtensionTool = false; |
| boolean copyIds = Id.equals(tool.id); |
| |
| // Copy the remaining attributes |
| if (tool.versionsSupported != null) { |
| versionsSupported = tool.versionsSupported; |
| } |
| if (tool.convertToId != null) { |
| convertToId = tool.convertToId; |
| } |
| if (tool.unusedChildren != null) { |
| unusedChildren = tool.unusedChildren; |
| } |
| if (tool.errorParserIds != null) { |
| errorParserIds = tool.errorParserIds; |
| } |
| if (tool.isAbstract != null) { |
| isAbstract = tool.isAbstract; |
| } |
| if (tool.command != null) { |
| command = tool.command; |
| } |
| if (tool.commandLinePattern != null) { |
| commandLinePattern = tool.commandLinePattern; |
| } |
| if (tool.inputExtensions != null) { |
| inputExtensions = new ArrayList<>(tool.inputExtensions); |
| } |
| if (tool.interfaceExtensions != null) { |
| interfaceExtensions = new ArrayList<>(tool.interfaceExtensions); |
| } |
| if (tool.natureFilter != null) { |
| natureFilter = tool.natureFilter; |
| } |
| if (tool.outputExtensions != null) { |
| outputExtensions = tool.outputExtensions; |
| } |
| if (tool.outputFlag != null) { |
| outputFlag = tool.outputFlag; |
| } |
| if (tool.outputPrefix != null) { |
| outputPrefix = tool.outputPrefix; |
| } |
| if (tool.advancedInputCategory != null) { |
| advancedInputCategory = tool.advancedInputCategory; |
| } |
| if (tool.customBuildStep != null) { |
| customBuildStep = tool.customBuildStep; |
| } |
| if (tool.announcement != null) { |
| announcement = tool.announcement; |
| } |
| if (tool.isHidden != null) { |
| isHidden = tool.isHidden; |
| } |
| supportsManagedBuild = tool.supportsManagedBuild; |
| |
| commandLineGenerator = tool.commandLineGenerator; |
| if (commandLineGenerator == null) { |
| // only need XML if the generator hasn't been created yet |
| commandLineGeneratorElement = tool.commandLineGeneratorElement; |
| } |
| |
| dependencyGenerator = tool.dependencyGenerator; |
| if (dependencyGenerator == null) { |
| // only need XML if the generator hasn't been created yet |
| dependencyGeneratorElement = tool.dependencyGeneratorElement; |
| } |
| |
| pathconverterElement = tool.pathconverterElement; |
| optionPathConverter = tool.optionPathConverter; |
| |
| if (tool.envVarBuildPathList != null) |
| envVarBuildPathList = new ArrayList<>(tool.envVarBuildPathList); |
| |
| // tool.updateScannerInfoSettingsToInputTypes(); |
| |
| // Clone the children in superclass |
| super.copyChildren(tool); |
| // Clone the children |
| if (tool.inputTypeList != null) { |
| @SuppressWarnings("unchecked") |
| HashMap<String, PathInfoCache> clone = (HashMap<String, PathInfoCache>) tool.discoveredInfoMap.clone(); |
| discoveredInfoMap = clone; |
| for (InputType inputType : tool.getInputTypeList()) { |
| PathInfoCache cache = discoveredInfoMap.remove(getTypeKey(inputType)); |
| int nnn = ManagedBuildManager.getRandomNumber(); |
| String subId; |
| String subName; |
| if (inputType.getSuperClass() != null) { |
| subId = copyIds ? inputType.id : inputType.getSuperClass().getId() + "." + nnn; //$NON-NLS-1$ |
| subName = inputType.getSuperClass().getName(); |
| } else { |
| subId = copyIds ? inputType.id : inputType.getId() + "." + nnn; //$NON-NLS-1$ |
| subName = inputType.getName(); |
| } |
| InputType newInputType = new InputType(this, subId, subName, inputType); |
| addInputType(newInputType); |
| if (cache != null) { |
| discoveredInfoMap.put(getTypeKey(newInputType), cache); |
| } |
| } |
| } |
| if (tool.outputTypeList != null) { |
| for (OutputType outputType : tool.getOutputTypeList()) { |
| int nnn = ManagedBuildManager.getRandomNumber(); |
| String subId; |
| String subName; |
| if (outputType.getSuperClass() != null) { |
| subId = copyIds ? outputType.id : outputType.getSuperClass().getId() + "." + nnn; //$NON-NLS-1$ |
| subName = outputType.getSuperClass().getName(); |
| } else { |
| subId = copyIds ? outputType.id : outputType.getId() + "." + nnn; //$NON-NLS-1$ |
| subName = outputType.getName(); |
| } |
| OutputType newOutputType = new OutputType(this, subId, subName, outputType); |
| addOutputType(newOutputType); |
| } |
| } |
| |
| // icon |
| if (tool.iconPathURL != null) { |
| iconPathURL = tool.iconPathURL; |
| } |
| |
| if (copyIds) { |
| isDirty = tool.isDirty; |
| rebuildState = tool.rebuildState; |
| } else { |
| setDirty(true); |
| setRebuildState(true); |
| } |
| } |
| |
| void copyNonoverriddenSettings(Tool tool) { |
| if (name == null) |
| setName(tool.name); |
| |
| // Set the managedBuildRevision & the version |
| // setManagedBuildRevision(tool.getManagedBuildRevision()); |
| // setVersion(getVersionFromId()); |
| |
| // Copy the remaining attributes |
| if (versionsSupported == null) { |
| versionsSupported = tool.versionsSupported; |
| } |
| if (convertToId == null) { |
| convertToId = tool.convertToId; |
| } |
| if (unusedChildren == null) { |
| unusedChildren = tool.unusedChildren; |
| } |
| if (errorParserIds == null) { |
| errorParserIds = tool.errorParserIds; |
| } |
| if (isAbstract == null) { |
| isAbstract = tool.isAbstract; |
| } |
| if (command == null) { |
| command = tool.command; |
| } |
| if (commandLinePattern == null) { |
| commandLinePattern = tool.commandLinePattern; |
| } |
| if (inputExtensions == null && tool.inputExtensions != null) { |
| inputExtensions = new ArrayList<>(tool.inputExtensions); |
| } |
| if (interfaceExtensions == null && tool.interfaceExtensions != null) { |
| interfaceExtensions = new ArrayList<>(tool.interfaceExtensions); |
| } |
| if (natureFilter == null) { |
| natureFilter = tool.natureFilter; |
| } |
| if (outputExtensions == null) { |
| outputExtensions = tool.outputExtensions; |
| } |
| if (outputFlag == null) { |
| outputFlag = tool.outputFlag; |
| } |
| if (outputPrefix == null) { |
| outputPrefix = tool.outputPrefix; |
| } |
| if (advancedInputCategory == null) { |
| advancedInputCategory = tool.advancedInputCategory; |
| } |
| if (customBuildStep == null) { |
| customBuildStep = tool.customBuildStep; |
| } |
| if (announcement == null) { |
| announcement = tool.announcement; |
| } |
| if (isHidden == null) { |
| isHidden = tool.isHidden; |
| } |
| |
| if (supportsManagedBuild == null) |
| supportsManagedBuild = tool.supportsManagedBuild; |
| |
| if (commandLineGenerator == null) { |
| commandLineGenerator = tool.commandLineGenerator; |
| // only copy the generator element if we don't already have a generator |
| if (commandLineGenerator == null && commandLineGeneratorElement == null) |
| commandLineGeneratorElement = tool.commandLineGeneratorElement; |
| } |
| |
| if (dependencyGenerator == null) { |
| dependencyGenerator = tool.dependencyGenerator; |
| |
| // only copy the generator element if we don't already have a generator |
| if (dependencyGenerator == null) { |
| if (dependencyGeneratorElement == null) |
| dependencyGeneratorElement = tool.dependencyGeneratorElement; |
| } |
| } |
| |
| if (optionPathConverter == null) { |
| optionPathConverter = tool.optionPathConverter; |
| |
| if (optionPathConverter == null) { |
| if (pathconverterElement == null) |
| pathconverterElement = tool.pathconverterElement; |
| } |
| } |
| |
| if (envVarBuildPathList == null && tool.envVarBuildPathList != null) |
| envVarBuildPathList = new ArrayList<>(tool.envVarBuildPathList); |
| |
| // Clone the children in superclass |
| super.copyNonoverriddenSettings(tool); |
| // Clone the children |
| if (inputTypeList == null && tool.inputTypeList != null) { |
| for (InputType inputType : tool.getInputTypeList()) { |
| int nnn = ManagedBuildManager.getRandomNumber(); |
| String subId; |
| String subName; |
| if (inputType.getSuperClass() != null) { |
| subId = inputType.getSuperClass().getId() + "." + nnn; //$NON-NLS-1$ |
| subName = inputType.getSuperClass().getName(); |
| } else { |
| subId = inputType.getId() + "." + nnn; //$NON-NLS-1$ |
| subName = inputType.getName(); |
| } |
| InputType newInputType = new InputType(this, subId, subName, inputType); |
| addInputType(newInputType); |
| } |
| } |
| if (outputTypeList == null && tool.outputTypeList != null) { |
| for (OutputType outputType : tool.getOutputTypeList()) { |
| int nnn = ManagedBuildManager.getRandomNumber(); |
| String subId; |
| String subName; |
| if (outputType.getSuperClass() != null) { |
| subId = outputType.getSuperClass().getId() + "." + nnn; //$NON-NLS-1$ |
| subName = outputType.getSuperClass().getName(); |
| } else { |
| subId = outputType.getId() + "." + nnn; //$NON-NLS-1$ |
| subName = outputType.getName(); |
| } |
| OutputType newOutputType = new OutputType(this, subId, subName, outputType); |
| addOutputType(newOutputType); |
| } |
| } |
| |
| // icon |
| if (iconPathURL == null) { |
| iconPathURL = tool.iconPathURL; |
| } |
| |
| setDirty(true); |
| setRebuildState(true); |
| } |
| |
| /* |
| * E L E M E N T A T T R I B U T E R E A D E R S A N D W R I T E R S |
| */ |
| |
| /* (non-Javadoc) |
| * Load the tool information from the XML element specified in the |
| * argument |
| * @param element An XML element containing the tool information |
| */ |
| protected void loadFromManifest(IManagedConfigElement element) { |
| // setup for resolving |
| ManagedBuildManager.putConfigElement(this, element); |
| |
| // id |
| setId(SafeStringInterner.safeIntern(element.getAttribute(IBuildObject.ID))); |
| |
| // name |
| setName(SafeStringInterner.safeIntern(element.getAttribute(IBuildObject.NAME))); |
| |
| // version |
| setVersion(getVersionFromId()); |
| |
| // superClass |
| superClassId = SafeStringInterner.safeIntern(element.getAttribute(IProjectType.SUPERCLASS)); |
| |
| // Get the unused children, if any |
| unusedChildren = SafeStringInterner.safeIntern(element.getAttribute(IProjectType.UNUSED_CHILDREN)); |
| |
| // Get the 'versionsSupported' attribute |
| versionsSupported = SafeStringInterner.safeIntern(element.getAttribute(VERSIONS_SUPPORTED)); |
| |
| // Get the 'convertToId' attribute |
| convertToId = SafeStringInterner.safeIntern(element.getAttribute(CONVERT_TO_ID)); |
| |
| // isAbstract |
| String isAbs = element.getAttribute(IProjectType.IS_ABSTRACT); |
| if (isAbs != null) { |
| isAbstract = Boolean.parseBoolean(isAbs); |
| } |
| |
| // Get the semicolon separated list of IDs of the error parsers |
| errorParserIds = SafeStringInterner |
| .safeIntern(SafeStringInterner.safeIntern(element.getAttribute(IToolChain.ERROR_PARSERS))); |
| |
| // Get the nature filter |
| String nature = element.getAttribute(NATURE); |
| if (nature != null) { |
| if ("both".equals(nature)) { //$NON-NLS-1$ |
| natureFilter = FILTER_BOTH; |
| } else if ("cnature".equals(nature)) { //$NON-NLS-1$ |
| natureFilter = FILTER_C; |
| } else if ("ccnature".equals(nature)) { //$NON-NLS-1$ |
| natureFilter = FILTER_CC; |
| } else { |
| natureFilter = FILTER_BOTH; |
| } |
| } |
| |
| // Get the supported input file extensions |
| String inputs = element.getAttribute(ITool.SOURCES); |
| if (inputs != null) { |
| StringTokenizer tokenizer = new StringTokenizer(inputs, DEFAULT_SEPARATOR); |
| while (tokenizer.hasMoreElements()) { |
| getInputExtensionsList().add(SafeStringInterner.safeIntern(tokenizer.nextToken())); |
| } |
| } |
| |
| // Get the interface (header file) extensions |
| String headers = element.getAttribute(INTERFACE_EXTS); |
| if (headers != null) { |
| StringTokenizer tokenizer = new StringTokenizer(headers, DEFAULT_SEPARATOR); |
| while (tokenizer.hasMoreElements()) { |
| getInterfaceExtensionsList().add(SafeStringInterner.safeIntern(tokenizer.nextToken())); |
| } |
| } |
| |
| // Get the output extension |
| outputExtensions = SafeStringInterner.safeIntern(element.getAttribute(ITool.OUTPUTS)); |
| |
| // Get the tool invocation command |
| command = SafeStringInterner.safeIntern(element.getAttribute(ITool.COMMAND)); |
| |
| // Get the flag to control output |
| outputFlag = SafeStringInterner.safeIntern(element.getAttribute(ITool.OUTPUT_FLAG)); |
| |
| // Get the output prefix |
| outputPrefix = SafeStringInterner.safeIntern(element.getAttribute(ITool.OUTPUT_PREFIX)); |
| |
| // Get command line pattern |
| commandLinePattern = SafeStringInterner.safeIntern(element.getAttribute(ITool.COMMAND_LINE_PATTERN)); |
| |
| // Get advancedInputCategory |
| String advInput = element.getAttribute(ITool.ADVANCED_INPUT_CATEGORY); |
| if (advInput != null) { |
| advancedInputCategory = Boolean.parseBoolean(advInput); |
| } |
| |
| // Get customBuildStep |
| String cbs = element.getAttribute(ITool.CUSTOM_BUILD_STEP); |
| if (cbs != null) { |
| customBuildStep = Boolean.parseBoolean(cbs); |
| } |
| |
| // Get the announcement text |
| announcement = SafeStringInterner.safeIntern(element.getAttribute(ITool.ANNOUNCEMENT)); |
| |
| // Store the configuration element IFF there is a command line generator defined |
| String commandLineGenerator = element.getAttribute(COMMAND_LINE_GENERATOR); |
| if (commandLineGenerator != null && element instanceof DefaultManagedConfigElement) { |
| commandLineGeneratorElement = ((DefaultManagedConfigElement) element).getConfigurationElement(); |
| } |
| |
| // Store the configuration element IFF there is a dependency generator defined |
| String depGenerator = element.getAttribute(DEP_CALC_ID); |
| if (depGenerator != null && element instanceof DefaultManagedConfigElement) { |
| dependencyGeneratorElement = ((DefaultManagedConfigElement) element).getConfigurationElement(); |
| } |
| |
| // icon |
| if (element.getAttribute(IOptionCategory.ICON) != null && element instanceof DefaultManagedConfigElement) { |
| String icon = element.getAttribute(IOptionCategory.ICON); |
| iconPathURL = ManagedBuildManager.getURLInBuildDefinitions((DefaultManagedConfigElement) element, |
| new Path(icon)); |
| } |
| |
| // optionPathConverter |
| String pathconverterTypeName = element.getAttribute(ITool.OPTIONPATHCONVERTER); |
| if (pathconverterTypeName != null && element instanceof DefaultManagedConfigElement) { |
| pathconverterElement = ((DefaultManagedConfigElement) element).getConfigurationElement(); |
| } |
| |
| String tmp = element.getAttribute(SUPPORTS_MANAGED_BUILD); |
| if (tmp != null) |
| supportsManagedBuild = Boolean.valueOf(tmp); |
| |
| // isHidden |
| String hidden = element.getAttribute(ITool.IS_HIDDEN); |
| if (hidden != null) { |
| isHidden = Boolean.valueOf(hidden); |
| } |
| |
| scannerConfigDiscoveryProfileId = SafeStringInterner |
| .safeIntern(element.getAttribute(IToolChain.SCANNER_CONFIG_PROFILE_ID)); |
| |
| tmp = element.getAttribute(IS_SYSTEM); |
| if (tmp != null) |
| isTest = Boolean.valueOf(tmp).booleanValue(); |
| } |
| |
| /* (non-Javadoc) |
| * Initialize the tool information from the XML element |
| * specified in the argument |
| * |
| * @param element An XML element containing the tool information |
| */ |
| protected void loadFromProject(ICStorageElement element) { |
| |
| // id (unique, do not intern) |
| setId(element.getAttribute(IBuildObject.ID)); |
| |
| // name |
| if (element.getAttribute(IBuildObject.NAME) != null) { |
| setName(SafeStringInterner.safeIntern(element.getAttribute(IBuildObject.NAME))); |
| } |
| |
| // version |
| setVersion(getVersionFromId()); |
| |
| // superClass |
| superClassId = SafeStringInterner.safeIntern(element.getAttribute(IProjectType.SUPERCLASS)); |
| |
| // Get the unused children, if any |
| if (element.getAttribute(IProjectType.UNUSED_CHILDREN) != null) { |
| unusedChildren = SafeStringInterner.safeIntern(element.getAttribute(IProjectType.UNUSED_CHILDREN)); |
| } |
| |
| // isAbstract |
| if (element.getAttribute(IProjectType.IS_ABSTRACT) != null) { |
| String isAbs = element.getAttribute(IProjectType.IS_ABSTRACT); |
| if (isAbs != null) { |
| isAbstract = Boolean.parseBoolean(isAbs); |
| } |
| } |
| |
| // Get the 'versionSupported' attribute |
| if (element.getAttribute(VERSIONS_SUPPORTED) != null) { |
| versionsSupported = SafeStringInterner.safeIntern(element.getAttribute(VERSIONS_SUPPORTED)); |
| } |
| |
| // Get the 'convertToId' id |
| if (element.getAttribute(CONVERT_TO_ID) != null) { |
| convertToId = SafeStringInterner.safeIntern(element.getAttribute(CONVERT_TO_ID)); |
| } |
| |
| // Get the semicolon separated list of IDs of the error parsers |
| if (element.getAttribute(IToolChain.ERROR_PARSERS) != null) { |
| errorParserIds = SafeStringInterner.safeIntern(element.getAttribute(IToolChain.ERROR_PARSERS)); |
| } |
| |
| // Get the nature filter |
| if (element.getAttribute(NATURE) != null) { |
| String nature = element.getAttribute(NATURE); |
| if (nature != null) { |
| if ("both".equals(nature)) { //$NON-NLS-1$ |
| natureFilter = FILTER_BOTH; |
| } else if ("cnature".equals(nature)) { //$NON-NLS-1$ |
| natureFilter = FILTER_C; |
| } else if ("ccnature".equals(nature)) { //$NON-NLS-1$ |
| natureFilter = FILTER_CC; |
| } else { |
| natureFilter = FILTER_BOTH; |
| } |
| } |
| } |
| |
| // Get the supported input file extension |
| if (element.getAttribute(ITool.SOURCES) != null) { |
| String inputs = element.getAttribute(ITool.SOURCES); |
| if (inputs != null) { |
| StringTokenizer tokenizer = new StringTokenizer(inputs, DEFAULT_SEPARATOR); |
| while (tokenizer.hasMoreElements()) { |
| getInputExtensionsList().add(SafeStringInterner.safeIntern(tokenizer.nextToken())); |
| } |
| } |
| } |
| |
| // Get the interface (header file) extensions |
| if (element.getAttribute(INTERFACE_EXTS) != null) { |
| String headers = element.getAttribute(INTERFACE_EXTS); |
| if (headers != null) { |
| StringTokenizer tokenizer = new StringTokenizer(headers, DEFAULT_SEPARATOR); |
| while (tokenizer.hasMoreElements()) { |
| getInterfaceExtensionsList().add(SafeStringInterner.safeIntern(tokenizer.nextToken())); |
| } |
| } |
| } |
| |
| // Get the output extension |
| if (element.getAttribute(ITool.OUTPUTS) != null) { |
| outputExtensions = SafeStringInterner.safeIntern(element.getAttribute(ITool.OUTPUTS)); |
| } |
| |
| // Get the tool invocation command |
| if (element.getAttribute(ITool.COMMAND) != null) { |
| command = SafeStringInterner.safeIntern(element.getAttribute(ITool.COMMAND)); |
| } |
| |
| // Get the flag to control output |
| if (element.getAttribute(ITool.OUTPUT_FLAG) != null) { |
| outputFlag = SafeStringInterner.safeIntern(element.getAttribute(ITool.OUTPUT_FLAG)); |
| } |
| |
| // Get the output prefix |
| if (element.getAttribute(ITool.OUTPUT_PREFIX) != null) { |
| outputPrefix = SafeStringInterner.safeIntern(element.getAttribute(ITool.OUTPUT_PREFIX)); |
| } |
| |
| // Get command line pattern |
| if (element.getAttribute(ITool.COMMAND_LINE_PATTERN) != null) { |
| commandLinePattern = SafeStringInterner.safeIntern(element.getAttribute(ITool.COMMAND_LINE_PATTERN)); |
| } |
| |
| // advancedInputCategory |
| if (element.getAttribute(ITool.ADVANCED_INPUT_CATEGORY) != null) { |
| String advInput = element.getAttribute(ITool.ADVANCED_INPUT_CATEGORY); |
| if (advInput != null) { |
| advancedInputCategory = Boolean.parseBoolean(advInput); |
| } |
| } |
| |
| // customBuildStep |
| if (element.getAttribute(ITool.CUSTOM_BUILD_STEP) != null) { |
| String cbs = element.getAttribute(ITool.CUSTOM_BUILD_STEP); |
| if (cbs != null) { |
| customBuildStep = Boolean.parseBoolean(cbs); |
| } |
| } |
| |
| // Get the announcement text |
| if (element.getAttribute(ITool.ANNOUNCEMENT) != null) { |
| announcement = SafeStringInterner.safeIntern(element.getAttribute(ITool.ANNOUNCEMENT)); |
| } |
| |
| // Get the tool hidden setting |
| if (element.getAttribute(ITool.IS_HIDDEN) != null) { |
| String hidden = element.getAttribute(ITool.IS_HIDDEN); |
| if (hidden != null) { |
| isHidden = Boolean.valueOf(hidden); |
| } |
| } |
| |
| // icon - was saved as URL in string form |
| if (element.getAttribute(IOptionCategory.ICON) != null) { |
| String iconPath = element.getAttribute(IOptionCategory.ICON); |
| try { |
| iconPathURL = new URL(iconPath); |
| } catch (MalformedURLException e) { |
| // Print a warning |
| ManagedBuildManager.outputIconError(iconPath); |
| iconPathURL = null; |
| } |
| } |
| |
| scannerConfigDiscoveryProfileId = SafeStringInterner |
| .safeIntern(element.getAttribute(IToolChain.SCANNER_CONFIG_PROFILE_ID)); |
| } |
| |
| void resolveProjectReferences(boolean onLoad) { |
| if (superClassId != null && superClassId.length() > 0) { |
| ITool tool = ManagedBuildManager.getExtensionTool(superClassId); |
| if (tool == null) { |
| Configuration cfg = (Configuration) getParentResourceInfo().getParent(); |
| tool = cfg.findToolById(superClassId); |
| } |
| if (tool != null) |
| superClass = tool; |
| |
| if (onLoad) { |
| // Check for migration support |
| checkForMigrationSupport(); |
| } |
| } |
| } |
| |
| private void loadProperties(IManagedConfigElement el) { |
| supportedProperties = new SupportedProperties(el); |
| } |
| |
| /** |
| * Persist the tool to the project file. |
| */ |
| @Override |
| public void serialize(ICStorageElement element) { |
| try { |
| if (getSuperClass() != null) |
| element.setAttribute(IProjectType.SUPERCLASS, getSuperClass().getId()); |
| |
| // id |
| element.setAttribute(IBuildObject.ID, id); |
| |
| // name |
| if (name != null) { |
| element.setAttribute(IBuildObject.NAME, name); |
| } |
| |
| // unused children |
| if (unusedChildren != null) { |
| element.setAttribute(IProjectType.UNUSED_CHILDREN, unusedChildren); |
| } |
| |
| // isAbstract |
| if (isAbstract != null) { |
| element.setAttribute(IProjectType.IS_ABSTRACT, isAbstract.toString()); |
| } |
| |
| // versionsSupported |
| if (versionsSupported != null) { |
| element.setAttribute(VERSIONS_SUPPORTED, versionsSupported); |
| } |
| |
| // convertToId |
| if (convertToId != null) { |
| element.setAttribute(CONVERT_TO_ID, convertToId); |
| } |
| |
| // error parsers |
| if (errorParserIds != null) { |
| element.setAttribute(IToolChain.ERROR_PARSERS, errorParserIds); |
| } |
| |
| // nature filter |
| if (natureFilter != null) { |
| String nature; |
| if (natureFilter.intValue() == FILTER_C) { |
| nature = "cnature"; //$NON-NLS-1$ |
| } else if (natureFilter.intValue() == FILTER_CC) { |
| nature = "ccnature"; //$NON-NLS-1$ |
| } else { |
| nature = "both"; //$NON-NLS-1$ |
| } |
| element.setAttribute(NATURE, nature); |
| } |
| |
| // input file extensions |
| if (getInputExtensionsList().size() > 0) { |
| Iterator<String> iter = getInputExtensionsList().listIterator(); |
| String inputs = iter.next(); |
| while (iter.hasNext()) { |
| inputs += DEFAULT_SEPARATOR; |
| inputs += iter.next(); |
| } |
| element.setAttribute(ITool.SOURCES, inputs); |
| } |
| |
| // interface (header file) extensions |
| if (getInterfaceExtensionsList().size() > 0) { |
| Iterator<String> iter = getInterfaceExtensionsList().listIterator(); |
| String headers = iter.next(); |
| while (iter.hasNext()) { |
| headers += DEFAULT_SEPARATOR; |
| headers += iter.next(); |
| } |
| element.setAttribute(INTERFACE_EXTS, headers); |
| } |
| |
| // output extension |
| if (outputExtensions != null) { |
| element.setAttribute(ITool.OUTPUTS, outputExtensions); |
| } |
| |
| // command |
| if (command != null) { |
| element.setAttribute(ITool.COMMAND, command); |
| } |
| |
| // flag to control output |
| if (outputFlag != null) { |
| element.setAttribute(ITool.OUTPUT_FLAG, outputFlag); |
| } |
| |
| // output prefix |
| if (outputPrefix != null) { |
| element.setAttribute(ITool.OUTPUT_PREFIX, outputPrefix); |
| } |
| |
| // command line pattern |
| if (commandLinePattern != null) { |
| element.setAttribute(ITool.COMMAND_LINE_PATTERN, commandLinePattern); |
| } |
| |
| // advancedInputCategory |
| if (advancedInputCategory != null) { |
| element.setAttribute(ITool.ADVANCED_INPUT_CATEGORY, advancedInputCategory.toString()); |
| } |
| |
| // customBuildStep |
| if (customBuildStep != null) { |
| element.setAttribute(ITool.CUSTOM_BUILD_STEP, customBuildStep.toString()); |
| } |
| |
| // announcement text |
| if (announcement != null) { |
| element.setAttribute(ITool.ANNOUNCEMENT, announcement); |
| } |
| |
| // hidden tool |
| if (isHidden != null) { |
| element.setAttribute(ITool.IS_HIDDEN, isHidden.toString()); |
| } |
| |
| // Serialize elements from my super class |
| super.serialize(element); |
| |
| // Serialize my children |
| for (InputType type : getInputTypeList()) |
| type.serialize(element.createChild(INPUT_TYPE)); |
| |
| for (OutputType type : getOutputTypeList()) |
| type.serialize(element.createChild(OUTPUT_TYPE)); |
| |
| // Note: command line generator cannot be specified in a project file because |
| // an IConfigurationElement is needed to load it! |
| if (commandLineGeneratorElement != null) { |
| // TODO: issue warning? |
| } |
| |
| // Note: dependency generator cannot be specified in a project file because |
| // an IConfigurationElement is needed to load it! |
| if (dependencyGeneratorElement != null) { |
| // TODO: issue warning? |
| } |
| |
| if (iconPathURL != null) { |
| // Save as URL in string form |
| element.setAttribute(IOptionCategory.ICON, iconPathURL.toString()); |
| } |
| |
| // Note: optionPathConverter cannot be specified in a project file because |
| // an IConfigurationElement is needed to load it! |
| if (pathconverterElement != null) { |
| // TODO: issue warning? |
| } |
| |
| if (scannerConfigDiscoveryProfileId != null) |
| element.setAttribute(IToolChain.SCANNER_CONFIG_PROFILE_ID, scannerConfigDiscoveryProfileId); |
| |
| saveRebuildState(); |
| |
| // I am clean now |
| isDirty = false; |
| } catch (Exception e) { |
| // TODO: issue an error message |
| } |
| } |
| |
| /* |
| * P A R E N T A N D C H I L D H A N D L I N G |
| */ |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#getParent() |
| */ |
| @Override |
| public IBuildObject getParent() { |
| return parent; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#setParent(IBuildObject) |
| */ |
| public void setToolParent(IBuildObject newParent) { |
| this.parent = newParent; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getTopOptionCategory() |
| */ |
| @Override |
| public IOptionCategory getTopOptionCategory() { |
| return this; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#createInputType(IInputType, String, String, boolean) |
| */ |
| @Override |
| public IInputType createInputType(IInputType superClass, String Id, String name, boolean isExtensionElement) { |
| InputType type = superClass == null || superClass.isExtensionElement() |
| ? new InputType(this, superClass, Id, name, isExtensionElement) |
| : new InputType(this, Id, name, (InputType) superClass); |
| |
| if (superClass != null) { |
| BuildLanguageData data = (BuildLanguageData) typeToDataMap.remove(superClass); |
| if (data != null) { |
| data.updateInputType(type); |
| typeToDataMap.put(type, data); |
| } |
| } |
| addInputType(type); |
| setDirty(true); |
| |
| return type; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#removeInputType(IInputType) |
| */ |
| @Override |
| public void removeInputType(IInputType type) { |
| getInputTypeList().remove(type); |
| getInputTypeMap().remove(type.getId()); |
| setDirty(true); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getInputTypes() |
| */ |
| @Override |
| public IInputType[] getInputTypes() { |
| IInputType[] types = getAllInputTypes(); |
| return filterInputTypes(types); |
| } |
| |
| public IInputType[] getAllInputTypes() { |
| IInputType[] types = null; |
| // Merge our input types with our superclass' input types. |
| if (getSuperClass() != null) { |
| types = ((Tool) getSuperClass()).getAllInputTypes(); |
| } |
| // Our options take precedence. |
| Vector<InputType> ourTypes = getInputTypeList(); |
| if (types != null) { |
| // Avoid replacing a replacement. See bug 303735 |
| boolean[] typesWasReplaced = new boolean[types.length]; |
| |
| for (int i = 0; i < ourTypes.size(); i++) { |
| IInputType ourType = ourTypes.get(i); |
| int j; |
| for (j = 0; j < types.length; j++) { |
| IInputType otherTypeToCheck = ManagedBuildManager.getExtensionInputType(types[j]); |
| if (otherTypeToCheck == null) |
| otherTypeToCheck = types[j]; |
| |
| if (ourType.getSuperClass() != null |
| && ourType.getSuperClass().getId().equals(otherTypeToCheck.getId()) |
| && !typesWasReplaced[j]) { |
| types[j] = ourType; |
| typesWasReplaced[j] = true; |
| break; |
| } |
| } |
| // No Match? Add it. |
| if (j == types.length) { |
| IInputType[] newTypes = new IInputType[types.length + 1]; |
| boolean[] newTypesWasReplaced = new boolean[types.length + 1]; |
| for (int k = 0; k < types.length; k++) { |
| newTypes[k] = types[k]; |
| newTypesWasReplaced[k] = typesWasReplaced[k]; |
| } |
| newTypes[j] = ourType; |
| types = newTypes; |
| typesWasReplaced = newTypesWasReplaced; |
| } |
| } |
| } else { |
| types = ourTypes.toArray(new IInputType[ourTypes.size()]); |
| } |
| return types; |
| } |
| |
| private boolean hasInputTypes() { |
| if (getInputTypeList().size() > 0) |
| return true; |
| return false; |
| } |
| |
| @Override |
| public IInputType getInputTypeById(String id) { |
| InputType type = (InputType) getAllInputTypeById(id); |
| |
| if (isExtensionTool || type == null || type.isEnabled(this)) |
| return type; |
| return null; |
| } |
| |
| public IInputType getAllInputTypeById(String id) { |
| IInputType type = getInputTypeMap().get(id); |
| if (type == null) { |
| if (getSuperClass() != null) { |
| return ((Tool) getSuperClass()).getAllInputTypeById(id); |
| } |
| } |
| |
| return type; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#createOutputType(IOutputType, String, String, boolean) |
| */ |
| @Override |
| public IOutputType createOutputType(IOutputType superClass, String Id, String name, boolean isExtensionElement) { |
| OutputType type = new OutputType(this, superClass, Id, name, isExtensionElement); |
| addOutputType(type); |
| setDirty(true); |
| return type; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#removeOutputType(IOutputType) |
| */ |
| @Override |
| public void removeOutputType(IOutputType type) { |
| getOutputTypeList().remove(type); |
| getOutputTypeMap().remove(type.getId()); |
| setDirty(true); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getOutputTypes() |
| */ |
| @Override |
| public IOutputType[] getOutputTypes() { |
| IOutputType[] types = getAllOutputTypes(); |
| |
| return filterOutputTypes(types); |
| } |
| |
| public IOutputType[] getAllOutputTypes() { |
| IOutputType[] types = null; |
| // Merge our output types with our superclass' output types. |
| if (getSuperClass() != null) { |
| types = ((Tool) getSuperClass()).getAllOutputTypes(); |
| } |
| // Our options take precedence. |
| Vector<OutputType> ourTypes = getOutputTypeList(); |
| if (types != null) { |
| for (int i = 0; i < ourTypes.size(); i++) { |
| IOutputType ourType = ourTypes.get(i); |
| int j; |
| for (j = 0; j < types.length; j++) { |
| if (ourType.getSuperClass() != null && ourType.getSuperClass().getId().equals(types[j].getId())) { |
| types[j] = ourType; |
| break; |
| } |
| } |
| // No Match? Add it. |
| if (j == types.length) { |
| IOutputType[] newTypes = new IOutputType[types.length + 1]; |
| for (int k = 0; k < types.length; k++) { |
| newTypes[k] = types[k]; |
| } |
| newTypes[j] = ourType; |
| types = newTypes; |
| } |
| } |
| } else { |
| types = ourTypes.toArray(new IOutputType[ourTypes.size()]); |
| } |
| return types; |
| } |
| |
| private IOutputType[] filterOutputTypes(IOutputType types[]) { |
| if (isExtensionTool || types.length == 0) |
| return types; |
| |
| List<OutputType> list = new ArrayList<>(types.length); |
| for (IOutputType itype : types) { |
| OutputType type = (OutputType) itype; |
| if (type.isEnabled(this)) |
| list.add(type); |
| } |
| |
| return list.toArray(new OutputType[list.size()]); |
| } |
| |
| private IInputType[] filterInputTypes(IInputType types[]) { |
| if (isExtensionTool || types.length == 0) |
| return types; |
| |
| List<InputType> list = new ArrayList<>(types.length); |
| for (IInputType itype : types) { |
| InputType type = (InputType) itype; |
| if (type.isEnabled(this)) |
| list.add(type); |
| } |
| |
| return list.toArray(new InputType[list.size()]); |
| } |
| |
| private boolean hasOutputTypes() { |
| Vector<OutputType> ourTypes = getOutputTypeList(); |
| if (ourTypes.size() > 0) |
| return true; |
| return false; |
| } |
| |
| @Override |
| public IOutputType getPrimaryOutputType() { |
| IOutputType type = null; |
| IOutputType[] types = getOutputTypes(); |
| if (types != null && types.length > 0) { |
| for (int i = 0; i < types.length; i++) { |
| if (i == 0) |
| type = types[0]; |
| if (types[i].getPrimaryOutput() == true) { |
| type = types[i]; |
| break; |
| } |
| } |
| } |
| return type; |
| } |
| |
| @Override |
| public IOutputType getOutputTypeById(String id) { |
| OutputType type = (OutputType) getAllOutputTypeById(id); |
| |
| if (isExtensionTool || type == null || type.isEnabled(this)) |
| return type; |
| return null; |
| } |
| |
| public IOutputType getAllOutputTypeById(String id) { |
| IOutputType type = getOutputTypeMap().get(id); |
| if (type == null) { |
| if (getSuperClass() != null) { |
| return ((Tool) getSuperClass()).getAllOutputTypeById(id); |
| } |
| } |
| return type; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.IOptionCategory#getOwner() |
| */ |
| @Override |
| public IOptionCategory getOwner() { |
| return null; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.IOptionCategory#getIconPath() |
| */ |
| @Override |
| public URL getIconPath() { |
| if (iconPathURL == null && getSuperClass() != null) { |
| return getSuperClass().getTopOptionCategory().getIconPath(); |
| } |
| return iconPathURL; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.IOptionCategory#getOptions() |
| */ |
| @Override |
| public Object[][] getOptions(IConfiguration configuration, IHoldsOptions optionHolder) { |
| if (optionHolder != this) |
| return null; |
| return getOptions(configuration); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.IOptionCategory#getOptions() |
| */ |
| @Override |
| public Object[][] getOptions(IConfiguration configuration) { |
| // Find the child of the configuration that represents the same tool. |
| // It could be the tool itself, or a "sub-class" of the tool. |
| if (configuration != null) { |
| ITool[] tools = configuration.getTools(); |
| return getOptions(tools); |
| } else { |
| return getAllOptions(this); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.IOptionCategory#getOptions() |
| */ |
| @Override |
| public Object[][] getOptions(IResourceInfo resInfo, IHoldsOptions optionHolder) { |
| if (optionHolder != this) |
| return null; |
| return getOptions(resInfo); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.IOptionCategory#getOptions() |
| */ |
| @Override |
| public Object[][] getOptions(IResourceConfiguration resConfig) { |
| ITool[] tools = resConfig.getTools(); |
| return getOptions(tools); |
| } |
| |
| public Object[][] getOptions(IResourceInfo resConfig) { |
| ITool[] tools = resConfig.getTools(); |
| return getOptions(tools); |
| } |
| |
| private Object[][] getOptions(ITool[] tools) { |
| ITool catTool = this; |
| ITool tool = null; |
| for (ITool curTool : tools) { |
| ITool superTool = curTool; |
| do { |
| if (catTool == superTool) { |
| tool = curTool; |
| break; |
| } |
| } while ((superTool = superTool.getSuperClass()) != null); |
| if (tool != null) |
| break; |
| } |
| // Get all of the tool's options and see which ones are part of |
| // this category. |
| if (tool == null) |
| return null; |
| |
| return getAllOptions(tool); |
| } |
| |
| private Object[][] getAllOptions(ITool tool) { |
| IOption[] allOptions = tool.getOptions(); |
| Object[][] myOptions = new Object[allOptions.length][2]; |
| int index = 0; |
| for (IOption option : allOptions) { |
| IOptionCategory optCat = option.getCategory(); |
| if (optCat instanceof ITool) { |
| // Determine if the category is this tool or a superclass |
| ITool current = this; |
| boolean match = false; |
| do { |
| if (optCat == current) { |
| match = true; |
| break; |
| } |
| } while ((current = current.getSuperClass()) != null); |
| if (match) { |
| myOptions[index] = new Object[2]; |
| myOptions[index][0] = tool; |
| myOptions[index][1] = option; |
| index++; |
| } |
| } |
| } |
| |
| return myOptions; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.IOptionCategory#getTool() |
| */ |
| @Override |
| public ITool getTool() { |
| return this; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.IOptionCategory#getOptionHolder() |
| */ |
| @Override |
| public IHoldsOptions getOptionHolder() { |
| return this; |
| } |
| |
| /* (non-Javadoc) |
| * Memory-safe way to access the list of input types |
| */ |
| private Vector<InputType> getInputTypeList() { |
| if (inputTypeList == null) { |
| inputTypeList = new Vector<>(); |
| } |
| return inputTypeList; |
| } |
| |
| /* (non-Javadoc) |
| * Memory-safe way to access the list of IDs to input types |
| */ |
| private Map<String, InputType> getInputTypeMap() { |
| if (inputTypeMap == null) { |
| inputTypeMap = new HashMap<>(); |
| } |
| return inputTypeMap; |
| } |
| |
| public void addInputType(InputType type) { |
| getInputTypeList().add(type); |
| getInputTypeMap().put(type.getId(), type); |
| } |
| |
| /* (non-Javadoc) |
| * Memory-safe way to access the list of output types |
| */ |
| private Vector<OutputType> getOutputTypeList() { |
| if (outputTypeList == null) { |
| outputTypeList = new Vector<>(); |
| } |
| return outputTypeList; |
| } |
| |
| /* (non-Javadoc) |
| * Memory-safe way to access the list of IDs to output types |
| */ |
| private Map<String, OutputType> getOutputTypeMap() { |
| if (outputTypeMap == null) { |
| outputTypeMap = new HashMap<>(); |
| } |
| return outputTypeMap; |
| } |
| |
| public void addOutputType(OutputType type) { |
| getOutputTypeList().add(type); |
| getOutputTypeMap().put(type.getId(), type); |
| } |
| |
| /* |
| * M O D E L A T T R I B U T E A C C E S S O R S |
| */ |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getSuperClass() |
| */ |
| @Override |
| public ITool getSuperClass() { |
| return (ITool) superClass; |
| } |
| |
| /* (non-Javadoc) |
| * Access function to set the superclass element that is defined in |
| * the base class. |
| */ |
| private void setSuperClassInternal(ITool superClass) { |
| this.superClass = superClass; |
| } |
| |
| public void setSuperClass(ITool superClass) { |
| if (this.superClass != superClass) { |
| this.superClass = superClass; |
| if (this.superClass == null) { |
| superClassId = null; |
| } else { |
| superClassId = this.superClass.getId(); |
| } |
| |
| if (!isExtensionElement()) |
| setDirty(true); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#getName() |
| */ |
| @Override |
| public String getName() { |
| return (name == null && getSuperClass() != null) ? getSuperClass().getName() : name; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#isAbstract() |
| */ |
| @Override |
| public boolean isAbstract() { |
| if (isAbstract != null) { |
| return isAbstract.booleanValue(); |
| } else { |
| return false; // Note: no inheritance from superClass |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#setIsAbstract(boolean) |
| */ |
| @Override |
| public void setIsAbstract(boolean b) { |
| isAbstract = b; |
| setDirty(true); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#getUnusedChildren() |
| */ |
| @Override |
| public String getUnusedChildren() { |
| if (unusedChildren != null) { |
| return unusedChildren; |
| } else |
| return EMPTY_STRING; // Note: no inheritance from superClass |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getErrorParserIds() |
| */ |
| @Override |
| public String getErrorParserIds() { |
| String ids = errorParserIds; |
| if (ids == null) { |
| // If I have a superClass, ask it |
| if (getSuperClass() != null) { |
| ids = getSuperClass().getErrorParserIds(); |
| } |
| } |
| return ids; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getErrorParserList() |
| */ |
| @Override |
| public String[] getErrorParserList() { |
| String parserIDs = getErrorParserIds(); |
| String[] errorParsers; |
| if (parserIDs != null) { |
| // Check for an empty string |
| if (parserIDs.length() == 0) { |
| errorParsers = new String[0]; |
| } else { |
| StringTokenizer tok = new StringTokenizer(parserIDs, ";"); //$NON-NLS-1$ |
| List<String> list = new ArrayList<>(tok.countTokens()); |
| while (tok.hasMoreElements()) { |
| list.add(tok.nextToken()); |
| } |
| String[] strArr = { "" }; //$NON-NLS-1$ |
| errorParsers = list.toArray(strArr); |
| } |
| } else { |
| errorParsers = new String[0]; |
| } |
| return errorParsers; |
| } |
| |
| public Set<String> contributeErrorParsers(Set<String> set) { |
| if (getErrorParserIds() != null) { |
| if (set == null) |
| set = new HashSet<>(); |
| String ids[] = getErrorParserList(); |
| if (ids.length != 0) |
| set.addAll(Arrays.asList(ids)); |
| } |
| return set; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getInputExtensions() |
| * @deprecated |
| */ |
| @Override |
| public List<String> getInputExtensions() { |
| String[] exts = getPrimaryInputExtensions(); |
| List<String> extList = new ArrayList<>(); |
| for (String ext : exts) { |
| extList.add(ext); |
| } |
| return extList; |
| } |
| |
| private List<String> getInputExtensionsAttribute() { |
| if ((inputExtensions == null) || (inputExtensions.size() == 0)) { |
| // If I have a superClass, ask it |
| if (getSuperClass() != null) { |
| return ((Tool) getSuperClass()).getInputExtensionsAttribute(); |
| } else { |
| inputExtensions = new ArrayList<>(); |
| } |
| } |
| return inputExtensions; |
| } |
| |
| private List<String> getInputExtensionsList() { |
| if (inputExtensions == null) { |
| inputExtensions = new ArrayList<>(); |
| } |
| return inputExtensions; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getDefaultInputExtension() |
| */ |
| @Override |
| public String getDefaultInputExtension() { |
| // Find the primary input type |
| IInputType type = getPrimaryInputType(); |
| if (type != null) { |
| String[] exts = type.getSourceExtensions(this); |
| // Use the first entry in the list |
| if (exts.length > 0) |
| return exts[0]; |
| } |
| // If none, use the input extensions specified for the Tool (backwards compatibility) |
| List<String> extsList = getInputExtensionsAttribute(); |
| // Use the first entry in the list |
| if (extsList != null && extsList.size() > 0) |
| return extsList.get(0); |
| return EMPTY_STRING; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getPrimaryInputExtensions() |
| */ |
| @Override |
| public String[] getPrimaryInputExtensions() { |
| IInputType type = getPrimaryInputType(); |
| if (type != null) { |
| String[] exts = type.getSourceExtensions(this); |
| // Use the first entry in the list |
| if (exts.length > 0) |
| return exts; |
| } |
| // If none, use the input extensions specified for the Tool (backwards compatibility) |
| List<String> extsList = getInputExtensionsAttribute(); |
| // Use the first entry in the list |
| if (extsList != null && extsList.size() > 0) { |
| return extsList.toArray(new String[extsList.size()]); |
| } |
| return EMPTY_STRING_ARRAY; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getAllInputExtensions() |
| */ |
| @Override |
| public String[] getAllInputExtensions() { |
| return getAllInputExtensions(getProject()); |
| } |
| |
| public String[] getAllInputExtensions(IProject project) { |
| IInputType[] types = getInputTypes(); |
| if (types != null && types.length > 0) { |
| List<String> allExts = new ArrayList<>(); |
| for (IInputType type : types) { |
| String[] exts = ((InputType) type).getSourceExtensions(this, project); |
| for (String ext : exts) { |
| allExts.add(ext); |
| } |
| } |
| if (allExts.size() > 0) { |
| return allExts.toArray(new String[allExts.size()]); |
| } |
| } |
| // If none, use the input extensions specified for the Tool (backwards compatibility) |
| List<String> extsList = getInputExtensionsAttribute(); |
| if (extsList != null && extsList.size() > 0) { |
| return extsList.toArray(new String[extsList.size()]); |
| } |
| return EMPTY_STRING_ARRAY; |
| } |
| |
| @Override |
| public IInputType getPrimaryInputType() { |
| IInputType type = null; |
| IInputType[] types = getInputTypes(); |
| if (types != null && types.length > 0) { |
| for (int i = 0; i < types.length; i++) { |
| if (i == 0) |
| type = types[0]; |
| if (types[i].getPrimaryInput() == true) { |
| type = types[i]; |
| break; |
| } |
| } |
| } |
| return type; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getInputInputType() |
| */ |
| @Override |
| public IInputType getInputType(String inputExtension) { |
| return getInputType(inputExtension, getProject()); |
| } |
| |
| public IInputType getInputType(String inputExtension, IProject project) { |
| IInputType type = null; |
| IInputType[] types = getInputTypes(); |
| if (types != null && types.length > 0) { |
| for (IInputType t : types) { |
| if (((InputType) t).isSourceExtension(this, inputExtension, project)) { |
| type = t; |
| break; |
| } |
| } |
| } |
| return type; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getAdditionalDependencies() |
| */ |
| @Override |
| public IPath[] getAdditionalDependencies() { |
| List<IPath> allDeps = new ArrayList<>(); |
| IInputType[] types = getInputTypes(); |
| for (IInputType type : types) { |
| // Additional dependencies come from 2 places. |
| // 1. From AdditionalInput childen |
| for (IPath p : type.getAdditionalDependencies()) |
| allDeps.add(p); |
| |
| // 2. From InputTypes that other than the primary input type |
| if (type != getPrimaryInputType()) { |
| if (type.getOptionId() != null) { |
| IOption option = getOptionBySuperClassId(type.getOptionId()); |
| if (option != null) { |
| try { |
| List<IPath> inputs = new ArrayList<>(); |
| int optType = option.getValueType(); |
| if (optType == IOption.STRING) { |
| inputs.add(Path.fromOSString(option.getStringValue())); |
| } else if (optType == IOption.STRING_LIST || optType == IOption.LIBRARIES |
| || optType == IOption.OBJECTS || optType == IOption.INCLUDE_FILES |
| || optType == IOption.LIBRARY_PATHS || optType == IOption.LIBRARY_FILES |
| || optType == IOption.MACRO_FILES) { |
| @SuppressWarnings("unchecked") |
| List<String> inputNames = (List<String>) option.getValue(); |
| filterValues(optType, inputNames); |
| for (String s : inputNames) |
| inputs.add(Path.fromOSString(s)); |
| } |
| allDeps.addAll(inputs); |
| } catch (BuildException ex) { |
| } |
| } |
| } else if (type.getBuildVariable() != null && type.getBuildVariable().length() > 0) { |
| allDeps.add(Path.fromOSString("$(" + type.getBuildVariable() + ")")); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| } |
| } |
| return allDeps.toArray(new IPath[allDeps.size()]); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getAdditionalResources() |
| */ |
| @Override |
| public IPath[] getAdditionalResources() { |
| List<IPath> allRes = new ArrayList<>(); |
| for (IInputType type : getInputTypes()) { |
| // Additional resources come from 2 places. |
| // 1. From AdditionalInput childen |
| for (IPath r : type.getAdditionalResources()) |
| allRes.add(r); |
| |
| // 2. From InputTypes that other than the primary input type |
| if (type != getPrimaryInputType()) { |
| String var = type.getBuildVariable(); |
| if (var != null && var.length() > 0) { |
| allRes.add(Path.fromOSString("$(" + type.getBuildVariable() + ")")); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| } |
| } |
| return allRes.toArray(new IPath[allRes.size()]); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getAllDependencyExtensions() |
| */ |
| @Override |
| public String[] getAllDependencyExtensions() { |
| IInputType[] types = getInputTypes(); |
| if (types != null && types.length > 0) { |
| List<String> allExts = new ArrayList<>(); |
| for (IInputType t : types) |
| for (String s : t.getDependencyExtensions(this)) |
| allExts.add(s); |
| |
| if (allExts.size() > 0) |
| return allExts.toArray(new String[allExts.size()]); |
| } |
| // If none, use the header extensions specified for the Tool (backwards compatibility) |
| List<String> extsList = getHeaderExtensionsAttribute(); |
| if (extsList != null && extsList.size() > 0) { |
| return extsList.toArray(new String[extsList.size()]); |
| } |
| return EMPTY_STRING_ARRAY; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getInterfaceExtension() |
| * @deprecated |
| */ |
| @Override |
| public List<String> getInterfaceExtensions() { |
| return getHeaderExtensionsAttribute(); |
| } |
| |
| private List<String> getHeaderExtensionsAttribute() { |
| if (interfaceExtensions == null || interfaceExtensions.size() == 0) { |
| // If I have a superClass, ask it |
| if (getSuperClass() != null) { |
| return ((Tool) getSuperClass()).getHeaderExtensionsAttribute(); |
| } else { |
| if (interfaceExtensions == null) { |
| interfaceExtensions = new ArrayList<>(); |
| } |
| } |
| } |
| return interfaceExtensions; |
| } |
| |
| private List<String> getInterfaceExtensionsList() { |
| if (interfaceExtensions == null) { |
| interfaceExtensions = new ArrayList<>(); |
| } |
| return interfaceExtensions; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#getOutputFlag() |
| */ |
| @Override |
| public String getOutputFlag() { |
| if (outputFlag == null) { |
| // If I have a superClass, ask it |
| if (getSuperClass() != null) { |
| return getSuperClass().getOutputFlag(); |
| } else { |
| return EMPTY_STRING; |
| } |
| } |
| return outputFlag; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#getOutputPrefix() |
| */ |
| @Override |
| public String getOutputPrefix() { |
| // Get the outputPrefix from an OutputType, if any. |
| IOutputType type = null; |
| IOutputType[] types = getOutputTypes(); |
| if (types != null && types.length > 0) { |
| for (int i = 0; i < types.length; i++) { |
| if (i == 0) |
| type = types[0]; |
| if (types[i].getPrimaryOutput() == true) { |
| type = types[i]; |
| break; |
| } |
| } |
| } |
| if (type != null) { |
| return type.getOutputPrefix(); |
| } |
| |
| // If there are no OutputTypes, use the deprecated Tool attribute |
| if (outputPrefix == null) { |
| // If I have a superClass, ask it |
| if (getSuperClass() != null) { |
| return getSuperClass().getOutputPrefix(); |
| } else { |
| return EMPTY_STRING; |
| } |
| } |
| return outputPrefix; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#getToolCommand() |
| */ |
| @Override |
| public String getToolCommand() { |
| if (command == null) { |
| // If I have a superClass, ask it |
| if (getSuperClass() != null) { |
| return getSuperClass().getToolCommand(); |
| } else { |
| return EMPTY_STRING; |
| } |
| } |
| return command; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getCommandLinePattern() |
| */ |
| @Override |
| public String getCommandLinePattern() { |
| if (commandLinePattern == null) { |
| if (getSuperClass() != null) { |
| return getSuperClass().getCommandLinePattern(); |
| } else { |
| if (getCustomBuildStep()) { |
| return DEFAULT_CBS_PATTERN; // Default pattern |
| } else { |
| return DEFAULT_PATTERN; // Default pattern |
| } |
| } |
| } |
| return commandLinePattern; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#getAdvancedInputCategory() |
| */ |
| @Override |
| public boolean getAdvancedInputCategory() { |
| if (advancedInputCategory == null) { |
| if (getSuperClass() != null) { |
| return getSuperClass().getAdvancedInputCategory(); |
| } else { |
| return false; // default is false |
| } |
| } |
| return advancedInputCategory.booleanValue(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#getCustomBuildStep() |
| */ |
| @Override |
| public boolean getCustomBuildStep() { |
| if (customBuildStep == null) { |
| if (getSuperClass() != null) { |
| return getSuperClass().getCustomBuildStep(); |
| } else { |
| return false; // default is false |
| } |
| } |
| return customBuildStep.booleanValue(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#getAnnouncement() |
| */ |
| @Override |
| public String getAnnouncement() { |
| String an = getAnnouncementAttribute(); |
| if (an == null) { |
| an = ManagedMakeMessages.getResourceString(DEFAULT_ANNOUNCEMENT_PREFIX) + WHITESPACE + getName(); // + "(" + getId() + ")"; |
| } |
| return an; |
| } |
| |
| public String getAnnouncementAttribute() { |
| if (announcement == null) { |
| if (getSuperClass() != null) { |
| return ((Tool) getSuperClass()).getAnnouncementAttribute(); |
| } |
| return null; |
| } |
| return announcement; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getCommandLineGeneratorElement() |
| */ |
| public IConfigurationElement getCommandLineGeneratorElement() { |
| if (commandLineGeneratorElement == null) { |
| if (getSuperClass() != null) { |
| return ((Tool) getSuperClass()).getCommandLineGeneratorElement(); |
| } |
| } |
| return commandLineGeneratorElement; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#setCommandLineGeneratorElement(String) |
| */ |
| public void setCommandLineGeneratorElement(IConfigurationElement element) { |
| commandLineGeneratorElement = element; |
| setDirty(true); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getCommandLineGenerator() |
| */ |
| @Override |
| public IManagedCommandLineGenerator getCommandLineGenerator() { |
| if (commandLineGenerator != null) { |
| return commandLineGenerator; |
| } |
| IConfigurationElement element = getCommandLineGeneratorElement(); |
| if (element != null) { |
| try { |
| if (element.getAttribute(COMMAND_LINE_GENERATOR) != null) { |
| commandLineGenerator = (IManagedCommandLineGenerator) element |
| .createExecutableExtension(COMMAND_LINE_GENERATOR); |
| commandLineGeneratorElement = null; // no longer needed now that we've created one |
| return commandLineGenerator; |
| } |
| } catch (CoreException e) { |
| } |
| } |
| return ManagedCommandLineGenerator.getCommandLineGenerator(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getDependencyGeneratorElement() |
| * @deprecated |
| */ |
| public IConfigurationElement getDependencyGeneratorElement() { |
| // First try the primary InputType |
| IInputType type = getPrimaryInputType(); |
| if (type != null) { |
| IConfigurationElement primary = ((InputType) type).getDependencyGeneratorElement(); |
| if (primary != null) |
| return primary; |
| } |
| |
| // If not found, use the deprecated attribute |
| return getToolDependencyGeneratorElement(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getDependencyGeneratorElementForExtension() |
| */ |
| public IConfigurationElement getDependencyGeneratorElementForExtension(String sourceExt) { |
| IInputType[] types = getInputTypes(); |
| if (types != null) { |
| for (IInputType type : types) { |
| if (type.isSourceExtension(this, sourceExt)) { |
| return ((InputType) type).getDependencyGeneratorElement(); |
| } |
| } |
| } |
| |
| // If not found, use the deprecated attribute |
| return getToolDependencyGeneratorElement(); |
| } |
| |
| private IConfigurationElement getToolDependencyGeneratorElement() { |
| if (dependencyGeneratorElement == null) { |
| if (getSuperClass() != null) { |
| return ((Tool) getSuperClass()).getToolDependencyGeneratorElement(); |
| } |
| } |
| return dependencyGeneratorElement; |
| } |
| |
| // /* (non-Javadoc) |
| // * @see org.eclipse.cdt.managedbuilder.core.ITool#setDependencyGeneratorElement(String) |
| // * @deprecated |
| // */ |
| // private void setDependencyGeneratorElement(IConfigurationElement element) { |
| // dependencyGeneratorElement = element; |
| // setDirty(true); |
| // } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getDependencyGenerator() |
| * @deprecated |
| */ |
| @Override |
| public IManagedDependencyGenerator getDependencyGenerator() { |
| if (dependencyGenerator != null) { |
| if (dependencyGenerator instanceof IManagedDependencyGenerator) |
| return (IManagedDependencyGenerator) dependencyGenerator; |
| else |
| return null; |
| } |
| IConfigurationElement element = getDependencyGeneratorElement(); |
| if (element != null) { |
| try { |
| if (element.getAttribute(DEP_CALC_ID) != null) { |
| dependencyGenerator = (IManagedDependencyGeneratorType) element |
| .createExecutableExtension(DEP_CALC_ID); |
| if (dependencyGenerator != null) { |
| if (dependencyGenerator instanceof IManagedDependencyGenerator) { |
| dependencyGeneratorElement = null; // no longer needed now that we've created one |
| return (IManagedDependencyGenerator) dependencyGenerator; |
| } else |
| return null; |
| } |
| } |
| } catch (CoreException e) { |
| } |
| } |
| return null; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getDependencyGeneratorForExtension() |
| */ |
| @Override |
| public IManagedDependencyGeneratorType getDependencyGeneratorForExtension(String sourceExt) { |
| if (dependencyGenerator != null) { |
| return dependencyGenerator; |
| } |
| IConfigurationElement element = getDependencyGeneratorElementForExtension(sourceExt); |
| if (element != null) { |
| try { |
| if (element.getAttribute(DEP_CALC_ID) != null) { |
| dependencyGenerator = (IManagedDependencyGeneratorType) element |
| .createExecutableExtension(DEP_CALC_ID); |
| return dependencyGenerator; |
| } |
| } catch (CoreException e) { |
| } |
| } |
| return null; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getNatureFilter() |
| */ |
| @Override |
| public int getNatureFilter() { |
| if (natureFilter == null) { |
| // If I have a superClass, ask it |
| if (getSuperClass() != null) { |
| return getSuperClass().getNatureFilter(); |
| } else { |
| return FILTER_BOTH; |
| } |
| } |
| return natureFilter.intValue(); |
| } |
| |
| public String[] getAllOutputExtensions(IProject project) { |
| IOutputType[] types = getOutputTypes(); |
| if (types != null && types.length > 0) { |
| List<String> allExts = new ArrayList<>(); |
| for (IOutputType t : types) { |
| String[] exts = ((OutputType) t).getOutputExtensions(this, project); |
| if (exts != null) |
| for (String s : exts) |
| allExts.add(s); |
| } |
| if (allExts.size() > 0) |
| return allExts.toArray(new String[allExts.size()]); |
| } |
| // If none, use the outputs specified for the Tool (backwards compatibility) |
| String[] extsList = getOutputsAttribute(); |
| if (extsList != null && extsList.length > 0) |
| return extsList; |
| else |
| return EMPTY_STRING_ARRAY; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getAllOutputExtensions() |
| */ |
| @Override |
| public String[] getAllOutputExtensions() { |
| return getAllOutputExtensions(getProject()); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getOutputExtensions() |
| * @deprecated |
| */ |
| @Override |
| public String[] getOutputExtensions() { |
| return getOutputsAttribute(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getOutputsAttribute() |
| */ |
| @Override |
| public String[] getOutputsAttribute() { |
| // TODO: Why is this treated differently than inputExtensions? |
| if (outputExtensions == null) { |
| if (getSuperClass() != null) { |
| return getSuperClass().getOutputsAttribute(); |
| } else { |
| return null; |
| } |
| } |
| return outputExtensions.split(DEFAULT_SEPARATOR); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#getOutputExtension(java.lang.String) |
| */ |
| @Override |
| public String getOutputExtension(String inputExtension) { |
| // Search thru the output-types to find one that has a primary input type with this extension |
| IOutputType[] types = getOutputTypes(); |
| int i; |
| if (types != null) { |
| for (i = 0; i < types.length; i++) { |
| IInputType inputType = types[i].getPrimaryInputType(); |
| if (inputType != null && inputType.isSourceExtension(this, inputExtension)) { |
| String[] exts = types[i].getOutputExtensions(this); |
| if (exts != null && exts.length > 0) { |
| return exts[0]; |
| } |
| } |
| } |
| // Does any input type produce this extension? |
| if (getInputType(inputExtension) != null) { |
| // Return the first extension of the primary output type |
| IOutputType outType = getPrimaryOutputType(); |
| String[] exts = outType.getOutputExtensions(this); |
| if (exts != null && exts.length > 0) { |
| return exts[0]; |
| } |
| } |
| } |
| // If no OutputTypes specified, examine the list of input extensions |
| String[] inputExts = getAllInputExtensions(); |
| for (i = 0; i < inputExts.length; i++) { |
| if (inputExts[i].equals(inputExtension)) { |
| String[] exts = getOutputsAttribute(); |
| if (exts != null) { |
| if (i < exts.length) { |
| return exts[i]; |
| } else { |
| return exts[exts.length - 1]; |
| } |
| } |
| } |
| } |
| return null; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#getOutputType(java.lang.String) |
| */ |
| @Override |
| public IOutputType getOutputType(String outputExtension) { |
| IOutputType type = null; |
| IOutputType[] types = getOutputTypes(); |
| if (types != null && types.length > 0) { |
| for (IOutputType t : types) { |
| if (t.isOutputExtension(this, outputExtension)) { |
| type = t; |
| break; |
| } |
| } |
| } |
| return type; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#setErrorParserIds() |
| */ |
| @Override |
| public void setErrorParserIds(String ids) { |
| String currentIds = getErrorParserIds(); |
| if (ids == null && currentIds == null) |
| return; |
| if (currentIds == null || ids == null || !(currentIds.equals(ids))) { |
| errorParserIds = ids; |
| isDirty = true; |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#setToolCommand(java.lang.String) |
| */ |
| @Override |
| public boolean setToolCommand(String cmd) { |
| String currentCommand = getToolCommand(); |
| if (cmd == null && command == null) |
| return false; |
| if (cmd == null || currentCommand == null || !cmd.equals(currentCommand)) { |
| command = cmd; |
| isDirty = true; |
| setRebuildState(true); |
| return true; |
| } else { |
| return false; |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#setCommandLinePattern() |
| */ |
| @Override |
| public void setCommandLinePattern(String pattern) { |
| String currentPattern = getCommandLinePattern(); |
| if (pattern == null && commandLinePattern == null) |
| return; |
| if (pattern == null || currentPattern == null || !pattern.equals(currentPattern)) { |
| commandLinePattern = pattern; |
| setRebuildState(true); |
| isDirty = true; |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#setOutputFlag(java.lang.String) |
| */ |
| @Override |
| public void setOutputFlag(String flag) { |
| if (flag == null && outputFlag == null) |
| return; |
| if (outputFlag == null || flag == null || !(flag.equals(outputFlag))) { |
| outputFlag = flag; |
| setRebuildState(true); |
| isDirty = true; |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#setOutputPrefix(java.lang.String) |
| */ |
| @Override |
| public void setOutputPrefix(String prefix) { |
| if (prefix == null && outputPrefix == null) |
| return; |
| if (outputPrefix == null || prefix == null || !(prefix.equals(outputPrefix))) { |
| outputPrefix = prefix; |
| setRebuildState(true); |
| isDirty = true; |
| } |
| } |
| |
| @Override |
| public void setOutputPrefixForPrimaryOutput(String prefix) { |
| if (prefix != null && prefix.equals(getOutputPrefix())) |
| return; |
| |
| IOutputType type = getPrimaryOutputType(); |
| if (type == null) |
| setOutputPrefix(prefix); |
| else { |
| setOutputPrefixForType(type, prefix); |
| } |
| } |
| |
| private void setOutputPrefixForType(IOutputType type, String prefix) { |
| if (prefix == null) { |
| if (type.getParent() != this) |
| return; |
| } |
| type = getEditableOutputType(type); |
| type.setOutputPrefix(prefix); |
| setRebuildState(true); |
| isDirty = true; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#setOutputsAttribute(java.lang.String) |
| */ |
| @Override |
| public void setOutputsAttribute(String ext) { |
| if (ext == null && outputExtensions == null) |
| return; |
| if (outputExtensions == null || ext == null || !(ext.equals(outputExtensions))) { |
| outputExtensions = ext; |
| isDirty = true; |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#setAdvancedInputCategory(boolean) |
| */ |
| @Override |
| public void setAdvancedInputCategory(boolean b) { |
| if (advancedInputCategory == null || !(b == advancedInputCategory.booleanValue())) { |
| advancedInputCategory = b; |
| setDirty(true); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#setCustomBuildStep(boolean) |
| */ |
| @Override |
| public void setCustomBuildStep(boolean b) { |
| if (customBuildStep == null || !(b == customBuildStep.booleanValue())) { |
| customBuildStep = b; |
| setDirty(true); |
| } |
| } |
| |
| @Override |
| public void setAnnouncement(String newText) { |
| if (newText == null && announcement == null) |
| return; |
| if (announcement == null || newText == null || !(newText.equals(announcement))) { |
| announcement = newText; |
| setDirty(true); |
| } |
| } |
| |
| @Override |
| public void setHidden(boolean hidden) { |
| if (isHidden == null || !(hidden == isHidden.booleanValue())) { |
| isHidden = hidden; |
| setDirty(true); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getCommandFlags() |
| */ |
| @Override |
| public String[] getCommandFlags() throws BuildException { |
| return getToolCommandFlags(null, null); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#getToolFlags() |
| */ |
| @Override |
| public String getToolFlags() throws BuildException { |
| return getToolCommandFlagsString(null, null); |
| } |
| |
| /** |
| * This method used internally by the Tool to obtain the command flags with the build macros resolved, |
| * but could be also used by other MBS components to adjust the tool flags resolution |
| * behavior by passing the method some custom macro substitutor |
| * |
| * @return the command flags with the build macros resolved |
| */ |
| public String[] getToolCommandFlags(IPath inputFileLocation, IPath outputFileLocation, |
| SupplierBasedCdtVariableSubstitutor macroSubstitutor, IMacroContextInfoProvider provider) { |
| IOption[] opts = getOptions(); |
| ArrayList<String> flags = new ArrayList<>(); |
| StringBuilder sb = new StringBuilder(); |
| for (IOption option : opts) { |
| if (option == null) |
| continue; |
| sb.setLength(0); |
| |
| // check to see if the option has an applicability calculator |
| IOptionApplicability applicabilityCalculator = option.getApplicabilityCalculator(); |
| IOptionCategory cat = option.getCategory(); |
| IOptionCategoryApplicability catApplicabilityCalculator = cat.getApplicabilityCalculator(); |
| |
| IBuildObject config = null; |
| IBuildObject parent = getParent(); |
| if (parent instanceof IResourceConfiguration) { |
| config = parent; |
| } else if (parent instanceof IToolChain) { |
| config = ((IToolChain) parent).getParent(); |
| } |
| |
| if ((catApplicabilityCalculator == null |
| || catApplicabilityCalculator.isOptionCategoryVisible(config, this, cat)) |
| && (applicabilityCalculator == null |
| || applicabilityCalculator.isOptionUsedInCommandLine(config, this, option))) { |
| |
| // update option in case when its value changed. |
| // This code is added to fix bug #219684 and |
| // avoid using "getOptionToSet()" |
| if (applicabilityCalculator != null |
| && !(applicabilityCalculator instanceof BooleanExpressionApplicabilityCalculator)) { |
| if (option.getSuperClass() != null) |
| option = getOptionBySuperClassId(option.getSuperClass().getId()); |
| // bug #405904 - if the option is an extension element (first time we build), |
| // use the option id as a superclass id, otherwise we won't find the option we may have just |
| // set and will end up with the default setting |
| else if (option.isExtensionElement()) |
| option = getOptionBySuperClassId(option.getId()); |
| else |
| option = getOptionById(option.getId()); |
| } |
| |
| try { |
| boolean generateDefaultCommand = true; |
| IOptionCommandGenerator commandGenerator = option.getCommandGenerator(); |
| if (commandGenerator != null) { |
| switch (option.getValueType()) { |
| case IOption.BOOLEAN: |
| case IOption.ENUMERATED: |
| case IOption.TREE: |
| case IOption.STRING: |
| case IOption.STRING_LIST: |
| case IOption.INCLUDE_FILES: |
| case IOption.INCLUDE_PATH: |
| case IOption.LIBRARY_PATHS: |
| case IOption.LIBRARY_FILES: |
| case IOption.MACRO_FILES: |
| case IOption.UNDEF_INCLUDE_FILES: |
| case IOption.UNDEF_INCLUDE_PATH: |
| case IOption.UNDEF_LIBRARY_PATHS: |
| case IOption.UNDEF_LIBRARY_FILES: |
| case IOption.UNDEF_MACRO_FILES: |
| case IOption.PREPROCESSOR_SYMBOLS: |
| case IOption.UNDEF_PREPROCESSOR_SYMBOLS: |
| IMacroContextInfo info = provider.getMacroContextInfo(BuildMacroProvider.CONTEXT_FILE, |
| new FileContextData(inputFileLocation, outputFileLocation, option, this)); |
| if (info != null) { |
| macroSubstitutor.setMacroContextInfo(info); |
| String command = commandGenerator.generateCommand(option, macroSubstitutor); |
| if (command != null) { |
| sb.append(command); |
| generateDefaultCommand = false; |
| } |
| } |
| break; |
| default: |
| break; |
| } |
| } |
| if (generateDefaultCommand) { |
| switch (option.getValueType()) { |
| case IOption.BOOLEAN: |
| String boolCmd; |
| if (option.getBooleanValue()) { |
| boolCmd = option.getCommand(); |
| } else { |
| // Note: getCommandFalse is new with CDT 2.0 |
| boolCmd = option.getCommandFalse(); |
| } |
| if (boolCmd != null && boolCmd.length() > 0) { |
| sb.append(boolCmd); |
| } |
| break; |
| |
| case IOption.ENUMERATED: |
| String enumVal = option.getEnumCommand(option.getSelectedEnum()); |
| if (enumVal.length() > 0) { |
| sb.append(enumVal); |
| } |
| break; |
| |
| case IOption.TREE: |
| String treeVal = option.getCommand(option.getStringValue()); |
| if (treeVal.length() > 0) { |
| sb.append(treeVal); |
| } |
| break; |
| |
| case IOption.STRING: { |
| String strCmd = option.getCommand(); |
| String val = option.getStringValue(); |
| IMacroContextInfo info = provider.getMacroContextInfo(IBuildMacroProvider.CONTEXT_FILE, |
| new FileContextData(inputFileLocation, outputFileLocation, option, this)); |
| if (info != null) { |
| macroSubstitutor.setMacroContextInfo(info); |
| if (val.length() > 0 |
| && (val = CdtVariableResolver.resolveToString(val, macroSubstitutor)) |
| .length() > 0) { |
| sb.append(evaluateCommand(strCmd, val)); |
| } |
| } |
| } |
| break; |
| |
| case IOption.STRING_LIST: |
| case IOption.INCLUDE_FILES: |
| case IOption.INCLUDE_PATH: |
| case IOption.LIBRARY_PATHS: |
| case IOption.LIBRARY_FILES: |
| case IOption.MACRO_FILES: |
| case IOption.UNDEF_INCLUDE_FILES: |
| case IOption.UNDEF_INCLUDE_PATH: |
| case IOption.UNDEF_LIBRARY_PATHS: |
| case IOption.UNDEF_LIBRARY_FILES: |
| case IOption.UNDEF_MACRO_FILES: { |
| String listCmd = option.getCommand(); |
| IMacroContextInfo info = provider.getMacroContextInfo(IBuildMacroProvider.CONTEXT_FILE, |
| new FileContextData(inputFileLocation, outputFileLocation, option, this)); |
| if (info != null) { |
| macroSubstitutor.setMacroContextInfo(info); |
| String[] list = CdtVariableResolver.resolveStringListValues( |
| option.getBasicStringListValue(), macroSubstitutor, true); |
| if (list != null) { |
| for (String temp : list) { |
| if (temp.length() > 0 && !temp.equals(EMPTY_QUOTED_STRING)) |
| sb.append(evaluateCommand(listCmd, temp)).append(WHITE_SPACE); |
| } |
| } |
| } |
| } |
| break; |
| |
| case IOption.PREPROCESSOR_SYMBOLS: |
| case IOption.UNDEF_PREPROCESSOR_SYMBOLS: { |
| String defCmd = option.getCommand(); |
| IMacroContextInfo info = provider.getMacroContextInfo(IBuildMacroProvider.CONTEXT_FILE, |
| new FileContextData(inputFileLocation, outputFileLocation, option, this)); |
| if (info != null) { |
| macroSubstitutor.setMacroContextInfo(info); |
| String[] symbols = CdtVariableResolver.resolveStringListValues( |
| option.getBasicStringListValue(), macroSubstitutor, true); |
| if (symbols != null) { |
| for (String temp : symbols) { |
| if (temp.length() > 0) |
| sb.append(evaluateCommand(defCmd, temp) + WHITE_SPACE); |
| } |
| } |
| } |
| } |
| break; |
| |
| default: |
| break; |
| } |
| } |
| |
| if (sb.toString().trim().length() > 0) |
| flags.add(sb.toString().trim()); |
| |
| } catch (BuildException e) { |
| // Bug 315187 one broken option shouldn't cascade to all other options breaking the build... |
| Status s = new Status(IStatus.ERROR, ManagedBuilderCorePlugin.getUniqueIdentifier(), |
| MessageFormat.format( |
| ManagedMakeMessages.getString("Tool_Problem_Discovering_Args_For_Option"), option, //$NON-NLS-1$ |
| option.getId()), |
| e); |
| ManagedBuilderCorePlugin.log(new CoreException(s)); |
| } catch (CdtVariableException e) { |
| Status s = new Status(IStatus.ERROR, ManagedBuilderCorePlugin.getUniqueIdentifier(), |
| MessageFormat.format( |
| ManagedMakeMessages.getString("Tool_Problem_Discovering_Args_For_Option"), option, //$NON-NLS-1$ |
| option.getId()), |
| e); |
| ManagedBuilderCorePlugin.log(new CoreException(s)); |
| } |
| } |
| } |
| String[] f = new String[flags.size()]; |
| return flags.toArray(f); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getToolCommandFlags(org.eclipse.core.runtime.IPath, org.eclipse.core.runtime.IPath) |
| */ |
| @Override |
| public String[] getToolCommandFlags(IPath inputFileLocation, IPath outputFileLocation) throws BuildException { |
| SupplierBasedCdtVariableSubstitutor macroSubstitutor = new BuildfileMacroSubstitutor(null, EMPTY_STRING, |
| WHITE_SPACE); |
| return getToolCommandFlags(inputFileLocation, outputFileLocation, macroSubstitutor, |
| BuildMacroProvider.getDefault()); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getToolCommandFlagsString(org.eclipse.core.runtime.IPath, org.eclipse.core.runtime.IPath) |
| */ |
| @Override |
| public String getToolCommandFlagsString(IPath inputFileLocation, IPath outputFileLocation) throws BuildException { |
| // Get all of the optionList |
| StringBuilder buf = new StringBuilder(); |
| String[] flags = getToolCommandFlags(inputFileLocation, outputFileLocation); |
| for (String flag : flags) { |
| if (flag != null) { |
| buf.append(flag + WHITE_SPACE); |
| } |
| } |
| |
| return buf.toString().trim(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#isHeaderFile(java.lang.String) |
| */ |
| @Override |
| public boolean isHeaderFile(String ext) { |
| if (ext == null) { |
| return false; |
| } |
| String[] exts = getAllDependencyExtensions(); |
| for (String dep : exts) { |
| if (ext.equals(dep)) |
| return true; |
| } |
| return false; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#buildsFileType(java.lang.String) |
| */ |
| @Override |
| public boolean buildsFileType(String extension) { |
| return buildsFileType(extension, getProject()); |
| } |
| |
| public boolean buildsFileType(String extension, IProject project) { |
| |
| if (extension == null) { |
| return false; |
| } |
| IInputType it = getInputType(extension, project); |
| if (it != null) { |
| // Decide whether we "build" this type of file |
| // |
| // 1. If this is the primary input, yes |
| if (it == getPrimaryInputType()) { |
| return true; |
| } |
| // 2. If the option attribute is specified, no |
| if (it.getOptionId() != null && it.getOptionId().length() > 0) { |
| return false; |
| } |
| // 3. If the assignToOption attribute is specified, no |
| if (it.getAssignToOptionId() != null && it.getAssignToOptionId().length() > 0) { |
| return false; |
| } |
| // Else, yes |
| return true; |
| } |
| // If no InputTypes, check the inputExtensions attribute |
| if (!hasInputTypes()) { |
| return getInputExtensionsAttribute().contains(extension); |
| } |
| return false; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#isInputFileType(java.lang.String) |
| */ |
| @Override |
| public boolean isInputFileType(String extension) { |
| if (extension == null) { |
| return false; |
| } |
| IInputType it = getInputType(extension); |
| if (it != null) { |
| return true; |
| } |
| // If no InputTypes, check the inputExtensions attribute |
| if (!hasInputTypes()) { |
| return getInputExtensionsAttribute().contains(extension); |
| } |
| return false; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.core.build.managed.ITool#producesFileType(java.lang.String) |
| */ |
| @Override |
| public boolean producesFileType(String extension) { |
| if (extension == null) { |
| return false; |
| } |
| // Check the output-types first |
| if (getOutputType(extension) != null) { |
| return true; |
| } |
| // If there are no OutputTypes, check the attribute |
| if (!hasOutputTypes()) { |
| String[] exts = getOutputsAttribute(); |
| if (exts != null) { |
| for (String ext : exts) { |
| if (ext.equals(extension)) |
| return true; |
| } |
| } |
| } |
| return false; |
| } |
| |
| /** |
| * @return the pathconverterElement |
| */ |
| public IConfigurationElement getPathconverterElement() { |
| return pathconverterElement; |
| } |
| |
| @Override |
| public IOptionPathConverter getOptionPathConverter() { |
| // Use existing converter |
| if (optionPathConverter != null) { |
| return optionPathConverter; |
| } |
| if (optionPathConverter == null) { |
| // If there is not yet a optionPathConverter try to construct from configuration element |
| IConfigurationElement element = getPathconverterElement(); |
| if (element != null) { |
| try { |
| if (element.getAttribute(ITool.OPTIONPATHCONVERTER) != null) { |
| optionPathConverter = (IOptionPathConverter) element |
| .createExecutableExtension(ITool.OPTIONPATHCONVERTER); |
| } |
| } catch (CoreException e) { |
| } |
| } |
| if (optionPathConverter == null) { |
| // If there is still no optionPathConverter, ask superclass of this tool whether it has a converter |
| if (getSuperClass() != null) { |
| ITool superTool = getSuperClass(); |
| optionPathConverter = superTool.getOptionPathConverter(); |
| } |
| } |
| // If there is still no converter, ask the toolchain for a |
| // global converter |
| if ((optionPathConverter == null) && (getParent() instanceof IResourceConfiguration)) { |
| // The tool belongs to a resource configuration |
| IResourceConfiguration resourceConfiguration = (IResourceConfiguration) getParent(); |
| IConfiguration configuration = resourceConfiguration.getParent(); |
| if (null != configuration) { |
| IToolChain toolchain = configuration.getToolChain(); |
| optionPathConverter = toolchain.getOptionPathConverter(); |
| } |
| } |
| if ((optionPathConverter == null) && (getParent() instanceof IToolChain)) { |
| // The tool belongs to a toolchain |
| IToolChain toolchain = (IToolChain) getParent(); |
| optionPathConverter = toolchain.getOptionPathConverter(); |
| } |
| } |
| |
| pathconverterElement = null; // discard now that we've created one |
| return optionPathConverter; |
| } |
| |
| /* |
| * O B J E C T S T A T E M A I N T E N A N C E |
| */ |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#isExtensionElement() |
| */ |
| @Override |
| public boolean isExtensionElement() { |
| return isExtensionTool; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#isDirty() |
| */ |
| @Override |
| public boolean isDirty() { |
| // This shouldn't be called for an extension tool |
| if (isExtensionTool) |
| return false; |
| |
| // If I need saving, just say yes |
| if (isDirty) |
| return true; |
| |
| // Check my children |
| for (InputType type : getInputTypeList()) |
| if (type.isDirty()) |
| return true; |
| for (OutputType type : getOutputTypeList()) |
| if (type.isDirty()) |
| return true; |
| |
| // Otherwise see if any options need saving |
| if (super.isDirty()) |
| return true; |
| |
| return isDirty; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#setDirty(boolean) |
| */ |
| @Override |
| public void setDirty(boolean isDirty) { |
| this.isDirty = isDirty; |
| // Propagate "false" to options |
| super.setDirty(isDirty); |
| // Propagate "false" to the children |
| if (!isDirty) { |
| for (InputType type : getInputTypeList()) |
| type.setDirty(false); |
| |
| for (OutputType type : getOutputTypeList()) |
| type.setDirty(false); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * Resolve the element IDs to interface references |
| */ |
| @Override |
| public void resolveReferences() { |
| if (!resolved) { |
| resolved = true; |
| // Resolve superClass |
| if (superClassId != null && superClassId.length() > 0) { |
| setSuperClassInternal(ManagedBuildManager.getExtensionTool(superClassId)); |
| if (getSuperClass() == null) { |
| // Report error |
| ManagedBuildManager.outputResolveError("superClass", //$NON-NLS-1$ |
| superClassId, "tool", //$NON-NLS-1$ |
| getId()); |
| } else { |
| // All of our superclasses must be resolved in order to properly |
| // resolve options to option categories |
| ((Tool) getSuperClass()).resolveReferences(); |
| } |
| } |
| // Resolve HoldsOptions |
| super.resolveReferences(); |
| // Call resolveReferences on our children |
| for (InputType current : getInputTypeList()) |
| current.resolveReferences(); |
| |
| for (OutputType current : getOutputTypeList()) |
| current.resolveReferences(); |
| } |
| } |
| |
| /** |
| * Look for ${VALUE} in the command string |
| */ |
| public String evaluateCommand(String command, String values) { |
| final int DOLLAR_VALUE_LENGTH = 8; |
| |
| if (command == null) |
| return values.trim(); |
| |
| String ret = command; |
| boolean found = false; |
| int start = 0; |
| int index; |
| int len; |
| while ((index = ret.indexOf("${", start)) >= 0 && //$NON-NLS-1$ |
| (len = ret.length()) >= index + DOLLAR_VALUE_LENGTH) { |
| start = index; |
| index = index + 2; |
| int ch = ret.charAt(index); |
| if (ch == 'v' || ch == 'V') { |
| index++; |
| ch = ret.charAt(index); |
| if (ch == 'a' || ch == 'A') { |
| index++; |
| ch = ret.charAt(index); |
| if (ch == 'l' || ch == 'L') { |
| index++; |
| ch = ret.charAt(index); |
| if (ch == 'u' || ch == 'U') { |
| index++; |
| ch = ret.charAt(index); |
| if (ch == 'e' || ch == 'E') { |
| index++; |
| ch = ret.charAt(index); |
| if (ch == '}') { |
| String temp = ""; //$NON-NLS-1$ |
| index++; |
| found = true; |
| if (start > 0) { |
| temp = ret.substring(0, start); |
| } |
| temp = temp.concat(values.trim()); |
| if (len > index) { |
| start = temp.length(); |
| ret = temp.concat(ret.substring(index)); |
| index = start; |
| } else { |
| ret = temp; |
| break; |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| start = index; |
| } |
| if (found) |
| return ret.trim(); |
| return (command + values).trim(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getConvertToId() |
| */ |
| @Override |
| public String getConvertToId() { |
| if (convertToId == null) { |
| // If I have a superClass, ask it |
| if (getSuperClass() != null) { |
| return getSuperClass().getConvertToId(); |
| } else { |
| return EMPTY_STRING; |
| } |
| } |
| return convertToId; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#setConvertToId(String) |
| */ |
| @Override |
| public void setConvertToId(String convertToId) { |
| if (convertToId == null && this.convertToId == null) |
| return; |
| if (convertToId == null || this.convertToId == null || !convertToId.equals(this.convertToId)) { |
| this.convertToId = convertToId; |
| setDirty(true); |
| } |
| return; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getVersionsSupported() |
| */ |
| @Override |
| public String getVersionsSupported() { |
| if (versionsSupported == null) { |
| // If I have a superClass, ask it |
| if (getSuperClass() != null) { |
| return getSuperClass().getVersionsSupported(); |
| } else { |
| return EMPTY_STRING; |
| } |
| } |
| return versionsSupported; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#setVersionsSupported(String) |
| */ |
| @Override |
| public void setVersionsSupported(String versionsSupported) { |
| if (versionsSupported == null && this.versionsSupported == null) |
| return; |
| if (versionsSupported == null || this.versionsSupported == null |
| || !versionsSupported.equals(this.versionsSupported)) { |
| this.versionsSupported = versionsSupported; |
| setDirty(true); |
| } |
| return; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.core.ITool#getEnvVarBuildPaths() |
| */ |
| @Override |
| public IEnvVarBuildPath[] getEnvVarBuildPaths() { |
| if (envVarBuildPathList != null) { |
| return envVarBuildPathList.toArray(new IEnvVarBuildPath[envVarBuildPathList.size()]); |
| } else if (getSuperClass() != null) |
| return getSuperClass().getEnvVarBuildPaths(); |
| return null; |
| } |
| |
| private void addEnvVarBuildPath(IEnvVarBuildPath path) { |
| if (path == null) |
| return; |
| if (envVarBuildPathList == null) |
| envVarBuildPathList = new ArrayList<>(); |
| |
| envVarBuildPathList.add(path); |
| } |
| |
| /* |
| * This function checks for migration support for the tool, while |
| * loading. If migration support is needed, looks for the available |
| * converters and stores them. |
| */ |
| |
| public void checkForMigrationSupport() { |
| |
| boolean isExists = false; |
| |
| if (getSuperClass() == null) { |
| // If 'getSuperClass()' is null, then there is no tool available in |
| // plugin manifest file with the same 'id' & version. |
| // Look for the 'versionsSupported' attribute |
| String high = ManagedBuildManager.getExtensionToolMap().lastKey(); |
| |
| SortedMap<String, ? extends ITool> subMap = null; |
| if (superClassId.compareTo(high) <= 0) { |
| subMap = ManagedBuildManager.getExtensionToolMap().subMap(superClassId, high + "\0"); //$NON-NLS-1$ |
| } else { |
| // It means there are no entries in the map for the given id. |
| // make the project is invalid |
| |
| // It means there are no entries in the map for the given id. |
| // make the project is invalid |
| // If the parent is a tool chain |
| IToolChain parent = (IToolChain) getParent(); |
| IConfiguration parentConfig = parent.getParent(); |
| IManagedProject managedProject = parentConfig.getManagedProject(); |
| if (managedProject != null) { |
| managedProject.setValid(false); |
| } |
| return; |
| } |
| |
| // for each element in the 'subMap', |
| // check the 'versionsSupported' attribute whether the given |
| // tool version is supported |
| |
| String baseId = ManagedBuildManager.getIdFromIdAndVersion(superClassId); |
| String version = ManagedBuildManager.getVersionFromIdAndVersion(superClassId); |
| |
| for (ITool toolElement : subMap.values()) { |
| if (ManagedBuildManager.getIdFromIdAndVersion(toolElement.getId()).compareTo(baseId) > 0) |
| break; |
| |
| // First check if both base ids are equal |
| if (ManagedBuildManager.getIdFromIdAndVersion(toolElement.getId()).equals(baseId)) { |
| |
| // Check if 'versionsSupported' attribute is available' |
| String versionsSupported = toolElement.getVersionsSupported(); |
| |
| if ((versionsSupported != null) && (!versionsSupported.isEmpty())) { |
| String[] tmpVersions = versionsSupported.split(","); //$NON-NLS-1$ |
| |
| for (String tmpVersion : tmpVersions) { |
| if (new Version(version).equals(new Version(tmpVersion))) { |
| // version is supported. |
| // Do the automatic conversion without |
| // prompting the user. |
| // Get the supported version |
| String supportedVersion = ManagedBuildManager |
| .getVersionFromIdAndVersion(toolElement.getId()); |
| setId(ManagedBuildManager.getIdFromIdAndVersion(getId()) + "_" + supportedVersion); //$NON-NLS-1$ |
| |
| // If control comes here means that superClass |
| // is null. |
| // So, set the superClass to this tool element |
| setSuperClassInternal(toolElement); |
| superClassId = getSuperClass().getId(); |
| isExists = true; |
| break; |
| } |
| } |
| if (isExists) |
| break; // break the outer for loop if 'isExists' is |
| // true |
| } |
| } |
| } |
| } |
| |
| if (getSuperClass() != null) { |
| // If 'getSuperClass()' is not null, look for 'convertToId' |
| // attribute in plugin |
| // manifest file for this tool. |
| String convertToId = getSuperClass().getConvertToId(); |
| if ((convertToId == null) || (convertToId.isEmpty())) { |
| // It means there is no 'convertToId' attribute available and |
| // the version is still actively |
| // supported by the tool integrator. So do nothing, just return |
| return; |
| } else { |
| // Incase the 'convertToId' attribute is available, |
| // it means that Tool integrator currently does not support this |
| // version of tool. |
| // Look for the converters available for this tool version. |
| |
| getConverter(convertToId); |
| } |
| |
| } else { |
| // make the project is invalid |
| // |
| // It means there are no entries in the map for the given id. |
| // make the project is invalid |
| IToolChain parent = (IToolChain) getParent(); |
| IConfiguration parentConfig = parent.getParent(); |
| IManagedProject managedProject = parentConfig.getManagedProject(); |
| if (managedProject != null) { |
| managedProject.setValid(false); |
| } |
| } |
| return; |
| } |
| |
| private void getConverter(String convertToId) { |
| |
| String fromId = null; |
| String toId = null; |
| |
| // Get the Converter Extension Point |
| IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint( |
| "org.eclipse.cdt.managedbuilder.core", //$NON-NLS-1$ |
| "projectConverter"); //$NON-NLS-1$ |
| if (extensionPoint != null) { |
| // Get the extensions |
| IExtension[] extensions = extensionPoint.getExtensions(); |
| for (IExtension extension : extensions) { |
| // Get the configuration elements of each extension |
| IConfigurationElement[] configElements = extension.getConfigurationElements(); |
| for (IConfigurationElement element : configElements) { |
| |
| if (element.getName().equals("converter")) { //$NON-NLS-1$ |
| |
| fromId = element.getAttribute("fromId"); //$NON-NLS-1$ |
| toId = element.getAttribute("toId"); //$NON-NLS-1$ |
| // Check whether the current converter can be used for |
| // the selected tool |
| |
| if (fromId.equals(getSuperClass().getId()) && toId.equals(convertToId)) { |
| // If it matches |
| String mbsVersion = element.getAttribute("mbsVersion"); //$NON-NLS-1$ |
| Version currentMbsVersion = ManagedBuildManager.getBuildInfoVersion(); |
| |
| // set the converter element based on the MbsVersion |
| if (currentMbsVersion.compareTo(new Version(mbsVersion)) > 0) { |
| previousMbsVersionConversionElement = element; |
| } else { |
| currentMbsVersionConversionElement = element; |
| } |
| return; |
| } |
| } |
| } |
| } |
| } |
| |
| // If control comes here, it means 'Tool Integrator' specified |
| // 'convertToId' attribute in toolchain definition file, but |
| // has not provided any converter. |
| // So, make the project is invalid |
| |
| // It means there are no entries in the map for the given id. |
| // make the project is invalid |
| IToolChain parent = (IToolChain) getParent(); |
| IConfiguration parentConfig = parent.getParent(); |
| IManagedProject managedProject = parentConfig.getManagedProject(); |
| if (managedProject != null) { |
| managedProject.setValid(false); |
| } |
| return; |
| } |
| |
| public IConfigurationElement getPreviousMbsVersionConversionElement() { |
| return previousMbsVersionConversionElement; |
| } |
| |
| public IConfigurationElement getCurrentMbsVersionConversionElement() { |
| return currentMbsVersionConversionElement; |
| } |
| |
| public IProject getProject() { |
| IBuildObject toolParent = getParent(); |
| if (toolParent != null) { |
| if (toolParent instanceof IToolChain) { |
| IConfiguration config = ((IToolChain) toolParent).getParent(); |
| if (config == null) |
| return null; |
| return (IProject) config.getOwner(); |
| } else if (toolParent instanceof IResourceConfiguration) { |
| return (IProject) ((IResourceConfiguration) toolParent).getOwner(); |
| } |
| } |
| return null; |
| } |
| |
| public String[] getContentTypeFileSpecs(IContentType type) { |
| return getContentTypeFileSpecs(type, getProject()); |
| } |
| |
| public String[] getContentTypeFileSpecs(IContentType type, IProject project) { |
| String[] globalSpecs = type.getFileSpecs(IContentType.FILE_EXTENSION_SPEC); |
| IContentTypeSettings settings = null; |
| // IProject project = getProject(); |
| if (project != null) { |
| IScopeContext projectScope = new ProjectScope(project); |
| try { |
| settings = type.getSettings(projectScope); |
| } catch (Exception e) { |
| } |
| if (settings != null) { |
| String[] specs = settings.getFileSpecs(IContentType.FILE_EXTENSION_SPEC); |
| if (specs.length > 0) { |
| int total = globalSpecs.length + specs.length; |
| String[] projSpecs = new String[total]; |
| int i = 0; |
| for (String spec : specs) { |
| projSpecs[i] = spec; |
| i++; |
| } |
| for (String spec : globalSpecs) { |
| projSpecs[i] = spec; |
| i++; |
| } |
| return projSpecs; |
| } |
| } |
| } |
| return globalSpecs; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.internal.core.HoldsOptions#needsRebuild() |
| */ |
| @Override |
| public boolean needsRebuild() { |
| if (rebuildState) |
| return true; |
| |
| // Check my children |
| for (InputType type : getInputTypeList()) |
| if (type.needsRebuild()) |
| return true; |
| |
| for (OutputType type : getOutputTypeList()) |
| if (type.needsRebuild()) |
| return true; |
| |
| return super.needsRebuild(); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.internal.core.HoldsOptions#setRebuildState(boolean) |
| */ |
| @Override |
| public void setRebuildState(boolean rebuild) { |
| if (isExtensionElement() && rebuild) |
| return; |
| |
| if (rebuildState != rebuild) { |
| rebuildState = rebuild; |
| saveRebuildState(); |
| } |
| |
| if (!rebuild) { |
| super.setRebuildState(rebuild); |
| |
| if (!rebuild) { |
| for (InputType type : getInputTypeList()) |
| type.setRebuildState(false); |
| |
| for (OutputType type : getOutputTypeList()) |
| type.setRebuildState(false); |
| } |
| } |
| } |
| |
| private void saveRebuildState() { |
| PropertyManager.getInstance().setProperty(this, REBUILD_STATE, Boolean.toString(rebuildState)); |
| } |
| |
| @Override |
| public CLanguageData getCLanguageData(IInputType type) { |
| initDataMap(); |
| return typeToDataMap.get(type); |
| } |
| |
| private void initDataMap() { |
| if (fDataMapInited) |
| return; |
| |
| List<IInputType> types = getLanguageInputTypes(); |
| |
| if (types != null) { |
| if (types.size() == 0) { |
| CLanguageData data = typeToDataMap.get(null); |
| if (data == null) { |
| data = new BuildLanguageData(this, null); |
| if (typeToDataMap.size() != 0) { |
| typeToDataMap.clear(); |
| } |
| typeToDataMap.put(null, data); |
| } |
| |
| } else { |
| //create editable input types for lang datas first |
| |
| for (ListIterator<IInputType> iter = types.listIterator(); iter.hasNext();) { |
| IInputType type = iter.next(); |
| iter.set(getEditableInputType(type)); |
| } |
| |
| @SuppressWarnings("unchecked") |
| Map<IInputType, CLanguageData> map = (Map<IInputType, CLanguageData>) typeToDataMap.clone(); |
| for (IInputType type : types) { |
| CLanguageData data = map.remove(type); |
| if (data == null) { |
| data = new BuildLanguageData(this, type); |
| typeToDataMap.put(type, data); |
| } |
| } |
| |
| if (map.size() > 0) { |
| for (IInputType it : map.keySet()) { |
| typeToDataMap.remove(it); |
| } |
| } |
| } |
| } |
| fDataMapInited = true; |
| } |
| |
| private boolean isLanguageInputType(IInputType type, boolean checkLangSettings) { |
| boolean supports = type.getLanguageId(this) != null || typeContributesToScannerConfig((InputType) type); |
| |
| if (supports && checkLangSettings) { |
| supports = supportsLanguageSettings(); |
| } |
| |
| return supports; |
| } |
| |
| public boolean supportsLanguageSettings() { |
| IOption options[] = getOptions(); |
| boolean found = false; |
| for (IOption option : options) { |
| try { |
| int type = option.getValueType(); |
| if (ManagedBuildManager.optionTypeToEntryKind(type) != 0) { |
| found = true; |
| break; |
| } |
| } catch (BuildException e) { |
| } |
| } |
| return found; |
| } |
| |
| private List<IInputType> getLanguageInputTypes() { |
| List<IInputType> list = new ArrayList<>(); |
| IInputType[] types = getInputTypes(); |
| for (IInputType t : types) { |
| InputType type = (InputType) t; |
| if (isLanguageInputType(type, false)) |
| list.add(type); |
| } |
| if (list.size() == 0) { |
| if (types.length == 1) { |
| list.add(types[0]); |
| } else { |
| for (IInputType t : types) { |
| if (t.getPrimaryInput()) { |
| list.add(t); |
| break; |
| } |
| } |
| } |
| } |
| |
| boolean found = supportsLanguageSettings(); |
| if (!found) |
| return null; |
| return list; |
| } |
| |
| @Override |
| public CLanguageData[] getCLanguageDatas() { |
| initDataMap(); |
| return typeToDataMap.values().toArray(new BuildLanguageData[typeToDataMap.size()]); |
| } |
| |
| @Override |
| public IInputType getInputTypeForCLanguageData(CLanguageData data) { |
| if (data instanceof BuildLanguageData) |
| return ((BuildLanguageData) data).getInputType(); |
| return null; |
| } |
| |
| @Override |
| public IResourceInfo getParentResourceInfo() { |
| if (parent instanceof IFileInfo) |
| return (IResourceInfo) parent; |
| else if (parent instanceof IToolChain) |
| return ((IToolChain) parent).getParentFolderInfo(); |
| return null; |
| } |
| |
| @Override |
| public IInputType getEditableInputType(IInputType base) { |
| if (base.getParent() == this) |
| return base; |
| |
| IInputType extType = base; |
| for (; extType != null && !extType.isExtensionElement(); extType = extType.getSuperClass()) { |
| // empty body |
| } |
| String id; |
| if (extType != null) { |
| id = ManagedBuildManager.calculateChildId(extType.getId(), null); |
| } else { |
| id = ManagedBuildManager.calculateChildId(getId(), null); |
| } |
| InputType newType = (InputType) createInputType(base, id, base.getName(), false); |
| IAdditionalInput addlInputs[] = base.getAdditionalInputs(); |
| for (IAdditionalInput addlInput : addlInputs) { |
| newType.createAdditionalInput(addlInput); |
| } |
| return newType; |
| } |
| |
| @Override |
| public IOutputType getEditableOutputType(IOutputType base) { |
| if (base.getParent() == this) |
| return base; |
| |
| IOutputType extType = base; |
| for (; extType != null && !extType.isExtensionElement(); extType = extType.getSuperClass()) { |
| // empty body - loop to find extension |
| } |
| String id; |
| if (extType != null) { |
| id = ManagedBuildManager.calculateChildId(extType.getId(), null); |
| } else { |
| id = ManagedBuildManager.calculateChildId(getId(), null); |
| } |
| IOutputType newType = createOutputType(base, id, base.getName(), false); |
| return newType; |
| } |
| |
| @Override |
| public boolean supportsType(IBuildPropertyType type) { |
| return supportsType(type.getId()); |
| } |
| |
| @Override |
| public boolean supportsType(String type) { |
| boolean suports = false; |
| |
| SupportedProperties props = findSupportedProperties(); |
| if (props != null) { |
| suports = props.supportsType(type); |
| } else { |
| BooleanExpressionApplicabilityCalculator calc = getBooleanExpressionCalculator(); |
| if (calc != null) { |
| suports = calc.referesProperty(type); |
| } |
| |
| if (!suports) |
| suports = super.supportsType(type); |
| } |
| return suports; |
| } |
| |
| @Override |
| public boolean supportsValue(String type, String value) { |
| boolean suports = false; |
| SupportedProperties props = findSupportedProperties(); |
| if (props != null) { |
| suports = props.supportsValue(type, value); |
| } else { |
| BooleanExpressionApplicabilityCalculator calc = getBooleanExpressionCalculator(); |
| if (calc != null) { |
| suports = calc.referesPropertyValue(type, value); |
| } |
| |
| if (!suports) |
| suports = super.supportsValue(type, value); |
| } |
| return suports; |
| } |
| |
| @Override |
| public boolean supportsValue(IBuildPropertyType type, IBuildPropertyValue value) { |
| return supportsValue(type.getId(), value.getId()); |
| } |
| |
| @Override |
| public void propertiesChanged() { |
| if (isExtensionTool) |
| return; |
| |
| BooleanExpressionApplicabilityCalculator calculator = getBooleanExpressionCalculator(); |
| if (calculator != null) |
| calculator.adjustTool(getParentResourceInfo(), this, false); |
| |
| super.propertiesChanged(); |
| } |
| |
| public BooleanExpressionApplicabilityCalculator getBooleanExpressionCalculator() { |
| if (booleanExpressionCalculator == null) { |
| if (superClass != null) { |
| return ((Tool) superClass).getBooleanExpressionCalculator(); |
| } |
| } |
| return booleanExpressionCalculator; |
| } |
| |
| @Override |
| public boolean isEnabled() { |
| return isEnabled(getParentResourceInfo()); |
| } |
| |
| public boolean isEnabled(IResourceInfo rcInfo) { |
| |
| BooleanExpressionApplicabilityCalculator calc = getBooleanExpressionCalculator(); |
| if (calc == null) |
| return true; |
| |
| return calc.isToolUsedInCommandLine(rcInfo, this); |
| } |
| |
| @Override |
| public boolean matches(ITool tool) { |
| if (tool == this) |
| return true; |
| |
| ITool rT = ManagedBuildManager.getRealTool(this); |
| if (rT == null) |
| return false; |
| |
| return rT == ManagedBuildManager.getRealTool(tool); |
| } |
| |
| /* public SupportedProperties getSupportedProperties(){ |
| Map map = findSupportedProperties(); |
| if(map != null) |
| return new HashMap(map); |
| return null; |
| } |
| */ |
| private SupportedProperties findSupportedProperties() { |
| if (supportedProperties == null) { |
| if (superClass != null) { |
| return ((Tool) superClass).findSupportedProperties(); |
| } |
| } |
| return supportedProperties; |
| } |
| |
| @Override |
| public boolean supportsBuild(boolean managed) { |
| if (supportsManagedBuild == null) { |
| if (superClass != null) { |
| return ((Tool) superClass).supportsBuild(managed); |
| } |
| return true; |
| } |
| return supportsManagedBuild.booleanValue(); |
| } |
| |
| @Override |
| public MatchKey<Tool> getMatchKey() { |
| if (isAbstract()) |
| return null; |
| if (!isExtensionTool) |
| return null; |
| return new MatchKey<>(this); |
| } |
| |
| @Override |
| public void setIdenticalList(List<Tool> list) { |
| identicalList = list; |
| } |
| |
| public String getNameAndVersion() { |
| String name = getName(); |
| String version = ManagedBuildManager.getVersionFromIdAndVersion(getId()); |
| if (version != null && version.length() != 0) { |
| return new StringBuilder().append(name).append(" (").append(version).append("").toString(); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| return name; |
| } |
| |
| public IConfigurationElement getConverterModificationElement(ITool toTool) { |
| Map<String, IConfigurationElement> map = ManagedBuildManager.getConversionElements(this); |
| IConfigurationElement element = null; |
| if (!map.isEmpty()) { |
| for (IConfigurationElement el : map.values()) { |
| String toId = el.getAttribute("toId"); //$NON-NLS-1$ |
| ITool to = toTool; |
| if (toId != null) { |
| for (; to != null; to = to.getSuperClass()) { |
| if (toId.equals(to.getId())) |
| break; |
| } |
| } |
| |
| if (to != null) { |
| element = el; |
| break; |
| } |
| } |
| } |
| |
| return element; |
| } |
| |
| void updateParent(IBuildObject parent) { |
| this.parent = parent; |
| } |
| |
| void updateParentResourceInfo(IResourceInfo rcInfo) { |
| if (rcInfo instanceof IFileInfo) |
| this.parent = rcInfo; |
| else |
| this.parent = ((IFolderInfo) rcInfo).getToolChain(); |
| } |
| |
| @Override |
| public List<Tool> getIdenticalList() { |
| return identicalList; |
| } |
| |
| @Override |
| public String[] getRequiredTypeIds() { |
| SupportedProperties props = findSupportedProperties(); |
| String[] required = null; |
| if (props != null) { |
| required = props.getRequiredTypeIds(); |
| } else { |
| required = super.getRequiredTypeIds(); |
| } |
| return required; |
| } |
| |
| @Override |
| public String[] getSupportedTypeIds() { |
| SupportedProperties props = findSupportedProperties(); |
| String[] supported = null; |
| if (props != null) { |
| supported = props.getSupportedTypeIds(); |
| } else { |
| BooleanExpressionApplicabilityCalculator calc = getBooleanExpressionCalculator(); |
| List<String> list = new ArrayList<>(); |
| if (calc != null) { |
| list.addAll(Arrays.asList(calc.getReferencedPropertyIds())); |
| } |
| |
| list.addAll(Arrays.asList(super.getSupportedTypeIds())); |
| supported = list.toArray(new String[list.size()]); |
| } |
| return supported; |
| } |
| |
| @Override |
| public String[] getSupportedValueIds(String typeId) { |
| SupportedProperties props = findSupportedProperties(); |
| String[] supported = null; |
| if (props != null) { |
| supported = props.getSupportedValueIds(typeId); |
| } else { |
| BooleanExpressionApplicabilityCalculator calc = getBooleanExpressionCalculator(); |
| List<String> list = new ArrayList<>(); |
| if (calc != null) { |
| list.addAll(Arrays.asList(calc.getReferencedValueIds(typeId))); |
| } |
| |
| list.addAll(Arrays.asList(super.getSupportedValueIds(typeId))); |
| supported = list.toArray(new String[list.size()]); |
| } |
| return supported; |
| } |
| |
| @Override |
| public boolean requiresType(String typeId) { |
| SupportedProperties props = findSupportedProperties(); |
| boolean required; |
| if (props != null) { |
| required = props.requiresType(typeId); |
| } else { |
| required = super.requiresType(typeId); |
| } |
| return required; |
| } |
| |
| public void resetErrorParsers() { |
| errorParserIds = null; |
| } |
| |
| void removeErrorParsers(Set<String> set) { |
| if (set != null && !set.isEmpty()) { |
| Set<String> oldSet = contributeErrorParsers(null); |
| if (oldSet == null) |
| oldSet = new HashSet<>(); |
| |
| oldSet.removeAll(set); |
| setErrorParserList(oldSet.toArray(new String[oldSet.size()])); |
| } |
| } |
| |
| public void setErrorParserList(String[] ids) { |
| if (ids == null) { |
| setErrorParserIds(null); |
| } else if (ids.length == 0) { |
| setErrorParserIds(EMPTY_STRING); |
| } else { |
| StringBuilder buf = new StringBuilder(); |
| buf.append(ids[0]); |
| for (int i = 1; i < ids.length; i++) { |
| buf.append(";").append(ids[i]); //$NON-NLS-1$ |
| } |
| setErrorParserIds(buf.toString()); |
| } |
| } |
| |
| @Override |
| public boolean isSystemObject() { |
| if (isTest) |
| return true; |
| |
| if (getConvertToId().length() != 0) |
| return true; |
| |
| IBuildObject bo = getParent(); |
| if (bo instanceof IToolChain) |
| return ((IToolChain) bo).isSystemObject(); |
| return false; |
| } |
| |
| @Override |
| public boolean isHidden() { |
| if (isHidden == null) { |
| if (getSuperClass() != null) { |
| return getSuperClass().isHidden(); |
| } |
| return false; // default is false |
| } |
| return isHidden.booleanValue(); |
| } |
| |
| @Override |
| public String getUniqueRealName() { |
| String name = getName(); |
| if (name == null) { |
| name = getId(); |
| } else { |
| String version = ManagedBuildManager.getVersionFromIdAndVersion(getId()); |
| if (version != null) { |
| StringBuilder buf = new StringBuilder(); |
| buf.append(name); |
| buf.append(" (v").append(version).append(")"); //$NON-NLS-1$ //$NON-NLS-2$ |
| name = buf.toString(); |
| } |
| } |
| return name; |
| } |
| |
| private boolean typeContributesToScannerConfig(InputType inType) { |
| // InputType inType = (InputType)type; |
| |
| if (inType.getDiscoveryProfileId(this) != null) |
| return true; |
| |
| return false; |
| } |
| |
| public boolean hasScannerConfigSettings(IInputType type) { |
| if (type == null) { |
| boolean has = hasScannerConfigSettings(); |
| if (has) |
| return has; |
| ITool superClass = getSuperClass(); |
| if (superClass != null && superClass instanceof Tool) |
| return ((Tool) superClass).hasScannerConfigSettings(type); |
| return false; |
| } |
| return ((InputType) type).hasScannerConfigSettings(); |
| } |
| |
| private boolean hasScannerConfigSettings() { |
| |
| if (getDiscoveryProfileIdAttribute() != null) |
| return true; |
| |
| return false; |
| } |
| |
| public PathInfoCache setDiscoveredPathInfo(IInputType type, PathInfoCache info) { |
| return discoveredInfoMap.put(getTypeKey(type), info); |
| } |
| |
| public PathInfoCache getDiscoveredPathInfo(IInputType type) { |
| return discoveredInfoMap.get(getTypeKey(type)); |
| } |
| |
| public PathInfoCache clearDiscoveredPathInfo(IInputType type) { |
| return discoveredInfoMap.remove(getTypeKey(type)); |
| } |
| |
| public void clearAllDiscoveredPathInfo() { |
| discoveredInfoMap.clear(); |
| } |
| |
| public void clearAllDiscoveredInfo() { |
| discoveredInfoMap.clear(); |
| } |
| |
| private String getTypeKey(IInputType type) { |
| if (type != null) |
| return type.getId(); |
| return null; |
| } |
| |
| public String getDiscoveryProfileIdAttribute() { |
| if (scannerConfigDiscoveryProfileId == null && superClass != null) |
| return ((Tool) superClass).getDiscoveryProfileIdAttribute(); |
| return scannerConfigDiscoveryProfileId; |
| } |
| |
| private IToolChain getToolChain() { |
| IBuildObject bo = getParent(); |
| IToolChain tCh = null; |
| if (bo instanceof IToolChain) { |
| tCh = ((IToolChain) bo); |
| } else if (bo instanceof IFileInfo) { |
| tCh = ((ResourceConfiguration) bo).getBaseToolChain(); |
| } |
| return tCh; |
| } |
| |
| public String getDiscoveryProfileId() { |
| String id = getDiscoveryProfileIdAttribute(); |
| if (id == null) { |
| IToolChain tc = getToolChain(); |
| if (tc != null) |
| id = tc.getScannerConfigDiscoveryProfileId(); |
| } |
| return id; |
| } |
| |
| public boolean hasCustomSettings(Tool tool) { |
| if (superClass == null) |
| return true; |
| |
| ITool realTool = ManagedBuildManager.getRealTool(this); |
| ITool otherRealTool = ManagedBuildManager.getRealTool(tool); |
| if (realTool != otherRealTool) |
| return true; |
| |
| if (hasCustomSettings()) |
| return true; |
| |
| if (inputTypeList != null && inputTypeList.size() != 0) { |
| for (InputType inType : inputTypeList) { |
| if (inType.hasCustomSettings()) |
| return true; |
| } |
| } |
| |
| if (outputTypeList != null && outputTypeList.size() != 0) { |
| for (OutputType outType : outputTypeList) { |
| if (outType.hasCustomSettings()) |
| return true; |
| } |
| } |
| Tool superTool = (Tool) superClass; |
| |
| if (command != null && !command.equals(superTool.getToolCommand())) |
| return true; |
| |
| if (errorParserIds != null && !errorParserIds.equals(superTool.getErrorParserIds())) |
| return true; |
| |
| if (commandLinePattern != null && !commandLinePattern.equals(superTool.getCommandLinePattern())) |
| return true; |
| |
| if (customBuildStep != null && customBuildStep.booleanValue() != superTool.getCustomBuildStep()) |
| return true; |
| |
| if (announcement != null && !announcement.equals(superTool.getAnnouncement())) |
| return true; |
| |
| if (isHidden != null && isHidden.booleanValue() != superTool.isHidden()) |
| return true; |
| |
| if (discoveredInfoMap != null && discoveredInfoMap.size() != 0) |
| return true; |
| |
| if (isAnyOptionModified(this, tool)) |
| return true; |
| |
| return false; |
| } |
| |
| private boolean isAnyOptionModified(ITool t1, ITool t2) { |
| for (IOption op1 : t1.getOptions()) { |
| for (IOption op2 : t2.getOptions()) { |
| // find matching option |
| try { |
| if (op1.getValueType() == op2.getValueType() && op1.getName() != null |
| && op1.getName().equals(op2.getName())) { |
| Object ob1 = op1.getValue(); |
| Object ob2 = op2.getValue(); |
| if (ob1 == null && ob2 == null) |
| break; |
| // values are different ? |
| if ((ob1 == null || ob2 == null) || !(ob1.equals(ob2))) |
| return true; |
| else |
| break; |
| } |
| } catch (BuildException e) { |
| return true; // unprobable |
| } |
| } |
| } |
| return false; |
| } |
| |
| public IOption[] getOptionsOfType(int type) { |
| List<IOption> list = new ArrayList<>(); |
| for (IOption op : getOptions()) { |
| try { |
| if (op.getValueType() == type) |
| list.add(op); |
| } catch (BuildException e) { |
| ManagedBuilderCorePlugin.log(e); |
| } |
| } |
| return list.toArray(new Option[list.size()]); |
| } |
| |
| public void filterValues(int type, List<String> values) { |
| if (values.size() == 0) |
| return; |
| |
| int opType = Option.getOppositeType(type); |
| if (opType != 0) { |
| Set<Object> filterSet = new HashSet<>(); |
| for (IOption op : getOptionsOfType(opType)) { |
| filterSet.addAll((List<Object>) op.getValue()); |
| } |
| |
| if (filterSet.size() != 0) { |
| for (Iterator<String> iterator = values.iterator(); iterator.hasNext();) { |
| String oVal = iterator.next(); |
| if (type == IOption.PREPROCESSOR_SYMBOLS) { |
| String[] nameVal = BuildEntryStorage.macroNameValueFromValue(oVal); |
| oVal = nameVal[0]; |
| } |
| if (filterSet.contains(oVal)) |
| iterator.remove(); |
| } |
| } |
| } |
| } |
| |
| private int getSuperClassNum() { |
| int num = 0; |
| for (ITool superTool = getSuperClass(); superTool != null; superTool = superTool.getSuperClass()) { |
| num++; |
| } |
| return num; |
| } |
| |
| @Override |
| public int compareTo(Tool other) { |
| if (other.isSystemObject() != isSystemObject()) |
| return isSystemObject() ? 1 : -1; |
| |
| return getSuperClassNum() - other.getSuperClassNum(); |
| } |
| |
| @Override |
| public IRealBuildObjectAssociation getExtensionObject() { |
| return (IRealBuildObjectAssociation) ManagedBuildManager.getExtensionTool(this); |
| } |
| |
| @Override |
| public IRealBuildObjectAssociation[] getIdenticBuildObjects() { |
| return (IRealBuildObjectAssociation[]) ManagedBuildManager.findIdenticalTools(this); |
| } |
| |
| @Override |
| public IRealBuildObjectAssociation getRealBuildObject() { |
| return (IRealBuildObjectAssociation) ManagedBuildManager.getRealTool(this); |
| } |
| |
| @Override |
| public IRealBuildObjectAssociation getSuperClassObject() { |
| return (IRealBuildObjectAssociation) getSuperClass(); |
| } |
| |
| @Override |
| public final int getType() { |
| return OBJECT_TOOL; |
| } |
| |
| @Override |
| public boolean isRealBuildObject() { |
| return getRealBuildObject() == this; |
| } |
| |
| @Override |
| public boolean isExtensionBuildObject() { |
| return isExtensionElement(); |
| } |
| |
| @Override |
| public IOptionCategoryApplicability getApplicabilityCalculator() { |
| // Tool does not have any ApplicabilityCalculator. |
| return null; |
| } |
| } |