Browse Source

Implemented code-completion for Boo's CallableTypeReference.

Added Boo resolver unit tests.
Added workaround for IME crash in WOW64 mode.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1339 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
d595bff51e
  1. 10
      src/AddIns/BackendBindings/Boo/BooBinding.sln
  2. 21
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs
  3. 3
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs
  4. 23
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs
  5. 34
      src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs
  6. 74
      src/AddIns/BackendBindings/Boo/BooBinding/Test/BooBinding.Tests.csproj
  7. 142
      src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs
  8. 4
      src/AddIns/Misc/HtmlHelp2/Project/src/Service/Help2RegistryWalker.cs
  9. 54
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/Ime.cs
  10. 86
      src/Main/Base/Project/Src/Dom/Implementations/AnonymousMethodReturnType.cs
  11. 44
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs
  12. 6
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs

10
src/AddIns/BackendBindings/Boo/BooBinding.sln

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# SharpDevelop 2.0.0.1199
# SharpDevelop 2.1.0.1333
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter", "NRefactoryToBooConverter\Project\NRefactoryToBooConverter.csproj", "{DBCF20A1-BA13-4582-BFA9-74DE4D987B73}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactoryToBooConverter.Tests", "NRefactoryToBooConverter\Test\NRefactoryToBooConverter.Tests.csproj", "{C9DE556D-325C-4544-B29F-16A9EB7C9830}"
@ -8,8 +8,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StandaloneConverter", "Stan @@ -8,8 +8,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StandaloneConverter", "Stan
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding", "BooBinding\Project\BooBinding.csproj", "{4AC2D5F1-F671-480C-A075-6BF62B3721B2}"
EndProject
Project("{A33008B1-5DAC-44D5-9060-242E3B6E38F2}") = "Boo.InterpreterAddIn", "Boo.InterpreterAddIn\Project\Boo.InterpreterAddIn.booproj", "{928E34B2-5E46-4A4D-8E4D-2CA2CCDB905A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "..\..\..\Libraries\NRefactory\Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor", "..\..\..\Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}"
@ -22,6 +20,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinFormsUI", "..\..\..\Libr @@ -22,6 +20,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinFormsUI", "..\..\..\Libr
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormsDesigner", "..\..\DisplayBindings\FormsDesigner\Project\FormsDesigner.csproj", "{7D7E92DF-ACEB-4B69-92C8-8AC7A703CD57}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BooBinding.Tests", "BooBinding\Test\BooBinding.Tests.csproj", "{6FA16499-896F-4C02-BB43-1AF5C6C7C713}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -80,5 +80,9 @@ Global @@ -80,5 +80,9 @@ Global
{83DD7E12-A705-4DBA-9D71-09C8973D9382}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{83DD7E12-A705-4DBA-9D71-09C8973D9382}.Release|Any CPU.Build.0 = Release|Any CPU
{83DD7E12-A705-4DBA-9D71-09C8973D9382}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Release|Any CPU.Build.0 = Release|Any CPU
{6FA16499-896F-4C02-BB43-1AF5C6C7C713}.Release|Any CPU.ActiveCfg = Release|Any CPU
EndGlobalSection
EndGlobal

21
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs

