Browse Source

[CodeCompletion] Completion engine now can generate import completion

data.
newNRvisualizers
Mike Krüger 13 years ago
parent
commit
92ad81deaa
  1. 34
      ICSharpCode.NRefactory.CSharp/Completion/CSharpCompletionEngine.cs
  2. 7
      ICSharpCode.NRefactory.CSharp/Completion/ICompletionDataFactory.cs
  3. 26
      ICSharpCode.NRefactory.CSharp/Formatter/CSharpIndentEngine.cs
  4. 32
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/CodeCompletionBugTests.cs
  5. 132
      ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ImportCompletionTests.cs
  6. 1
      ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj

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

@ -129,7 +129,39 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -129,7 +129,39 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
}
return Enumerable.Empty<ICompletionData>();
}
/// <summary>
/// Gets the types that needs to be imported via using or full type name.
/// </summary>
public IEnumerable<ICompletionData> GetImportCompletionData(int offset)
{
var generalLookup = new MemberLookup (null, Compilation.MainAssembly);
SetOffset(offset);
// flatten usings
var namespaces = new List<INamespace>();
for (var n = ctx.CurrentUsingScope; n != null; n = n.Parent) {
namespaces.Add (n.Namespace);
foreach (var u in n.Usings)
namespaces.Add (u);
}
foreach (var type in Compilation.GetAllTypeDefinitions ()) {
if (!generalLookup.IsAccessible (type, false))
continue;
if (namespaces.Any (n => n.FullName == type.Namespace))
continue;
bool useFullName = false;
foreach (var ns in namespaces) {
if (ns.GetTypeDefinition (type.Name, type.TypeParameterCount) != null) {
useFullName = true;
break;
}
}
yield return factory.CreateImportCompletionData (type, useFullName);
}
}
IEnumerable<string> GenerateNameProposals(AstType type)
{
if (type is PrimitiveType) {

7
ICSharpCode.NRefactory.CSharp/Completion/ICompletionDataFactory.cs

@ -72,5 +72,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion @@ -72,5 +72,12 @@ namespace ICSharpCode.NRefactory.CSharp.Completion
IEnumerable<ICompletionData> CreateCodeTemplateCompletionData ();
IEnumerable<ICompletionData> CreatePreProcessorDefinesCompletionData ();
/// <summary>
/// Creates a completion data that adds the required using for the created type.
/// </summary>
/// <param name="type">The type to import</param>
/// <param name="useFullName">If set to true the full name of the type needs to be used.</param>
ICompletionData CreateImportCompletionData(IType type, bool useFullName);
}
}

26
ICSharpCode.NRefactory.CSharp/Formatter/CSharpIndentEngine.cs

@ -1,3 +1,29 @@ @@ -1,3 +1,29 @@
//
// CSharpIndentEngine.cs
//
// Author:
// Mike Krüger <mkrueger@xamarin.com>
//
// Copyright (c) 2012 Xamarin Inc. (http://xamarin.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;
using ICSharpCode.NRefactory.Editor;
using System.Text;

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

