Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit 3acbe6c

Browse files
Merge branch 'master' of github.com:icsharpcode/SharpDevelop
2 parents a1fd70e + 8ae347f commit 3acbe6c

43 files changed

Lines changed: 428 additions & 599 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.addin

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@
130130
</ComplexCondition>
131131
</Path>
132132

133-
<Path name = "/AddIns/DefaultTextEditor/CodeCompletion">
133+
<Path name = "/SharpDevelop/ViewContent/TextEditor/CodeCompletion">
134134
<CodeCompletionBinding id = "RazorCSharp" extensions = ".cshtml" class = "ICSharpCode.AspNet.Mvc.Completion.RazorCSharpCompletionBinding"/>
135135
</Path>
136136

src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,14 +134,9 @@
134134
<Compile Include="Src\AddMvcViewToProjectViewModel.cs" />
135135
<Compile Include="Src\BooleanToVisibilityConverter.cs" />
136136
<Compile Include="Src\CloseDialogBehaviour.cs" />
137-
<Compile Include="Src\Completion\RazorCompilationUnit.cs" />
138137
<Compile Include="Src\Completion\RazorCSharpCompletionBinding.cs" />
139-
<Compile Include="Src\Completion\RazorCSharpDotCompletionDataProvider.cs" />
140-
<Compile Include="Src\Completion\RazorCSharpExpressionFinder.cs" />
141138
<Compile Include="Src\Completion\RazorCSharpModelTypeLocater.cs" />
142-
<Compile Include="Src\Completion\RazorCSharpParser.cs" />
143139
<Compile Include="Src\Completion\RazorCSharpParserModelTypeVisitor.cs" />
144-
<Compile Include="Src\Completion\RazorCSharpResolver.cs" />
145140
<Compile Include="Src\CurrentAppDomain.cs" />
146141
<Compile Include="Src\CurrentAppDomainFactory.cs" />
147142
<Compile Include="Src\Folding\CharacterReader.cs" />
@@ -285,6 +280,11 @@
285280
<Name>ICSharpCode.AvalonEdit</Name>
286281
<Private>False</Private>
287282
</ProjectReference>
283+
<ProjectReference Include="..\..\..\..\Libraries\NRefactory\ICSharpCode.NRefactory.CSharp\ICSharpCode.NRefactory.CSharp.csproj">
284+
<Project>{53DCA265-3C3C-42F9-B647-F72BA678122B}</Project>
285+
<Name>ICSharpCode.NRefactory.CSharp</Name>
286+
<Private>False</Private>
287+
</ProjectReference>
288288
<ProjectReference Include="..\..\..\..\Libraries\NRefactory\ICSharpCode.NRefactory\ICSharpCode.NRefactory.csproj">
289289
<Project>{3B2A5653-EC97-4001-BB9B-D90F1AF2C371}</Project>
290290
<Name>ICSharpCode.NRefactory</Name>

src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpCompletionBinding.cs

Lines changed: 146 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,149 @@
1616
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1717
// DEALINGS IN THE SOFTWARE.
1818

