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, " 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