diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 9fba783e8d..0244fd0e02 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -358,7 +358,19 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (IsInsideComment () || IsInsideString ()) return null; var identifierStart = GetExpressionAtCursor (); - + if (IsInLinqContext (offset)) { + tokenIndex = offset; + 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 (!(char.IsLetter (completionChar) || completionChar == '_') && (identifierStart == null || !(identifierStart.Item2 is ArrayInitializerExpression))) return controlSpace ? DefaultControlSpaceItems () : null; char prevCh = offset > 2 ? document.GetCharAt (offset - 2) : '\0'; @@ -437,25 +449,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion // result = FindExpression (dom, completionContext, -1); // if (result == null) // return null; -// if (IsInLinqContext (result)) { -// tokenIndex = offset; -// token = GetPreviousToken (ref tokenIndex, false); // token last typed -// token = GetPreviousToken (ref tokenIndex, false); // possible linq keyword ? -// triggerWordLength = 1; -// -// if (linqKeywords.Contains (token)) { -// if (token == "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; -// } else if (result.ExpressionContext != ExpressionContext.IdentifierExpected) { +// else if (result.ExpressionContext != ExpressionContext.IdentifierExpected) { // triggerWordLength = 1; // bool autoSelect = true; // IType returnType = null; @@ -518,6 +512,18 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } return null; } + + bool IsInLinqContext (int offset) + { + string token; + while (null != (token = GetPreviousToken (ref offset, true))) { + if (token == "from") + return true; + if (token == ";") + return false; + } + return false; + } IEnumerable DefaultControlSpaceItems () { @@ -1536,7 +1542,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion baseUnit = ParseStub ("a = b};", false); expr = baseUnit.GetNodeAt (location.Line, location.Column - 1); } - Print (baseUnit); + if (expr == null) return null; var member = Unit.GetNodeAt (memberLocation); diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 62f4938634..156ab0bb61 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -217,6 +217,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } else { memberLocation = new TextLocation (1, 1); } + using (var stream = new System.IO.StringReader (wrapper.ToString ())) { var parser = new CSharpParser (); return parser.Parse (stream, wrapInClass ? memberLocation.Line - 2 : 0); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs index a43fc8cf5d..151c8bd379 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs @@ -2686,7 +2686,7 @@ class MyTest [Test()] public void TestBug534680 () { - CompletionDataList provider = CreateProvider ( + CompletionDataList provider = CreateCtrlSpaceProvider ( @" class Foo {