From d60aaebc8a4e66e548a5c9890fd271e82e1d6d45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Fri, 8 Jun 2012 13:06:36 +0200 Subject: [PATCH 1/9] [Completion] Member provider now needs to be given in the constructor. --- .../Completion/CSharpCompletionEngine.cs | 2 +- .../Completion/CSharpCompletionEngineBase.cs | 141 ++---------------- .../CSharpParameterCompletionEngine.cs | 2 +- .../Completion/IMemberProvider.cs | 124 +++++++++++++++ .../CodeCompletion/CodeCompletionBugTests.cs | 67 +++++---- .../ParameterCompletionTests.cs | 52 +++---- 6 files changed, 198 insertions(+), 190 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 270a308a36..e1d15d76e5 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -57,7 +57,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion public bool CloseOnSquareBrackets; #endregion - public CSharpCompletionEngine(IDocument document, ICompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx, CompilationUnit unit, CSharpParsedFile parsedFile) : base (content, ctx, unit, parsedFile) + public CSharpCompletionEngine(IDocument document, IMemberProvider memberProvider, ICompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx, CompilationUnit unit, CSharpParsedFile parsedFile) : base (content, memberProvider, ctx, unit, parsedFile) { if (document == null) { throw new ArgumentNullException("document"); diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 7ec124b5cb..b0f08e2197 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -68,18 +68,21 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } #endregion - protected CSharpCompletionEngineBase (IProjectContent content, CSharpTypeResolveContext ctx, CompilationUnit unit, CSharpParsedFile parsedFile) + protected CSharpCompletionEngineBase(IProjectContent content, IMemberProvider memberProvider, CSharpTypeResolveContext ctx, CompilationUnit unit, CSharpParsedFile parsedFile) { if (content == null) - throw new ArgumentNullException ("content"); + throw new ArgumentNullException("content"); if (ctx == null) - throw new ArgumentNullException ("ctx"); + throw new ArgumentNullException("ctx"); if (unit == null) - throw new ArgumentNullException ("unit"); + throw new ArgumentNullException("unit"); if (parsedFile == null) - throw new ArgumentNullException ("parsedFile"); + throw new ArgumentNullException("parsedFile"); + if (memberProvider == null) + throw new ArgumentNullException("memberProvider"); this.ProjectContent = content; + this.MemberProvider = memberProvider; this.ctx = ctx; this.Unit = unit; this.CSharpParsedFile = parsedFile; @@ -88,7 +91,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion public IMemberProvider MemberProvider { get; - set; + private set; } public void SetOffset (int offset) @@ -97,8 +100,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion this.offset = offset; this.location = document.GetLocation (offset); - var provider = MemberProvider ?? new DefaultMemberProvider (this); - provider.GetCurrentMembers (offset, out currentType, out currentMember); + MemberProvider.GetCurrentMembers (offset, out currentType, out currentMember); } public bool GetParameterCompletionCommandOffset (out int cpos) @@ -839,128 +841,5 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } #endregion - - class DefaultMemberProvider : IMemberProvider - { - CSharpCompletionEngineBase engine; - - - public DefaultMemberProvider (CSharpCompletionEngineBase engine) - { - this.engine = engine; - } - - public void GetCurrentMembers (int offset, out IUnresolvedTypeDefinition currentType, out IUnresolvedMember currentMember) - { - //var document = engine.document; - var location = engine.location; - - currentType = null; - - foreach (var type in engine.CSharpParsedFile.TopLevelTypeDefinitions) { - if (type.Region.Begin < location) - currentType = type; - } - currentType = FindInnerType (currentType, location); - - // location is beyond last reported end region, now we need to check, if the end region changed - if (currentType != null && currentType.Region.End < location) { - if (!IsInsideType (currentType, location)) - currentType = null; - } - currentMember = null; - if (currentType != null) { - foreach (var member in currentType.Members) { - if (member.Region.Begin < location && (currentMember == null || currentMember.Region.Begin < member.Region.Begin)) - currentMember = member; - } - } - - // location is beyond last reported end region, now we need to check, if the end region changed - // NOTE: Enums are a special case, there the "last" field needs to be treated as current member - if (currentMember != null && currentMember.Region.End < location && currentType.Kind != TypeKind.Enum) { - if (!IsInsideType (currentMember, location)) - currentMember = null; - } - var stack = GetBracketStack (engine.GetMemberTextToCaret ().Item1); - if (stack.Count == 0) - currentMember = null; - } - - IUnresolvedTypeDefinition FindInnerType (IUnresolvedTypeDefinition parent, TextLocation location) - { - if (parent == null) - return null; - var currentType = parent; - foreach (var type in parent.NestedTypes) { - if (type.Region.Begin < location && location < type.Region.End) - currentType = FindInnerType (type, location); - } - - return currentType; - } - - bool IsInsideType (IUnresolvedEntity currentType, TextLocation location) - { - var document = engine.document; - - int startOffset = document.GetOffset (currentType.Region.Begin); - int endOffset = document.GetOffset (location); - //bool foundEndBracket = false; - - var bracketStack = new Stack (); - - bool isInString = false, isInChar = false; - bool isInLineComment = false, isInBlockComment = false; - - for (int i = startOffset; i < endOffset; i++) { - char ch = document.GetCharAt (i); - switch (ch) { - case '(': - case '[': - case '{': - if (!isInString && !isInChar && !isInLineComment && !isInBlockComment) - bracketStack.Push (ch); - break; - case ')': - case ']': - case '}': - if (!isInString && !isInChar && !isInLineComment && !isInBlockComment) - if (bracketStack.Count > 0) - bracketStack.Pop (); - break; - case '\r': - case '\n': - isInLineComment = false; - break; - case '/': - if (isInBlockComment) { - if (i > 0 && document.GetCharAt (i - 1) == '*') - isInBlockComment = false; - } else if (!isInString && !isInChar && i + 1 < document.TextLength) { - char nextChar = document.GetCharAt (i + 1); - if (nextChar == '/') - isInLineComment = true; - if (!isInLineComment && nextChar == '*') - isInBlockComment = true; - } - break; - case '"': - if (!(isInChar || isInLineComment || isInBlockComment)) - isInString = !isInString; - break; - case '\'': - if (!(isInString || isInLineComment || isInBlockComment)) - isInChar = !isInChar; - break; - default : - break; - } - } - return bracketStack.Any (t => t == '{'); - } - } - - } } \ No newline at end of file diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs index 5ba4e01ce4..a1ccdd1cf1 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs @@ -39,7 +39,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion { internal IParameterCompletionDataFactory factory; - public CSharpParameterCompletionEngine(IDocument document, IParameterCompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx, CompilationUnit unit, CSharpParsedFile parsedFile) : base (content, ctx, unit, parsedFile) + public CSharpParameterCompletionEngine(IDocument document, IMemberProvider memberProvider, IParameterCompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx, CompilationUnit unit, CSharpParsedFile parsedFile) : base (content, memberProvider, ctx, unit, parsedFile) { if (document == null) { throw new ArgumentNullException("document"); diff --git a/ICSharpCode.NRefactory.CSharp/Completion/IMemberProvider.cs b/ICSharpCode.NRefactory.CSharp/Completion/IMemberProvider.cs index 689fe96148..e41a006695 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/IMemberProvider.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/IMemberProvider.cs @@ -36,5 +36,129 @@ namespace ICSharpCode.NRefactory.CSharp.Completion { void GetCurrentMembers (int offset, out IUnresolvedTypeDefinition currentType, out IUnresolvedMember currentMember); } + + public class DefaultMemberProvider : IMemberProvider + { + readonly IDocument document; + readonly CSharpParsedFile parsedFile; + + public DefaultMemberProvider (IDocument document, CSharpParsedFile parsedFile) + { + if (document == null) + throw new ArgumentNullException("document"); + if (parsedFile == null) + throw new ArgumentNullException("parsedFile"); + this.document = document; + this.parsedFile = parsedFile; + } + + public void GetCurrentMembers(int offset, out IUnresolvedTypeDefinition currentType, out IUnresolvedMember currentMember) + { + //var document = engine.document; + var location = document.GetLocation(offset); + + currentType = null; + + foreach (var type in parsedFile.TopLevelTypeDefinitions) { + if (type.Region.Begin < location) + currentType = type; + } + currentType = FindInnerType (currentType, location); + + // location is beyond last reported end region, now we need to check, if the end region changed + if (currentType != null && currentType.Region.End < location) { + if (!IsInsideType (currentType, location)) + currentType = null; + } + currentMember = null; + if (currentType != null) { + foreach (var member in currentType.Members) { + if (member.Region.Begin < location && (currentMember == null || currentMember.Region.Begin < member.Region.Begin)) + currentMember = member; + } + } + + // location is beyond last reported end region, now we need to check, if the end region changed + // NOTE: Enums are a special case, there the "last" field needs to be treated as current member + if (currentMember != null && currentMember.Region.End < location && currentType.Kind != TypeKind.Enum) { + if (!IsInsideType (currentMember, location)) + currentMember = null; + }/* + var stack = GetBracketStack (engine.GetMemberTextToCaret ().Item1); + if (stack.Count == 0) + currentMember = null;*/ + } + + IUnresolvedTypeDefinition FindInnerType (IUnresolvedTypeDefinition parent, TextLocation location) + { + if (parent == null) + return null; + var currentType = parent; + foreach (var type in parent.NestedTypes) { + if (type.Region.Begin < location && location < type.Region.End) + currentType = FindInnerType (type, location); + } + + return currentType; + } + + bool IsInsideType (IUnresolvedEntity currentType, TextLocation location) + { + int startOffset = document.GetOffset (currentType.Region.Begin); + int endOffset = document.GetOffset (location); + //bool foundEndBracket = false; + + var bracketStack = new Stack (); + + bool isInString = false, isInChar = false; + bool isInLineComment = false, isInBlockComment = false; + + for (int i = startOffset; i < endOffset; i++) { + char ch = document.GetCharAt (i); + switch (ch) { + case '(': + case '[': + case '{': + if (!isInString && !isInChar && !isInLineComment && !isInBlockComment) + bracketStack.Push (ch); + break; + case ')': + case ']': + case '}': + if (!isInString && !isInChar && !isInLineComment && !isInBlockComment) + if (bracketStack.Count > 0) + bracketStack.Pop (); + break; + case '\r': + case '\n': + isInLineComment = false; + break; + case '/': + if (isInBlockComment) { + if (i > 0 && document.GetCharAt (i - 1) == '*') + isInBlockComment = false; + } else if (!isInString && !isInChar && i + 1 < document.TextLength) { + char nextChar = document.GetCharAt (i + 1); + if (nextChar == '/') + isInLineComment = true; + if (!isInLineComment && nextChar == '*') + isInBlockComment = true; + } + break; + case '"': + if (!(isInChar || isInLineComment || isInBlockComment)) + isInString = !isInString; + break; + case '\'': + if (!(isInString || isInLineComment || isInBlockComment)) + isInChar = !isInChar; + break; + default : + break; + } + } + return bracketStack.Any (t => t == '{'); + } + } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs index 206aeae030..d8309e6b61 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs @@ -199,46 +199,48 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion #endregion } - static CompletionDataList CreateProvider (string text, bool isCtrlSpace) + static CompletionDataList CreateProvider(string text, bool isCtrlSpace) { string parsedText; string editorText; - int cursorPosition = text.IndexOf ('$'); - int endPos = text.IndexOf ('$', cursorPosition + 1); + int cursorPosition = text.IndexOf('$'); + int endPos = text.IndexOf('$', cursorPosition + 1); if (endPos == -1) { - parsedText = editorText = text.Substring (0, cursorPosition) + text.Substring (cursorPosition + 1); + parsedText = editorText = text.Substring(0, cursorPosition) + text.Substring(cursorPosition + 1); } else { - parsedText = text.Substring (0, cursorPosition) + new string (' ', endPos - cursorPosition) + text.Substring (endPos + 1); - editorText = text.Substring (0, cursorPosition) + text.Substring (cursorPosition + 1, endPos - cursorPosition - 1) + text.Substring (endPos + 1); + parsedText = text.Substring(0, cursorPosition) + new string(' ', endPos - cursorPosition) + text.Substring(endPos + 1); + editorText = text.Substring(0, cursorPosition) + text.Substring(cursorPosition + 1, endPos - cursorPosition - 1) + text.Substring(endPos + 1); cursorPosition = endPos - 1; } - var doc = new ReadOnlyDocument (editorText); + var doc = new ReadOnlyDocument(editorText); - IProjectContent pctx = new CSharpProjectContent (); - pctx = pctx.AddAssemblyReferences (new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore }); + IProjectContent pctx = new CSharpProjectContent(); + pctx = pctx.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore }); - var compilationUnit = new CSharpParser ().Parse (parsedText, "program.cs"); - compilationUnit.Freeze (); + var compilationUnit = new CSharpParser().Parse(parsedText, "program.cs"); + compilationUnit.Freeze(); - var parsedFile = compilationUnit.ToTypeSystem (); - pctx = pctx.UpdateProjectContent (null, parsedFile); + var parsedFile = compilationUnit.ToTypeSystem(); + pctx = pctx.UpdateProjectContent(null, parsedFile); - var cmp = pctx.CreateCompilation (); - var loc = doc.GetLocation (cursorPosition); + var cmp = pctx.CreateCompilation(); + var loc = doc.GetLocation(cursorPosition); - var rctx = new CSharpTypeResolveContext (cmp.MainAssembly); - rctx = rctx.WithUsingScope (parsedFile.GetUsingScope (loc).Resolve (cmp)); + var rctx = new CSharpTypeResolveContext(cmp.MainAssembly); + rctx = rctx.WithUsingScope(parsedFile.GetUsingScope(loc).Resolve(cmp)); - var curDef = parsedFile.GetInnermostTypeDefinition (loc); + var curDef = parsedFile.GetInnermostTypeDefinition(loc); if (curDef != null) { - var resolvedDef = curDef.Resolve (rctx).GetDefinition (); - rctx = rctx.WithCurrentTypeDefinition (resolvedDef); - var curMember = resolvedDef.Members.FirstOrDefault (m => m.Region.Begin <= loc && loc < m.BodyRegion.End); - if (curMember != null) - rctx = rctx.WithCurrentMember (curMember); + var resolvedDef = curDef.Resolve(rctx).GetDefinition(); + rctx = rctx.WithCurrentTypeDefinition(resolvedDef); + var curMember = resolvedDef.Members.FirstOrDefault(m => m.Region.Begin <= loc && loc < m.BodyRegion.End); + if (curMember != null) { + rctx = rctx.WithCurrentMember(curMember); + } } - var engine = new CSharpCompletionEngine (doc, new TestFactory (), pctx, rctx, compilationUnit, parsedFile); + var mb = new DefaultMemberProvider(doc, parsedFile); + var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, rctx, compilationUnit, parsedFile); engine.EolMarker = Environment.NewLine; engine.FormattingPolicy = FormattingOptionsFactory.CreateMono (); @@ -253,17 +255,18 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion }; } - Tuple GetContent (string text, CompilationUnit compilationUnit) + Tuple GetContent(string text, CompilationUnit compilationUnit) { - var doc = new ReadOnlyDocument (text); - IProjectContent pctx = new CSharpProjectContent (); - pctx = pctx.AddAssemblyReferences (new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore }); - var parsedFile = compilationUnit.ToTypeSystem (); + var doc = new ReadOnlyDocument(text); + IProjectContent pctx = new CSharpProjectContent(); + pctx = pctx.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore }); + var parsedFile = compilationUnit.ToTypeSystem(); - pctx = pctx.UpdateProjectContent (null, parsedFile); - var cmp = pctx.CreateCompilation (); + pctx = pctx.UpdateProjectContent(null, parsedFile); + var cmp = pctx.CreateCompilation(); - var engine = new CSharpCompletionEngine (doc, new TestFactory (), pctx, new CSharpTypeResolveContext (cmp.MainAssembly), compilationUnit, parsedFile); + var mb = new DefaultMemberProvider(doc, parsedFile); + var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, new CSharpTypeResolveContext (cmp.MainAssembly), compilationUnit, parsedFile); engine.EolMarker = Environment.NewLine; engine.FormattingPolicy = FormattingOptionsFactory.CreateMono (); return Tuple.Create (doc, engine); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs index 82ec44c466..58532ee35b 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs @@ -254,43 +254,45 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion #endregion } - internal static IParameterDataProvider CreateProvider (string text) + internal static IParameterDataProvider CreateProvider(string text) { string parsedText; string editorText; - int cursorPosition = text.IndexOf ('$'); - int endPos = text.IndexOf ('$', cursorPosition + 1); - if (endPos == -1) - parsedText = editorText = text.Substring (0, cursorPosition) + text.Substring (cursorPosition + 1); - else { - parsedText = text.Substring (0, cursorPosition) + new string (' ', endPos - cursorPosition) + text.Substring (endPos + 1); - editorText = text.Substring (0, cursorPosition) + text.Substring (cursorPosition + 1, endPos - cursorPosition - 1) + text.Substring (endPos + 1); + int cursorPosition = text.IndexOf('$'); + int endPos = text.IndexOf('$', cursorPosition + 1); + if (endPos == -1) { + parsedText = editorText = text.Substring(0, cursorPosition) + text.Substring(cursorPosition + 1); + } else { + parsedText = text.Substring(0, cursorPosition) + new string(' ', endPos - cursorPosition) + text.Substring(endPos + 1); + editorText = text.Substring(0, cursorPosition) + text.Substring(cursorPosition + 1, endPos - cursorPosition - 1) + text.Substring(endPos + 1); cursorPosition = endPos - 1; } - var doc = new ReadOnlyDocument (editorText); + var doc = new ReadOnlyDocument(editorText); - IProjectContent pctx = new CSharpProjectContent (); - pctx = pctx.AddAssemblyReferences (new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore }); + IProjectContent pctx = new CSharpProjectContent(); + pctx = pctx.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore }); - var compilationUnit = new CSharpParser ().Parse (parsedText, "program.cs"); - compilationUnit.Freeze (); + var compilationUnit = new CSharpParser().Parse(parsedText, "program.cs"); + compilationUnit.Freeze(); - var parsedFile = compilationUnit.ToTypeSystem (); - pctx = pctx.UpdateProjectContent (null, parsedFile); - var cmp = pctx.CreateCompilation (); - var loc = doc.GetLocation (cursorPosition); + var parsedFile = compilationUnit.ToTypeSystem(); + pctx = pctx.UpdateProjectContent(null, parsedFile); + var cmp = pctx.CreateCompilation(); + var loc = doc.GetLocation(cursorPosition); - var rctx = new CSharpTypeResolveContext (cmp.MainAssembly); - rctx = rctx.WithUsingScope (parsedFile.GetUsingScope (loc).Resolve (cmp)); - var curDef = parsedFile.GetInnermostTypeDefinition (loc); + var rctx = new CSharpTypeResolveContext(cmp.MainAssembly); + rctx = rctx.WithUsingScope(parsedFile.GetUsingScope(loc).Resolve(cmp)); + var curDef = parsedFile.GetInnermostTypeDefinition(loc); if (curDef != null) { - rctx = rctx.WithCurrentTypeDefinition (curDef.Resolve (rctx).GetDefinition ()); - var curMember = parsedFile.GetMember (loc); - if (curMember != null) - rctx = rctx.WithCurrentMember (curMember.CreateResolved (rctx)); + rctx = rctx.WithCurrentTypeDefinition(curDef.Resolve(rctx).GetDefinition()); + var curMember = parsedFile.GetMember(loc); + if (curMember != null) { + rctx = rctx.WithCurrentMember(curMember.CreateResolved(rctx)); + } } - var engine = new CSharpParameterCompletionEngine (doc, new TestFactory (pctx), pctx, rctx, compilationUnit, parsedFile); + var mb = new DefaultMemberProvider(doc, parsedFile); + var engine = new CSharpParameterCompletionEngine (doc, mb, new TestFactory (pctx), pctx, rctx, compilationUnit, parsedFile); return engine.GetParameterDataProvider (cursorPosition, doc.GetCharAt (cursorPosition - 1)); } From 39ac51cf09cbaeae795ed0bdca49b648daf30fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Fri, 8 Jun 2012 13:16:53 +0200 Subject: [PATCH 2/9] [Completion] Made API a bit simpler. --- .../Completion/CSharpCompletionEngine.cs | 55 +++++++++---------- .../Completion/CSharpCompletionEngineBase.cs | 11 +--- .../CSharpParameterCompletionEngine.cs | 15 +---- .../CodeCompletion/CodeCompletionBugTests.cs | 4 +- .../ParameterCompletionTests.cs | 2 +- 5 files changed, 35 insertions(+), 52 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index e1d15d76e5..e6fabac394 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -57,7 +57,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion public bool CloseOnSquareBrackets; #endregion - public CSharpCompletionEngine(IDocument document, IMemberProvider memberProvider, ICompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx, CompilationUnit unit, CSharpParsedFile parsedFile) : base (content, memberProvider, ctx, unit, parsedFile) + public CSharpCompletionEngine(IDocument document, IMemberProvider memberProvider, ICompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx, CSharpParsedFile parsedFile) : base (content, memberProvider, ctx, parsedFile) { if (document == null) { throw new ArgumentNullException("document"); @@ -239,7 +239,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion parent = (ArrayInitializerExpression)parent.Parent; if (p != null) { var contextList = new CompletionDataWrapper(this); - var initializerResult = ResolveExpression(p, unit); + var initializerResult = ResolveExpression(p); if (initializerResult != null && initializerResult.Item1.Type.Kind != TypeKind.Unknown) { // check 3 cases: // 1) New initalizer { xpr @@ -255,7 +255,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (prev != null && !(prev is NamedExpression)) { - AddContextCompletion(contextList, GetState(), n, unit); + AddContextCompletion(contextList, GetState(), n); // case 3) return contextList.Result; } @@ -279,7 +279,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return contextList.Result; } - AddContextCompletion(contextList, GetState(), n, unit); + AddContextCompletion(contextList, GetState(), n); return contextList.Result; } } @@ -480,8 +480,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion AddContextCompletion( wrapper, resolveResult.Item2, - expressionOrVariableDeclaration.Node, - expressionOrVariableDeclaration.Unit); + expressionOrVariableDeclaration.Node); AddEnumMembers(wrapper, resolveResult.Item1.Type, resolveResult.Item2); AutoCompleteEmptyMatch = false; return wrapper.Result; @@ -742,8 +741,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (n != null && n.Parent is InvocationExpression) { var invokeParent = (InvocationExpression)n.Parent; var invokeResult = ResolveExpression( - invokeParent.Target, - identifierStart.Unit + invokeParent.Target ); var mgr = invokeResult != null ? invokeResult.Item1 as MethodGroupResolveResult : null; if (mgr != null) { @@ -777,7 +775,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (n != null && n.Parent is ObjectCreateExpression) { - var invokeResult = ResolveExpression(n.Parent, identifierStart.Unit); + var invokeResult = ResolveExpression(n.Parent); var mgr = invokeResult != null ? invokeResult.Item1 as ResolveResult : null; if (mgr != null) { foreach (var constructor in mgr.Type.GetConstructors ()) { @@ -797,14 +795,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } // check for compare to enum case if (evaluationExpr != null) { - resolveResult = ResolveExpression(evaluationExpr, identifierStart.Unit); + resolveResult = ResolveExpression(evaluationExpr); if (resolveResult != null && resolveResult.Item1.Type.Kind == TypeKind.Enum) { var wrapper = new CompletionDataWrapper(this); AddContextCompletion( wrapper, resolveResult.Item2, - evaluationExpr, - identifierStart.Unit + evaluationExpr ); AddEnumMembers(wrapper, resolveResult.Item1.Type, resolveResult.Item2); AutoCompleteEmptyMatch = false; @@ -827,7 +824,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return DefaultControlSpaceItems(); } - var initalizerResult = ResolveExpression(n.Parent, identifierStart.Unit); + var initalizerResult = ResolveExpression(n.Parent); var concreteNode = identifierStart.Unit.GetNodeAt(location); // check if we're on the right side of an initializer expression @@ -869,8 +866,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (n is MemberType) { resolveResult = ResolveExpression( - ((MemberType)n).Target, - identifierStart.Unit + ((MemberType)n).Target ); return CreateTypeAndNamespaceCompletionData( location, @@ -917,8 +913,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion AddContextCompletion( contextList, csResolver, - identifierStart.Node, - identifierStart.Unit + identifierStart.Node ); return contextList.Result; // if (stub.Parent is BlockStatement) @@ -1111,7 +1106,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion Tuple rr; if (xp != null) { node = xp.Node; - rr = ResolveExpression(node, xp.Unit); + rr = ResolveExpression(node); unit = xp.Unit; } else { unit = ParseStub("foo", false); @@ -1120,7 +1115,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion location.Column + 2, n => n is Expression || n is AstType ); - rr = ResolveExpression(node, unit); + rr = ResolveExpression(node); } if (node is Identifier && node.Parent is ForeachStatement) { var foreachStmt = (ForeachStatement)node.Parent; @@ -1152,7 +1147,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return wrapper.Result; } } - if (Unit != null && (node == null || node is TypeDeclaration)) { +/* if (Unit != null && (node == null || node is TypeDeclaration)) { var constructor = Unit.GetNodeAt( location.Line, location.Column - 3 @@ -1162,7 +1157,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion wrapper.AddCustom("base"); return wrapper.Result; } - } + }*/ var initializer = node != null ? node.Parent as ArrayInitializerExpression : null; if (initializer != null) { @@ -1190,12 +1185,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion csResolver = GetState(); } } - AddContextCompletion(wrapper, csResolver, node, unit); + AddContextCompletion(wrapper, csResolver, node); return wrapper.Result; } - void AddContextCompletion(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, CompilationUnit unit) + void AddContextCompletion(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node) { if (state != null && !(node is AstType)) { foreach (var variable in state.LocalVariables) { @@ -1266,7 +1261,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion wrapper.Result.AddRange(factory.CreateCodeTemplateCompletionData()); if (node != null && node.Role == Roles.Argument) { - var resolved = ResolveExpression(node.Parent, unit); + var resolved = ResolveExpression(node.Parent); var invokeResult = resolved != null ? resolved.Item1 as CSharpInvocationResolveResult : null; if (invokeResult != null) { int argNum = 0; @@ -1284,7 +1279,10 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } if (node is Expression) { - var astResolver = new CSharpAstResolver(state, unit, CSharpParsedFile); + var root = node; + while (root.Parent != null) + root = root.Parent; + var astResolver = new CSharpAstResolver(state, root, CSharpParsedFile); foreach (var type in CreateFieldAction.GetValidTypes(astResolver, (Expression)node)) { if (type.Kind == TypeKind.Enum) { AddEnumMembers(wrapper, type, state); @@ -1523,7 +1521,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion parent = parent.Parent; } if (parent is VariableDeclarationStatement) { - var resolved = ResolveExpression(parent, isAsExpression.Unit); + var resolved = ResolveExpression(parent); if (resolved != null) { isAsType = resolved.Item1.Type; } @@ -1689,8 +1687,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion AddContextCompletion( inList, rr != null ? rr.Item2 : GetState(), - expr.Node, - Unit + expr.Node ); return inList.Result; } @@ -2238,7 +2235,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion AutoCompleteEmptyMatch = false; AutoSelect = false; } - AddContextCompletion(result, state, invocation, unit); + AddContextCompletion(result, state, invocation); // resolver.AddAccessibleCodeCompletionData (ExpressionContext.MethodBody, cdc); // if (addedDelegates.Count > 0) { diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index b0f08e2197..05d86d4d5d 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -51,8 +51,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion #region Input properties public CSharpTypeResolveContext ctx { get; private set; } - public CompilationUnit Unit { get; private set; } - public CSharpParsedFile CSharpParsedFile { get; private set; } public IProjectContent ProjectContent { get; private set; } @@ -68,14 +66,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } #endregion - protected CSharpCompletionEngineBase(IProjectContent content, IMemberProvider memberProvider, CSharpTypeResolveContext ctx, CompilationUnit unit, CSharpParsedFile parsedFile) + protected CSharpCompletionEngineBase(IProjectContent content, IMemberProvider memberProvider, CSharpTypeResolveContext ctx, CSharpParsedFile parsedFile) { if (content == null) throw new ArgumentNullException("content"); if (ctx == null) throw new ArgumentNullException("ctx"); - if (unit == null) - throw new ArgumentNullException("unit"); if (parsedFile == null) throw new ArgumentNullException("parsedFile"); if (memberProvider == null) @@ -84,7 +80,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion this.ProjectContent = content; this.MemberProvider = memberProvider; this.ctx = ctx; - this.Unit = unit; this.CSharpParsedFile = parsedFile; } @@ -808,10 +803,10 @@ namespace ICSharpCode.NRefactory.CSharp.Completion protected Tuple ResolveExpression (ExpressionResult tuple) { - return ResolveExpression (tuple.Node, tuple.Unit); + return ResolveExpression (tuple.Node); } - protected Tuple ResolveExpression(AstNode expr, CompilationUnit unit) + protected Tuple ResolveExpression(AstNode expr) { if (expr == null) { return null; diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs index a1ccdd1cf1..306ccaa4df 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs @@ -39,7 +39,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion { internal IParameterCompletionDataFactory factory; - public CSharpParameterCompletionEngine(IDocument document, IMemberProvider memberProvider, IParameterCompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx, CompilationUnit unit, CSharpParsedFile parsedFile) : base (content, memberProvider, ctx, unit, parsedFile) + public CSharpParameterCompletionEngine(IDocument document, IMemberProvider memberProvider, IParameterCompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx, CSharpParsedFile parsedFile) : base (content, memberProvider, ctx, parsedFile) { if (document == null) { throw new ArgumentNullException("document"); @@ -57,9 +57,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (currentMember == null && currentType == null) { return null; } - if (Unit == null) { - return null; - } baseUnit = ParseStub("x] = a[1"); //var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; @@ -80,9 +77,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (currentMember == null && currentType == null) { return null; } - if (Unit == null) { - return null; - } baseUnit = ParseStub("a) {}", false); var expr = baseUnit.GetNodeAt (location); @@ -98,9 +92,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (currentMember == null && currentType == null) { return null; } - if (Unit == null) { - return null; - } baseUnit = ParseStub("x> a"); //var memberLocation = currentMember != null ? currentMember.Region.Begin : currentType.Region.Begin; @@ -171,7 +162,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } } if (invoke.Node is ObjectCreateExpression) { - var createType = ResolveExpression(((ObjectCreateExpression)invoke.Node).Type, invoke.Unit); + var createType = ResolveExpression(((ObjectCreateExpression)invoke.Node).Type); if (createType.Item1.Type.Kind == TypeKind.Unknown) return null; return factory.CreateConstructorProvider(document.GetOffset(invoke.Node.StartLocation), createType.Item1.Type); @@ -234,7 +225,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (GetCurrentParameterIndex(document.GetOffset(invoke.Node.StartLocation), offset) < 0) return null; if (invoke.Node is ObjectCreateExpression) { - var createType = ResolveExpression(((ObjectCreateExpression)invoke.Node).Type, invoke.Unit); + var createType = ResolveExpression(((ObjectCreateExpression)invoke.Node).Type); return factory.CreateConstructorProvider(document.GetOffset(invoke.Node.StartLocation), createType.Item1.Type); } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs index d8309e6b61..f8a2525475 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs @@ -240,7 +240,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion } } var mb = new DefaultMemberProvider(doc, parsedFile); - var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, rctx, compilationUnit, parsedFile); + var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, rctx, parsedFile); engine.EolMarker = Environment.NewLine; engine.FormattingPolicy = FormattingOptionsFactory.CreateMono (); @@ -266,7 +266,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion var cmp = pctx.CreateCompilation(); var mb = new DefaultMemberProvider(doc, parsedFile); - var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, new CSharpTypeResolveContext (cmp.MainAssembly), compilationUnit, parsedFile); + var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, new CSharpTypeResolveContext (cmp.MainAssembly), parsedFile); engine.EolMarker = Environment.NewLine; engine.FormattingPolicy = FormattingOptionsFactory.CreateMono (); return Tuple.Create (doc, engine); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs index 58532ee35b..d88185624e 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs @@ -292,7 +292,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion } } var mb = new DefaultMemberProvider(doc, parsedFile); - var engine = new CSharpParameterCompletionEngine (doc, mb, new TestFactory (pctx), pctx, rctx, compilationUnit, parsedFile); + var engine = new CSharpParameterCompletionEngine (doc, mb, new TestFactory (pctx), pctx, rctx, parsedFile); return engine.GetParameterDataProvider (cursorPosition, doc.GetCharAt (cursorPosition - 1)); } From a8e702be8c6529de2d31fd2051e12354206c370f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Fri, 8 Jun 2012 13:41:48 +0200 Subject: [PATCH 3/9] [Completion] Lowered parsed file usages. --- .../Completion/CSharpCompletionEngine.cs | 15 ++++++--------- .../Completion/CSharpParameterCompletionEngine.cs | 11 +++-------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index e6fabac394..3ba578c4ae 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -1318,10 +1318,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion void AddTypesAndNamespaces(CompletionDataWrapper wrapper, CSharpResolver state, AstNode node, Func typePred = null, Predicate memberPred = null, Action callback = null) { - var lookup = new MemberLookup( - ctx.CurrentTypeDefinition, - Compilation.MainAssembly - ); + var lookup = new MemberLookup(ctx.CurrentTypeDefinition, Compilation.MainAssembly); if (currentType != null) { for (var ct = currentType; ct != null; ct = ct.DeclaringTypeDefinition) { foreach (var nestedType in ct.NestedTypes) { @@ -1382,7 +1379,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion wrapper.AddTypeParameter(p); } } - var scope = CSharpParsedFile.GetUsingScope(location).Resolve(Compilation); + var scope = ctx.CurrentUsingScope; for (var n = scope; n != null; n = n.Parent) { foreach (var pair in n.UsingAliases) { @@ -2369,7 +2366,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } } // ADD Aliases - var scope = CSharpParsedFile.GetUsingScope(location).Resolve(Compilation); + var scope = ctx.CurrentUsingScope; for (var n = scope; n != null; n = n.Parent) { foreach (var pair in n.UsingAliases) { @@ -2749,7 +2746,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion sb.Append("a;"); AppendMissingClosingBrackets(sb, text, false); var stream = new System.IO.StringReader(sb.ToString()); - var completionUnit = parser.Parse(stream, CSharpParsedFile.FileName, 0); + var completionUnit = parser.Parse(stream, "a.cs", 0); stream.Close(); var loc = document.GetLocation(offset); @@ -2772,7 +2769,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion AppendMissingClosingBrackets(sb, text, false); var stream = new System.IO.StringReader(sb.ToString()); - var completionUnit = parser.Parse(stream, CSharpParsedFile.FileName, 0); + var completionUnit = parser.Parse(stream, "a.cs", 0); stream.Close(); var loc = document.GetLocation(offset); @@ -2783,7 +2780,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion sb.Append("a ()"); AppendMissingClosingBrackets(sb, text, false); stream = new System.IO.StringReader(sb.ToString()); - completionUnit = parser.Parse(stream, CSharpParsedFile.FileName, 0); + completionUnit = parser.Parse(stream, "a.cs", 0); stream.Close(); loc = document.GetLocation(offset); diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs index 306ccaa4df..129ad12992 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs @@ -307,17 +307,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion List GetUsedNamespaces() { - var scope = CSharpParsedFile.GetUsingScope(location); + var scope = ctx.CurrentUsingScope; var result = new List(); - var resolver = new CSharpResolver(ctx); while (scope != null) { - result.Add(scope.NamespaceName); + result.Add(scope.Namespace.FullName); - foreach (var u in scope.Usings) { - var ns = u.ResolveNamespace(resolver); - if (ns == null) { - continue; - } + foreach (var ns in scope.Usings) { result.Add(ns.FullName); } scope = scope.Parent; From 1a3303968c4019b045b7b97deb88e0b92633f99d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Fri, 8 Jun 2012 13:55:26 +0200 Subject: [PATCH 4/9] [Completion] Use getstate to get the current resolver state. --- .../Completion/CSharpCompletionEngineBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 05d86d4d5d..4f3357baa7 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -820,7 +820,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion resolveNode = expr; } try { - var ctx = CSharpParsedFile.GetResolver(Compilation, location); + var ctx = GetState (); var root = expr.AncestorsAndSelf.FirstOrDefault(n => n is EntityDeclaration || n is CompilationUnit); if (root == null) { return null; From c9d2776522461c1ac932880ee58c519dd9ffdd26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Fri, 8 Jun 2012 14:38:45 +0200 Subject: [PATCH 5/9] [Completion] Added GetMemberTextToCaret interface method. --- .../Completion/CSharpCompletionEngineBase.cs | 24 +++--------------- .../Completion/IMemberProvider.cs | 25 +++++++++++++++++++ 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index 4f3357baa7..eb46e309ef 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -699,34 +699,16 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } } - string cachedText = null; +// string cachedText = null; protected virtual void Reset () { - cachedText = null; +// cachedText = null; } protected Tuple GetMemberTextToCaret() { - int startOffset; - if (currentMember != null && currentType != null && currentType.Kind != TypeKind.Enum) { - startOffset = document.GetOffset(currentMember.Region.Begin); - } else if (currentType != null) { - startOffset = document.GetOffset(currentType.Region.Begin); - } else { - startOffset = 0; - } - while (startOffset > 0) { - char ch = document.GetCharAt(startOffset - 1); - if (ch != ' ' && ch != '\t') { - break; - } - --startOffset; - } - if (cachedText == null) - cachedText = document.GetText (startOffset, offset - startOffset); - - return Tuple.Create (cachedText, document.GetLocation (startOffset)); + return MemberProvider.GetMemberTextToCaret(offset, currentType, currentMember); } protected ExpressionResult GetInvocationBeforeCursor(bool afterBracket) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/IMemberProvider.cs b/ICSharpCode.NRefactory.CSharp/Completion/IMemberProvider.cs index e41a006695..fddc43846e 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/IMemberProvider.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/IMemberProvider.cs @@ -35,6 +35,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion public interface IMemberProvider { void GetCurrentMembers (int offset, out IUnresolvedTypeDefinition currentType, out IUnresolvedMember currentMember); + + Tuple GetMemberTextToCaret(int caretOffset, IUnresolvedTypeDefinition currentType, IUnresolvedMember currentMember); } public class DefaultMemberProvider : IMemberProvider @@ -159,6 +161,29 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } return bracketStack.Any (t => t == '{'); } + + public Tuple GetMemberTextToCaret(int caretOffset, IUnresolvedTypeDefinition currentType, IUnresolvedMember currentMember) + { + int startOffset; + if (currentMember != null && currentType != null && currentType.Kind != TypeKind.Enum) { + startOffset = document.GetOffset(currentMember.Region.Begin); + } else if (currentType != null) { + startOffset = document.GetOffset(currentType.Region.Begin); + } else { + startOffset = 0; + } + while (startOffset > 0) { + char ch = document.GetCharAt(startOffset - 1); + if (ch != ' ' && ch != '\t') { + break; + } + --startOffset; + } + + return Tuple.Create (document.GetText (startOffset, caretOffset - startOffset), document.GetLocation (startOffset)); + } + + } } From 33efe343d633030aa02f2614b3cc8e9c4c880367 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Sat, 9 Jun 2012 09:46:59 +0200 Subject: [PATCH 6/9] [Documentation] Added support for relative redirection targets. --- .../Documentation/XmlDocumentationProvider.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ICSharpCode.NRefactory/Documentation/XmlDocumentationProvider.cs b/ICSharpCode.NRefactory/Documentation/XmlDocumentationProvider.cs index de2105211e..e16b6c0f03 100644 --- a/ICSharpCode.NRefactory/Documentation/XmlDocumentationProvider.cs +++ b/ICSharpCode.NRefactory/Documentation/XmlDocumentationProvider.cs @@ -121,7 +121,7 @@ namespace ICSharpCode.NRefactory.Documentation this.fileName = fileName; ReadXmlDoc(xmlReader); } else { - string redirectionTarget = GetRedirectionTarget(xmlReader.GetAttribute("redirect")); + string redirectionTarget = GetRedirectionTarget(fileName, xmlReader.GetAttribute("redirect")); if (redirectionTarget != null) { Debug.WriteLine("XmlDoc " + fileName + " is redirecting to " + redirectionTarget); using (FileStream redirectedFs = new FileStream(redirectionTarget, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete)) { @@ -138,7 +138,7 @@ namespace ICSharpCode.NRefactory.Documentation } } - static string GetRedirectionTarget(string target) + static string GetRedirectionTarget(string xmlFileName, string target) { string programFilesDir = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86); programFilesDir = AppendDirectorySeparator(programFilesDir); @@ -146,8 +146,11 @@ namespace ICSharpCode.NRefactory.Documentation string corSysDir = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(); corSysDir = AppendDirectorySeparator(corSysDir); - return LookupLocalizedXmlDoc(target.Replace("%PROGRAMFILESDIR%", programFilesDir) - .Replace("%CORSYSDIR%", corSysDir)); + var fileName = target.Replace ("%PROGRAMFILESDIR%", programFilesDir) + .Replace ("%CORSYSDIR%", corSysDir); + if (!Path.IsPathRooted (fileName)) + fileName = Path.Combine (Path.GetDirectoryName (xmlFileName), fileName); + return LookupLocalizedXmlDoc(fileName); } static string AppendDirectorySeparator(string dir) From 6cbda4656343cd7fe5b23ef9bd900430f6357e9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Sat, 9 Jun 2012 12:29:53 +0200 Subject: [PATCH 7/9] [Completion] It's no longer needed to specify a parsed file for the completion engine. --- .../Completion/CSharpCompletionEngine.cs | 22 +++++-------------- .../Completion/CSharpCompletionEngineBase.cs | 10 ++------- .../CSharpParameterCompletionEngine.cs | 2 +- .../Completion/IMemberProvider.cs | 11 +++++++++- .../CodeCompletion/CodeCompletionBugTests.cs | 4 ++-- .../ParameterCompletionTests.cs | 2 +- 6 files changed, 21 insertions(+), 30 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 3ba578c4ae..641c2fa95c 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -57,7 +57,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion public bool CloseOnSquareBrackets; #endregion - public CSharpCompletionEngine(IDocument document, IMemberProvider memberProvider, ICompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx, CSharpParsedFile parsedFile) : base (content, memberProvider, ctx, parsedFile) + public CSharpCompletionEngine(IDocument document, IMemberProvider memberProvider, ICompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx) : base (content, memberProvider, ctx) { if (document == null) { throw new ArgumentNullException("document"); @@ -882,11 +882,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (n.Parent is ICSharpCode.NRefactory.CSharp.Attribute) { nodes.Add(n.Parent); } - var astResolver = new CSharpAstResolver( - csResolver, - identifierStart.Unit, - CSharpParsedFile - ); + var astResolver = MemberProvider.GetResolver (csResolver, identifierStart.Unit); astResolver.ApplyNavigator(new NodeListResolveVisitorNavigator(nodes)); try { csResolver = astResolver.GetResolverStateBefore(n); @@ -1282,7 +1278,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var root = node; while (root.Parent != null) root = root.Parent; - var astResolver = new CSharpAstResolver(state, root, CSharpParsedFile); + var astResolver = MemberProvider.GetResolver (state, root); foreach (var type in CreateFieldAction.GetValidTypes(astResolver, (Expression)node)) { if (type.Kind == TypeKind.Enum) { AddEnumMembers(wrapper, type, state); @@ -1657,11 +1653,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var expressionOrVariableDeclaration = GetNewExpressionAt(j); if (expressionOrVariableDeclaration == null) return null; - var astResolver = new CSharpAstResolver( - GetState(), - expressionOrVariableDeclaration.Unit, - CSharpParsedFile - ); + var astResolver = MemberProvider.GetResolver(GetState(), expressionOrVariableDeclaration.Unit); hintType = CreateFieldAction.GetValidTypes( astResolver, expressionOrVariableDeclaration.Node as Expression @@ -2143,11 +2135,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var exprParent = resolvedNode.GetParent(); var unit = exprParent != null ? exprParent.GetParent() : null; - var astResolver = unit != null ? new CSharpAstResolver( - state, - unit, - CSharpParsedFile - ) : null; + var astResolver = unit != null ? MemberProvider.GetResolver(state, unit) : null; IType hintType = exprParent != null && astResolver != null ? CreateFieldAction.GetValidTypes(astResolver, exprParent) .FirstOrDefault() : null; diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index eb46e309ef..c3f84c210a 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -51,8 +51,6 @@ namespace ICSharpCode.NRefactory.CSharp.Completion #region Input properties public CSharpTypeResolveContext ctx { get; private set; } - public CSharpParsedFile CSharpParsedFile { get; private set; } - public IProjectContent ProjectContent { get; private set; } ICompilation compilation; @@ -66,21 +64,18 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } #endregion - protected CSharpCompletionEngineBase(IProjectContent content, IMemberProvider memberProvider, CSharpTypeResolveContext ctx, CSharpParsedFile parsedFile) + protected CSharpCompletionEngineBase(IProjectContent content, IMemberProvider memberProvider, CSharpTypeResolveContext ctx) { if (content == null) throw new ArgumentNullException("content"); if (ctx == null) throw new ArgumentNullException("ctx"); - if (parsedFile == null) - throw new ArgumentNullException("parsedFile"); if (memberProvider == null) throw new ArgumentNullException("memberProvider"); this.ProjectContent = content; this.MemberProvider = memberProvider; this.ctx = ctx; - this.CSharpParsedFile = parsedFile; } @@ -802,12 +797,11 @@ namespace ICSharpCode.NRefactory.CSharp.Completion resolveNode = expr; } try { - var ctx = GetState (); 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 csResolver = MemberProvider.GetResolver (GetState(), root); var result = csResolver.Resolve(resolveNode); var state = csResolver.GetResolverStateBefore(resolveNode); return Tuple.Create(result, state); diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs index 129ad12992..67a014eac5 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs @@ -39,7 +39,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion { internal IParameterCompletionDataFactory factory; - public CSharpParameterCompletionEngine(IDocument document, IMemberProvider memberProvider, IParameterCompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx, CSharpParsedFile parsedFile) : base (content, memberProvider, ctx, parsedFile) + public CSharpParameterCompletionEngine(IDocument document, IMemberProvider memberProvider, IParameterCompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx) : base (content, memberProvider, ctx) { if (document == null) { throw new ArgumentNullException("document"); diff --git a/ICSharpCode.NRefactory.CSharp/Completion/IMemberProvider.cs b/ICSharpCode.NRefactory.CSharp/Completion/IMemberProvider.cs index fddc43846e..5001f3d22c 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/IMemberProvider.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/IMemberProvider.cs @@ -29,6 +29,7 @@ using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.Editor; using ICSharpCode.NRefactory.CSharp.TypeSystem; using System.Linq; +using ICSharpCode.NRefactory.CSharp.Resolver; namespace ICSharpCode.NRefactory.CSharp.Completion { @@ -37,6 +38,8 @@ namespace ICSharpCode.NRefactory.CSharp.Completion void GetCurrentMembers (int offset, out IUnresolvedTypeDefinition currentType, out IUnresolvedMember currentMember); Tuple GetMemberTextToCaret(int caretOffset, IUnresolvedTypeDefinition currentType, IUnresolvedMember currentMember); + + CSharpAstResolver GetResolver (CSharpResolver resolver, AstNode rootNode); } public class DefaultMemberProvider : IMemberProvider @@ -182,7 +185,13 @@ namespace ICSharpCode.NRefactory.CSharp.Completion return Tuple.Create (document.GetText (startOffset, caretOffset - startOffset), document.GetLocation (startOffset)); } - + + + public CSharpAstResolver GetResolver (CSharpResolver resolver, AstNode rootNode) + { + return new CSharpAstResolver (resolver, rootNode, parsedFile); + } + } } diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs index f8a2525475..d93d1b582b 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs @@ -240,7 +240,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion } } var mb = new DefaultMemberProvider(doc, parsedFile); - var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, rctx, parsedFile); + var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, rctx); engine.EolMarker = Environment.NewLine; engine.FormattingPolicy = FormattingOptionsFactory.CreateMono (); @@ -266,7 +266,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion var cmp = pctx.CreateCompilation(); var mb = new DefaultMemberProvider(doc, parsedFile); - var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, new CSharpTypeResolveContext (cmp.MainAssembly), parsedFile); + var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, new CSharpTypeResolveContext (cmp.MainAssembly)); engine.EolMarker = Environment.NewLine; engine.FormattingPolicy = FormattingOptionsFactory.CreateMono (); return Tuple.Create (doc, engine); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs index d88185624e..bc04a31ff7 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs @@ -292,7 +292,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion } } var mb = new DefaultMemberProvider(doc, parsedFile); - var engine = new CSharpParameterCompletionEngine (doc, mb, new TestFactory (pctx), pctx, rctx, parsedFile); + var engine = new CSharpParameterCompletionEngine (doc, mb, new TestFactory (pctx), pctx, rctx); return engine.GetParameterDataProvider (cursorPosition, doc.GetCharAt (cursorPosition - 1)); } From 81c7daa56306fdef7aa49714a84401f1a228e7e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Sat, 9 Jun 2012 12:39:54 +0200 Subject: [PATCH 8/9] [Completion] Renamed IMemberProvider -> ICompletionContextProvider. --- .../Completion/CSharpCompletionEngine.cs | 10 +++++----- .../Completion/CSharpCompletionEngineBase.cs | 18 +++++++++--------- .../CSharpParameterCompletionEngine.cs | 2 +- ...ovider.cs => ICompletionContextProvider.cs} | 6 +++--- .../ICSharpCode.NRefactory.CSharp.csproj | 5 ++--- .../CodeCompletion/CodeCompletionBugTests.cs | 4 ++-- .../CodeCompletion/ParameterCompletionTests.cs | 2 +- 7 files changed, 23 insertions(+), 24 deletions(-) rename ICSharpCode.NRefactory.CSharp/Completion/{IMemberProvider.cs => ICompletionContextProvider.cs} (96%) diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs index 641c2fa95c..fcb8af2bba 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs @@ -57,7 +57,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion public bool CloseOnSquareBrackets; #endregion - public CSharpCompletionEngine(IDocument document, IMemberProvider memberProvider, ICompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx) : base (content, memberProvider, ctx) + public CSharpCompletionEngine(IDocument document, ICompletionContextProvider completionContextProvider, ICompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx) : base (content, completionContextProvider, ctx) { if (document == null) { throw new ArgumentNullException("document"); @@ -882,7 +882,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (n.Parent is ICSharpCode.NRefactory.CSharp.Attribute) { nodes.Add(n.Parent); } - var astResolver = MemberProvider.GetResolver (csResolver, identifierStart.Unit); + var astResolver = CompletionContextProvider.GetResolver (csResolver, identifierStart.Unit); astResolver.ApplyNavigator(new NodeListResolveVisitorNavigator(nodes)); try { csResolver = astResolver.GetResolverStateBefore(n); @@ -1278,7 +1278,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var root = node; while (root.Parent != null) root = root.Parent; - var astResolver = MemberProvider.GetResolver (state, root); + var astResolver = CompletionContextProvider.GetResolver (state, root); foreach (var type in CreateFieldAction.GetValidTypes(astResolver, (Expression)node)) { if (type.Kind == TypeKind.Enum) { AddEnumMembers(wrapper, type, state); @@ -1653,7 +1653,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var expressionOrVariableDeclaration = GetNewExpressionAt(j); if (expressionOrVariableDeclaration == null) return null; - var astResolver = MemberProvider.GetResolver(GetState(), expressionOrVariableDeclaration.Unit); + var astResolver = CompletionContextProvider.GetResolver(GetState(), expressionOrVariableDeclaration.Unit); hintType = CreateFieldAction.GetValidTypes( astResolver, expressionOrVariableDeclaration.Node as Expression @@ -2135,7 +2135,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion var exprParent = resolvedNode.GetParent(); var unit = exprParent != null ? exprParent.GetParent() : null; - var astResolver = unit != null ? MemberProvider.GetResolver(state, unit) : null; + var astResolver = unit != null ? CompletionContextProvider.GetResolver(state, unit) : null; IType hintType = exprParent != null && astResolver != null ? CreateFieldAction.GetValidTypes(astResolver, exprParent) .FirstOrDefault() : null; diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs index c3f84c210a..a2ec8ec116 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngineBase.cs @@ -1,4 +1,4 @@ -// +// // CSharpCompletionEngineBase.cs // // Author: @@ -64,22 +64,22 @@ namespace ICSharpCode.NRefactory.CSharp.Completion } #endregion - protected CSharpCompletionEngineBase(IProjectContent content, IMemberProvider memberProvider, CSharpTypeResolveContext ctx) + protected CSharpCompletionEngineBase(IProjectContent content, ICompletionContextProvider completionContextProvider, CSharpTypeResolveContext ctx) { if (content == null) throw new ArgumentNullException("content"); if (ctx == null) throw new ArgumentNullException("ctx"); - if (memberProvider == null) - throw new ArgumentNullException("memberProvider"); + if (completionContextProvider == null) + throw new ArgumentNullException("completionContextProvider"); this.ProjectContent = content; - this.MemberProvider = memberProvider; + this.CompletionContextProvider = completionContextProvider; this.ctx = ctx; } - public IMemberProvider MemberProvider { + public ICompletionContextProvider CompletionContextProvider { get; private set; } @@ -90,7 +90,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion this.offset = offset; this.location = document.GetLocation (offset); - MemberProvider.GetCurrentMembers (offset, out currentType, out currentMember); + CompletionContextProvider.GetCurrentMembers (offset, out currentType, out currentMember); } public bool GetParameterCompletionCommandOffset (out int cpos) @@ -703,7 +703,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion protected Tuple GetMemberTextToCaret() { - return MemberProvider.GetMemberTextToCaret(offset, currentType, currentMember); + return CompletionContextProvider.GetMemberTextToCaret(offset, currentType, currentMember); } protected ExpressionResult GetInvocationBeforeCursor(bool afterBracket) @@ -801,7 +801,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion if (root == null) { return null; } - var csResolver = MemberProvider.GetResolver (GetState(), root); + var csResolver = CompletionContextProvider.GetResolver (GetState(), root); var result = csResolver.Resolve(resolveNode); var state = csResolver.GetResolverStateBefore(resolveNode); return Tuple.Create(result, state); diff --git a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs index 67a014eac5..229016533c 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/CSharpParameterCompletionEngine.cs @@ -39,7 +39,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion { internal IParameterCompletionDataFactory factory; - public CSharpParameterCompletionEngine(IDocument document, IMemberProvider memberProvider, IParameterCompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx) : base (content, memberProvider, ctx) + public CSharpParameterCompletionEngine(IDocument document, ICompletionContextProvider completionContextProvider, IParameterCompletionDataFactory factory, IProjectContent content, CSharpTypeResolveContext ctx) : base (content, completionContextProvider, ctx) { if (document == null) { throw new ArgumentNullException("document"); diff --git a/ICSharpCode.NRefactory.CSharp/Completion/IMemberProvider.cs b/ICSharpCode.NRefactory.CSharp/Completion/ICompletionContextProvider.cs similarity index 96% rename from ICSharpCode.NRefactory.CSharp/Completion/IMemberProvider.cs rename to ICSharpCode.NRefactory.CSharp/Completion/ICompletionContextProvider.cs index 5001f3d22c..b477dc1bbf 100644 --- a/ICSharpCode.NRefactory.CSharp/Completion/IMemberProvider.cs +++ b/ICSharpCode.NRefactory.CSharp/Completion/ICompletionContextProvider.cs @@ -33,7 +33,7 @@ using ICSharpCode.NRefactory.CSharp.Resolver; namespace ICSharpCode.NRefactory.CSharp.Completion { - public interface IMemberProvider + public interface ICompletionContextProvider { void GetCurrentMembers (int offset, out IUnresolvedTypeDefinition currentType, out IUnresolvedMember currentMember); @@ -42,12 +42,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion CSharpAstResolver GetResolver (CSharpResolver resolver, AstNode rootNode); } - public class DefaultMemberProvider : IMemberProvider + public class DefaultCompletionContextProvider : ICompletionContextProvider { readonly IDocument document; readonly CSharpParsedFile parsedFile; - public DefaultMemberProvider (IDocument document, CSharpParsedFile parsedFile) + public DefaultCompletionContextProvider (IDocument document, CSharpParsedFile parsedFile) { if (document == null) throw new ArgumentNullException("document"); diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj index 696c10d510..7f4015306f 100644 --- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj +++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj @@ -41,8 +41,7 @@ TRACE;FULL_AST - PdbOnly - false + none full @@ -294,7 +293,6 @@ - @@ -374,6 +372,7 @@ + diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs index d93d1b582b..80cae089e7 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs @@ -239,7 +239,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion rctx = rctx.WithCurrentMember(curMember); } } - var mb = new DefaultMemberProvider(doc, parsedFile); + var mb = new DefaultCompletionContextProvider(doc, parsedFile); var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, rctx); engine.EolMarker = Environment.NewLine; @@ -265,7 +265,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion pctx = pctx.UpdateProjectContent(null, parsedFile); var cmp = pctx.CreateCompilation(); - var mb = new DefaultMemberProvider(doc, parsedFile); + var mb = new DefaultCompletionContextProvider(doc, parsedFile); var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, new CSharpTypeResolveContext (cmp.MainAssembly)); engine.EolMarker = Environment.NewLine; engine.FormattingPolicy = FormattingOptionsFactory.CreateMono (); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs index bc04a31ff7..aef48a5e15 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ParameterCompletionTests.cs @@ -291,7 +291,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion rctx = rctx.WithCurrentMember(curMember.CreateResolved(rctx)); } } - var mb = new DefaultMemberProvider(doc, parsedFile); + var mb = new DefaultCompletionContextProvider(doc, parsedFile); var engine = new CSharpParameterCompletionEngine (doc, mb, new TestFactory (pctx), pctx, rctx); return engine.GetParameterDataProvider (cursorPosition, doc.GetCharAt (cursorPosition - 1)); } From 00d5de8b18ad8d1bd7f01caab8d8ca974883cb5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Sat, 9 Jun 2012 14:06:26 +0200 Subject: [PATCH 9/9] [CodeIssues] Optimized word break algorithm. --- .../InconsistentNamingIssue/WordParser.cs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/InconsistentNamingIssue/WordParser.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/InconsistentNamingIssue/WordParser.cs index 98ac57d6cd..9cbbcff0a3 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/InconsistentNamingIssue/WordParser.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/InconsistentNamingIssue/WordParser.cs @@ -37,26 +37,28 @@ namespace ICSharpCode.NRefactory.CSharp bool lastWasLower = false, lastWasUpper = false; for (int i = 0; i < identifier.Length; i++) { char c = identifier[i]; - if (c == '_') { - if ((i - wordStart) > 0) { - words.Add (identifier.Substring (wordStart, i - wordStart)); - } - wordStart = i + 1; - lastWasLower = lastWasUpper = false; - } else if (Char.IsLower (c)) { + var category = char.GetUnicodeCategory (c); + if (category == System.Globalization.UnicodeCategory.LowercaseLetter) { if (lastWasUpper && (i - wordStart) > 2) { words.Add (identifier.Substring (wordStart, i - wordStart - 1)); wordStart = i - 1; } lastWasLower = true; lastWasUpper = false; - } else if (Char.IsUpper (c)) { + } else if (category == System.Globalization.UnicodeCategory.UppercaseLetter) { if (lastWasLower) { words.Add (identifier.Substring (wordStart, i - wordStart)); wordStart = i; } lastWasLower = false; lastWasUpper = true; + } else { + if (c == '_') { + if ((i - wordStart) > 0) + words.Add(identifier.Substring(wordStart, i - wordStart)); + wordStart = i + 1; + lastWasLower = lastWasUpper = false; + } } } if (wordStart < identifier.Length)