PageRenderTime 26ms CodeModel.GetById 13ms app.highlight 8ms RepoModel.GetById 1ms app.codeStats 1ms

/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/IResolveVisitorNavigator.cs

http://github.com/icsharpcode/ILSpy
C# | 103 lines | 42 code | 10 blank | 51 comment | 4 complexity | c012942c8ffbb9b79036df5af461a5bc MD5 | raw file
  1// Copyright (c) 2010-2013 AlphaSierraPapa for the SharpDevelop Team
  2// 
  3// Permission is hereby granted, free of charge, to any person obtaining a copy of this
  4// software and associated documentation files (the "Software"), to deal in the Software
  5// without restriction, including without limitation the rights to use, copy, modify, merge,
  6// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
  7// to whom the Software is furnished to do so, subject to the following conditions:
  8// 
  9// The above copyright notice and this permission notice shall be included in all copies or
 10// substantial portions of the Software.
 11// 
 12// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
 13// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 14// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
 15// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 16// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 17// DEALINGS IN THE SOFTWARE.
 18
 19using System;
 20using ICSharpCode.NRefactory.Semantics;
 21using ICSharpCode.NRefactory.TypeSystem;
 22
 23namespace ICSharpCode.NRefactory.CSharp.Resolver
 24{
 25	/// <summary>
 26	/// Allows controlling which nodes are resolved by the resolve visitor.
 27	/// </summary>
 28	/// <seealso cref="ResolveVisitor"/>
 29	public interface IResolveVisitorNavigator
 30	{
 31		/// <summary>
 32		/// Asks the navigator whether to scan, skip, or resolve a node.
 33		/// </summary>
 34		ResolveVisitorNavigationMode Scan(AstNode node);
 35		
 36		/// <summary>
 37		/// Notifies the navigator that a node was resolved.
 38		/// </summary>
 39		/// <param name="node">The node that was resolved</param>
 40		/// <param name="result">Resolve result</param>
 41		void Resolved(AstNode node, ResolveResult result);
 42		
 43		/// <summary>
 44		/// Notifies the navigator that an implicit conversion was applied.
 45		/// </summary>
 46		/// <param name="expression">The expression that was resolved.</param>
 47		/// <param name="result">The resolve result of the expression.</param>
 48		/// <param name="conversion">The conversion applied to the expressed.</param>
 49		/// <param name="targetType">The target type of the conversion.</param>
 50		void ProcessConversion(Expression expression, ResolveResult result, Conversion conversion, IType targetType);
 51	}
 52	
 53	/// <summary>
 54	/// Represents the operation mode of the resolve visitor.
 55	/// </summary>
 56	/// <seealso cref="ResolveVisitor"/>
 57	public enum ResolveVisitorNavigationMode
 58	{
 59		/// <summary>
 60		/// Scan into the children of the current node, without resolving the current node.
 61		/// </summary>
 62		Scan,
 63		/// <summary>
 64		/// Skip the current node - do not scan into it; do not resolve it.
 65		/// </summary>
 66		Skip,
 67		/// <summary>
 68		/// Resolve the current node.
 69		/// Subnodes which are not required for resolving the current node
 70		/// will ask the navigator again whether they should be resolved.
 71		/// </summary>
 72		Resolve
 73	}
 74	
 75	sealed class ConstantModeResolveVisitorNavigator : IResolveVisitorNavigator
 76	{
 77		readonly ResolveVisitorNavigationMode mode;
 78		readonly IResolveVisitorNavigator targetForResolveCalls;
 79		
 80		public ConstantModeResolveVisitorNavigator(ResolveVisitorNavigationMode mode, IResolveVisitorNavigator targetForResolveCalls)
 81		{
 82			this.mode = mode;
 83			this.targetForResolveCalls = targetForResolveCalls;
 84		}
 85		
 86		ResolveVisitorNavigationMode IResolveVisitorNavigator.Scan(AstNode node)
 87		{
 88			return mode;
 89		}
 90		
 91		void IResolveVisitorNavigator.Resolved(AstNode node, ResolveResult result)
 92		{
 93			if (targetForResolveCalls != null)
 94				targetForResolveCalls.Resolved(node, result);
 95		}
 96		
 97		void IResolveVisitorNavigator.ProcessConversion(Expression expression, ResolveResult result, Conversion conversion, IType targetType)
 98		{
 99			if (targetForResolveCalls != null)
100				targetForResolveCalls.ProcessConversion(expression, result, conversion, targetType);
101		}
102	}
103}