Browse Source

Improved current member recognition.

newNRvisualizers
Mike Krüger 15 years ago
parent
commit
03ee478b96
  1. 45
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  2. 34
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs

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

@ -44,7 +44,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
#region Additional input properties #region Additional input properties
public CSharpFormattingOptions FormattingPolicy { get; set; } public CSharpFormattingOptions FormattingPolicy { get; set; }
public string EolMarker { get; set; } public string EolMarker { get; set; }
public string IndentString { get; set; } public string IndentString { get; set; }
#endregion #endregion
@ -453,7 +455,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
continue; continue;
contextList.AddMember (property); contextList.AddMember (property);
} }
foreach (var field in initalizerResult.Item1.Type.GetFields (ctx)){ foreach (var field in initalizerResult.Item1.Type.GetFields (ctx)) {
if (!field.IsPublic) if (!field.IsPublic)
continue; continue;
contextList.AddMember (field); contextList.AddMember (field);
@ -660,7 +662,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
AddKeywords (wrapper, globalLevelKeywords); AddKeywords (wrapper, globalLevelKeywords);
} }
if (IsInSwitchContext(node)) { if (IsInSwitchContext (node)) {
wrapper.AddCustom ("case"); wrapper.AddCustom ("case");
wrapper.AddCustom ("default"); wrapper.AddCustom ("default");
} }
@ -669,7 +671,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
wrapper.Result.AddRange (factory.CreateCodeTemplateCompletionData ()); wrapper.Result.AddRange (factory.CreateCodeTemplateCompletionData ());
} }
static bool IsInSwitchContext(AstNode node) static bool IsInSwitchContext (AstNode node)
{ {
var n = node; var n = node;
while (n != null && !(n is MemberDeclaration)) { while (n != null && !(n is MemberDeclaration)) {
@ -697,7 +699,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
} }
} }
} }
if (currentMember != null) { if (currentMember != null) {
foreach (var member in currentType.Resolve (ctx).GetMembers (ctx)) { foreach (var member in currentType.Resolve (ctx).GetMembers (ctx)) {
if (memberPred == null || memberPred (member)) if (memberPred == null || memberPred (member))
wrapper.AddMember (member); wrapper.AddMember (member);
@ -751,8 +753,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var wrapper = new CompletionDataWrapper (this); var wrapper = new CompletionDataWrapper (this);
AddTypesAndNamespaces (wrapper, GetState (), null, t => false); AddTypesAndNamespaces (wrapper, GetState (), null, t => false);
return wrapper.Result; return wrapper.Result;
case "case": case "case":
return CreateCaseCompletionData (location); return CreateCaseCompletionData (location);
// case ",": // case ",":
// case ":": // case ":":
// if (result.ExpressionContext == ExpressionContext.InheritableType) { // if (result.ExpressionContext == ExpressionContext.InheritableType) {
@ -1051,6 +1053,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
} }
return true; return true;
} }
string GetLineIndent (int lineNr) string GetLineIndent (int lineNr)
{ {
var line = document.GetLineByNumber (lineNr); var line = document.GetLineByNumber (lineNr);
@ -1160,7 +1163,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (part == type) if (part == type)
continue; continue;
for (int i = 0; i < methods.Count; i++) { for (int i = 0; i < methods.Count; i++) {
var curMethod = methods[i]; var curMethod = methods [i];
var method = GetImplementation (partialType, curMethod); var method = GetImplementation (partialType, curMethod);
if (method != null && !method.BodyRegion.IsEmpty) { if (method != null && !method.BodyRegion.IsEmpty) {
methods.RemoveAt (i); methods.RemoveAt (i);
@ -1184,7 +1187,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (cur.Name == method.Name && cur.Parameters.Count == method.Parameters.Count && !cur.BodyRegion.IsEmpty) { if (cur.Name == method.Name && cur.Parameters.Count == method.Parameters.Count && !cur.BodyRegion.IsEmpty) {
bool equal = true; bool equal = true;
for (int i = 0; i < cur.Parameters.Count; i++) { 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; equal = false;
break; break;
} }
@ -1196,7 +1199,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return null; return null;
} }
static string GetNameWithParamCount (IMember member) static string GetNameWithParamCount (IMember member)
{ {
var e = member as IMethod; var e = member as IMethod;
@ -1546,21 +1548,21 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
if (resolvedNode.Annotation<ObjectCreateExpression> () == null) { //tags the created expression as part of an object create expression. if (resolvedNode.Annotation<ObjectCreateExpression> () == null) { //tags the created expression as part of an object create expression.
foreach (var member in type.GetMembers (ctx)) { foreach (var member in type.GetMembers (ctx)) {
if (!lookup.IsAccessible (member, isProtectedAllowed)) { if (!lookup.IsAccessible (member, isProtectedAllowed)) {
// Console.WriteLine ("skip access: " + member.FullName); // Console.WriteLine ("skip access: " + member.FullName);
continue; continue;
} }
if (resolvedNode is BaseReferenceExpression && member.IsAbstract) if (resolvedNode is BaseReferenceExpression && member.IsAbstract)
continue; continue;
if (!includeStaticMembers && member.IsStatic && !(resolveResult is TypeResolveResult)) { if (!includeStaticMembers && member.IsStatic && !(resolveResult is TypeResolveResult)) {
// Console.WriteLine ("skip static member: " + member.FullName); // Console.WriteLine ("skip static member: " + member.FullName);
continue; continue;
} }
if (!member.IsStatic && (resolveResult is TypeResolveResult)) { if (!member.IsStatic && (resolveResult is TypeResolveResult)) {
// Console.WriteLine ("skip non static member: " + member.FullName); // Console.WriteLine ("skip non static member: " + member.FullName);
continue; continue;
} }
// Console.WriteLine ("add : "+ member.FullName + " --- " + member.IsStatic); // Console.WriteLine ("add : "+ member.FullName + " --- " + member.IsStatic);
result.AddMember (member); result.AddMember (member);
} }
} }
@ -1620,6 +1622,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
} }
} }
} }
IEnumerable<ICompletionData> CreateCaseCompletionData (TextLocation location) IEnumerable<ICompletionData> CreateCaseCompletionData (TextLocation location)
{ {
var unit = ParseStub ("a: break;"); var unit = ParseStub ("a: break;");
@ -1677,7 +1680,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin;
var mref = baseUnit.GetNodeAt<MemberReferenceExpression> (location); var mref = baseUnit.GetNodeAt<MemberReferenceExpression> (location);
if (mref == null){ if (mref == null) {
var invoke = baseUnit.GetNodeAt<InvocationExpression> (location); var invoke = baseUnit.GetNodeAt<InvocationExpression> (location);
if (invoke != null) if (invoke != null)
mref = invoke.Target as MemberReferenceExpression; mref = invoke.Target as MemberReferenceExpression;
@ -1690,7 +1693,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
Expression tref = baseUnit.GetNodeAt<TypeReferenceExpression> (location); Expression tref = baseUnit.GetNodeAt<TypeReferenceExpression> (location);
var memberType = tref != null ? ((TypeReferenceExpression)tref).Type as MemberType : null; var memberType = tref != null ? ((TypeReferenceExpression)tref).Type as MemberType : null;
if (memberType == null) { if (memberType == null) {
memberType = baseUnit.GetNodeAt<MemberType> (location); memberType = baseUnit.GetNodeAt<MemberType> (location);
if (memberType != null) { if (memberType != null) {
tref = baseUnit.GetNodeAt<Expression> (location); tref = baseUnit.GetNodeAt<Expression> (location);
if (tref == null) if (tref == null)
@ -1728,7 +1731,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
memberLocation = currentMember.Region.Begin; memberLocation = currentMember.Region.Begin;
} else if (currentType != null) { } else if (currentType != null) {
memberLocation = currentType.Region.Begin; memberLocation = currentType.Region.Begin;
} else { } else {
memberLocation = location; memberLocation = location;
} }
@ -1809,7 +1812,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return Tuple.Create (tsvisitor.ParsedFile, expr, completionUnit); return Tuple.Create (tsvisitor.ParsedFile, expr, completionUnit);
} }
Tuple<CSharpParsedFile, AstNode, CompilationUnit> GetNewExpressionAt (int offset) Tuple<CSharpParsedFile, AstNode, CompilationUnit> GetNewExpressionAt (int offset)
{ {
var parser = new CSharpParser (); var parser = new CSharpParser ();
@ -1974,8 +1976,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
{ {
var state = new CSharpResolver (ctx, System.Threading.CancellationToken.None); var state = new CSharpResolver (ctx, System.Threading.CancellationToken.None);
state.CurrentMember = CSharpParsedFile.GetMember (location); state.CurrentMember = currentMember;
state.CurrentTypeDefinition = CSharpParsedFile.GetInnermostTypeDefinition (location); state.CurrentTypeDefinition = currentType;
state.CurrentUsingScope = CSharpParsedFile.GetUsingScope (location); state.CurrentUsingScope = CSharpParsedFile.GetUsingScope (location);
if (state.CurrentMember != null) { if (state.CurrentMember != null) {
var node = Unit.GetNodeAt (location); var node = Unit.GetNodeAt (location);
@ -2052,25 +2054,20 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
#region Keywords #region Keywords
static string[] expressionLevelKeywords = new string [] { "as", "is", "else", "out", "ref", "null", "delegate", "default"}; 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[] 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", static string[] statementStartKeywords = new string [] { "base", "new", "sizeof", "this",
"true", "false", "typeof", "checked", "unchecked", "from", "break", "checked", "true", "false", "typeof", "checked", "unchecked", "from", "break", "checked",
"unchecked", "const", "continue", "do", "finally", "fixed", "for", "foreach", "unchecked", "const", "continue", "do", "finally", "fixed", "for", "foreach",
"goto", "if", "lock", "return", "stackalloc", "switch", "throw", "try", "unsafe", "goto", "if", "lock", "return", "stackalloc", "switch", "throw", "try", "unsafe",
"using", "while", "yield", "dynamic", "var" }; "using", "while", "yield", "dynamic", "var" };
static string[] globalLevelKeywords = new string [] { static string[] globalLevelKeywords = new string [] {
"namespace", "using", "extern", "public", "internal", "namespace", "using", "extern", "public", "internal",
"class", "interface", "struct", "enum", "delegate", "class", "interface", "struct", "enum", "delegate",
"abstract", "sealed", "static", "unsafe", "partial" "abstract", "sealed", "static", "unsafe", "partial"
}; };
static string[] accessorModifierKeywords = new string [] { static string[] accessorModifierKeywords = new string [] {
"public", "internal", "protected", "private" "public", "internal", "protected", "private"
}; };
static string[] typeLevelKeywords = new string [] { static string[] typeLevelKeywords = new string [] {
"public", "internal", "protected", "private", "public", "internal", "protected", "private",
"class", "interface", "struct", "enum", "delegate", "class", "interface", "struct", "enum", "delegate",

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

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

Loading…
Cancel
Save