Browse Source

Add back ResolverService.Resolve(); and use it to implement tool tips.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
56ae9d8533
  1. 32
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs
  2. 2
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
  3. 10
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs
  4. 3
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/LineChangeInfo.cs
  5. 14
      src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Refactoring/TypeSystemAstBuilder.cs
  6. 12
      src/Main/Base/Project/Src/Services/AmbienceService/CSharpAmbience.cs
  7. 2
      src/Main/Base/Project/Src/Services/AmbienceService/IAmbience.cs
  8. 140
      src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs
  9. 8
      src/Main/Base/Project/Src/Services/Debugger/DefaultDebugger.cs
  10. 6
      src/Main/Base/Project/Src/Services/Debugger/IDebugger.cs
  11. 4
      src/Main/Base/Project/Src/Services/ParserService/IParser.cs
  12. 38
      src/Main/Base/Project/Src/Services/ParserService/ParserService.cs

32
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs

@ -3,9 +3,11 @@
using System; using System;
using System.IO; using System.IO;
using System.Threading;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Editor; using ICSharpCode.Editor;
using ICSharpCode.NRefactory.CSharp; using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.CSharp.Resolver;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Parser; using ICSharpCode.SharpDevelop.Parser;
@ -68,13 +70,16 @@ namespace CSharpBinding.Parser
bool fullParseInformationRequested) bool fullParseInformationRequested)
{ {
CSharpParser parser = new CSharpParser(); CSharpParser parser = new CSharpParser();
parser.GenerateTypeSystemMode = true; parser.GenerateTypeSystemMode = !fullParseInformationRequested;
CompilationUnit cu = parser.Parse(fileContent.CreateReader()); CompilationUnit cu = parser.Parse(fileContent.CreateReader());
TypeSystemConvertVisitor cv = new TypeSystemConvertVisitor(projectContent, fileName); TypeSystemConvertVisitor cv = new TypeSystemConvertVisitor(projectContent, fileName);
ParsedFile file = cv.Convert(cu); ParsedFile file = cv.Convert(cu);
return new ParseInformation(file, true); ParseInformation info = new ParseInformation(file, fullParseInformationRequested);
if (fullParseInformationRequested)
info.AddAnnotation(cu);
return info;
} }
/*void AddCommentTags(ICompilationUnit cu, System.Collections.Generic.List<ICSharpCode.NRefactory.Parser.TagComment> tagComments) /*void AddCommentTags(ICompilationUnit cu, System.Collections.Generic.List<ICSharpCode.NRefactory.Parser.TagComment> tagComments)
@ -86,5 +91,28 @@ namespace CSharpBinding.Parser
} }
} }
*/ */
public ResolveResult Resolve(ParseInformation parseInfo, TextLocation location, ITypeResolveContext context, CancellationToken cancellationToken)
{
CompilationUnit cu = parseInfo.Annotation<CompilationUnit>();
if (cu == null)
throw new ArgumentException("Parse info does not have CompilationUnit");
ParsedFile parsedFile = parseInfo.ParsedFile as ParsedFile;
if (parsedFile == null)
throw new ArgumentException("Parse info does not have a C# ParsedFile");
AstNode node = cu.GetResolveableNodeAt(location);
if (node == null) {
LoggingService.Debug("Could not find resolvable node at " + location);
return null;
}
LoggingService.DebugFormatted("Resolving '{0}' at {1}", node, location);
var navigator = new NodeListResolveVisitorNavigator(new[] { node });
var resolver = new CSharpResolver(context, cancellationToken);
ResolveVisitor visitor = new ResolveVisitor(resolver, parsedFile, navigator);
visitor.Scan(cu);
return visitor.GetResolveResult(node);
}
} }
} }

2
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs

@ -118,7 +118,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
} else { } else {
this.errorPainter.UpdateErrors(); this.errorPainter.UpdateErrors();
} }
changeWatcher.Initialize(this.Document); changeWatcher.Initialize(this.Document, value);
FetchParseInformation(); FetchParseInformation();
} }

10
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs

