diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj
index 996b6517f6..a938ab8c8e 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj
@@ -77,6 +77,7 @@
+
diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs
index 4d3e203ce6..d05ca22b71 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs
@@ -2,9 +2,10 @@
// 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.Linq;
using System.Threading;
-
using ICSharpCode.Core;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.CSharp;
@@ -13,6 +14,8 @@ using ICSharpCode.NRefactory.CSharp.TypeSystem;
using ICSharpCode.NRefactory.Editor;
using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.TypeSystem;
+using ICSharpCode.SharpDevelop;
+using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Parser;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Refactoring;
@@ -83,22 +86,59 @@ namespace CSharpBinding.Parser
}
CSharpParsedFile file = cu.ToTypeSystem();
+ ParseInformation parseInfo;
if (fullParseInformationRequested)
- return new CSharpFullParseInformation(file, cu);
+ parseInfo = new CSharpFullParseInformation(file, cu);
else
- return new ParseInformation(file, fullParseInformationRequested);
+ parseInfo = new ParseInformation(file, fullParseInformationRequested);
+
+ AddCommentTags(cu, parseInfo.TagComments, fileContent);
+
+ return parseInfo;
}
- /*void AddCommentTags(ICompilationUnit cu, System.Collections.Generic.List tagComments)
+ void AddCommentTags(CompilationUnit cu, IList tagComments, ITextSource fileContent)
{
- foreach (ICSharpCode.NRefactory.Parser.TagComment tagComment in tagComments) {
- DomRegion tagRegion = new DomRegion(tagComment.StartPosition.Y, tagComment.StartPosition.X);
- var tag = new ICSharpCode.SharpDevelop.Dom.TagComment(tagComment.Tag, tagRegion, tagComment.CommentText);
- cu.TagComments.Add(tag);
+ ReadOnlyDocument document = null;
+ foreach (var comment in cu.Descendants.OfType().Where(c => c.CommentType != CommentType.InactiveCode)) {
+ int matchLength;
+ int index = IndexOfAny(comment.Content, lexerTags, 0, out matchLength);
+ if (index > -1) {
+ if (document == null)
+ document = new ReadOnlyDocument(fileContent);
+ int startOffset = document.GetOffset(comment.StartLocation);
+ int commentSignLength = comment.CommentType == CommentType.Documentation || comment.CommentType == CommentType.MultiLineDocumentation ? 3 : 2;
+ int commentEndSignLength = comment.CommentType == CommentType.MultiLine || comment.CommentType == CommentType.MultiLineDocumentation ? 2 : 0;
+ do {
+ int absoluteOffset = startOffset + index + commentSignLength;
+ var startLocation = document.GetLocation(absoluteOffset);
+ int endOffset = Math.Min(document.GetLineByNumber(startLocation.Line).EndOffset, document.GetOffset(comment.EndLocation) - commentEndSignLength);
+ string content = document.GetText(absoluteOffset, endOffset - absoluteOffset);
+ tagComments.Add(new TagComment(content.Substring(0, matchLength), new DomRegion(cu.FileName, startLocation.Line, startLocation.Column), content.Substring(matchLength)));
+ index = IndexOfAny(comment.Content, lexerTags, endOffset - startOffset - commentSignLength, out matchLength);
+ } while (index > -1);
+ }
}
}
- */
+
+ static int IndexOfAny(string haystack, string[] needles, int startIndex, out int matchLength)
+ {
+ if (haystack == null)
+ throw new ArgumentNullException("haystack");
+ if (needles == null)
+ throw new ArgumentNullException("needles");
+ int index = -1;
+ matchLength = 0;
+ foreach (var needle in needles) {
+ int i = haystack.IndexOf(needle, startIndex, StringComparison.Ordinal);
+ if (i != -1 && (index == -1 || index > i)) {
+ index = i;
+ matchLength = needle.Length;
+ }
+ }
+ return index;
+ }
public ResolveResult Resolve(ParseInformation parseInfo, TextLocation location, ICompilation compilation, CancellationToken cancellationToken)
{
diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs
index 8d3efc6cf4..4f3c9b77d4 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/CSharpProject.cs
@@ -30,6 +30,17 @@ namespace CSharpBinding
get { return CSharpProjectBinding.LanguageName; }
}
+ public Version LanguageVersion {
+ get {
+ string toolsVersion;
+ lock (SyncRoot) toolsVersion = this.ToolsVersion;
+ Version version = new Version(toolsVersion);
+ if (version == new Version(4, 0) && DotnetDetection.IsDotnet45Installed())
+ return new Version(5, 0);
+ return version;
+ }
+ }
+
void Init()
{
reparseReferencesSensitiveProperties.Add("TargetFrameworkVersion");
diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/SDRefactoringContext.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/SDRefactoringContext.cs
new file mode 100644
index 0000000000..3c8a5c6b0e
--- /dev/null
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/SDRefactoringContext.cs
@@ -0,0 +1,123 @@
+// 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.Threading;
+using CSharpBinding.Parser;
+using ICSharpCode.NRefactory;
+using ICSharpCode.NRefactory.CSharp;
+using ICSharpCode.NRefactory.CSharp.Refactoring;
+using ICSharpCode.NRefactory.CSharp.Resolver;
+using ICSharpCode.NRefactory.Semantics;
+using ICSharpCode.NRefactory.TypeSystem;
+using ICSharpCode.SharpDevelop;
+using ICSharpCode.SharpDevelop.Editor;
+using ICSharpCode.SharpDevelop.Parser;
+
+namespace CSharpBinding
+{
+ public class SDRefactoringContext : RefactoringContext
+ {
+ ITextEditor editor;
+ ICompilation compilation;
+ CancellationToken cancellationToken;
+
+ public SDRefactoringContext(ITextEditor editor, CancellationToken cancellationToken)
+ {
+ this.editor = editor;
+ this.cancellationToken = cancellationToken;
+ this.compilation = ParserService.GetCompilationForFile(editor.FileName);
+ }
+
+ public override bool Supports(Version version)
+ {
+ CSharpProject project = compilation.GetProject() as CSharpProject;
+ if (project == null)
+ return false;
+ return project.LanguageVersion >= version;
+ }
+
+ public override Script StartScript()
+ {
+ throw new NotImplementedException();
+ }
+
+ public override int SelectionStart {
+ get {
+ return editor.SelectionStart;
+ }
+ }
+
+ public override int SelectionLength {
+ get {
+ return editor.SelectionLength;
+ }
+ }
+
+ public override int SelectionEnd {
+ get {
+ return editor.SelectionStart + editor.SelectionLength;
+ }
+ }
+
+ public override string SelectedText {
+ get {
+ return editor.SelectedText;
+ }
+ }
+
+ public override ResolveResult Resolve(AstNode expression)
+ {
+ var parseInfo = ParserService.Parse(editor.FileName, editor.Document) as CSharpFullParseInformation;
+ var resolver = new CSharpAstResolver(compilation, parseInfo.CompilationUnit, parseInfo.ParsedFile);
+ return resolver.Resolve(expression, cancellationToken);
+ }
+
+ public override void ReplaceReferences(IMember member, MemberDeclaration replaceWidth)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override bool IsSomethingSelected {
+ get {
+ return editor.SelectionLength > 0;
+ }
+ }
+
+ public override string GetText(int offset, int length)
+ {
+ return editor.Document.GetText(offset, length);
+ }
+
+ public override int GetOffset(TextLocation location)
+ {
+ return editor.Document.GetOffset(location);
+ }
+
+ public override TextLocation GetLocation(int offset)
+ {
+ return editor.Document.GetLocation(offset);
+ }
+
+ public override CSharpFormattingOptions FormattingOptions {
+ get {
+ return new CSharpFormattingOptions();
+ }
+ }
+
+ public override string EolMarker {
+ get {
+ return DocumentUtilitites.GetLineTerminator(editor.Document, 1);
+ }
+ }
+
+ public override AstType CreateShortType(IType fullType)
+ {
+ var parseInfo = ParserService.Parse(editor.FileName, editor.Document) as CSharpFullParseInformation;
+ var parsedFile = parseInfo.ParsedFile;
+ var csResolver = parsedFile.GetResolver(compilation, editor.Caret.Location);
+ var builder = new TypeSystemAstBuilder(csResolver);
+ return builder.ConvertType(fullType);
+ }
+ }
+}
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/ContextAction/RemoveBackingStore.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/ContextAction/RemoveBackingStore.cs
index 3e78c175da..1e9282e691 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/ContextAction/RemoveBackingStore.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/ContextAction/RemoveBackingStore.cs
@@ -1,6 +1,6 @@
//
// RemoveBackingStore.cs
-//
+//
// Author:
// Mike Krüger
//
@@ -45,8 +45,8 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
context.ReplaceReferences (field, property);
- // create new auto property
- var newProperty = (PropertyDeclaration)property.Clone ();
+ // create new auto property
+ var newProperty = (PropertyDeclaration)property.Clone ();
newProperty.Getter.Body = BlockStatement.Null;
newProperty.Setter.Body = BlockStatement.Null;
@@ -74,14 +74,16 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
// }
// }
// }
-//
+//
+ static readonly Version csharp3 = new Version(3, 0);
+
static IField GetBackingField (RefactoringContext context)
{
var propertyDeclaration = context.GetNode ();
// automatic properties always need getter & setter
if (propertyDeclaration == null || propertyDeclaration.Getter.IsNull || propertyDeclaration.Setter.IsNull || propertyDeclaration.Getter.Body.IsNull || propertyDeclaration.Setter.Body.IsNull)
return null;
- if (!context.HasCSharp3Support || propertyDeclaration.HasModifier (ICSharpCode.NRefactory.CSharp.Modifiers.Abstract) || ((TypeDeclaration)propertyDeclaration.Parent).ClassType == ClassType.Interface)
+ if (!context.Supports(csharp3) || propertyDeclaration.HasModifier (ICSharpCode.NRefactory.CSharp.Modifiers.Abstract) || ((TypeDeclaration)propertyDeclaration.Parent).ClassType == ClassType.Interface)
return null;
var getterField = ScanGetter (context, propertyDeclaration);
if (getterField == null)
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs
index f2f595074b..450d950a68 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/RefactoringContext.cs
@@ -1,6 +1,6 @@
//
// RefactoringContext.cs
-//
+//
// Author:
// Mike Krüger
//
@@ -44,9 +44,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
protected set;
}
- public abstract bool HasCSharp3Support {
- get;
- }
+ public abstract bool Supports(Version version);
public ICompilation Compilation {
get;
@@ -121,7 +119,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
int number = -1;
string proposedName;
- do {
+ do {
proposedName = AppendNumberToName (baseName, number++);
} while (type.Members.Select (m => m.GetChildByRole (AstNode.Roles.Identifier)).Any (n => n.Name == proposedName));
return proposedName;
diff --git a/src/Main/Base/Project/Src/Project/Behaviors/DotNetStartBehavior.cs b/src/Main/Base/Project/Src/Project/Behaviors/DotNetStartBehavior.cs
index 465aac321b..e14850cd19 100644
--- a/src/Main/Base/Project/Src/Project/Behaviors/DotNetStartBehavior.cs
+++ b/src/Main/Base/Project/Src/Project/Behaviors/DotNetStartBehavior.cs
@@ -141,7 +141,7 @@ namespace ICSharpCode.SharpDevelop.Project
lock (Project.SyncRoot) {
TargetFramework oldFramework = ((CompilableProject)Project).CurrentTargetFramework;
if (newVersion != null && GetAvailableCompilerVersions().Contains(newVersion)) {
- ((CompilableProject)Project).SetToolsVersion(newVersion.MSBuildVersion.Major + "." + newVersion.MSBuildVersion.Minor);
+ ((CompilableProject)Project).ToolsVersion = newVersion.MSBuildVersion.Major + "." + newVersion.MSBuildVersion.Minor;
}
if (newFramework != null) {
UpdateAppConfig(newFramework);
diff --git a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
index ff70bb1a0f..a00c125bcf 100644
--- a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
+++ b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
@@ -118,16 +118,18 @@ namespace ICSharpCode.SharpDevelop.Project
public event EventHandler MinimumSolutionVersionChanged;
- protected internal void SetToolsVersion(string newToolsVersion)
- {
- PerformUpdateOnProjectFile(
- delegate {
- projectFile.ToolsVersion = newToolsVersion;
- userProjectFile.ToolsVersion = newToolsVersion;
- });
-
- if (MinimumSolutionVersionChanged != null)
- MinimumSolutionVersionChanged(this, EventArgs.Empty);
+ public string ToolsVersion {
+ get { return projectFile.ToolsVersion; }
+ protected internal set {
+ PerformUpdateOnProjectFile(
+ delegate {
+ projectFile.ToolsVersion = value;
+ userProjectFile.ToolsVersion = value;
+ });
+
+ if (MinimumSolutionVersionChanged != null)
+ MinimumSolutionVersionChanged(this, EventArgs.Empty);
+ }
}
public void PerformUpdateOnProjectFile(Action action)
@@ -1637,6 +1639,6 @@ namespace ICSharpCode.SharpDevelop.Project
}
return formattedText.ToString();
}
- #endregion
+ #endregion
}
}