@ -67,7 +67,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -67,7 +67,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
act (provider);
}
class TestFactory
public class TestFactory
: ICompletionDataFactory
{
readonly CSharpResolver state;
@ -80,7 +80,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -80,7 +80,7 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
builder.ConvertUnboundTypeArguments = true;
}
class CompletionData
public class CompletionData
: ICompletionData
{
#region ICompletionData implementation
@ -137,7 +137,26 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -137,7 +137,26 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
DisplayText = CompletionText = Description = text;
}
}
public class ImportCompletionData : CompletionData
{
public IType Type {
get;
private set;
}
public bool UseFullName {
get;
private set;
}
public ImportCompletionData(IType type, bool useFullName) : base (type.Name)
{
this.Type = type;
this.UseFullName = useFullName;
}
}
#region ICompletionDataFactory implementation
public ICompletionData CreateEntityCompletionData (ICSharpCode.NRefactory.TypeSystem.IEntity entity)
{
@ -204,7 +223,12 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion @@ -204,7 +223,12 @@ namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
{
return new CompletionData (m.Name);
}
public ICompletionData CreateImportCompletionData(IType type, bool useFullName)
{
return new ImportCompletionData (type, useFullName);
}
public System.Collections.Generic.IEnumerable<ICompletionData> CreateCodeTemplateCompletionData ()
{
return Enumerable.Empty<ICompletionData> ();

132
ICSharpCode.NRefactory.Tests/CSharp/CodeCompletion/ImportCompletionTests.cs

@ -0,0 +1,132 @@ @@ -0,0 +1,132 @@
//
// ImportCompletionTests.cs
//
// Author:
// Mike Krüger <mkrueger@xamarin.com>
//
// Copyright (c) 2013 Xamarin Inc. (http://xamarin.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;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using ICSharpCode.NRefactory.Completion;
using ICSharpCode.NRefactory.CSharp.Completion;
using ICSharpCode.NRefactory.CSharp.TypeSystem;
using ICSharpCode.NRefactory.Editor;
using ICSharpCode.NRefactory.TypeSystem;
using NUnit.Framework;
using ICSharpCode.NRefactory.CSharp.Resolver;
using ICSharpCode.NRefactory.CSharp.Refactoring;
namespace ICSharpCode.NRefactory.CSharp.CodeCompletion
{
[TestFixture]
public class ImportCompletionTests
{
public static CompletionDataList CreateProvider(string text, params IUnresolvedAssembly[] references)
{
int cursorPosition;
var engine = CodeCompletionBugTests.CreateEngine(text, out cursorPosition, references);
var data = engine.GetImportCompletionData (cursorPosition);
return new CompletionDataList () {
Data = data,
AutoCompleteEmptyMatch = engine.AutoCompleteEmptyMatch,
AutoSelect = engine.AutoSelect,
DefaultCompletionString = engine.DefaultCompletionString
};
}
[Test]
public void TestSimpleCase ()
{
var provider = CreateProvider(@"
class Test
{
public static void Main (string[] args)
{
$
}
}
");
var data = provider.Find ("AppDomain") as CodeCompletionBugTests.TestFactory.ImportCompletionData;
Assert.NotNull(data);
Assert.AreEqual("System", data.Type.Namespace);
Assert.False(data.UseFullName);
data = provider.Find ("File") as CodeCompletionBugTests.TestFactory.ImportCompletionData;
Assert.NotNull(data);
Assert.AreEqual("System.IO", data.Type.Namespace);
Assert.False(data.UseFullName);
}
[Test]
public void TestHiding ()
{
var provider = CreateProvider(@"using System;
class Test
{
public static void Main (string[] args)
{
$
}
}
");
var data = provider.Find ("AppDomain") as CodeCompletionBugTests.TestFactory.ImportCompletionData;
Assert.IsNull(data);
data = provider.Find ("File") as CodeCompletionBugTests.TestFactory.ImportCompletionData;
Assert.NotNull(data);
Assert.AreEqual("System.IO", data.Type.Namespace);
Assert.False(data.UseFullName);
}
[Test]
public void TestFullName ()
{
var provider = CreateProvider(@"using Foo;
namespace Foo {
public class AppDomain {}
}
class Test
{
public static void Main (string[] args)
{
$
}
}
");
var data = provider.Find ("AppDomain") as CodeCompletionBugTests.TestFactory.ImportCompletionData;
Assert.NotNull(data);
Assert.True(data.UseFullName);
}
}
}

1
ICSharpCode.NRefactory.Tests/ICSharpCode.NRefactory.Tests.csproj

@ -363,6 +363,7 @@ @@ -363,6 +363,7 @@
<Compile Include="CSharp\CodeActions\SortUsingsTests.cs" />
<Compile Include="CSharp\CodeActions\CreateEventInvocatorTests.cs" />
<Compile Include="IndentationTests\IndentationTests.cs" />
<Compile Include="CSharp\CodeCompletion\ImportCompletionTests.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Mono.Cecil\Mono.Cecil.csproj">

Loading…
Cancel
Save