Browse Source

implemented SD-631 for VB .NET

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6329 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Siegfried Pammer 16 years ago
parent
commit
c89b7a5e29
  1. 5
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs
  2. 31
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs
  3. 2
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.atg
  4. 4
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.cs
  5. 3
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Parser.cs
  6. 1
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/PushParser.frame
  7. 4
      src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionBinding.cs
  8. 13
      src/Main/Base/Project/Src/Editor/CodeCompletion/IInsightWindowHandler.cs
  9. 60
      src/Main/Base/Project/Src/Editor/CodeCompletion/MethodInsightItem.cs
  10. 1
      src/Main/Base/Project/Src/Editor/CodeCompletion/MethodInsightProvider.cs
  11. 18
      src/Main/Base/Project/Src/Editor/CodeCompletion/NRefactoryInsightWindowHandler.cs

5
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs

@ -45,8 +45,11 @@ namespace CSharpBinding
return true; return true;
}*/ }*/
} else if (ch == ',' && CodeCompletionOptions.InsightRefreshOnComma && CodeCompletionOptions.InsightEnabled) { } else if (ch == ',' && CodeCompletionOptions.InsightRefreshOnComma && CodeCompletionOptions.InsightEnabled) {
if (insightHandler.InsightRefreshOnComma(editor, ch)) IInsightWindow insightWindow;
if (insightHandler.InsightRefreshOnComma(editor, ch, out insightWindow)) {
insightHandler.HighlightParameter(insightWindow, -1); // disable highlighting
return CodeCompletionKeyPressResult.Completed; return CodeCompletionKeyPressResult.Completed;
}
} else if(ch == '=') { } else if(ch == '=') {
var curLine = editor.Document.GetLineForOffset(cursor); var curLine = editor.Document.GetLineForOffset(cursor);
string documentText = editor.Document.Text; string documentText = editor.Document.Text;

31
src/AddIns/BackendBindings/VBNetBinding/Project/Src/VBNetCompletionBinding.cs

@ -63,14 +63,24 @@ namespace ICSharpCode.VBNetBinding
case '(': case '(':
if (CodeCompletionOptions.InsightEnabled) { if (CodeCompletionOptions.InsightEnabled) {
IInsightWindow insightWindow = editor.ShowInsightWindow(new MethodInsightProvider().ProvideInsight(editor)); IInsightWindow insightWindow = editor.ShowInsightWindow(new MethodInsightProvider().ProvideInsight(editor));
if (insightWindow != null) if (insightWindow != null) {
insightHandler.InitializeOpenedInsightWindow(editor, insightWindow); insightHandler.InitializeOpenedInsightWindow(editor, insightWindow);
insightHandler.HighlightParameter(insightWindow, 0);
}
return CodeCompletionKeyPressResult.Completed; return CodeCompletionKeyPressResult.Completed;
} }
break; break;
case ',': case ',':
if (CodeCompletionOptions.InsightRefreshOnComma && CodeCompletionOptions.InsightEnabled && insightHandler.InsightRefreshOnComma(editor, ch)) if (CodeCompletionOptions.InsightRefreshOnComma && CodeCompletionOptions.InsightEnabled) {
return CodeCompletionKeyPressResult.Completed; IInsightWindow insightWindow;
editor.Document.Insert(editor.Caret.Offset, ",");
if (insightHandler.InsightRefreshOnComma(editor, ch, out insightWindow)) {
if (insightWindow != null) {
insightHandler.HighlightParameter(insightWindow, GetArgumentIndex(editor) + 1);
}
return CodeCompletionKeyPressResult.EatKey;
}
}
break; break;
case '\n': case '\n':
TryDeclarationTypeInference(editor, editor.Document.GetLineForOffset(editor.Caret.Offset)); TryDeclarationTypeInference(editor, editor.Document.GetLineForOffset(editor.Caret.Offset));
@ -126,6 +136,21 @@ namespace ICSharpCode.VBNetBinding
return CodeCompletionKeyPressResult.None; return CodeCompletionKeyPressResult.None;
} }
static int GetArgumentIndex(ITextEditor editor)
{
ILexer lexer = ParserFactory.CreateLexer(SupportedLanguage.VBNet, editor.Document.CreateReader());
ExpressionFinder ef = new ExpressionFinder();
Token t = lexer.NextToken();
while (t.Kind != Tokens.EOF && t.EndLocation < editor.Caret.Position) {
ef.InformToken(t);
t = lexer.NextToken();
}
return ef.ActiveArgument;
}
bool IsTypeCharacter(char ch, char prevChar) bool IsTypeCharacter(char ch, char prevChar)
{ {
ch = char.ToUpperInvariant(ch); ch = char.ToUpperInvariant(ch);

2
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.atg

@ -1182,7 +1182,7 @@ InvocationStatement =
. .
ArgumentList = ArgumentList =
Expression { "," [ Expression ] } (. activeArgument = 0; .) Expression { "," (. activeArgument++; .) [ Expression ] }
| "," [ Expression ] { "," [ Expression ] } | "," [ Expression ] { "," [ Expression ] }
. .

4
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/ExpressionFinder.cs

@ -129,6 +129,10 @@ namespace ICSharpCode.NRefactory.Parser.VB
get { return isMissingModifier; } get { return isMissingModifier; }
} }
public int ActiveArgument {
get { return activeArgument; }
}
public List<Token> Errors { public List<Token> Errors {
get { return errors; } get { return errors; }
} }

