blob: 2c0474b4c63a85a5492d04d873b016548c8bf4be [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2020 Intel 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:
* Intel Corporation - Initial API and implementation
* Sergei Kovalchuk (NXP)
*******************************************************************************/
package org.eclipse.cdt.build.internal.core.scannerconfig;
import java.text.MessageFormat;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.cdt.build.core.scannerconfig.CfgInfoContext;
import org.eclipse.cdt.managedbuilder.core.IInputType;
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.internal.core.Configuration;
import org.eclipse.cdt.managedbuilder.internal.core.FolderInfo;
import org.eclipse.cdt.managedbuilder.internal.core.InputType;
import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages;
import org.eclipse.cdt.managedbuilder.internal.core.ResourceConfiguration;
import org.eclipse.cdt.managedbuilder.internal.core.Tool;
import org.eclipse.cdt.managedbuilder.internal.core.ToolChain;
import org.eclipse.core.runtime.Assert;
public class CfgScannerConfigUtil {
public static CfgInfoContext adjustPerRcTypeContext(CfgInfoContext context) {
if (((Configuration) context.getConfiguration()).isPreference())
return context;
Tool tool = (Tool) context.getTool();
IResourceInfo rcInfo = context.getResourceInfo();
IInputType inType = context.getInputType();
boolean adjust = false;
CfgInfoContext newContext = context;
if (tool != null) {
if (inType != null) {
if (!tool.hasScannerConfigSettings(inType)) {
// tool = null;
inType = null;
adjust = true;
}
}
if (inType == null) {
if (!tool.hasScannerConfigSettings(null)) {
tool = null;
adjust = true;
}
}
}
if (tool == null) {
if (inType != null) {
inType = null;
adjust = true;
}
if (rcInfo != null) {
ToolChain tc = getToolChain(rcInfo);
if (tc != null) {
if (!tc.hasScannerConfigSettings()) {
adjust = true;
rcInfo = null;
}
}
}
}
// } else {
// if(tool != null){
// tool = null;
// adjust = true;
// }
// if(rcInfo != null){
// rcInfo = null;
// adjust = true;
// }
// if(inType != null){
// inType = null;
// adjust = true;
// }
// }
if (adjust) {
if (rcInfo == null)
newContext = new CfgInfoContext(context.getConfiguration());
else
newContext = new CfgInfoContext(rcInfo, tool, inType);
}
return newContext;
}
private static ToolChain getToolChain(IResourceInfo rcInfo) {
return rcInfo instanceof FolderInfo ? (ToolChain) ((FolderInfo) rcInfo).getToolChain()
: (ToolChain) ((ResourceConfiguration) rcInfo).getBaseToolChain();
}
public static String getDefaultProfileId(CfgInfoContext context, boolean searchFirstIfNone) {
String id = null;
if (context.getInputType() != null)
id = context.getInputType().getDiscoveryProfileId(context.getTool());
if (id == null && context.getTool() != null)
id = ((Tool) context.getTool()).getDiscoveryProfileId();
if (id == null && context.getResourceInfo() != null) {
ToolChain tCh = getToolChain(context.getResourceInfo());
if (tCh != null)
id = tCh.getScannerConfigDiscoveryProfileId();
}
if (id == null) {
id = ((Configuration) context.getConfiguration()).getDiscoveryProfileId();
}
if (id == null && searchFirstIfNone) {
id = getFirstProfileId(context.getConfiguration().getFilteredTools());
}
return id;
}
public static String getFirstProfileId(ITool[] tools) {
String id = null;
for (int i = 0; i < tools.length; i++) {
ITool tool = tools[i];
IInputType[] types = tool.getInputTypes();
if (types.length != 0) {
for (int k = 0; k < types.length; k++) {
id = types[k].getDiscoveryProfileId(tool);
if (id != null)
break;
}
} else {
id = ((Tool) tool).getDiscoveryProfileId();
}
if (id != null)
break;
}
return id;
}
/**
* Search for toolchain's discovery profiles. Discovery profiles could be
* specified on toolchain level, input types level or in their super-classes.
*
* @param toolchain - toolchain to search for scanner discovery profiles.
* @return all available discovery profiles in given toolchain
*/
public static Set<String> getAllScannerDiscoveryProfileIds(IToolChain toolchain) {
Assert.isNotNull(toolchain);
Set<String> profiles = new TreeSet<>();
if (toolchain != null) {
String toolchainProfileId = null;
if (toolchain instanceof ToolChain) {
// still allow a user a choice to select any legacy profiles
toolchainProfileId = ((ToolChain) toolchain).getLegacyScannerConfigDiscoveryProfileId();
} else {
toolchainProfileId = toolchain.getScannerConfigDiscoveryProfileId();
}
if (toolchainProfileId != null && toolchainProfileId.length() > 0) {
profiles.add(toolchainProfileId);
}
ITool[] tools = toolchain.getTools();
for (ITool tool : tools) {
profiles.addAll(getAllScannerDiscoveryProfileIds(tool));
}
IToolChain superClass = toolchain.getSuperClass();
if (superClass != null) {
profiles.addAll(getAllScannerDiscoveryProfileIds(superClass));
}
}
return profiles;
}
/**
* Search for tool's discovery profiles. Discovery profiles could be retrieved
* from tool/input type super-class. Input type could hold list of profiles
* separated by pipe character '|'.
*
* @param tool - tool to search for scanner discovery profiles
* @return all available discovery profiles in given configuration
*/
public static Set<String> getAllScannerDiscoveryProfileIds(ITool tool) {
Assert.isNotNull(tool);
if (!(tool instanceof Tool)) {
String msg = MessageFormat.format(ManagedMakeMessages.getString("CfgScannerConfigUtil_ErrorNotSupported"), //$NON-NLS-1$
new Object[] { Tool.class.getName() });
throw new UnsupportedOperationException(msg);
}
Set<String> profiles = new TreeSet<>();
for (IInputType inputType : ((Tool) tool).getAllInputTypes()) {
for (String profileId : getAllScannerDiscoveryProfileIds(inputType)) {
profiles.add(profileId);
}
}
ITool superClass = tool.getSuperClass();
if (superClass != null) {
profiles.addAll(getAllScannerDiscoveryProfileIds(superClass));
}
return profiles;
}
/**
* Search for input type's discovery profiles. Discovery profiles could be specified
* on input type super-class. Input type could hold list of profiles
* separated by pipe character '|'.
*
* @param inputType - input type to search for scanner discovery profiles
* @return all available discovery profiles in given configuration
*/
private static Set<String> getAllScannerDiscoveryProfileIds(IInputType inputType) {
Assert.isNotNull(inputType);
if (!(inputType instanceof InputType)) {
String msg = MessageFormat.format(ManagedMakeMessages.getString("CfgScannerConfigUtil_ErrorNotSupported"), //$NON-NLS-1$
new Object[] { InputType.class.getName() });
throw new UnsupportedOperationException(msg);
}
Set<String> profiles = new TreeSet<>();
String attribute = ((InputType) inputType).getLegacyDiscoveryProfileIdAttribute();
if (attribute != null) {
// FIXME: temporary; we should add new method to IInputType instead of that
for (String profileId : attribute.split("\\|")) { //$NON-NLS-1$
profiles.add(profileId);
}
}
IInputType superClass = inputType.getSuperClass();
if (superClass != null) {
profiles.addAll(getAllScannerDiscoveryProfileIds(superClass));
}
return profiles;
}
}