19-
//using System;
20-
//using ICSharpCode.SharpDevelop.Editor;
21-
//using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
22-
//
23-
//namespace ICSharpCode.AspNet.Mvc.Completion
24-
//{
25-
// public class RazorCSharpCompletionBinding : DefaultCodeCompletionBinding
26-
// {
27-
// public RazorCSharpCompletionBinding()
28-
// {
29-
// }
30-
//
31-
// public override CodeCompletionKeyPressResult HandleKeyPress(ITextEditor editor, char ch)
32-
// {
33-
// if (ch == '.') {
34-
// new RazorCSharpDotCompletionDataProvider().ShowCompletion(editor);
35-
// return CodeCompletionKeyPressResult.Completed;
36-
// } else if (ch == '(') {
37-
// return base.HandleKeyPress(editor, ch);
38-
// }
39-
// return CodeCompletionKeyPressResult.None;
40-
// }
41-
// }
42-
//}
19+
using System;
20+
using System.IO;
21+
using System.Web.Razor;
22+
using ICSharpCode.NRefactory;
23+
using ICSharpCode.NRefactory.CSharp;
24+
using ICSharpCode.NRefactory.CSharp.Resolver;
25+
using ICSharpCode.NRefactory.CSharp.TypeSystem;
26+
using ICSharpCode.NRefactory.Editor;
27+
using ICSharpCode.NRefactory.TypeSystem;
28+
using ICSharpCode.NRefactory.TypeSystem.Implementation;
29+
using ICSharpCode.SharpDevelop;
30+
using ICSharpCode.SharpDevelop.Editor;
31+
using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
32+
33+
namespace ICSharpCode.AspNet.Mvc.Completion
34+
{
35+
public class RazorCSharpCompletionBinding : ICodeCompletionBinding
36+
{
37+
public bool HandleKeyPressed(ITextEditor editor, char ch)
38+
{
39+
if (ch == '.') {
40+
var binding = CreateBinding(editor);
41+
return binding.HandleKeyPressed(editor, ch);
42+
}
43+
return false;
44+
}
45+
46+
public bool CtrlSpace(ITextEditor editor)
47+
{
48+
return false;
49+
}
50+
51+
public CodeCompletionKeyPressResult HandleKeyPress(ITextEditor editor, char ch)
52+
{
53+
// We use HandleKeyPressed instead.
54+
return CodeCompletionKeyPressResult.None;
55+
}
56+
57+
ICodeCompletionBinding CreateBinding(ITextEditor editor)
58+
{
59+
return SD.LanguageService.GetLanguageByExtension(".cs")
60+
.CreateCompletionBinding(FindExpressionToComplete(editor), CreateContext(editor));
61+
}
62+
63+
string FindExpressionToComplete(ITextEditor editor)
64+
{
65+
int endOffset = editor.Caret.Offset;
66+
int startOffset = endOffset;
67+
while (startOffset > 0 && IsValidCharacter(editor.Document.GetCharAt(startOffset - 1)))
68+
startOffset--;
69+
return editor.Document.GetText(startOffset, endOffset - startOffset);
70+
}
71+
72+
bool IsValidCharacter(char ch)
73+
{
74+
return Char.IsLetterOrDigit(ch) ||
75+
(ch == '.') ||
76+
(ch == '_');
77+
}
78+
79+
ICodeContext CreateContext(ITextEditor editor)
80+
{
81+
var compilation = SD.ParserService.GetCompilationForFile(editor.FileName);
82+
var project = SD.ProjectService.FindProjectContainingFile(editor.FileName);
83+
84+
var resolveContext = new SimpleTypeResolveContext(compilation.MainAssembly);
85+
86+
var currentTypeDefinition = new DefaultUnresolvedTypeDefinition(project.RootNamespace, Path.GetFileNameWithoutExtension(editor.FileName));
87+
ITypeReference baseTypeReference = new GetClassTypeReference("System.Web.Mvc", "WebViewPage", 1);
88+
baseTypeReference = new ParameterizedTypeReference(baseTypeReference, new[] { FindModelType(editor) });
89+
currentTypeDefinition.BaseTypes.Add(baseTypeReference);
90+
91+
var currentMethod = new DefaultUnresolvedMethod(currentTypeDefinition, "__ContextStub__");
92+
currentMethod.ReturnType = KnownTypeReference.Void;
93+
currentTypeDefinition.Members.Add(currentMethod);
94+
95+
var currentResolvedTypeDef = new DefaultResolvedTypeDefinition(resolveContext, currentTypeDefinition);
96+
97+
var projectContent = compilation.MainAssembly.UnresolvedAssembly as IProjectContent;
98+
99+
var currentFile = new CSharpUnresolvedFile();
100+
101+
currentFile.RootUsingScope.AddSimpleUsing("System.Web.Mvc");
102+
currentFile.RootUsingScope.AddSimpleUsing("System.Web.Mvc.Ajax");
103+
currentFile.RootUsingScope.AddSimpleUsing("System.Web.Mvc.Html");
104+
currentFile.RootUsingScope.AddSimpleUsing("System.Web.Routing");
105+
106+
currentFile.TopLevelTypeDefinitions.Add(currentTypeDefinition);
107+
108+
if (projectContent != null) {
109+
compilation = projectContent.AddOrUpdateFiles(currentFile).CreateCompilation(SD.ParserService.GetCurrentSolutionSnapshot());
110+
}
111+
112+
var context = new CSharpTypeResolveContext(compilation.MainAssembly,
113+
currentFile.RootUsingScope.Resolve(compilation),
114+
currentResolvedTypeDef,
115+
currentMethod.CreateResolved(resolveContext.WithCurrentTypeDefinition(currentResolvedTypeDef)));
116+
return new CSharpResolver(context);
117+
}
118+
119+
ITypeReference FindModelType(ITextEditor editor)
120+
{
121+
ParserResults results = ParseTemplate(editor.Document);
122+
string typeName = GetModelTypeName(results);
123+
if (string.IsNullOrWhiteSpace(typeName))
124+
return KnownTypeReference.Object;
125+
return new CSharpParser().ParseTypeReference(typeName)
126+
.ToTypeReference(NameLookupMode.BaseTypeReference);
127+
}
128+
129+
ParserResults ParseTemplate(ITextSource textBuffer)
130+
{
131+
var host = new RazorEngineHost(new CSharpRazorCodeLanguage());
132+
var engine = new RazorTemplateEngine(host);
133+
return engine.ParseTemplate(textBuffer.CreateReader());
134+
}
135+
136+
string GetModelTypeName(ParserResults results)
137+
{
138+
var visitor = new RazorCSharpParserModelTypeVisitor();
139+
results.Document.Accept(visitor);
140+
return visitor.ModelTypeName;
141+
}
142+
}
143+
144+
static class NRUtils
145+
{
146+
/// <remarks>Does not support type arguments!</remarks>
147+
public static void AddSimpleUsing(this UsingScope scope, string fullName)
148+
{
149+
if (scope == null)
150+
throw new ArgumentNullException("scope");
151+
string[] parts = fullName.Trim().Split('.');
152+
TypeOrNamespaceReference reference = null;
153+
foreach (var part in parts) {
154+
if (reference != null) {
155+
reference = new MemberTypeOrNamespaceReference(reference, part, EmptyList<ITypeReference>.Instance);
156+
} else {
157+
reference = new SimpleTypeOrNamespaceReference(part, EmptyList<ITypeReference>.Instance);
158+
}
159+
}
160+
161+
scope.Usings.AddIfNotNull(reference);
162+
}
163+
}
164+
}

src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpDotCompletionDataProvider.cs

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpExpressionFinder.cs

Lines changed: 0 additions & 58 deletions
This file was deleted.

src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/Completion/RazorCSharpModelTypeLocater.cs

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,34 +16,34 @@
1616
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1717
// DEALINGS IN THE SOFTWARE.
1818

19-
//using System;
20-
//using System.Web.Razor;
21-
//using ICSharpCode.SharpDevelop;
22-
//
23-
//namespace ICSharpCode.AspNet.Mvc.Completion
24-
//{
25-
// public class RazorCSharpModelTypeLocater
26-
// {
27-
// public RazorCSharpModelTypeLocater(ITextBuffer textBuffer)
28-
// {
29-
// ParserResults results = ParseTemplate(textBuffer);
30-
// ModelTypeName = GetModelTypeName(results);
31-
// }
32-
//
33-
// ParserResults ParseTemplate(ITextBuffer textBuffer)
34-
// {
35-
// var host = new RazorEngineHost(new CSharpRazorCodeLanguage());
36-
// var engine = new RazorTemplateEngine(host);
37-
// return engine.ParseTemplate(textBuffer.CreateReader());
38-
// }
39-
//
40-
// string GetModelTypeName(ParserResults results)
41-
// {
42-
// var visitor = new RazorCSharpParserModelTypeVisitor();
43-
// results.Document.Accept(visitor);
44-
// return visitor.ModelTypeName;
45-
// }
46-
//
47-
// public string ModelTypeName { get; private set; }
48-
// }
49-
//}
19+
using System;
20+
using System.Web.Razor;
21+
using ICSharpCode.NRefactory.Editor;
22+
23+
namespace ICSharpCode.AspNet.Mvc.Completion
24+
{
25+
public class RazorCSharpModelTypeLocater
26+
{
27+
public RazorCSharpModelTypeLocater(ITextSource textBuffer)
28+
{
29+
ParserResults results = ParseTemplate(textBuffer);
30+
ModelTypeName = GetModelTypeName(results);
31+
}
32+
33+
ParserResults ParseTemplate(ITextSource textBuffer)
34+
{
35+
var host = new RazorEngineHost(new CSharpRazorCodeLanguage());
36+
var engine = new RazorTemplateEngine(host);
37+
return engine.ParseTemplate(textBuffer.CreateReader());
38+
}
39+
40+
string GetModelTypeName(ParserResults results)
41+
{
42+
var visitor = new RazorCSharpParserModelTypeVisitor();
43+
results.Document.Accept(visitor);
44+
return visitor.ModelTypeName;
45+
}
46+
47+
public string ModelTypeName { get; private set; }
48+
}
49+
}

0 commit comments

Comments
 (0)