3
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Parser.cs

@ -1440,6 +1440,7 @@ partial class ExpressionFinder {
bool identifierExpected = false; bool identifierExpected = false;
bool nextTokenIsStartOfImportsOrAccessExpression = false; bool nextTokenIsStartOfImportsOrAccessExpression = false;
bool isMissingModifier = false; bool isMissingModifier = false;
int activeArgument = 0;
List<Token> errors = new List<Token>(); List<Token> errors = new List<Token>();
public ExpressionFinder() public ExpressionFinder()
@ -1859,6 +1860,7 @@ partial class ExpressionFinder {
case 44: { case 44: {
if (la == null) { currentState = 44; break; } if (la == null) { currentState = 44; break; }
if (set[22].Get(la.kind)) { if (set[22].Get(la.kind)) {
activeArgument = 0;
goto case 418; goto case 418;
} else { } else {
if (la.kind == 22) { if (la.kind == 22) {
@ -5639,6 +5641,7 @@ partial class ExpressionFinder {
} }
} }
case 420: { case 420: {
activeArgument++;
nextTokenIsPotentialStartOfExpression = true; nextTokenIsPotentialStartOfExpression = true;
goto case 421; goto case 421;
} }

1
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/PushParser.frame

@ -40,6 +40,7 @@ partial class ExpressionFinder {
bool identifierExpected = false; bool identifierExpected = false;
bool nextTokenIsStartOfImportsOrAccessExpression = false; bool nextTokenIsStartOfImportsOrAccessExpression = false;
bool isMissingModifier = false; bool isMissingModifier = false;
int activeArgument = 0;
List<Token> errors = new List<Token>(); List<Token> errors = new List<Token>();
public ExpressionFinder() public ExpressionFinder()

4
src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionBinding.cs

@ -175,8 +175,10 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
case '(': case '(':
if (enableMethodInsight && CodeCompletionOptions.InsightEnabled) { if (enableMethodInsight && CodeCompletionOptions.InsightEnabled) {
IInsightWindow insightWindow = editor.ShowInsightWindow(new MethodInsightProvider().ProvideInsight(editor)); IInsightWindow insightWindow = editor.ShowInsightWindow(new MethodInsightProvider().ProvideInsight(editor));
if (insightWindow != null) if (insightWindow != null) {
insightHandler.InitializeOpenedInsightWindow(editor, insightWindow); insightHandler.InitializeOpenedInsightWindow(editor, insightWindow);
insightHandler.HighlightParameter(insightWindow, -1); // disable highlighting
}
return CodeCompletionKeyPressResult.Completed; return CodeCompletionKeyPressResult.Completed;
} }
break; break;

13
src/Main/Base/Project/Src/Editor/CodeCompletion/IInsightWindowHandler.cs

@ -6,22 +6,13 @@
// </file> // </file>
using System; using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.Parser;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver;
using CSTokens = ICSharpCode.NRefactory.Parser.CSharp.Tokens;
using VBTokens = ICSharpCode.NRefactory.Parser.VB.Tokens;
namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
{ {
public interface IInsightWindowHandler public interface IInsightWindowHandler
{ {
void InitializeOpenedInsightWindow(ITextEditor editor, IInsightWindow insightWindow); void InitializeOpenedInsightWindow(ITextEditor editor, IInsightWindow insightWindow);
bool InsightRefreshOnComma(ITextEditor editor, char ch); bool InsightRefreshOnComma(ITextEditor editor, char ch, out IInsightWindow insightWindow);
void HighlightParameter(IInsightWindow window, int index);
} }
} }

60
src/Main/Base/Project/Src/Editor/CodeCompletion/MethodInsightItem.cs

@ -5,6 +5,8 @@
// <version>$Revision$</version> // <version>$Revision$</version>
// </file> // </file>
using System.Windows.Controls;
using System.Windows.Documents;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using System; using System;
@ -22,6 +24,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
if (entity == null) if (entity == null)
throw new ArgumentNullException("entity"); throw new ArgumentNullException("entity");
this.entity = entity; this.entity = entity;
this.highlightParameter = -1;
} }
public IEntity Entity { public IEntity Entity {
@ -31,15 +34,60 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
string headerText; string headerText;
bool descriptionCreated; bool descriptionCreated;
string description; string description;
int highlightParameter;
object fancyHeader;
public object Header { public int HighlightParameter {
get { get { return highlightParameter; }
if (headerText == null) { set {
IAmbience ambience = AmbienceService.GetCurrentAmbience(); if (highlightParameter != value) {
ambience.ConversionFlags = ConversionFlags.StandardConversionFlags; highlightParameter = value;
headerText = ambience.Convert(entity); fancyHeader = GenerateHeader();
} }
}
}
object GenerateHeader()
{
IAmbience ambience = AmbienceService.GetCurrentAmbience();
ambience.ConversionFlags = ConversionFlags.StandardConversionFlags;
if (headerText == null) {
headerText = ambience.Convert(entity);
}
if (highlightParameter < 0)
return headerText; return headerText;
if (entity is IMethod) {
var method = entity as IMethod;
string param = "";
if (method.Parameters.Count > highlightParameter)
param = ambience.Convert(method.Parameters[highlightParameter]);
if (!string.IsNullOrEmpty(param)) {
string[] parts = headerText.Split(new[] { param }, StringSplitOptions.None);
if (parts.Length != 2)
return headerText;
return new Span() {
Inlines = {
parts[0],
new Bold() { Inlines = { param } },
parts[1]
}
};
}
}
return headerText;
}
public object Header {
get {
if (fancyHeader == null)
fancyHeader = GenerateHeader();
return fancyHeader;
} }
} }

1
src/Main/Base/Project/Src/Editor/CodeCompletion/MethodInsightProvider.cs

@ -124,6 +124,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
// method as normal - this is required to show the list of // method as normal - this is required to show the list of
// parameters the method expects. // parameters the method expects.
m.IsExtensionMethod = false; m.IsExtensionMethod = false;
m.Modifiers ^= ModifierEnum.Static;
m.Parameters.RemoveAt(0); m.Parameters.RemoveAt(0);
methods.Add(m); methods.Add(m);
} }

18
src/Main/Base/Project/Src/Editor/CodeCompletion/NRefactoryInsightWindowHandler.cs

@ -143,7 +143,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
return rr; return rr;
} }
public bool InsightRefreshOnComma(ITextEditor editor, char ch) public bool InsightRefreshOnComma(ITextEditor editor, char ch, out IInsightWindow insightWindow)
{ {
// Show MethodInsightWindow or IndexerInsightWindow // Show MethodInsightWindow or IndexerInsightWindow
NRefactoryResolver r = new NRefactoryResolver(languageProperties); NRefactoryResolver r = new NRefactoryResolver(languageProperties);
@ -170,7 +170,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
if (c == '(' || c == '[') { if (c == '(' || c == '[') {
var insightProvider = new MethodInsightProvider { LookupOffset = offset }; var insightProvider = new MethodInsightProvider { LookupOffset = offset };
var insightItems = insightProvider.ProvideInsight(editor); var insightItems = insightProvider.ProvideInsight(editor);
ShowInsight(editor, insightItems, ResolveCallParameters(editor, call), ch); insightWindow = ShowInsight(editor, insightItems, ResolveCallParameters(editor, call), ch);
return true; return true;
} else { } else {
Core.LoggingService.Warn("Expected '(' or '[' at start position"); Core.LoggingService.Warn("Expected '(' or '[' at start position");
@ -178,6 +178,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
} }
} }
} }
insightWindow = null;
return false; return false;
} }
@ -191,11 +192,11 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
} }
} }
void ShowInsight(ITextEditor editor, IList<IInsightItem> insightItems, ICollection<ResolveResult> parameters, char charTyped) IInsightWindow ShowInsight(ITextEditor editor, IList<IInsightItem> insightItems, ICollection<ResolveResult> parameters, char charTyped)
{ {
int paramCount = parameters.Count; int paramCount = parameters.Count;
if (insightItems == null || insightItems.Count == 0) if (insightItems == null || insightItems.Count == 0)
return; return null;
bool overloadIsSure; bool overloadIsSure;
int defaultIndex; int defaultIndex;
if (insightItems.Count == 1) { if (insightItems.Count == 1) {
@ -226,6 +227,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
ProvideContextCompletion(editor, param.ReturnType, charTyped); ProvideContextCompletion(editor, param.ReturnType, charTyped);
} }
} }
return insightWindow;
} }
// TODO : remove this code duplication! // TODO : remove this code duplication!
@ -274,5 +276,13 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion
return base.ProcessInput(key); return base.ProcessInput(key);
} }
} }
public void HighlightParameter(IInsightWindow window, int index)
{
var item = window.SelectedItem as MethodInsightItem;
if (item != null)
item.HighlightParameter = index;
}
} }
} }

Loading…
Cancel
Save