@ -9,6 +9,7 @@ using System.Linq;
using ICSharpCode.AvalonEdit.AddIn.MyersDiff; using ICSharpCode.AvalonEdit.AddIn.MyersDiff;
using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Utils; using ICSharpCode.AvalonEdit.Utils;
using ICSharpCode.Core;
using ICSharpCode.Editor; using ICSharpCode.Editor;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor;
@ -24,6 +25,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
IDocument baseDocument; IDocument baseDocument;
IDocumentVersionProvider usedProvider; IDocumentVersionProvider usedProvider;
IDisposable watcher; IDisposable watcher;
FileName fileName;
public event EventHandler ChangeOccurred; public event EventHandler ChangeOccurred;
@ -39,19 +41,19 @@ namespace ICSharpCode.AvalonEdit.AddIn
return changeList[lineNumber]; return changeList[lineNumber];
} }
public void Initialize(IDocument document) public void Initialize(IDocument document, FileName fileName)
{ {
if (changeList != null && changeList.Any()) if (changeList != null && changeList.Any())
return; return;
this.document = document; this.document = document;
this.fileName = fileName;
this.textDocument = (TextDocument)document.GetService(typeof(TextDocument)); this.textDocument = (TextDocument)document.GetService(typeof(TextDocument));
this.changeList = new CompressingTreeList<LineChangeInfo>((x, y) => x.Equals(y)); this.changeList = new CompressingTreeList<LineChangeInfo>((x, y) => x.Equals(y));
InitializeBaseDocument(); InitializeBaseDocument();
if (usedProvider != null) { if (usedProvider != null) {
string fileName = ((ITextEditor)document.GetService(typeof(ITextEditor))).FileName;
watcher = usedProvider.WatchBaseVersionChanges(fileName, HandleBaseVersionChanges); watcher = usedProvider.WatchBaseVersionChanges(fileName, HandleBaseVersionChanges);
} }
@ -140,8 +142,6 @@ namespace ICSharpCode.AvalonEdit.AddIn
Stream GetBaseVersion() Stream GetBaseVersion()
{ {
string fileName = ((ITextEditor)document.GetService(typeof(ITextEditor))).FileName;
foreach (IDocumentVersionProvider provider in VersioningServices.Instance.DocumentVersionProviders) { foreach (IDocumentVersionProvider provider in VersioningServices.Instance.DocumentVersionProviders) {
var result = provider.OpenBaseVersion(fileName); var result = provider.OpenBaseVersion(fileName);
if (result != null) { if (result != null) {
@ -153,7 +153,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
return null; return null;
} }
void UndoStackPropertyChanged(object sender, PropertyChangedEventArgs e) void UndoStackPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
if (e.PropertyName == "IsOriginalFile" && textDocument.UndoStack.IsOriginalFile) if (e.PropertyName == "IsOriginalFile" && textDocument.UndoStack.IsOriginalFile)
SetupInitialFileState(true); SetupInitialFileState(true);

3
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/LineChangeInfo.cs

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using ICSharpCode.Core;
using ICSharpCode.Editor; using ICSharpCode.Editor;
using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor;
@ -16,7 +17,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
/// Pass 0 to get the changes before the first line. /// Pass 0 to get the changes before the first line.
/// </summary> /// </summary>
LineChangeInfo GetChange(int lineNumber); LineChangeInfo GetChange(int lineNumber);
void Initialize(IDocument document); void Initialize(IDocument document, FileName fileName);
string GetOldVersionFromLine(int lineNumber, out int newStartLine, out bool added); string GetOldVersionFromLine(int lineNumber, out int newStartLine, out bool added);
bool GetNewVersionFromLine(int lineNumber, out int offset, out int length); bool GetNewVersionFromLine(int lineNumber, out int offset, out int length);
IDocument CurrentDocument { get; } IDocument CurrentDocument { get; }

14
src/Libraries/NRefactory/ICSharpCode.NRefactory/CSharp/Refactoring/TypeSystemAstBuilder.cs

@ -671,5 +671,19 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
return c; return c;
} }
#endregion #endregion
#region Convert Variable
public VariableDeclarationStatement ConvertVariable(IVariable v)
{
VariableDeclarationStatement decl = new VariableDeclarationStatement();
decl.Modifiers = v.IsConst ? Modifiers.Const : Modifiers.None;
decl.Type = ConvertType(v.Type.Resolve(context));
Expression initializer = null;
if (v.IsConst)
initializer = ConvertConstantValue(v.ConstantValue);
decl.Variables.Add(new VariableInitializer(v.Name, initializer));
return decl;
}
#endregion
} }
} }