@ -177,7 +177,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -177,7 +177,7 @@ namespace Grunwald.BooBinding.CodeCompletion
if (parameters == null || parameters.Count == 0) {
m.Parameters = DefaultParameter.EmptyParameterList;
} else {
AddParameters(parameters, m.Parameters);
AddParameters(parameters, m.Parameters, m, m.DeclaringType);
}
}
void ConvertParameters(AST.ParameterDeclarationCollection parameters, DefaultProperty p)
@ -185,14 +185,17 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -185,14 +185,17 @@ namespace Grunwald.BooBinding.CodeCompletion
if (parameters == null || parameters.Count == 0) {
p.Parameters = DefaultParameter.EmptyParameterList;
} else {
AddParameters(parameters, p.Parameters);
AddParameters(parameters, p.Parameters, p, p.DeclaringType);
}
}
void AddParameters(AST.ParameterDeclarationCollection parameters, IList<IParameter> output)
internal static void AddParameters(AST.ParameterDeclarationCollection parameters, IList<IParameter> output, IMethodOrProperty method, IClass c)
{
if (c == null) throw new ArgumentNullException("c");
DefaultParameter p = null;
foreach (AST.ParameterDeclaration par in parameters) {
p = new DefaultParameter(par.Name, CreateReturnType(par.Type), GetRegion(par));
p = new DefaultParameter(par.Name,
CreateReturnType(par.Type, c, method as IMethod, c.Region.BeginLine + 1, 1, c.ProjectContent),
new DomRegion(par.LexicalInfo.Line, par.LexicalInfo.Column));
if (par.IsByRef) p.Modifiers |= ParameterModifiers.Ref;
output.Add(p);
}
@ -211,7 +214,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -211,7 +214,7 @@ namespace Grunwald.BooBinding.CodeCompletion
}
}
public static IReturnType CreateReturnType(AST.TypeReference reference, IClass callingClass,
IMember callingMember, int caretLine, int caretColumn,
IMethodOrProperty callingMember, int caretLine, int caretColumn,
IProjectContent projectContent)
{
if (reference == null) {
@ -244,7 +247,13 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -244,7 +247,13 @@ namespace Grunwald.BooBinding.CodeCompletion
}
return rt;
} else if (reference is AST.CallableTypeReference) {
return new AnonymousMethodReturnType();
AST.CallableTypeReference ctr = (AST.CallableTypeReference)reference;
AnonymousMethodReturnType amrt = new AnonymousMethodReturnType(new DefaultCompilationUnit(projectContent));
if (ctr.ReturnType != null) {
amrt.MethodReturnType = CreateReturnType(ctr.ReturnType, callingClass, callingMember, caretLine, caretColumn, projectContent);
}
AddParameters(ctr.Parameters, amrt.MethodParameters, callingMember, callingClass ?? new DefaultClass(new DefaultCompilationUnit(projectContent), "__Dummy"));
return amrt;
} else {
throw new NotSupportedException("unknown reference type: " + reference.ToString());
}

3
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/InferredReturnType.cs

@ -82,7 +82,8 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -82,7 +82,8 @@ namespace Grunwald.BooBinding.CodeCompletion
public override void OnYieldStatement(YieldStatement node)
{
noReturnStatement = false;
result = ReflectionReturnType.CreatePrimitive(typeof(System.Collections.IEnumerable));
IClass enumerable = ProjectContentRegistry.Mscorlib.GetClass("System.Collections.Generic.IEnumerable", 1);
result = new ConstructedReturnType(enumerable.DefaultReturnType, new IReturnType[] { new InferredReturnType(node.Expression, context) });
}
public override bool Visit(Node node)

23
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs

@ -291,6 +291,17 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -291,6 +291,17 @@ namespace Grunwald.BooBinding.CodeCompletion
}
} else {
if (resolveResult != null) {
if (resolveResult is TypeResolveResult) {
IClass rClass = (resolveResult as TypeResolveResult).ResolvedClass;
if (rClass != null) {
foreach (IClass innerClass in rClass.InnerClasses) {
if (IsSameName(innerClass.Name, node.Name)) {
MakeTypeResult(innerClass);
return;
}
}
}
}
ResolveMember(resolveResult.ResolvedType, node.Name);
}
}
@ -531,8 +542,6 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -531,8 +542,6 @@ namespace Grunwald.BooBinding.CodeCompletion
case BinaryOperatorType.Member:
case BinaryOperatorType.NotMatch:
case BinaryOperatorType.NotMember:
case BinaryOperatorType.Or:
case BinaryOperatorType.And:
case BinaryOperatorType.ReferenceEquality:
case BinaryOperatorType.ReferenceInequality:
case BinaryOperatorType.TypeTest:
@ -566,7 +575,15 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -566,7 +575,15 @@ namespace Grunwald.BooBinding.CodeCompletion
public override void OnCallableBlockExpression(CallableBlockExpression node)
{
MakeResult(new AnonymousMethodReturnType());
AnonymousMethodReturnType amrt = new AnonymousMethodReturnType(cu);
if (node.ReturnType != null) {
amrt.MethodReturnType = ConvertType(node.ReturnType);
} else {
amrt.MethodReturnType = new InferredReturnType(node.Body, resolver.CallingClass);
}
ConvertVisitor.AddParameters(node.Parameters, amrt.MethodParameters, resolver.CallingMember, resolver.CallingClass ?? new DefaultClass(resolver.CompilationUnit, "__Dummy"));
MakeResult(amrt);
}
public override void OnCallableTypeReference(CallableTypeReference node)

34
src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/VariableLookupVisitor.cs

