using System;
using System.Text.RegularExpressions;
using System.ComponentModel;
using System.Runtime.Serialization;
using AnticipatingMinds.Genesis.CodeDOM;
namespace AnticipatingMinds.Genesis.KnowledgeManagement{
/// <summary>
/// Summary description for VariableApplicabilityScope.
/// </summary>
[Serializable]
public class VariableApplicabilityScope : ApplicabilityScope,ISerializable, ICloneable
{
#region Instance constructors
public VariableApplicabilityScope():base()
{
}
public VariableApplicabilityScope(VariableApplicabilityScope variableApplicabilityScope) : base(variableApplicabilityScope)
{
if(variableApplicabilityScope.VariableType != null)
VariableType = ((ICloneable)variableApplicabilityScope.VariableType).Clone() as TypeReferenceApplicabilityScope;
if(variableApplicabilityScope.VariableName != null)
VariableName = new Regex(variableApplicabilityScope.VariableName.ToString());
}
#endregion Instance constructors
#region ISerializable Implementation
private VariableApplicabilityScope(SerializationInfo info, StreamingContext context) : base(info,context)
{
if(info.GetString("VariableName").Length != 0)
VariableName = new Regex(info.GetString("VariableName"));
VariableType = info.GetValue("VariableType",typeof(TypeReferenceApplicabilityScope)) as TypeReferenceApplicabilityScope;
}
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info,context);
info.AddValue("VariableType",VariableType,typeof(TypeReferenceApplicabilityScope));
if(VariableName != null)
info.AddValue("VariableName",VariableName.ToString());
else
info.AddValue("VariableName",string.Empty);
}
#endregion
#region ICloneable Members
public object Clone()
{
return new VariableApplicabilityScope(this);
}
#endregion
#region Public instance properties
[Category("Behavior")]
[System.ComponentModel.Editor(typeof(TypeReferenceScopeEditor),typeof(System.Drawing.Design.UITypeEditor))]
[TypeConverter(typeof(ApplicabilityScopeTypeConverter))]
[DefaultValue(null)]
[Description("The data type of the variable being declared.")]
public TypeReferenceApplicabilityScope VariableType
{
get
{
return variableType;
}
set
{
variableType = value;
}
}
public override string Title
{
get
{
return "Variable Declaration";
}
}
[Category("Behavior")]
[DefaultValue(null)]
[TypeConverter(typeof(RegExpTypeConverter))]
[Description("Regular expression used to define the criteria for the name to be used in scope definition.")]
public virtual Regex VariableName
{
get
{
return variableName;
}
set
{
variableName = value;
}
}
#endregion Public instance properties
#region Protected instance methods
protected override bool DoesElementMatchScopeConditions(CodeElement codeElement)
{
if(!(codeElement is CodeVariableDeclarationStatement))
return false;
CodeVariableDeclarationStatement variableDeclaration = codeElement as CodeVariableDeclarationStatement;
if(VariableType != null)
if(!VariableType.IsElementInScope(variableDeclaration.DeclarationType))
return false;
if(VariableName != null)
{
bool isMatchFound = false;
foreach(CodeVariableDeclarationMember declarationMember in (codeElement as CodeVariableDeclarationStatement).DeclaredVariables)
{
if(VariableName.Match(declarationMember.Name).Success)
{
isMatchFound = true;
break;
}
}
if(!isMatchFound)
return false;
}
return true;
}
#endregion Protected instance methods
#region Private instance fields
TypeReferenceApplicabilityScope variableType = null;
private Regex variableName;
#endregion Private instance fields
}
}
|