diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs index b711869849..ac706d6028 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs @@ -26,7 +26,7 @@ namespace Grunwald.BooBinding.CodeCompletion int caretLine; int caretColumn; IClass callingClass; - IMember callingMember; + IMethodOrProperty callingMember; public IClass CallingClass { get { @@ -34,7 +34,7 @@ namespace Grunwald.BooBinding.CodeCompletion } } - public IMember CallingMember { + public IMethodOrProperty CallingMember { get { return callingMember; } @@ -107,28 +107,32 @@ namespace Grunwald.BooBinding.CodeCompletion return callingClass; } - IMember ResolveCurrentMember(IClass callingClass) + IMethodOrProperty ResolveCurrentMember(IClass callingClass) { //LoggingService.DebugFormatted("Getting current method... caretLine = {0}, caretColumn = {1}", caretLine, caretColumn); if (callingClass == null) return null; - IMember best = null; + IMethodOrProperty best = null; int line = 0; - foreach (IMember m in callingClass.Methods) { + foreach (IMethod m in callingClass.Methods) { if (m.Region.BeginLine <= caretLine && m.Region.BeginLine > line) { line = m.Region.BeginLine; best = m; } } - foreach (IMember m in callingClass.Properties) { + foreach (IProperty m in callingClass.Properties) { if (m.Region.BeginLine <= caretLine && m.Region.BeginLine > line) { line = m.Region.BeginLine; best = m; } } if (callingClass.Region.IsEmpty) { - foreach (IMember m in callingClass.Methods) { - if (best == null || best.Region.EndLine < caretLine) - return m; + // maybe we are in Main method? + foreach (IMethod m in callingClass.Methods) { + if (m.Region.IsEmpty && !m.IsSynthetic) { + // the main method + if (best == null || best.BodyRegion.EndLine < caretLine) + return m; + } } } return best; diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs index 69c59fa9a9..c9c224748c 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs @@ -152,7 +152,7 @@ namespace Grunwald.BooBinding.CodeCompletion return true; } - IMethodOrProperty method = resolver.CallingMember as IMethodOrProperty; + IMethodOrProperty method = resolver.CallingMember; if (method != null) { foreach (IParameter p in method.Parameters) { if (IsSameName(p.Name, identifier)) { diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs index c20dae9e1f..05a614462c 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs @@ -474,8 +474,14 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver int endLine = bodyRegion.EndLine; // Fix for SD2-511 (Code completion in inserted line) - if (caretLine > startLine && caretLine < endLine) - endLine = caretLine; + if (language == SupportedLanguage.CSharp) { + // Do not do this for VB: the parser does not correct create the + // ForEachStatement when the method in truncated in the middle + // VB does not have the "inserted line looks like variable declaration"-problem + // anyways. + if (caretLine > startLine && caretLine < endLine) + endLine = caretLine; + } int offset = 0; for (int i = 0; i < startLine - 1; ++i) { // -1 because the startLine must be included diff --git a/src/Main/Base/Project/Src/Project/MSBuildEngine.cs b/src/Main/Base/Project/Src/Project/MSBuildEngine.cs index 40a876437c..aac29d092f 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildEngine.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildEngine.cs @@ -198,8 +198,12 @@ namespace ICSharpCode.SharpDevelop.Project engine.RegisterLogger(logger); Microsoft.Build.BuildEngine.Project project = engine.CreateNewProject(); - project.Load(buildFile); - engine.BuildProject(project, targets); + try { + project.Load(buildFile); + engine.BuildProject(project, targets); + } catch (InvalidProjectFileException ex) { + results.Errors.Add(new CompilerError(ex.ProjectFile, ex.LineNumber, ex.ColumnNumber, ex.ErrorCode, ex.Message)); + } LoggingService.Debug("MSBuild finished"); MSBuildEngine.isRunning = false;