12
src/Main/Base/Project/Src/Services/AmbienceService/CSharpAmbience.cs

@ -30,6 +30,18 @@ namespace ICSharpCode.SharpDevelop
} }
} }
public string ConvertVariable(IVariable v)
{
using (var ctx = ParserService.CurrentTypeResolveContext.Synchronize()) {
TypeSystemAstBuilder astBuilder = new TypeSystemAstBuilder(ctx);
AstNode astNode = astBuilder.ConvertVariable(v);
CSharpFormattingOptions formatting = new CSharpFormattingOptions();
StringWriter writer = new StringWriter();
astNode.AcceptVisitor(new OutputVisitor(writer, formatting), null);
return writer.ToString();
}
}
public string ConvertType(IType type) public string ConvertType(IType type)
{ {
using (var ctx = ParserService.CurrentTypeResolveContext.Synchronize()) { using (var ctx = ParserService.CurrentTypeResolveContext.Synchronize()) {

2
src/Main/Base/Project/Src/Services/AmbienceService/IAmbience.cs

@ -83,8 +83,10 @@ namespace ICSharpCode.SharpDevelop
string ConvertEntity(IEntity e); string ConvertEntity(IEntity e);
string ConvertType(IType type); string ConvertType(IType type);
string ConvertVariable(IVariable variable);
string WrapAttribute(string attribute); string WrapAttribute(string attribute);
string WrapComment(string comment); string WrapComment(string comment);
} }
} }

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

