From 11b8c3bca6f48b16424bdb04ffde1d7aa5c33331 Mon Sep 17 00:00:00 2001 From: mike Date: Sat, 17 Mar 2012 10:42:45 +0100 Subject: [PATCH 01/10] Removed IRelocatable infrastructure - the start line could now be altered in the lexer directly. --- .../Ast/CSharpTokenNode.cs | 10 +----- .../Ast/Expressions/EmptyExpression.cs | 10 +----- .../Ast/Expressions/PrimitiveExpression.cs | 9 +---- .../Ast/GeneralScope/Comment.cs | 12 +------ .../Ast/GeneralScope/PreProcessorDirective.cs | 12 +------ .../Ast/IRelocatable.cs | 35 ------------------- .../Ast/Identifier.cs | 10 +----- .../Ast/PrimitiveType.cs | 11 +----- .../Ast/Statements/EmptyStatement.cs | 10 +----- .../ICSharpCode.NRefactory.CSharp.csproj | 1 - .../Parser/CSharpParser.cs | 16 ++------- .../Parser/mcs/cs-tokenizer.cs | 3 ++ .../Parser/mcs/driver.cs | 5 +-- .../CSharp/Parser/ParseSelfTests.cs | 2 +- 14 files changed, 17 insertions(+), 129 deletions(-) delete mode 100644 ICSharpCode.NRefactory.CSharp/Ast/IRelocatable.cs diff --git a/ICSharpCode.NRefactory.CSharp/Ast/CSharpTokenNode.cs b/ICSharpCode.NRefactory.CSharp/Ast/CSharpTokenNode.cs index 0544b29280..04910ae181 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/CSharpTokenNode.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/CSharpTokenNode.cs @@ -33,7 +33,7 @@ namespace ICSharpCode.NRefactory.CSharp /// /// In all non null c# token nodes the Role of a CSharpToken must be a TokenRole. /// - public class CSharpTokenNode : AstNode, IRelocatable + public class CSharpTokenNode : AstNode { public static new readonly CSharpTokenNode Null = new NullCSharpTokenNode (); class NullCSharpTokenNode : CSharpTokenNode @@ -100,14 +100,6 @@ namespace ICSharpCode.NRefactory.CSharp this.startLocation = location; } - #region IRelocationable implementation - void IRelocatable.SetStartLocation (TextLocation startLocation) - { - ThrowIfFrozen(); - this.startLocation = startLocation; - } - #endregion - public override string GetText (CSharpFormattingOptions formattingOptions = null) { if (!(Role is TokenRole)) diff --git a/ICSharpCode.NRefactory.CSharp/Ast/Expressions/EmptyExpression.cs b/ICSharpCode.NRefactory.CSharp/Ast/Expressions/EmptyExpression.cs index 20c5135345..7dc5da777e 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/Expressions/EmptyExpression.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/Expressions/EmptyExpression.cs @@ -30,7 +30,7 @@ namespace ICSharpCode.NRefactory.CSharp /// /// Type<[EMPTY]> /// - public class EmptyExpression : Expression, IRelocatable + public class EmptyExpression : Expression { TextLocation location; @@ -55,14 +55,6 @@ namespace ICSharpCode.NRefactory.CSharp this.location = location; } - #region IRelocationable implementation - void IRelocatable.SetStartLocation (TextLocation startLocation) - { - ThrowIfFrozen(); - this.location = startLocation; - } - #endregion - public override void AcceptVisitor (IAstVisitor visitor) { visitor.VisitEmptyExpression (this); diff --git a/ICSharpCode.NRefactory.CSharp/Ast/Expressions/PrimitiveExpression.cs b/ICSharpCode.NRefactory.CSharp/Ast/Expressions/PrimitiveExpression.cs index de08ee2623..9f867fe1eb 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/Expressions/PrimitiveExpression.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/Expressions/PrimitiveExpression.cs @@ -31,7 +31,7 @@ namespace ICSharpCode.NRefactory.CSharp /// /// Represents a literal value. /// - public class PrimitiveExpression : Expression, IRelocatable + public class PrimitiveExpression : Expression { public static readonly object AnyValue = new object(); @@ -88,13 +88,6 @@ namespace ICSharpCode.NRefactory.CSharp this.literalValue = literalValue ?? ""; } - #region IRelocationable implementation - void IRelocatable.SetStartLocation (TextLocation startLocation) - { - this.startLocation = startLocation; - } - #endregion - public override void AcceptVisitor (IAstVisitor visitor) { visitor.VisitPrimitiveExpression (this); diff --git a/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/Comment.cs b/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/Comment.cs index d9c786d2af..83c00c9bf0 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/Comment.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/Comment.cs @@ -50,7 +50,7 @@ namespace ICSharpCode.NRefactory.CSharp MultiLineDocumentation } - public class Comment : AstNode, IRelocatable + public class Comment : AstNode { public override NodeType NodeType { get { @@ -106,16 +106,6 @@ namespace ICSharpCode.NRefactory.CSharp this.endLocation = endLocation; } - #region IRelocationable implementation - void IRelocatable.SetStartLocation (TextLocation startLocation) - { - ThrowIfFrozen(); - int lineDelta = startLocation.Line - this.startLocation.Line; - endLocation = new TextLocation (endLocation.Line + lineDelta, lineDelta != 0 ? endLocation.Column : endLocation.Column + startLocation.Column - this.startLocation.Column); - this.startLocation = startLocation; - } - #endregion - public override void AcceptVisitor (IAstVisitor visitor) { visitor.VisitComment (this); diff --git a/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/PreProcessorDirective.cs b/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/PreProcessorDirective.cs index 81959aa9b7..953f326c19 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/PreProcessorDirective.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/GeneralScope/PreProcessorDirective.cs @@ -46,7 +46,7 @@ namespace ICSharpCode.NRefactory.CSharp Line = 12 } - public class PreProcessorDirective : AstNode, IRelocatable + public class PreProcessorDirective : AstNode { public override NodeType NodeType { get { @@ -93,16 +93,6 @@ namespace ICSharpCode.NRefactory.CSharp this.endLocation = endLocation; } - #region IRelocationable implementation - void IRelocatable.SetStartLocation (TextLocation startLocation) - { - ThrowIfFrozen(); - int lineDelta = startLocation.Line - this.startLocation.Line; - endLocation = new TextLocation (endLocation.Line + lineDelta, lineDelta != 0 ? endLocation.Column : endLocation.Column + startLocation.Column - this.startLocation.Column); - this.startLocation = startLocation; - } - #endregion - public override void AcceptVisitor (IAstVisitor visitor) { visitor.VisitPreProcessorDirective (this); diff --git a/ICSharpCode.NRefactory.CSharp/Ast/IRelocatable.cs b/ICSharpCode.NRefactory.CSharp/Ast/IRelocatable.cs deleted file mode 100644 index cbb282a19c..0000000000 --- a/ICSharpCode.NRefactory.CSharp/Ast/IRelocatable.cs +++ /dev/null @@ -1,35 +0,0 @@ -// -// IRelocationable.cs -// -// Author: -// Mike Krüger -// -// Copyright (c) 2011 Novell, Inc (http://www.novell.com) -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; - -namespace ICSharpCode.NRefactory.CSharp -{ - public interface IRelocatable - { - void SetStartLocation (TextLocation startLocation); - } -} - diff --git a/ICSharpCode.NRefactory.CSharp/Ast/Identifier.cs b/ICSharpCode.NRefactory.CSharp/Ast/Identifier.cs index fe63a8c8f8..3321de2a03 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/Identifier.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/Identifier.cs @@ -28,7 +28,7 @@ using System; namespace ICSharpCode.NRefactory.CSharp { - public class Identifier : AstNode, IRelocatable + public class Identifier : AstNode { public new static readonly Identifier Null = new NullIdentifier (); sealed class NullIdentifier : Identifier @@ -98,14 +98,6 @@ namespace ICSharpCode.NRefactory.CSharp } } - #region IRelocationable implementation - void IRelocatable.SetStartLocation (TextLocation startLocation) - { - ThrowIfFrozen(); - this.startLocation = startLocation; - } - #endregion - public override TextLocation EndLocation { get { return new TextLocation (StartLocation.Line, StartLocation.Column + (Name ?? "").Length + (IsVerbatim ? 1 : 0)); diff --git a/ICSharpCode.NRefactory.CSharp/Ast/PrimitiveType.cs b/ICSharpCode.NRefactory.CSharp/Ast/PrimitiveType.cs index 18cebf77b4..bc367b3b6e 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/PrimitiveType.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/PrimitiveType.cs @@ -32,7 +32,7 @@ using ICSharpCode.NRefactory.TypeSystem.Implementation; namespace ICSharpCode.NRefactory.CSharp { - public class PrimitiveType : AstType, IRelocatable + public class PrimitiveType : AstType { TextLocation location; string keyword = string.Empty; @@ -77,15 +77,6 @@ namespace ICSharpCode.NRefactory.CSharp } } - - #region IRelocationable implementation - void IRelocatable.SetStartLocation (TextLocation startLocation) - { - ThrowIfFrozen(); - this.location = startLocation; - } - #endregion - public override void AcceptVisitor (IAstVisitor visitor) { visitor.VisitPrimitiveType (this); diff --git a/ICSharpCode.NRefactory.CSharp/Ast/Statements/EmptyStatement.cs b/ICSharpCode.NRefactory.CSharp/Ast/Statements/EmptyStatement.cs index e85833953d..deaa3a9c4a 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/Statements/EmptyStatement.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/Statements/EmptyStatement.cs @@ -29,7 +29,7 @@ namespace ICSharpCode.NRefactory.CSharp /// /// ; /// - public class EmptyStatement : Statement, IRelocatable + public class EmptyStatement : Statement { public TextLocation Location { get; @@ -48,14 +48,6 @@ namespace ICSharpCode.NRefactory.CSharp } } - #region IRelocationable implementation - void IRelocatable.SetStartLocation (TextLocation startLocation) - { - ThrowIfFrozen(); - this.Location = startLocation; - } - #endregion - public override void AcceptVisitor (IAstVisitor visitor) { visitor.VisitEmptyStatement (this); diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj index 02e3f21335..01201b019b 100644 --- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj +++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj @@ -126,7 +126,6 @@ - diff --git a/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs b/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs index a5e1f0f100..7166dfb9ed 100644 --- a/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs +++ b/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs @@ -3606,16 +3606,6 @@ namespace ICSharpCode.NRefactory.CSharp } } - public static void AdjustLineLocations (AstNode node, int lineModifier) - { - if (node is IRelocatable) { - ((IRelocatable)node).SetStartLocation (new TextLocation (node.StartLocation.Line + lineModifier, node.StartLocation.Column)); - } - foreach (var child in node.Children) { - AdjustLineLocations (child, lineModifier); - } - } - public CompilationUnit Parse (CompilerCompilationUnit top, string fileName, int lineModifier = 0) { if (top == null) @@ -3625,8 +3615,6 @@ namespace ICSharpCode.NRefactory.CSharp InsertComments (top, conversionVisitor); if (CompilationUnitCallback != null) CompilationUnitCallback (top); - if (lineModifier != 0) - AdjustLineLocations (conversionVisitor.Unit, lineModifier); if (top.LastYYValue is Mono.CSharp.Expression) conversionVisitor.Unit.TopExpression = ((Mono.CSharp.Expression)top.LastYYValue).Accept (conversionVisitor) as AstNode; conversionVisitor.Unit.FileName = fileName; @@ -3655,7 +3643,7 @@ namespace ICSharpCode.NRefactory.CSharp internal static object parseLock = new object (); - public CompilationUnit Parse (Stream stream, string fileName, int lineModifier = 0) + public CompilationUnit Parse(Stream stream, string fileName, int lineModifier = 0) { lock (parseLock) { errorReportPrinter = new ErrorReportPrinter (""); @@ -3666,7 +3654,7 @@ namespace ICSharpCode.NRefactory.CSharp Location.Initialize (new List (new [] { file })); var module = new ModuleContainer (ctx); var driver = new Driver (ctx); - var parser = Driver.Parse (reader, file, module); + var parser = Driver.Parse (reader, file, module, lineModifier); var top = new CompilerCompilationUnit () { ModuleCompiled = module, diff --git a/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-tokenizer.cs b/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-tokenizer.cs index caeb17b533..7624e34086 100644 --- a/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-tokenizer.cs +++ b/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-tokenizer.cs @@ -376,6 +376,9 @@ namespace Mono.CSharp get { return ref_line; } + set { + ref_line = value; + } } // diff --git a/ICSharpCode.NRefactory.CSharp/Parser/mcs/driver.cs b/ICSharpCode.NRefactory.CSharp/Parser/mcs/driver.cs index 8ffbc4eda5..bcbf7c148f 100644 --- a/ICSharpCode.NRefactory.CSharp/Parser/mcs/driver.cs +++ b/ICSharpCode.NRefactory.CSharp/Parser/mcs/driver.cs @@ -113,12 +113,13 @@ namespace Mono.CSharp input.Close (); } - public static CSharpParser Parse (SeekableStreamReader reader, SourceFile sourceFile, ModuleContainer module) + public static CSharpParser Parse(SeekableStreamReader reader, SourceFile sourceFile, ModuleContainer module, int lineModifier = 0) { var file = new CompilationSourceFile (module, sourceFile); - module.AddTypeContainer (file); + module.AddTypeContainer(file); CSharpParser parser = new CSharpParser (reader, file); + parser.Lexer.Line += lineModifier; parser.Lexer.sbag = new SpecialsBag (); parser.parse (); return parser; diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Parser/ParseSelfTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Parser/ParseSelfTests.cs index 841bb4c88d..fabf1c15c7 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Parser/ParseSelfTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Parser/ParseSelfTests.cs @@ -120,7 +120,7 @@ namespace ICSharpCode.NRefactory.CSharp.Parser void CheckMissingTokens(AstNode node) { - if (node is IRelocatable) { + if (node is CSharpTokenNode) { Assert.IsNull(node.FirstChild, "Token nodes should not have children"); } else { var prevNodeEnd = node.StartLocation; From 40a00e7f86e3ac246f81c57108c12b6bb9a01dfb Mon Sep 17 00:00:00 2001 From: mike Date: Sat, 17 Mar 2012 10:52:20 +0100 Subject: [PATCH 02/10] GetMemberTextToCaret now gives back the correct member start location. --- .../Completion/CSharpCompletionEngineBase.cs | 54 +++++++++---------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index b32afc1eee..0ab22fe0c2 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -415,49 +415,45 @@ namespace ICSharpCode.NRefactory.CSharp.Completion wrapper.Append (';'); } - protected CompilationUnit ParseStub (string continuation, bool appendSemicolon = true, string afterContinuation = null) + protected CompilationUnit ParseStub(string continuation, bool appendSemicolon = true, string afterContinuation = null) { - var mt = GetMemberTextToCaret (); - if (mt == null) + var mt = GetMemberTextToCaret(); + if (mt == null) { return null; + } string memberText = mt.Item1; - bool wrapInClass = mt.Item2; - + var memberLocation = mt.Item2; + int closingBrackets = 0; + int generatedLines = 0; var wrapper = new StringBuilder (); - + bool wrapInClass = memberLocation != new TextLocation (1, 1); if (wrapInClass) { -/* foreach (var child in Unit.Children) { + /* foreach (var child in Unit.Children) { if (child is UsingDeclaration) { var offset = document.GetOffset (child.StartLocation); wrapper.Append (document.GetText (offset, document.GetOffset (child.EndLocation) - offset)); } }*/ - wrapper.Append ("class Stub {"); - wrapper.AppendLine (); + wrapper.Append("class Stub {"); + wrapper.AppendLine(); + closingBrackets++; + generatedLines = 1; } - wrapper.Append (memberText); - wrapper.Append (continuation); - AppendMissingClosingBrackets (wrapper, memberText, appendSemicolon); - wrapper.Append (afterContinuation); + wrapper.Append(memberText); + wrapper.Append(continuation); + AppendMissingClosingBrackets(wrapper, memberText, appendSemicolon); + wrapper.Append(afterContinuation); - if (wrapInClass) - wrapper.Append ('}'); - - TextLocation memberLocation; - if (currentMember != null && currentType != null && currentType.Kind != TypeKind.Enum) { - memberLocation = currentMember.Region.Begin; - } else if (currentType != null) { - memberLocation = currentType.Region.Begin; - } else { - memberLocation = new TextLocation (1, 1); + if (closingBrackets > 0) { + wrapper.Append(new string ('}', closingBrackets)); } - + using (var stream = new System.IO.StringReader (wrapper.ToString ())) { try { var parser = new CSharpParser (); - return parser.Parse (stream, "stub.cs", wrapInClass ? memberLocation.Line - 2 : 0); + return parser.Parse(stream, "stub.cs", memberLocation.Line - 1 - generatedLines); } catch (Exception) { Console.WriteLine ("------"); Console.WriteLine (wrapper); @@ -473,13 +469,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion cachedText = null; } - protected Tuple GetMemberTextToCaret () + protected Tuple GetMemberTextToCaret () { int startOffset; if (currentMember != null && currentType != null && currentType.Kind != TypeKind.Enum) { - startOffset = document.GetOffset (currentMember.Region.BeginLine, currentMember.Region.BeginColumn); + startOffset = document.GetOffset (currentMember.Region.Begin); } else if (currentType != null) { - startOffset = document.GetOffset (currentType.Region.BeginLine, currentType.Region.BeginColumn); + startOffset = document.GetOffset (currentType.Region.Begin); } else { startOffset = 0; } @@ -492,7 +488,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (cachedText == null) cachedText = document.GetText (startOffset, offset - startOffset); - return Tuple.Create (cachedText, startOffset != 0); + return Tuple.Create (cachedText, document.GetLocation (startOffset)); } protected ExpressionResult GetInvocationBeforeCursor (bool afterBracket) From 837d48d50aa07bd9c7d159c91d77506370ad3f6c Mon Sep 17 00:00:00 2001 From: mike Date: Sat, 17 Mar 2012 11:28:54 +0100 Subject: [PATCH 03/10] Completion engine now works on freezed compilation units. --- .../Completion/CSharpCompletionEngine.cs | 2484 +++++++++-------- .../Completion/CSharpCompletionEngineBase.cs | 35 +- .../CSharpParameterCompletionEngine.cs | 18 +- .../Parser/CSharpParser.cs | 80 +- .../CodeCompletion/CodeCompletionBugTests.cs | 1 + .../ParameterCompletionTests.cs | 1 + 6 files changed, 1383 insertions(+), 1236 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 159e670be3..8f5acc877f 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -59,10 +59,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion public CSharpCompletionEngine (IDocument document, ICompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx, CompilationUnit unit, CSharpParsedFile parsedFile) : base (content, ctx, unit, parsedFile) { - if (document == null) + if (document == null) { throw new ArgumentNullException ("document"); - if (factory == null) + } + if (factory == null) { throw new ArgumentNullException ("factory"); + } this.document = document; this.factory = factory; // Set defaults for additional input properties @@ -71,209 +73,232 @@ namespace ICSharpCode.NRefactory.CSharp.Completion this.IndentString = "\t"; } - public IEnumerable GetCompletionData (int offset, bool controlSpace) + public IEnumerable GetCompletionData(int offset, bool controlSpace) { this.AutoCompleteEmptyMatch = true; this.AutoSelect = true; this.DefaultCompletionString = null; - SetOffset (offset); + SetOffset(offset); if (offset > 0) { - char lastChar = document.GetCharAt (offset - 1); - var result = MagicKeyCompletion (lastChar, controlSpace) ?? Enumerable.Empty (); - if (controlSpace && char.IsWhiteSpace (lastChar)) { + char lastChar = document.GetCharAt(offset - 1); + var result = MagicKeyCompletion(lastChar, controlSpace) ?? Enumerable.Empty(); + if (controlSpace && char.IsWhiteSpace(lastChar)) { offset -= 2; - while (offset >= 0 && char.IsWhiteSpace (document.GetCharAt (offset))) + while (offset >= 0 && char.IsWhiteSpace (document.GetCharAt (offset))) { offset--; + } if (offset > 0) { - var nonWsResult = MagicKeyCompletion (document.GetCharAt (offset), controlSpace); + var nonWsResult = MagicKeyCompletion(document.GetCharAt(offset), controlSpace); if (nonWsResult != null) { - var text = new HashSet (result.Select (r => r.CompletionText)); - result = result.Concat (nonWsResult.Where (r => !text.Contains (r.CompletionText))); + var text = new HashSet (result.Select(r => r.CompletionText)); + result = result.Concat(nonWsResult.Where(r => !text.Contains(r.CompletionText))); } } } return result; } - return Enumerable.Empty (); + return Enumerable.Empty(); } - IEnumerable GenerateNameProposals (AstType type) + IEnumerable GenerateNameProposals(AstType type) { if (type is PrimitiveType) { var pt = (PrimitiveType)type; switch (pt.Keyword) { - case "object": - yield return "o"; - yield return "obj"; - break; - case "bool": - yield return "b"; - yield return "pred"; - break; - case "double": - case "float": - case "decimal": - yield return "d"; - yield return "f"; - yield return "m"; - break; - default: - yield return "i"; - yield return "j"; - yield return "k"; - break; + case "object": + yield return "o"; + yield return "obj"; + break; + case "bool": + yield return "b"; + yield return "pred"; + break; + case "double": + case "float": + case "decimal": + yield return "d"; + yield return "f"; + yield return "m"; + break; + default: + yield return "i"; + yield return "j"; + yield return "k"; + break; } yield break; } var names = new List (); - int offset1 = document.GetOffset (type.StartLocation); - int offset2 = document.GetOffset (type.EndLocation); + int offset1 = document.GetOffset(type.StartLocation); + int offset2 = document.GetOffset(type.EndLocation); - string name = document.GetText (offset1, offset2 - offset1); + string name = document.GetText(offset1, offset2 - offset1); int lastNameStart = 0; for (int i = 1; i < name.Length; i++) { - if (Char.IsUpper (name [i])) { - names.Add (name.Substring (lastNameStart, i - lastNameStart)); + if (Char.IsUpper(name [i])) { + names.Add(name.Substring(lastNameStart, i - lastNameStart)); lastNameStart = i; } } - names.Add (name.Substring (lastNameStart, name.Length - lastNameStart)); + names.Add(name.Substring(lastNameStart, name.Length - lastNameStart)); var possibleName = new StringBuilder (); for (int i = 0; i < names.Count; i++) { possibleName.Length = 0; for (int j = i; j < names.Count; j++) { - if (string.IsNullOrEmpty (names [j])) + if (string.IsNullOrEmpty(names [j])) { continue; - if (j == i) - names [j] = Char.ToLower (names [j] [0]) + names [j].Substring (1); - possibleName.Append (names [j]); + } + if (j == i) { + names [j] = Char.ToLower(names [j] [0]) + names [j].Substring(1); + } + possibleName.Append(names [j]); } - yield return possibleName.ToString (); + yield return possibleName.ToString(); } } - IEnumerable MagicKeyCompletion (char completionChar, bool controlSpace) + IEnumerable MagicKeyCompletion(char completionChar, bool controlSpace) { ExpressionResult expr; Tuple resolveResult; switch (completionChar) { // Magic key completion - case ':': - case '.': - if (IsInsideCommentOrString ()) - return Enumerable.Empty (); - expr = GetExpressionBeforeCursor (); - if (expr == null) - return null; - // do not complete . (but ..) - if (expr.Node is PrimitiveExpression) { - var pexpr = (PrimitiveExpression)expr.Node; - if (!(pexpr.Value is string || pexpr.Value is char) && !pexpr.LiteralValue.Contains ('.')) + case ':': + case '.': + if (IsInsideCommentOrString()) { + return Enumerable.Empty(); + } + expr = GetExpressionBeforeCursor(); + if (expr == null) { return null; - } + } + // do not complete . (but ..) + if (expr.Node is PrimitiveExpression) { + var pexpr = (PrimitiveExpression)expr.Node; + if (!(pexpr.Value is string || pexpr.Value is char) && !pexpr.LiteralValue.Contains('.')) { + return null; + } + } - resolveResult = ResolveExpression (expr); - if (resolveResult == null) - return null; - if (expr.Node is AstType) - return CreateTypeAndNamespaceCompletionData (location, resolveResult.Item1, expr.Node, resolveResult.Item2); - return CreateCompletionData (location, resolveResult.Item1, expr.Node, resolveResult.Item2); - case '#': - if (IsInsideCommentOrString ()) - return null; - return GetDirectiveCompletionData (); + resolveResult = ResolveExpression(expr); + if (resolveResult == null) { + return null; + } + if (expr.Node is AstType) { + return CreateTypeAndNamespaceCompletionData(location, resolveResult.Item1, expr.Node, resolveResult.Item2); + } + return CreateCompletionData(location, resolveResult.Item1, expr.Node, resolveResult.Item2); + case '#': + if (IsInsideCommentOrString()) { + return null; + } + return GetDirectiveCompletionData(); // XML doc completion - case '<': - if (IsInsideDocComment ()) - return GetXmlDocumentationCompletionData (); - if (controlSpace) - return DefaultControlSpaceItems (); - return null; - case '>': - if (!IsInsideDocComment ()) + case '<': + if (IsInsideDocComment()) { + return GetXmlDocumentationCompletionData(); + } + if (controlSpace) { + return DefaultControlSpaceItems(); + } return null; - string lineText = document.GetText (document.GetLineByNumber (location.Line)); - int startIndex = Math.Min (location.Column - 1, lineText.Length - 1); + case '>': + if (!IsInsideDocComment()) { + return null; + } + string lineText = document.GetText(document.GetLineByNumber(location.Line)); + int startIndex = Math.Min(location.Column - 1, lineText.Length - 1); - while (startIndex >= 0 && lineText [startIndex] != '<') { - --startIndex; - if (lineText [startIndex] == '/') { // already closed. - startIndex = -1; - break; + while (startIndex >= 0 && lineText [startIndex] != '<') { + --startIndex; + if (lineText [startIndex] == '/') { + // already closed. + startIndex = -1; + break; + } } - } - if (startIndex >= 0) { - int endIndex = startIndex; - while (endIndex <= location.Column && endIndex < lineText.Length && !Char.IsWhiteSpace (lineText [endIndex])) { - endIndex++; + if (startIndex >= 0) { + int endIndex = startIndex; + while (endIndex <= location.Column && endIndex < lineText.Length && !Char.IsWhiteSpace (lineText [endIndex])) { + endIndex++; + } + string tag = endIndex - startIndex - 1 > 0 ? lineText.Substring(startIndex + 1, endIndex - startIndex - 2) : null; + if (!string.IsNullOrEmpty(tag) && commentTags.IndexOf(tag) >= 0) { + document.Insert(offset, ""); + } } - string tag = endIndex - startIndex - 1 > 0 ? lineText.Substring (startIndex + 1, endIndex - startIndex - 2) : null; - if (!string.IsNullOrEmpty (tag) && commentTags.IndexOf (tag) >= 0) - document.Insert (offset, ""); - } - return null; + return null; // Parameter completion - case '(': - if (IsInsideCommentOrString ()) - return null; - var invoke = GetInvocationBeforeCursor (true); - if (invoke == null) - return null; - if (invoke.Node is TypeOfExpression) - return CreateTypeList (); - var invocationResult = ResolveExpression (invoke); - if (invocationResult == null) - return null; - var methodGroup = invocationResult.Item1 as MethodGroupResolveResult; - if (methodGroup != null) - return CreateParameterCompletion (methodGroup, invocationResult.Item2, invoke.Node, 0, controlSpace); + case '(': + if (IsInsideCommentOrString()) { + return null; + } + var invoke = GetInvocationBeforeCursor(true); + if (invoke == null) { + return null; + } + if (invoke.Node is TypeOfExpression) { + return CreateTypeList(); + } + var invocationResult = ResolveExpression(invoke); + if (invocationResult == null) { + return null; + } + var methodGroup = invocationResult.Item1 as MethodGroupResolveResult; + if (methodGroup != null) { + return CreateParameterCompletion(methodGroup, invocationResult.Item2, invoke.Node, invoke.Unit, 0, controlSpace); + } - if (controlSpace) - return DefaultControlSpaceItems (invoke); + if (controlSpace) { + return DefaultControlSpaceItems(invoke); + } - return null; - case '=': - return controlSpace ? DefaultControlSpaceItems () : null; - case ',': - int cpos2; - if (!GetParameterCompletionCommandOffset (out cpos2)) return null; + case '=': + return controlSpace ? DefaultControlSpaceItems() : null; + case ',': + int cpos2; + if (!GetParameterCompletionCommandOffset(out cpos2)) { + return null; + } // completionContext = CompletionWidget.CreateCodeCompletionContext (cpos2); // int currentParameter2 = MethodParameterDataProvider.GetCurrentParameterIndex (CompletionWidget, completionContext) - 1; // return CreateParameterCompletion (CreateResolver (), location, ExpressionContext.MethodBody, provider.Methods, currentParameter); - break; + break; // Completion on space: - case ' ': - if (IsInsideCommentOrString ()) - return null; + case ' ': + if (IsInsideCommentOrString()) { + return null; + } - int tokenIndex = offset; - string token = GetPreviousToken (ref tokenIndex, false); + int tokenIndex = offset; + string token = GetPreviousToken(ref tokenIndex, false); // check propose name, for context (but only in control space context) //IType isAsType = null; - var isAsExpression = GetExpressionAt (offset); - if (controlSpace && isAsExpression != null && isAsExpression.Node is VariableDeclarationStatement && token != "new") { - var parent = isAsExpression.Node as VariableDeclarationStatement; - var proposeNameList = new CompletionDataWrapper (this); + var isAsExpression = GetExpressionAt(offset); + if (controlSpace && isAsExpression != null && isAsExpression.Node is VariableDeclarationStatement && token != "new") { + var parent = isAsExpression.Node as VariableDeclarationStatement; + var proposeNameList = new CompletionDataWrapper (this); - foreach (var possibleName in GenerateNameProposals (parent.Type)) { - if (possibleName.Length > 0) - proposeNameList.Result.Add (factory.CreateLiteralCompletionData (possibleName.ToString ())); - } + foreach (var possibleName in GenerateNameProposals (parent.Type)) { + if (possibleName.Length > 0) { + proposeNameList.Result.Add(factory.CreateLiteralCompletionData(possibleName.ToString())); + } + } - AutoSelect = false; - AutoCompleteEmptyMatch = false; - return proposeNameList.Result; - } + AutoSelect = false; + AutoCompleteEmptyMatch = false; + return proposeNameList.Result; + } // int tokenIndex = offset; // string token = GetPreviousToken (ref tokenIndex, false); // if (result.ExpressionContext == ExpressionContext.ObjectInitializer) { @@ -283,51 +308,58 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // if (objectInitializer != null && objectInitializer.ArrayDimensions == 0 && objectInitializer.PointerNestingLevel == 0 && (token == "{" || token == ",")) // return CreateCtrlSpaceCompletionData (completionContext, result); // } - if (token == "=") { - int j = tokenIndex; - string prevToken = GetPreviousToken (ref j, false); - if (prevToken == "=" || prevToken == "+" || prevToken == "-") { - token = prevToken + token; - tokenIndex = j; - } - } - switch (token) { - case "(": - case ",": - int cpos; - if (!GetParameterCompletionCommandOffset (out cpos)) - break; - int currentParameter = GetCurrentParameterIndex (cpos, 0) - 1; - if (currentParameter < 0) - return null; - invoke = GetInvocationBeforeCursor (token == "("); - if (invoke == null) - return null; - invocationResult = ResolveExpression (invoke); - if (invocationResult == null) - return null; - methodGroup = invocationResult.Item1 as MethodGroupResolveResult; - if (methodGroup != null) - return CreateParameterCompletion (methodGroup, invocationResult.Item2, invoke.Node, currentParameter, controlSpace); - return null; - case "=": - case "==": - GetPreviousToken (ref tokenIndex, false); - var expressionOrVariableDeclaration = GetExpressionAt (tokenIndex); - if (expressionOrVariableDeclaration == null) - return null; + if (token == "=") { + int j = tokenIndex; + string prevToken = GetPreviousToken(ref j, false); + if (prevToken == "=" || prevToken == "+" || prevToken == "-") { + token = prevToken + token; + tokenIndex = j; + } + } + switch (token) { + case "(": + case ",": + int cpos; + if (!GetParameterCompletionCommandOffset(out cpos)) { + break; + } + int currentParameter = GetCurrentParameterIndex(cpos, 0) - 1; + if (currentParameter < 0) { + return null; + } + invoke = GetInvocationBeforeCursor(token == "("); + if (invoke == null) { + return null; + } + invocationResult = ResolveExpression(invoke); + if (invocationResult == null) { + return null; + } + methodGroup = invocationResult.Item1 as MethodGroupResolveResult; + if (methodGroup != null) { + return CreateParameterCompletion(methodGroup, invocationResult.Item2, invoke.Node, invoke.Unit, currentParameter, controlSpace); + } + return null; + case "=": + case "==": + GetPreviousToken(ref tokenIndex, false); + var expressionOrVariableDeclaration = GetExpressionAt(tokenIndex); + if (expressionOrVariableDeclaration == null) { + return null; + } - resolveResult = ResolveExpression (expressionOrVariableDeclaration); + resolveResult = ResolveExpression(expressionOrVariableDeclaration); - if (resolveResult == null) - return null; - if (resolveResult.Item1.Type.Kind == TypeKind.Enum) { - var wrapper = new CompletionDataWrapper (this); - AddContextCompletion (wrapper, resolveResult.Item2, expressionOrVariableDeclaration.Node); - AddEnumMembers (wrapper, resolveResult.Item1.Type, resolveResult.Item2); - AutoCompleteEmptyMatch = false; - return wrapper.Result; - } + if (resolveResult == null) { + return null; + } + if (resolveResult.Item1.Type.Kind == TypeKind.Enum) { + var wrapper = new CompletionDataWrapper (this); + AddContextCompletion(wrapper, resolveResult.Item2, expressionOrVariableDeclaration.Node, expressionOrVariableDeclaration.Unit); + AddEnumMembers(wrapper, resolveResult.Item1.Type, resolveResult.Item2); + AutoCompleteEmptyMatch = false; + return wrapper.Result; + } // // if (resolvedType.FullName == DomReturnType.Bool.FullName) { // CompletionDataList completionList = new ProjectDomCompletionDataList (); @@ -352,323 +384,360 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // } // return completionList; // } - return null; - case "+=": - case "-=": - GetPreviousToken (ref tokenIndex, false); + return null; + case "+=": + case "-=": + GetPreviousToken(ref tokenIndex, false); - expressionOrVariableDeclaration = GetExpressionAt (tokenIndex); - if (expressionOrVariableDeclaration == null) - return null; + expressionOrVariableDeclaration = GetExpressionAt(tokenIndex); + if (expressionOrVariableDeclaration == null) { + return null; + } - resolveResult = ResolveExpression (expressionOrVariableDeclaration); - if (resolveResult == null) - return null; + resolveResult = ResolveExpression(expressionOrVariableDeclaration); + if (resolveResult == null) { + return null; + } - var mrr = resolveResult.Item1 as MemberResolveResult; - if (mrr != null) { - var evt = mrr.Member as IEvent; - if (evt == null) - return null; - var delegateType = evt.ReturnType; - if (delegateType.Kind != TypeKind.Delegate) - return null; + var mrr = resolveResult.Item1 as MemberResolveResult; + if (mrr != null) { + var evt = mrr.Member as IEvent; + if (evt == null) { + return null; + } + var delegateType = evt.ReturnType; + if (delegateType.Kind != TypeKind.Delegate) { + return null; + } - var wrapper = new CompletionDataWrapper (this); - if (currentType != null) { -// bool includeProtected = DomType.IncludeProtected (dom, typeFromDatabase, resolver.CallingType); - foreach (var method in currentType.Methods) { - if (MatchDelegate (delegateType, method) /*&& method.IsAccessibleFrom (dom, resolver.CallingType, resolver.CallingMember, includeProtected) &&*/) { - wrapper.AddMember (method); -// data.SetText (data.CompletionText + ";"); + var wrapper = new CompletionDataWrapper (this); + if (currentType != null) { + // bool includeProtected = DomType.IncludeProtected (dom, typeFromDatabase, resolver.CallingType); + foreach (var method in currentType.Methods) { + if (MatchDelegate(delegateType, method) /*&& method.IsAccessibleFrom (dom, resolver.CallingType, resolver.CallingMember, includeProtected) &&*/) { + wrapper.AddMember(method); + // data.SetText (data.CompletionText + ";"); + } + } + } + if (token == "+=") { + string parameterDefinition = AddDelegateHandlers(wrapper, delegateType); + string varName = GetPreviousMemberReferenceExpression(tokenIndex); + wrapper.Result.Add(factory.CreateEventCreationCompletionData(varName, delegateType, evt, parameterDefinition, currentMember, currentType)); } + + return wrapper.Result; + } + return null; + case ":": + if (currentMember == null) { + var wrapper = new CompletionDataWrapper (this); + AddTypesAndNamespaces(wrapper, GetState(), null, t => currentType != null ? !currentType.ReflectionName.Equals(t.ReflectionName) : true); + return wrapper.Result; } + return null; + } + + var keywordCompletion = HandleKeywordCompletion(tokenIndex, token); + if (keywordCompletion == null && controlSpace) { + goto default; + } + return keywordCompletion; + // Automatic completion + default: + if (IsInsideCommentOrString()) { + return null; + } + if (IsInLinqContext(offset)) { + if (!controlSpace && !(char.IsLetter(completionChar) || completionChar == '_')) { + return null; } - if (token == "+=") { - string parameterDefinition = AddDelegateHandlers (wrapper, delegateType); - string varName = GetPreviousMemberReferenceExpression (tokenIndex); - wrapper.Result.Add (factory.CreateEventCreationCompletionData (varName, delegateType, evt, parameterDefinition, currentMember, currentType)); + tokenIndex = offset; + token = GetPreviousToken(ref tokenIndex, false); + // token last typed + if (!char.IsWhiteSpace(completionChar) && !linqKeywords.Contains(token)) { + token = GetPreviousToken(ref tokenIndex, false); } + // token last typed - return wrapper.Result; + if (linqKeywords.Contains(token)) { + if (token == "from") { + // after from no auto code completion. + return null; + } + return DefaultControlSpaceItems(); + } + var dataList = new CompletionDataWrapper (this); + AddKeywords(dataList, linqKeywords); + return dataList.Result; } - return null; - case ":": - if (currentMember == null) { - var wrapper = new CompletionDataWrapper (this); - AddTypesAndNamespaces (wrapper, GetState (), null, t => currentType != null ? !currentType.ReflectionName.Equals (t.ReflectionName) : true); - return wrapper.Result; + if (currentType != null && currentType.Kind == TypeKind.Enum) { + return HandleEnumContext(); } - return null; - } - var keywordCompletion = HandleKeywordCompletion (tokenIndex, token); - if (keywordCompletion == null && controlSpace) - goto default; - return keywordCompletion; - // Automatic completion - default: - if (IsInsideCommentOrString ()) - return null; - if (IsInLinqContext (offset)) { - if (!controlSpace && !(char.IsLetter (completionChar) || completionChar == '_')) + var contextList = new CompletionDataWrapper (this); + var identifierStart = GetExpressionAtCursor(); + Console.WriteLine("id:" + identifierStart); + if (identifierStart != null && identifierStart.Node is TypeParameterDeclaration) { return null; - tokenIndex = offset; - token = GetPreviousToken (ref tokenIndex, false); // token last typed - if (!char.IsWhiteSpace (completionChar) && !linqKeywords.Contains (token)) - token = GetPreviousToken (ref tokenIndex, false); // token last typed - - if (linqKeywords.Contains (token)) { - if (token == "from") // after from no auto code completion. - return null; - return DefaultControlSpaceItems (); } - var dataList = new CompletionDataWrapper (this); - AddKeywords (dataList, linqKeywords); - return dataList.Result; - } - if (currentType != null && currentType.Kind == TypeKind.Enum) - return HandleEnumContext (); - - var contextList = new CompletionDataWrapper (this); - var identifierStart = GetExpressionAtCursor (); - if (identifierStart != null && identifierStart.Node is TypeParameterDeclaration) - return null; - if (identifierStart != null && identifierStart.Node is VariableInitializer && location <= ((VariableInitializer)identifierStart.Node).NameToken.EndLocation) { - return controlSpace ? HandleAccessorContext () ?? DefaultControlSpaceItems (identifierStart) : null; - } + if (identifierStart != null && identifierStart.Node is VariableInitializer && location <= ((VariableInitializer)identifierStart.Node).NameToken.EndLocation) { + return controlSpace ? HandleAccessorContext() ?? DefaultControlSpaceItems(identifierStart) : null; + } - if (identifierStart != null && identifierStart.Node is CatchClause) { - if (((CatchClause)identifierStart.Node).VariableNameToken.Contains (location)) + if (identifierStart != null && identifierStart.Node is CatchClause) { + if (((CatchClause)identifierStart.Node).VariableNameToken.Contains(location)) { + return null; + } + identifierStart = null; + } + if (!(char.IsLetter(completionChar) || completionChar == '_') && (!controlSpace || identifierStart == null || !(identifierStart.Node.Parent is ArrayInitializerExpression))) { + return controlSpace ? HandleAccessorContext() ?? DefaultControlSpaceItems(identifierStart) : null; + } + + char prevCh = offset > 2 ? document.GetCharAt(offset - 2) : ';'; + char nextCh = offset < document.TextLength ? document.GetCharAt(offset) : ' '; + const string allowedChars = ";,.[](){}+-*/%^?:&|~!<>="; + if (!Char.IsWhiteSpace(nextCh) && allowedChars.IndexOf(nextCh) < 0) { return null; - identifierStart = null; - } - if (!(char.IsLetter (completionChar) || completionChar == '_') && (!controlSpace || identifierStart == null || !(identifierStart.Node.Parent is ArrayInitializerExpression))) { - return controlSpace ? HandleAccessorContext () ?? DefaultControlSpaceItems (identifierStart) : null; - } - - char prevCh = offset > 2 ? document.GetCharAt (offset - 2) : ';'; - char nextCh = offset < document.TextLength ? document.GetCharAt (offset) : ' '; - const string allowedChars = ";,.[](){}+-*/%^?:&|~!<>="; - if (!Char.IsWhiteSpace (nextCh) && allowedChars.IndexOf (nextCh) < 0) - return null; - if (!(Char.IsWhiteSpace (prevCh) || allowedChars.IndexOf (prevCh) >= 0)) - return null; - // Do not pop up completion on identifier identifier (should be handled by keyword completion). - tokenIndex = offset - 1; - token = GetPreviousToken (ref tokenIndex, false); - if (token == "class" || token == "interface" || token == "struct" || token == "enum" || token == "namespace") // after these always follows a name - return null; - var keywordresult = HandleKeywordCompletion (tokenIndex, token); - if (keywordresult != null) - return keywordresult; - int prevTokenIndex = tokenIndex; - var prevToken2 = GetPreviousToken (ref prevTokenIndex, false); - if (prevToken2 == "delegate") // after these always follows a name - return null; - if (identifierStart == null && !string.IsNullOrEmpty (token) && !IsInsideCommentOrString () && (prevToken2 == ";" || prevToken2 == "{" || prevToken2 == "}")) { - char last = token [token.Length - 1]; - if (char.IsLetterOrDigit (last) || last == '_' || token == ">") { - return HandleKeywordCompletion (tokenIndex, token); } - } - - if (identifierStart == null) { - var accCtx = HandleAccessorContext (); - if (accCtx != null) - return accCtx; - return DefaultControlSpaceItems (null, controlSpace); - } - CSharpResolver csResolver; - AstNode n = identifierStart.Node; - if (n != null && n.Parent is AnonymousTypeCreateExpression) { - AutoSelect = false; - } + if (!(Char.IsWhiteSpace(prevCh) || allowedChars.IndexOf(prevCh) >= 0)) { + return null; + } + + // Do not pop up completion on identifier identifier (should be handled by keyword completion). + tokenIndex = offset - 1; + token = GetPreviousToken(ref tokenIndex, false); + if (token == "class" || token == "interface" || token == "struct" || token == "enum" || token == "namespace") { + // after these always follows a name + return null; + } + var keywordresult = HandleKeywordCompletion(tokenIndex, token); + if (keywordresult != null) { + return keywordresult; + } + + int prevTokenIndex = tokenIndex; + var prevToken2 = GetPreviousToken(ref prevTokenIndex, false); + if (prevToken2 == "delegate") { + // after these always follows a name + return null; + } + + if (identifierStart == null && !string.IsNullOrEmpty(token) && !IsInsideCommentOrString() && (prevToken2 == ";" || prevToken2 == "{" || prevToken2 == "}")) { + char last = token [token.Length - 1]; + if (char.IsLetterOrDigit(last) || last == '_' || token == ">") { + return HandleKeywordCompletion(tokenIndex, token); + } + } - // Handle foreach (type name _ - if (n is IdentifierExpression) { - var prev = n.GetPrevNode () as ForeachStatement; - if (prev != null && prev.InExpression.IsNull) { - if (controlSpace) { - contextList.AddCustom ("in"); - return contextList.Result; + if (identifierStart == null) { + var accCtx = HandleAccessorContext(); + if (accCtx != null) { + return accCtx; } - return null; + return DefaultControlSpaceItems(null, controlSpace); + } + CSharpResolver csResolver; + AstNode n = identifierStart.Node; + if (n != null && n.Parent is AnonymousTypeCreateExpression) { + AutoSelect = false; } - } - // Handle object/enumerable initialzer expressions: "new O () { P$" - if (n is IdentifierExpression && n.Parent is ArrayInitializerExpression) { - var p = n.Parent; - while (p != null && !(p is ObjectCreateExpression)) - p = p.Parent; - if (p != null) { - var initializerResult = ResolveExpression (p, identifierStart.Unit); - if (initializerResult != null && initializerResult.Item1.Type.Kind != TypeKind.Unknown) { - foreach (var m in initializerResult.Item1.Type.GetMembers (m => m.IsPublic && (m.EntityType == EntityType.Property || m.EntityType == EntityType.Field))) { - contextList.AddMember (m); - } - var enumerableType = typeof(IEnumerable<>).ToTypeReference ().Resolve (ctx); - // check if we may be in a collection initializer, or enumerable initializer - if (enumerableType.Kind == TypeKind.Unknown || !initializerResult.Item1.Type.GetDefinition ().IsDerivedFrom (enumerableType.GetDefinition ())) + // Handle foreach (type name _ + if (n is IdentifierExpression) { + var prev = n.GetPrevNode() as ForeachStatement; + if (prev != null && prev.InExpression.IsNull) { + if (controlSpace) { + contextList.AddCustom("in"); return contextList.Result; + } + return null; } } - } - - if (n != null && n.Parent is InvocationExpression) { - var invokeParent = (InvocationExpression)n.Parent; - var invokeResult = ResolveExpression (invokeParent.Target, identifierStart.Unit); - var mgr = invokeResult != null ? invokeResult.Item1 as MethodGroupResolveResult : null; - if (mgr != null) { - int idx = 0; - foreach (var arg in invokeParent.Arguments) { - if (arg == n) - break; - idx++; + + // Handle object/enumerable initialzer expressions: "new O () { P$" + if (n is IdentifierExpression && n.Parent is ArrayInitializerExpression) { + var p = n.Parent; + while (p != null && !(p is ObjectCreateExpression)) { + p = p.Parent; } - - foreach (var method in mgr.Methods) { - if (idx < method.Parameters.Count && method.Parameters [idx].Type.Kind == TypeKind.Delegate) { - AutoSelect = false; - AutoCompleteEmptyMatch = false; - } - foreach (var p in method.Parameters) { - contextList.AddVariable (p); + if (p != null) { + var initializerResult = ResolveExpression(p, identifierStart.Unit); + if (initializerResult != null && initializerResult.Item1.Type.Kind != TypeKind.Unknown) { + + foreach (var m in initializerResult.Item1.Type.GetMembers (m => m.IsPublic && (m.EntityType == EntityType.Property || m.EntityType == EntityType.Field))) { + contextList.AddMember(m); + } + var enumerableType = typeof(IEnumerable<>).ToTypeReference().Resolve(ctx); + // check if we may be in a collection initializer, or enumerable initializer + if (enumerableType.Kind == TypeKind.Unknown || !initializerResult.Item1.Type.GetDefinition().IsDerivedFrom(enumerableType.GetDefinition())) { + return contextList.Result; + } } } - idx++; - foreach (var list in mgr.GetExtensionMethods ()) { - foreach (var method in list) { + } + + if (n != null && n.Parent is InvocationExpression) { + var invokeParent = (InvocationExpression)n.Parent; + var invokeResult = ResolveExpression(invokeParent.Target, identifierStart.Unit); + var mgr = invokeResult != null ? invokeResult.Item1 as MethodGroupResolveResult : null; + if (mgr != null) { + int idx = 0; + foreach (var arg in invokeParent.Arguments) { + if (arg == n) { + break; + } + idx++; + } + + foreach (var method in mgr.Methods) { if (idx < method.Parameters.Count && method.Parameters [idx].Type.Kind == TypeKind.Delegate) { AutoSelect = false; AutoCompleteEmptyMatch = false; } + foreach (var p in method.Parameters) { + contextList.AddVariable(p); + } + } + idx++; + foreach (var list in mgr.GetExtensionMethods ()) { + foreach (var method in list) { + if (idx < method.Parameters.Count && method.Parameters [idx].Type.Kind == TypeKind.Delegate) { + AutoSelect = false; + AutoCompleteEmptyMatch = false; + } + } } } } - } - if (n != null && n.Parent is ObjectCreateExpression) { - var invokeResult = ResolveExpression (n.Parent, identifierStart.Unit); - var mgr = invokeResult != null ? invokeResult.Item1 as ResolveResult : null; - if (mgr != null) { - foreach (var constructor in mgr.Type.GetConstructors ()) { - foreach (var p in constructor.Parameters) { - contextList.AddVariable (p); + + if (n != null && n.Parent is ObjectCreateExpression) { + var invokeResult = ResolveExpression(n.Parent, identifierStart.Unit); + var mgr = invokeResult != null ? invokeResult.Item1 as ResolveResult : null; + if (mgr != null) { + foreach (var constructor in mgr.Type.GetConstructors ()) { + foreach (var p in constructor.Parameters) { + contextList.AddVariable(p); + } } } } - } - - if (n is IdentifierExpression) { - var bop = n.Parent as BinaryOperatorExpression; - Expression evaluationExpr = null; + + if (n is IdentifierExpression) { + var bop = n.Parent as BinaryOperatorExpression; + Expression evaluationExpr = null; - if (bop != null && bop.Right == n && (bop.Operator == BinaryOperatorType.Equality || bop.Operator == BinaryOperatorType.InEquality)) { - evaluationExpr = bop.Left; - } - // check for compare to enum case - if (evaluationExpr != null) { - resolveResult = ResolveExpression (evaluationExpr, identifierStart.Unit); - if (resolveResult != null && resolveResult.Item1.Type.Kind == TypeKind.Enum) { - var wrapper = new CompletionDataWrapper (this); - AddContextCompletion (wrapper, resolveResult.Item2, evaluationExpr); - AddEnumMembers (wrapper, resolveResult.Item1.Type, resolveResult.Item2); - AutoCompleteEmptyMatch = false; - return wrapper.Result; + if (bop != null && bop.Right == n && (bop.Operator == BinaryOperatorType.Equality || bop.Operator == BinaryOperatorType.InEquality)) { + evaluationExpr = bop.Left; + } + // check for compare to enum case + if (evaluationExpr != null) { + resolveResult = ResolveExpression(evaluationExpr, identifierStart.Unit); + if (resolveResult != null && resolveResult.Item1.Type.Kind == TypeKind.Enum) { + var wrapper = new CompletionDataWrapper (this); + AddContextCompletion(wrapper, resolveResult.Item2, evaluationExpr, identifierStart.Unit); + AddEnumMembers(wrapper, resolveResult.Item1.Type, resolveResult.Item2); + AutoCompleteEmptyMatch = false; + return wrapper.Result; + } } } - } - if (n is Identifier && n.Parent is ForeachStatement) { - if (controlSpace) - return DefaultControlSpaceItems (); - return null; - } - if (n is ArrayInitializerExpression) { - // check for new [] {...} expression -> no need to resolve the type there - var parent = n.Parent as ArrayCreateExpression; - if (parent != null && parent.Type.IsNull) - return DefaultControlSpaceItems (); + if (n is Identifier && n.Parent is ForeachStatement) { + if (controlSpace) { + return DefaultControlSpaceItems(); + } + return null; + } + if (n is ArrayInitializerExpression) { + // check for new [] {...} expression -> no need to resolve the type there + var parent = n.Parent as ArrayCreateExpression; + if (parent != null && parent.Type.IsNull) { + return DefaultControlSpaceItems(); + } - var initalizerResult = ResolveExpression (n.Parent, identifierStart.Unit); + var initalizerResult = ResolveExpression(n.Parent, identifierStart.Unit); - var concreteNode = identifierStart.Unit.GetNodeAt (location); - // check if we're on the right side of an initializer expression - if (concreteNode != null && concreteNode.Parent != null && concreteNode.Parent.Parent != null && concreteNode.Identifier != "a" && concreteNode.Parent.Parent is NamedExpression) { - return DefaultControlSpaceItems (); - } + var concreteNode = identifierStart.Unit.GetNodeAt(location); + // check if we're on the right side of an initializer expression + if (concreteNode != null && concreteNode.Parent != null && concreteNode.Parent.Parent != null && concreteNode.Identifier != "a" && concreteNode.Parent.Parent is NamedExpression) { + return DefaultControlSpaceItems(); + } - if (initalizerResult != null && initalizerResult.Item1.Type.Kind != TypeKind.Unknown) { + if (initalizerResult != null && initalizerResult.Item1.Type.Kind != TypeKind.Unknown) { - foreach (var property in initalizerResult.Item1.Type.GetProperties ()) { - if (!property.IsPublic) - continue; - contextList.AddMember (property); + foreach (var property in initalizerResult.Item1.Type.GetProperties ()) { + if (!property.IsPublic) { + continue; + } + contextList.AddMember(property); + } + foreach (var field in initalizerResult.Item1.Type.GetFields ()) { + if (!field.IsPublic) { + continue; + } + contextList.AddMember(field); + } + return contextList.Result; } - foreach (var field in initalizerResult.Item1.Type.GetFields ()) { - if (!field.IsPublic) - continue; - contextList.AddMember (field); + return DefaultControlSpaceItems(); + } + if (IsAttributeContext(n)) { + // add attribute targets + if (currentType == null) { + contextList.AddCustom("assembly"); + contextList.AddCustom("module"); + contextList.AddCustom("type"); + } else { + contextList.AddCustom("param"); + contextList.AddCustom("field"); + contextList.AddCustom("property"); + contextList.AddCustom("method"); + contextList.AddCustom("event"); } - return contextList.Result; + contextList.AddCustom("return"); } - return DefaultControlSpaceItems (); - } - if (IsAttributeContext (n)) { - // add attribute targets - if (currentType == null) { - contextList.AddCustom ("assembly"); - contextList.AddCustom ("module"); - contextList.AddCustom ("type"); - } else { - contextList.AddCustom ("param"); - contextList.AddCustom ("field"); - contextList.AddCustom ("property"); - contextList.AddCustom ("method"); - contextList.AddCustom ("event"); - } - contextList.AddCustom ("return"); - } - if (n is MemberType) { - resolveResult = ResolveExpression (((MemberType)n).Target, identifierStart.Unit); - return CreateTypeAndNamespaceCompletionData (location, resolveResult.Item1, ((MemberType)n).Target, resolveResult.Item2); - } - if (n != null/* && !(identifierStart.Item2 is TypeDeclaration)*/) { - csResolver = new CSharpResolver (ctx); - var nodes = new List (); - nodes.Add (n); - if (n.Parent is ICSharpCode.NRefactory.CSharp.Attribute) - nodes.Add (n.Parent); - var astResolver = new CSharpAstResolver (csResolver, identifierStart.Unit, CSharpParsedFile); - astResolver.ApplyNavigator (new NodeListResolveVisitorNavigator (nodes)); - try { - csResolver = astResolver.GetResolverStateBefore (n); - } catch (Exception) { - csResolver = GetState (); - } - // add attribute properties. - if (n.Parent is ICSharpCode.NRefactory.CSharp.Attribute) { - var resolved = astResolver.Resolve (n.Parent); - if (resolved != null && resolved.Type != null) { - foreach (var property in resolved.Type.GetProperties (p => p.Accessibility == Accessibility.Public)) { - contextList.AddMember (property); - } - foreach (var field in resolved.Type.GetFields (p => p.Accessibility == Accessibility.Public)) { - contextList.AddMember (field); + if (n is MemberType) { + resolveResult = ResolveExpression(((MemberType)n).Target, identifierStart.Unit); + return CreateTypeAndNamespaceCompletionData(location, resolveResult.Item1, ((MemberType)n).Target, resolveResult.Item2); + } + if (n != null/* && !(identifierStart.Item2 is TypeDeclaration)*/) { + csResolver = new CSharpResolver (ctx); + var nodes = new List (); + nodes.Add(n); + if (n.Parent is ICSharpCode.NRefactory.CSharp.Attribute) { + nodes.Add(n.Parent); + } + var astResolver = new CSharpAstResolver (csResolver, identifierStart.Unit, CSharpParsedFile); + astResolver.ApplyNavigator(new NodeListResolveVisitorNavigator (nodes)); + try { + csResolver = astResolver.GetResolverStateBefore(n); + } catch (Exception) { + csResolver = GetState(); + } + // add attribute properties. + if (n.Parent is ICSharpCode.NRefactory.CSharp.Attribute) { + var resolved = astResolver.Resolve(n.Parent); + if (resolved != null && resolved.Type != null) { + foreach (var property in resolved.Type.GetProperties (p => p.Accessibility == Accessibility.Public)) { + contextList.AddMember(property); + } + foreach (var field in resolved.Type.GetFields (p => p.Accessibility == Accessibility.Public)) { + contextList.AddMember(field); + } } } + } else { + csResolver = GetState(); } - } else { - csResolver = GetState (); - } // identifier has already started with the first letter - offset--; - AddContextCompletion (contextList, csResolver, identifierStart.Node); - return contextList.Result; + offset--; + AddContextCompletion(contextList, csResolver, identifierStart.Node, identifierStart.Unit); + return contextList.Result; // if (stub.Parent is BlockStatement) // result = FindExpression (dom, completionContext, -1); @@ -738,43 +807,48 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return null; } - IEnumerable HandleEnumContext () + IEnumerable HandleEnumContext() { - var cu = ParseStub ("a", false); - if (cu == null) + var cu = ParseStub("a", false); + if (cu == null) { return null; - var member = cu.GetNodeAt (location); - if (member != null && member.NameToken.EndLocation < location) - return DefaultControlSpaceItems (); + } + var member = cu.GetNodeAt(location); + if (member != null && member.NameToken.EndLocation < location) { + return DefaultControlSpaceItems(); + } return null; } - bool IsInLinqContext (int offset) + bool IsInLinqContext(int offset) { string token; while (null != (token = GetPreviousToken (ref offset, true)) && !IsInsideCommentOrString ()) { - if (token == "from") + if (token == "from") { return true; - if (token == ";" || token == "{") + } + if (token == ";" || token == "{") { return false; + } } return false; } - IEnumerable HandleAccessorContext () + IEnumerable HandleAccessorContext() { - var unit = ParseStub ("get; }", false); - var node = unit.GetNodeAt (location, cn => !(cn is CSharpTokenNode)); - if (node is Accessor) + var unit = ParseStub("get; }", false); + var node = unit.GetNodeAt(location, cn => !(cn is CSharpTokenNode)); + if (node is Accessor) { node = node.Parent; + } var contextList = new CompletionDataWrapper (this); if (node is PropertyDeclaration) { - contextList.AddCustom ("get"); - contextList.AddCustom ("set"); - AddKeywords (contextList, accessorModifierKeywords); + contextList.AddCustom("get"); + contextList.AddCustom("set"); + AddKeywords(contextList, accessorModifierKeywords); } else if (node is CustomEventDeclaration) { - contextList.AddCustom ("add"); - contextList.AddCustom ("remove"); + contextList.AddCustom("add"); + contextList.AddCustom("remove"); } else { return null; } @@ -782,33 +856,38 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return contextList.Result; } - IEnumerable DefaultControlSpaceItems (ExpressionResult xp = null, bool controlSpace = true) + IEnumerable DefaultControlSpaceItems(ExpressionResult xp = null, bool controlSpace = true) { var wrapper = new CompletionDataWrapper (this); - if (offset >= document.TextLength) + if (offset >= document.TextLength) { offset = document.TextLength - 1; + } while (offset > 1 && char.IsWhiteSpace (document.GetCharAt (offset))) { offset--; } - location = document.GetLocation (offset); + location = document.GetLocation(offset); - if (xp == null) - xp = GetExpressionAtCursor (); + if (xp == null) { + xp = GetExpressionAtCursor(); + } AstNode node; + CompilationUnit unit; Tuple rr; if (xp != null) { node = xp.Node; - rr = ResolveExpression (node, xp.Unit); + rr = ResolveExpression(node, xp.Unit); + unit = xp.Unit; } else { - var unit = ParseStub ("a"); - node = unit.GetNodeAt (location); - rr = ResolveExpression (node, unit); + unit = ParseStub("a"); + node = unit.GetNodeAt(location); + rr = ResolveExpression(node, unit); } if (node is Identifier && node.Parent is ForeachStatement) { var foreachStmt = (ForeachStatement)node.Parent; foreach (var possibleName in GenerateNameProposals (foreachStmt.VariableType)) { - if (possibleName.Length > 0) - wrapper.Result.Add (factory.CreateLiteralCompletionData (possibleName.ToString ())); + if (possibleName.Length > 0) { + wrapper.Result.Add(factory.CreateLiteralCompletionData(possibleName.ToString())); + } } AutoSelect = false; @@ -817,14 +896,16 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (node is Identifier && node.Parent is ParameterDeclaration) { - if (!controlSpace) + if (!controlSpace) { return null; + } // Try Parameter name case var param = node.Parent as ParameterDeclaration; if (param != null) { foreach (var possibleName in GenerateNameProposals (param.Type)) { - if (possibleName.Length > 0) - wrapper.Result.Add (factory.CreateLiteralCompletionData (possibleName.ToString ())); + if (possibleName.Length > 0) { + wrapper.Result.Add(factory.CreateLiteralCompletionData(possibleName.ToString())); + } } AutoSelect = false; AutoCompleteEmptyMatch = false; @@ -832,39 +913,40 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } } if (Unit != null && (node == null || node is TypeDeclaration)) { - var constructor = Unit.GetNodeAt (location.Line, location.Column - 3); + var constructor = Unit.GetNodeAt(location.Line, location.Column - 3); if (constructor != null && !constructor.ColonToken.IsNull && constructor.Initializer.IsNull) { - wrapper.AddCustom ("this"); - wrapper.AddCustom ("base"); + wrapper.AddCustom("this"); + wrapper.AddCustom("base"); return wrapper.Result; } } CSharpResolver csResolver = null; - if (rr != null) + if (rr != null) { csResolver = rr.Item2; + } if (csResolver == null) { if (node != null) { - csResolver = GetState (); + csResolver = GetState(); //var astResolver = new CSharpAstResolver (csResolver, node, xp != null ? xp.Item1 : CSharpParsedFile); try { //csResolver = astResolver.GetResolverStateBefore (node); - Console.WriteLine (csResolver.LocalVariables.Count ()); + Console.WriteLine(csResolver.LocalVariables.Count()); } catch (Exception e) { - Console.WriteLine ("E!!!" + e); + Console.WriteLine("E!!!" + e); } } else { - csResolver = GetState (); + csResolver = GetState(); } } - AddContextCompletion (wrapper, csResolver, node); + AddContextCompletion(wrapper, csResolver, node, unit); return wrapper.Result; } - void AddContextCompletion(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node) + void AddContextCompletion(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, CompilationUnit unit) { if (state != null && !(node is AstType)) { foreach (var variable in state.LocalVariables) { @@ -921,127 +1003,141 @@ namespace ICSharpCode.NRefactory.CSharp.Completion wrapper.AddCustom("case"); } } else { - if (((AstType)node).Parent is ParameterDeclaration) + if (((AstType)node).Parent is ParameterDeclaration) { AddKeywords(wrapper, parameterTypePredecessorKeywords); + } } - AddKeywords (wrapper, primitiveTypesKeywords); - if (currentMember != null) - wrapper.AddCustom ("var"); - wrapper.Result.AddRange (factory.CreateCodeTemplateCompletionData ()); + AddKeywords(wrapper, primitiveTypesKeywords); + if (currentMember != null) { + wrapper.AddCustom("var"); + } + wrapper.Result.AddRange(factory.CreateCodeTemplateCompletionData()); if (node != null && node.Role == Roles.Argument) { - var resolved = ResolveExpression (node.Parent, Unit); + var resolved = ResolveExpression(node.Parent, unit); var invokeResult = resolved != null ? resolved.Item1 as CSharpInvocationResolveResult : null; if (invokeResult != null) { int argNum = 0; foreach (var arg in node.Parent.Children.Where (c => c.Role == Roles.Argument)) { - if (arg == node) + if (arg == node) { break; + } argNum++; } var param = argNum < invokeResult.Member.Parameters.Count ? invokeResult.Member.Parameters [argNum] : null; if (param != null && param.Type.Kind == TypeKind.Enum) { - AddEnumMembers (wrapper, param.Type, state); + AddEnumMembers(wrapper, param.Type, state); } } } } - static bool IsInSwitchContext (AstNode node) + static bool IsInSwitchContext(AstNode node) { var n = node; while (n != null && !(n is EntityDeclaration)) { - if (n is SwitchStatement) + if (n is SwitchStatement) { return true; - if (n is BlockStatement) + } + if (n is BlockStatement) { return false; + } n = n.Parent; } return false; } - void AddTypesAndNamespaces (CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, Predicate typePred = null, Predicate memberPred = null) + void AddTypesAndNamespaces(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, Predicate typePred = null, Predicate memberPred = null) { if (currentType != null) { for (var ct = currentType; ct != null; ct = ct.DeclaringTypeDefinition) { foreach (var nestedType in ct.NestedTypes) { - if (typePred == null || typePred (nestedType.Resolve (ctx))) { + if (typePred == null || typePred(nestedType.Resolve(ctx))) { string name = nestedType.Name; - if (IsAttributeContext (node) && name.EndsWith ("Attribute") && name.Length > "Attribute".Length) - name = name.Substring (0, name.Length - "Attribute".Length); - wrapper.AddType (nestedType, name); + if (IsAttributeContext(node) && name.EndsWith("Attribute") && name.Length > "Attribute".Length) { + name = name.Substring(0, name.Length - "Attribute".Length); + } + wrapper.AddType(nestedType, name); } } } if (this.currentMember != null && !(node is AstType)) { - var def = ctx.CurrentTypeDefinition ?? Compilation.MainAssembly.GetTypeDefinition (currentType); + var def = ctx.CurrentTypeDefinition ?? Compilation.MainAssembly.GetTypeDefinition(currentType); if (def != null) { foreach (var member in def.GetMembers ()) { - if (member is IMethod && ((IMethod)member).FullName == "System.Object.Finalize") + if (member is IMethod && ((IMethod)member).FullName == "System.Object.Finalize") { continue; - if (member.EntityType == EntityType.Operator) + } + if (member.EntityType == EntityType.Operator) { continue; - if (memberPred == null || memberPred (member)) - wrapper.AddMember (member); + } + if (memberPred == null || memberPred(member)) { + wrapper.AddMember(member); + } } var declaring = def.DeclaringTypeDefinition; while (declaring != null) { foreach (var member in declaring.GetMembers (m => m.IsStatic)) { - if (memberPred == null || memberPred (member)) - wrapper.AddMember (member); + if (memberPred == null || memberPred(member)) { + wrapper.AddMember(member); + } } declaring = declaring.DeclaringTypeDefinition; } } } foreach (var p in currentType.TypeParameters) { - wrapper.AddTypeParameter (p); + wrapper.AddTypeParameter(p); } } - var scope = CSharpParsedFile.GetUsingScope (location).Resolve (Compilation); + var scope = CSharpParsedFile.GetUsingScope(location).Resolve(Compilation); for (var n = scope; n != null; n = n.Parent) { foreach (var pair in n.UsingAliases) { - wrapper.AddNamespace (pair.Key); + wrapper.AddNamespace(pair.Key); } foreach (var u in n.Usings) { foreach (var type in u.Types) { - if (typePred == null || typePred (type)) { + if (typePred == null || typePred(type)) { string name = type.Name; - if (IsAttributeContext (node) && name.EndsWith ("Attribute") && name.Length > "Attribute".Length) - name = name.Substring (0, name.Length - "Attribute".Length); - wrapper.AddType (type, name); + if (IsAttributeContext(node) && name.EndsWith("Attribute") && name.Length > "Attribute".Length) { + name = name.Substring(0, name.Length - "Attribute".Length); + } + wrapper.AddType(type, name); } } } foreach (var type in n.Namespace.Types) { - if (typePred == null || typePred (type)) - wrapper.AddType (type, type.Name); + if (typePred == null || typePred(type)) { + wrapper.AddType(type, type.Name); + } } foreach (var curNs in n.Namespace.ChildNamespaces) { - wrapper.AddNamespace (curNs.Name); + wrapper.AddNamespace(curNs.Name); } } } - IEnumerable HandleKeywordCompletion (int wordStart, string word) + IEnumerable HandleKeywordCompletion(int wordStart, string word) { - if (IsInsideCommentOrString ()) + if (IsInsideCommentOrString()) { return null; + } switch (word) { - case "using": - case "namespace": - if (currentType != null) - return null; - var wrapper = new CompletionDataWrapper (this); - AddTypesAndNamespaces (wrapper, GetState (), null, t => false); - return wrapper.Result; - case "case": - return CreateCaseCompletionData (location); + case "using": + case "namespace": + if (currentType != null) { + return null; + } + var wrapper = new CompletionDataWrapper (this); + AddTypesAndNamespaces(wrapper, GetState(), null, t => false); + return wrapper.Result; + case "case": + return CreateCaseCompletionData(location); // case ",": // case ":": // if (result.ExpressionContext == ExpressionContext.InheritableType) { @@ -1101,25 +1197,28 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // return completionList; // } // break; - case "is": - case "as": - if (currentType == null) - return null; - IType isAsType = null; - var isAsExpression = GetExpressionAt (wordStart); - if (isAsExpression != null) { - var parent = isAsExpression.Node.Parent; - if (parent is VariableInitializer) - parent = parent.Parent; - if (parent is VariableDeclarationStatement) { - var resolved = ResolveExpression (parent, isAsExpression.Unit); - if (resolved != null) - isAsType = resolved.Item1.Type; - } - } - var isAsWrapper = new CompletionDataWrapper (this); - AddTypesAndNamespaces (isAsWrapper, GetState (), null, t => isAsType == null || t.GetDefinition ().IsDerivedFrom (isAsType.GetDefinition ()), m => false); - return isAsWrapper.Result; + case "is": + case "as": + if (currentType == null) { + return null; + } + IType isAsType = null; + var isAsExpression = GetExpressionAt(wordStart); + if (isAsExpression != null) { + var parent = isAsExpression.Node.Parent; + if (parent is VariableInitializer) { + parent = parent.Parent; + } + if (parent is VariableDeclarationStatement) { + var resolved = ResolveExpression(parent, isAsExpression.Unit); + if (resolved != null) { + isAsType = resolved.Item1.Type; + } + } + } + var isAsWrapper = new CompletionDataWrapper (this); + AddTypesAndNamespaces(isAsWrapper, GetState(), null, t => isAsType == null || t.GetDefinition().IsDerivedFrom(isAsType.GetDefinition()), m => false); + return isAsWrapper.Result; // { // CompletionDataList completionList = new ProjectDomCompletionDataList (); // ExpressionResult expressionResult = FindExpression (dom, completionContext, wordStart - document.Caret.Offset); @@ -1169,151 +1268,161 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // result.ExpressionContext = ExpressionContext.TypeName; // return CreateCtrlSpaceCompletionData (completionContext, result); // } - case "override": + case "override": // Look for modifiers, in order to find the beginning of the declaration - int firstMod = wordStart; - int i = wordStart; - for (int n = 0; n < 3; n++) { - string mod = GetPreviousToken (ref i, true); - if (mod == "public" || mod == "protected" || mod == "private" || mod == "internal" || mod == "sealed") { - firstMod = i; - } else if (mod == "static") { - // static methods are not overridable + int firstMod = wordStart; + int i = wordStart; + for (int n = 0; n < 3; n++) { + string mod = GetPreviousToken(ref i, true); + if (mod == "public" || mod == "protected" || mod == "private" || mod == "internal" || mod == "sealed") { + firstMod = i; + } else if (mod == "static") { + // static methods are not overridable + return null; + } else { + break; + } + } + if (!IsLineEmptyUpToEol()) { return null; - } else - break; - } - if (!IsLineEmptyUpToEol ()) + } + if (currentType != null && (currentType.Kind == TypeKind.Class || currentType.Kind == TypeKind.Struct)) { + string modifiers = document.GetText(firstMod, wordStart - firstMod); + return GetOverrideCompletionData(currentType, modifiers); + } return null; - if (currentType != null && (currentType.Kind == TypeKind.Class || currentType.Kind == TypeKind.Struct)) { - string modifiers = document.GetText (firstMod, wordStart - firstMod); - return GetOverrideCompletionData (currentType, modifiers); - } - return null; - case "partial": + case "partial": // Look for modifiers, in order to find the beginning of the declaration - firstMod = wordStart; - i = wordStart; - for (int n = 0; n < 3; n++) { - string mod = GetPreviousToken (ref i, true); - if (mod == "public" || mod == "protected" || mod == "private" || mod == "internal" || mod == "sealed") { - firstMod = i; - } else if (mod == "static") { - // static methods are not overridable + firstMod = wordStart; + i = wordStart; + for (int n = 0; n < 3; n++) { + string mod = GetPreviousToken(ref i, true); + if (mod == "public" || mod == "protected" || mod == "private" || mod == "internal" || mod == "sealed") { + firstMod = i; + } else if (mod == "static") { + // static methods are not overridable + return null; + } else { + break; + } + } + if (!IsLineEmptyUpToEol()) { return null; - } else - break; - } - if (!IsLineEmptyUpToEol ()) - return null; - var state = GetState (); + } + var state = GetState(); - if (state.CurrentTypeDefinition != null && (state.CurrentTypeDefinition.Kind == TypeKind.Class || state.CurrentTypeDefinition.Kind == TypeKind.Struct)) { - string modifiers = document.GetText (firstMod, wordStart - firstMod); - return GetPartialCompletionData (state.CurrentTypeDefinition, modifiers); - } - return null; + if (state.CurrentTypeDefinition != null && (state.CurrentTypeDefinition.Kind == TypeKind.Class || state.CurrentTypeDefinition.Kind == TypeKind.Struct)) { + string modifiers = document.GetText(firstMod, wordStart - firstMod); + return GetPartialCompletionData(state.CurrentTypeDefinition, modifiers); + } + return null; - case "public": - case "protected": - case "private": - case "internal": - case "sealed": - case "static": - var accessorContext = HandleAccessorContext (); - if (accessorContext != null) - return accessorContext; - wrapper = new CompletionDataWrapper (this); - state = GetState (); - if (currentType != null) { - AddTypesAndNamespaces (wrapper, state, null, null, m => false); - AddKeywords (wrapper, primitiveTypesKeywords); - } - AddKeywords (wrapper, typeLevelKeywords); - return wrapper.Result; - case "new": - int j = offset - 4; + case "public": + case "protected": + case "private": + case "internal": + case "sealed": + case "static": + var accessorContext = HandleAccessorContext(); + if (accessorContext != null) { + return accessorContext; + } + wrapper = new CompletionDataWrapper (this); + state = GetState(); + if (currentType != null) { + AddTypesAndNamespaces(wrapper, state, null, null, m => false); + AddKeywords(wrapper, primitiveTypesKeywords); + } + AddKeywords(wrapper, typeLevelKeywords); + return wrapper.Result; + case "new": + int j = offset - 4; // string token = GetPreviousToken (ref j, true); - IType hintType = null; - var expressionOrVariableDeclaration = GetNewExpressionAt (j); - AstNode newParentNode = null; - AstType hintTypeAst = null; - if (expressionOrVariableDeclaration != null) { - newParentNode = expressionOrVariableDeclaration.Node.Parent; - if (newParentNode is VariableInitializer) - newParentNode = newParentNode.Parent; - } - if (newParentNode is InvocationExpression) { - var invoke = (InvocationExpression)newParentNode; - var resolved = ResolveExpression (invoke, expressionOrVariableDeclaration.Unit); - if (resolved != null) { - var mgr = resolved.Item1 as CSharpInvocationResolveResult; - if (mgr != null) { - int i1 = 0; - foreach (var a in invoke.Arguments) { - if (a == expressionOrVariableDeclaration.Node) { - if (mgr.Member.Parameters.Count > i1) - hintType = mgr.Member.Parameters [i1].Type; - break; + IType hintType = null; + var expressionOrVariableDeclaration = GetNewExpressionAt(j); + AstNode newParentNode = null; + AstType hintTypeAst = null; + if (expressionOrVariableDeclaration != null) { + newParentNode = expressionOrVariableDeclaration.Node.Parent; + if (newParentNode is VariableInitializer) { + newParentNode = newParentNode.Parent; + } + } + if (newParentNode is InvocationExpression) { + var invoke = (InvocationExpression)newParentNode; + var resolved = ResolveExpression(invoke, expressionOrVariableDeclaration.Unit); + if (resolved != null) { + var mgr = resolved.Item1 as CSharpInvocationResolveResult; + if (mgr != null) { + int i1 = 0; + foreach (var a in invoke.Arguments) { + if (a == expressionOrVariableDeclaration.Node) { + if (mgr.Member.Parameters.Count > i1) { + hintType = mgr.Member.Parameters [i1].Type; + } + break; + } + i1++; } - i1++; } } } - } - if (newParentNode is ObjectCreateExpression) { - var invoke = (ObjectCreateExpression)newParentNode; - var resolved = ResolveExpression (invoke, expressionOrVariableDeclaration.Unit); - if (resolved != null) { - var mgr = resolved.Item1 as CSharpInvocationResolveResult; - if (mgr != null) { - int i1 = 0; - foreach (var a in invoke.Arguments) { - if (a == expressionOrVariableDeclaration.Node) { - if (mgr.Member.Parameters.Count > i1) - hintType = mgr.Member.Parameters [i1].Type; - break; + if (newParentNode is ObjectCreateExpression) { + var invoke = (ObjectCreateExpression)newParentNode; + var resolved = ResolveExpression(invoke, expressionOrVariableDeclaration.Unit); + if (resolved != null) { + var mgr = resolved.Item1 as CSharpInvocationResolveResult; + if (mgr != null) { + int i1 = 0; + foreach (var a in invoke.Arguments) { + if (a == expressionOrVariableDeclaration.Node) { + if (mgr.Member.Parameters.Count > i1) { + hintType = mgr.Member.Parameters [i1].Type; + } + break; + } + i1++; } - i1++; } } } - } - if (newParentNode is AssignmentExpression) { - var assign = (AssignmentExpression)newParentNode; - var resolved = ResolveExpression (assign.Left, expressionOrVariableDeclaration.Unit); - if (resolved != null) { - hintType = resolved.Item1.Type; + if (newParentNode is AssignmentExpression) { + var assign = (AssignmentExpression)newParentNode; + var resolved = ResolveExpression(assign.Left, expressionOrVariableDeclaration.Unit); + if (resolved != null) { + hintType = resolved.Item1.Type; + } } - } - if (newParentNode is VariableDeclarationStatement) { - var varDecl = (VariableDeclarationStatement)newParentNode; - hintTypeAst = varDecl.Type; - var resolved = ResolveExpression (varDecl.Type, expressionOrVariableDeclaration.Unit); - if (resolved != null) { - hintType = resolved.Item1.Type; + if (newParentNode is VariableDeclarationStatement) { + var varDecl = (VariableDeclarationStatement)newParentNode; + hintTypeAst = varDecl.Type; + var resolved = ResolveExpression(varDecl.Type, expressionOrVariableDeclaration.Unit); + if (resolved != null) { + hintType = resolved.Item1.Type; + } } - } - if (newParentNode is FieldDeclaration) { - var varDecl = (FieldDeclaration)newParentNode; - hintTypeAst = varDecl.ReturnType; - var resolved = ResolveExpression (varDecl.ReturnType, expressionOrVariableDeclaration.Unit); - if (resolved != null) - hintType = resolved.Item1.Type; - } + if (newParentNode is FieldDeclaration) { + var varDecl = (FieldDeclaration)newParentNode; + hintTypeAst = varDecl.ReturnType; + var resolved = ResolveExpression(varDecl.ReturnType, expressionOrVariableDeclaration.Unit); + if (resolved != null) { + hintType = resolved.Item1.Type; + } + } - if (newParentNode is ReturnStatement) { - var varDecl = (ReturnStatement)newParentNode; - if (ctx.CurrentMember != null) - hintType = ctx.CurrentMember.ReturnType; - } + if (newParentNode is ReturnStatement) { + var varDecl = (ReturnStatement)newParentNode; + if (ctx.CurrentMember != null) { + hintType = ctx.CurrentMember.ReturnType; + } + } - return CreateTypeCompletionData (hintType, hintTypeAst); + return CreateTypeCompletionData(hintType, hintTypeAst); // IType callingType = NRefactoryResolver.GetTypeAtCursor (Document.CompilationUnit, Document.FileName, new TextLocation (document.Caret.Line, document.Caret.Column)); // ExpressionContext newExactContext = new NewCSharpExpressionFinder (dom).FindExactContextForNewCompletion (document, Document.CompilationUnit, Document.FileName, callingType); // if (newExactContext is ExpressionContext.TypeExpressionContext) @@ -1333,23 +1442,24 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // } // } // return CreateCtrlSpaceCompletionData (completionContext, null); - case "if": - case "elif": - if (wordStart > 0 && document.GetCharAt (wordStart - 1) == '#') - return factory.CreatePreProcessorDefinesCompletionData (); - return null; - case "yield": - var yieldDataList = new CompletionDataWrapper (this); - DefaultCompletionString = "return"; - yieldDataList.AddCustom ("break"); - yieldDataList.AddCustom ("return"); - return yieldDataList.Result; - case "in": - var inList = new CompletionDataWrapper (this); - var node = Unit.GetNodeAt (location); - var rr = ResolveExpression (node, Unit); - AddContextCompletion (inList, rr != null ? rr.Item2 : GetState (), node); - return inList.Result; + case "if": + case "elif": + if (wordStart > 0 && document.GetCharAt(wordStart - 1) == '#') { + return factory.CreatePreProcessorDefinesCompletionData(); + } + return null; + case "yield": + var yieldDataList = new CompletionDataWrapper (this); + DefaultCompletionString = "return"; + yieldDataList.AddCustom("break"); + yieldDataList.AddCustom("return"); + return yieldDataList.Result; + case "in": + var inList = new CompletionDataWrapper (this); + var node = Unit.GetNodeAt(location); + var rr = ResolveExpression(node, Unit); + AddContextCompletion(inList, rr != null ? rr.Item2 : GetState(), node, Unit); + return inList.Result; // case "where": // CompletionDataList whereDataList = new CompletionDataList (); // NRefactoryResolver constraintResolver = CreateResolver (); @@ -1368,49 +1478,51 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // // return whereDataList; } -// if (IsInLinqContext (result)) { -// if (linqKeywords.Contains (word)) { -// if (word == "from") // after from no auto code completion. -// return null; -// result.Expression = ""; -// return CreateCtrlSpaceCompletionData (completionContext, result); -// } -// CompletionDataList dataList = new ProjectDomCompletionDataList (); -// CompletionDataCollector col = new CompletionDataCollector (this, dom, dataList, Document.CompilationUnit, null, new TextLocation (completionContext.TriggerLine, completionContext.TriggerLineOffset)); -// foreach (string kw in linqKeywords) { -// col.Add (kw, "md-keyword"); -// } -// return dataList; -// } + // if (IsInLinqContext (result)) { + // if (linqKeywords.Contains (word)) { + // if (word == "from") // after from no auto code completion. + // return null; + // result.Expression = ""; + // return CreateCtrlSpaceCompletionData (completionContext, result); + // } + // CompletionDataList dataList = new ProjectDomCompletionDataList (); + // CompletionDataCollector col = new CompletionDataCollector (this, dom, dataList, Document.CompilationUnit, null, new TextLocation (completionContext.TriggerLine, completionContext.TriggerLineOffset)); + // foreach (string kw in linqKeywords) { + // col.Add (kw, "md-keyword"); + // } + // return dataList; + // } return null; } - bool IsLineEmptyUpToEol () + bool IsLineEmptyUpToEol() { - var line = document.GetLineByNumber (location.Line); + var line = document.GetLineByNumber(location.Line); for (int j = offset; j < line.EndOffset; j++) { - char ch = document.GetCharAt (j); - if (!char.IsWhiteSpace (ch)) + char ch = document.GetCharAt(j); + if (!char.IsWhiteSpace(ch)) { return false; + } } return true; } - string GetLineIndent (int lineNr) + string GetLineIndent(int lineNr) { - var line = document.GetLineByNumber (lineNr); + var line = document.GetLineByNumber(lineNr); for (int j = offset; j < line.EndOffset; j++) { - char ch = document.GetCharAt (j); - if (!char.IsWhiteSpace (ch)) - return document.GetText (line.Offset, j - line.Offset - 1); + char ch = document.GetCharAt(j); + if (!char.IsWhiteSpace(ch)) { + return document.GetText(line.Offset, j - line.Offset - 1); + } } return ""; } - IEnumerable CreateTypeCompletionData (IType hintType, AstType hintTypeAst) + IEnumerable CreateTypeCompletionData(IType hintType, AstType hintTypeAst) { var wrapper = new CompletionDataWrapper (this); - var state = GetState (); + var state = GetState(); Predicate pred = null; if (hintType != null) { @@ -1418,33 +1530,36 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var lookup = new MemberLookup (ctx.CurrentTypeDefinition, Compilation.MainAssembly); pred = t => { // check if type is in inheritance tree. - if (hintType.GetDefinition () != null && !t.GetDefinition ().IsDerivedFrom (hintType.GetDefinition ())) + if (hintType.GetDefinition() != null && !t.GetDefinition().IsDerivedFrom(hintType.GetDefinition())) { return false; - if (t.Kind == TypeKind.Interface && hintType.Kind != TypeKind.Array) + } + if (t.Kind == TypeKind.Interface && hintType.Kind != TypeKind.Array) { return false; + } // check for valid constructors - if (t.GetConstructors ().Count () == 0) + if (t.GetConstructors().Count() == 0) { return true; - bool isProtectedAllowed = currentType != null ? currentType.Resolve (ctx).GetDefinition ().IsDerivedFrom (t.GetDefinition ()) : false; - return t.GetConstructors ().Any (m => lookup.IsAccessible (m, isProtectedAllowed)); + } + bool isProtectedAllowed = currentType != null ? currentType.Resolve(ctx).GetDefinition().IsDerivedFrom(t.GetDefinition()) : false; + return t.GetConstructors().Any(m => lookup.IsAccessible(m, isProtectedAllowed)); }; if (!(hintType.Kind == TypeKind.Interface && hintType.Kind != TypeKind.Array)) { - DefaultCompletionString = GetShortType (hintType, GetState ()); - wrapper.AddType (hintType, DefaultCompletionString); + DefaultCompletionString = GetShortType(hintType, GetState()); + wrapper.AddType(hintType, DefaultCompletionString); } } else { - DefaultCompletionString = hintTypeAst.ToString (); - wrapper.AddType (hintType, DefaultCompletionString); + DefaultCompletionString = hintTypeAst.ToString(); + wrapper.AddType(hintType, DefaultCompletionString); } } - AddTypesAndNamespaces (wrapper, state, null, pred, m => false); - AddKeywords (wrapper, primitiveTypesKeywords.Where (k => k != "void")); + AddTypesAndNamespaces(wrapper, state, null, pred, m => false); + AddKeywords(wrapper, primitiveTypesKeywords.Where(k => k != "void")); CloseOnSquareBrackets = true; AutoCompleteEmptyMatch = true; return wrapper.Result; } - IEnumerable GetOverrideCompletionData (IUnresolvedTypeDefinition type, string modifiers) + IEnumerable GetOverrideCompletionData(IUnresolvedTypeDefinition type, string modifiers) { var wrapper = new CompletionDataWrapper (this); var alreadyInserted = new Dictionary (); @@ -1453,40 +1568,40 @@ namespace ICSharpCode.NRefactory.CSharp.Completion int declarationBegin = offset; int j = declarationBegin; for (int i = 0; i < 3; i++) { - switch (GetPreviousToken (ref j, true)) { - case "public": - case "protected": - case "private": - case "internal": - case "sealed": - case "override": - declarationBegin = j; - break; - case "static": - return null; // don't add override completion for static members + switch (GetPreviousToken(ref j, true)) { + case "public": + case "protected": + case "private": + case "internal": + case "sealed": + case "override": + declarationBegin = j; + break; + case "static": + return null; // don't add override completion for static members } } - AddVirtuals (alreadyInserted, wrapper, modifiers, type.Resolve (ctx), declarationBegin); + AddVirtuals(alreadyInserted, wrapper, modifiers, type.Resolve(ctx), declarationBegin); return wrapper.Result; } - IEnumerable GetPartialCompletionData (ITypeDefinition type, string modifiers) + IEnumerable GetPartialCompletionData(ITypeDefinition type, string modifiers) { var wrapper = new CompletionDataWrapper (this); int declarationBegin = offset; int j = declarationBegin; for (int i = 0; i < 3; i++) { - switch (GetPreviousToken (ref j, true)) { - case "public": - case "protected": - case "private": - case "internal": - case "sealed": - case "override": - declarationBegin = j; - break; - case "static": - return null; // don't add override completion for static members + switch (GetPreviousToken(ref j, true)) { + case "public": + case "protected": + case "private": + case "internal": + case "sealed": + case "override": + declarationBegin = j; + break; + case "static": + return null; // don't add override completion for static members } } @@ -1495,21 +1610,22 @@ namespace ICSharpCode.NRefactory.CSharp.Completion foreach (var part in type.Parts) { foreach (var method in part.Methods) { if (method.BodyRegion.IsEmpty) { - if (GetImplementation (type, method) != null) + if (GetImplementation(type, method) != null) { continue; - methods.Add (method); + } + methods.Add(method); } } } foreach (var method in methods) { - wrapper.Add (factory.CreateNewPartialCompletionData (declarationBegin, method.DeclaringTypeDefinition, method)); + wrapper.Add(factory.CreateNewPartialCompletionData(declarationBegin, method.DeclaringTypeDefinition, method)); } return wrapper.Result; } - IMethod GetImplementation (ITypeDefinition type, IUnresolvedMethod method) + IMethod GetImplementation(ITypeDefinition type, IUnresolvedMethod method) { foreach (var cur in type.Methods) { if (cur.Name == method.Name && cur.Parameters.Count == method.Parameters.Count && !cur.BodyRegion.IsEmpty) { @@ -1520,18 +1636,20 @@ namespace ICSharpCode.NRefactory.CSharp.Completion break; } }*/ - if (equal) + if (equal) { return cur; + } } } return null; } - static string GetNameWithParamCount (IMember member) + static string GetNameWithParamCount(IMember member) { var e = member as IMethod; - if (e == null || e.TypeParameters.Count == 0) + if (e == null || e.TypeParameters.Count == 0) { return member.Name; + } return e.Name + "`" + e.TypeParameters.Count; } @@ -1541,57 +1659,62 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return; } foreach (var m in curType.GetMembers ().Reverse ()) { - if (m.IsSynthetic || curType.Kind != TypeKind.Interface && !m.IsOverridable) + if (m.IsSynthetic || curType.Kind != TypeKind.Interface && !m.IsOverridable) { continue; + } // filter out the "Finalize" methods, because finalizers should be done with destructors. - if (m is IMethod && m.Name == "Finalize") + if (m is IMethod && m.Name == "Finalize") { continue; + } - var data = factory.CreateNewOverrideCompletionData (declarationBegin, currentType, m); - string text = GetNameWithParamCount (m); + var data = factory.CreateNewOverrideCompletionData(declarationBegin, currentType, m); + string text = GetNameWithParamCount(m); // check if the member is already implemented - bool foundMember = curType.GetMembers ().Any (cm => GetNameWithParamCount (cm) == text && cm.DeclaringTypeDefinition == curType.GetDefinition ()); - if (foundMember) + bool foundMember = curType.GetMembers().Any(cm => GetNameWithParamCount(cm) == text && cm.DeclaringTypeDefinition == curType.GetDefinition()); + if (foundMember) { continue; - if (alreadyInserted.ContainsKey (text)) + } + if (alreadyInserted.ContainsKey(text)) { continue; + } alreadyInserted [text] = true; - data.CompletionCategory = col.GetCompletionCategory (curType); - col.Add (data); + data.CompletionCategory = col.GetCompletionCategory(curType); + col.Add(data); } } - static void AddKeywords (CompletionDataWrapper wrapper, IEnumerable keywords) + static void AddKeywords(CompletionDataWrapper wrapper, IEnumerable keywords) { foreach (string keyword in keywords) { - wrapper.AddCustom (keyword); + wrapper.AddCustom(keyword); } } - public string GetPreviousMemberReferenceExpression (int tokenIndex) + public string GetPreviousMemberReferenceExpression(int tokenIndex) { - string result = GetPreviousToken (ref tokenIndex, false); - result = GetPreviousToken (ref tokenIndex, false); + string result = GetPreviousToken(ref tokenIndex, false); + result = GetPreviousToken(ref tokenIndex, false); if (result != ".") { result = null; } else { var names = new List (); while (result == ".") { - result = GetPreviousToken (ref tokenIndex, false); + result = GetPreviousToken(ref tokenIndex, false); if (result == "this") { - names.Add ("handle"); + names.Add("handle"); } else if (result != null) { - string trimmedName = result.Trim (); - if (trimmedName.Length == 0) + string trimmedName = result.Trim(); + if (trimmedName.Length == 0) { break; - names.Insert (0, trimmedName); + } + names.Insert(0, trimmedName); } - result = GetPreviousToken (ref tokenIndex, false); + result = GetPreviousToken(ref tokenIndex, false); } - result = String.Join ("", names.ToArray ()); + result = String.Join("", names.ToArray()); foreach (char ch in result) { - if (!char.IsLetterOrDigit (ch) && ch != '_') { + if (!char.IsLetterOrDigit(ch) && ch != '_') { result = ""; break; } @@ -1600,45 +1723,49 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return result; } - bool MatchDelegate (IType delegateType, IUnresolvedMethod method) + bool MatchDelegate(IType delegateType, IUnresolvedMethod method) { - var delegateMethod = delegateType.GetDelegateInvokeMethod (); - if (delegateMethod == null || delegateMethod.Parameters.Count != method.Parameters.Count) + var delegateMethod = delegateType.GetDelegateInvokeMethod(); + if (delegateMethod == null || delegateMethod.Parameters.Count != method.Parameters.Count) { return false; + } for (int i = 0; i < delegateMethod.Parameters.Count; i++) { - if (!delegateMethod.Parameters [i].Type.Equals (method.Parameters [i].Type.Resolve (ctx))) + if (!delegateMethod.Parameters [i].Type.Equals(method.Parameters [i].Type.Resolve(ctx))) { return false; + } } return true; } - string AddDelegateHandlers (CompletionDataWrapper completionList, IType delegateType, bool addSemicolon = true, bool addDefault = true) + string AddDelegateHandlers(CompletionDataWrapper completionList, IType delegateType, bool addSemicolon = true, bool addDefault = true) { - IMethod delegateMethod = delegateType.GetDelegateInvokeMethod (); - var thisLineIndent = GetLineIndent (location.Line); + IMethod delegateMethod = delegateType.GetDelegateInvokeMethod(); + var thisLineIndent = GetLineIndent(location.Line); string delegateEndString = EolMarker + thisLineIndent + "}" + (addSemicolon ? ";" : ""); - bool containsDelegateData = completionList.Result.Any (d => d.DisplayText.StartsWith ("delegate(")); - if (addDefault) - completionList.AddCustom ("delegate", "Creates anonymous delegate.", "delegate {" + EolMarker + thisLineIndent + IndentString + "|" + delegateEndString); + bool containsDelegateData = completionList.Result.Any(d => d.DisplayText.StartsWith("delegate(")); + if (addDefault) { + completionList.AddCustom("delegate", "Creates anonymous delegate.", "delegate {" + EolMarker + thisLineIndent + IndentString + "|" + delegateEndString); + } var sb = new StringBuilder ("("); var sbWithoutTypes = new StringBuilder ("("); for (int k = 0; k < delegateMethod.Parameters.Count; k++) { if (k > 0) { - sb.Append (", "); - sbWithoutTypes.Append (", "); + sb.Append(", "); + sbWithoutTypes.Append(", "); } var parameterType = delegateMethod.Parameters [k].Type; - sb.Append (GetShortType (parameterType, GetState ())); - sb.Append (" "); - sb.Append (delegateMethod.Parameters [k].Name); - sbWithoutTypes.Append (delegateMethod.Parameters [k].Name); - } - sb.Append (")"); - sbWithoutTypes.Append (")"); - completionList.AddCustom ("delegate" + sb, "Creates anonymous delegate.", "delegate" + sb + " {" + EolMarker + thisLineIndent + IndentString + "|" + delegateEndString); - if (!completionList.Result.Any (data => data.DisplayText == sbWithoutTypes.ToString ())) - completionList.AddCustom (sbWithoutTypes.ToString (), "Creates lambda expression.", sbWithoutTypes + " => |" + (addSemicolon ? ";" : "")); + sb.Append(GetShortType(parameterType, GetState())); + sb.Append(" "); + sb.Append(delegateMethod.Parameters [k].Name); + sbWithoutTypes.Append(delegateMethod.Parameters [k].Name); + } + sb.Append(")"); + sbWithoutTypes.Append(")"); + completionList.AddCustom("delegate" + sb, "Creates anonymous delegate.", "delegate" + sb + " {" + EolMarker + thisLineIndent + IndentString + "|" + delegateEndString); + if (!completionList.Result.Any(data => data.DisplayText == sbWithoutTypes.ToString())) { + completionList.AddCustom(sbWithoutTypes.ToString(), "Creates lambda expression.", sbWithoutTypes + " => |" + (addSemicolon ? ";" : "")); + } /* TODO:Make factory method out of it. // It's needed to temporarly disable inserting auto matching bracket because the anonymous delegates are selectable with '(' // otherwise we would end up with () => ) @@ -1649,32 +1776,36 @@ namespace ICSharpCode.NRefactory.CSharp.Completion MonoDevelop.SourceEditor.DefaultSourceEditorOptions.Instance.AutoInsertMatchingBracket = savedValue; }; }*/ - return sb.ToString (); + return sb.ToString(); } - bool IsAccessibleFrom (IEntity member, ITypeDefinition calledType, IMember currentMember, bool includeProtected) + bool IsAccessibleFrom(IEntity member, ITypeDefinition calledType, IMember currentMember, bool includeProtected) { - if (currentMember == null) + if (currentMember == null) { return member.IsStatic || member.IsPublic; -// if (currentMember is MonoDevelop.Projects.Dom.BaseResolveResult.BaseMemberDecorator) -// return member.IsPublic | member.IsProtected; + } + // if (currentMember is MonoDevelop.Projects.Dom.BaseResolveResult.BaseMemberDecorator) + // return member.IsPublic | member.IsProtected; // if (member.IsStatic && !IsStatic) // return false; - if (member.IsPublic || calledType != null && calledType.Kind == TypeKind.Interface && !member.IsProtected) + if (member.IsPublic || calledType != null && calledType.Kind == TypeKind.Interface && !member.IsProtected) { return true; + } if (member.DeclaringTypeDefinition != null) { - if (member.DeclaringTypeDefinition.Kind == TypeKind.Interface) - return IsAccessibleFrom (member.DeclaringTypeDefinition, calledType, currentMember, includeProtected); + if (member.DeclaringTypeDefinition.Kind == TypeKind.Interface) { + return IsAccessibleFrom(member.DeclaringTypeDefinition, calledType, currentMember, includeProtected); + } - if (member.IsProtected && !(member.DeclaringTypeDefinition.IsProtectedOrInternal && !includeProtected)) + if (member.IsProtected && !(member.DeclaringTypeDefinition.IsProtectedOrInternal && !includeProtected)) { return includeProtected; + } } if (member.IsInternal || member.IsProtectedAndInternal || member.IsProtectedOrInternal) { var type1 = member is ITypeDefinition ? (ITypeDefinition)member : member.DeclaringTypeDefinition; var type2 = currentMember is ITypeDefinition ? (ITypeDefinition)currentMember : currentMember.DeclaringTypeDefinition; bool result = true; // easy case, projects are the same -/*// if (type1.ProjectContent == type2.ProjectContent) { + /*// if (type1.ProjectContent == type2.ProjectContent) { // result = true; // } else if (type1.ProjectContent != null) { @@ -1693,14 +1824,16 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return member.IsProtectedAndInternal ? includeProtected && result : result; } - if (!(currentMember is IType) && (currentMember.DeclaringTypeDefinition == null || member.DeclaringTypeDefinition == null)) + if (!(currentMember is IType) && (currentMember.DeclaringTypeDefinition == null || member.DeclaringTypeDefinition == null)) { return false; + } // inner class var declaringType = currentMember.DeclaringTypeDefinition; while (declaringType != null) { - if (declaringType.ReflectionName == currentMember.DeclaringType.ReflectionName) + if (declaringType.ReflectionName == currentMember.DeclaringType.ReflectionName) { return true; + } declaringType = declaringType.DeclaringTypeDefinition; } @@ -1708,162 +1841,175 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return currentMember.DeclaringTypeDefinition != null && member.DeclaringTypeDefinition.FullName == currentMember.DeclaringTypeDefinition.FullName; } - static bool IsAttributeContext (AstNode node) + static bool IsAttributeContext(AstNode node) { AstNode n = node; - while (n is AstType) + while (n is AstType) { n = n.Parent; + } return n is Attribute; } - IType GuessHintType (AstNode resolvedNode) + IType GuessHintType(AstNode resolvedNode) { - ObjectCreateExpression oce = resolvedNode.Parent as ObjectCreateExpression ?? (ObjectCreateExpression)resolvedNode.Ancestors.FirstOrDefault (n => n is ObjectCreateExpression); - if (oce != null && oce.Parent is ReturnStatement) + ObjectCreateExpression oce = resolvedNode.Parent as ObjectCreateExpression ?? (ObjectCreateExpression)resolvedNode.Ancestors.FirstOrDefault(n => n is ObjectCreateExpression); + if (oce != null && oce.Parent is ReturnStatement) { return ctx.CurrentMember != null ? ctx.CurrentMember.ReturnType : null; + } return null; } - IEnumerable CreateTypeAndNamespaceCompletionData (TextLocation location, ResolveResult resolveResult, AstNode resolvedNode, CSharpResolver state) + IEnumerable CreateTypeAndNamespaceCompletionData(TextLocation location, ResolveResult resolveResult, AstNode resolvedNode, CSharpResolver state) { - if (resolveResult == null || resolveResult.IsError) + if (resolveResult == null || resolveResult.IsError) { return null; + } - var hintType = GuessHintType (resolvedNode); + var hintType = GuessHintType(resolvedNode); var result = new CompletionDataWrapper (this); if (resolveResult is NamespaceResolveResult) { var nr = (NamespaceResolveResult)resolveResult; if (!(resolvedNode.Parent is UsingDeclaration || resolvedNode.Parent != null && resolvedNode.Parent.Parent is UsingDeclaration)) { foreach (var cl in nr.Namespace.Types) { string name = cl.Name; - if (hintType != null && hintType.Kind != TypeKind.Array && cl.Kind == TypeKind.Interface) + if (hintType != null && hintType.Kind != TypeKind.Array && cl.Kind == TypeKind.Interface) { continue; - if (IsAttributeContext (resolvedNode) && name.EndsWith ("Attribute") && name.Length > "Attribute".Length) - name = name.Substring (0, name.Length - "Attribute".Length); - result.AddType (cl, name); + } + if (IsAttributeContext(resolvedNode) && name.EndsWith("Attribute") && name.Length > "Attribute".Length) { + name = name.Substring(0, name.Length - "Attribute".Length); + } + result.AddType(cl, name); } } foreach (var ns in nr.Namespace.ChildNamespaces) { - result.AddNamespace (ns.Name); + result.AddNamespace(ns.Name); } } else if (resolveResult is TypeResolveResult) { var type = resolveResult.Type; foreach (var nested in type.GetNestedTypes ()) { - if (hintType != null && hintType.Kind != TypeKind.Array && nested.Kind == TypeKind.Interface) + if (hintType != null && hintType.Kind != TypeKind.Array && nested.Kind == TypeKind.Interface) { continue; - result.AddType (nested, nested.Name); + } + result.AddType(nested, nested.Name); } } return result.Result; } - IEnumerable CreateTypeList () + IEnumerable CreateTypeList() { foreach (var cl in Compilation.RootNamespace.Types) { - yield return factory.CreateTypeCompletionData (cl, cl.Name); + yield return factory.CreateTypeCompletionData(cl, cl.Name); } foreach (var ns in Compilation.RootNamespace.ChildNamespaces) { - yield return factory.CreateNamespaceCompletionData (ns.Name); + yield return factory.CreateNamespaceCompletionData(ns.Name); } } - IEnumerable CreateParameterCompletion (MethodGroupResolveResult resolveResult, CSharpResolver state, AstNode invocation, int parameter, bool controlSpace) + IEnumerable CreateParameterCompletion(MethodGroupResolveResult resolveResult, CSharpResolver state, AstNode invocation, CompilationUnit unit, int parameter, bool controlSpace) { var result = new CompletionDataWrapper (this); var addedEnums = new HashSet (); var addedDelegates = new HashSet (); foreach (var method in resolveResult.Methods) { - if (method.Parameters.Count <= parameter) + if (method.Parameters.Count <= parameter) { continue; + } var resolvedType = method.Parameters [parameter].Type; if (resolvedType.Kind == TypeKind.Enum) { - if (addedEnums.Contains (resolvedType.ReflectionName)) + if (addedEnums.Contains(resolvedType.ReflectionName)) { continue; - addedEnums.Add (resolvedType.ReflectionName); - AddEnumMembers (result, resolvedType, state); + } + addedEnums.Add(resolvedType.ReflectionName); + AddEnumMembers(result, resolvedType, state); } else if (resolvedType.Kind == TypeKind.Delegate) { -// if (addedDelegates.Contains (resolvedType.DecoratedFullName)) -// continue; -// addedDelegates.Add (resolvedType.DecoratedFullName); -// string parameterDefinition = AddDelegateHandlers (completionList, resolvedType, false, addedDelegates.Count == 1); -// string varName = "Handle" + method.Parameters [parameter].ReturnType.Name + method.Parameters [parameter].Name; -// result.Add (new EventCreationCompletionData (document, varName, resolvedType, null, parameterDefinition, resolver.Unit.GetMemberAt (location), resolvedType) { AddSemicolon = false }); + // if (addedDelegates.Contains (resolvedType.DecoratedFullName)) + // continue; + // addedDelegates.Add (resolvedType.DecoratedFullName); + // string parameterDefinition = AddDelegateHandlers (completionList, resolvedType, false, addedDelegates.Count == 1); + // string varName = "Handle" + method.Parameters [parameter].ReturnType.Name + method.Parameters [parameter].Name; + // result.Add (new EventCreationCompletionData (document, varName, resolvedType, null, parameterDefinition, resolver.Unit.GetMemberAt (location), resolvedType) { AddSemicolon = false }); } } if (!controlSpace) { - if (addedEnums.Count + addedDelegates.Count == 0) - return Enumerable.Empty (); + if (addedEnums.Count + addedDelegates.Count == 0) { + return Enumerable.Empty(); + } AutoCompleteEmptyMatch = false; AutoSelect = false; } - AddContextCompletion (result, state, invocation); + AddContextCompletion(result, state, invocation, unit); -// resolver.AddAccessibleCodeCompletionData (ExpressionContext.MethodBody, cdc); -// if (addedDelegates.Count > 0) { -// foreach (var data in result.Result) { -// if (data is MemberCompletionData) -// ((MemberCompletionData)data).IsDelegateExpected = true; -// } -// } + // resolver.AddAccessibleCodeCompletionData (ExpressionContext.MethodBody, cdc); + // if (addedDelegates.Count > 0) { + // foreach (var data in result.Result) { + // if (data is MemberCompletionData) + // ((MemberCompletionData)data).IsDelegateExpected = true; + // } + // } return result.Result; } - string GetShortType (IType type, CSharpResolver state) + string GetShortType(IType type, CSharpResolver state) { var builder = new TypeSystemAstBuilder (state); var dt = state.CurrentTypeDefinition; - var declaring = type.DeclaringType != null ? type.DeclaringType.GetDefinition () : null; + var declaring = type.DeclaringType != null ? type.DeclaringType.GetDefinition() : null; if (declaring != null) { while (dt != null) { - if (dt.Equals (declaring)) { + if (dt.Equals(declaring)) { builder.AlwaysUseShortTypeNames = true; break; } dt = dt.DeclaringTypeDefinition; } } - var shortType = builder.ConvertType (type); - return shortType.GetText (FormattingPolicy); + var shortType = builder.ConvertType(type); + return shortType.GetText(FormattingPolicy); } - void AddEnumMembers (CompletionDataWrapper completionList, IType resolvedType, CSharpResolver state) + void AddEnumMembers(CompletionDataWrapper completionList, IType resolvedType, CSharpResolver state) { - if (resolvedType.Kind != TypeKind.Enum) + if (resolvedType.Kind != TypeKind.Enum) { return; - string typeString = GetShortType (resolvedType, state); - if (typeString.Contains (".")) - completionList.AddType (resolvedType, typeString); + } + string typeString = GetShortType(resolvedType, state); + if (typeString.Contains(".")) { + completionList.AddType(resolvedType, typeString); + } foreach (var field in resolvedType.GetFields ()) { - if (field.IsConst || field.IsStatic) - completionList.Result.Add (factory.CreateEntityCompletionData (field, typeString + "." + field.Name)); + if (field.IsConst || field.IsStatic) { + completionList.Result.Add(factory.CreateEntityCompletionData(field, typeString + "." + field.Name)); + } } DefaultCompletionString = typeString; } - IEnumerable CreateCompletionData (TextLocation location, ResolveResult resolveResult, AstNode resolvedNode, CSharpResolver state) + IEnumerable CreateCompletionData(TextLocation location, ResolveResult resolveResult, AstNode resolvedNode, CSharpResolver state) { - if (resolveResult == null /*|| resolveResult.IsError*/) + if (resolveResult == null /*|| resolveResult.IsError*/) { return null; + } if (resolveResult is NamespaceResolveResult) { var nr = (NamespaceResolveResult)resolveResult; var namespaceContents = new CompletionDataWrapper (this); foreach (var cl in nr.Namespace.Types) { - namespaceContents.AddType (cl, cl.Name); + namespaceContents.AddType(cl, cl.Name); } foreach (var ns in nr.Namespace.ChildNamespaces) { - namespaceContents.AddNamespace (ns.Name); + namespaceContents.AddNamespace(ns.Name); } return namespaceContents.Result; } IType type = resolveResult.Type; - var typeDef = resolveResult.Type.GetDefinition (); + var typeDef = resolveResult.Type.GetDefinition(); var result = new CompletionDataWrapper (this); bool includeStaticMembers = false; @@ -1875,17 +2021,18 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (resolveResult is TypeResolveResult && type.Kind == TypeKind.Enum) { foreach (var field in type.GetFields ()) { - result.AddMember (field); + result.AddMember(field); } foreach (var m in type.GetMethods ()) { - if (m.Name == "TryParse") - result.AddMember (m); + if (m.Name == "TryParse") { + result.AddMember(m); + } } return result.Result; } var lookup = new MemberLookup (ctx.CurrentTypeDefinition, Compilation.MainAssembly); - bool isProtectedAllowed = resolveResult is ThisResolveResult ? true : lookup.IsProtectedAccessAllowed (type); + bool isProtectedAllowed = resolveResult is ThisResolveResult ? true : lookup.IsProtectedAccessAllowed(type); bool skipNonStaticMembers = (resolveResult is TypeResolveResult); if (resolveResult is MemberResolveResult && resolvedNode is IdentifierExpression) { @@ -1893,17 +2040,17 @@ namespace ICSharpCode.NRefactory.CSharp.Completion includeStaticMembers = mrr.Member.Name == mrr.Type.Name; TypeResolveResult trr; - if (state.IsVariableReferenceWithSameType (resolveResult, ((IdentifierExpression)resolvedNode).Identifier, out trr)) { + if (state.IsVariableReferenceWithSameType(resolveResult, ((IdentifierExpression)resolvedNode).Identifier, out trr)) { if (currentMember != null && mrr.Member.IsStatic ^ currentMember.IsStatic) { skipNonStaticMembers = true; if (trr.Type.Kind == TypeKind.Enum) { foreach (var field in trr.Type.GetFields ()) { - result.AddMember (field); + result.AddMember(field); } foreach (var m in trr.Type.GetMethods ()) { if (m.Name == "TryParse" && m.IsStatic) { - result.AddMember (m); + result.AddMember(m); } } return result.Result; @@ -1911,16 +2058,16 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } } // ADD Aliases - var scope = CSharpParsedFile.GetUsingScope (location).Resolve (Compilation); + var scope = CSharpParsedFile.GetUsingScope(location).Resolve(Compilation); for (var n = scope; n != null; n = n.Parent) { foreach (var pair in n.UsingAliases) { if (pair.Key == mrr.Member.Name) { foreach (var r in CreateCompletionData (location, pair.Value, resolvedNode, state)) { if (r is IEntityCompletionData && ((IEntityCompletionData)r).Entity is IMember) { - result.AddMember ((IMember)((IEntityCompletionData)r).Entity); + result.AddMember((IMember)((IEntityCompletionData)r).Entity); } else { - result.Add (r); + result.Add(r); } } } @@ -1933,219 +2080,217 @@ namespace ICSharpCode.NRefactory.CSharp.Completion includeStaticMembers = true; } -// Console.WriteLine ("type:" + type +"/"+type.GetType ()); -// Console.WriteLine ("current:" + ctx.CurrentTypeDefinition); -// Console.WriteLine ("IS PROT ALLOWED:" + isProtectedAllowed + " static: "+ includeStaticMembers); -// Console.WriteLine (resolveResult); -// Console.WriteLine ("node:" + resolvedNode); -// Console.WriteLine (currentMember != null ? currentMember.IsStatic : "currentMember == null"); + // Console.WriteLine ("type:" + type +"/"+type.GetType ()); + // Console.WriteLine ("current:" + ctx.CurrentTypeDefinition); + // Console.WriteLine ("IS PROT ALLOWED:" + isProtectedAllowed + " static: "+ includeStaticMembers); + // Console.WriteLine (resolveResult); + // Console.WriteLine ("node:" + resolvedNode); + // Console.WriteLine (currentMember != null ? currentMember.IsStatic : "currentMember == null"); - if (resolvedNode.Annotation () == null) { //tags the created expression as part of an object create expression. + if (resolvedNode.Annotation() == null) { + //tags the created expression as part of an object create expression. var filteredList = new List (); foreach (var member in type.GetMembers ()) { - if (member.EntityType == EntityType.Indexer || member.EntityType == EntityType.Operator || member.EntityType == EntityType.Constructor || member.EntityType == EntityType.Destructor) + if (member.EntityType == EntityType.Indexer || member.EntityType == EntityType.Operator || member.EntityType == EntityType.Constructor || member.EntityType == EntityType.Destructor) { continue; -// Console.WriteLine ("member:" + member + member.IsShadowing); - if (!lookup.IsAccessible (member, isProtectedAllowed)) { -// Console.WriteLine ("skip access: " + member.FullName); + } + // Console.WriteLine ("member:" + member + member.IsShadowing); + if (!lookup.IsAccessible(member, isProtectedAllowed)) { + // Console.WriteLine ("skip access: " + member.FullName); continue; } - if (resolvedNode is BaseReferenceExpression && member.IsAbstract) + if (resolvedNode is BaseReferenceExpression && member.IsAbstract) { continue; + } bool memberIsStatic = member.IsStatic; if (!includeStaticMembers && memberIsStatic && !(resolveResult is TypeResolveResult)) { -// Console.WriteLine ("skip static member: " + member.FullName); + // Console.WriteLine ("skip static member: " + member.FullName); continue; } var field = member as IField; - if (field != null) + if (field != null) { memberIsStatic |= field.IsConst; + } if (!memberIsStatic && skipNonStaticMembers) { continue; } - if (member is IMethod && ((IMethod)member).FullName == "System.Object.Finalize") + if (member is IMethod && ((IMethod)member).FullName == "System.Object.Finalize") { continue; - if (member.EntityType == EntityType.Operator) + } + if (member.EntityType == EntityType.Operator) { continue; - if (member.IsShadowing) - filteredList.RemoveAll (m => m.Name == member.Name); + } + if (member.IsShadowing) { + filteredList.RemoveAll(m => m.Name == member.Name); + } - filteredList.Add (member); + filteredList.Add(member); } foreach (var member in filteredList) { -// Console.WriteLine ("add:" + member + "/" + member.IsStatic); - result.AddMember (member); + // Console.WriteLine ("add:" + member + "/" + member.IsStatic); + result.AddMember(member); } } if (resolveResult is TypeResolveResult || includeStaticMembers) { foreach (var nested in type.GetNestedTypes ()) { - result.AddType (nested, nested.Name); + result.AddType(nested, nested.Name); } } else { foreach (var meths in state.GetExtensionMethods (type)) { foreach (var m in meths) { - result.AddMember (m); - } - } - } - -// IEnumerable objects = resolveResult.CreateResolveResult (dom, resolver != null ? resolver.CallingMember : null); -// CompletionDataCollector col = new CompletionDataCollector (this, dom, result, Document.CompilationUnit, resolver != null ? resolver.CallingType : null, location); -// col.HideExtensionParameter = !resolveResult.StaticResolve; -// col.NamePrefix = expressionResult.Expression; -// bool showOnlyTypes = expressionResult.Contexts.Any (ctx => ctx == ExpressionContext.InheritableType || ctx == ExpressionContext.Constraints); -// if (objects != null) { -// foreach (object obj in objects) { -// if (expressionResult.ExpressionContext != null && expressionResult.ExpressionContext.FilterEntry (obj)) -// continue; -// if (expressionResult.ExpressionContext == ExpressionContext.NamespaceNameExcepted && !(obj is Namespace)) -// continue; -// if (showOnlyTypes && !(obj is IType)) -// continue; -// CompletionData data = col.Add (obj); -// if (data != null && expressionResult.ExpressionContext == ExpressionContext.Attribute && data.CompletionText != null && data.CompletionText.EndsWith ("Attribute")) { -// string newText = data.CompletionText.Substring (0, data.CompletionText.Length - "Attribute".Length); -// data.SetText (newText); -// } -// } -// } + result.AddMember(m); + } + } + } + + // IEnumerable objects = resolveResult.CreateResolveResult (dom, resolver != null ? resolver.CallingMember : null); + // CompletionDataCollector col = new CompletionDataCollector (this, dom, result, Document.CompilationUnit, resolver != null ? resolver.CallingType : null, location); + // col.HideExtensionParameter = !resolveResult.StaticResolve; + // col.NamePrefix = expressionResult.Expression; + // bool showOnlyTypes = expressionResult.Contexts.Any (ctx => ctx == ExpressionContext.InheritableType || ctx == ExpressionContext.Constraints); + // if (objects != null) { + // foreach (object obj in objects) { + // if (expressionResult.ExpressionContext != null && expressionResult.ExpressionContext.FilterEntry (obj)) + // continue; + // if (expressionResult.ExpressionContext == ExpressionContext.NamespaceNameExcepted && !(obj is Namespace)) + // continue; + // if (showOnlyTypes && !(obj is IType)) + // continue; + // CompletionData data = col.Add (obj); + // if (data != null && expressionResult.ExpressionContext == ExpressionContext.Attribute && data.CompletionText != null && data.CompletionText.EndsWith ("Attribute")) { + // string newText = data.CompletionText.Substring (0, data.CompletionText.Length - "Attribute".Length); + // data.SetText (newText); + // } + // } + // } return result.Result; } - IEnumerable CreateCaseCompletionData (TextLocation location) + IEnumerable CreateCaseCompletionData(TextLocation location) { - var unit = ParseStub ("a: break;"); - if (unit == null) + var unit = ParseStub("a: break;"); + if (unit == null) { return null; - var s = unit.GetNodeAt (location); - if (s == null) + } + var s = unit.GetNodeAt(location); + if (s == null) { return null; + } - var offset = document.GetOffset (s.Expression.StartLocation); - var expr = GetExpressionAt (offset); - if (expr == null) + var offset = document.GetOffset(s.Expression.StartLocation); + var expr = GetExpressionAt(offset); + if (expr == null) { return null; + } - var resolveResult = ResolveExpression (expr); - if (resolveResult == null || resolveResult.Item1.Type.Kind != TypeKind.Enum) + var resolveResult = ResolveExpression(expr); + if (resolveResult == null || resolveResult.Item1.Type.Kind != TypeKind.Enum) { return null; + } var wrapper = new CompletionDataWrapper (this); - AddEnumMembers (wrapper, resolveResult.Item1.Type, resolveResult.Item2); + AddEnumMembers(wrapper, resolveResult.Item1.Type, resolveResult.Item2); AutoCompleteEmptyMatch = false; return wrapper.Result; } #region Parsing methods - ExpressionResult GetExpressionBeforeCursor () + ExpressionResult GetExpressionBeforeCursor() { CompilationUnit baseUnit; if (currentMember == null) { - baseUnit = ParseStub ("a", false); - var type = baseUnit.GetNodeAt (location); + baseUnit = ParseStub("a", false); + var type = baseUnit.GetNodeAt(location); if (type == null) { - baseUnit = ParseStub ("a;", false); - type = baseUnit.GetNodeAt (location); + baseUnit = ParseStub("a;", false); + type = baseUnit.GetNodeAt(location); } if (type == null) { - baseUnit = ParseStub ("A a;", false); - type = baseUnit.GetNodeAt (location); + baseUnit = ParseStub("A a;", false); + type = baseUnit.GetNodeAt(location); } if (type != null) { - if (currentType == null) { - return new ExpressionResult ((AstNode)type.Target, baseUnit); - } - - var target = type.Target; - target.Remove (); - var node = Unit.GetNodeAt (location) ?? Unit; - node.AddChild (target, Roles.Type); - return new ExpressionResult ((AstNode)target, Unit); + return new ExpressionResult ((AstNode)type.Target, baseUnit); } } - baseUnit = ParseStub ("a()", false); - var curNode = baseUnit.GetNodeAt (location); + baseUnit = ParseStub("a()", false); + var curNode = baseUnit.GetNodeAt(location); // hack for local variable declaration missing ';' issue - remove that if it works. - if (curNode is EntityDeclaration || baseUnit.GetNodeAt (location) == null) { - baseUnit = ParseStub ("a()"); - curNode = baseUnit.GetNodeAt (location); + if (curNode is EntityDeclaration || baseUnit.GetNodeAt(location) == null) { + baseUnit = ParseStub("a()"); + curNode = baseUnit.GetNodeAt(location); } // Hack for handle object initializer continuation expressions - if (curNode is EntityDeclaration || baseUnit.GetNodeAt (location) == null) { - baseUnit = ParseStub ("a()};"); + if (curNode is EntityDeclaration || baseUnit.GetNodeAt(location) == null) { + baseUnit = ParseStub("a()};"); } - var mref = baseUnit.GetNodeAt (location); + var mref = baseUnit.GetNodeAt(location); if (currentMember == null && currentType == null) { - if (mref != null) + if (mref != null) { return new ExpressionResult ((AstNode)mref.Target, baseUnit); + } return null; } var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; if (mref == null) { - var invoke = baseUnit.GetNodeAt (location); - if (invoke != null) + var invoke = baseUnit.GetNodeAt(location); + if (invoke != null) { mref = invoke.Target as MemberReferenceExpression; + } } AstNode expr = null; if (mref != null) { - expr = mref.Target.Clone (); - mref.Parent.ReplaceWith (expr); + expr = mref.Target.Clone(); + mref.Parent.ReplaceWith(expr); } else { - Expression tref = baseUnit.GetNodeAt (location); + Expression tref = baseUnit.GetNodeAt(location); MemberType memberType = tref != null ? ((TypeReferenceExpression)tref).Type as MemberType : null; if (memberType == null) { - memberType = baseUnit.GetNodeAt (location); + memberType = baseUnit.GetNodeAt(location); if (memberType != null) { if (memberType.Parent is ObjectCreateExpression) { - var mt = memberType.Target.Clone (); - memberType.ReplaceWith (mt); + var mt = memberType.Target.Clone(); + memberType.ReplaceWith(mt); expr = mt; goto exit; } else { - tref = baseUnit.GetNodeAt (location); + tref = baseUnit.GetNodeAt(location); if (tref == null) { - tref = new TypeReferenceExpression (memberType.Clone ()); - memberType.Parent.AddChild (tref, Roles.Expression); + tref = new TypeReferenceExpression (memberType.Clone()); + memberType.Parent.AddChild(tref, Roles.Expression); } if (tref is ObjectCreateExpression) { - expr = new TypeReferenceExpression (memberType.Target.Clone ()); - expr.AddAnnotation (new ObjectCreateExpression ()); + expr = new TypeReferenceExpression (memberType.Target.Clone()); + expr.AddAnnotation(new ObjectCreateExpression ()); } } } } - if (memberType == null) + if (memberType == null) { return null; + } if (expr == null) { - expr = new TypeReferenceExpression (memberType.Target.Clone ()); + expr = new TypeReferenceExpression (memberType.Target.Clone()); } - tref.ReplaceWith (expr); + tref.ReplaceWith(expr); } - exit: - var member = Unit.GetNodeAt (memberLocation); - var member2 = baseUnit.GetNodeAt (memberLocation); - member2.Remove (); - member.ReplaceWith (member2); - Print (member2); - return new ExpressionResult ((AstNode)expr, Unit); + exit: + return new ExpressionResult ((AstNode)expr, baseUnit); } - ExpressionResult GetExpressionAtCursor () + ExpressionResult GetExpressionAtCursor() { -// if (currentMember == null && currentType == null) -// return null; - TextLocation memberLocation; if (currentMember != null) { memberLocation = currentMember.Region.Begin; @@ -2154,43 +2299,42 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } else { memberLocation = location; } - var baseUnit = ParseStub ("a"); + var baseUnit = ParseStub("a"); var tmpUnit = baseUnit; - AstNode expr = baseUnit.GetNodeAt (location, n => n is IdentifierExpression || n is MemberReferenceExpression); + AstNode expr = baseUnit.GetNodeAt(location, n => n is IdentifierExpression || n is MemberReferenceExpression); if (expr == null) { - expr = baseUnit.GetNodeAt (location.Line, location.Column - 1); + expr = baseUnit.GetNodeAt(location.Line, location.Column - 1); } // try insertStatement - if (expr == null && baseUnit.GetNodeAt (location.Line, location.Column) != null) { - tmpUnit = baseUnit = ParseStub ("a();", false); - expr = baseUnit.GetNodeAt (location.Line, location.Column + 1); + if (expr == null && baseUnit.GetNodeAt(location.Line, location.Column) != null) { + tmpUnit = baseUnit = ParseStub("a();", false); + expr = baseUnit.GetNodeAt(location.Line, location.Column + 1); } if (expr == null) { - baseUnit = ParseStub ("()"); - expr = baseUnit.GetNodeAt (location.Line, location.Column - 1); + baseUnit = ParseStub("()"); + expr = baseUnit.GetNodeAt(location.Line, location.Column - 1); if (expr == null) { - expr = baseUnit.GetNodeAt (location.Line, location.Column - 1); + expr = baseUnit.GetNodeAt(location.Line, location.Column - 1); } } if (expr == null) { - baseUnit = ParseStub ("a", false); - expr = baseUnit.GetNodeAt (location, n => n is IdentifierExpression || n is MemberReferenceExpression || n is CatchClause); - + baseUnit = ParseStub("a", false); + expr = baseUnit.GetNodeAt(location, n => n is IdentifierExpression || n is MemberReferenceExpression || n is CatchClause); } // try statement if (expr == null) { - expr = tmpUnit.GetNodeAt (location.Line, location.Column - 1); + expr = tmpUnit.GetNodeAt(location.Line, location.Column - 1); baseUnit = tmpUnit; } if (expr == null) { - var block = tmpUnit.GetNodeAt (location); - var node = block != null ? block.Statements.LastOrDefault () : null; + var block = tmpUnit.GetNodeAt(location); + var node = block != null ? block.Statements.LastOrDefault() : null; var forStmt = node != null ? node.PrevSibling as ForStatement : null; if (forStmt != null && forStmt.EmbeddedStatement.IsNull) { @@ -2203,105 +2347,94 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (expr == null) { - var forStmt = tmpUnit.GetNodeAt (location.Line, location.Column - 3); + var forStmt = tmpUnit.GetNodeAt(location.Line, location.Column - 3); if (forStmt != null && forStmt.EmbeddedStatement.IsNull) { - forStmt.VariableNameToken = Identifier.Create ("stub"); + forStmt.VariableNameToken = Identifier.Create("stub"); expr = forStmt.VariableNameToken; baseUnit = tmpUnit; } } if (expr == null) { - expr = tmpUnit.GetNodeAt (location.Line, location.Column - 1); + expr = tmpUnit.GetNodeAt(location.Line, location.Column - 1); baseUnit = tmpUnit; } // try parameter declaration type if (expr == null) { - baseUnit = ParseStub (">", false, "{}"); - expr = baseUnit.GetNodeAt (location.Line, location.Column - 1); + baseUnit = ParseStub(">", false, "{}"); + expr = baseUnit.GetNodeAt(location.Line, location.Column - 1); } // try parameter declaration method if (expr == null) { - baseUnit = ParseStub ("> ()", false, "{}"); - expr = baseUnit.GetNodeAt (location.Line, location.Column - 1); + baseUnit = ParseStub("> ()", false, "{}"); + expr = baseUnit.GetNodeAt(location.Line, location.Column - 1); } // try expression in anonymous type "new { sample = x$" case if (expr == null) { - baseUnit = ParseStub ("a", false); - expr = baseUnit.GetNodeAt (location.Line, location.Column); - if (expr != null) - expr = baseUnit.GetNodeAt (location.Line, location.Column) ?? expr; - if (expr == null) - expr = baseUnit.GetNodeAt (location.Line, location.Column); - } - if (expr == null) + baseUnit = ParseStub("a", false); + expr = baseUnit.GetNodeAt(location.Line, location.Column); + if (expr != null) { + expr = baseUnit.GetNodeAt(location.Line, location.Column) ?? expr; + } + if (expr == null) { + expr = baseUnit.GetNodeAt(location.Line, location.Column); + } + } + if (expr == null) { return null; - - var member = Unit.GetNodeAt (memberLocation); - var member2 = baseUnit.GetNodeAt (memberLocation); - if (member != null && member2 != null) { - member2.Remove (); - - if (member is TypeDeclaration) { - member.AddChild (member2, Roles.TypeMemberRole); - } else { - member.ReplaceWith (member2); - } - } else { - var node = Unit.GetNodeAt (memberLocation) ?? Unit; - node.AddChild (expr.Clone (), new Role ("Arbitrary node")); - return new ExpressionResult (expr, baseUnit); } - return new ExpressionResult (expr, Unit); + return new ExpressionResult (expr, baseUnit); } - ExpressionResult GetExpressionAt (int offset) + ExpressionResult GetExpressionAt(int offset) { var parser = new CSharpParser (); - string text = this.document.GetText (0, this.offset); + string text = this.document.GetText(0, this.offset); var sb = new StringBuilder (text); - sb.Append ("a;"); - AppendMissingClosingBrackets (sb, text, false); - var stream = new System.IO.StringReader (sb.ToString ()); - var completionUnit = parser.Parse (stream, CSharpParsedFile.FileName, 0); - stream.Close (); - var loc = document.GetLocation (offset); - - var expr = completionUnit.GetNodeAt (loc, n => n is Expression || n is VariableDeclarationStatement); - if (expr == null) + sb.Append("a;"); + AppendMissingClosingBrackets(sb, text, false); + var stream = new System.IO.StringReader (sb.ToString()); + var completionUnit = parser.Parse(stream, CSharpParsedFile.FileName, 0); + stream.Close(); + var loc = document.GetLocation(offset); + + var expr = completionUnit.GetNodeAt(loc, n => n is Expression || n is VariableDeclarationStatement); + if (expr == null) { return null; + } return new ExpressionResult (expr, completionUnit); } - ExpressionResult GetNewExpressionAt (int offset) + ExpressionResult GetNewExpressionAt(int offset) { var parser = new CSharpParser (); - string text = this.document.GetText (0, this.offset); + string text = this.document.GetText(0, this.offset); var sb = new StringBuilder (text); - sb.Append ("a ();"); - AppendMissingClosingBrackets (sb, text, false); + sb.Append("a ();"); + AppendMissingClosingBrackets(sb, text, false); - var stream = new System.IO.StringReader (sb.ToString ()); - var completionUnit = parser.Parse (stream, CSharpParsedFile.FileName, 0); - stream.Close (); - var loc = document.GetLocation (offset); + var stream = new System.IO.StringReader (sb.ToString()); + var completionUnit = parser.Parse(stream, CSharpParsedFile.FileName, 0); + stream.Close(); + var loc = document.GetLocation(offset); - var expr = completionUnit.GetNodeAt (loc, n => n is Expression); + var expr = completionUnit.GetNodeAt(loc, n => n is Expression); if (expr == null) { // try without ";" sb = new StringBuilder (text); - sb.Append ("a ()"); - AppendMissingClosingBrackets (sb, text, false); - stream = new System.IO.StringReader (sb.ToString ()); - completionUnit = parser.Parse (stream, CSharpParsedFile.FileName, 0); - stream.Close (); - loc = document.GetLocation (offset); + sb.Append("a ()"); + AppendMissingClosingBrackets(sb, text, false); + stream = new System.IO.StringReader (sb.ToString()); + completionUnit = parser.Parse(stream, CSharpParsedFile.FileName, 0); + stream.Close(); + loc = document.GetLocation(offset); - expr = completionUnit.GetNodeAt (loc, n => n is Expression); - if (expr == null) + expr = completionUnit.GetNodeAt(loc, n => n is Expression); + if (expr == null) { return null; + } } return new ExpressionResult (expr, completionUnit); } @@ -2310,54 +2443,61 @@ namespace ICSharpCode.NRefactory.CSharp.Completion #endregion #region Helper methods - string GetPreviousToken (ref int i, bool allowLineChange) + string GetPreviousToken(ref int i, bool allowLineChange) { char c; - if (i <= 0) + if (i <= 0) { return null; + } do { - c = document.GetCharAt (--i); + c = document.GetCharAt(--i); } while (i > 0 && char.IsWhiteSpace (c) && (allowLineChange ? true : c != '\n')); - if (i == 0) + if (i == 0) { return null; + } - if (!char.IsLetterOrDigit (c)) + if (!char.IsLetterOrDigit(c)) { return new string (c, 1); + } int endOffset = i + 1; do { - c = document.GetCharAt (i - 1); - if (!(char.IsLetterOrDigit (c) || c == '_')) + c = document.GetCharAt(i - 1); + if (!(char.IsLetterOrDigit(c) || c == '_')) { break; + } i--; } while (i > 0); - return document.GetText (i, endOffset - i); + return document.GetText(i, endOffset - i); } - bool GetParameterCompletionCommandOffset (out int cpos) + bool GetParameterCompletionCommandOffset(out int cpos) { // Start calculating the parameter offset from the beginning of the // current member, instead of the beginning of the file. cpos = offset - 1; var mem = currentMember; - if (mem == null || (mem is IType)) + if (mem == null || (mem is IType)) { return false; - int startPos = document.GetOffset (mem.Region.BeginLine, mem.Region.BeginColumn); + } + int startPos = document.GetOffset(mem.Region.BeginLine, mem.Region.BeginColumn); int parenDepth = 0; int chevronDepth = 0; while (cpos > startPos) { - char c = document.GetCharAt (cpos); - if (c == ')') + char c = document.GetCharAt(cpos); + if (c == ')') { parenDepth++; - if (c == '>') + } + if (c == '>') { chevronDepth++; + } if (parenDepth == 0 && c == '(' || chevronDepth == 0 && c == '<') { - int p = GetCurrentParameterIndex (cpos + 1, startPos); + int p = GetCurrentParameterIndex(cpos + 1, startPos); if (p != -1) { cpos++; return true; @@ -2365,79 +2505,95 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return false; } } - if (c == '(') + if (c == '(') { parenDepth--; - if (c == '<') + } + if (c == '<') { chevronDepth--; + } cpos--; } return false; } - int GetCurrentParameterIndex (int offset, int memberStart) + int GetCurrentParameterIndex(int offset, int memberStart) { int cursor = this.offset; int i = offset; - if (i > cursor) + if (i > cursor) { return -1; - if (i == cursor) - return 1; // parameters are 1 based + } + if (i == cursor) { + return 1; + } + // parameters are 1 based int index = memberStart + 1; int parentheses = 0; int bracket = 0; bool insideQuote = false, insideString = false, insideSingleLineComment = false, insideMultiLineComment = false; do { - char c = document.GetCharAt (i - 1); + char c = document.GetCharAt(i - 1); switch (c) { - case '\\': - if (insideString || insideQuote) - i++; - break; - case '\'': - if (!insideString && !insideSingleLineComment && !insideMultiLineComment) - insideQuote = !insideQuote; - break; - case '"': - if (!insideQuote && !insideSingleLineComment && !insideMultiLineComment) - insideString = !insideString; - break; - case '/': - if (!insideQuote && !insideString && !insideMultiLineComment) { - if (document.GetCharAt (i) == '/') - insideSingleLineComment = true; - if (document.GetCharAt (i) == '*') - insideMultiLineComment = true; - } - break; - case '*': - if (insideMultiLineComment && document.GetCharAt (i) == '/') - insideMultiLineComment = false; - break; - case '\n': - case '\r': - insideSingleLineComment = false; - break; - case '{': - if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) - bracket++; - break; - case '}': - if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) - bracket--; - break; - case '(': - if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) - parentheses++; - break; - case ')': - if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) - parentheses--; - break; - case ',': - if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment && parentheses == 1 && bracket == 0) - index++; - break; + case '\\': + if (insideString || insideQuote) { + i++; + } + break; + case '\'': + if (!insideString && !insideSingleLineComment && !insideMultiLineComment) { + insideQuote = !insideQuote; + } + break; + case '"': + if (!insideQuote && !insideSingleLineComment && !insideMultiLineComment) { + insideString = !insideString; + } + break; + case '/': + if (!insideQuote && !insideString && !insideMultiLineComment) { + if (document.GetCharAt(i) == '/') { + insideSingleLineComment = true; + } + if (document.GetCharAt(i) == '*') { + insideMultiLineComment = true; + } + } + break; + case '*': + if (insideMultiLineComment && document.GetCharAt(i) == '/') { + insideMultiLineComment = false; + } + break; + case '\n': + case '\r': + insideSingleLineComment = false; + break; + case '{': + if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) { + bracket++; + } + break; + case '}': + if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) { + bracket--; + } + break; + case '(': + if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) { + parentheses++; + } + break; + case ')': + if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment) { + parentheses--; + } + break; + case ',': + if (!insideQuote && !insideString && !insideSingleLineComment && !insideMultiLineComment && parentheses == 1 && bracket == 0) { + index++; + } + break; } i++; } while (i <= cursor && parentheses >= 0); @@ -2449,55 +2605,55 @@ namespace ICSharpCode.NRefactory.CSharp.Completion #region Preprocessor - IEnumerable GetDirectiveCompletionData () + IEnumerable GetDirectiveCompletionData() { - yield return factory.CreateLiteralCompletionData ("if"); - yield return factory.CreateLiteralCompletionData ("else"); - yield return factory.CreateLiteralCompletionData ("elif"); - yield return factory.CreateLiteralCompletionData ("endif"); - yield return factory.CreateLiteralCompletionData ("define"); - yield return factory.CreateLiteralCompletionData ("undef"); - yield return factory.CreateLiteralCompletionData ("warning"); - yield return factory.CreateLiteralCompletionData ("error"); - yield return factory.CreateLiteralCompletionData ("pragma"); - yield return factory.CreateLiteralCompletionData ("line"); - yield return factory.CreateLiteralCompletionData ("line hidden"); - yield return factory.CreateLiteralCompletionData ("line default"); - yield return factory.CreateLiteralCompletionData ("region"); - yield return factory.CreateLiteralCompletionData ("endregion"); + yield return factory.CreateLiteralCompletionData("if"); + yield return factory.CreateLiteralCompletionData("else"); + yield return factory.CreateLiteralCompletionData("elif"); + yield return factory.CreateLiteralCompletionData("endif"); + yield return factory.CreateLiteralCompletionData("define"); + yield return factory.CreateLiteralCompletionData("undef"); + yield return factory.CreateLiteralCompletionData("warning"); + yield return factory.CreateLiteralCompletionData("error"); + yield return factory.CreateLiteralCompletionData("pragma"); + yield return factory.CreateLiteralCompletionData("line"); + yield return factory.CreateLiteralCompletionData("line hidden"); + yield return factory.CreateLiteralCompletionData("line default"); + yield return factory.CreateLiteralCompletionData("region"); + yield return factory.CreateLiteralCompletionData("endregion"); } #endregion #region Xml Comments static readonly List commentTags = new List (new string[] { "c", "code", "example", "exception", "include", "list", "listheader", "item", "term", "description", "para", "param", "paramref", "permission", "remarks", "returns", "see", "seealso", "summary", "value" }); - IEnumerable GetXmlDocumentationCompletionData () + IEnumerable GetXmlDocumentationCompletionData() { - yield return factory.CreateLiteralCompletionData ("c", "Set text in a code-like font"); - yield return factory.CreateLiteralCompletionData ("code", "Set one or more lines of source code or program output"); - yield return factory.CreateLiteralCompletionData ("example", "Indicate an example"); - yield return factory.CreateLiteralCompletionData ("exception", "Identifies the exceptions a method can throw", "exception cref=\"|\">"); - yield return factory.CreateLiteralCompletionData ("include", "Includes comments from a external file", "include file=\"|\" path=\"\">"); - yield return factory.CreateLiteralCompletionData ("list", "Create a list or table", "list type=\"|\">"); - yield return factory.CreateLiteralCompletionData ("listheader", "Define the heading row"); - yield return factory.CreateLiteralCompletionData ("item", "Defines list or table item"); - - yield return factory.CreateLiteralCompletionData ("term", "A term to define"); - yield return factory.CreateLiteralCompletionData ("description", "Describes a list item"); - yield return factory.CreateLiteralCompletionData ("para", "Permit structure to be added to text"); - - yield return factory.CreateLiteralCompletionData ("param", "Describe a parameter for a method or constructor", "param name=\"|\">"); - yield return factory.CreateLiteralCompletionData ("paramref", "Identify that a word is a parameter name", "paramref name=\"|\"/>"); - - yield return factory.CreateLiteralCompletionData ("permission", "Document the security accessibility of a member", "permission cref=\"|\""); - yield return factory.CreateLiteralCompletionData ("remarks", "Describe a type"); - yield return factory.CreateLiteralCompletionData ("returns", "Describe the return value of a method"); - yield return factory.CreateLiteralCompletionData ("see", "Specify a link", "see cref=\"|\"/>"); - yield return factory.CreateLiteralCompletionData ("seealso", "Generate a See Also entry", "seealso cref=\"|\"/>"); - yield return factory.CreateLiteralCompletionData ("summary", "Describe a member of a type"); - yield return factory.CreateLiteralCompletionData ("typeparam", "Describe a type parameter for a generic type or method"); - yield return factory.CreateLiteralCompletionData ("typeparamref", "Identify that a word is a type parameter name"); - yield return factory.CreateLiteralCompletionData ("value", "Describe a property"); + yield return factory.CreateLiteralCompletionData("c", "Set text in a code-like font"); + yield return factory.CreateLiteralCompletionData("code", "Set one or more lines of source code or program output"); + yield return factory.CreateLiteralCompletionData("example", "Indicate an example"); + yield return factory.CreateLiteralCompletionData("exception", "Identifies the exceptions a method can throw", "exception cref=\"|\">"); + yield return factory.CreateLiteralCompletionData("include", "Includes comments from a external file", "include file=\"|\" path=\"\">"); + yield return factory.CreateLiteralCompletionData("list", "Create a list or table", "list type=\"|\">"); + yield return factory.CreateLiteralCompletionData("listheader", "Define the heading row"); + yield return factory.CreateLiteralCompletionData("item", "Defines list or table item"); + + yield return factory.CreateLiteralCompletionData("term", "A term to define"); + yield return factory.CreateLiteralCompletionData("description", "Describes a list item"); + yield return factory.CreateLiteralCompletionData("para", "Permit structure to be added to text"); + + yield return factory.CreateLiteralCompletionData("param", "Describe a parameter for a method or constructor", "param name=\"|\">"); + yield return factory.CreateLiteralCompletionData("paramref", "Identify that a word is a parameter name", "paramref name=\"|\"/>"); + + yield return factory.CreateLiteralCompletionData("permission", "Document the security accessibility of a member", "permission cref=\"|\""); + yield return factory.CreateLiteralCompletionData("remarks", "Describe a type"); + yield return factory.CreateLiteralCompletionData("returns", "Describe the return value of a method"); + yield return factory.CreateLiteralCompletionData("see", "Specify a link", "see cref=\"|\"/>"); + yield return factory.CreateLiteralCompletionData("seealso", "Generate a See Also entry", "seealso cref=\"|\"/>"); + yield return factory.CreateLiteralCompletionData("summary", "Describe a member of a type"); + yield return factory.CreateLiteralCompletionData("typeparam", "Describe a type parameter for a generic type or method"); + yield return factory.CreateLiteralCompletionData("typeparamref", "Identify that a word is a type parameter name"); + yield return factory.CreateLiteralCompletionData("value", "Describe a property"); } #endregion diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 0ab22fe0c2..6381bb22df 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -453,10 +453,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion using (var stream = new System.IO.StringReader (wrapper.ToString ())) { try { var parser = new CSharpParser (); - return parser.Parse(stream, "stub.cs", memberLocation.Line - 1 - generatedLines); + var result = parser.Parse(stream, "stub.cs", memberLocation.Line - 1 - generatedLines); + + return result; } catch (Exception) { - Console.WriteLine ("------"); - Console.WriteLine (wrapper); + Console.WriteLine("------"); + Console.WriteLine(wrapper); throw; } } @@ -469,22 +471,24 @@ namespace ICSharpCode.NRefactory.CSharp.Completion cachedText = null; } - protected Tuple GetMemberTextToCaret () + protected Tuple GetMemberTextToCaret() { int startOffset; if (currentMember != null && currentType != null && currentType.Kind != TypeKind.Enum) { - startOffset = document.GetOffset (currentMember.Region.Begin); + startOffset = document.GetOffset(currentMember.Region.Begin); } else if (currentType != null) { - startOffset = document.GetOffset (currentType.Region.Begin); + startOffset = document.GetOffset(currentType.Region.Begin); } else { startOffset = 0; } while (startOffset > 0) { - char ch = document.GetCharAt (startOffset - 1); - if (ch != ' ' && ch != '\t') + char ch = document.GetCharAt(startOffset - 1); + if (ch != ' ' && ch != '\t') { break; + } --startOffset; } + startOffset = 0; if (cachedText == null) cachedText = document.GetText (startOffset, offset - startOffset); @@ -498,13 +502,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion baseUnit = ParseStub ("", false); var section = baseUnit.GetNodeAt (location.Line, location.Column - 2); var attr = section != null ? section.Attributes.LastOrDefault () : null; - if (attr != null) { - // insert target type into compilation unit, to respect the - attr.Remove (); - var node = Unit.GetNodeAt (location) ?? Unit; - node.AddChild (attr, Roles.Attribute); - return new ExpressionResult ((AstNode)attr, Unit); - } + if (attr != null) + return new ExpressionResult ((AstNode)attr, baseUnit); } if (currentMember == null && currentType == null) { return null; @@ -529,11 +528,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (expr == null) return null; } - var member = Unit.GetNodeAt (memberLocation); - var member2 = baseUnit.GetNodeAt (memberLocation); - member2.Remove (); - member.ReplaceWith (member2); - return new ExpressionResult ((AstNode)expr, Unit); + return new ExpressionResult ((AstNode)expr, baseUnit); } public class ExpressionResult diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs index b7f0952f16..ca6a6a66a5 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs @@ -67,13 +67,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return null; } - var member = Unit.GetNodeAt (memberLocation); - var member2 = baseUnit.GetNodeAt (memberLocation); - if (member == null || member2 == null) - return null; - member2.Remove (); - member.ReplaceWith (member2); - return new ExpressionResult ((AstNode)expr, Unit); + return new ExpressionResult ((AstNode)expr, baseUnit); } public ExpressionResult GetConstructorInitializerBeforeCursor () @@ -88,7 +82,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var expr = baseUnit.GetNodeAt (location); if (expr == null) return null; - return new ExpressionResult ((AstNode)expr, Unit); + return new ExpressionResult ((AstNode)expr, baseUnit); } public ExpressionResult GetTypeBeforeCursor () @@ -102,13 +96,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; var expr = baseUnit.GetNodeAt (location.Line, location.Column + 1); // '>' position - var member = Unit.GetNodeAt (memberLocation); - var member2 = baseUnit.GetNodeAt (memberLocation); - if (member == null || member2 == null) - return null; - member2.Remove (); - member.ReplaceWith (member2); - return new ExpressionResult ((AstNode)expr, Unit); + return new ExpressionResult ((AstNode)expr, baseUnit); } IEnumerable CollectMethods (AstNode resolvedNode, MethodGroupResolveResult resolveResult) diff --git a/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs b/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs index 7166dfb9ed..1221621379 100644 --- a/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs +++ b/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs @@ -66,46 +66,48 @@ namespace ICSharpCode.NRefactory.CSharp return new TextLocation (loc.Row, loc.Column); } - public override void Visit (ModuleContainer mc) + public override void Visit(ModuleContainer mc) { bool first = true; foreach (var container in mc.Containers) { var nspace = container as NamespaceContainer; if (nspace == null) { - container.Accept (this); + container.Accept(this); continue; } NamespaceDeclaration nDecl = null; - var loc = LocationsBag.GetLocations (nspace); + var loc = LocationsBag.GetLocations(nspace); - if (nspace.NS != null && !string.IsNullOrEmpty (nspace.NS.Name)) { + if (nspace.NS != null && !string.IsNullOrEmpty(nspace.NS.Name)) { nDecl = new NamespaceDeclaration (); - if (loc != null) - nDecl.AddChild (new CSharpTokenNode (Convert (loc [0])), Roles.NamespaceKeyword); - ConvertNamespaceName (nspace.RealMemberName, nDecl); - if (loc != null && loc.Count > 1) - nDecl.AddChild (new CSharpTokenNode (Convert (loc [1])), Roles.LBrace); - AddToNamespace (nDecl); - namespaceStack.Push (nDecl); + if (loc != null) { + nDecl.AddChild(new CSharpTokenNode (Convert(loc [0])), Roles.NamespaceKeyword); + } + ConvertNamespaceName(nspace.RealMemberName, nDecl); + if (loc != null && loc.Count > 1) { + nDecl.AddChild(new CSharpTokenNode (Convert(loc [1])), Roles.LBrace); + } + AddToNamespace(nDecl); + namespaceStack.Push(nDecl); } if (nspace.Usings != null) { foreach (var us in nspace.Usings) { - us.Accept (this); + us.Accept(this); } } if (first) { first = false; - AddAttributeSection (Unit, mc); + AddAttributeSection(Unit, mc); } if (nspace.Containers != null) { foreach (var subContainer in nspace.Containers) { - subContainer.Accept (this); + subContainer.Accept(this); } } - + Console.WriteLine("attr:" + mc.UnattachedAttributes); if (nDecl != null) { AddAttributeSection (nDecl, nspace.UnattachedAttributes, EntityDeclaration.UnattachedAttributeRole); if (loc != null && loc.Count > 2) @@ -344,37 +346,38 @@ namespace ICSharpCode.NRefactory.CSharp return result; } - public override void Visit (NamespaceContainer nspace) + public override void Visit(NamespaceContainer nspace) { NamespaceDeclaration nDecl = null; - var loc = LocationsBag.GetLocations (nspace); + var loc = LocationsBag.GetLocations(nspace); - if (nspace.NS != null && !string.IsNullOrEmpty (nspace.NS.Name)) { + if (nspace.NS != null && !string.IsNullOrEmpty(nspace.NS.Name)) { nDecl = new NamespaceDeclaration (); - if (loc != null) - nDecl.AddChild (new CSharpTokenNode (Convert (loc [0])), Roles.NamespaceKeyword); - ConvertNamespaceName (nspace.RealMemberName, nDecl); - if (loc != null && loc.Count > 1) - nDecl.AddChild (new CSharpTokenNode (Convert (loc [1])), Roles.LBrace); - AddToNamespace (nDecl); - namespaceStack.Push (nDecl); + if (loc != null) { + nDecl.AddChild(new CSharpTokenNode (Convert(loc [0])), Roles.NamespaceKeyword); + } + ConvertNamespaceName(nspace.RealMemberName, nDecl); + if (loc != null && loc.Count > 1) { + nDecl.AddChild(new CSharpTokenNode (Convert(loc [1])), Roles.LBrace); + } + AddToNamespace(nDecl); + namespaceStack.Push(nDecl); } if (nspace.Usings != null) { foreach (var us in nspace.Usings) { - us.Accept (this); + us.Accept(this); } } if (nspace.Containers != null) { foreach (var container in nspace.Containers) { - container.Accept (this); + container.Accept(this); } } - if (nDecl != null) { - AddAttributeSection (nDecl, nspace.UnattachedAttributes, EntityDeclaration.UnattachedAttributeRole); + AddAttributeSection(nDecl, nspace.UnattachedAttributes, EntityDeclaration.UnattachedAttributeRole); if (loc != null && loc.Count > 2) nDecl.AddChild (new CSharpTokenNode (Convert (loc [2])), Roles.RBrace); if (loc != null && loc.Count > 3) @@ -3606,17 +3609,20 @@ namespace ICSharpCode.NRefactory.CSharp } } - public CompilationUnit Parse (CompilerCompilationUnit top, string fileName, int lineModifier = 0) + public CompilationUnit Parse(CompilerCompilationUnit top, string fileName, int lineModifier = 0) { - if (top == null) + if (top == null) { return null; + } CSharpParser.ConversionVisitor conversionVisitor = new ConversionVisitor (GenerateTypeSystemMode, top.LocationsBag); - top.ModuleCompiled.Accept (conversionVisitor); - InsertComments (top, conversionVisitor); - if (CompilationUnitCallback != null) - CompilationUnitCallback (top); - if (top.LastYYValue is Mono.CSharp.Expression) - conversionVisitor.Unit.TopExpression = ((Mono.CSharp.Expression)top.LastYYValue).Accept (conversionVisitor) as AstNode; + top.ModuleCompiled.Accept(conversionVisitor); + InsertComments(top, conversionVisitor); + if (CompilationUnitCallback != null) { + CompilationUnitCallback(top); + } + if (top.LastYYValue is Mono.CSharp.Expression) { + conversionVisitor.Unit.TopExpression = ((Mono.CSharp.Expression)top.LastYYValue).Accept(conversionVisitor) as AstNode; + } conversionVisitor.Unit.FileName = fileName; return conversionVisitor.Unit; } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs index 9ce8ef795f..cebaeaac37 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs @@ -219,6 +219,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion pctx = pctx.AddAssemblyReferences (new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore }); var compilationUnit = new CSharpParser ().Parse (parsedText, "program.cs"); + compilationUnit.Freeze (); var parsedFile = compilationUnit.ToTypeSystem (); pctx = pctx.UpdateProjectContent (null, parsedFile); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs index a103a30029..568aaf138a 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs @@ -271,6 +271,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion pctx = pctx.AddAssemblyReferences (new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore }); var compilationUnit = new CSharpParser ().Parse (parsedText, "program.cs"); + compilationUnit.Freeze (); var parsedFile = compilationUnit.ToTypeSystem (); pctx = pctx.UpdateProjectContent (null, parsedFile); From 6f4a46c0668c7caebf7e3252d2384ca4a8c958e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Sat, 17 Mar 2012 11:53:16 +0100 Subject: [PATCH 04/10] Fixed failing unit test. --- .../Completion/CSharpCompletionEngine.cs | 1 - .../Completion/CSharpCompletionEngineBase.cs | 4 +--- ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs | 1 - 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 8f5acc877f..f46fc762fe 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -478,7 +478,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var contextList = new CompletionDataWrapper (this); var identifierStart = GetExpressionAtCursor(); - Console.WriteLine("id:" + identifierStart); if (identifierStart != null && identifierStart.Node is TypeParameterDeclaration) { return null; } diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 6381bb22df..f75f2eaaf9 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -424,7 +424,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion string memberText = mt.Item1; var memberLocation = mt.Item2; - int closingBrackets = 0; + int closingBrackets = 1; int generatedLines = 0; var wrapper = new StringBuilder (); bool wrapInClass = memberLocation != new TextLocation (1, 1); @@ -449,12 +449,10 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (closingBrackets > 0) { wrapper.Append(new string ('}', closingBrackets)); } - using (var stream = new System.IO.StringReader (wrapper.ToString ())) { try { var parser = new CSharpParser (); var result = parser.Parse(stream, "stub.cs", memberLocation.Line - 1 - generatedLines); - return result; } catch (Exception) { Console.WriteLine("------"); diff --git a/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs b/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs index 1221621379..593f21a863 100644 --- a/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs +++ b/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs @@ -107,7 +107,6 @@ namespace ICSharpCode.NRefactory.CSharp subContainer.Accept(this); } } - Console.WriteLine("attr:" + mc.UnattachedAttributes); if (nDecl != null) { AddAttributeSection (nDecl, nspace.UnattachedAttributes, EntityDeclaration.UnattachedAttributeRole); if (loc != null && loc.Count > 2) From 29da952623474ea0b56a9ddde18d2a5e51104162 Mon Sep 17 00:00:00 2001 From: mike Date: Sat, 17 Mar 2012 12:04:36 +0100 Subject: [PATCH 05/10] Fixed some warnings. --- .../Completion/CSharpCompletionEngine.cs | 30 +++++++++---------- .../Completion/CSharpCompletionEngineBase.cs | 16 +++++----- .../CSharpParameterCompletionEngine.cs | 4 +-- .../OutputVisitor/CodeDomConvertVisitor.cs | 2 +- .../Parser/CSharpParser.cs | 1 - .../Parser/mcs/cs-tokenizer.cs | 1 - .../Parser/mcs/statement.cs | 6 ++-- .../Resolver/ResolveVisitor.cs | 4 +-- 8 files changed, 31 insertions(+), 33 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index f46fc762fe..2efc27dea3 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -1415,7 +1415,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (newParentNode is ReturnStatement) { - var varDecl = (ReturnStatement)newParentNode; + //var varDecl = (ReturnStatement)newParentNode; if (ctx.CurrentMember != null) { hintType = ctx.CurrentMember.ReturnType; } @@ -1562,7 +1562,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion { var wrapper = new CompletionDataWrapper (this); var alreadyInserted = new Dictionary (); - bool addedVirtuals = false; + //bool addedVirtuals = false; int declarationBegin = offset; int j = declarationBegin; @@ -1742,7 +1742,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion IMethod delegateMethod = delegateType.GetDelegateInvokeMethod(); var thisLineIndent = GetLineIndent(location.Line); string delegateEndString = EolMarker + thisLineIndent + "}" + (addSemicolon ? ";" : ""); - bool containsDelegateData = completionList.Result.Any(d => d.DisplayText.StartsWith("delegate(")); + //bool containsDelegateData = completionList.Result.Any(d => d.DisplayText.StartsWith("delegate(")); if (addDefault) { completionList.AddCustom("delegate", "Creates anonymous delegate.", "delegate {" + EolMarker + thisLineIndent + IndentString + "|" + delegateEndString); } @@ -1800,8 +1800,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } } if (member.IsInternal || member.IsProtectedAndInternal || member.IsProtectedOrInternal) { - var type1 = member is ITypeDefinition ? (ITypeDefinition)member : member.DeclaringTypeDefinition; - var type2 = currentMember is ITypeDefinition ? (ITypeDefinition)currentMember : currentMember.DeclaringTypeDefinition; + //var type1 = member is ITypeDefinition ? (ITypeDefinition)member : member.DeclaringTypeDefinition; + //var type2 = currentMember is ITypeDefinition ? (ITypeDefinition)currentMember : currentMember.DeclaringTypeDefinition; bool result = true; // easy case, projects are the same /*// if (type1.ProjectContent == type2.ProjectContent) { @@ -2008,7 +2008,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } IType type = resolveResult.Type; - var typeDef = resolveResult.Type.GetDefinition(); + //var typeDef = resolveResult.Type.GetDefinition(); var result = new CompletionDataWrapper (this); bool includeStaticMembers = false; @@ -2240,7 +2240,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } return null; } - var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; + //var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; if (mref == null) { var invoke = baseUnit.GetNodeAt(location); if (invoke != null) { @@ -2290,14 +2290,14 @@ namespace ICSharpCode.NRefactory.CSharp.Completion ExpressionResult GetExpressionAtCursor() { - TextLocation memberLocation; - if (currentMember != null) { - memberLocation = currentMember.Region.Begin; - } else if (currentType != null) { - memberLocation = currentType.Region.Begin; - } else { - memberLocation = location; - } +// TextLocation memberLocation; +// if (currentMember != null) { +// memberLocation = currentMember.Region.Begin; +// } else if (currentType != null) { +// memberLocation = currentType.Region.Begin; +// } else { +// memberLocation = location; +// } var baseUnit = ParseStub("a"); var tmpUnit = baseUnit; diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index f75f2eaaf9..6bf139e08f 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -365,7 +365,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion { var bracketStack = GetBracketStack (memberText); bool didAppendSemicolon = !appendSemicolon; - char lastBracket = '\0'; + //char lastBracket = '\0'; while (bracketStack.Count > 0) { var t = bracketStack.Pop (); switch (t.Item1) { @@ -373,19 +373,19 @@ namespace ICSharpCode.NRefactory.CSharp.Completion wrapper.Append (')'); if (appendSemicolon) didAppendSemicolon = false; - lastBracket = ')'; + //lastBracket = ')'; break; case '[': wrapper.Append (']'); if (appendSemicolon) didAppendSemicolon = false; - lastBracket = ']'; + //lastBracket = ']'; break; case '<': wrapper.Append ('>'); if (appendSemicolon) didAppendSemicolon = false; - lastBracket = '>'; + //lastBracket = '>'; break; case '{': int o = t.Item2 - 1; @@ -508,7 +508,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } baseUnit = ParseStub (afterBracket ? "" : "x"); - var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; + //var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; var mref = baseUnit.GetNodeAt (location.Line, location.Column - 1, n => n is InvocationExpression || n is ObjectCreateExpression); AstNode expr = null; if (mref is InvocationExpression) { @@ -569,7 +569,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var result = csResolver.Resolve (resolveNode); var state = csResolver.GetResolverStateBefore (resolveNode); return Tuple.Create (result, state); - } catch (Exception e) { + } catch (Exception) { return null; } } @@ -594,7 +594,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion public void GetCurrentMembers (int offset, out IUnresolvedTypeDefinition currentType, out IUnresolvedMember currentMember) { - var document = engine.document; + //var document = engine.document; var location = engine.location; currentType = null; @@ -648,7 +648,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion int startOffset = document.GetOffset (currentType.Region.Begin); int endOffset = document.GetOffset (location); - bool foundEndBracket = false; + //bool foundEndBracket = false; var bracketStack = new Stack (); diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs index ca6a6a66a5..ee31c623ac 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs @@ -58,7 +58,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return null; baseUnit = ParseStub ("x] = a[1"); - var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; + //var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; var mref = baseUnit.GetNodeAt (location, n => n is IndexerExpression); AstNode expr; if (mref is IndexerExpression) { @@ -94,7 +94,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return null; baseUnit = ParseStub ("x> a"); - var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; + //var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; var expr = baseUnit.GetNodeAt (location.Line, location.Column + 1); // '>' position return new ExpressionResult ((AstNode)expr, baseUnit); } diff --git a/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs b/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs index bdf3f6f926..c54b50271f 100644 --- a/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs +++ b/ICSharpCode.NRefactory.CSharp/OutputVisitor/CodeDomConvertVisitor.cs @@ -717,7 +717,7 @@ namespace ICSharpCode.NRefactory.CSharp CodeObject IAstVisitor.VisitTypeDeclaration(TypeDeclaration typeDeclaration) { - bool isNestedType = typeStack.Count > 0; + //bool isNestedType = typeStack.Count > 0; CodeTypeDeclaration typeDecl = new CodeTypeDeclaration(typeDeclaration.Name); typeDecl.Attributes = ConvertMemberAttributes(typeDeclaration.Modifiers); typeDecl.CustomAttributes.AddRange(Convert(typeDeclaration.Attributes)); diff --git a/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs b/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs index 593f21a863..3c6929bae6 100644 --- a/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs +++ b/ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs @@ -3658,7 +3658,6 @@ namespace ICSharpCode.NRefactory.CSharp var file = new SourceFile (fileName, fileName, 0); Location.Initialize (new List (new [] { file })); var module = new ModuleContainer (ctx); - var driver = new Driver (ctx); var parser = Driver.Parse (reader, file, module, lineModifier); var top = new CompilerCompilationUnit () { diff --git a/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-tokenizer.cs b/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-tokenizer.cs index 7624e34086..0b7db95c62 100644 --- a/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-tokenizer.cs +++ b/ICSharpCode.NRefactory.CSharp/Parser/mcs/cs-tokenizer.cs @@ -1535,7 +1535,6 @@ namespace Mono.CSharp #endif number_pos = 0; var loc = Location; - bool hasLeadingDot = c == '.'; if (c >= '0' && c <= '9'){ if (c == '0'){ diff --git a/ICSharpCode.NRefactory.CSharp/Parser/mcs/statement.cs b/ICSharpCode.NRefactory.CSharp/Parser/mcs/statement.cs index 6f6f4926eb..f70c02af32 100644 --- a/ICSharpCode.NRefactory.CSharp/Parser/mcs/statement.cs +++ b/ICSharpCode.NRefactory.CSharp/Parser/mcs/statement.cs @@ -2025,8 +2025,8 @@ namespace Mono.CSharp { static int id; public int ID = id++; - static int clone_id_counter; - int clone_id; +// static int clone_id_counter; +// int clone_id; #endif // int assignable_slots; @@ -2338,7 +2338,7 @@ namespace Mono.CSharp { { Block target = (Block) t; #if DEBUG - target.clone_id = clone_id_counter++; +// target.clone_id = clone_id_counter++; #endif clonectx.AddBlockMap (this, target); diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs index e90d470024..d74f2fd102 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs @@ -1712,7 +1712,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver { CSharpResolver oldResolver = resolver; List parameters = (hasParameterList || parameterDeclarations.Any()) ? new List() : null; - bool oldIsWithinLambdaExpression = resolver.IsWithinLambdaExpression; + //bool oldIsWithinLambdaExpression = resolver.IsWithinLambdaExpression; resolver = resolver.WithIsWithinLambdaExpression(true); foreach (var pd in parameterDeclarations) { IType type = ResolveType(pd.Type); @@ -2626,7 +2626,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver if (string.IsNullOrEmpty(catchClause.VariableName)) { Scan(catchClause.Type); } else { - DomRegion region = MakeRegion(catchClause.VariableNameToken); + //DomRegion region = MakeRegion(catchClause.VariableNameToken); StoreCurrentState(catchClause.VariableNameToken); IVariable v = MakeVariable(ResolveType(catchClause.Type), catchClause.VariableNameToken); resolver = resolver.AddVariable(v); From c51a5f6222d4d0d968f6eef33204400f36b438b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Sat, 17 Mar 2012 13:38:16 +0100 Subject: [PATCH 06/10] Fixed stub mechanic. --- ICSharpCode.NRefactory.CSharp/Ast/AstNode.cs | 11 +++ .../Completion/CSharpCompletionEngine.cs | 3 +- .../Completion/CSharpCompletionEngineBase.cs | 69 ++++++++++++------- .../TypeSystem/CSharpParsedFile.cs | 2 +- 4 files changed, 58 insertions(+), 27 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Ast/AstNode.cs b/ICSharpCode.NRefactory.CSharp/Ast/AstNode.cs index c4cb486df3..b79af344d2 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/AstNode.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/AstNode.cs @@ -273,6 +273,17 @@ namespace ICSharpCode.NRefactory.CSharp } } + /// + /// Gets the ancestors of this node (including this node itself) + /// + public IEnumerable AncestorsAndSelf { + get { + for (AstNode cur = this; cur != null; cur = cur.parent) { + yield return cur; + } + } + } + /// /// Gets all descendants of this node (excluding this node itself). /// diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 2efc27dea3..0d122b1b33 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -177,7 +177,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (expr == null) { return null; } - // do not complete . (but ..) + // do not complete . (but ..) if (expr.Node is PrimitiveExpression) { var pexpr = (PrimitiveExpression)expr.Node; if (!(pexpr.Value is string || pexpr.Value is char) && !pexpr.LiteralValue.Contains('.')) { @@ -478,6 +478,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var contextList = new CompletionDataWrapper (this); var identifierStart = GetExpressionAtCursor(); + if (identifierStart != null && identifierStart.Node is TypeParameterDeclaration) { return null; } diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 6bf139e08f..85346bca65 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -421,7 +421,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (mt == null) { return null; } - + string memberText = mt.Item1; var memberLocation = mt.Item2; int closingBrackets = 1; @@ -429,18 +429,36 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var wrapper = new StringBuilder (); bool wrapInClass = memberLocation != new TextLocation (1, 1); if (wrapInClass) { - /* foreach (var child in Unit.Children) { - if (child is UsingDeclaration) { - var offset = document.GetOffset (child.StartLocation); - wrapper.Append (document.GetText (offset, document.GetOffset (child.EndLocation) - offset)); + var nodeAtLocation = Unit.GetNodeAt(memberLocation, n => n is TypeDeclaration || n is NamespaceDeclaration); + foreach (var n in nodeAtLocation.AncestorsAndSelf) { + if (memberLocation == n.StartLocation) { + continue; + } + if (n is TypeDeclaration) { + var t = (TypeDeclaration)n; + switch (t.ClassType) { + case ClassType.Class: + wrapper.Append("class"); + break; + case ClassType.Struct: + wrapper.Append("struct"); + break; + case ClassType.Interface: + wrapper.Append("interface"); + break; + case ClassType.Enum: + wrapper.Append("enum"); + break; + } + wrapper.Append(" " + t.Name + " {"); + wrapper.AppendLine(); + closingBrackets++; + generatedLines++; + } else { + Console.WriteLine(n); } - }*/ - wrapper.Append("class Stub {"); - wrapper.AppendLine(); - closingBrackets++; - generatedLines = 1; + } } - wrapper.Append(memberText); wrapper.Append(continuation); AppendMissingClosingBrackets(wrapper, memberText, appendSemicolon); @@ -486,7 +504,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } --startOffset; } - startOffset = 0; if (cachedText == null) cachedText = document.GetText (startOffset, offset - startOffset); @@ -552,10 +569,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return ResolveExpression (tuple.Node, tuple.Unit); } - protected Tuple ResolveExpression (AstNode expr, CompilationUnit unit) + protected Tuple ResolveExpression(AstNode expr, CompilationUnit unit) { - if (expr == null) + if (expr == null) { return null; + } AstNode resolveNode; if (expr is Expression || expr is AstType) { resolveNode = expr; @@ -565,21 +583,21 @@ namespace ICSharpCode.NRefactory.CSharp.Completion resolveNode = expr; } try { - var csResolver = new CSharpAstResolver (GetState (), unit, CSharpParsedFile); - var result = csResolver.Resolve (resolveNode); - var state = csResolver.GetResolverStateBefore (resolveNode); - return Tuple.Create (result, state); - } catch (Exception) { + var ctx = CSharpParsedFile.GetResolver(Compilation, location); + var root = expr.AncestorsAndSelf.FirstOrDefault(n => n is EntityDeclaration || n is CompilationUnit); + if (root == null) { + return null; + } + var csResolver = new CSharpAstResolver (ctx, root, CSharpParsedFile); + var result = csResolver.Resolve(resolveNode); + var state = csResolver.GetResolverStateBefore(resolveNode); + return Tuple.Create(result, state); + } catch (Exception e) { + Console.WriteLine(e); return null; } } - protected static void Print (AstNode node) - { - var v = new CSharpOutputVisitor (Console.Out, new CSharpFormattingOptions ()); - node.AcceptVisitor (v); - } - #endregion class DefaultMemberProvider : IMemberProvider @@ -702,6 +720,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return bracketStack.Any (t => t == '{'); } } + } } \ No newline at end of file diff --git a/ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpParsedFile.cs b/ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpParsedFile.cs index d02861fd90..b2b73947c7 100644 --- a/ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpParsedFile.cs +++ b/ICSharpCode.NRefactory.CSharp/TypeSystem/CSharpParsedFile.cs @@ -159,7 +159,7 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem return null; } - public CSharpTypeResolveContext GetTypeResolveContext (ICompilation compilation, TextLocation loc) + public CSharpTypeResolveContext GetTypeResolveContext(ICompilation compilation, TextLocation loc) { var rctx = new CSharpTypeResolveContext (compilation.MainAssembly); rctx = rctx.WithUsingScope (GetUsingScope (loc).Resolve (compilation)); From d07356a544f697f121a38e289f91b0c09ff6aa94 Mon Sep 17 00:00:00 2001 From: mike Date: Sat, 17 Mar 2012 14:20:16 +0100 Subject: [PATCH 07/10] Fixed ast formatter. --- .../Formatter/AstFormattingVisitor.cs | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs b/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs index 7d4f321eff..0e884002ca 100644 --- a/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs +++ b/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs @@ -129,12 +129,12 @@ namespace ICSharpCode.NRefactory.CSharp /// public void ApplyChanges() { - ApplyChanges(0, document.TextLength, document.Replace); + ApplyChanges(0, document.TextLength, document.Replace, (o, l, v) => document.GetText(o, l) != v); } public void ApplyChanges(int startOffset, int length) { - ApplyChanges(startOffset, length, document.Replace); + ApplyChanges(startOffset, length, document.Replace, (o, l, v) => document.GetText(o, l) != v); } /// @@ -150,11 +150,12 @@ namespace ICSharpCode.NRefactory.CSharp ApplyChanges(startOffset, length, script.Replace); } - public void ApplyChanges(int startOffset, int length, Action documentReplace) + public void ApplyChanges(int startOffset, int length, Action documentReplace, Func filter = null) { int endOffset = startOffset + length; TextReplaceAction previousChange = null; int delta = 0; + var depChanges = new List (); foreach (var change in changes.OrderBy(c => c.Offset)) { if (previousChange != null) { if (change.Equals(previousChange)) { @@ -174,16 +175,17 @@ namespace ICSharpCode.NRefactory.CSharp } previousChange = change; - if (change.Offset < startOffset) { - // skip all changes in front of the begin offset - continue; - } else if (change.Offset > endOffset) { - // skip this change unless it depends on one that we already applied - continue; + bool skipChange = change.Offset < startOffset || change.Offset > endOffset; + skipChange |= filter != null && filter(change.Offset + delta, change.RemovalLength, change.NewText); + skipChange &= !depChanges.Contains(change); + + if (!skipChange) { + documentReplace(change.Offset + delta, change.RemovalLength, change.NewText); + delta += change.NewText.Length - change.RemovalLength; + if (change.DependsOn != null) { + depChanges.Add(change.DependsOn); + } } - - documentReplace(change.Offset + delta, change.RemovalLength, change.NewText); - delta += change.NewText.Length - change.RemovalLength; } changes.Clear(); } From e2c89225988c8f6151d25c1084e7e7c5f1159e87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Sat, 17 Mar 2012 14:43:32 +0100 Subject: [PATCH 08/10] Fixed formatting filter. --- .../Formatter/AstFormattingVisitor.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs b/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs index 0e884002ca..e2f410ad7d 100644 --- a/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs +++ b/ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs @@ -129,12 +129,12 @@ namespace ICSharpCode.NRefactory.CSharp /// public void ApplyChanges() { - ApplyChanges(0, document.TextLength, document.Replace, (o, l, v) => document.GetText(o, l) != v); + ApplyChanges(0, document.TextLength, document.Replace, (o, l, v) => document.GetText(o, l) == v); } public void ApplyChanges(int startOffset, int length) { - ApplyChanges(startOffset, length, document.Replace, (o, l, v) => document.GetText(o, l) != v); + ApplyChanges(startOffset, length, document.Replace, (o, l, v) => document.GetText(o, l) == v); } /// From f78b052fb1fc31e79fe9071dbb470356e75b25bc Mon Sep 17 00:00:00 2001 From: mike Date: Mon, 19 Mar 2012 10:29:10 +0100 Subject: [PATCH 09/10] Fixed bug in override completion. --- .../Completion/CSharpCompletionEngine.cs | 22 ++++------------ .../CodeCompletion/CodeCompletionBugTests.cs | 25 +++++++++++++++++++ 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 0d122b1b33..4b284445e3 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -1562,7 +1562,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion IEnumerable GetOverrideCompletionData(IUnresolvedTypeDefinition type, string modifiers) { var wrapper = new CompletionDataWrapper (this); - var alreadyInserted = new Dictionary (); + var alreadyInserted = new List (); //bool addedVirtuals = false; int declarationBegin = offset; @@ -1644,16 +1644,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return null; } - static string GetNameWithParamCount(IMember member) - { - var e = member as IMethod; - if (e == null || e.TypeParameters.Count == 0) { - return member.Name; - } - return e.Name + "`" + e.TypeParameters.Count; - } - - void AddVirtuals(Dictionary alreadyInserted, CompletionDataWrapper col, string modifiers, IType curType, int declarationBegin) + void AddVirtuals(List alreadyInserted, CompletionDataWrapper col, string modifiers, IType curType, int declarationBegin) { if (curType == null) { return; @@ -1668,17 +1659,14 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } var data = factory.CreateNewOverrideCompletionData(declarationBegin, currentType, m); - string text = GetNameWithParamCount(m); - // check if the member is already implemented - bool foundMember = curType.GetMembers().Any(cm => GetNameWithParamCount(cm) == text && cm.DeclaringTypeDefinition == curType.GetDefinition()); + bool foundMember = curType.GetMembers().Any(cm => SignatureComparer.Ordinal.Equals(cm, m) && cm.DeclaringTypeDefinition == curType.GetDefinition()); if (foundMember) { continue; } - if (alreadyInserted.ContainsKey(text)) { + if (alreadyInserted.Any(cm => SignatureComparer.Ordinal.Equals(cm, m))) continue; - } - alreadyInserted [text] = true; + alreadyInserted.Add (m); data.CompletionCategory = col.GetCompletionCategory(curType); col.Add(data); } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs index cebaeaac37..5f4bd75469 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs @@ -4765,5 +4765,30 @@ class MainClass Assert.IsNull (provider.Find ("IEnumerable"), "'IEnumerable' found."); } + + /// + /// Bug 3957 - [New Resolver]Override completion doesn't work well for overloaded methods + /// + [Test()] + public void TestBug3957 () + { + var provider = CreateProvider ( +@"class A +{ + public virtual void Method() + {} + public virtual void Method(int i) + {} +} + +class B : A +{ + $override $ +} + +"); + Assert.AreEqual (2, provider.Data.Where (d => d.DisplayText == "Method").Count ()); + } + } } From 54b3baee81dd99fec7c0c79a60764719947688bb Mon Sep 17 00:00:00 2001 From: mike Date: Mon, 19 Mar 2012 12:53:01 +0100 Subject: [PATCH 10/10] Fixed possible null reference exception. --- .../Completion/CSharpCompletionEngineBase.cs | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 85346bca65..fc7d21b746 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -415,9 +415,9 @@ namespace ICSharpCode.NRefactory.CSharp.Completion wrapper.Append (';'); } - protected CompilationUnit ParseStub(string continuation, bool appendSemicolon = true, string afterContinuation = null) + protected CompilationUnit ParseStub (string continuation, bool appendSemicolon = true, string afterContinuation = null) { - var mt = GetMemberTextToCaret(); + var mt = GetMemberTextToCaret (); if (mt == null) { return null; } @@ -429,33 +429,35 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var wrapper = new StringBuilder (); bool wrapInClass = memberLocation != new TextLocation (1, 1); if (wrapInClass) { - var nodeAtLocation = Unit.GetNodeAt(memberLocation, n => n is TypeDeclaration || n is NamespaceDeclaration); - foreach (var n in nodeAtLocation.AncestorsAndSelf) { - if (memberLocation == n.StartLocation) { - continue; - } - if (n is TypeDeclaration) { - var t = (TypeDeclaration)n; - switch (t.ClassType) { + var nodeAtLocation = Unit.GetNodeAt (memberLocation, n => n is TypeDeclaration || n is NamespaceDeclaration); + if (nodeAtLocation != null) { + foreach (var n in nodeAtLocation.AncestorsAndSelf) { + if (memberLocation == n.StartLocation) { + continue; + } + if (n is TypeDeclaration) { + var t = (TypeDeclaration)n; + switch (t.ClassType) { case ClassType.Class: - wrapper.Append("class"); + wrapper.Append ("class"); break; case ClassType.Struct: - wrapper.Append("struct"); + wrapper.Append ("struct"); break; case ClassType.Interface: - wrapper.Append("interface"); + wrapper.Append ("interface"); break; case ClassType.Enum: - wrapper.Append("enum"); + wrapper.Append ("enum"); break; + } + wrapper.Append (" " + t.Name + " {"); + wrapper.AppendLine (); + closingBrackets++; + generatedLines++; + } else { + Console.WriteLine (n); } - wrapper.Append(" " + t.Name + " {"); - wrapper.AppendLine(); - closingBrackets++; - generatedLines++; - } else { - Console.WriteLine(n); } } }