Browse Source
			
			
			
			
				
		Fixed forum-18847: selections do not work correctly when selecting from invalid lines to valid lines. When code converter crashes, report the file that it was processing during the crash. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2679 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
				 14 changed files with 430 additions and 87 deletions
			
			
		@ -0,0 +1,163 @@
				@@ -0,0 +1,163 @@
					 | 
				
			||||
/* | 
				
			||||
 * Erstellt mit SharpDevelop. | 
				
			||||
 * Benutzer: grunwald | 
				
			||||
 * Datum: 27.08.2007 | 
				
			||||
 * Zeit: 14:25 | 
				
			||||
 *  | 
				
			||||
 * Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern. | 
				
			||||
 */ | 
				
			||||
 | 
				
			||||
using System; | 
				
			||||
using System.IO; | 
				
			||||
using System.Text; | 
				
			||||
using System.Xml; | 
				
			||||
 | 
				
			||||
using ICSharpCode.SharpDevelop.Dom; | 
				
			||||
using ICSharpCode.SharpDevelop.Dom.CSharp; | 
				
			||||
using ICSharpCode.TextEditor.Gui.CompletionWindow; | 
				
			||||
 | 
				
			||||
namespace CSharpEditor | 
				
			||||
{ | 
				
			||||
	/// <summary>
 | 
				
			||||
	/// Represents an item in the code completion window.
 | 
				
			||||
	/// </summary>
 | 
				
			||||
	class CodeCompletionData : DefaultCompletionData, ICompletionData | 
				
			||||
	{ | 
				
			||||
		IMember member; | 
				
			||||
		IClass c; | 
				
			||||
		 | 
				
			||||
		public CodeCompletionData(IMember member) | 
				
			||||
			: base(member.Name, null, GetMemberImageIndex(member)) | 
				
			||||
		{ | 
				
			||||
			this.member = member; | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		public CodeCompletionData(IClass c) | 
				
			||||
			: base(c.Name, null, GetClassImageIndex(c)) | 
				
			||||
		{ | 
				
			||||
			this.c = c; | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		int overloads = 0; | 
				
			||||
		 | 
				
			||||
		public void AddOverload() | 
				
			||||
		{ | 
				
			||||
			overloads++; | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		static int GetMemberImageIndex(IMember member) | 
				
			||||
		{ | 
				
			||||
			// Missing: different icons for private/public member
 | 
				
			||||
			if (member is IMethod) | 
				
			||||
				return 1; | 
				
			||||
			if (member is IProperty) | 
				
			||||
				return 2; | 
				
			||||
			if (member is IField) | 
				
			||||
				return 3; | 
				
			||||
			if (member is IEvent) | 
				
			||||
				return 6; | 
				
			||||
			return 3; | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		static int GetClassImageIndex(IClass c) | 
				
			||||
		{ | 
				
			||||
			switch (c.ClassType) { | 
				
			||||
				case ClassType.Enum: | 
				
			||||
					return 4; | 
				
			||||
				default: | 
				
			||||
					return 0; | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		string description; | 
				
			||||
		 | 
				
			||||
		// DefaultCompletionData.Description is not virtual, but we can reimplement
 | 
				
			||||
		// the interface to get the same effect as overriding.
 | 
				
			||||
		string ICompletionData.Description { | 
				
			||||
			get { | 
				
			||||
				if (description == null) { | 
				
			||||
					IDecoration entity = (IDecoration)member ?? c; | 
				
			||||
					description = GetCSharpText(entity); | 
				
			||||
					if (overloads > 1) { | 
				
			||||
						description += " (+" + overloads + " overloads)"; | 
				
			||||
					} | 
				
			||||
					description += Environment.NewLine + XmlDocumentationToText(entity.Documentation); | 
				
			||||
				} | 
				
			||||
				return description; | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		/// <summary>
 | 
				
			||||
		/// Converts a member to text.
 | 
				
			||||
		/// Returns the declaration of the member as C# code, e.g.
 | 
				
			||||
		/// "public void MemberName(string parameter)"
 | 
				
			||||
		/// </summary>
 | 
				
			||||
		static string GetCSharpText(IDecoration entity) | 
				
			||||
		{ | 
				
			||||
			if (entity is IMethod) | 
				
			||||
				return CSharpAmbience.Instance.Convert(entity as IMethod); | 
				
			||||
			if (entity is IProperty) | 
				
			||||
				return CSharpAmbience.Instance.Convert(entity as IProperty); | 
				
			||||
			if (entity is IEvent) | 
				
			||||
				return CSharpAmbience.Instance.Convert(entity as IEvent); | 
				
			||||
			if (entity is IField) | 
				
			||||
				return CSharpAmbience.Instance.Convert(entity as IField); | 
				
			||||
			if (entity is IClass) | 
				
			||||
				return CSharpAmbience.Instance.Convert(entity as IClass); | 
				
			||||
			// unknown entity:
 | 
				
			||||
			return entity.ToString(); | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		public static string XmlDocumentationToText(string xmlDoc) | 
				
			||||
		{ | 
				
			||||
			System.Diagnostics.Debug.WriteLine(xmlDoc); | 
				
			||||
			StringBuilder b = new StringBuilder(); | 
				
			||||
			try { | 
				
			||||
				using (XmlTextReader reader = new XmlTextReader(new StringReader("<root>" + xmlDoc + "</root>"))) { | 
				
			||||
					reader.XmlResolver = null; | 
				
			||||
					while (reader.Read()) { | 
				
			||||
						switch (reader.NodeType) { | 
				
			||||
							case XmlNodeType.Text: | 
				
			||||
								b.Append(reader.Value); | 
				
			||||
								break; | 
				
			||||
							case XmlNodeType.Element: | 
				
			||||
								switch (reader.Name) { | 
				
			||||
									case "filterpriority": | 
				
			||||
										reader.Skip(); | 
				
			||||
										break; | 
				
			||||
									case "returns": | 
				
			||||
										b.AppendLine(); | 
				
			||||
										b.Append("Returns: "); | 
				
			||||
										break; | 
				
			||||
									case "param": | 
				
			||||
										b.AppendLine(); | 
				
			||||
										b.Append(reader.GetAttribute("name") + ": "); | 
				
			||||
										break; | 
				
			||||
									case "remarks": | 
				
			||||
										b.AppendLine(); | 
				
			||||
										b.Append("Remarks: "); | 
				
			||||
										break; | 
				
			||||
									case "see": | 
				
			||||
										if (reader.IsEmptyElement) { | 
				
			||||
											b.Append(reader.GetAttribute("cref")); | 
				
			||||
										} else { | 
				
			||||
											reader.MoveToContent(); | 
				
			||||
											if (reader.HasValue) { | 
				
			||||
												b.Append(reader.Value); | 
				
			||||
											} else { | 
				
			||||
												b.Append(reader.GetAttribute("cref")); | 
				
			||||
											} | 
				
			||||
										} | 
				
			||||
										break; | 
				
			||||
								} | 
				
			||||
								break; | 
				
			||||
						} | 
				
			||||
					} | 
				
			||||
				} | 
				
			||||
				return b.ToString(); | 
				
			||||
			} catch (XmlException) { | 
				
			||||
				return xmlDoc; | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,143 @@
				@@ -0,0 +1,143 @@
					 | 
				
			||||
// CSharp Editor Example with Code Completion
 | 
				
			||||
// Copyright (c) 2007, Daniel Grunwald
 | 
				
			||||
// All rights reserved.
 | 
				
			||||
// 
 | 
				
			||||
// Redistribution and use in source and binary forms, with or without modification, are
 | 
				
			||||
// permitted provided that the following conditions are met:
 | 
				
			||||
// 
 | 
				
			||||
// - Redistributions of source code must retain the above copyright notice, this list
 | 
				
			||||
//   of conditions and the following disclaimer.
 | 
				
			||||
// 
 | 
				
			||||
// - Redistributions in binary form must reproduce the above copyright notice, this list
 | 
				
			||||
//   of conditions and the following disclaimer in the documentation and/or other materials
 | 
				
			||||
//   provided with the distribution.
 | 
				
			||||
// 
 | 
				
			||||
// - Neither the name of the ICSharpCode team nor the names of its contributors may be used to
 | 
				
			||||
//   endorse or promote products derived from this software without specific prior written
 | 
				
			||||
//   permission.
 | 
				
			||||
// 
 | 
				
			||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &AS IS& AND ANY EXPRESS
 | 
				
			||||
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
				
			||||
// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 | 
				
			||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
				
			||||
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
				
			||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 | 
				
			||||
// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 | 
				
			||||
// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||
 | 
				
			||||
using System; | 
				
			||||
using System.Text; | 
				
			||||
using ICSharpCode.SharpDevelop.Dom; | 
				
			||||
using ICSharpCode.SharpDevelop.Dom.CSharp; | 
				
			||||
using TextEditor = ICSharpCode.TextEditor; | 
				
			||||
using NRefactoryResolver = ICSharpCode.SharpDevelop.Dom.NRefactoryResolver.NRefactoryResolver; | 
				
			||||
 | 
				
			||||
namespace CSharpEditor | 
				
			||||
{ | 
				
			||||
	sealed class ToolTipProvider | 
				
			||||
	{ | 
				
			||||
		MainForm mainForm; | 
				
			||||
		TextEditor.TextEditorControl editor; | 
				
			||||
		 | 
				
			||||
		private ToolTipProvider(MainForm mainForm, TextEditor.TextEditorControl editor) | 
				
			||||
		{ | 
				
			||||
			this.mainForm = mainForm; | 
				
			||||
			this.editor = editor; | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		public static void Attach(MainForm mainForm, TextEditor.TextEditorControl editor) | 
				
			||||
		{ | 
				
			||||
			ToolTipProvider tp = new ToolTipProvider(mainForm, editor); | 
				
			||||
			editor.ActiveTextAreaControl.TextArea.ToolTipRequest += tp.OnToolTipRequest; | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		void OnToolTipRequest(object sender, TextEditor.ToolTipRequestEventArgs e) | 
				
			||||
		{ | 
				
			||||
			if (e.InDocument && !e.ToolTipShown) { | 
				
			||||
				CSharpExpressionFinder expressionFinder = new CSharpExpressionFinder(mainForm.parseInformation); | 
				
			||||
				ExpressionResult expression = expressionFinder.FindFullExpression( | 
				
			||||
					editor.Text, | 
				
			||||
					editor.Document.PositionToOffset(e.LogicalPosition)); | 
				
			||||
				 | 
				
			||||
				TextEditor.TextArea textArea = editor.ActiveTextAreaControl.TextArea; | 
				
			||||
				NRefactoryResolver resolver = new NRefactoryResolver(mainForm.myProjectContent.Language); | 
				
			||||
				ResolveResult rr = resolver.Resolve(expression, | 
				
			||||
				                                    e.LogicalPosition.Y + 1, | 
				
			||||
				                                    e.LogicalPosition.X + 1, | 
				
			||||
				                                    mainForm.parseInformation, | 
				
			||||
				                                    textArea.MotherTextEditorControl.Text); | 
				
			||||
				string toolTipText = GetText(rr); | 
				
			||||
				if (toolTipText != null) { | 
				
			||||
					e.ShowToolTip(toolTipText); | 
				
			||||
				} | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		static string GetText(ResolveResult result) | 
				
			||||
		{ | 
				
			||||
			if (result == null) { | 
				
			||||
				return null; | 
				
			||||
			} | 
				
			||||
			if (result is MixedResolveResult) | 
				
			||||
				return GetText(((MixedResolveResult)result).PrimaryResult); | 
				
			||||
			IAmbience ambience = new CSharpAmbience(); | 
				
			||||
			ambience.ConversionFlags = ConversionFlags.StandardConversionFlags | ConversionFlags.ShowAccessibility; | 
				
			||||
			if (result is MemberResolveResult) { | 
				
			||||
				return GetMemberText(ambience, ((MemberResolveResult)result).ResolvedMember); | 
				
			||||
			} else if (result is LocalResolveResult) { | 
				
			||||
				LocalResolveResult rr = (LocalResolveResult)result; | 
				
			||||
				ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedTypeNames | 
				
			||||
					| ConversionFlags.ShowReturnType; | 
				
			||||
				StringBuilder b = new StringBuilder(); | 
				
			||||
				if (rr.IsParameter) | 
				
			||||
					b.Append("parameter "); | 
				
			||||
				else | 
				
			||||
					b.Append("local variable "); | 
				
			||||
				b.Append(ambience.Convert(rr.Field)); | 
				
			||||
				return b.ToString(); | 
				
			||||
			} else if (result is NamespaceResolveResult) { | 
				
			||||
				return "namespace " + ((NamespaceResolveResult)result).Name; | 
				
			||||
			} else if (result is TypeResolveResult) { | 
				
			||||
				IClass c = ((TypeResolveResult)result).ResolvedClass; | 
				
			||||
				if (c != null) | 
				
			||||
					return GetMemberText(ambience, c); | 
				
			||||
				else | 
				
			||||
					return ambience.Convert(result.ResolvedType); | 
				
			||||
			} else if (result is MethodResolveResult) { | 
				
			||||
				MethodResolveResult mrr = result as MethodResolveResult; | 
				
			||||
				IMethod m = mrr.GetMethodIfSingleOverload(); | 
				
			||||
				if (m != null) | 
				
			||||
					return GetMemberText(ambience, m); | 
				
			||||
				else | 
				
			||||
					return "Overload of " + ambience.Convert(mrr.ContainingType) + "." + mrr.Name; | 
				
			||||
			} else { | 
				
			||||
				return null; | 
				
			||||
			} | 
				
			||||
		} | 
				
			||||
		 | 
				
			||||
		static string GetMemberText(IAmbience ambience, IDecoration member) | 
				
			||||
		{ | 
				
			||||
			StringBuilder text = new StringBuilder(); | 
				
			||||
			if (member is IField) { | 
				
			||||
				text.Append(ambience.Convert(member as IField)); | 
				
			||||
			} else if (member is IProperty) { | 
				
			||||
				text.Append(ambience.Convert(member as IProperty)); | 
				
			||||
			} else if (member is IEvent) { | 
				
			||||
				text.Append(ambience.Convert(member as IEvent)); | 
				
			||||
			} else if (member is IMethod) { | 
				
			||||
				text.Append(ambience.Convert(member as IMethod)); | 
				
			||||
			} else if (member is IClass) { | 
				
			||||
				text.Append(ambience.Convert(member as IClass)); | 
				
			||||
			} else { | 
				
			||||
				text.Append("unknown member "); | 
				
			||||
				text.Append(member.ToString()); | 
				
			||||
			} | 
				
			||||
			string documentation = member.Documentation; | 
				
			||||
			if (documentation != null && documentation.Length > 0) { | 
				
			||||
				text.Append('\n'); | 
				
			||||
				text.Append(CodeCompletionData.XmlDocumentationToText(documentation)); | 
				
			||||
			} | 
				
			||||
			return text.ToString(); | 
				
			||||
		} | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue