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 198ac9d872..a76551c119 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/BooResolver.cs @@ -221,7 +221,8 @@ namespace Grunwald.BooBinding.CodeCompletion if (mie != null) expr = mie.Target; string name = expr.ToCodeString(); - IReturnType rt = pc.SearchType(new SearchTypeRequest(name, 0, callingClass, cu, caretLine, caretColumn)).Result; + SearchTypeResult searchTypeResult = pc.SearchType(new SearchTypeRequest(name, 0, callingClass, cu, caretLine, caretColumn)); + IReturnType rt = searchTypeResult.Result; if (rt != null && rt.GetUnderlyingClass() != null) return new TypeResolveResult(callingClass, callingMember, rt); rt = pc.SearchType(new SearchTypeRequest(name + "Attribute", 0, callingClass, cu, caretLine, caretColumn)).Result; @@ -232,7 +233,7 @@ namespace Grunwald.BooBinding.CodeCompletion if (c != null) return new TypeResolveResult(callingClass, callingMember, c); } - string namespaceName = pc.SearchNamespace(name, callingClass, cu, caretLine, caretColumn); + string namespaceName = searchTypeResult.NamespaceResult; if (namespaceName != null) { return new NamespaceResolveResult(callingClass, callingMember, namespaceName); } diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs index b477e23094..7a7dcfe3e5 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ConvertVisitor.cs @@ -506,9 +506,23 @@ namespace Grunwald.BooBinding.CodeCompletion property.UserData = node; } + string PrependCurrentNamespace(string name) + { + if (string.IsNullOrEmpty(_cu.UsingScope.NamespaceName)) + return name; + else + return _cu.UsingScope.NamespaceName + "." + name; + } + public override void OnNamespaceDeclaration(Boo.Lang.Compiler.Ast.NamespaceDeclaration node) { - _cu.UsingScope = new DefaultUsingScope { NamespaceName = node.Name }; + string[] namespaceName = node.Name.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries); + foreach (string namePart in namespaceName) { + _cu.UsingScope = new DefaultUsingScope { + NamespaceName = PrependCurrentNamespace(namePart), + Parent = _cu.UsingScope + }; + } base.OnNamespaceDeclaration(node); } } 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 c7fd50193e..d1432e9198 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Project/Src/CodeCompletion/ResolveVisitor.cs @@ -192,9 +192,9 @@ namespace Grunwald.BooBinding.CodeCompletion } } - string namespaceName = projectContent.SearchNamespace(identifier, callingClass, cu, resolver.CaretLine, resolver.CaretColumn); - if (namespaceName != null && namespaceName.Length > 0) { - MakeNamespaceResult(namespaceName); + SearchTypeResult searchTypeResult = projectContent.SearchType(new SearchTypeRequest(identifier, 0, callingClass, cu, resolver.CaretLine, resolver.CaretColumn)); + if (!string.IsNullOrEmpty(searchTypeResult.NamespaceResult)) { + MakeNamespaceResult(searchTypeResult.NamespaceResult); return true; } diff --git a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs index 776362b231..fc40ed4f25 100644 --- a/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs +++ b/src/AddIns/BackendBindings/Boo/BooBinding/Test/ResolverTests.cs @@ -450,5 +450,25 @@ namespace Grunwald.BooBinding.Tests CtrlSpace(prog, "x", "bar", "i"); } #endregion + + [Test] + public void SystemNamespaceInFileWithNamespace() + { + string prog = + "namespace Test\n" + + "/*mark*/"; + NamespaceResolveResult nrr = Resolve(prog, "System", "/*mark*/"); + Assert.AreEqual("System", nrr.Name); + } + + [Test] + public void ClassInParentNamespace() + { + string prog = + "namespace System.Collections.CustomSubNamespace\n" + + "/*mark*/"; + TypeResolveResult trr = Resolve(prog, "ICollection", "/*mark*/"); + Assert.AreEqual("System.Collections.ICollection", trr.ResolvedClass.FullyQualifiedName); + } } } diff --git a/src/Libraries/NRefactory/Project/Src/Lexer/Special/PreProcessingDirective.cs b/src/Libraries/NRefactory/Project/Src/Lexer/Special/PreProcessingDirective.cs index 9baa88c6a8..8f020bf180 100644 --- a/src/Libraries/NRefactory/Project/Src/Lexer/Special/PreProcessingDirective.cs +++ b/src/Libraries/NRefactory/Project/Src/Lexer/Special/PreProcessingDirective.cs @@ -39,6 +39,13 @@ namespace ICSharpCode.NRefactory cmd = "#if"; if (arg.ToLowerInvariant().EndsWith(" then")) arg = arg.Substring(0, arg.Length - 5); + } else if (cmd.Equals("#Else", StringComparison.InvariantCultureIgnoreCase)) { + if (dir.Expression != null) + cmd = "#elif"; + else + cmd = "#else"; + } else if (cmd.Equals("#ElseIf", StringComparison.InvariantCultureIgnoreCase)) { + cmd = "#elif"; } return new PreprocessingDirective(cmd, arg, dir.StartPosition, dir.EndPosition) { Expression = dir.Expression