Browse Source

Fixed some bugs in resolver; tooltip now uses ExpressionFinder and GetXmlDocumentation.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@74 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 21 years ago
parent
commit
334b0acb9c
  1. 141
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/ExpressionFinder.cs
  2. 123
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/Parser/ExpressionFinder.cs
  3. 5
      src/Main/Base/Project/Src/Dom/IExpressionFinder.cs
  4. 48
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs
  5. 107
      src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs

141
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/ExpressionFinder.cs

@ -5,7 +5,7 @@ using ICSharpCode.SharpDevelop.Dom; @@ -5,7 +5,7 @@ using ICSharpCode.SharpDevelop.Dom;
namespace CSharpBinding.Parser
{
/// <summary>
/// Description of ExpressionFinder.
/// Description of ExpressionFinder.
/// </summary>
public class ExpressionFinder : IExpressionFinder
{
@ -33,6 +33,117 @@ namespace CSharpBinding.Parser @@ -33,6 +33,117 @@ namespace CSharpBinding.Parser
return this.text.Substring(this.lastAccept + 1, offset - this.lastAccept);
}
public string FindFullExpression(string inText, int offset)
{
string expressionBeforeOffset = FindExpression(inText, offset);
if (expressionBeforeOffset == null || expressionBeforeOffset.Length == 0)
return null;
StringBuilder b = new StringBuilder(expressionBeforeOffset);
// append characters after expression
for (int i = offset + 1; i < inText.Length; ++i) {
char c = inText[i];
if (Char.IsLetterOrDigit(c)) {
if (Char.IsWhiteSpace(inText, i - 1))
break;
b.Append(c);
} else if (Char.IsWhiteSpace(c)) {
// ignore whitespace
} else if (c == '(' || c == '[') {
int otherBracket = SearchBracketForward(inText, i + 1, c, (c == '(') ? ')' : ']');
if (otherBracket < 0)
break;
b.Append(inText, i, otherBracket - i + 1);
break;
} else {
break;
}
}
return b.ToString();
}
#region SearchBracketForward
// like CSharpFormattingStrategy.SearchBracketForward, but operates on a string.
private int SearchBracketForward(string text, int offset, char openBracket, char closingBracket)
{
bool inString = false;
bool inChar = false;
bool verbatim = false;
bool lineComment = false;
bool blockComment = false;
if (offset < 0) return -1;
int brackets = 1;
for (; offset < text.Length; ++offset) {
char ch = text[offset];
switch (ch) {
case '\r':
case '\n':
lineComment = false;
inChar = false;
if (!verbatim) inString = false;
break;
case '/':
if (blockComment) {
if (offset > 0 && text[offset - 1] == '*') {
blockComment = false;
}
}
if (!inString && !inChar && offset + 1 < text.Length) {
if (!blockComment && text[offset + 1] == '/') {
lineComment = true;
}
if (!lineComment && text[offset + 1] == '*') {
blockComment = true;
}
}
break;
case '"':
if (!(inChar || lineComment || blockComment)) {
if (inString && verbatim) {
if (offset + 1 < text.Length && text[offset + 1] == '"') {
++offset; // skip escaped quote
inString = false; // let the string go on
} else {
verbatim = false;
}
} else if (!inString && offset > 0 && text[offset - 1] == '@') {
verbatim = true;
}
inString = !inString;
}
break;
case '\'':
if (!(inString || lineComment || blockComment)) {
inChar = !inChar;
}
break;
case '\\':
if ((inString && !verbatim) || inChar)
++offset; // skip next character
break;
default:
if (ch == openBracket) {
if (!(inString || inChar || lineComment || blockComment)) {
++brackets;
}
} else if (ch == closingBracket) {
if (!(inString || inChar || lineComment || blockComment)) {
--brackets;
if (brackets == 0) {
return offset;
}
}
}
break;
}
}
return -1;
}
#endregion
#region Comment Filter and 'inside string watcher'
int initialOffset;
public string FilterComments(string text, ref int offset)
@ -233,7 +344,7 @@ namespace CSharpBinding.Parser @@ -233,7 +344,7 @@ namespace CSharpBinding.Parser
void ReadNextToken()
{
char ch = GetNext();
curTokenType = Err;
if (ch == '\0') {
return;
@ -287,7 +398,7 @@ namespace CSharpBinding.Parser @@ -287,7 +398,7 @@ namespace CSharpBinding.Parser
}
}
}
break;
}
}
@ -389,7 +500,7 @@ namespace CSharpBinding.Parser @@ -389,7 +500,7 @@ namespace CSharpBinding.Parser
}
#endregion
#region finite state machine
#region finite state machine
readonly static int ERROR = 0;
readonly static int START = 1;
readonly static int DOT = 2;
@ -403,18 +514,18 @@ namespace CSharpBinding.Parser @@ -403,18 +514,18 @@ namespace CSharpBinding.Parser
readonly static int ACCEPT2 = 9;
readonly static string[] stateName = new string[] {
"ERROR",
"START",
"DOT",
"MORE",
"CURLY",
"CURLY2",
"CURLY3",
"ACCEPT",
"ACCEPTNOMORE",
"ERROR",
"START",
"DOT",
"MORE",
"CURLY",
"CURLY2",
"CURLY3",
"ACCEPT",
"ACCEPTNOMORE",
"ACCEPT2"
};
string GetStateName(int state)
{
return stateName[state];
@ -435,6 +546,6 @@ namespace CSharpBinding.Parser @@ -435,6 +546,6 @@ namespace CSharpBinding.Parser
/*ACCEPTNOMORE*/ { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR},
/*ACCEPT2*/ { ERROR, MORE, ERROR, ACCEPT, ACCEPT, ERROR, ERROR, ERROR, ERROR, ACCEPT},
};
#endregion
#endregion
}
}