@ -26,9 +26,28 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -26,9 +26,28 @@ namespace Grunwald.BooBinding.CodeCompletion
DeclarationFound(node.Declaration.Name, node.Declaration.Type, node.Initializer, node.LexicalInfo);
}
public override void OnParameterDeclaration(ParameterDeclaration node)
LexicalInfo GetEndSourceLocation(Node node)
{
if (node.LexicalInfo.IsValid) return node.LexicalInfo;
if (node is CallableBlockExpression) {
return GetEndSourceLocation((node as CallableBlockExpression).Body);
} else if (node is Block) {
StatementCollection st = (node as Block).Statements;
if (st.Count > 0) {
return GetEndSourceLocation(st[st.Count - 1]);
}
}
return node.LexicalInfo;
}
public override void OnCallableBlockExpression(CallableBlockExpression node)
{
DeclarationFound(node.Name, node.Type, null, node.LexicalInfo);
if (node.LexicalInfo.Line <= resolver.CaretLine && GetEndSourceLocation(node).Line >= resolver.CaretLine - 1) {
foreach (ParameterDeclaration param in node.Parameters) {
DeclarationFound(param.Name, param.Type, null, param.LexicalInfo);
}
base.OnCallableBlockExpression(node);
}
}
protected override void OnError(Node node, Exception error)
@ -51,7 +70,7 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -51,7 +70,7 @@ namespace Grunwald.BooBinding.CodeCompletion
public override void OnForStatement(ForStatement node)
{
if (node.LexicalInfo.Line <= resolver.CaretLine && node.Block.EndSourceLocation.Line >= resolver.CaretLine - 1) {
if (node.LexicalInfo.Line <= resolver.CaretLine && GetEndSourceLocation(node).Line >= resolver.CaretLine - 1) {
foreach (Declaration decl in node.Declarations) {
IterationDeclarationFound(decl.Name, decl.Type, node.Iterator, node.LexicalInfo);
}
@ -142,7 +161,14 @@ namespace Grunwald.BooBinding.CodeCompletion @@ -142,7 +161,14 @@ namespace Grunwald.BooBinding.CodeCompletion
{
if (expr == null)
return;
IReturnType returnType = new InferredReturnType(expr, resolver.CallingClass);
// Prevent creating an infinite number of InferredReturnTypes in inferring cycles
IReturnType returnType;
if (expr.ContainsAnnotation("DomReturnType")) {
returnType = (IReturnType)expr["DomReturnType"];
} else {
returnType = new InferredReturnType(expr, resolver.CallingClass);
expr.Annotate("DomReturnType", returnType);
}
if (useElementType)
returnType = new ElementReturnType(returnType);
result = new DefaultField.LocalVariableField(returnType, name,

74
src/AddIns/BackendBindings/Boo/BooBinding/Test/BooBinding.Tests.csproj

@ -0,0 +1,74 @@ @@ -0,0 +1,74 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OutputType>Library</OutputType>
<RootNamespace>Grunwald.BooBinding.Tests</RootNamespace>
<AssemblyName>BooBinding.Tests</AssemblyName>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{6FA16499-896F-4C02-BB43-1AF5C6C7C713}</ProjectGuid>
<OutputPath>..\..\..\..\..\..\bin\UnitTests\</OutputPath>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<NoStdLib>False</NoStdLib>
<RegisterForComInterop>False</RegisterForComInterop>
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
<BaseAddress>4194304</BaseAddress>
<PlatformTarget>AnyCPU</PlatformTarget>
<FileAlignment>4096</FileAlignment>
<WarningLevel>4</WarningLevel>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<BaseIntermediateOutputPath>obj\</BaseIntermediateOutputPath>
<IntermediateOutputPath>obj\Debug\</IntermediateOutputPath>
<Optimize>False</Optimize>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugSymbols>true</DebugSymbols>
<DebugType>Full</DebugType>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<BaseIntermediateOutputPath>obj\</BaseIntermediateOutputPath>
<IntermediateOutputPath>obj\Release\</IntermediateOutputPath>
<Optimize>True</Optimize>
<DefineConstants>TRACE</DefineConstants>
<DebugSymbols>False</DebugSymbols>
<DebugType>None</DebugType>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="nunit.framework" />
</ItemGroup>
<ItemGroup>
<Compile Include="ResolverTests.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\..\Main\Base\Project\ICSharpCode.SharpDevelop.csproj">
<Project>{2748AD25-9C63-4E12-877B-4DCE96FBED54}</Project>
<Name>ICSharpCode.SharpDevelop</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\..\Main\Core\Project\ICSharpCode.Core.csproj">
<Project>{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}</Project>
<Name>ICSharpCode.Core</Name>
</ProjectReference>
<ProjectReference Include="..\Project\BooBinding.csproj">
<Project>{4AC2D5F1-F671-480C-A075-6BF62B3721B2}</Project>
<Name>BooBinding</Name>
</ProjectReference>
<Content Include="..\..\..\..\..\..\bin\log4net.dll">
<Link>log4net.dll</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="..\..\..\..\..\..\bin\ICSharpCode.Core.dll">
<Link>ICSharpCode.Core.dll</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="..\..\..\..\..\..\bin\ICSharpCode.SharpDevelop.dll">
<Link>ICSharpCode.SharpDevelop.dll</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project>

142
src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs

@ -0,0 +1,142 @@ @@ -0,0 +1,142 @@
/*
* Created by SharpDevelop.
* User: Daniel Grunwald
* Date: 23.04.2006
* Time: 11:33
*/
using System;
using NUnit.Framework;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Dom;
using Grunwald.BooBinding.CodeCompletion;
namespace Grunwald.BooBinding.Tests
{
[TestFixture]
public class ResolverTests
{
T Resolve<T>(string code) where T : ResolveResult
{
return Resolve<T>(code, "/*1*/");
}
T Resolve<T>(string code, string marker) where T : ResolveResult
{
ResolveResult rr = Resolve(prog, new ExpressionResult(code), marker);
Assert.IsNotNull(rr, "Resolve must not return null");
Assert.IsInstanceOfType(typeof(T), rr, "Resolve must return instance of type " + typeof(T).Name);
return (T)rr;
}
ResolveResult Resolve(string prog, ExpressionResult er, string marker)
{
const string fileName = "tempFile.boo";
DefaultProjectContent pc = new DefaultProjectContent();
ParserService.ForceProjectContent(pc);
pc.ReferencedContents.Add(ProjectContentRegistry.Mscorlib);
pc.ReferencedContents.Add(ProjectContentRegistry.WinForms);
ICompilationUnit cu = new BooParser().Parse(pc, fileName, prog);
ParserService.UpdateParseInformation(cu, fileName, false, false);
cu.Classes.ForEach(pc.AddClassToNamespaceList);
int index = prog.IndexOf(marker);
int line = 1;
int column = 0;
for (int i = 0; i < index; i++) {
column++;
if (prog[i]=='\n') {
line++;
column = 0;
}
}
BooResolver r = new BooResolver();
return r.Resolve(er, line, column, fileName, prog);
}
const string prog =
"import System\n" +
"def MyMethod(arg as string):\n" +
"\tlocalVar = arg\n" +
"\t/*1*/\n" +
"\tclosure = { e as string | arg.IndexOf(e) /*inClosure*/ }\n" +
"\tindex = closure('.')\n" +
"\t/*2*/\n" +
"\tclosure2 = def(e as DateTime):\n" +
"\t\treturn e.Year\n" +
"\trecursiveClosure = def():\n" +
"\t\treturn recursiveClosure()\n" +
"\t/*3*/\n";
[Test]
public void MethodParameter()
{
LocalResolveResult rr = Resolve<LocalResolveResult>("arg");
Assert.IsTrue(rr.IsParameter);
Assert.AreEqual("System.String", rr.ResolvedType.FullyQualifiedName);
}
[Test]
public void LocalVariable()
{
LocalResolveResult rr = Resolve<LocalResolveResult>("localVar");
Assert.IsFalse(rr.IsParameter);
Assert.AreEqual("System.String", rr.ResolvedType.FullyQualifiedName);
}
[Test]
public void NullCoalescing()
{
ResolveResult rr = Resolve<ResolveResult>("localVar or arg");
Assert.AreEqual("System.String", rr.ResolvedType.FullyQualifiedName);
}
[Test]
public void InnerClassEnum()
{
TypeResolveResult trr = Resolve<TypeResolveResult>("Environment.SpecialFolder");
Assert.AreEqual("System.Environment.SpecialFolder", trr.ResolvedClass.FullyQualifiedName);
MemberResolveResult mrr = Resolve<MemberResolveResult>("Environment.SpecialFolder.Desktop");
Assert.AreEqual("System.Environment.SpecialFolder.Desktop", mrr.ResolvedMember.FullyQualifiedName);
}
[Test]
public void ClosureParameter()
{
LocalResolveResult rr = Resolve<LocalResolveResult>("e", "/*inClosure*/");
Assert.AreEqual("System.String", rr.ResolvedType.FullyQualifiedName);
Assert.IsNull(Resolve(prog, new ExpressionResult("e"), "/*1*/"));
}
[Test]
public void ClosureCall()
{
LocalResolveResult rr = Resolve<LocalResolveResult>("closure('.')", "/*2*/");
Assert.IsFalse(rr.IsParameter);
Assert.AreEqual("closure", rr.Field.Name);
Assert.AreEqual("System.Int32", rr.ResolvedType.FullyQualifiedName);
}
[Test]
public void ClosureCall2()
{
LocalResolveResult rr = Resolve<LocalResolveResult>("closure2(DateTime.Now)", "/*3*/");
Assert.IsFalse(rr.IsParameter);
Assert.AreEqual("closure2", rr.Field.Name);
Assert.AreEqual("System.Int32", rr.ResolvedType.FullyQualifiedName);
}
[Test]
public void RecursiveClosure()
{
// Code-completion cannot work here, test if SharpDevelop is correctly
// preventing the StackOverflow.
LocalResolveResult rr = Resolve<LocalResolveResult>("recursiveClosure", "/*3*/");
Assert.IsFalse(rr.IsParameter);
Assert.AreEqual("delegate():?", rr.ResolvedType.FullyQualifiedName);
}
}
}

4
src/AddIns/Misc/HtmlHelp2/Project/src/Service/Help2RegistryWalker.cs

@ -55,9 +55,9 @@ namespace HtmlHelp2.RegistryWalker @@ -55,9 +55,9 @@ namespace HtmlHelp2.RegistryWalker
else
help2Collections.SelectedIndex = 0;
}
catch
catch(Exception ex)
{
LoggingService.Error("Help 2.0: cannot build namespaces list for Options dialog");
LoggingService.Error("Help 2.0: cannot build namespaces list for Options dialog", ex);
}
help2Collections.EndUpdate();

54
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/Ime.cs

@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Windows.Forms;
namespace ICSharpCode.TextEditor
{
@ -31,15 +32,11 @@ namespace ICSharpCode.TextEditor @@ -31,15 +32,11 @@ namespace ICSharpCode.TextEditor
return font;
}
set {
if (font == null) {
if (!value.Equals(font)) {
font = value;
lf = null;
SetIMEWindowFont(value);
}
else if (font.Equals(value) == false) {
font = value;
lf = null;
}
SetIMEWindowFont(value);
}
}
@ -113,25 +110,33 @@ namespace ICSharpCode.TextEditor @@ -113,25 +110,33 @@ namespace ICSharpCode.TextEditor
}
private const int IMC_SETCOMPOSITIONFONT = 0x000a;
LOGFONT lf = null;
static bool disableIME;
private void SetIMEWindowFont(Font f)
{
if (disableIME || hIMEWnd == IntPtr.Zero) return;
if (lf == null) {
lf = new LOGFONT();
f.ToLogFont(lf);
lf.lfFaceName = f.Name; // This is very important! "Font.ToLogFont" Method sets invalid value to LOGFONT.lfFaceName
}
SendMessage(
hIMEWnd,
WM_IME_CONTROL,
new IntPtr(IMC_SETCOMPOSITIONFONT),
lf
);
try {
SendMessage(
hIMEWnd,
WM_IME_CONTROL,
new IntPtr(IMC_SETCOMPOSITIONFONT),
lf
);
} catch (AccessViolationException ex) {
Handle(ex);
}
}
public void SetIMEWindowLocation(int x, int y)
{
if (disableIME || hIMEWnd == IntPtr.Zero) return;
POINT p = new POINT();
p.x = x;
@ -142,12 +147,25 @@ namespace ICSharpCode.TextEditor @@ -142,12 +147,25 @@ namespace ICSharpCode.TextEditor
lParam.ptCurrentPos = p;
lParam.rcArea = new RECT();
SendMessage(
hIMEWnd,
WM_IME_CONTROL,
new IntPtr(IMC_SETCOMPOSITIONWINDOW),
lParam
);
try {
SendMessage(
hIMEWnd,
WM_IME_CONTROL,
new IntPtr(IMC_SETCOMPOSITIONWINDOW),
lParam
);
} catch (AccessViolationException ex) {
Handle(ex);
}
}
void Handle(Exception ex)
{
Console.WriteLine(ex);
if (!disableIME) {
disableIME = true;
MessageBox.Show("Error calling IME: " + ex.Message + "\nIME is disabled.", "IME error");
}
}
}
}

86
src/Main/Base/Project/Src/Dom/Implementations/AnonymousMethodReturnType.cs

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
using System;
using System.Collections.Generic;
using System.Text;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Dom
@ -16,15 +17,81 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -16,15 +17,81 @@ namespace ICSharpCode.SharpDevelop.Dom
/// </summary>
public sealed class AnonymousMethodReturnType : ProxyReturnType
{
IReturnType returnType;
List<IParameter> parameters = new List<IParameter>();
ICompilationUnit cu;
public AnonymousMethodReturnType(ICompilationUnit cu)
{
this.cu = cu;
}
/// <summary>
/// Return type of the anonymous method. Can be null if inferred from context.
/// </summary>
public IReturnType MethodReturnType {
get {
return returnType;
}
set {
returnType = value;
}
}
/// <summary>
/// Gets the list of method parameters.
/// </summary>
public IList<IParameter> MethodParameters {
get {
return parameters;
}
}
public override bool IsDefaultReturnType {
get {
return false;
}
}
volatile DefaultClass cachedClass;
public override IClass GetUnderlyingClass()
{
if (cachedClass != null) return cachedClass;
DefaultClass c = new DefaultClass(cu, ClassType.Delegate, ModifierEnum.None, DomRegion.Empty, null);
c.BaseTypes.Add(ReflectionReturnType.CreatePrimitive(typeof(Delegate)));
AddDefaultDelegateMethod(c, returnType ?? ReflectionReturnType.Object, parameters);
cachedClass = c;
return c;
}
internal static void AddDefaultDelegateMethod(DefaultClass c, IReturnType returnType, IList<IParameter> parameters)
{
DefaultMethod invokeMethod = new DefaultMethod("Invoke", returnType, ModifierEnum.Public, c.Region, DomRegion.Empty, c);
foreach (IParameter par in parameters) {
invokeMethod.Parameters.Add(par);
}
c.Methods.Add(invokeMethod);
invokeMethod = new DefaultMethod("BeginInvoke", CreateReturnType(typeof(IAsyncResult)), ModifierEnum.Public, c.Region, DomRegion.Empty, c);
foreach (IParameter par in parameters) {
invokeMethod.Parameters.Add(par);
}
invokeMethod.Parameters.Add(new DefaultParameter("callback", CreateReturnType(typeof(AsyncCallback)), DomRegion.Empty));
invokeMethod.Parameters.Add(new DefaultParameter("object", ReflectionReturnType.Object, DomRegion.Empty));
c.Methods.Add(invokeMethod);
invokeMethod = new DefaultMethod("EndInvoke", returnType, ModifierEnum.Public, c.Region, DomRegion.Empty, c);
invokeMethod.Parameters.Add(new DefaultParameter("result", CreateReturnType(typeof(IAsyncResult)), DomRegion.Empty));
c.Methods.Add(invokeMethod);
}
static IReturnType CreateReturnType(Type type)
{
return ReflectionReturnType.Create(ProjectContentRegistry.Mscorlib, null, type, false);
}
public override IReturnType BaseType {
get {
return ReflectionReturnType.Delegate;
return GetUnderlyingClass().DefaultReturnType;
}
}
@ -36,7 +103,22 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -36,7 +103,22 @@ namespace ICSharpCode.SharpDevelop.Dom
public override string FullyQualifiedName {
get {
return Name;
StringBuilder b = new StringBuilder("delegate(");
bool first = true;
foreach (IParameter p in parameters) {
if (first) first = false; else b.Append(", ");
b.Append(p.Name);
if (p.ReturnType != null) {
b.Append(":");
b.Append(p.ReturnType.Name);
}
}
b.Append(")");
if (returnType != null) {
b.Append(":");
b.Append(returnType.Name);
}
return b.ToString();
}
}

44
src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs

@ -389,25 +389,15 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -389,25 +389,15 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
}
currentClass.Push(c); // necessary for CreateReturnType
ConvertTemplates(templates, c);
DefaultMethod invokeMethod = new DefaultMethod("Invoke", CreateReturnType(returnType), ModifierEnum.Public, c.Region, DomRegion.Empty, c);
if (parameters != null) {
foreach (AST.ParameterDeclarationExpression par in parameters) {
invokeMethod.Parameters.Add(CreateParameter(par));
}
}
c.Methods.Add(invokeMethod);
invokeMethod = new DefaultMethod("BeginInvoke", CreateReturnType(typeof(IAsyncResult)), ModifierEnum.Public, c.Region, DomRegion.Empty, c);
List<IParameter> p = new List<IParameter>();
if (parameters != null) {
foreach (AST.ParameterDeclarationExpression par in parameters) {
invokeMethod.Parameters.Add(CreateParameter(par));
foreach (AST.ParameterDeclarationExpression param in parameters) {
p.Add(CreateParameter(param));
}
}
invokeMethod.Parameters.Add(new DefaultParameter("callback", CreateReturnType(typeof(AsyncCallback)), DomRegion.Empty));
invokeMethod.Parameters.Add(new DefaultParameter("object", ReflectionReturnType.Object, DomRegion.Empty));
c.Methods.Add(invokeMethod);
invokeMethod = new DefaultMethod("EndInvoke", CreateReturnType(returnType), ModifierEnum.Public, c.Region, DomRegion.Empty, c);
invokeMethod.Parameters.Add(new DefaultParameter("result", CreateReturnType(typeof(IAsyncResult)), DomRegion.Empty));
c.Methods.Add(invokeMethod);
AnonymousMethodReturnType.AddDefaultDelegateMethod(c, CreateReturnType(returnType), p);
currentClass.Pop();
}
@ -418,7 +408,12 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -418,7 +408,12 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
IParameter CreateParameter(AST.ParameterDeclarationExpression par, IMethod method)
{
IReturnType parType = CreateReturnType(par.TypeReference, method);
return CreateParameter(par, method, GetCurrentClass(), cu);
}
internal static IParameter CreateParameter(AST.ParameterDeclarationExpression par, IMethod method, IClass currentClass, ICompilationUnit cu)
{
IReturnType parType = CreateReturnType(par.TypeReference, method, currentClass, cu);
DefaultParameter p = new DefaultParameter(par.ParameterName, parType, new DomRegion(par.StartLocation, par.EndLocation));
p.Modifiers = (ParameterModifiers)par.ParamModifier;
return p;
@ -597,11 +592,15 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -597,11 +592,15 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
IReturnType CreateReturnType(AST.TypeReference reference, IMethod method)
{
IClass c = GetCurrentClass();
if (c == null) {
return CreateReturnType(reference, method, GetCurrentClass(), cu);
}
static IReturnType CreateReturnType(AST.TypeReference reference, IMethod method, IClass currentClass, ICompilationUnit cu)
{
if (currentClass == null) {
return TypeVisitor.CreateReturnType(reference, new DefaultClass(cu, "___DummyClass"), method, 1, 1, cu.ProjectContent, true);
} else {
return TypeVisitor.CreateReturnType(reference, c, method, c.Region.BeginLine + 1, 1, cu.ProjectContent, true);
return TypeVisitor.CreateReturnType(reference, currentClass, method, currentClass.Region.BeginLine + 1, 1, cu.ProjectContent, true);
}
}
@ -609,10 +608,5 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -609,10 +608,5 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
{
return CreateReturnType(reference, null);
}
IReturnType CreateReturnType(Type type)
{
return ReflectionReturnType.Create(ProjectContentRegistry.Mscorlib, null, type, false);
}
}
}

6
src/Main/Base/Project/Src/Dom/NRefactoryResolver/TypeVisitor.cs

@ -428,7 +428,11 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver @@ -428,7 +428,11 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
public override object Visit(AnonymousMethodExpression anonymousMethodExpression, object data)
{
return new AnonymousMethodReturnType();
AnonymousMethodReturnType amrt = new AnonymousMethodReturnType(resolver.CompilationUnit);
foreach (ParameterDeclarationExpression param in anonymousMethodExpression.Parameters) {
amrt.MethodParameters.Add(NRefactoryASTConvertVisitor.CreateParameter(param, resolver.CallingMember as IMethod, resolver.CallingClass, resolver.CompilationUnit));
}
return amrt;
}
public override object Visit(ArrayInitializerExpression arrayInitializerExpression, object data)

Loading…
Cancel
Save