Browse Source

Improved current member recognition.

newNRvisualizers
Mike Krüger 14 years ago
parent
commit
03ee478b96
  1. 27
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  2. 32
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs

27
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs

@ -44,7 +44,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -44,7 +44,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
#region Additional input properties
public CSharpFormattingOptions FormattingPolicy { get; set; }
public string EolMarker { get; set; }
public string IndentString { get; set; }
#endregion
@ -453,7 +455,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -453,7 +455,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
continue;
contextList.AddMember (property);
}
foreach (var field in initalizerResult.Item1.Type.GetFields (ctx)){
foreach (var field in initalizerResult.Item1.Type.GetFields (ctx)) {
if (!field.IsPublic)
continue;
contextList.AddMember (field);
@ -660,7 +662,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -660,7 +662,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
AddKeywords (wrapper, globalLevelKeywords);
}
if (IsInSwitchContext(node)) {
if (IsInSwitchContext (node)) {
wrapper.AddCustom ("case");
wrapper.AddCustom ("default");
}
@ -669,7 +671,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -669,7 +671,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
wrapper.Result.AddRange (factory.CreateCodeTemplateCompletionData ());
}
static bool IsInSwitchContext(AstNode node)
static bool IsInSwitchContext (AstNode node)
{
var n = node;
while (n != null && !(n is MemberDeclaration)) {
@ -1051,6 +1053,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1051,6 +1053,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
}
return true;
}
string GetLineIndent (int lineNr)
{
var line = document.GetLineByNumber (lineNr);
@ -1160,7 +1163,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1160,7 +1163,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (part == type)
continue;
for (int i = 0; i < methods.Count; i++) {
var curMethod = methods[i];
var curMethod = methods [i];
var method = GetImplementation (partialType, curMethod);
if (method != null && !method.BodyRegion.IsEmpty) {
methods.RemoveAt (i);
@ -1184,7 +1187,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1184,7 +1187,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (cur.Name == method.Name && cur.Parameters.Count == method.Parameters.Count && !cur.BodyRegion.IsEmpty) {
bool equal = true;
for (int i = 0; i < cur.Parameters.Count; i++) {
if (!cur.Parameters[i].Type.Resolve (ctx).Equals (method.Parameters[i].Type.Resolve (ctx))) {
if (!cur.Parameters [i].Type.Resolve (ctx).Equals (method.Parameters [i].Type.Resolve (ctx))) {
equal = false;
break;
}
@ -1196,7 +1199,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1196,7 +1199,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return null;
}
static string GetNameWithParamCount (IMember member)
{
var e = member as IMethod;
@ -1620,6 +1622,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1620,6 +1622,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
}
}
}
IEnumerable<ICompletionData> CreateCaseCompletionData (TextLocation location)
{
var unit = ParseStub ("a: break;");
@ -1677,7 +1680,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1677,7 +1680,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin;
var mref = baseUnit.GetNodeAt<MemberReferenceExpression> (location);
if (mref == null){
if (mref == null) {
var invoke = baseUnit.GetNodeAt<InvocationExpression> (location);
if (invoke != null)
mref = invoke.Target as MemberReferenceExpression;
@ -1809,7 +1812,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1809,7 +1812,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return Tuple.Create (tsvisitor.ParsedFile, expr, completionUnit);
}
Tuple<CSharpParsedFile, AstNode, CompilationUnit> GetNewExpressionAt (int offset)
{
var parser = new CSharpParser ();
@ -1974,8 +1976,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -1974,8 +1976,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
{
var state = new CSharpResolver (ctx, System.Threading.CancellationToken.None);
state.CurrentMember = CSharpParsedFile.GetMember (location);
state.CurrentTypeDefinition = CSharpParsedFile.GetInnermostTypeDefinition (location);
state.CurrentMember = currentMember;
state.CurrentTypeDefinition = currentType;
state.CurrentUsingScope = CSharpParsedFile.GetUsingScope (location);
if (state.CurrentMember != null) {
var node = Unit.GetNodeAt (location);
@ -2052,25 +2054,20 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -2052,25 +2054,20 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
#region Keywords
static string[] expressionLevelKeywords = new string [] { "as", "is", "else", "out", "ref", "null", "delegate", "default"};
static string[] primitiveTypesKeywords = new string [] { "void", "object", "bool", "byte", "sbyte", "char", "short", "int", "long", "ushort", "uint", "ulong", "float", "double", "decimal", "string"};
static string[] statementStartKeywords = new string [] { "base", "new", "sizeof", "this",
"true", "false", "typeof", "checked", "unchecked", "from", "break", "checked",
"unchecked", "const", "continue", "do", "finally", "fixed", "for", "foreach",
"goto", "if", "lock", "return", "stackalloc", "switch", "throw", "try", "unsafe",
"using", "while", "yield", "dynamic", "var" };
static string[] globalLevelKeywords = new string [] {
"namespace", "using", "extern", "public", "internal",
"class", "interface", "struct", "enum", "delegate",
"abstract", "sealed", "static", "unsafe", "partial"
};
static string[] accessorModifierKeywords = new string [] {
"public", "internal", "protected", "private"
};
static string[] typeLevelKeywords = new string [] {
"public", "internal", "protected", "private",
"class", "interface", "struct", "enum", "delegate",

32
ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs

@ -44,14 +44,16 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -44,14 +44,16 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
protected IDocument document;
protected int offset;
protected TextLocation location;
protected ITypeDefinition currentType;
protected IMember currentMember;
#region Input properties
public ITypeResolveContext ctx { get; set; }
public CompilationUnit Unit { get; set; }
public CSharpParsedFile CSharpParsedFile { get; set; }
public IProjectContent ProjectContent { get; set; }
#endregion
@ -63,7 +65,17 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -63,7 +65,17 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
this.location = document.GetLocation (offset);
this.currentType = CSharpParsedFile.GetInnermostTypeDefinition (location);
this.currentMember = CSharpParsedFile.GetMember (location);
this.currentMember = null;
if (this.currentType != null) {
foreach (var member in currentType.Members) {
if (member.Region.Begin < location && (currentMember == null || currentMember.Region.Begin < member.Region.Begin))
currentMember = member;
}
}
var stack = GetBracketStack (GetMemberTextToCaret ().Item1);
if (stack.Count == 0)
currentMember = null;
}
#region Context helper methods
@ -73,8 +85,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -73,8 +85,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
bool inSingleComment = false, inString = false, inVerbatimString = false, inChar = false, inMultiLineComment = false;
for (int i = 0; i < text.Item1.Length - 1; i++) {
char ch = text.Item1[i];
char nextCh = text.Item1[i + 1];
char ch = text.Item1 [i];
char nextCh = text.Item1 [i + 1];
switch (ch) {
case '/':
@ -160,7 +172,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -160,7 +172,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
#endregion
#region Basic parsing/resolving functions
protected void AppendMissingClosingBrackets (StringBuilder wrapper, string memberText, bool appendSemicolon)
Stack<Tuple<char, int>> GetBracketStack (string memberText)
{
var bracketStack = new Stack<Tuple<char, int>> ();
@ -211,6 +223,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -211,6 +223,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
break;
}
}
return bracketStack;
}
protected void AppendMissingClosingBrackets (StringBuilder wrapper, string memberText, bool appendSemicolon)
{
var bracketStack = GetBracketStack (memberText);
bool didAppendSemicolon = !appendSemicolon;
char lastBracket = '\0';
@ -241,9 +259,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -241,9 +259,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
bool didAppendCatch = false;
while (o >= "try".Length) {
char ch = memberText[o];
char ch = memberText [o];
if (!char.IsWhiteSpace (ch)) {
if (ch == 'y' && memberText[o - 1] == 'r' && memberText[o - 2] == 't') {
if (ch == 'y' && memberText [o - 1] == 'r' && memberText [o - 2] == 't') {
wrapper.Append ("} catch {}");
didAppendCatch = true;
}

Loading…
Cancel
Save