1
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
5
using System.Collections.Generic;
6
using ICSharpCode.NRefactory.Ast;
8
namespace ICSharpCode.NRefactory
11
/// Stores the operator precedences for the output visitor.
13
static class OperatorPrecedence
15
static readonly Dictionary<BinaryOperatorType, int> vbDict = MakePrecedenceTable(
16
new BinaryOperatorType[] { BinaryOperatorType.Power },
17
new BinaryOperatorType[] { BinaryOperatorType.Multiply, BinaryOperatorType.Divide },
18
new BinaryOperatorType[] { BinaryOperatorType.DivideInteger },
19
new BinaryOperatorType[] { BinaryOperatorType.Modulus },
20
new BinaryOperatorType[] { BinaryOperatorType.Add, BinaryOperatorType.Subtract },
21
new BinaryOperatorType[] { BinaryOperatorType.Concat },
22
new BinaryOperatorType[] { BinaryOperatorType.ShiftLeft, BinaryOperatorType.ShiftRight },
23
new BinaryOperatorType[] {
24
BinaryOperatorType.Equality, BinaryOperatorType.InEquality,
25
BinaryOperatorType.LessThan, BinaryOperatorType.LessThanOrEqual,
26
BinaryOperatorType.GreaterThan, BinaryOperatorType.GreaterThanOrEqual,
27
BinaryOperatorType.ReferenceEquality, BinaryOperatorType.ReferenceInequality,
28
BinaryOperatorType.Like
30
new BinaryOperatorType[] { BinaryOperatorType.LogicalAnd, BinaryOperatorType.BitwiseAnd },
31
new BinaryOperatorType[] { BinaryOperatorType.LogicalOr, BinaryOperatorType.BitwiseOr },
32
new BinaryOperatorType[] { BinaryOperatorType.ExclusiveOr }
35
static readonly Dictionary<BinaryOperatorType, int> csharpDict = MakePrecedenceTable(
36
new BinaryOperatorType[] { BinaryOperatorType.Multiply, BinaryOperatorType.Divide, BinaryOperatorType.Modulus },
37
new BinaryOperatorType[] { BinaryOperatorType.Add, BinaryOperatorType.Subtract },
38
new BinaryOperatorType[] { BinaryOperatorType.ShiftLeft, BinaryOperatorType.ShiftRight },
39
new BinaryOperatorType[] {
40
BinaryOperatorType.LessThan, BinaryOperatorType.LessThanOrEqual,
41
BinaryOperatorType.GreaterThan, BinaryOperatorType.GreaterThanOrEqual,
43
new BinaryOperatorType[] { BinaryOperatorType.Equality, BinaryOperatorType.InEquality },
44
new BinaryOperatorType[] { BinaryOperatorType.BitwiseAnd },
45
new BinaryOperatorType[] { BinaryOperatorType.ExclusiveOr },
46
new BinaryOperatorType[] { BinaryOperatorType.BitwiseOr },
47
new BinaryOperatorType[] { BinaryOperatorType.LogicalAnd, BinaryOperatorType.LogicalOr },
48
new BinaryOperatorType[] { BinaryOperatorType.NullCoalescing }
51
// create a dictionary operator->precedence (higher value = higher precedence)
52
static Dictionary<BinaryOperatorType, int> MakePrecedenceTable(params BinaryOperatorType[][] input)
54
Dictionary<BinaryOperatorType, int> dict = new Dictionary<BinaryOperatorType, int>();
55
for (int i = 0; i < input.Length; i++) {
56
foreach (BinaryOperatorType op in input[i]) {
57
dict.Add(op, input.Length - i);
63
public static int ComparePrecedenceVB(BinaryOperatorType op1, BinaryOperatorType op2)
65
int p1 = GetOperatorPrecedence(vbDict, op1);
66
int p2 = GetOperatorPrecedence(vbDict, op2);
67
return p1.CompareTo(p2);
70
public static int ComparePrecedenceCSharp(BinaryOperatorType op1, BinaryOperatorType op2)
72
int p1 = GetOperatorPrecedence(csharpDict, op1);
73
int p2 = GetOperatorPrecedence(csharpDict, op2);
74
return p1.CompareTo(p2);
77
static int GetOperatorPrecedence(Dictionary<BinaryOperatorType, int> dict, BinaryOperatorType op)
80
dict.TryGetValue(op, out p);