Browse Source

Implemented override-completion.

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
15f93629d5
  1. 2
      src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj
  2. 5
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs
  3. 12
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionDataFactory.cs
  4. 61
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/OverrideCompletionData.cs
  5. 58
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/SegmentTrackingOutputFormatter.cs
  6. 1
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueManager.cs
  7. 4
      src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs

2
src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj

@ -66,6 +66,8 @@ @@ -66,6 +66,8 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\Completion\OverrideCompletionData.cs" />
<Compile Include="Src\Completion\SegmentTrackingOutputFormatter.cs" />
<Compile Include="Src\Refactoring\InsertionPoint.cs" />
<Compile Include="Src\Refactoring\IssueOptions.xaml.cs">
<DependentUpon>IssueOptions.xaml</DependentUpon>

5
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs

@ -49,12 +49,13 @@ namespace CSharpBinding.Completion @@ -49,12 +49,13 @@ namespace CSharpBinding.Completion
if (pc == null)
return false;
var context = parseInfo.ParsedFile.GetTypeResolveContext(compilation, editor.Caret.Location);
CSharpCompletionEngine cc = new CSharpCompletionEngine(
editor.Document,
new DefaultCompletionContextProvider(editor.Document, parseInfo.ParsedFile),
new CSharpCompletionDataFactory(),
new CSharpCompletionDataFactory(context),
pc,
parseInfo.ParsedFile.GetTypeResolveContext(compilation, editor.Caret.Location)
context
);
//cc.FormattingPolicy = ?

12
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionDataFactory.cs