@ -4,16 +4,19 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Text; using System.Text;
using System.Windows; using System.Windows;
using System.Windows.Forms; using System.Windows.Forms;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Editor; using ICSharpCode.Editor;
using ICSharpCode.NRefactory; using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.CSharp.Resolver;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Bookmarks;
using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Parser;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
using Mono.Cecil; using Mono.Cecil;
@ -298,70 +301,39 @@ namespace ICSharpCode.SharpDevelop.Debugging
/// </summary> /// </summary>
internal static void HandleToolTipRequest(ToolTipRequestEventArgs e) internal static void HandleToolTipRequest(ToolTipRequestEventArgs e)
{ {
/*
if (!e.InDocument) if (!e.InDocument)
return; return;
Location logicPos = e.LogicalPosition; TextLocation logicPos = e.LogicalPosition;
var doc = e.Editor.Document; IDocument document = e.Editor.Document;
FileName fileName = e.Editor.FileName; FileName fileName = e.Editor.FileName;
IExpressionFinder expressionFinder = ParserService.GetExpressionFinder(fileName); // Look if it is variable
if (expressionFinder == null) ResolveResult result = ParserService.Resolve(fileName, logicPos, document);
return; bool debuggerCanShowValue;
string toolTipText = GetText(e, result, out debuggerCanShowValue);
var currentLine = doc.GetLineByNumber(logicPos.Y); if (toolTipText != null) {
if (logicPos.X > currentLine.Length) if (debuggerCanShowValue && currentDebugger != null) {
return; object toolTip = currentDebugger.GetTooltipControl(e, result);
if (toolTip != null)
string textContent = doc.Text; e.SetToolTip(toolTip);
ExpressionResult expressionResult = expressionFinder.FindFullExpression(textContent, doc.PositionToOffset(logicPos.Line, logicPos.Column)); else
string expression = (expressionResult.Expression ?? "").Trim();
if (expression.Length > 0) {
// Look if it is variable
ResolveResult result = ParserService.Resolve(expressionResult, logicPos.Y, logicPos.X, fileName, textContent);
bool debuggerCanShowValue;
string toolTipText = GetText(result, expression, out debuggerCanShowValue);
if (Control.ModifierKeys == Keys.Control) {
toolTipText = "expr: " + expressionResult.ToString() + "\n" + toolTipText;
debuggerCanShowValue = false;
}
if (toolTipText != null) {
if (debuggerCanShowValue && currentDebugger != null) {
object toolTip = currentDebugger.GetTooltipControl(e.LogicalPosition, expressionResult.Expression);
if (toolTip != null)
e.SetToolTip(toolTip);
else
e.SetToolTip(toolTipText);
} else {
e.SetToolTip(toolTipText); e.SetToolTip(toolTipText);
} } else {
} e.SetToolTip(toolTipText);
} else {
#if DEBUG
if (Control.ModifierKeys == Keys.Control) {
e.SetToolTip("no expr: " + expressionResult.ToString());
} }
#endif }
}*/
} }
/* static string GetText(ToolTipRequestEventArgs e, ResolveResult result, out bool debuggerCanShowValue)
static string GetText(ResolveResult result, string expression, out bool debuggerCanShowValue)
{ {
debuggerCanShowValue = false; debuggerCanShowValue = false;
if (result == null) { if (result == null)
// when pressing control, show the expression even when it could not be resolved return null;
return (Control.ModifierKeys == Keys.Control) ? "" : null;
}
if (result is MixedResolveResult)
return GetText(((MixedResolveResult)result).PrimaryResult, expression, out debuggerCanShowValue);
else if (result is DelegateCallResolveResult)
return GetText(((DelegateCallResolveResult)result).Target, expression, out debuggerCanShowValue);
IAmbience ambience = AmbienceService.GetCurrentAmbience(); IAmbience ambience = AmbienceService.GetCurrentAmbience();
ambience.ConversionFlags = ConversionFlags.StandardConversionFlags | ConversionFlags.UseFullyQualifiedMemberNames; ambience.ConversionFlags = ConversionFlags.StandardConversionFlags | ConversionFlags.UseFullyQualifiedMemberNames;
if (result is MemberResolveResult) { if (result is MemberResolveResult) {
return GetMemberText(ambience, ((MemberResolveResult)result).ResolvedMember, expression, out debuggerCanShowValue); return GetMemberText(ambience, ((MemberResolveResult)result).Member, e, result, out debuggerCanShowValue);
} else if (result is LocalResolveResult) { } else if (result is LocalResolveResult) {
LocalResolveResult rr = (LocalResolveResult)result; LocalResolveResult rr = (LocalResolveResult)result;
ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedTypeNames ambience.ConversionFlags = ConversionFlags.UseFullyQualifiedTypeNames
@ -371,9 +343,9 @@ namespace ICSharpCode.SharpDevelop.Debugging
b.Append("parameter "); b.Append("parameter ");
else else
b.Append("local variable "); b.Append("local variable ");
b.Append(ambience.Convert(rr.Field)); b.Append(ambience.ConvertVariable(rr.Variable));
if (currentDebugger != null) { if (!rr.IsCompileTimeConstant && currentDebugger != null) {
string currentValue = currentDebugger.GetValueAsString(rr.VariableName); string currentValue = currentDebugger.GetValueAsString(e, rr);
if (currentValue != null) { if (currentValue != null) {
debuggerCanShowValue = true; debuggerCanShowValue = true;
b.Append(" = "); b.Append(" = ");
@ -384,72 +356,56 @@ namespace ICSharpCode.SharpDevelop.Debugging
} }
return b.ToString(); return b.ToString();
} else if (result is NamespaceResolveResult) { } else if (result is NamespaceResolveResult) {
return "namespace " + ((NamespaceResolveResult)result).Name; return "namespace " + ((NamespaceResolveResult)result).NamespaceName;
} else if (result is TypeResolveResult) { } else if (result is TypeResolveResult) {
IClass c = ((TypeResolveResult)result).ResolvedClass; ITypeDefinition c = result.Type.GetDefinition();
if (c != null) if (c != null)
return GetMemberText(ambience, c, expression, out debuggerCanShowValue); return GetMemberText(ambience, c, e, result, out debuggerCanShowValue);
else else
return ambience.Convert(result.ResolvedType); return ambience.ConvertType(result.Type);
} else if (result is MethodGroupResolveResult) { } else if (result is MethodGroupResolveResult) {
MethodGroupResolveResult mrr = result as MethodGroupResolveResult; MethodGroupResolveResult mrr = result as MethodGroupResolveResult;
IMethod m = mrr.GetMethodIfSingleOverload(); if (mrr.Methods.Count() == 1)
IMethod m2 = mrr.GetMethodWithEmptyParameterList(); return GetMemberText(ambience, mrr.Methods.Single(), e, result, out debuggerCanShowValue);
if (m != null)
return GetMemberText(ambience, m, expression, out debuggerCanShowValue);
else if (ambience is VBNetAmbience && m2 != null)
return GetMemberText(ambience, m2, expression, out debuggerCanShowValue);
else else
return "Overload of " + ambience.Convert(mrr.ContainingType) + "." + mrr.Name; return "Overload of " + ambience.ConvertType(mrr.TargetType) + "." + mrr.MethodName;
} else { } else {
#if DEBUG
if (Control.ModifierKeys == Keys.Control) { if (Control.ModifierKeys == Keys.Control) {
if (result.ResolvedType != null) return result.ToString();
return "expression of type " + ambience.Convert(result.ResolvedType);
else
return "ResolveResult without ResolvedType";
} else {
return null;
} }
#endif
return null;
} }
} }
static string GetMemberText(IAmbience ambience, IEntity member, string expression, out bool debuggerCanShowValue) static string GetMemberText(IAmbience ambience, IEntity member, ToolTipRequestEventArgs e, ResolveResult result, out bool debuggerCanShowValue)
{ {
bool tryDisplayValue = false; bool tryDisplayValue = false;
debuggerCanShowValue = false; debuggerCanShowValue = false;
StringBuilder text = new StringBuilder(); StringBuilder text = new StringBuilder();
if (member is IField) { text.Append(ambience.ConvertEntity(member));
text.Append(ambience.Convert(member as IField)); tryDisplayValue = ((member is IField && !((IField)member).IsConst) || member is IProperty);
tryDisplayValue = true;
} else if (member is IProperty) {
text.Append(ambience.Convert(member as IProperty));
tryDisplayValue = true;
} 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());
}
if (tryDisplayValue && currentDebugger != null) { if (tryDisplayValue && currentDebugger != null) {
LoggingService.Info("asking debugger for value of '" + expression + "'"); LoggingService.Info("asking debugger for value of '" + result + "'");
string currentValue = currentDebugger.GetValueAsString(expression); string currentValue = currentDebugger.GetValueAsString(e, result);
if (currentValue != null) { if (currentValue != null) {
debuggerCanShowValue = true; debuggerCanShowValue = true;
text.Append(" = "); text.Append(" = ");
if (currentValue.Length > 256)
currentValue = currentValue.Substring(0, 256) + "...";
text.Append(currentValue); text.Append(currentValue);
} }
} }
string documentation = member.Documentation; string documentation = member.Documentation;
if (documentation != null && documentation.Length > 0) { if (documentation != null && documentation.Length > 0) {
text.Append('\n'); text.Append('\n');
text.Append(ICSharpCode.SharpDevelop.Editor.CodeCompletion.CodeCompletionItem.ConvertDocumentation(documentation)); text.Append(documentation);
//text.Append(ICSharpCode.SharpDevelop.Editor.CodeCompletion.CodeCompletionItem.ConvertDocumentation(documentation));
} }
return text.ToString(); return text.ToString();
}*/ }
#endregion #endregion
} }

