mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
6.5 KiB
226 lines
6.5 KiB
// |
|
// CSharpModifierToken.cs |
|
// |
|
// Author: |
|
// Mike Krüger <mkrueger@novell.com> |
|
// |
|
// Copyright (c) 2010 Novell, Inc (http://www.novell.com) |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining a copy |
|
// of this software and associated documentation files (the "Software"), to deal |
|
// in the Software without restriction, including without limitation the rights |
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
// copies of the Software, and to permit persons to whom the Software is |
|
// furnished to do so, subject to the following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be included in |
|
// all copies or substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|
// THE SOFTWARE. |
|
|
|
using System; |
|
using System.Collections.Immutable; |
|
|
|
using ICSharpCode.Decompiler.CSharp.OutputVisitor; |
|
|
|
namespace ICSharpCode.Decompiler.CSharp.Syntax |
|
{ |
|
public class CSharpModifierToken : CSharpTokenNode |
|
{ |
|
Modifiers modifier; |
|
|
|
public Modifiers Modifier { |
|
get { return modifier; } |
|
set { |
|
ThrowIfFrozen(); |
|
this.modifier = value; |
|
} |
|
} |
|
|
|
public override TextLocation EndLocation { |
|
get { |
|
return new TextLocation(StartLocation.Line, StartLocation.Column + GetModifierLength(Modifier)); |
|
} |
|
} |
|
|
|
public override string ToString(CSharpFormattingOptions formattingOptions) |
|
{ |
|
return GetModifierName(Modifier); |
|
} |
|
|
|
protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) |
|
{ |
|
CSharpModifierToken o = other as CSharpModifierToken; |
|
return o != null && this.modifier == o.modifier; |
|
} |
|
|
|
// Not worth using a dictionary for such few elements. |
|
// This table is sorted in the order that modifiers should be output when generating code. |
|
public static ImmutableArray<Modifiers> AllModifiers { get; } = ImmutableArray.Create( |
|
Modifiers.Public, Modifiers.Private, Modifiers.Protected, Modifiers.Internal, |
|
Modifiers.New, |
|
Modifiers.Unsafe, |
|
Modifiers.Abstract, Modifiers.Virtual, Modifiers.Sealed, Modifiers.Static, Modifiers.Override, |
|
Modifiers.Readonly, Modifiers.Volatile, |
|
Modifiers.Ref, |
|
Modifiers.Extern, Modifiers.Partial, Modifiers.Const, |
|
Modifiers.Async, |
|
Modifiers.Any |
|
); |
|
|
|
public CSharpModifierToken(TextLocation location, Modifiers modifier) : base(location, null) |
|
{ |
|
this.Modifier = modifier; |
|
} |
|
|
|
public static string GetModifierName(Modifiers modifier) |
|
{ |
|
switch (modifier) |
|
{ |
|
case Modifiers.Private: |
|
return "private"; |
|
case Modifiers.Internal: |
|
return "internal"; |
|
case Modifiers.Protected: |
|
return "protected"; |
|
case Modifiers.Public: |
|
return "public"; |
|
case Modifiers.Abstract: |
|
return "abstract"; |
|
case Modifiers.Virtual: |
|
return "virtual"; |
|
case Modifiers.Sealed: |
|
return "sealed"; |
|
case Modifiers.Static: |
|
return "static"; |
|
case Modifiers.Override: |
|
return "override"; |
|
case Modifiers.Readonly: |
|
return "readonly"; |
|
case Modifiers.Const: |
|
return "const"; |
|
case Modifiers.New: |
|
return "new"; |
|
case Modifiers.Partial: |
|
return "partial"; |
|
case Modifiers.Extern: |
|
return "extern"; |
|
case Modifiers.Volatile: |
|
return "volatile"; |
|
case Modifiers.Unsafe: |
|
return "unsafe"; |
|
case Modifiers.Async: |
|
return "async"; |
|
case Modifiers.Ref: |
|
return "ref"; |
|
case Modifiers.Any: |
|
// even though it's used for pattern matching only, 'any' needs to be in this list to be usable in the AST |
|
return "any"; |
|
default: |
|
throw new NotSupportedException("Invalid value for Modifiers"); |
|
} |
|
} |
|
|
|
public static int GetModifierLength(Modifiers modifier) |
|
{ |
|
switch (modifier) |
|
{ |
|
case Modifiers.Private: |
|
return "private".Length; |
|
case Modifiers.Internal: |
|
return "internal".Length; |
|
case Modifiers.Protected: |
|
return "protected".Length; |
|
case Modifiers.Public: |
|
return "public".Length; |
|
case Modifiers.Abstract: |
|
return "abstract".Length; |
|
case Modifiers.Virtual: |
|
return "virtual".Length; |
|
case Modifiers.Sealed: |
|
return "sealed".Length; |
|
case Modifiers.Static: |
|
return "static".Length; |
|
case Modifiers.Override: |
|
return "override".Length; |
|
case Modifiers.Readonly: |
|
return "readonly".Length; |
|
case Modifiers.Const: |
|
return "const".Length; |
|
case Modifiers.New: |
|
return "new".Length; |
|
case Modifiers.Partial: |
|
return "partial".Length; |
|
case Modifiers.Extern: |
|
return "extern".Length; |
|
case Modifiers.Volatile: |
|
return "volatile".Length; |
|
case Modifiers.Unsafe: |
|
return "unsafe".Length; |
|
case Modifiers.Async: |
|
return "async".Length; |
|
case Modifiers.Ref: |
|
return "ref".Length; |
|
case Modifiers.Any: |
|
// even though it's used for pattern matching only, 'any' needs to be in this list to be usable in the AST |
|
return "any".Length; |
|
default: |
|
throw new NotSupportedException("Invalid value for Modifiers"); |
|
} |
|
} |
|
|
|
public static Modifiers GetModifierValue(string modifier) |
|
{ |
|
switch (modifier) |
|
{ |
|
case "private": |
|
return Modifiers.Private; |
|
case "internal": |
|
return Modifiers.Internal; |
|
case "protected": |
|
return Modifiers.Protected; |
|
case "public": |
|
return Modifiers.Public; |
|
case "abstract": |
|
return Modifiers.Abstract; |
|
case "virtual": |
|
return Modifiers.Virtual; |
|
case "sealed": |
|
return Modifiers.Sealed; |
|
case "static": |
|
return Modifiers.Static; |
|
case "override": |
|
return Modifiers.Override; |
|
case "readonly": |
|
return Modifiers.Readonly; |
|
case "const": |
|
return Modifiers.Const; |
|
case "new": |
|
return Modifiers.New; |
|
case "partial": |
|
return Modifiers.Partial; |
|
case "extern": |
|
return Modifiers.Extern; |
|
case "volatile": |
|
return Modifiers.Volatile; |
|
case "unsafe": |
|
return Modifiers.Unsafe; |
|
case "async": |
|
return Modifiers.Async; |
|
case "ref": |
|
return Modifiers.Ref; |
|
case "any": |
|
// even though it's used for pattern matching only, 'any' needs to be in this list to be usable in the AST |
|
return Modifiers.Any; |
|
default: |
|
throw new NotSupportedException("Invalid value for Modifiers"); |
|
} |
|
} |
|
} |
|
} |