@ -5,6 +5,7 @@ using System; @@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using ICSharpCode.NRefactory.Completion;
using ICSharpCode.NRefactory.CSharp.Completion;
using ICSharpCode.NRefactory.CSharp.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop;
@ -12,6 +13,15 @@ namespace CSharpBinding.Completion @@ -12,6 +13,15 @@ namespace CSharpBinding.Completion
{
class CSharpCompletionDataFactory : ICompletionDataFactory
{
readonly CSharpTypeResolveContext contextAtCaret;
public CSharpCompletionDataFactory(CSharpTypeResolveContext contextAtCaret)
{
if (contextAtCaret == null)
throw new ArgumentNullException("contextAtCaret");
this.contextAtCaret = contextAtCaret;
}
public ICompletionData CreateEntityCompletionData(IUnresolvedEntity entity)
{
return new CompletionData(entity.Name) {
@ -86,7 +96,7 @@ namespace CSharpBinding.Completion @@ -86,7 +96,7 @@ namespace CSharpBinding.Completion
public ICompletionData CreateNewOverrideCompletionData(int declarationBegin, IUnresolvedTypeDefinition type, IMember m)
{
throw new NotImplementedException();
return new OverrideCompletionData(declarationBegin, m, contextAtCaret);
}
public ICompletionData CreateNewPartialCompletionData(int declarationBegin, IUnresolvedTypeDefinition type, IUnresolvedMember m)

61
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/OverrideCompletionData.cs

@ -0,0 +1,61 @@ @@ -0,0 +1,61 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.IO;
using System.Linq;
using CSharpBinding.FormattingStrategy;
using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.CSharp.Refactoring;
using ICSharpCode.NRefactory.CSharp.Resolver;
using ICSharpCode.NRefactory.CSharp.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
namespace CSharpBinding.Completion
{
/// <summary>
/// Item for 'override' completion.
/// </summary>
class OverrideCompletionData : EntityCompletionData
{
readonly int declarationBegin;
readonly CSharpTypeResolveContext contextAtCaret;
public OverrideCompletionData(int declarationBegin, IMember m, CSharpTypeResolveContext contextAtCaret)
: base(m)
{
this.declarationBegin = declarationBegin;
this.contextAtCaret = contextAtCaret;
var ambience = new CSharpAmbience();
ambience.ConversionFlags = ConversionFlags.ShowTypeParameterList | ConversionFlags.ShowParameterList | ConversionFlags.ShowParameterNames;
this.CompletionText = ambience.ConvertEntity(m);
}
public override void Complete(CompletionContext context)
{
if (declarationBegin > context.StartOffset) {
base.Complete(context);
return;
}
TypeSystemAstBuilder b = new TypeSystemAstBuilder(new CSharpResolver(contextAtCaret));
b.ShowTypeParameterConstraints = false;
b.GenerateBody = true;
var entityDeclaration = b.ConvertEntity(this.Entity);
entityDeclaration.Modifiers &= ~(Modifiers.Virtual | Modifiers.Abstract);
entityDeclaration.Modifiers |= Modifiers.Override;
StringWriter w = new StringWriter();
var segmentDict = SegmentTrackingOutputFormatter.WriteNode(w, entityDeclaration, FormattingOptionsFactory.CreateSharpDevelop());
context.Editor.Document.Replace(declarationBegin, context.EndOffset - declarationBegin, w.ToString().TrimEnd());
var throwStatement = entityDeclaration.Descendants.FirstOrDefault(n => n is ThrowStatement);
if (throwStatement != null) {
var segment = segmentDict[throwStatement];
context.Editor.Select(declarationBegin + segment.Offset, segment.Length);
}
}
}
}

58
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/SegmentTrackingOutputFormatter.cs

@ -0,0 +1,58 @@ @@ -0,0 +1,58 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.NRefactory.CSharp;
using ICSharpCode.NRefactory.Editor;
namespace CSharpBinding.Completion
{
/// <summary>
/// Output formatter that creates a dictionary from AST nodes to segments in the output text.
/// </summary>
public class SegmentTrackingOutputFormatter : TextWriterOutputFormatter
{
Dictionary<AstNode, ISegment> segments = new Dictionary<AstNode, ISegment>();
Stack<int> startOffsets = new Stack<int>();
readonly StringWriter stringWriter;
public IReadOnlyDictionary<AstNode, ISegment> Segments {
get { return segments; }
}
public SegmentTrackingOutputFormatter (StringWriter stringWriter)
: base(stringWriter)
{
this.stringWriter = stringWriter;
}
public static IReadOnlyDictionary<AstNode, ISegment> WriteNode(StringWriter writer, AstNode node, CSharpFormattingOptions policy)
{
var formatter = new SegmentTrackingOutputFormatter(writer);
var visitor = new CSharpOutputVisitor(formatter, policy);
node.AcceptVisitor(visitor);
return formatter.Segments;
}
public override void StartNode (AstNode node)
{
base.StartNode (node);
startOffsets.Push(stringWriter.GetStringBuilder ().Length);
}
public override void EndNode (AstNode node)
{
int startOffset = startOffsets.Pop();
StringBuilder b = stringWriter.GetStringBuilder();
int endOffset = b.Length;
while (endOffset > 0 && b[endOffset - 1] == '\r' || b[endOffset - 1] == '\n')
endOffset--;
segments.Add(node, new TextSegment { StartOffset = startOffset, EndOffset = endOffset });
base.EndNode (node);
}
}
}

1
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/IssueManager.cs

@ -267,6 +267,7 @@ namespace CSharpBinding.Refactoring @@ -267,6 +267,7 @@ namespace CSharpBinding.Refactoring
}
}, cancellationToken);
} catch (TaskCanceledException) {
} catch (OperationCanceledException) {
}
if (!cancellationToken.IsCancellationRequested) {
analyzedVersion = textSource.Version;

4
src/Main/Base/Project/Src/Services/RefactoringService/FindReferenceService.cs

@ -191,7 +191,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -191,7 +191,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring
Dictionary<TypeName, TypeGraphNode> dict = new Dictionary<TypeName, TypeGraphNode>();
foreach (ICompilation compilation in compilations) {
foreach (ITypeDefinition typeDef in compilation.MainAssembly.GetAllTypeDefinitions()) {
dict.Add(new TypeName(typeDef), new TypeGraphNode(typeDef));
// Overwrite previous entry - duplicates can occur if there are multiple versions of the
// same project loaded in the solution (e.g. separate .csprojs for separate target frameworks)
dict[new TypeName(typeDef)] = new TypeGraphNode(typeDef);
}
}
foreach (ICompilation compilation in compilations) {

Loading…
Cancel
Save