8
src/Main/Base/Project/Src/Services/Debugger/DefaultDebugger.cs

@ -3,8 +3,8 @@
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using ICSharpCode.Editor; using ICSharpCode.NRefactory.CSharp.Resolver;
using ICSharpCode.NRefactory; using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
@ -124,7 +124,7 @@ namespace ICSharpCode.SharpDevelop.Debugging
/// <summary> /// <summary>
/// Gets the current value of the variable as string that can be displayed in tooltips. /// Gets the current value of the variable as string that can be displayed in tooltips.
/// </summary> /// </summary>
public string GetValueAsString(string variable) public string GetValueAsString(ToolTipRequestEventArgs e, ResolveResult expression)
{ {
return null; return null;
} }
@ -133,7 +133,7 @@ namespace ICSharpCode.SharpDevelop.Debugging
/// Gets the tooltip control that shows the value of given variable. /// Gets the tooltip control that shows the value of given variable.
/// Return null if no tooltip is available. /// Return null if no tooltip is available.
/// </summary> /// </summary>
public object GetTooltipControl(TextLocation logicalPosition, string variable) public object GetTooltipControl(ToolTipRequestEventArgs e, ResolveResult expression)
{ {
return null; return null;
} }

6
src/Main/Base/Project/Src/Services/Debugger/IDebugger.cs

