Browse Source

[Completion] Only check browsable attribute inside the same assembly.

newNRvisualizers
Mike Krüger 13 years ago
parent
commit
23d282d884
  1. 4
      ICSharpCode.NRefactory.CSharp/Completion/CompletionDataWrapper.cs
  2. 69
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/BrowsableAttributeTests.cs
  3. 59
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs

4
ICSharpCode.NRefactory.CSharp/Completion/CompletionDataWrapper.cs

@ -84,7 +84,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
return null; return null;
var def = type.GetDefinition (); var def = type.GetDefinition ();
if (def != null && !def.IsBrowsable ()) if (def != null && def.ParentAssembly != completion.ctx.CurrentAssembly && !def.IsBrowsable ())
return null; return null;
usedTypes.Add(shortType); usedTypes.Add(shortType);
@ -131,7 +131,7 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
{ {
var newData = Factory.CreateEntityCompletionData (member); var newData = Factory.CreateEntityCompletionData (member);
if (!member.IsBrowsable ()) if (member.ParentAssembly != completion.ctx.CurrentAssembly && !member.IsBrowsable ())
return null; return null;
string memberKey = newData.DisplayText; string memberKey = newData.DisplayText;

69
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/BrowsableAttributeTests.cs

@ -35,17 +35,44 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
[Test()] [Test()]
public void TestEditorBrowsableAttributeClasses () public void TestEditorBrowsableAttributeClasses ()
{ {
int cp;
var engine1 = CodeCompletionBugTests.CreateEngine (
@"
using System;
using System.ComponentModel;
[EditorBrowsable(EditorBrowsableState.Always)]
public class BrowsableTest {}
[EditorBrowsable(EditorBrowsableState.Never)]
public class NotBrowsableTest {}
", out cp);
CompletionDataList provider = CodeCompletionBugTests.CreateProvider (
@"class Test
{
void Test ()
{
$B$
}
}", false, engine1.ctx.CurrentAssembly.UnresolvedAssembly);
Assert.IsNotNull (provider, "provider == null");
Assert.IsNotNull (provider.Find ("BrowsableTest"), "'BrowsableTest' not found.");
Assert.IsNull (provider.Find ("NotBrowsableTest"), "'NotBrowsableTest' found.");
}
[Test()]
public void TestEditorBrowsableAttributeClassesSameAssembly ()
{
CompletionDataList provider = CodeCompletionBugTests.CreateProvider ( CompletionDataList provider = CodeCompletionBugTests.CreateProvider (
@" @"
using System; using System;
using System.ComponentModel; using System.ComponentModel;
[EditorBrowsable(EditorBrowsableState.Always)] [EditorBrowsable(EditorBrowsableState.Always)]
class BrowsableTest {} public class BrowsableTest {}
[EditorBrowsable(EditorBrowsableState.Never)] [EditorBrowsable(EditorBrowsableState.Never)]
class NotBrowsableTest {} public class NotBrowsableTest {}
class Test class Test
{ {
@ -56,12 +83,42 @@ class Test
}"); }");
Assert.IsNotNull (provider, "provider == null"); Assert.IsNotNull (provider, "provider == null");
Assert.IsNotNull (provider.Find ("BrowsableTest"), "'BrowsableTest' not found."); Assert.IsNotNull (provider.Find ("BrowsableTest"), "'BrowsableTest' not found.");
Assert.IsNull (provider.Find ("NotBrowsableTest"), "'NotBrowsableTest' found."); Assert.IsNotNull (provider.Find ("NotBrowsableTest"), "'NotBrowsableTest' not found.");
} }
[Test()] [Test()]
public void TestEditorBrowsableAttributeMembers () public void TestEditorBrowsableAttributeMembers ()
{
int cp;
var engine1 = CodeCompletionBugTests.CreateEngine (
@"
using System;
using System.ComponentModel;
public class FooBar
{
[EditorBrowsable(EditorBrowsableState.Always)]
public int BrowsableTest { get; set; }
[EditorBrowsable(EditorBrowsableState.Never)]
public int NotBrowsableTest { get; set; }
}
", out cp);
CompletionDataList provider = CodeCompletionBugTests.CreateProvider (
@"class Test : FooBar
{
void Test ()
{
$B$
}
}", false, engine1.ctx.CurrentAssembly.UnresolvedAssembly);
Assert.IsNotNull (provider, "provider == null");
Assert.IsNotNull (provider.Find ("BrowsableTest"), "'BrowsableTest' not found.");
Assert.IsNull (provider.Find ("NotBrowsableTest"), "'NotBrowsableTest' found.");
}
[Test()]
public void TestEditorBrowsableAttributeMembersSameAssembly ()
{ {
CompletionDataList provider = CodeCompletionBugTests.CreateProvider ( CompletionDataList provider = CodeCompletionBugTests.CreateProvider (
@ -84,7 +141,7 @@ class Test
}"); }");
Assert.IsNotNull (provider, "provider == null"); Assert.IsNotNull (provider, "provider == null");
Assert.IsNotNull (provider.Find ("BrowsableTest"), "'BrowsableTest' not found."); Assert.IsNotNull (provider.Find ("BrowsableTest"), "'BrowsableTest' not found.");
Assert.IsNull (provider.Find ("NotBrowsableTest"), "'NotBrowsableTest' found."); Assert.IsNotNull (provider.Find ("NotBrowsableTest"), "'NotBrowsableTest' not found.");
} }
} }
} }

59
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs

@ -196,52 +196,65 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
return new CecilLoader().LoadAssemblyFile(typeof(System.ComponentModel.BrowsableAttribute).Assembly.Location); return new CecilLoader().LoadAssemblyFile(typeof(System.ComponentModel.BrowsableAttribute).Assembly.Location);
}); });
static CompletionDataList CreateProvider(string text, bool isCtrlSpace) public static CSharpCompletionEngine CreateEngine(string text, out int cursorPosition, params IUnresolvedAssembly[] references)
{ {
string parsedText; string parsedText;
string editorText; string editorText;
int cursorPosition = text.IndexOf('$'); cursorPosition = text.IndexOf('$');
int endPos = text.IndexOf('$', cursorPosition + 1); int endPos = text.IndexOf('$', cursorPosition + 1);
if (endPos == -1) { if (endPos == -1) {
parsedText = editorText = text.Substring(0, cursorPosition) + text.Substring(cursorPosition + 1); if (cursorPosition < 0) {
parsedText = editorText = text;
} else {
parsedText = editorText = text.Substring(0, cursorPosition) + text.Substring(cursorPosition + 1);
}
} else { } else {
parsedText = text.Substring(0, cursorPosition) + new string(' ', endPos - cursorPosition) + 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); editorText = text.Substring(0, cursorPosition) + text.Substring(cursorPosition + 1, endPos - cursorPosition - 1) + text.Substring(endPos + 1);
cursorPosition = endPos - 1; cursorPosition = endPos - 1;
} }
var doc = new ReadOnlyDocument(editorText); var doc = new ReadOnlyDocument(editorText);
IProjectContent pctx = new CSharpProjectContent(); IProjectContent pctx = new CSharpProjectContent();
pctx = pctx.AddAssemblyReferences(new [] { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore, SystemAssembly }); var refs = new List<IUnresolvedAssembly> { CecilLoaderTests.Mscorlib, CecilLoaderTests.SystemCore, SystemAssembly };
if (references != null)
refs.AddRange (references);
pctx = pctx.AddAssemblyReferences(refs);
var compilationUnit = new CSharpParser().Parse(parsedText, "program.cs"); var compilationUnit = new CSharpParser().Parse(parsedText, "program.cs");
compilationUnit.Freeze(); compilationUnit.Freeze();
var parsedFile = compilationUnit.ToTypeSystem(); var parsedFile = compilationUnit.ToTypeSystem();
pctx = pctx.UpdateProjectContent(null, parsedFile); pctx = pctx.UpdateProjectContent(null, parsedFile);
var cmp = pctx.CreateCompilation(); var cmp = pctx.CreateCompilation();
var loc = doc.GetLocation(cursorPosition); var loc = cursorPosition > 0 ? doc.GetLocation(cursorPosition) : new TextLocation (1, 1);
var rctx = new CSharpTypeResolveContext(cmp.MainAssembly); var rctx = new CSharpTypeResolveContext(cmp.MainAssembly);
rctx = rctx.WithUsingScope(parsedFile.GetUsingScope(loc).Resolve(cmp)); rctx = rctx.WithUsingScope(parsedFile.GetUsingScope(loc).Resolve(cmp));
var curDef = parsedFile.GetInnermostTypeDefinition(loc); var curDef = parsedFile.GetInnermostTypeDefinition(loc);
if (curDef != null) { if (curDef != null) {
var resolvedDef = curDef.Resolve(rctx).GetDefinition(); var resolvedDef = curDef.Resolve(rctx).GetDefinition();
rctx = rctx.WithCurrentTypeDefinition(resolvedDef); rctx = rctx.WithCurrentTypeDefinition(resolvedDef);
var curMember = resolvedDef.Members.FirstOrDefault(m => m.Region.Begin <= loc && loc < m.BodyRegion.End); var curMember = resolvedDef.Members.FirstOrDefault(m => m.Region.Begin <= loc && loc < m.BodyRegion.End);
if (curMember != null) { if (curMember != null) {
rctx = rctx.WithCurrentMember(curMember); rctx = rctx.WithCurrentMember(curMember);
} }
} }
var mb = new DefaultCompletionContextProvider(doc, parsedFile); var mb = new DefaultCompletionContextProvider(doc, parsedFile);
var engine = new CSharpCompletionEngine (doc, mb, new TestFactory (), pctx, rctx); var engine = new CSharpCompletionEngine(doc, mb, new TestFactory(), pctx, rctx);
engine.EolMarker = Environment.NewLine; engine.EolMarker = Environment.NewLine;
engine.FormattingPolicy = FormattingOptionsFactory.CreateMono (); engine.FormattingPolicy = FormattingOptionsFactory.CreateMono();
return engine;
}
public static CompletionDataList CreateProvider(string text, bool isCtrlSpace, params IUnresolvedAssembly[] references)
{
int cursorPosition;
var engine = CreateEngine(text, out cursorPosition, references);
var data = engine.GetCompletionData (cursorPosition, isCtrlSpace); var data = engine.GetCompletionData (cursorPosition, isCtrlSpace);
return new CompletionDataList () { return new CompletionDataList () {

Loading…
Cancel
Save