mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Bug #219174 : inconsistent file-level tool option propagation
This commit is contained in:
parent
c10df76edf
commit
103b19dfec
1 changed files with 51 additions and 3 deletions
|
@ -262,6 +262,51 @@ public abstract class ResourceInfo extends BuildObject implements IResourceInfo
|
||||||
return config != null;
|
return config != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void propagate(IHoldsOptions parent, IOption option, Object oldValue, Object value) {
|
||||||
|
if (! (parent instanceof ITool))
|
||||||
|
return;
|
||||||
|
ITool tool = (ITool)parent;
|
||||||
|
String sup = option.getId();
|
||||||
|
IOption op = option;
|
||||||
|
while (op.getSuperClass() != null) {
|
||||||
|
op = op.getSuperClass();
|
||||||
|
sup = op.getId();
|
||||||
|
}
|
||||||
|
for (IResourceInfo ri : getChildResourceInfos()) {
|
||||||
|
for (ITool t : ri.getTools()) {
|
||||||
|
if (t.getDefaultInputExtension() != tool.getDefaultInputExtension())
|
||||||
|
continue;
|
||||||
|
op = t.getOptionBySuperClassId(sup);
|
||||||
|
if (op == null)
|
||||||
|
continue;
|
||||||
|
try {
|
||||||
|
if (value instanceof Boolean) {
|
||||||
|
boolean b = ((Boolean)oldValue).booleanValue();
|
||||||
|
if (b == op.getBooleanValue() && b != ((Boolean)value).booleanValue())
|
||||||
|
ri.setOption(t, op, ((Boolean)value).booleanValue());
|
||||||
|
} else if (value instanceof String) {
|
||||||
|
String s = (String)oldValue;
|
||||||
|
if (s.equals(op.getStringValue()) && ! s.equals((String)value))
|
||||||
|
ri.setOption(t, op, (String)value);
|
||||||
|
} else if (value instanceof String[]) {
|
||||||
|
String[] s = (String[])oldValue;
|
||||||
|
if (Arrays.equals(s, op.getStringListValue()) &&
|
||||||
|
! Arrays.equals(s, (String[])value))
|
||||||
|
ri.setOption(t, op, (String[])value);
|
||||||
|
} else if (value instanceof OptionStringValue[]) {
|
||||||
|
OptionStringValue[] s = (OptionStringValue[])oldValue;
|
||||||
|
if (Arrays.equals(s, op.getBasicStringListValueElements()) &&
|
||||||
|
! Arrays.equals(s, (OptionStringValue[])value))
|
||||||
|
ri.setOption(t, op, (OptionStringValue[])value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} catch (BuildException e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public IOption setOption(IHoldsOptions parent, IOption option, boolean value) throws BuildException {
|
public IOption setOption(IHoldsOptions parent, IOption option, boolean value) throws BuildException {
|
||||||
// Is there a change?
|
// Is there a change?
|
||||||
IOption retOpt = option;
|
IOption retOpt = option;
|
||||||
|
@ -269,6 +314,9 @@ public abstract class ResourceInfo extends BuildObject implements IResourceInfo
|
||||||
if (oldVal != value) {
|
if (oldVal != value) {
|
||||||
retOpt = parent.getOptionToSet(option, false);
|
retOpt = parent.getOptionToSet(option, false);
|
||||||
retOpt.setValue(value);
|
retOpt.setValue(value);
|
||||||
|
propagate(parent, option,
|
||||||
|
(oldVal ? Boolean.TRUE : Boolean.FALSE),
|
||||||
|
(value ? Boolean.TRUE : Boolean.FALSE));
|
||||||
NotificationManager.getInstance().optionChanged(this, parent, option, new Boolean(oldVal));
|
NotificationManager.getInstance().optionChanged(this, parent, option, new Boolean(oldVal));
|
||||||
}
|
}
|
||||||
return retOpt;
|
return retOpt;
|
||||||
|
@ -281,10 +329,8 @@ public abstract class ResourceInfo extends BuildObject implements IResourceInfo
|
||||||
if (oldValue != null && !oldValue.equals(value)) {
|
if (oldValue != null && !oldValue.equals(value)) {
|
||||||
retOpt = parent.getOptionToSet(option, false);
|
retOpt = parent.getOptionToSet(option, false);
|
||||||
retOpt.setValue(value);
|
retOpt.setValue(value);
|
||||||
// if(resourceData != null)
|
propagate(parent, option, oldValue, value);
|
||||||
// ((ISettingsChangeListener)resourceData).optionChanged(this, parent, option, oldValue);
|
|
||||||
NotificationManager.getInstance().optionChanged(this, parent, option, oldValue);
|
NotificationManager.getInstance().optionChanged(this, parent, option, oldValue);
|
||||||
// rebuildNeeded = true;
|
|
||||||
}
|
}
|
||||||
return retOpt;
|
return retOpt;
|
||||||
}
|
}
|
||||||
|
@ -304,6 +350,7 @@ public abstract class ResourceInfo extends BuildObject implements IResourceInfo
|
||||||
if(!Arrays.equals(value, oldValue)) {
|
if(!Arrays.equals(value, oldValue)) {
|
||||||
retOpt = parent.getOptionToSet(option, false);
|
retOpt = parent.getOptionToSet(option, false);
|
||||||
retOpt.setValue(value);
|
retOpt.setValue(value);
|
||||||
|
propagate(parent, option, oldValue, value);
|
||||||
NotificationManager.getInstance().optionChanged(this, parent, option, oldValue);
|
NotificationManager.getInstance().optionChanged(this, parent, option, oldValue);
|
||||||
}
|
}
|
||||||
return retOpt;
|
return retOpt;
|
||||||
|
@ -324,6 +371,7 @@ public abstract class ResourceInfo extends BuildObject implements IResourceInfo
|
||||||
if(!Arrays.equals(value, oldValue)) {
|
if(!Arrays.equals(value, oldValue)) {
|
||||||
retOpt = parent.getOptionToSet(option, false);
|
retOpt = parent.getOptionToSet(option, false);
|
||||||
((Option)retOpt).setValue(value);
|
((Option)retOpt).setValue(value);
|
||||||
|
propagate(parent, option, oldValue, value);
|
||||||
NotificationManager.getInstance().optionChanged(this, parent, option, oldValue);
|
NotificationManager.getInstance().optionChanged(this, parent, option, oldValue);
|
||||||
}
|
}
|
||||||
return retOpt;
|
return retOpt;
|
||||||
|
|
Loading…
Add table
Reference in a new issue