// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under MIT X11 license (for details please see \doc\license.txt)
using System;
using System.Linq;
namespace ICSharpCode.NRefactory.PatternMatching
{
///
/// Matches the last entry in the specified named group.
///
public class Backreference : Pattern
{
readonly string referencedGroupName;
public string ReferencedGroupName {
get { return referencedGroupName; }
}
public Backreference(string referencedGroupName)
{
if (referencedGroupName == null)
throw new ArgumentNullException("referencedGroupName");
this.referencedGroupName = referencedGroupName;
}
public override bool DoMatch(INode other, Match match)
{
return match.Get(referencedGroupName).Last().IsMatch(other);
}
public override S AcceptVisitor(IPatternAstVisitor visitor, T data)
{
return visitor.VisitBackreference(this, data);
}
}
///
/// Matches identifier expressions that have the same identifier as the referenced variable/type definition/method definition.
///
public class IdentifierExpressionBackreference : Pattern
{
readonly string referencedGroupName;
public string ReferencedGroupName {
get { return referencedGroupName; }
}
public IdentifierExpressionBackreference(string referencedGroupName)
{
if (referencedGroupName == null)
throw new ArgumentNullException("referencedGroupName");
this.referencedGroupName = referencedGroupName;
}
public override bool DoMatch(INode other, Match match)
{
CSharp.IdentifierExpression ident = other as CSharp.IdentifierExpression;
if (ident == null || ident.TypeArguments.Any())
return false;
CSharp.AstNode referenced = (CSharp.AstNode)match.Get(referencedGroupName).Last();
if (referenced == null)
return false;
return ident.Identifier == referenced.GetChildByRole(CSharp.AstNode.Roles.Identifier).Name;
}
public override S AcceptVisitor(IPatternAstVisitor visitor, T data)
{
return visitor.VisitIdentifierExpressionBackreference(this, data);
}
}
}