2
// <copyright see="prj:///doc/copyright.txt"/>
3
// <license see="prj:///doc/license.txt"/>
4
// <owner name="Daniel Grunwald"/>
5
// <version>$Revision$</version>
9
using System.Collections.Generic;
10
using ICSharpCode.OldNRefactory.Ast;
11
using ICSharpCode.OldNRefactory.Visitors;
13
namespace ICSharpCode.OldNRefactory.Parser.CSharp
15
public sealed class ConditionalCompilation : AbstractAstVisitor
17
static readonly object SymbolDefined = new object();
18
Dictionary<string, object> symbols = new Dictionary<string, object>();
20
public IDictionary<string, object> Symbols {
21
get { return symbols; }
24
public void Define(string symbol)
26
symbols[symbol] = SymbolDefined;
29
public void Undefine(string symbol)
31
symbols.Remove(symbol);
34
public bool Evaluate(Expression condition)
36
return condition.AcceptVisitor(this, null) == SymbolDefined;
39
public override object VisitPrimitiveExpression(PrimitiveExpression primitiveExpression, object data)
41
if (primitiveExpression.Value is bool)
42
return (bool)primitiveExpression.Value ? SymbolDefined : null;
47
public override object VisitIdentifierExpression(IdentifierExpression identifierExpression, object data)
49
return symbols.ContainsKey(identifierExpression.Identifier) ? SymbolDefined : null;
52
public override object VisitUnaryOperatorExpression(UnaryOperatorExpression unaryOperatorExpression, object data)
54
if (unaryOperatorExpression.Op == UnaryOperatorType.Not) {
55
return unaryOperatorExpression.Expression.AcceptVisitor(this, data) == SymbolDefined ? null : SymbolDefined;
61
public override object VisitBinaryOperatorExpression(BinaryOperatorExpression binaryOperatorExpression, object data)
63
bool lhs = binaryOperatorExpression.Left.AcceptVisitor(this, data) == SymbolDefined;
64
bool rhs = binaryOperatorExpression.Right.AcceptVisitor(this, data) == SymbolDefined;
66
switch (binaryOperatorExpression.Op) {
67
case BinaryOperatorType.LogicalAnd:
70
case BinaryOperatorType.LogicalOr:
73
case BinaryOperatorType.Equality:
76
case BinaryOperatorType.InEquality:
82
return result ? SymbolDefined : null;
85
public override object VisitParenthesizedExpression(ParenthesizedExpression parenthesizedExpression, object data)
87
return parenthesizedExpression.Expression.AcceptVisitor(this, data);