@ -5,6 +5,8 @@ using System;
using System.Diagnostics; using System.Diagnostics;
using ICSharpCode.Editor; using ICSharpCode.Editor;
using ICSharpCode.NRefactory; using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.CSharp.Resolver;
using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Debugging namespace ICSharpCode.SharpDevelop.Debugging
@ -76,13 +78,13 @@ namespace ICSharpCode.SharpDevelop.Debugging
/// <summary> /// <summary>
/// Gets the current value of the variable as string that can be displayed in tooltips. /// Gets the current value of the variable as string that can be displayed in tooltips.
/// </summary> /// </summary>
string GetValueAsString(string variable); string GetValueAsString(ToolTipRequestEventArgs e, ResolveResult expression);
/// <summary> /// <summary>
/// Gets the tooltip control that shows the value of given variable. /// Gets the tooltip control that shows the value of given variable.
/// Return null if no tooltip is available. /// Return null if no tooltip is available.
/// </summary> /// </summary>
object GetTooltipControl(TextLocation logicalPosition, string variable); object GetTooltipControl(ToolTipRequestEventArgs e, ResolveResult expression);
/// <summary> /// <summary>
/// Queries the debugger whether it is possible to set the instruction pointer to a given position. /// Queries the debugger whether it is possible to set the instruction pointer to a given position.

4
src/Main/Base/Project/Src/Services/ParserService/IParser.cs

@ -1,8 +1,10 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) // Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System.Threading;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Editor; using ICSharpCode.Editor;
using ICSharpCode.NRefactory.CSharp.Resolver;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor;
using System; using System;
@ -49,6 +51,6 @@ namespace ICSharpCode.SharpDevelop.Project
ParseInformation Parse(IProjectContent projectContent, FileName fileName, ITextSource fileContent, ParseInformation Parse(IProjectContent projectContent, FileName fileName, ITextSource fileContent,
bool fullParseInformationRequested); bool fullParseInformationRequested);
//IResolver CreateResolver(); ResolveResult Resolve(ParseInformation parseInfo, TextLocation location, ITypeResolveContext context, CancellationToken cancellationToken);
} }
} }

38
src/Main/Base/Project/Src/Services/ParserService/ParserService.cs

@ -2,16 +2,17 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Windows.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Threading;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Editor; using ICSharpCode.Editor;
using ICSharpCode.NRefactory.CSharp.Resolver;
using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem.Implementation; using ICSharpCode.NRefactory.TypeSystem.Implementation;
using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor;
@ -455,17 +456,6 @@ namespace ICSharpCode.SharpDevelop.Parser
// Don't bother reading the file if this FileEntry was already disposed. // Don't bother reading the file if this FileEntry was already disposed.
if (this.disposed) if (this.disposed)
return; return;
} }
string fileAsString; string fileAsString;
try { try {
@ -536,6 +526,9 @@ namespace ICSharpCode.SharpDevelop.Parser
} }
if (newParseInfo[i] == null) if (newParseInfo[i] == null)
throw new NullReferenceException(parser.GetType().Name + ".Parse() returned null"); throw new NullReferenceException(parser.GetType().Name + ".Parse() returned null");
if (fullParseInformationRequested && !newParseInfo[i].IsFullParseInformation)
throw new InvalidOperationException(parser.GetType().Name + ".Parse() did not return full parse info as requested.");
newUnits[i] = newParseInfo[i].ParsedFile; newUnits[i] = newParseInfo[i].ParsedFile;
if (i == 0 || pc == parentProjectContent) { if (i == 0 || pc == parentProjectContent) {
resultParseInfo = newParseInfo[i]; resultParseInfo = newParseInfo[i];
@ -1075,5 +1068,24 @@ namespace ICSharpCode.SharpDevelop.Parser
entry.Clear(); entry.Clear();
} }
#endregion #endregion
public static ResolveResult Resolve(FileName fileName, TextLocation location, ITextSource fileContent = null,
CancellationToken cancellationToken = default(CancellationToken))
{
var entry = GetFileEntry(fileName, true);
if (entry.parser == null)
return null;
var parseInfo = entry.Parse(fileContent);
if (parseInfo == null)
return null;
IProject project = GetProject(parseInfo.ProjectContent);
var context = project != null ? project.TypeResolveContext : GetDefaultTypeResolveContext();
ResolveResult rr;
using (var ctx = context.Synchronize()) {
rr = entry.parser.Resolve(parseInfo, location, ctx, cancellationToken);
}
LoggingService.Debug("Resolved " + location + " to " + rr);
return rr;
}
} }
} }

Loading…
Cancel
Save