diff --git a/data/resources/StringResources.de.resx b/data/resources/StringResources.de.resx
index 3b08607fda..7b472272c9 100644
--- a/data/resources/StringResources.de.resx
+++ b/data/resources/StringResources.de.resx
@@ -3314,6 +3314,9 @@ Bitte einen anderen Dateinamen wählen.
Spalte
+
+ Inhalt
+
Anzeige-Optionen
diff --git a/data/resources/StringResources.resx b/data/resources/StringResources.resx
index 27036ea06a..75e6f08341 100644
--- a/data/resources/StringResources.resx
+++ b/data/resources/StringResources.resx
@@ -2039,6 +2039,15 @@ Do you want to add the new file to the project ${CurrentProjectName}?
Save
Save *inputbox* items
+
+ Links in tooltips should go to
+
+
+ Definition in code
+
+
+ Documentation (if available)
+
Pre-select recently used members
diff --git a/src/AddIns/Analysis/UnitTesting/Options/UnitTestingOptionsPanel.xaml.cs b/src/AddIns/Analysis/UnitTesting/Options/UnitTestingOptionsPanel.xaml.cs
index 65ad485025..2ad57e1fa9 100644
--- a/src/AddIns/Analysis/UnitTesting/Options/UnitTestingOptionsPanel.xaml.cs
+++ b/src/AddIns/Analysis/UnitTesting/Options/UnitTestingOptionsPanel.xaml.cs
@@ -25,6 +25,7 @@ namespace ICSharpCode.UnitTesting
{
public UnitTestingOptionsPanel()
{
+ InitializeComponent();
}
}
}
diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/TextEditorWithParseInformationFolding.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/TextEditorWithParseInformationFolding.cs
index a3020fed25..1d6c9ac543 100644
--- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/TextEditorWithParseInformationFolding.cs
+++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Folding/TextEditorWithParseInformationFolding.cs
@@ -42,10 +42,19 @@ namespace ICSharpCode.AspNet.Mvc.Folding
{
var textEditorAdapter = textEditor as AvalonEditTextEditorAdapter;
if (textEditorAdapter != null) {
+ RemoveExistingFoldingManager(textEditorAdapter);
foldingManager = FoldingManager.Install(textEditorAdapter.TextEditor.TextArea);
}
}
+ void RemoveExistingFoldingManager(AvalonEditTextEditorAdapter textEditorAdapter)
+ {
+ var existingFoldingManager = textEditorAdapter.TextEditor.TextArea.GetService(typeof(FoldingManager)) as FoldingManager;
+ if (existingFoldingManager != null) {
+ FoldingManager.Uninstall(existingFoldingManager);
+ }
+ }
+
// TODO disable parse information folding?
public bool IsParseInformationFoldingEnabled {
get {
diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs
index 9852a5c8c4..e6b12f2b51 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs
@@ -19,7 +19,10 @@
using System;
using System.Collections.Generic;
+using System.Threading;
+using ICSharpCode.AvalonEdit.Highlighting;
using ICSharpCode.NRefactory;
+using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
using CSharpBinding.Completion;
using CSharpBinding.FormattingStrategy;
@@ -58,12 +61,15 @@ namespace CSharpBinding
IssueManager inspectionManager;
IList contextActionProviders;
CodeManipulation codeManipulation;
+ CSharpSemanticHighlighter highlighter;
+ CancellationTokenSource caretMovementTokenSource;
public void Attach(ITextEditor editor)
{
this.editor = editor;
inspectionManager = new IssueManager(editor);
codeManipulation = new CodeManipulation(editor);
+ this.editor.Caret.LocationChanged += CaretLocationChanged;
if (!editor.ContextActionProviders.IsReadOnly) {
contextActionProviders = AddInTree.BuildItems("/SharpDevelop/ViewContent/TextEditor/C#/ContextActions", null);
@@ -81,7 +87,21 @@ namespace CSharpBinding
if (contextActionProviders != null) {
editor.ContextActionProviders.RemoveAll(contextActionProviders.Contains);
}
+ this.editor.Caret.LocationChanged -= CaretLocationChanged;
this.editor = null;
}
+
+ void CaretLocationChanged(object sender, EventArgs e)
+ {
+ if (highlighter == null)
+ highlighter = editor.GetService();
+ if (highlighter == null)
+ return;
+ if (caretMovementTokenSource != null)
+ caretMovementTokenSource.Cancel();
+ caretMovementTokenSource = new CancellationTokenSource();
+ var rr = SD.ParserService.Resolve(editor.FileName, editor.Caret.Location, editor.Document, cancellationToken: caretMovementTokenSource.Token);
+ highlighter.SetCurrentSymbol(rr.GetSymbol());
+ }
}
}
diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs
index 6fc48951de..7253fc908a 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs
@@ -18,14 +18,19 @@
using System;
using System.Collections.Generic;
+using System.ComponentModel.Design;
using System.Diagnostics;
using System.Linq;
+using System.Windows.Media;
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Highlighting;
using ICSharpCode.Core;
using ICSharpCode.NRefactory;
+using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.CSharp.Analysis;
+using ICSharpCode.NRefactory.CSharp.Resolver;
using ICSharpCode.NRefactory.Editor;
+using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Parser;
@@ -50,6 +55,9 @@ namespace CSharpBinding
int lineNumber;
HighlightedLine line;
CSharpFullParseInformation parseInfo;
+ ISymbolReference currentSymbolReference;
+ IResolveVisitorNavigator currentNavigator;
+ HighlightingColor symbolReferenceColor;
#region Constructor + Dispose
public CSharpSemanticHighlighter(IDocument document)
@@ -66,6 +74,7 @@ namespace CSharpBinding
this.enumerationTypeColor = this.valueKeywordColor;
this.typeParameterTypeColor = this.referenceTypeColor;
this.delegateTypeColor = this.referenceTypeColor;
+ this.symbolReferenceColor = new HighlightingColor { Background = new SimpleHighlightingBrush(DefaultFillColor) };
this.methodDeclarationColor = this.methodCallColor = highlighting.GetNamedColor("MethodCall");
//this.eventDeclarationColor = this.eventAccessColor = defaultTextColor;
@@ -92,6 +101,7 @@ namespace CSharpBinding
SD.ParserService.ParseInformationUpdated += ParserService_ParseInformationUpdated;
SD.ParserService.LoadSolutionProjectsThread.Finished += ParserService_LoadSolutionProjectsThreadEnded;
eventHandlersAreRegistered = true;
+ document.GetService().AddService(typeof(CSharpSemanticHighlighter), this);
}
}
@@ -101,6 +111,7 @@ namespace CSharpBinding
SD.ParserService.ParseInformationUpdated -= ParserService_ParseInformationUpdated;
SD.ParserService.LoadSolutionProjectsThread.Finished -= ParserService_LoadSolutionProjectsThreadEnded;
eventHandlersAreRegistered = false;
+ document.GetService().RemoveService(typeof(CSharpSemanticHighlighter));
}
this.resolver = null;
this.parseInfo = null;
@@ -174,10 +185,7 @@ namespace CSharpBinding
void ParserService_LoadSolutionProjectsThreadEnded(object sender, EventArgs e)
{
- cachedLines.Clear();
- invalidLines.Clear();
- forceParseOnNextRefresh = true;
- OnHighlightingStateChanged(1, document.LineCount);
+ InvalidateAll();
}
void ParserService_ParseInformationUpdated(object sender, ParseInformationEventArgs e)
@@ -389,6 +397,109 @@ namespace CSharpBinding
});
}
}
+
+ protected override void Colorize(AstNode node, HighlightingColor color)
+ {
+ if (currentSymbolReference != null && currentNavigator == null)
+ currentNavigator = InitNavigator();
+
+ if (currentNavigator != null) {
+ var resolverNode = node;
+ while (CSharpAstResolver.IsUnresolvableNode(resolverNode) && resolverNode.Parent != null)
+ resolverNode = resolverNode.Parent;
+ if (resolverNode.Role == Roles.TargetExpression && resolverNode.Parent is InvocationExpression)
+ resolverNode = resolverNode.Parent;
+ if (resolverNode.Role == Roles.Type && resolverNode.Parent is ObjectCreateExpression)
+ resolverNode = resolverNode.Parent;
+
+ if (node is Identifier && !node.IsNull)
+ resolverNode.AddAnnotation(node);
+ if (color != null)
+ resolverNode.AddAnnotation(color);
+ currentNavigator.Resolved(resolverNode, resolver.Resolve(resolverNode));
+ }
+ base.Colorize(node, color);
+ }
+
+ protected override void Colorize(Identifier identifier, ResolveResult rr)
+ {
+ if (currentSymbolReference != null && currentNavigator == null)
+ currentNavigator = InitNavigator();
+
+ if (currentNavigator != null) {
+ currentNavigator.Resolved(identifier, rr);
+ }
+ base.Colorize(identifier, rr);
+ }
+
+ public override void VisitPrimitiveType(PrimitiveType primitiveType)
+ {
+ // highlight usages of primitive types as well.
+ Colorize(primitiveType, null);
+ }
+
+ public readonly Color DefaultFillColor = Color.FromArgb(22, 30, 130, 255);
+
+ public void SetCurrentSymbol(ISymbol symbol)
+ {
+ currentNavigator = null;
+ currentSymbolReference = null;
+ if (symbol != null)
+ currentSymbolReference = symbol.ToReference();
+ InvalidateAll();
+ }
+
+ void InvalidateAll()
+ {
+ cachedLines.Clear();
+ invalidLines.Clear();
+ forceParseOnNextRefresh = true;
+ OnHighlightingStateChanged(1, document.LineCount);
+ }
+
+ FindReferences findReferences = new FindReferences();
+
+ IResolveVisitorNavigator InitNavigator()
+ {
+ if (currentSymbolReference == null) return null;
+ var compilation = resolver.Compilation;
+ var symbol = currentSymbolReference.Resolve(compilation.TypeResolveContext);
+ var searchScopes = findReferences.GetSearchScopes(symbol);
+ if (searchScopes.Count == 0)
+ return null;
+ var navigators = new IResolveVisitorNavigator[searchScopes.Count];
+ for (int i = 0; i < navigators.Length; i++) {
+ navigators[i] = searchScopes[i].GetNavigator(compilation, ColorizeMatch);
+ }
+ IResolveVisitorNavigator combinedNavigator;
+ if (searchScopes.Count == 1) {
+ combinedNavigator = navigators[0];
+ } else {
+ combinedNavigator = new CompositeResolveVisitorNavigator(navigators);
+ }
+
+ return combinedNavigator;
+ }
+
+ void ColorizeMatch(AstNode node, ResolveResult result)
+ {
+ Identifier identifier = node.Annotation() ?? node.GetChildByRole(Roles.Identifier);
+ TextLocation start, end;
+ if (!identifier.IsNull) {
+ start = identifier.StartLocation;
+ end = identifier.EndLocation;
+ } else {
+ start = node.StartLocation;
+ end = node.EndLocation;
+ }
+ var complementary = node.Annotation();
+ HighlightingColor newColor = symbolReferenceColor;
+ if (complementary != null) {
+ newColor = newColor.Clone();
+ newColor.MergeWith(complementary);
+ }
+ Colorize(start, end, newColor);
+ }
#endregion
}
}
diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs
index 7ed309ec62..d309eeabbf 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/FormattingStrategy/CSharpFormattingStrategy.cs
@@ -21,6 +21,7 @@ using System.Diagnostics;
using System.Linq;
using System.Text;
+using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Highlighting;
using ICSharpCode.AvalonEdit.Indentation.CSharp;
using ICSharpCode.Core;
@@ -62,11 +63,10 @@ namespace CSharpBinding.FormattingStrategy
{
engine.Update(line.EndOffset);
if (engine.NeedsReindent) {
- int textOffset = line.Offset;
- while (textOffset < line.EndOffset && char.IsWhiteSpace(document.GetCharAt(textOffset)))
- textOffset++;
- string newText = document.GetText(textOffset, line.Length + line.Offset - textOffset);
- document.Replace(line.Offset, line.Length, engine.ThisLineIndent + newText);
+ var indentation = TextUtilities.GetWhitespaceAfter(document, line.Offset);
+ // replacing the indentation in two steps is necessary to make the caret move accordingly.
+ document.Replace(indentation.Offset, indentation.Length, "");
+ document.Replace(indentation.Offset, 0, engine.ThisLineIndent);
engine.ResetEngineToPosition(line.Offset);
}
}
@@ -194,7 +194,7 @@ namespace CSharpBinding.FormattingStrategy
char ch = textArea.Document.GetCharAt(i);
if (ch == '"') {
// parsing strings correctly is too complicated (see above),
- // but I don't now any case where a doc comment is after a string...
+ // but I don't know any case where a doc comment is after a string...
return false;
}
if (ch == '/' && i + 2 < cursorOffset && textArea.Document.GetCharAt(i + 1) == '/' && textArea.Document.GetCharAt(i + 2) == '/') {
@@ -274,11 +274,11 @@ namespace CSharpBinding.FormattingStrategy
string terminator = DocumentUtilities.GetLineTerminator(textArea.Document, lineNr);
string curLineText;
- //// local string for curLine segment
+ // local string for curLine segment
if (ch == '/') {
curLineText = textArea.Document.GetText(curLine);
string lineAboveText = lineAbove == null ? "" : textArea.Document.GetText(lineAbove);
- if (curLineText != null && curLineText.EndsWith("///") && (lineAboveText == null || !lineAboveText.Trim().StartsWith("///"))) {
+ if (curLineText != null && curLineText.EndsWith("///", StringComparison.Ordinal) && (lineAboveText == null || !lineAboveText.Trim().StartsWith("///", StringComparison.Ordinal))) {
string indentation = DocumentUtilities.GetWhitespaceAfter(textArea.Document, curLine.Offset);
IUnresolvedEntity member = GetMemberAfter(textArea, lineNr);
if (member != null) {
@@ -341,10 +341,10 @@ namespace CSharpBinding.FormattingStrategy
commentBuilder.Append(curLineText[ i]);
}
string tag = commentBuilder.ToString().Trim();
- if (!tag.EndsWith(">")) {
+ if (!tag.EndsWith(">", StringComparison.Ordinal)) {
tag += ">";
}
- if (!tag.StartsWith("/")) {
+ if (!tag.StartsWith("/", StringComparison.Ordinal)) {
textArea.Document.Insert(cursorOffset, "" + tag.Substring(1), AnchorMovementType.BeforeInsertion);
}
}
@@ -361,10 +361,10 @@ namespace CSharpBinding.FormattingStrategy
break;
case '\n':
string lineAboveText = lineAbove == null ? "" : textArea.Document.GetText(lineAbove);
- //// curLine might have some text which should be added to indentation
+ // curLine might have some text which should be added to indentation
curLineText = textArea.Document.GetText(curLine);
- if (lineAboveText != null && lineAboveText.Trim().StartsWith("#region")
+ if (lineAboveText != null && lineAboveText.Trim().StartsWith("#region", StringComparison.Ordinal)
&& NeedEndregion(textArea.Document))
{
textArea.Document.Insert(cursorOffset, "#endregion");
@@ -398,8 +398,8 @@ namespace CSharpBinding.FormattingStrategy
IDocumentLine nextLine = lineNr + 1 <= textArea.Document.LineCount ? textArea.Document.GetLineByNumber(lineNr + 1) : null;
string nextLineText = (nextLine != null) ? textArea.Document.GetText(nextLine) : "";
- int indexAbove = lineAboveText.IndexOf("///");
- int indexNext = nextLineText.IndexOf("///");
+ int indexAbove = lineAboveText.IndexOf("///", StringComparison.Ordinal);
+ int indexNext = nextLineText.IndexOf("///", StringComparison.Ordinal);
if (indexAbove > 0 && (indexNext != -1 || indexAbove + 4 < lineAbove.Length)) {
textArea.Document.Insert(cursorOffset, "/// ");
return;
@@ -413,7 +413,7 @@ namespace CSharpBinding.FormattingStrategy
}
if (textArea.Options.AutoInsertBlockEnd && lineAbove != null && isInNormalCode) {
string oldLineText = textArea.Document.GetText(lineAbove);
- if (oldLineText.EndsWith("{")) {
+ if (oldLineText.EndsWith("{", StringComparison.Ordinal)) {
if (NeedCurlyBracket(textArea.Document.Text)) {
int insertionPoint = curLine.Offset + curLine.Length;
textArea.Document.Insert(insertionPoint, terminator + "}");
diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeActionProviderDoozer.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeActionProviderDoozer.cs
index 20c4232c8b..a8cea2c3f5 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeActionProviderDoozer.cs
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/CSharpCodeActionProviderDoozer.cs
@@ -115,6 +115,8 @@ namespace CSharpBinding.Refactoring
CSharpAstResolver resolver = await context.GetAstResolverAsync().ConfigureAwait(false);
var refactoringContext = new SDRefactoringContext(context.TextSource, resolver, context.CaretLocation, selectionStart, selectionLength, cancellationToken);
return codeActionProvider.GetActions(refactoringContext).Select(Wrap).ToArray();
+ } catch (OperationCanceledException) {
+ throw; // don't catch cancellations
} catch (Exception ex) {
SD.Log.WarnFormatted("CSharpContextActionProviderWrapper crashed: {0}", ex);
SD.AnalyticsMonitor.TrackException(ex);
diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueManager.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueManager.cs
index ffd831b60a..37d549b7d4 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueManager.cs
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueManager.cs
@@ -343,10 +343,71 @@ namespace CSharpBinding.Refactoring
var markers = markerService.GetMarkersAtOffset(context.CaretOffset);
foreach (var tag in markers.Select(m => m.Tag).OfType()) {
result.AddRange(tag.Actions);
+ string issueName;
+ if (CanSuppress(tag, out issueName)) {
+ result.Add(new SuppressIssueContextAction(issueName, SuppressType.Once));
+ result.Add(new SuppressIssueContextAction(issueName, SuppressType.Always));
+ }
}
}
return Task.FromResult(result.ToArray());
}
+
+ bool CanSuppress(InspectionTag tag, out string issueName)
+ {
+ var attr = (IssueDescriptionAttribute)tag.Provider.ProviderType.GetCustomAttributes(false).FirstOrDefault(a => a is IssueDescriptionAttribute);
+ issueName = null;
+ if (attr == null || attr.AnalysisDisableKeyword == null)
+ return false;
+ issueName = attr.AnalysisDisableKeyword;
+ return true;
+ }
+
+ enum SuppressType {
+ Once,
+ Always
+ }
+
+ [ContextAction("Suppress issue", Description = "Suppresses an issue.")]
+ class SuppressIssueContextAction : ContextAction
+ {
+ string issueName;
+ SuppressType type;
+
+ public SuppressIssueContextAction(string issueName, SuppressType type)
+ {
+ this.issueName = issueName;
+ this.type = type;
+ }
+
+ public override Task IsAvailableAsync(EditorRefactoringContext context, CancellationToken cancellationToken)
+ {
+ return Task.FromResult(true);
+ }
+
+ public override string DisplayName
+ {
+ get {
+ string fmt;
+ if (type == SuppressType.Once)
+ fmt = "Suppress '{0}' once";
+ else
+ fmt = "Suppress '{0}'";
+ return string.Format(fmt, issueName);
+ }
+ }
+
+ public override void Execute(EditorRefactoringContext context)
+ {
+ var myContext = SDRefactoringContext.Create(context.Editor, default(CancellationToken));
+ var currentNode = myContext.RootNode.GetNodeAt(context.CaretLocation);
+ if (currentNode == null)
+ return;
+ using (var script = myContext.StartScript()) {
+ script.InsertBefore(currentNode, new Comment(string.Format(" disable{1}{0}", issueName, type == SuppressType.Once ? " once " : " ")));
+ }
+ }
+ }
#endregion
}
}
diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/MoveTypeToFileContextAction.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/MoveTypeToFileContextAction.cs
index a0c703779f..e266661d25 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/MoveTypeToFileContextAction.cs
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/MoveTypeToFileContextAction.cs
@@ -47,7 +47,7 @@ namespace CSharpBinding.Refactoring
SyntaxTree st = await context.GetSyntaxTreeAsync().ConfigureAwait(false);
Identifier identifier = (Identifier)st.GetNodeAt(context.CaretLocation, node => node.Role == Roles.Identifier);
if (identifier == null) return false;
- if (MakeValidFileName(identifier.Name).Equals(Path.GetFileNameWithoutExtension(context.FileName), StringComparison.OrdinalIgnoreCase))
+ if (MakeValidFileName(identifier.Name).Equals(Path.GetFileName(context.FileName), StringComparison.OrdinalIgnoreCase))
return false;
if (identifier.Parent.Parent is TypeDeclaration)
return false;
diff --git a/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/OpenTextEditors.cs b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/OpenTextEditors.cs
index d2af441a04..534434b1f7 100644
--- a/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/OpenTextEditors.cs
+++ b/src/AddIns/BackendBindings/WixBinding/Project/Src/Gui/OpenTextEditors.cs
@@ -37,8 +37,10 @@ namespace ICSharpCode.WixBinding
{
foreach (IViewContent view in workbench.ViewContentCollection) {
ITextEditor textEditor = view.GetService();
- if (AreFileNamesEqual(view.PrimaryFileName, document.FileName)) {
- return textEditor;
+ if (textEditor != null) {
+ if (AreFileNamesEqual(view.PrimaryFileName, document.FileName)) {
+ return textEditor;
+ }
}
}
return null;
diff --git a/src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/OpenTextEditorsTestFixture.cs b/src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/OpenTextEditorsTestFixture.cs
index 741c831d10..16703169fd 100644
--- a/src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/OpenTextEditorsTestFixture.cs
+++ b/src/AddIns/BackendBindings/WixBinding/Test/PackageFiles/OpenTextEditorsTestFixture.cs
@@ -18,6 +18,7 @@
using System;
using ICSharpCode.SharpDevelop;
+using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.WixBinding;
using NUnit.Framework;
using WixBinding.Tests.Utils;
@@ -37,7 +38,7 @@ namespace WixBinding.Tests.PackageFiles
{
SD.InitializeForUnitTests();
existingTextEditor = new MockTextEditor();
- MockTextEditorViewContent viewContent = new MockTextEditorViewContent();
+ var viewContent = new MockTextEditorViewContent();
viewContent.TextEditor = existingTextEditor;
viewContent.SetFileName(@"d:\projects\test\file.wxs");
@@ -64,5 +65,19 @@ namespace WixBinding.Tests.PackageFiles
unknownDocument.FileName = @"d:\unknown-file.wxs";
Assert.IsNull(openEditors.FindTextEditorForDocument(unknownDocument));
}
+
+ [Test]
+ public void FindTextEditorForDocument_FirstViewContentHasNoTextEditorAndNoPrimaryFileName_DoesNotThrowNullReferenceException()
+ {
+ var viewContent = new MockViewContent();
+ viewContent.PrimaryFile = null;
+ workbench.ViewContentCollection.Add(viewContent);
+ var unknownDocument = new WixDocument();
+ unknownDocument.FileName = @"d:\unknown-file.wxs";
+
+ ITextEditor textEditor = openEditors.FindTextEditorForDocument(unknownDocument);
+
+ Assert.IsNull(textEditor);
+ }
}
}
diff --git a/src/AddIns/BackendBindings/WixBinding/Test/Utils/MockViewContent.cs b/src/AddIns/BackendBindings/WixBinding/Test/Utils/MockViewContent.cs
index bbdfae79a4..5e48733a16 100644
--- a/src/AddIns/BackendBindings/WixBinding/Test/Utils/MockViewContent.cs
+++ b/src/AddIns/BackendBindings/WixBinding/Test/Utils/MockViewContent.cs
@@ -65,6 +65,7 @@ namespace WixBinding.Tests.Utils
public OpenedFile PrimaryFile {
get { return primaryFile; }
+ set { primaryFile = value; }
}
public FileName PrimaryFileName {
diff --git a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlAstResolver.cs b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlAstResolver.cs
index 6769a6b3b9..cab806e0b9 100644
--- a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlAstResolver.cs
+++ b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlAstResolver.cs
@@ -49,6 +49,13 @@ namespace ICSharpCode.XamlBinding
public ResolveResult ResolveAtLocation(TextLocation location, CancellationToken cancellationToken = default(CancellationToken))
{
int offset = textDocument.GetOffset(location);
+ var line = textDocument.GetLineByNumber(location.Line);
+
+ if (offset == line.EndOffset)
+ return ErrorResolveResult.UnknownError;
+ if (char.IsWhiteSpace(textDocument.GetCharAt(offset)))
+ return ErrorResolveResult.UnknownError;
+
AXmlObject innermost = parseInfo.Document.GetChildAtOffset(offset);
if (innermost is AXmlText)
return ResolveText((AXmlText)innermost, cancellationToken);
diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/AutoCompleteTextBox.cs b/src/AddIns/Debugger/Debugger.AddIn/Pads/AutoCompleteTextBox.cs
index 1510a5efc7..45c0e7c8ed 100644
--- a/src/AddIns/Debugger/Debugger.AddIn/Pads/AutoCompleteTextBox.cs
+++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/AutoCompleteTextBox.cs
@@ -86,6 +86,7 @@ namespace Debugger.AddIn.Pads.Controls
this.editor.ClearValue(TextEditor.FontFamilyProperty);
this.editor.ClearValue(TextEditor.FontSizeProperty);
this.editor.ShowLineNumbers = false;
+ this.editor.Options.HighlightCurrentLine = false;
this.editor.WordWrap = false;
this.editor.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden;
this.editor.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden;
diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/CallStackPad.cs b/src/AddIns/Debugger/Debugger.AddIn/Pads/CallStackPad.cs
index 5336d1932c..b072de3362 100644
--- a/src/AddIns/Debugger/Debugger.AddIn/Pads/CallStackPad.cs
+++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/CallStackPad.cs
@@ -115,7 +115,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
void listView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
CallStackItem item = listView.SelectedItem as CallStackItem;
- if (item == null)
+ if ((item == null) || (item.Frame == null))
return;
if (item.Frame.Process.IsPaused) {
diff --git a/src/AddIns/Debugger/Debugger.AddIn/Pads/WatchPad.cs b/src/AddIns/Debugger/Debugger.AddIn/Pads/WatchPad.cs
index e03e7b60b4..4fce689fa6 100644
--- a/src/AddIns/Debugger/Debugger.AddIn/Pads/WatchPad.cs
+++ b/src/AddIns/Debugger/Debugger.AddIn/Pads/WatchPad.cs
@@ -166,6 +166,11 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
pad.AddWatch(watchValue);
}
+
+ public override DragDropEffects GetDropEffect(DragEventArgs e, int index)
+ {
+ return DragDropEffects.Copy;
+ }
}
static class WpfExtensions
diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj
index d6419f6fe7..4fa4a0c07e 100644
--- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj
+++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj
@@ -134,7 +134,6 @@
-
ChooseEncodingDialog.xaml
Code
@@ -143,7 +142,6 @@
-
diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CaretReferencesRenderer.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CaretReferencesRenderer.cs
deleted file mode 100644
index 2ec340204c..0000000000
--- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CaretReferencesRenderer.cs
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
-//
-// 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.Generic;
-using System.Threading;
-using System.Windows.Threading;
-
-using ICSharpCode.AvalonEdit.AddIn.Options;
-using ICSharpCode.Core;
-using ICSharpCode.SharpDevelop;
-using ICSharpCode.SharpDevelop.Editor;
-using ICSharpCode.SharpDevelop.Gui;
-using ICSharpCode.SharpDevelop.Refactoring;
-
-namespace ICSharpCode.AvalonEdit.AddIn
-{
- /* ///
- /// In the code editor, highlights all references to the expression under the caret (for better code readability).
- ///
- public class CaretReferencesRenderer
- {
- ///
- /// Delays the Resolve check so that it does not get called too often when user holds an arrow.
- ///
- DispatcherTimer delayMoveTimer;
- const int delayMoveMs = 100;
-
- ///
- /// Delays the Find references (and highlight) after the caret stays at one point for a while.
- ///
- DispatcherTimer delayTimer;
- const int delayMs = 800;
-
- ///
- /// Maximum time for Find references. After this time it gets cancelled and no highlight is displayed.
- /// Useful for very large files.
- ///
- const int findReferencesTimeoutMs = 200;
-
- CodeEditorView editorView;
- ITextEditor Editor { get { return editorView.Adapter; } }
-
- ExpressionHighlightRenderer highlightRenderer;
- ResolveResult lastResolveResult;
-
- public bool IsEnabled
- {
- get {
- string fileName = this.Editor.FileName;
- return CodeEditorOptions.Instance.HighlightSymbol && (fileName.EndsWith(".cs") || fileName.EndsWith(".vb"));
- }
- }
-
- ///
- /// In the code editor, highlights all references to the expression under the caret (for better code readability).
- ///
- public CaretReferencesRenderer(CodeEditorView editorView)
- {
- this.editorView = editorView;
- this.highlightRenderer = new ExpressionHighlightRenderer(this.editorView.TextArea.TextView);
- this.delayTimer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(delayMs) };
- this.delayTimer.Stop();
- this.delayTimer.Tick += TimerTick;
- this.delayMoveTimer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(delayMoveMs) };
- this.delayMoveTimer.Stop();
- this.delayMoveTimer.Tick += TimerMoveTick;
- this.editorView.TextArea.Caret.PositionChanged += CaretPositionChanged;
- // fixes SD-1873 - Unhandled WPF Exception when deleting text in text editor
- // clear highlights to avoid exceptions when trying to draw highlights in
- // locations that have been deleted already.
- this.editorView.Document.Changed += delegate { lastResolveResult = null; ClearHighlight(); };
- }
-
- public void ClearHighlight()
- {
- this.highlightRenderer.ClearHighlight();
- }
-
- ///
- /// In the current document, highlights all references to the expression
- /// which is currently under the caret (local variable, class, property).
- /// This gets called on every caret position change, so quite often.
- ///
- void CaretPositionChanged(object sender, EventArgs e)
- {
- Restart(this.delayMoveTimer);
- }
-
- void TimerTick(object sender, EventArgs e)
- {
- this.delayTimer.Stop();
-
- if (!IsEnabled)
- return;
- var referencesToBeHighlighted = FindReferencesInCurrentFile(this.lastResolveResult);
- this.highlightRenderer.SetHighlight(referencesToBeHighlighted);
- }
-
- void TimerMoveTick(object sender, EventArgs e)
- {
- this.delayMoveTimer.Stop();
- this.delayTimer.Stop();
-
- if (!IsEnabled)
- return;
-
- var resolveResult = GetExpressionAtCaret();
- if (resolveResult == null) {
- this.lastResolveResult = null;
- this.highlightRenderer.ClearHighlight();
- return;
- }
- // caret is over symbol and that symbol is different from the last time
- if (!SameResolveResult(resolveResult, lastResolveResult))
- {
- this.lastResolveResult = resolveResult;
- this.highlightRenderer.ClearHighlight();
- this.delayTimer.Start();
- } else {
- // highlight stays the same, both timers are stopped (will start again when caret moves)
- }
- }
-
- ///
- /// Resolves the current expression under caret.
- /// This gets called on every caret position change, so quite often.
- ///
- ResolveResult GetExpressionAtCaret()
- {
- if (string.IsNullOrEmpty(Editor.FileName) || ParserService.LoadSolutionProjectsThreadRunning)
- return null;
- int line = Editor.Caret.Position.Line;
- int column = Editor.Caret.Position.Column;
- return ParserService.Resolve(line, column, Editor.Document, Editor.FileName);
- }
-
- ///
- /// Finds references to resolved expression in the current file.
- ///
- List FindReferencesInCurrentFile(ResolveResult resolveResult)
- {
- if (resolveResult == null)
- return null;
- var cancellationTokenSource = new CancellationTokenSource();
- using (new Timer(
- delegate {
- LoggingService.Debug("Aborting FindReferencesInCurrentFile due to timeout");
- cancellationTokenSource.Cancel();
- }, null, findReferencesTimeoutMs, Timeout.Infinite))
- {
- var progressMonitor = new DummyProgressMonitor();
- progressMonitor.CancellationToken = cancellationTokenSource.Token;
- var references = RefactoringService.FindReferencesLocal(resolveResult, Editor.FileName, progressMonitor);
- if (references == null || references.Count == 0)
- return null;
- return references;
- }
- }
-
- ///
- /// Returns true if the 2 ResolveResults refer to the same symbol.
- /// So that when caret moves but stays inside the same symbol, symbol stays highlighted.
- ///
- bool SameResolveResult(ResolveResult resolveResult, ResolveResult resolveResult2)
- {
- //if (resolveResult == null && resolveResult2 == null)
- // return true;
- //if (resolveResult == null && resolveResult2 != null)
- // return false;
- //if (resolveResult != null && resolveResult2 == null)
- // return false;
- // TODO determine if 2 ResolveResults refer to the same symbol
- return false;
- }
-
- ///
- /// Restarts a timer.
- ///
- void Restart(DispatcherTimer timer)
- {
- timer.Stop();
- timer.Start();
- }
- }
- */
-}
diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ExpressionHighlightRenderer.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ExpressionHighlightRenderer.cs
deleted file mode 100644
index 4b511c9149..0000000000
--- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ExpressionHighlightRenderer.cs
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
-//
-// 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.Diagnostics;
-using System.Windows.Media;
-using System.Collections.Generic;
-
-using ICSharpCode.AvalonEdit.Document;
-using ICSharpCode.AvalonEdit.Rendering;
-using ICSharpCode.SharpDevelop.Editor;
-using ICSharpCode.SharpDevelop.Refactoring;
-
-namespace ICSharpCode.AvalonEdit.AddIn
-{
- /*
- ///
- /// Highlights expressions (references to expression under current caret).
- ///
- public class ExpressionHighlightRenderer : IBackgroundRenderer
- {
- List renderedReferences;
- Pen borderPen;
- Brush backgroundBrush;
- TextView textView;
- public readonly Color DefaultBorderColor = Color.FromArgb(52, 30, 130, 255); //Color.FromArgb(180, 70, 230, 70))
- public readonly Color DefaultFillColor = Color.FromArgb(22, 30, 130, 255); //Color.FromArgb(40, 60, 255, 60)
- readonly int borderThickness = 1;
- readonly int cornerRadius = 1;
-
- public void SetHighlight(List renderedReferences)
- {
- if (this.renderedReferences != renderedReferences) {
- this.renderedReferences = renderedReferences;
- textView.InvalidateLayer(this.Layer);
- }
- }
-
- public void ClearHighlight()
- {
- this.SetHighlight(null);
- }
-
- public ExpressionHighlightRenderer(TextView textView)
- {
- if (textView == null)
- throw new ArgumentNullException("textView");
- this.textView = textView;
- this.borderPen = new Pen(new SolidColorBrush(DefaultBorderColor), borderThickness);
- this.backgroundBrush = new SolidColorBrush(DefaultFillColor);
- this.borderPen.Freeze();
- this.backgroundBrush.Freeze();
- this.textView.BackgroundRenderers.Add(this);
- }
-
- public KnownLayer Layer {
- get {
- return KnownLayer.Selection;
- }
- }
-
- public void Draw(TextView textView, DrawingContext drawingContext)
- {
- if (this.renderedReferences == null)
- return;
- BackgroundGeometryBuilder builder = new BackgroundGeometryBuilder();
- builder.CornerRadius = cornerRadius;
- builder.AlignToMiddleOfPixels = true;
- foreach (var reference in this.renderedReferences) {
- builder.AddSegment(textView, new TextSegment() {
- StartOffset = reference.Offset,
- Length = reference.Length });
- builder.CloseFigure();
- }
- Geometry geometry = builder.CreateGeometry();
- if (geometry != null) {
- drawingContext.DrawGeometry(backgroundBrush, borderPen, geometry);
- }
- }
- }
- */
-}
diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/HighlightingOptions.xaml.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/HighlightingOptions.xaml.cs
index a82114c265..0f8c653f59 100644
--- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/HighlightingOptions.xaml.cs
+++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Options/HighlightingOptions.xaml.cs
@@ -596,6 +596,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Options
}
textEditor.Select(0, 0);
bracketHighlighter.SetHighlight(null);
+ textEditor.Options.HighlightCurrentLine = false;
item.ShowExample(textEditor.TextArea);
ITextMarker m = textMarkerService.TextMarkers.SingleOrDefault();
if (m != null && m.Tag != null) {
diff --git a/src/AddIns/Misc/AddInManager2/Project/Src/View/AddInsView.xaml b/src/AddIns/Misc/AddInManager2/Project/Src/View/AddInsView.xaml
index d371d3cb2a..d2ca3cade3 100644
--- a/src/AddIns/Misc/AddInManager2/Project/Src/View/AddInsView.xaml
+++ b/src/AddIns/Misc/AddInManager2/Project/Src/View/AddInsView.xaml
@@ -453,6 +453,15 @@
+
+
@@ -483,24 +492,6 @@
-
-
-
-
-
-
+
-
[Serializable]
- sealed class SimpleHighlightingBrush : HighlightingBrush, ISerializable
+ public sealed class SimpleHighlightingBrush : HighlightingBrush, ISerializable
{
readonly SolidColorBrush brush;
- public SimpleHighlightingBrush(SolidColorBrush brush)
+ internal SimpleHighlightingBrush(SolidColorBrush brush)
{
brush.Freeze();
this.brush = brush;
}
+ ///
public SimpleHighlightingBrush(Color color) : this(new SolidColorBrush(color)) {}
+ ///
public override Brush GetBrush(ITextRunConstructionContext context)
{
return brush;
}
-
+
+ ///
public override string ToString()
{
return brush.ToString();
@@ -91,6 +94,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting
info.AddValue("color", brush.Color.ToString(CultureInfo.InvariantCulture));
}
+ ///
public override bool Equals(object obj)
{
SimpleHighlightingBrush other = obj as SimpleHighlightingBrush;
@@ -99,6 +103,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting
return this.brush.Color.Equals(other.brush.Color);
}
+ ///
public override int GetHashCode()
{
return brush.Color.GetHashCode();
diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/RichText.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/RichText.cs
index 34f51396f2..dae7ea0b0d 100644
--- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/RichText.cs
+++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/RichText.cs
@@ -151,7 +151,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting
///
public RichTextModel ToRichTextModel()
{
- return new RichTextModel(stateChangeOffsets, stateChanges);
+ return new RichTextModel(stateChangeOffsets, stateChanges.Select(ch => ch.Clone()).ToArray());
}
///
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeActions/DeclareLocalVariableAction.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeActions/DeclareLocalVariableAction.cs
index da4564c7e6..6e68019f14 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeActions/DeclareLocalVariableAction.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeActions/DeclareLocalVariableAction.cs
@@ -72,6 +72,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
guessedType = GetDelegateType(context, ((MethodGroupResolveResult)resolveResult).Methods.First(), expr);
}
var name = CreateMethodDeclarationAction.CreateBaseName(expr, guessedType);
+ name = context.GetLocalNameProposal(name, expr.StartLocation);
var type = context.UseExplicitTypes ? context.CreateShortType(guessedType) : new SimpleType("var");
var varDecl = new VariableDeclarationStatement(type, name, expr.Clone());
var replaceNode = visitor.Matches.First () as Expression;
@@ -100,6 +101,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
}
var linkedNodes = new List();
var name = CreateMethodDeclarationAction.CreateBaseName(expr, guessedType);
+ name = context.GetLocalNameProposal(name, expr.StartLocation);
var type = context.UseExplicitTypes ? context.CreateShortType(guessedType) : new SimpleType("var");
var varDecl = new VariableDeclarationStatement(type, name, expr.Clone());
linkedNodes.Add(varDecl.Variables.First().NameToken);
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Analysis/SemanticHighlightingVisitor.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Analysis/SemanticHighlightingVisitor.cs
index 4979fd0a6a..ac06ae29bd 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Analysis/SemanticHighlightingVisitor.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Analysis/SemanticHighlightingVisitor.cs
@@ -94,7 +94,7 @@ namespace ICSharpCode.NRefactory.CSharp.Analysis
protected abstract void Colorize(TextLocation start, TextLocation end, TColor color);
#region Colorize helper methods
- protected void Colorize(Identifier identifier, ResolveResult rr)
+ protected virtual void Colorize(Identifier identifier, ResolveResult rr)
{
if (identifier.IsNull)
return;
@@ -141,7 +141,7 @@ namespace ICSharpCode.NRefactory.CSharp.Analysis
VisitIdentifier(identifier); // un-colorize contextual keywords
}
- protected void Colorize(AstNode node, TColor color)
+ protected virtual void Colorize(AstNode node, TColor color)
{
if (node.IsNull)
return;
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/BaseRefactoringContext.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/BaseRefactoringContext.cs
index 7f5d9381fe..3f80558710 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/BaseRefactoringContext.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/BaseRefactoringContext.cs
@@ -214,6 +214,22 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
} while (type.Members.Select (m => m.GetChildByRole (Roles.Identifier)).Any (n => n.Name == proposedName));
return proposedName;
}
+
+ public virtual string GetLocalNameProposal (string name, TextLocation loc, bool camelCase = true)
+ {
+ string baseName = (camelCase ? char.ToLower (name [0]) : char.ToUpper (name [0])) + name.Substring (1);
+ var node = RootNode.GetNodeAt(loc);
+ if (node == null)
+ return baseName;
+
+ var context = GetResolverStateBefore (node);
+ int number = -1;
+ string proposedName;
+ do {
+ proposedName = AppendNumberToName (baseName, number++);
+ } while (!(context.ResolveSimpleName (proposedName, EmptyList.Instance) is UnknownIdentifierResolveResult));
+ return proposedName;
+ }
static string AppendNumberToName (string baseName, int number)
{
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs
index eafac416bd..1beff7008b 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/TypeSystemAstBuilder.cs
@@ -806,7 +806,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
{
MethodDeclaration decl = new MethodDeclaration();
decl.Modifiers = GetMemberModifiers(method);
- if (method.IsAsync)
+ if (method.IsAsync && ShowModifiers)
decl.Modifiers |= Modifiers.Async;
decl.ReturnType = ConvertType(method.ReturnType);
decl.Name = method.Name;
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/CSharpOperators.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/CSharpOperators.cs
index 2fdd543e4a..856d94eecc 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/CSharpOperators.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/CSharpOperators.cs
@@ -232,6 +232,16 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
{
throw new NotSupportedException();
}
+
+ ISymbolReference ISymbol.ToReference()
+ {
+ throw new NotSupportedException();
+ }
+
+ IMemberReference IMember.ToReference()
+ {
+ throw new NotSupportedException();
+ }
TypeParameterSubstitution IMember.Substitution {
get {
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ReducedExtensionMethod.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ReducedExtensionMethod.cs
index 0f161bf701..64acd15b82 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ReducedExtensionMethod.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ReducedExtensionMethod.cs
@@ -33,7 +33,7 @@ namespace ICSharpCode.NRefactory.CSharp
{
///
/// An invocated extension method hides the extension parameter in its parameter list.
- /// It's used to hide the internals of extension method invocation in certain situation to simulate the
+ /// It's used to hide the internals of extension method invocation in certain situation to simulate the
/// syntactic way of writing extension methods on semantic level.
///
public class ReducedExtensionMethod : IMethod
@@ -77,24 +77,37 @@ namespace ICSharpCode.NRefactory.CSharp
this.baseMethod = baseMethod;
}
- #region IMemberReference implementation
public IMember Resolve(ITypeResolveContext context)
{
- return new ReducedExtensionMethod ((IMethod)baseMethod.ToMemberReference ().Resolve (context));
+ return new ReducedExtensionMethod ((IMethod)baseMethod.ToReference ().Resolve (context));
+ }
+
+ ISymbol ISymbolReference.Resolve(ITypeResolveContext context)
+ {
+ return Resolve(context);
}
public ITypeReference DeclaringTypeReference {
get {
- return baseMethod.ToMemberReference ().DeclaringTypeReference;
+ return baseMethod.ToReference ().DeclaringTypeReference;
}
}
- #endregion
}
public IMemberReference ToMemberReference()
{
return new ReducedExtensionMethodMemberReference (baseMethod);
}
+
+ public IMemberReference ToReference()
+ {
+ return new ReducedExtensionMethodMemberReference (baseMethod);
+ }
+
+ ISymbolReference ISymbol.ToReference()
+ {
+ return ToReference();
+ }
public IMember MemberDefinition {
get {
@@ -240,10 +253,10 @@ namespace ICSharpCode.NRefactory.CSharp
}
}
- public IMethod ReducedFrom {
+ public IMethod ReducedFrom {
get {
return baseMethod;
- }
+ }
}
public IList TypeArguments {
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs
index 56e6ac92b1..5833a1ec90 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs
@@ -3170,6 +3170,11 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
{
return type.ToString() + " " + name + ";";
}
+
+ public ISymbolReference ToReference()
+ {
+ return new VariableReference(type.ToTypeReference(), name, region, IsConst, ConstantValue);
+ }
}
sealed class SimpleConstant : SimpleVariable
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpAssembly.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpAssembly.cs
index 71f74144de..fdf220ea2b 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpAssembly.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpAssembly.cs
@@ -328,6 +328,11 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
return assembly.GetTypeDefinition(key);
}
}
+
+ public ISymbolReference ToReference()
+ {
+ return new NamespaceReference(new DefaultAssemblyReference(assembly.AssemblyName), fullName);
+ }
}
}
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/ResolvedUsingScope.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/ResolvedUsingScope.cs
index 5ea1016bec..2103251177 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/ResolvedUsingScope.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/TypeSystem/ResolvedUsingScope.cs
@@ -21,6 +21,7 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
+using ICSharpCode.NRefactory.TypeSystem.Implementation;
using ICSharpCode.NRefactory.CSharp.Resolver;
using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.TypeSystem;
@@ -199,6 +200,11 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem
{
return null;
}
+
+ public ISymbolReference ToReference()
+ {
+ return new MergedNamespaceReference(ExternAlias, ((INamespace)this).FullName);
+ }
}
}
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/CSharp/Resolver/AnonymousTypeTests.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/CSharp/Resolver/AnonymousTypeTests.cs
index 858a1680b5..501e227670 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/CSharp/Resolver/AnonymousTypeTests.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/CSharp/Resolver/AnonymousTypeTests.cs
@@ -141,7 +141,7 @@ class TestClass {
}";
var result = Resolve(program);
IProperty prop = result.Type.GetProperties().Single();
- IProperty propAfterRoundtrip = (IProperty)prop.ToMemberReference().Resolve(result.Member.Compilation.TypeResolveContext);
+ IProperty propAfterRoundtrip = (IProperty)prop.ToReference().Resolve(result.Member.Compilation.TypeResolveContext);
Assert.AreEqual(prop, propAfterRoundtrip);
}
@@ -156,7 +156,7 @@ class TestClass {
}";
var result = Resolve(program);
IMethod getter = result.Type.GetProperties().Single().Getter;
- IMethod getterAfterRoundtrip = (IMethod)getter.ToMemberReference().Resolve(result.Member.Compilation.TypeResolveContext);
+ IMethod getterAfterRoundtrip = (IMethod)getter.ToReference().Resolve(result.Member.Compilation.TypeResolveContext);
Assert.AreEqual(getter, getterAfterRoundtrip);
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs
index adc2f30afa..84955aaf88 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs
@@ -266,7 +266,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
Assert.IsInstanceOf(method);
Assert.IsFalse(method.IsParameterized); // the method itself is not specialized
Assert.AreEqual(method.TypeParameters, method.TypeArguments);
- var methodReference = method.ToMemberReference();
+ var methodReference = method.ToReference();
var resolvedMethod = methodReference.Resolve(compilation.TypeResolveContext);
Assert.AreEqual(method, resolvedMethod);
}
@@ -1082,7 +1082,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
{
ITypeDefinition type = GetTypeDefinition(typeof(ClassThatImplementsProperty));
var prop = type.Properties.Single(p => p.Name == "Prop");
- var mr = prop.Getter.ToMemberReference();
+ var mr = prop.Getter.ToReference();
Assert.AreEqual(prop.Getter, mr.Resolve(compilation.TypeResolveContext));
}
@@ -1130,7 +1130,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
{
ITypeDefinition type = GetTypeDefinition(typeof(ClassThatImplementsPropertyExplicitly));
var prop = type.Properties.Single();
- var mr = prop.Getter.ToMemberReference();
+ var mr = prop.Getter.ToReference();
Assert.AreEqual(prop.Getter, mr.Resolve(compilation.TypeResolveContext));
}
@@ -1167,7 +1167,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
IType type = compilation.FindType(typeof(ExplicitGenericInterfaceImplementationWithUnifiableMethods));
Assert.AreEqual(2, type.GetMethods(m => m.IsExplicitInterfaceImplementation).Count());
foreach (IMethod method in type.GetMethods(m => m.IsExplicitInterfaceImplementation)) {
- IMethod resolvedMethod = (IMethod)method.ToMemberReference().Resolve(compilation.TypeResolveContext);
+ IMethod resolvedMethod = (IMethod)method.ToReference().Resolve(compilation.TypeResolveContext);
Assert.AreEqual(method, resolvedMethod);
}
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/Documentation/IdStringMemberReference.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/Documentation/IdStringMemberReference.cs
index 025e51a113..db7706e022 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/Documentation/IdStringMemberReference.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/Documentation/IdStringMemberReference.cs
@@ -68,5 +68,10 @@ namespace ICSharpCode.NRefactory.Documentation
}
return null;
}
+
+ ISymbol ISymbolReference.Resolve(ITypeResolveContext context)
+ {
+ return Resolve(context);
+ }
}
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/IField.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/IField.cs
index 79d619fb24..98fa0efe35 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/IField.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/IField.cs
@@ -93,5 +93,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
/// If this is true, then ConstantValue contains the size of the buffer.
///
bool IsFixed { get; }
+
+ new IMemberReference ToReference(); // solve ambiguity between IMember.ToReference() and IVariable.ToReference()
}
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/IMember.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/IMember.cs
index a14c991eb3..405dc51845 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/IMember.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/IMember.cs
@@ -82,7 +82,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
IMember CreateResolved(ITypeResolveContext context);
}
- public interface IMemberReference
+ public interface IMemberReference : ISymbolReference
{
///
/// Gets the declaring type reference for the member.
@@ -101,7 +101,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
///
/// Returns the resolved member, or null if the member could not be found.
///
- IMember Resolve(ITypeResolveContext context);
+ new IMember Resolve(ITypeResolveContext context);
}
///
@@ -167,7 +167,17 @@ namespace ICSharpCode.NRefactory.TypeSystem
/// If this member is specialized using open generic types, the resulting member reference will need to be looked up in an appropriate generic context.
/// Otherwise, the main resolve context of a compilation is sufficient.
///
+ [Obsolete("Use the ToReference method instead.")]
IMemberReference ToMemberReference();
+
+ ///
+ /// Creates a member reference that can be used to rediscover this member in another compilation.
+ ///
+ ///
+ /// If this member is specialized using open generic types, the resulting member reference will need to be looked up in an appropriate generic context.
+ /// Otherwise, the main resolve context of a compilation is sufficient.
+ ///
+ new IMemberReference ToReference();
///
/// Gets the substitution belonging to this specialized member.
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/ISymbol.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/ISymbol.cs
index 24286b3431..495c932fd4 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/ISymbol.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/ISymbol.cs
@@ -86,5 +86,15 @@ namespace ICSharpCode.NRefactory.TypeSystem
/// Gets the short name of the symbol.
///
string Name { get; }
+
+ ///
+ /// Creates a symbol reference that can be used to rediscover this symbol in another compilation.
+ ///
+ ISymbolReference ToReference();
+ }
+
+ public interface ISymbolReference
+ {
+ ISymbol Resolve(ITypeResolveContext context);
}
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedEntity.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedEntity.cs
index de50cb2e81..dfa2ba932a 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedEntity.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedEntity.cs
@@ -90,6 +90,8 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
else
return null;
}
+
+ public abstract ISymbolReference ToReference();
public bool IsStatic { get { return unresolved.IsStatic; } }
public bool IsAbstract { get { return unresolved.IsAbstract; } }
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedMember.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedMember.cs
index 1058f1d67c..e8de96aa89 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedMember.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedMember.cs
@@ -126,17 +126,27 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
}
public abstract IMember Specialize(TypeParameterSubstitution substitution);
-
- public virtual IMemberReference ToMemberReference()
+
+ IMemberReference IMember.ToReference()
+ {
+ return (IMemberReference)ToReference();
+ }
+
+ public override ISymbolReference ToReference()
{
var declTypeRef = this.DeclaringType.ToTypeReference();
if (IsExplicitInterfaceImplementation && ImplementedInterfaceMembers.Count == 1) {
- return new ExplicitInterfaceImplementationMemberReference(declTypeRef, ImplementedInterfaceMembers[0].ToMemberReference());
+ return new ExplicitInterfaceImplementationMemberReference(declTypeRef, ImplementedInterfaceMembers[0].ToReference());
} else {
return new DefaultMemberReference(this.SymbolKind, declTypeRef, this.Name);
}
}
+ public virtual IMemberReference ToMemberReference()
+ {
+ return (IMemberReference)ToReference();
+ }
+
internal IMethod GetAccessor(ref IMethod accessorField, IUnresolvedMethod unresolvedAccessor)
{
if (unresolvedAccessor == null)
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedTypeParameter.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedTypeParameter.cs
index 3bd392cd54..857db81c02 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedTypeParameter.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractResolvedTypeParameter.cs
@@ -372,10 +372,41 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
{
return this == other; // use reference equality for type parameters
}
+
+ public virtual ISymbolReference ToReference()
+ {
+ if (owner == null)
+ return TypeParameterReference.Create(ownerType, index);
+ return new OwnedTypeParameterReference(owner.ToReference(), index);
+ }
public override string ToString()
{
return this.ReflectionName + " (owner=" + owner + ")";
}
}
+
+ public sealed class OwnedTypeParameterReference : ISymbolReference
+ {
+ ISymbolReference owner;
+ int index;
+
+ public OwnedTypeParameterReference(ISymbolReference owner, int index)
+ {
+ if (owner == null)
+ throw new ArgumentNullException("owner");
+ this.owner = owner;
+ this.index = index;
+ }
+
+ public ISymbol Resolve(ITypeResolveContext context)
+ {
+ var entity = owner.Resolve(context) as IEntity;
+ if (entity is ITypeDefinition)
+ return ((ITypeDefinition)entity).TypeParameters[index];
+ if (entity is IMethod)
+ return ((IMethod)entity).TypeParameters[index];
+ return null;
+ }
+ }
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractUnresolvedMember.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractUnresolvedMember.cs
index 9b1094187d..d4d47c2511 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractUnresolvedMember.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AbstractUnresolvedMember.cs
@@ -152,6 +152,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
return Resolve(ExtendContextForType(context, this.DeclaringTypeDefinition), this.SymbolKind, this.Name, interfaceTypeReference);
}
+ ISymbol ISymbolReference.Resolve(ITypeResolveContext context)
+ {
+ return ((IUnresolvedMember)this).Resolve(context);
+ }
+
protected static ITypeResolveContext ExtendContextForType(ITypeResolveContext assemblyContext, IUnresolvedTypeDefinition typeDef)
{
if (typeDef == null)
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AccessorOwnerMemberReference.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AccessorOwnerMemberReference.cs
index 715f6e1c66..5db066b6e3 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AccessorOwnerMemberReference.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/AccessorOwnerMemberReference.cs
@@ -47,5 +47,10 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
else
return null;
}
+
+ ISymbol ISymbolReference.Resolve(ITypeResolveContext context)
+ {
+ return ((IMemberReference)this).Resolve(context);
+ }
}
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultMemberReference.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultMemberReference.cs
index 6be899b182..0173021011 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultMemberReference.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultMemberReference.cs
@@ -99,6 +99,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
return null;
}
+ ISymbol ISymbolReference.Resolve(ITypeResolveContext context)
+ {
+ return ((IMemberReference)this).Resolve(context);
+ }
+
int ISupportsInterning.GetHashCodeForInterning()
{
return (int)symbolKind ^ typeReference.GetHashCode() ^ name.GetHashCode() ^ parameterTypes.GetHashCode();
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultParameter.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultParameter.cs
index 77dac0bf3c..4106f27100 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultParameter.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultParameter.cs
@@ -138,5 +138,62 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
}
return b.ToString();
}
+
+ public ISymbolReference ToReference()
+ {
+ if (owner == null)
+ return new ParameterReference(type.ToTypeReference(), name, region, isRef, isOut, isParams, isOptional, defaultValue);
+ return new OwnedParameterReference(owner.ToReference(), owner.Parameters.IndexOf(this));
+ }
+ }
+
+ sealed class OwnedParameterReference : ISymbolReference
+ {
+ readonly IMemberReference memberReference;
+ readonly int index;
+
+ public OwnedParameterReference(IMemberReference member, int index)
+ {
+ if (member == null)
+ throw new ArgumentNullException("member");
+ this.memberReference = member;
+ this.index = index;
+ }
+
+ public ISymbol Resolve(ITypeResolveContext context)
+ {
+ IParameterizedMember member = (IParameterizedMember)memberReference.Resolve(context);
+ return member.Parameters[index];
+ }
+ }
+
+ public sealed class ParameterReference : ISymbolReference
+ {
+ readonly ITypeReference type;
+ readonly string name;
+ readonly DomRegion region;
+ readonly bool isRef, isOut, isParams, isOptional;
+ readonly object defaultValue;
+
+ public ParameterReference(ITypeReference type, string name, DomRegion region, bool isRef, bool isOut, bool isParams, bool isOptional, object defaultValue)
+ {
+ if (type == null)
+ throw new ArgumentNullException("type");
+ if (name == null)
+ throw new ArgumentNullException("name");
+ this.type = type;
+ this.name = name;
+ this.region = region;
+ this.isRef = isRef;
+ this.isOut = isOut;
+ this.isParams = isParams;
+ this.isOptional = isOptional;
+ this.defaultValue = defaultValue;
+ }
+
+ public ISymbol Resolve(ITypeResolveContext context)
+ {
+ return new DefaultParameter(type.Resolve(context), name, region: region, isRef: isRef, isOut: isOut, isParams: isParams, isOptional: isOptional, defaultValue: defaultValue);
+ }
}
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedField.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedField.cs
index 25764e7d6f..8bb2317fa5 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedField.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedField.cs
@@ -78,5 +78,10 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
return this;
return new SpecializedField(this, substitution);
}
+
+ IMemberReference IField.ToReference()
+ {
+ return (IMemberReference)ToReference();
+ }
}
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedMethod.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedMethod.cs
index 168adfe00d..2ca7eb450a 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedMethod.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedMethod.cs
@@ -234,11 +234,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
}
}
- public override IMemberReference ToMemberReference()
+ public override ISymbolReference ToReference()
{
var declTypeRef = this.DeclaringType.ToTypeReference();
if (IsExplicitInterfaceImplementation && ImplementedInterfaceMembers.Count == 1) {
- return new ExplicitInterfaceImplementationMemberReference(declTypeRef, ImplementedInterfaceMembers[0].ToMemberReference());
+ return new ExplicitInterfaceImplementationMemberReference(declTypeRef, ImplementedInterfaceMembers[0].ToReference());
} else {
return new DefaultMemberReference(
this.SymbolKind, declTypeRef, this.Name, this.TypeParameters.Count,
@@ -246,6 +246,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
}
}
+ public override IMemberReference ToMemberReference()
+ {
+ return (IMemberReference)ToReference();
+ }
+
public override IMember Specialize(TypeParameterSubstitution substitution)
{
if (TypeParameterSubstitution.Identity.Equals(substitution))
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedProperty.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedProperty.cs
index 837d97090d..953e0ffdf1 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedProperty.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedProperty.cs
@@ -61,11 +61,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
get { return unresolved.IsIndexer; }
}
- public override IMemberReference ToMemberReference()
+ public override ISymbolReference ToReference()
{
var declTypeRef = this.DeclaringType.ToTypeReference();
if (IsExplicitInterfaceImplementation && ImplementedInterfaceMembers.Count == 1) {
- return new ExplicitInterfaceImplementationMemberReference(declTypeRef, ImplementedInterfaceMembers[0].ToMemberReference());
+ return new ExplicitInterfaceImplementationMemberReference(declTypeRef, ImplementedInterfaceMembers[0].ToReference());
} else {
return new DefaultMemberReference(
this.SymbolKind, declTypeRef, this.Name, 0,
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs
index 0be487e420..80b332d852 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs
@@ -710,6 +710,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
}
}
+ ISymbolReference ISymbol.ToReference()
+ {
+ return (ISymbolReference)ToTypeReference();
+ }
+
public IEnumerable GetNestedTypes(Predicate filter = null, GetMemberOptions options = GetMemberOptions.None)
{
const GetMemberOptions opt = GetMemberOptions.IgnoreInheritedMembers | GetMemberOptions.ReturnMemberDefinitions;
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs
index 3bcb74c106..0999c8431c 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedAssembly.cs
@@ -462,7 +462,68 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
else
return null;
}
+
+ public ISymbolReference ToReference()
+ {
+ return new NamespaceReference(new DefaultAssemblyReference(assembly.AssemblyName), ns.FullName);
+ }
+ }
+ }
+ }
+
+ public sealed class NamespaceReference : ISymbolReference
+ {
+ IAssemblyReference assemblyReference;
+ string fullName;
+
+ public NamespaceReference(IAssemblyReference assemblyReference, string fullName)
+ {
+ if (assemblyReference == null)
+ throw new ArgumentNullException("assemblyReference");
+ this.assemblyReference = assemblyReference;
+ this.fullName = fullName;
+ }
+
+ public ISymbol Resolve(ITypeResolveContext context)
+ {
+ IAssembly assembly = assemblyReference.Resolve(context);
+ INamespace parent = assembly.RootNamespace;
+
+ string[] parts = fullName.Split('.');
+
+ int i = 0;
+ while (i < parts.Length && parent != null) {
+ parent = parent.GetChildNamespace(parts[i]);
+ i++;
}
+
+ return parent;
+ }
+ }
+
+ public sealed class MergedNamespaceReference : ISymbolReference
+ {
+ string externAlias;
+ string fullName;
+
+ public MergedNamespaceReference(string externAlias, string fullName)
+ {
+ this.externAlias = externAlias;
+ this.fullName = fullName;
+ }
+
+ public ISymbol Resolve(ITypeResolveContext context)
+ {
+ string[] parts = fullName.Split('.');
+ INamespace parent = context.Compilation.GetNamespaceForExternAlias(externAlias);
+
+ int i = 0;
+ while (i < parts.Length && parent != null) {
+ parent = parent.GetChildNamespace(parts[i]);
+ i++;
+ }
+
+ return parent;
}
}
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedParameter.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedParameter.cs
index 5e59a3990e..d57197fa82 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedParameter.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultUnresolvedParameter.cs
@@ -263,6 +263,13 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
{
return DefaultParameter.ToString(this);
}
+
+ public ISymbolReference ToReference()
+ {
+ if (Owner == null)
+ return new ParameterReference(Type.ToTypeReference(), Name, Region, IsRef, IsOut, IsParams, true, ConstantValue);
+ return new OwnedParameterReference(Owner.ToReference(), Owner.Parameters.IndexOf(this));
+ }
}
}
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultVariable.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultVariable.cs
index 38d0eeacc4..0ce0be0e04 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultVariable.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultVariable.cs
@@ -73,5 +73,37 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
public SymbolKind SymbolKind {
get { return SymbolKind.Variable; }
}
+
+ public ISymbolReference ToReference()
+ {
+ return new VariableReference(type.ToTypeReference(), name, region, isConst, constantValue);
+ }
+ }
+
+ public sealed class VariableReference : ISymbolReference
+ {
+ ITypeReference variableTypeReference;
+ string name;
+ DomRegion region;
+ bool isConst;
+ object constantValue;
+
+ public VariableReference(ITypeReference variableTypeReference, string name, DomRegion region, bool isConst, object constantValue)
+ {
+ if (variableTypeReference == null)
+ throw new ArgumentNullException("variableTypeReference");
+ if (name == null)
+ throw new ArgumentNullException("name");
+ this.variableTypeReference = variableTypeReference;
+ this.name = name;
+ this.region = region;
+ this.isConst = isConst;
+ this.constantValue = constantValue;
+ }
+
+ public ISymbol Resolve(ITypeResolveContext context)
+ {
+ return new DefaultVariable(variableTypeReference.Resolve(context), name, region, isConst, constantValue);
+ }
}
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DummyTypeParameter.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DummyTypeParameter.cs
index bf1a0c6635..6530da822d 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DummyTypeParameter.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/DummyTypeParameter.cs
@@ -208,5 +208,10 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
bool ITypeParameter.HasValueTypeConstraint {
get { return false; }
}
+
+ public ISymbolReference ToReference()
+ {
+ return new TypeParameterReference(ownerType, index);
+ }
}
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/ExplicitInterfaceImplementationMemberReference.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/ExplicitInterfaceImplementationMemberReference.cs
index 6297db3e49..abe280028d 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/ExplicitInterfaceImplementationMemberReference.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/ExplicitInterfaceImplementationMemberReference.cs
@@ -71,5 +71,10 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
}
return members.FirstOrDefault(m => m.ImplementedInterfaceMembers.Count == 1 && interfaceMember.Equals(m.ImplementedInterfaceMembers[0]));
}
+
+ ISymbol ISymbolReference.Resolve(ITypeResolveContext context)
+ {
+ return Resolve(context);
+ }
}
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/GetClassTypeReference.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/GetClassTypeReference.cs
index 1478259ae9..c394011106 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/GetClassTypeReference.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/GetClassTypeReference.cs
@@ -25,7 +25,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
/// Type Reference used when the fully qualified type name is known.
///
[Serializable]
- public sealed class GetClassTypeReference : ITypeReference, ISupportsInterning
+ public sealed class GetClassTypeReference : ITypeReference, ISymbolReference, ISupportsInterning
{
readonly IAssemblyReference assembly;
readonly FullTypeName fullTypeName;
@@ -115,6 +115,14 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
return type ?? new UnknownType(fullTypeName);
}
+ ISymbol ISymbolReference.Resolve(ITypeResolveContext context)
+ {
+ var type = Resolve(context);
+ if (type is ITypeDefinition)
+ return (ISymbol)type;
+ return null;
+ }
+
public override string ToString()
{
return fullTypeName.ToString() + (assembly != null ? ", " + assembly.ToString() : null);
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/MergedNamespace.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/MergedNamespace.cs
index 97afebf4ee..0891df1f00 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/MergedNamespace.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/MergedNamespace.cs
@@ -155,5 +155,10 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
return string.Format(CultureInfo.InvariantCulture, "[MergedNamespace {0}{1} (from {2} assemblies)]",
externAlias != null ? externAlias + "::" : null, this.FullName, this.namespaces.Length);
}
+
+ public ISymbolReference ToReference()
+ {
+ return new MergedNamespaceReference(externAlias, FullName);
+ }
}
}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/NestedTypeReference.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/NestedTypeReference.cs
index 6460a1689b..a9fe401480 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/NestedTypeReference.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/NestedTypeReference.cs
@@ -24,7 +24,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
/// Type reference used to reference nested types.
///
[Serializable]
- public sealed class NestedTypeReference : ITypeReference, ISupportsInterning
+ public sealed class NestedTypeReference : ITypeReference, ISymbolReference, ISupportsInterning
{
readonly ITypeReference declaringTypeRef;
readonly string name;
@@ -76,6 +76,14 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
return new UnknownType(null, name, additionalTypeParameterCount);
}
+ ISymbol ISymbolReference.Resolve(ITypeResolveContext context)
+ {
+ var type = Resolve(context);
+ if (type is ITypeDefinition)
+ return (ISymbol)type;
+ return null;
+ }
+
public override string ToString()
{
if (additionalTypeParameterCount == 0)
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMember.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMember.cs
index 982cebea8d..b75e3cfd18 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMember.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMember.cs
@@ -70,13 +70,23 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
}
public virtual IMemberReference ToMemberReference()
+ {
+ return ToReference();
+ }
+
+ public virtual IMemberReference ToReference()
{
return new SpecializingMemberReference(
- baseMember.ToMemberReference(),
+ baseMember.ToReference(),
ToTypeReference(substitution.ClassTypeArguments),
null);
}
+ ISymbolReference ISymbol.ToReference()
+ {
+ return ToReference();
+ }
+
internal static IList ToTypeReference(IList typeArguments)
{
if (typeArguments == null)
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMethod.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMethod.cs
index 33537bc471..c2fdb2d51f 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMethod.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializedMethod.cs
@@ -154,7 +154,7 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
}
}
- public override IMemberReference ToMemberReference()
+ public override IMemberReference ToReference()
{
// Pass the MethodTypeArguments to the SpecializingMemberReference only if
// the generic method itself is parameterized, not if the generic method is only
@@ -169,14 +169,19 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
// in the resulting member reference.
if (isParameterized) {
return new SpecializingMemberReference(
- baseMember.ToMemberReference(),
+ baseMember.ToReference(),
ToTypeReference(base.Substitution.ClassTypeArguments),
ToTypeReference(base.Substitution.MethodTypeArguments));
} else {
- return base.ToMemberReference();
+ return base.ToReference();
}
}
+ public override IMemberReference ToMemberReference()
+ {
+ return ToReference();
+ }
+
public override bool Equals(object obj)
{
SpecializedMethod other = obj as SpecializedMethod;
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializingMemberReference.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializingMemberReference.cs
index bb66a8b93b..701a7f642a 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializingMemberReference.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/SpecializingMemberReference.cs
@@ -50,6 +50,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
);
}
+ ISymbol ISymbolReference.Resolve(ITypeResolveContext context)
+ {
+ return Resolve(context);
+ }
+
public ITypeReference DeclaringTypeReference {
get {
if (classTypeArgumentReferences != null)
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/TypeParameterReference.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/TypeParameterReference.cs
index 8fdd096f5d..e6ef94003d 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/TypeParameterReference.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/Implementation/TypeParameterReference.cs
@@ -23,7 +23,7 @@ using ICSharpCode.NRefactory.Utils;
namespace ICSharpCode.NRefactory.TypeSystem.Implementation
{
[Serializable]
- public sealed class TypeParameterReference : ITypeReference
+ public sealed class TypeParameterReference : ITypeReference, ISymbolReference
{
static readonly TypeParameterReference[] classTypeParameterReferences = new TypeParameterReference[8];
static readonly TypeParameterReference[] methodTypeParameterReferences = new TypeParameterReference[8];
@@ -80,6 +80,11 @@ namespace ICSharpCode.NRefactory.TypeSystem.Implementation
}
}
+ ISymbol ISymbolReference.Resolve(ITypeResolveContext context)
+ {
+ return Resolve(context) as ISymbol;
+ }
+
public override string ToString()
{
if (ownerType == SymbolKind.Method)
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/TypeSystemExtensions.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/TypeSystemExtensions.cs
index b7215c0ebf..51e736816d 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/TypeSystemExtensions.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory/TypeSystem/TypeSystemExtensions.cs
@@ -301,7 +301,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
if (entity.Compilation == compilation)
return entity;
if (entity is IMember)
- return ((IMember)entity).ToMemberReference().Resolve(compilation.TypeResolveContext);
+ return ((IMember)entity).ToReference().Resolve(compilation.TypeResolveContext);
else if (entity is ITypeDefinition)
return ((ITypeDefinition)entity).ToTypeReference().Resolve(compilation.TypeResolveContext).GetDefinition();
else
@@ -319,7 +319,7 @@ namespace ICSharpCode.NRefactory.TypeSystem
return null;
if (member.Compilation == compilation)
return member;
- return member.ToMemberReference().Resolve(compilation.TypeResolveContext);
+ return member.ToReference().Resolve(compilation.TypeResolveContext);
}
///
@@ -765,5 +765,20 @@ namespace ICSharpCode.NRefactory.TypeSystem
return assembly.GetTypeDefinition (new TopLevelTypeName (namespaceName, name, typeParameterCount));
}
#endregion
+
+ #region ResolveResult
+ public static ISymbol GetSymbol(this ResolveResult rr)
+ {
+ if (rr is LocalResolveResult) {
+ return ((LocalResolveResult)rr).Variable;
+ } else if (rr is MemberResolveResult) {
+ return ((MemberResolveResult)rr).Member;
+ } else if (rr is TypeResolveResult) {
+ return ((TypeResolveResult)rr).Type.GetDefinition();
+ }
+
+ return null;
+ }
+ #endregion
}
}
diff --git a/src/Main/Base/Project/Editor/DocumentationUIBuilder.cs b/src/Main/Base/Project/Editor/DocumentationUIBuilder.cs
index 5a9106632e..4abb77342a 100644
--- a/src/Main/Base/Project/Editor/DocumentationUIBuilder.cs
+++ b/src/Main/Base/Project/Editor/DocumentationUIBuilder.cs
@@ -371,8 +371,12 @@ namespace ICSharpCode.SharpDevelop.Editor
var model = referencedEntity.GetModel();
return delegate(object sender, RoutedEventArgs e) {
IEntity resolvedEntity = model != null ? model.Resolve() : null;
- if (resolvedEntity != null)
- SharpDevelop.NavigationService.NavigateTo(resolvedEntity);
+ if (resolvedEntity != null) {
+ bool shouldDisplayHelp = CodeCompletionOptions.TooltipLinkTarget == TooltipLinkTarget.Documentation
+ && resolvedEntity.ParentAssembly.IsPartOfDotnetFramework();
+ if (!shouldDisplayHelp || !HelpProvider.ShowHelp(resolvedEntity))
+ NavigationService.NavigateTo(resolvedEntity);
+ }
e.Handled = true;
};
}
diff --git a/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml b/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml
index 7c2ecb72dd..d450b86852 100644
--- a/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml
+++ b/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml
@@ -3,6 +3,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:core="http://icsharpcode.net/sharpdevelop/core"
xmlns:gui="clr-namespace:ICSharpCode.SharpDevelop.Gui"
+ xmlns:sd="clr-namespace:ICSharpCode.SharpDevelop"
xmlns:widgets="clr-namespace:ICSharpCode.SharpDevelop.Widgets;assembly=ICSharpCode.SharpDevelop.Widgets">
@@ -26,7 +27,7 @@
Header="{core:Localize Dialog.Options.IDEOptions.CodeCompletion.DetailSettings}"
IsEnabled="{Binding EnableCodeCompletion}">
-
+
@@ -38,6 +39,7 @@
+
@@ -97,6 +99,11 @@
IsEnabled="{Binding UseInsight}">
+
+
+
+
diff --git a/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml.cs b/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml.cs
index 30cc3e6109..906da07b7d 100644
--- a/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml.cs
+++ b/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml.cs
@@ -32,7 +32,6 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
{
InitializeComponent();
this.DataContext = this;
- WrapText = StringParser.Parse("${res:Dialog.Options.IDEOptions.CodeCompletion.LanguageDependend}");
}
#region overrides
@@ -68,8 +67,6 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
#endregion
- public string WrapText {get; private set;}
-
#region Properties
private bool enableCodeCompletion;
@@ -119,7 +116,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
void Button_Click(object sender, RoutedEventArgs e)
{
- ICSharpCode.SharpDevelop.Editor.CodeCompletion.CodeCompletionDataUsageCache.ResetCache();
+ CodeCompletionDataUsageCache.ResetCache();
}
}
}
diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/AsynchronousWaitDialog.cs b/src/Main/Base/Project/Src/Gui/Dialogs/AsynchronousWaitDialog.cs
index 63364324fc..7e1fc65ac8 100644
--- a/src/Main/Base/Project/Src/Gui/Dialogs/AsynchronousWaitDialog.cs
+++ b/src/Main/Base/Project/Src/Gui/Dialogs/AsynchronousWaitDialog.cs
@@ -333,7 +333,7 @@ namespace ICSharpCode.SharpDevelop.Gui
if (runningInOwnThread)
dlg.Show();
else
- if (!dlg.Visible)
+ if (!collector.ProgressMonitorIsDisposed && !dlg.Visible)
dlg.ShowDialog();
}
};
diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/BuildAdvanced.xaml.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/BuildAdvanced.xaml.cs
index f90e04eef6..1d00ed1390 100644
--- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/BuildAdvanced.xaml.cs
+++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/BuildAdvanced.xaml.cs
@@ -68,12 +68,30 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
this.SerializationInfo.Add(new KeyItemPair("On", StringParser.Parse("${res:Dialog.ProjectOptions.Build.On}")));
this.SerializationInfo.Add(new KeyItemPair("Auto", StringParser.Parse("${res:Dialog.ProjectOptions.Build.Auto}")));
+ this.FileAlign = new List();
+ this.FileAlign.Add(new KeyItemPair("512", "512"));
+ this.FileAlign.Add(new KeyItemPair("1024", "1024"));
+ this.FileAlign.Add(new KeyItemPair("2048", "2048"));
+ this.FileAlign.Add(new KeyItemPair("4096", "4096"));
+ this.FileAlign.Add(new KeyItemPair("8192", "8192"));
+ }
+
+ public void Load(MSBuildBasedProject project, string configuration, string platform)
+ {
+ int val;
+ if (!int.TryParse(BaseAddress.Value, NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out val)) {
+ val = 0x400000;
+ }
+ DllBaseAddress = "0x" + val.ToString("x", NumberFormatInfo.InvariantInfo);
+
this.TargetCPU = new List();
supports32BitPreferred = false;
- if (DotnetDetection.IsDotnet45Installed()) {
+ var outputType = projectOptions.GetProperty("OutputType", OutputType.Exe);
+ if (DotnetDetection.IsDotnet45Installed() &&
+ ((outputType.Value == OutputType.Exe) || (outputType.Value == OutputType.WinExe))) {
var upgradableProject = projectOptions.Project as IUpgradableProject;
if (upgradableProject != null && upgradableProject.CurrentTargetFramework.Supports32BitPreferredOption)
- supports32BitPreferred = projectOptions.Project.MinimumSolutionVersion >= SolutionFormatVersion.VS2010;
+ supports32BitPreferred = (projectOptions.Project.MinimumSolutionVersion >= SolutionFormatVersion.VS2010);
// Show 32 vs. 64 options even for library projects;
// it's relevant for web applications.
}
@@ -87,22 +105,6 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
this.TargetCPU.Add(new KeyItemPair("x64", StringParser.Parse("${res:Dialog.ProjectOptions.Build.TargetCPU.x64}")));
this.TargetCPU.Add(new KeyItemPair("Itanium", StringParser.Parse("${res:Dialog.ProjectOptions.Build.TargetCPU.Itanium}")));
- this.FileAlign = new List();
- this.FileAlign.Add(new KeyItemPair("512", "512"));
- this.FileAlign.Add(new KeyItemPair("1024", "1024"));
- this.FileAlign.Add(new KeyItemPair("2048", "2048"));
- this.FileAlign.Add(new KeyItemPair("4096", "4096"));
- this.FileAlign.Add(new KeyItemPair("8192", "8192"));
- }
-
- public void Load(MSBuildBasedProject project, string configuration, string platform)
- {
- int val;
- if (!int.TryParse(BaseAddress.Value, NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out val)) {
- val = 0x400000;
- }
- DllBaseAddress = "0x" + val.ToString("x", NumberFormatInfo.InvariantInfo);
-
if (supports32BitPreferred && string.Equals(this.PlatformTarget.Value, "AnyCPU", StringComparison.OrdinalIgnoreCase)) {
bool default32BitPreferred = false;
var upgradableProject = projectOptions.Project as IUpgradableProject;
diff --git a/src/Main/Base/Project/Src/Services/HelpProvider.cs b/src/Main/Base/Project/Src/Services/HelpProvider.cs
index 0cfe0cb517..38b3a1c592 100644
--- a/src/Main/Base/Project/Src/Services/HelpProvider.cs
+++ b/src/Main/Base/Project/Src/Services/HelpProvider.cs
@@ -30,15 +30,15 @@ namespace ICSharpCode.SharpDevelop
return AddInTree.BuildItems("/SharpDevelop/Services/HelpProvider", null, false);
}
- public static void ShowHelp(IEntity c)
+ public static bool ShowHelp(IEntity c)
{
if (c == null)
throw new ArgumentNullException("c");
foreach (HelpProvider p in GetProviders()) {
if (p.TryShowHelp(c))
- return;
+ return true;
}
- new HelpProvider().TryShowHelp(c);
+ return new HelpProvider().TryShowHelp(c);
}
public virtual bool TryShowHelp(IEntity c)
diff --git a/src/Main/Base/Project/Src/Services/ParserService/CodeCompletionOptions.cs b/src/Main/Base/Project/Src/Services/ParserService/CodeCompletionOptions.cs
index c3b77fe4fa..b82f1bb429 100644
--- a/src/Main/Base/Project/Src/Services/ParserService/CodeCompletionOptions.cs
+++ b/src/Main/Base/Project/Src/Services/ParserService/CodeCompletionOptions.cs
@@ -17,6 +17,7 @@
// DEALINGS IN THE SOFTWARE.
using System;
+using System.ComponentModel;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop
@@ -81,5 +82,17 @@ namespace ICSharpCode.SharpDevelop
get { return properties.Get("InsightRefreshOnComma", true); }
set { properties.Set("InsightRefreshOnComma", value); }
}
+
+ public static TooltipLinkTarget TooltipLinkTarget {
+ get { return properties.Get("TooltipLinkTarget", TooltipLinkTarget.Documentation); }
+ set { properties.Set("TooltipLinkTarget", value); }
+ }
+ }
+
+ public enum TooltipLinkTarget {
+ [Description("${res:Dialog.Options.IDEOptions.CodeCompletion.TooltipLinkTargetDocumentation}")]
+ Documentation,
+ [Description("${res:Dialog.Options.IDEOptions.CodeCompletion.TooltipLinkTargetDefinition}")]
+ Definition
}
}
diff --git a/src/Main/Core/Project/Src/AddInTree/AddIn/DefaultDoozers/FileFilterDoozer.cs b/src/Main/Core/Project/Src/AddInTree/AddIn/DefaultDoozers/FileFilterDoozer.cs
index a705bf0e4c..a4c286dd4c 100644
--- a/src/Main/Core/Project/Src/AddInTree/AddIn/DefaultDoozers/FileFilterDoozer.cs
+++ b/src/Main/Core/Project/Src/AddInTree/AddIn/DefaultDoozers/FileFilterDoozer.cs
@@ -71,11 +71,11 @@ namespace ICSharpCode.Core
{
if (string.IsNullOrEmpty(extension))
return false;
- int index = this.Extensions.IndexOf("*" + extension, StringComparison.OrdinalIgnoreCase);
- if (index < 0 || index + extension.Length > this.Extensions.Length)
+ int index = Extensions.IndexOf("*" + extension, StringComparison.OrdinalIgnoreCase);
+ int matchLength = index + extension.Length + 1;
+ if (index < 0 || matchLength > Extensions.Length)
return false;
- return index + extension.Length < this.Extensions.Length
- || this.Extensions[index + extension.Length] == ';';
+ return matchLength == Extensions.Length || Extensions[matchLength] == ';';
}
public override string ToString()
diff --git a/src/Main/ICSharpCode.SharpDevelop.Widgets/Project/NumericUpDown.cs b/src/Main/ICSharpCode.SharpDevelop.Widgets/Project/NumericUpDown.cs
index 32bcbbbffe..a9201f8259 100644
--- a/src/Main/ICSharpCode.SharpDevelop.Widgets/Project/NumericUpDown.cs
+++ b/src/Main/ICSharpCode.SharpDevelop.Widgets/Project/NumericUpDown.cs
@@ -116,8 +116,10 @@ namespace ICSharpCode.SharpDevelop.Widgets
downButton = (DragRepeatButton)Template.FindName("PART_DownButton", this);
textBox = (TextBox)Template.FindName("PART_TextBox", this);
- upButton.Click += new RoutedEventHandler(upButton_Click);
- downButton.Click += new RoutedEventHandler(downButton_Click);
+ upButton.Click += upButton_Click;
+ downButton.Click += downButton_Click;
+
+ textBox.LostFocus += (sender, e) => OnLostFocus(e);
var upDrag = new DragListener(upButton);
var downDrag = new DragListener(downButton);
diff --git a/src/Main/SharpDevelop/Parser/ParserServiceEntry.cs b/src/Main/SharpDevelop/Parser/ParserServiceEntry.cs
index 77e946a0bf..6a0cc25a62 100644
--- a/src/Main/SharpDevelop/Parser/ParserServiceEntry.cs
+++ b/src/Main/SharpDevelop/Parser/ParserServiceEntry.cs
@@ -319,7 +319,9 @@ namespace ICSharpCode.SharpDevelop.Parser
// Let's look up the file in the list of open files right now
// so that we don't need to SafeThreadCall() later on.
lookupOpenFileOnTargetThread = false;
- fileContent = parser.GetFileContent(fileName);
+ if (parser != null) {
+ fileContent = parser.GetFileContent(fileName);
+ }
}
Task task;
lock (this) {
diff --git a/src/Main/SharpDevelop/Templates/Project/ProjectDescriptor.cs b/src/Main/SharpDevelop/Templates/Project/ProjectDescriptor.cs
index 040d8ef07d..3eee67ee8c 100644
--- a/src/Main/SharpDevelop/Templates/Project/ProjectDescriptor.cs
+++ b/src/Main/SharpDevelop/Templates/Project/ProjectDescriptor.cs
@@ -306,6 +306,7 @@ namespace ICSharpCode.SharpDevelop.Templates
Directory.CreateDirectory(projectBasePath);
FileName projectLocation = projectBasePath.CombineFile(newProjectName + descriptor.ProjectFileExtension);
ProjectCreateInformation info = new ProjectCreateInformation(parentSolution, projectLocation);
+ info.TargetFramework = projectCreateOptions.TargetFramework;
StringBuilder standardNamespace = new StringBuilder();
// filter 'illegal' chars from standard namespace