123
src/AddIns/BackendBindings/VBNetBinding/Project/Src/Parser/ExpressionFinder.cs

@ -5,7 +5,7 @@ using ICSharpCode.SharpDevelop.Dom; @@ -5,7 +5,7 @@ using ICSharpCode.SharpDevelop.Dom;
namespace VBNetBinding.Parser
{
/// <summary>
/// Description of ExpressionFinder.
/// Description of ExpressionFinder.
/// </summary>
public class ExpressionFinder : IExpressionFinder
{
@ -24,7 +24,7 @@ namespace VBNetBinding.Parser @@ -24,7 +24,7 @@ namespace VBNetBinding.Parser
ReadNextToken();
//Console.WriteLine("cur state {0} got token {1}/{3} going to {2}", GetStateName(state), GetTokenName(curTokenType), GetStateName(stateTable[state, curTokenType]), curTokenType);
state = stateTable[state, curTokenType];
if (state == ACCEPT || state == ACCEPT2)
{
lastAccept = this.offset;
@ -36,8 +36,63 @@ namespace VBNetBinding.Parser @@ -36,8 +36,63 @@ namespace VBNetBinding.Parser
}
return this.text.Substring(this.lastAccept + 1, offset - this.lastAccept);
}
#region Comment Filter and 'inside string watcher'
public string FindFullExpression(string inText, int offset)
{
string expressionBeforeOffset = FindExpression(inText, offset);
if (expressionBeforeOffset == null || expressionBeforeOffset.Length == 0)
return null;
StringBuilder b = new StringBuilder(expressionBeforeOffset);
// append characters after expression
for (int i = offset + 1; i < inText.Length; ++i) {
char c = inText[i];
if (Char.IsLetterOrDigit(c)) {
if (Char.IsWhiteSpace(inText, i - 1))
break;
b.Append(c);
} else if (c == ' ') {
b.Append(c);
} else if (c == '(') {
int otherBracket = SearchBracketForward(inText, i + 1, '(', ')');
if (otherBracket < 0)
break;
b.Append(inText, i, otherBracket - i + 1);
break;
} else {
break;
}
}
return b.ToString();
}
// Like VBNetFormattingStrategy.SearchBracketForward, but operates on a string.
private int SearchBracketForward(string text, int offset, char openBracket, char closingBracket)
{
bool inString = false;
bool inComment = false;
int brackets = 1;
for (int i = offset; i < text.Length; ++i) {
char ch = text[i];
if (ch == '\n') {
inString = false;
inComment = false;
}
if (inComment) continue;
if (ch == '"') inString = !inString;
if (inString) continue;
if (ch == '\'') {
inComment = true;
} else if (ch == openBracket) {
++brackets;
} else if (ch == closingBracket) {
--brackets;
if (brackets == 0) return i;
}
}
return -1;
}
#region Comment Filter and 'inside string watcher'
int initialOffset;
public string FilterComments(string text, ref int offset)
{
@ -47,7 +102,7 @@ namespace VBNetBinding.Parser @@ -47,7 +102,7 @@ namespace VBNetBinding.Parser
while (curOffset <= initialOffset)
{
char ch = text[curOffset];
switch (ch)
{
case '@':
@ -88,10 +143,10 @@ namespace VBNetBinding.Parser @@ -88,10 +143,10 @@ namespace VBNetBinding.Parser
break;
}
}
return outText.ToString();
}
bool ReadToEOL(string text, ref int curOffset, ref int offset)
{
while (curOffset <= initialOffset)
@ -105,7 +160,7 @@ namespace VBNetBinding.Parser @@ -105,7 +160,7 @@ namespace VBNetBinding.Parser
}
return false;
}
bool ReadString(StringBuilder outText, string text, ref int curOffset)
{
while (curOffset <= initialOffset)
@ -119,7 +174,7 @@ namespace VBNetBinding.Parser @@ -119,7 +174,7 @@ namespace VBNetBinding.Parser
}
return false;
}
bool ReadVerbatimString(StringBuilder outText, string text, ref int curOffset)
{
while (curOffset <= initialOffset)
@ -140,7 +195,7 @@ namespace VBNetBinding.Parser @@ -140,7 +195,7 @@ namespace VBNetBinding.Parser
}
return false;
}
bool ReadMultiLineComment(string text, ref int curOffset, ref int offset)
{
while (curOffset <= initialOffset)
@ -159,12 +214,12 @@ namespace VBNetBinding.Parser @@ -159,12 +214,12 @@ namespace VBNetBinding.Parser
}
return false;
}
#endregion
#region mini backward lexer
#endregion
#region mini backward lexer
string text;
int offset;
char GetNext()
{
if (offset >= 0)
@ -173,7 +228,7 @@ namespace VBNetBinding.Parser @@ -173,7 +228,7 @@ namespace VBNetBinding.Parser
}
return '\0';
}
char Peek()
{
if (offset >= 0)
@ -182,12 +237,12 @@ namespace VBNetBinding.Parser @@ -182,12 +237,12 @@ namespace VBNetBinding.Parser
}
return '\0';
}
void UnGet()
{
++offset;
}
// tokens for our lexer
static int Err = 0;
static int Dot = 1;
@ -199,7 +254,7 @@ namespace VBNetBinding.Parser @@ -199,7 +254,7 @@ namespace VBNetBinding.Parser
static int Curly = 7;
static int Using = 8;
int curTokenType;
readonly static string[] tokenStateName = new string[] {
"Err", "Dot", "StrLit", "Ident", "New", "Bracket", "Paren", "Curly", "Using"
};
@ -207,11 +262,11 @@ namespace VBNetBinding.Parser @@ -207,11 +262,11 @@ namespace VBNetBinding.Parser
{
return tokenStateName[state];
}
void ReadNextToken()
{
char ch = GetNext();
curTokenType = Err;
if (ch == '\0' || ch == '\n' || ch == '\r')
{
@ -225,7 +280,7 @@ namespace VBNetBinding.Parser @@ -225,7 +280,7 @@ namespace VBNetBinding.Parser
return;
}
}
switch (ch)
{
case '}':
@ -279,7 +334,7 @@ namespace VBNetBinding.Parser @@ -279,7 +334,7 @@ namespace VBNetBinding.Parser
break;
}
}
bool ReadStringLiteral(char litStart)
{
while (true)
@ -299,7 +354,7 @@ namespace VBNetBinding.Parser @@ -299,7 +354,7 @@ namespace VBNetBinding.Parser
}
}
}
bool ReadBracket(char openBracket, char closingBracket)
{
int curlyBraceLevel = 0;
@ -317,7 +372,7 @@ namespace VBNetBinding.Parser @@ -317,7 +372,7 @@ namespace VBNetBinding.Parser
curlyBraceLevel++;
break;
}
while (parenthesisLevel != 0 || squareBracketLevel != 0 || curlyBraceLevel != 0)
{
char ch = GetNext();
@ -349,7 +404,7 @@ namespace VBNetBinding.Parser @@ -349,7 +404,7 @@ namespace VBNetBinding.Parser
}
return true;
}
string ReadIdentifier(char ch)
{
string identifier = ch.ToString();
@ -359,14 +414,14 @@ namespace VBNetBinding.Parser @@ -359,14 +414,14 @@ namespace VBNetBinding.Parser
}
return identifier;
}
bool IsIdentifierPart(char ch)
{
return Char.IsLetterOrDigit(ch) || ch == '_';
}
#endregion
#region finite state machine
#endregion
#region finite state machine
readonly static int ERROR = 0;
readonly static int START = 1;
readonly static int DOT = 2;
@ -374,11 +429,11 @@ namespace VBNetBinding.Parser @@ -374,11 +429,11 @@ namespace VBNetBinding.Parser
readonly static int CURLY = 4;
readonly static int CURLY2 = 5;
readonly static int CURLY3 = 6;
readonly static int ACCEPT = 7;
readonly static int ACCEPTNOMORE = 8;
readonly static int ACCEPT2 = 9;
readonly static string[] stateName = new string[] {
"ERROR",
"START",
@ -391,12 +446,12 @@ namespace VBNetBinding.Parser @@ -391,12 +446,12 @@ namespace VBNetBinding.Parser
"ACCEPTNOMORE",
"ACCEPT2"
};
string GetStateName(int state)
{
return stateName[state];
}
int state = 0;
int lastAccept = 0;
static int[,] stateTable = new int[,] {
@ -412,6 +467,6 @@ namespace VBNetBinding.Parser @@ -412,6 +467,6 @@ namespace VBNetBinding.Parser
/*ACCEPTNOMORE*/ { ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR},
/*ACCEPT2*/ { ERROR, MORE, ERROR, ACCEPT, ACCEPT, ERROR, ERROR, ERROR, ERROR},
};
#endregion
#endregion
}
}

