private bool ParseSetting(string text, int lineNumber, ConfigurationSetting s) {
if (string.IsNullOrWhiteSpace(text)) {
return false;
}
IRValueNode leftOperand;
IRValueNode rightOperand;
if (ParseAssignment(text, out leftOperand, out rightOperand)) {
var listOp = leftOperand as IOperator;
if (listOp != null) {
// Look for assignment on settings environment:
// settings$name1 <- "value1"
// settings$name1 <- expr1
if (listOp.OperatorType == OperatorType.ListIndex && listOp.LeftOperand != null && listOp.RightOperand != null) {
var value = text.Substring(rightOperand.Start, rightOperand.Length);
var listName = (listOp.LeftOperand as Variable)?.Name;
var settingsName = (listOp.RightOperand as Variable)?.Name;
var result = !string.IsNullOrEmpty(settingsName) && !string.IsNullOrEmpty(value);
if (result && listName == "settings") {
try {
s.Name = settingsName;
s.ValueType = value[0] == '\'' || value[0] == '\"' ? ConfigurationSettingValueType.String : ConfigurationSettingValueType.Expression;
s.Value = s.ValueType == ConfigurationSettingValueType.String ? value.FromRStringLiteral() : value;
return true;
} catch (FormatException) {
}
}
}
} else {
// Look for assignment with no environment
// (backwards compat with RTVS 0.5 + creation of settings environment):
// name1 <- "value1"
// name1 <- expr1
var name = (leftOperand as Variable)?.Name;
var value = text.Substring(rightOperand.Start, rightOperand.Length);
var result = !string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(value);
if (result) {
try {
s.Name = name;
s.ValueType = value[0] == '\'' || value[0] == '\"' ? ConfigurationSettingValueType.String : ConfigurationSettingValueType.Expression;
s.Value = s.ValueType == ConfigurationSettingValueType.String ? value.FromRStringLiteral() : value;
return true;
} catch (FormatException) {
}
}
}
}
_errors.Add(new ConfigurationError(lineNumber, Resources.ConfigurationError_Syntax));
return false;
}