2
// RefactoringContext.cs
5
// Mike Krüger <mkrueger@novell.com>
7
// Copyright (c) 2011 Mike Krüger <mkrueger@novell.com>
9
// Permission is hereby granted, free of charge, to any person obtaining a copy
10
// of this software and associated documentation files (the "Software"), to deal
11
// in the Software without restriction, including without limitation the rights
12
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
// copies of the Software, and to permit persons to whom the Software is
14
// furnished to do so, subject to the following conditions:
16
// The above copyright notice and this permission notice shall be included in
17
// all copies or substantial portions of the Software.
19
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29
using System.Threading;
30
using ICSharpCode.NRefactory.CSharp.Resolver;
31
using ICSharpCode.NRefactory.CSharp.TypeSystem;
32
using ICSharpCode.NRefactory.Semantics;
33
using ICSharpCode.NRefactory.TypeSystem;
34
using ICSharpCode.NRefactory.TypeSystem.Implementation;
35
using ICSharpCode.NRefactory.Editor;
36
using System.Collections.Generic;
38
namespace ICSharpCode.NRefactory.CSharp.Refactoring
40
public abstract class RefactoringContext : BaseRefactoringContext
42
public RefactoringContext(CSharpAstResolver resolver, CancellationToken cancellationToken) : base (resolver, cancellationToken)
46
public abstract TextLocation Location { get; }
48
public TypeSystemAstBuilder CreateTypeSytemAstBuilder()
50
var csResolver = Resolver.GetResolverStateBefore(GetNode());
51
return new TypeSystemAstBuilder(csResolver);
54
public virtual AstType CreateShortType (IType fullType)
56
var builder = CreateTypeSytemAstBuilder();
57
return builder.ConvertType(fullType);
60
public virtual AstType CreateShortType(string ns, string name, int typeParameterCount = 0)
62
var builder = CreateTypeSytemAstBuilder();
63
return builder.ConvertType(new TopLevelTypeName(ns, name, typeParameterCount));
66
public virtual IEnumerable<AstNode> GetSelectedNodes()
68
if (!IsSomethingSelected) {
69
return Enumerable.Empty<AstNode> ();
72
return RootNode.GetNodesBetween(SelectionStart, SelectionEnd);
75
public AstNode GetNode ()
77
return RootNode.GetNodeAt (Location);
80
public AstNode GetNode (Predicate<AstNode> pred)
82
return RootNode.GetNodeAt (Location, pred);
85
public T GetNode<T> () where T : AstNode
87
return RootNode.GetNodeAt<T> (Location);
91
public virtual TextEditorOptions TextEditorOptions {
93
return TextEditorOptions.Default;
97
public virtual bool IsSomethingSelected {
99
return SelectionStart != TextLocation.Empty;
103
public virtual string SelectedText {
104
get { return string.Empty; }
107
public virtual TextLocation SelectionStart {
109
return TextLocation.Empty;
113
public virtual TextLocation SelectionEnd {
115
return TextLocation.Empty;
119
public abstract int GetOffset (TextLocation location);
121
public abstract IDocumentLine GetLineByOffset (int offset);
123
public int GetOffset (int line, int col)
125
return GetOffset (new TextLocation (line, col));
128
public abstract TextLocation GetLocation (int offset);
130
public abstract string GetText (int offset, int length);
132
public abstract string GetText (ISegment segment);
136
public virtual string GetNameProposal (string name, bool camelCase = true)
138
string baseName = (camelCase ? char.ToLower (name [0]) : char.ToUpper (name [0])) + name.Substring (1);
140
var type = GetNode<TypeDeclaration> ();
147
proposedName = AppendNumberToName (baseName, number++);
148
} while (type.Members.Select (m => m.GetChildByRole (Roles.Identifier)).Any (n => n.Name == proposedName));
152
static string AppendNumberToName (string baseName, int number)
154
return baseName + (number > 0 ? (number + 1).ToString () : "");