5
src/Main/Base/Project/Src/Dom/IExpressionFinder.cs

@ -15,5 +15,10 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -15,5 +15,10 @@ namespace ICSharpCode.SharpDevelop.Dom
/// Finds an expression before the current offset.
/// </summary>
string FindExpression(string text, int offset);
/// <summary>
/// Finds an expression around the current offset.
/// </summary>
string FindFullExpression(string text, int offset);
}
}

48
src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs

@ -188,6 +188,8 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -188,6 +188,8 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
IReturnType FixType(IReturnType type)
{
if (type == null)
return null;
IClass returnClass = SearchType(type.FullyQualifiedName, callingClass, cu);
if (returnClass != null && returnClass.FullyQualifiedName != type.FullyQualifiedName)
return new ReturnType(returnClass.FullyQualifiedName);
@ -252,23 +254,20 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -252,23 +254,20 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
#region ResolveMethod
ResolveResult ResolveMethod(IReturnType type, string identifier)
{
if (type == null || type.PointerNestingLevel != 0) {
if (type == null || type.PointerNestingLevel != 0)
return null;
}
IClass curType;
if (type.ArrayDimensions != null && type.ArrayDimensions.Length > 0) {
if (type.ArrayDimensions != null && type.ArrayDimensions.Length > 0)
curType = SearchType("System.Array", null, null);
} else {
else
curType = SearchType(type.FullyQualifiedName, null, null);
if (curType == null) {
return null;
}
}
return ResolveMethod(curType, identifier);
}
ResolveResult ResolveMethod(IClass c, string identifier)
{
if (c == null)
return null;
foreach (IClass curType in c.ClassInheritanceTree) {
foreach (IMethod method in c.Methods) {
if (IsSameName(identifier, method.Name))
@ -340,6 +339,8 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -340,6 +339,8 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
IMember GetCurrentMember()
{
if (callingClass == null)
return null;
foreach (IProperty property in callingClass.Properties) {
if (property.BodyRegion != null && property.BodyRegion.IsInside(caretLine, caretColumn)) {
return property;
@ -407,15 +408,14 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -407,15 +408,14 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
curType = SearchType("System.Array", null, null);
} else {
curType = SearchType(type.FullyQualifiedName, null, null);
if (curType == null) {
return new ArrayList(1);
}
}
return SearchMethod(new ArrayList(), curType, memberName);
}
ArrayList SearchMethod(ArrayList methods, IClass curType, string memberName)
{
if (curType == null)
return methods;
bool isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(curType);
foreach (IMethod m in curType.Methods) {
@ -436,16 +436,18 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -436,16 +436,18 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
#region SearchIndexer
public ArrayList SearchIndexer(IReturnType type)
{
// TODO: indexer for arrays
IClass curType = SearchType(type.FullyQualifiedName, null, null);
if (curType != null) {
return SearchIndexer(new ArrayList(), curType);
}
return new ArrayList(1);
return SearchIndexer(new ArrayList(), curType);
}
ArrayList SearchIndexer(ArrayList indexer, IClass curType)
{
bool isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(curType);
if (curType == null)
return indexer;
bool isClassInInheritanceTree = false;
if (callingClass != null)
isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(curType);
foreach (IIndexer i in curType.Indexer) {
if (i.MustBeShown(callingClass, true, isClassInInheritanceTree) && !((i.Modifiers & ModifierEnum.Override) == ModifierEnum.Override)) {
indexer.Add(i);
@ -475,10 +477,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -475,10 +477,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
} else {
curType = SearchType(type.FullyQualifiedName, callingClass, cu);
}
if (curType == null)
return null;
else
return SearchMember(curType, memberName);
return SearchMember(curType, memberName);
}
public IMember GetMember(IReturnType type, string memberName)
@ -495,14 +494,13 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -495,14 +494,13 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
} else {
curType = SearchType(type.FullyQualifiedName, callingClass, cu);
}
if (curType == null)
return null;
else
return GetMember(curType, memberName);
return GetMember(curType, memberName);
}
public IReturnType SearchMember(IClass curType, string memberName)
{
if (curType == null)
return null;
bool isClassInInheritanceTree = false;
if (callingClass != null)
isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(curType);
@ -520,6 +518,8 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -520,6 +518,8 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
private IMember GetMember(IClass c, string memberName)
{
if (c == null)
return null;
bool isClassInInheritanceTree = false;
if (callingClass != null)
isClassInInheritanceTree = callingClass.IsTypeInInheritanceTree(c);

107
src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs

@ -10,6 +10,7 @@ using System.Diagnostics; @@ -10,6 +10,7 @@ using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui;
@ -523,53 +524,38 @@ namespace ICSharpCode.Core @@ -523,53 +524,38 @@ namespace ICSharpCode.Core
/// </summary>
static void TextAreaMouseMove(object sender, MouseEventArgs args)
{
TextArea textArea = (TextArea)sender;
Point mousepos = textArea.PointToClient(Control.MousePosition);
Rectangle viewRect = textArea.TextView.DrawingPosition;
if (viewRect.Contains(mousepos)) {
Point logicPos = textArea.TextView.GetLogicalPosition(mousepos.X - viewRect.Left,
mousepos.Y - viewRect.Top);
if (logicPos.Y >= 0 && logicPos.Y < textArea.Document.TotalNumberOfLines) {
IDocument doc = textArea.Document;
LineSegment seg = doc.GetLineSegment(logicPos.Y);
string line = doc.GetText(seg.Offset, seg.Length);
int startIndex = 0;
int length = 0;
string expression = String.Empty;
for(int index = 0; index < seg.Length; index++) {
char chr = line[index];
if ((Char.IsLetterOrDigit(chr) || chr == '_' || chr == '.') == false || // invalid character
(chr == '.' && logicPos.X <= index)) { // Start of sub-expression at the right side of cursor
// End of expresion...
if ((startIndex <= logicPos.X && logicPos.X <= index) && // Correct position
(startIndex != index)) { // Actually something
length = index - startIndex;
expression = line.Substring(startIndex, length);
break;
} else {
// Let's try next one...
startIndex = index + 1;
}
}
}
//Console.WriteLine("MouseMove@" + logicPos + ":" + expression);
if (expression != String.Empty) {
// Look if it is variable
try {
try {
TextArea textArea = (TextArea)sender;
Point mousepos = textArea.PointToClient(Control.MousePosition);
Rectangle viewRect = textArea.TextView.DrawingPosition;
if (viewRect.Contains(mousepos)) {
Point logicPos = textArea.TextView.GetLogicalPosition(mousepos.X - viewRect.Left,
mousepos.Y - viewRect.Top);
if (logicPos.Y >= 0 && logicPos.Y < textArea.Document.TotalNumberOfLines) {
IDocument doc = textArea.Document;
IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(textArea.MotherTextEditorControl.FileName);
LineSegment seg = doc.GetLineSegment(logicPos.Y);
int xPosition = Math.Min(seg.Length - 1, logicPos.X);
string textContent = doc.TextContent;
string expression = expressionFinder.FindFullExpression(textContent, seg.Offset + xPosition);
//Console.WriteLine("MouseMove@" + logicPos + ":" + expression);
if (expression != null && expression != String.Empty) {
// Look if it is variable
//value = selectedThread.LocalVariables[expresion].Value.ToString();
ResolveResult result = ParserService.Resolve(expression, logicPos.Y, startIndex, textArea.MotherTextEditorControl.FileName, doc.TextContent);
ResolveResult result = ParserService.Resolve(expression, logicPos.Y + 1, xPosition + 1, textArea.MotherTextEditorControl.FileName, textContent);
string value = GetText(result);
if (value != null) {
value = "expr: >" + expression + "<\n" + value;
textArea.SetToolTip(value);
}
} catch (Exception e) {
Console.Beep();
Console.WriteLine();
Console.WriteLine(e);
}
}
}
} catch (Exception e) {
Console.Beep();
Console.WriteLine();
Console.WriteLine(e);
}
}
@ -581,19 +567,7 @@ namespace ICSharpCode.Core @@ -581,19 +567,7 @@ namespace ICSharpCode.Core
ambience.ConversionFlags = ConversionFlags.StandardConversionFlags
| ConversionFlags.ShowAccessibility;
if (result is MemberResolveResult) {
MemberResolveResult rr = (MemberResolveResult)result;
IMember member = rr.ResolvedMember;
if (member is IIndexer)
return ambience.Convert(member as IIndexer);
if (member is IField)
return ambience.Convert(member as IField);
if (member is IProperty)
return ambience.Convert(member as IProperty);
if (member is IEvent)
return ambience.Convert(member as IEvent);
if (member is IMethod)
return ambience.Convert(member as IMethod);
return "unknown member " + member.ToString();
return GetText(ambience, ((MemberResolveResult)result).ResolvedMember);
} else if (result is LocalResolveResult) {
LocalResolveResult rr = (LocalResolveResult)result;
ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedNames
@ -606,7 +580,7 @@ namespace ICSharpCode.Core @@ -606,7 +580,7 @@ namespace ICSharpCode.Core
} else if (result is NamespaceResolveResult) {
return "namespace " + ((NamespaceResolveResult)result).Name;
} else if (result is TypeResolveResult) {
return ambience.Convert(((TypeResolveResult)result).ResolvedClass);
return GetText(ambience, ((TypeResolveResult)result).ResolvedClass);
} else {
if (result.ResolvedType == null)
return null;
@ -614,5 +588,32 @@ namespace ICSharpCode.Core @@ -614,5 +588,32 @@ namespace ICSharpCode.Core
return "expression of type " + ambience.Convert(result.ResolvedType);
}
}
static string GetText(IAmbience ambience, IDecoration member)
{
StringBuilder text = new StringBuilder();
if (member is IIndexer) {
text.Append(ambience.Convert(member as IIndexer));
} else 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 = ParserService.CurrentProjectContent.GetXmlDocumentation(member.DocumentationTag);
if (documentation != null && documentation.Length > 0) {
text.Append('\n');
text.Append(ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.CodeCompletionData.GetDocumentation(documentation));
}
return text.ToString();
}
}
}

Loading…
Cancel
Save