// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#if NET_2_0
+
using System;
using System.Text;
using System.Xml;
+using Microsoft.Build.Framework;
+
namespace Microsoft.Build.BuildEngine {
- public class BuildProperty : IBuildProperty {
+ public class BuildProperty {
XmlElement propertyElement;
- XmlAttribute condition;
string finalValue;
+ bool isImported;
string value;
string name;
+ Project parentProject;
PropertyType propertyType;
-
- public BuildProperty ()
- : this (null, null)
+
+ BuildProperty ()
+ {
+ }
+
+ public BuildProperty (string propertyName, string propertyValue)
+ : this (propertyName, propertyValue, PropertyType.Normal)
{
+ if (propertyName == null)
+ throw new ArgumentNullException ("propertyName");
+ if (propertyValue == null)
+ throw new ArgumentNullException ("propertyValue");
}
- public BuildProperty (string propertyName,
- string propertyValue)
+ internal BuildProperty (string propertyName,
+ string propertyValue, PropertyType propertyType)
{
this.name = propertyName;
this.value = propertyValue;
+ this.finalValue = propertyValue;
+ this.propertyType = propertyType;
+ this.isImported = false;
}
+ internal BuildProperty (Project parentProject, XmlElement propertyElement)
+ {
+ if (propertyElement == null)
+ throw new ArgumentNullException ("propertyElement");
+
+ this.propertyElement = propertyElement;
+ this.propertyType = PropertyType.Normal;
+ this.parentProject = parentProject;
+ this.name = propertyElement.Name;
+ this.value = propertyElement.InnerXml;
+ this.isImported = false;
+ }
+
+ [MonoTODO]
public BuildProperty Clone (bool deepClone)
{
- BuildProperty bp;
-
- bp = new BuildProperty ();
- bp.condition = this.condition;
- bp.finalValue = this.finalValue;
- bp.name = this.name;
- bp.propertyElement = this.propertyElement;
- bp.propertyType = this.propertyType;
- bp.value = this.value;
-
- return bp;
- }
-
- public static implicit operator string (BuildProperty propertyToCast)
+ if (deepClone) {
+ if (FromXml)
+ throw new NotImplementedException ();
+ else
+ return (BuildProperty) this.MemberwiseClone ();
+ } else {
+ if (FromXml)
+ throw new NotImplementedException ();
+ else
+ throw new InvalidOperationException ("A shallow clone of this object cannot be created.");
+ }
+ }
+
+ public static explicit operator string (BuildProperty propertyToCast)
{
if (propertyToCast == null)
- throw new ArgumentNullException ("propertyToCast");
- return propertyToCast.ToString ();
+ return String.Empty;
+ else
+ return propertyToCast.ToString ();
}
public override string ToString ()
return Value;
}
-
- internal void BindToXml (XmlElement propertyElement)
+ internal void Evaluate ()
{
- if (propertyElement == null)
- throw new ArgumentNullException ("propertyElement");
- this.propertyElement = propertyElement;
- this.condition = propertyElement.GetAttributeNode ("Condition");
- this.name = propertyElement.Name;
- this.value = propertyElement.InnerText;
+ BuildProperty evaluated = new BuildProperty (Name, Value);
+
+ Expression exp = new Expression ();
+ exp.Parse (Value, false, false);
+ evaluated.finalValue = (string) exp.ConvertTo (parentProject, typeof (string));
+
+ parentProject.EvaluatedProperties.AddProperty (evaluated);
}
-
- internal void UpdateXml ()
+
+ internal string ConvertToString (Project project)
{
+ Expression exp = new Expression ();
+ exp.Parse (Value, true, false);
+
+ return (string) exp.ConvertTo (project, typeof (string));
}
-
+
+ internal ITaskItem[] ConvertToITaskItemArray (Project project)
+ {
+ Expression exp = new Expression ();
+ exp.Parse (Value, true, false);
+
+ return (ITaskItem[]) exp.ConvertTo (project, typeof (ITaskItem[]));
+ }
+
+ internal bool FromXml {
+ get {
+ return propertyElement != null;
+ }
+ }
+
public string Condition {
get {
- if (condition == null)
- return null;
+ if (FromXml)
+ return propertyElement.GetAttribute ("Condition");
else
- return condition.Value;
+ return String.Empty;
}
set {
- if (condition != null)
- condition.Value = value;
+ if (FromXml)
+ propertyElement.SetAttribute ("Condition", value);
+ else
+ throw new InvalidOperationException ("Cannot set a condition on an object not represented by an XML element in the project file.");
}
}
public string FinalValue {
get {
- if (finalValue == null) {
+ if (finalValue == null)
return this.@value;
- } else
+ else
return finalValue;
}
- internal set {
- finalValue = value;
- }
+ }
+
+ public bool IsImported {
+ get { return isImported; }
}
public string Name {
- get {
- return name;
- }
+ get { return name; }
}
public string Value {
}
set {
this.@value = value;
+ if (FromXml) {
+ propertyElement.InnerXml = value;
+ } else {
+ finalValue = value;
+ }
}
}
internal PropertyType PropertyType {
- get { return propertyType; }
- set { propertyType = value; }
+ get {
+ return propertyType;
+ }
+ }
+
+ internal XmlElement XmlElement {
+ get { return propertyElement; }
}
}
internal enum PropertyType {
Reserved,
- CommandLine,
+ Global,
Normal,
Environment
}
}
+
+#endif