|
|
@ -16,27 +16,122 @@ |
|
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
|
// DEALINGS IN THE SOFTWARE.
|
|
|
|
// DEALINGS IN THE SOFTWARE.
|
|
|
|
|
|
|
|
|
|
|
|
//using System;
|
|
|
|
using System; |
|
|
|
//using ICSharpCode.SharpDevelop.Editor;
|
|
|
|
using System.IO; |
|
|
|
//using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
|
|
|
|
using ICSharpCode.NRefactory; |
|
|
|
//
|
|
|
|
using ICSharpCode.NRefactory.CSharp.Resolver; |
|
|
|
//namespace ICSharpCode.AspNet.Mvc.Completion
|
|
|
|
using ICSharpCode.NRefactory.CSharp.TypeSystem; |
|
|
|
//{
|
|
|
|
using ICSharpCode.NRefactory.TypeSystem; |
|
|
|
// public class RazorCSharpCompletionBinding : DefaultCodeCompletionBinding
|
|
|
|
using ICSharpCode.NRefactory.TypeSystem.Implementation; |
|
|
|
// {
|
|
|
|
using ICSharpCode.SharpDevelop; |
|
|
|
// public RazorCSharpCompletionBinding()
|
|
|
|
using ICSharpCode.SharpDevelop.Editor; |
|
|
|
// {
|
|
|
|
using ICSharpCode.SharpDevelop.Editor.CodeCompletion; |
|
|
|
// }
|
|
|
|
|
|
|
|
//
|
|
|
|
namespace ICSharpCode.AspNet.Mvc.Completion |
|
|
|
// public override CodeCompletionKeyPressResult HandleKeyPress(ITextEditor editor, char ch)
|
|
|
|
{ |
|
|
|
// {
|
|
|
|
public class RazorCSharpCompletionBinding : ICodeCompletionBinding |
|
|
|
// if (ch == '.') {
|
|
|
|
{ |
|
|
|
// new RazorCSharpDotCompletionDataProvider().ShowCompletion(editor);
|
|
|
|
public bool HandleKeyPressed(ITextEditor editor, char ch) |
|
|
|
// return CodeCompletionKeyPressResult.Completed;
|
|
|
|
{ |
|
|
|
// } else if (ch == '(') {
|
|
|
|
if (ch == '.') { |
|
|
|
// return base.HandleKeyPress(editor, ch);
|
|
|
|
var binding = CreateBinding(editor); |
|
|
|
// }
|
|
|
|
return binding.HandleKeyPressed(editor, ch); |
|
|
|
// return CodeCompletionKeyPressResult.None;
|
|
|
|
} |
|
|
|
// }
|
|
|
|
return false; |
|
|
|
// }
|
|
|
|
} |
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
public bool CtrlSpace(ITextEditor editor) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public CodeCompletionKeyPressResult HandleKeyPress(ITextEditor editor, char ch) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
// We use HandleKeyPressed instead.
|
|
|
|
|
|
|
|
return CodeCompletionKeyPressResult.None; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ICodeCompletionBinding CreateBinding(ITextEditor editor) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return SD.LanguageService.GetLanguageByExtension(".cs") |
|
|
|
|
|
|
|
.CreateCompletionBinding(FindExpressionToComplete(editor), CreateContext(editor)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string FindExpressionToComplete(ITextEditor editor) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int endOffset = editor.Caret.Offset; |
|
|
|
|
|
|
|
int startOffset = endOffset; |
|
|
|
|
|
|
|
while (startOffset > 0 && IsValidCharacter(editor.Document.GetCharAt(startOffset - 1))) |
|
|
|
|
|
|
|
startOffset--; |
|
|
|
|
|
|
|
return editor.Document.GetText(startOffset, endOffset - startOffset); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool IsValidCharacter(char ch) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return Char.IsLetterOrDigit(ch) || |
|
|
|
|
|
|
|
(ch == '.') || |
|
|
|
|
|
|
|
(ch == '_'); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ICodeContext CreateContext(ITextEditor editor) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
var compilation = SD.ParserService.GetCompilationForFile(editor.FileName); |
|
|
|
|
|
|
|
var project = SD.ProjectService.FindProjectContainingFile(editor.FileName); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var resolveContext = new SimpleTypeResolveContext(compilation.MainAssembly); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var currentTypeDefinition = new DefaultUnresolvedTypeDefinition(project.RootNamespace, Path.GetFileNameWithoutExtension(editor.FileName)); |
|
|
|
|
|
|
|
ITypeReference baseTypeReference = new GetClassTypeReference("System.Web.Mvc", "WebViewPage", 1); |
|
|
|
|
|
|
|
baseTypeReference = new ParameterizedTypeReference(baseTypeReference, new[] { KnownTypeReference.Object }); |
|
|
|
|
|
|
|
currentTypeDefinition.BaseTypes.Add(baseTypeReference); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var currentMethod = new DefaultUnresolvedMethod(currentTypeDefinition, "__ContextStub__"); |
|
|
|
|
|
|
|
currentMethod.ReturnType = KnownTypeReference.Void; |
|
|
|
|
|
|
|
currentTypeDefinition.Members.Add(currentMethod); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var currentResolvedTypeDef = new DefaultResolvedTypeDefinition(resolveContext, currentTypeDefinition); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var projectContent = compilation.MainAssembly.UnresolvedAssembly as IProjectContent; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var currentFile = new CSharpUnresolvedFile(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
currentFile.RootUsingScope.AddSimpleUsing("System.Web.Mvc"); |
|
|
|
|
|
|
|
currentFile.RootUsingScope.AddSimpleUsing("System.Web.Mvc.Ajax"); |
|
|
|
|
|
|
|
currentFile.RootUsingScope.AddSimpleUsing("System.Web.Mvc.Html"); |
|
|
|
|
|
|
|
currentFile.RootUsingScope.AddSimpleUsing("System.Web.Routing"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
currentFile.TopLevelTypeDefinitions.Add(currentTypeDefinition); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (projectContent != null) { |
|
|
|
|
|
|
|
compilation = projectContent.AddOrUpdateFiles(currentFile).CreateCompilation(SD.ParserService.GetCurrentSolutionSnapshot()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var context = new CSharpTypeResolveContext(compilation.MainAssembly, |
|
|
|
|
|
|
|
currentFile.RootUsingScope.Resolve(compilation), |
|
|
|
|
|
|
|
currentResolvedTypeDef, |
|
|
|
|
|
|
|
currentMethod.CreateResolved(resolveContext.WithCurrentTypeDefinition(currentResolvedTypeDef))); |
|
|
|
|
|
|
|
return new CSharpResolver(context); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static class NRUtils |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
/// <remarks>Does not support type arguments!</remarks>
|
|
|
|
|
|
|
|
public static void AddSimpleUsing(this UsingScope scope, string fullName) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (scope == null) |
|
|
|
|
|
|
|
throw new ArgumentNullException("scope"); |
|
|
|
|
|
|
|
string[] parts = fullName.Trim().Split('.'); |
|
|
|
|
|
|
|
TypeOrNamespaceReference reference = null; |
|
|
|
|
|
|
|
foreach (var part in parts) { |
|
|
|
|
|
|
|
if (reference != null) { |
|
|
|
|
|
|
|
reference = new MemberTypeOrNamespaceReference(reference, part, EmptyList<ITypeReference>.Instance); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
reference = new SimpleTypeOrNamespaceReference(part, EmptyList<ITypeReference>.Instance); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scope.Usings.AddIfNotNull(reference); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|