From 11aa8738154cdf3f1c26557a5e87b21b47342eab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Kr=C3=BCger?= Date: Fri, 25 Jan 2013 11:31:19 +0100 Subject: [PATCH] Added alias resolve results that allows it to handle aliases more easily. (for example showing them in the text editor UI or tooltips) --- .../ICSharpCode.NRefactory.CSharp.csproj | 2 + .../Resolver/AliasNamespaceResolveResult.cs | 61 ++++++++++++++++++ .../Resolver/AliasTypeResolveResult.cs | 62 +++++++++++++++++++ .../TypeSystem/ResolvedUsingScope.cs | 8 ++- .../CSharp/Resolver/NameLookupTests.cs | 4 +- 5 files changed, 134 insertions(+), 3 deletions(-) create mode 100644 ICSharpCode.NRefactory.CSharp/Resolver/AliasNamespaceResolveResult.cs create mode 100644 ICSharpCode.NRefactory.CSharp/Resolver/AliasTypeResolveResult.cs diff --git a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj index cd4adad728..fd81292fb1 100644 --- a/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj +++ b/ICSharpCode.NRefactory.CSharp/ICSharpCode.NRefactory.CSharp.csproj @@ -510,6 +510,8 @@ + + diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/AliasNamespaceResolveResult.cs b/ICSharpCode.NRefactory.CSharp/Resolver/AliasNamespaceResolveResult.cs new file mode 100644 index 0000000000..6a0d4ae2eb --- /dev/null +++ b/ICSharpCode.NRefactory.CSharp/Resolver/AliasNamespaceResolveResult.cs @@ -0,0 +1,61 @@ +// +// AliasResolveResult.cs +// +// Author: +// Mike Krüger +// +// Copyright (c) 2013 Xamarin Inc. (http://xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using ICSharpCode.NRefactory.Semantics; +using System.Collections.Generic; +using ICSharpCode.NRefactory.CSharp.TypeSystem; + +namespace ICSharpCode.NRefactory.CSharp +{ + /// + /// Represents a namespace resolve result that's resolved using an alias. + /// + public class AliasNamespaceResolveResult : NamespaceResolveResult + { + /// + /// The alias used. + /// + public string Alias { + get; + private set; + } + + /// + /// The namespace reference that was aliased. + /// + public TypeOrNamespaceReference Reference { + get; + private set; + } + + public AliasNamespaceResolveResult(string alias, TypeOrNamespaceReference reference, NamespaceResolveResult underlyingResult) : base (underlyingResult.Namespace) + { + this.Alias = alias; + this.Reference = reference; + } + } +} + diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/AliasTypeResolveResult.cs b/ICSharpCode.NRefactory.CSharp/Resolver/AliasTypeResolveResult.cs new file mode 100644 index 0000000000..ca3a85a55f --- /dev/null +++ b/ICSharpCode.NRefactory.CSharp/Resolver/AliasTypeResolveResult.cs @@ -0,0 +1,62 @@ +// +// AliasTypeResolveResult.cs +// +// Author: +// Mike Krüger +// +// Copyright (c) 2013 Xamarin Inc. (http://xamarin.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +using ICSharpCode.NRefactory.Semantics; +using System.Collections.Generic; +using ICSharpCode.NRefactory.CSharp.TypeSystem; + +namespace ICSharpCode.NRefactory.CSharp +{ + /// + /// Represents a type resolve result that's resolved using an alias. + /// + public class AliasTypeResolveResult : TypeResolveResult + { + /// + /// The alias used. + /// + public string Alias { + get; + private set; + } + + /// + /// The type reference that was aliased. + /// + public TypeOrNamespaceReference Reference { + get; + private set; + } + + public AliasTypeResolveResult(string alias, TypeOrNamespaceReference reference, TypeResolveResult underlyingResult) : base (underlyingResult.Type) + { + this.Alias = alias; + this.Reference = reference; + } + } + +} diff --git a/ICSharpCode.NRefactory.CSharp/TypeSystem/ResolvedUsingScope.cs b/ICSharpCode.NRefactory.CSharp/TypeSystem/ResolvedUsingScope.cs index 43a81a5635..8503c6fb14 100644 --- a/ICSharpCode.NRefactory.CSharp/TypeSystem/ResolvedUsingScope.cs +++ b/ICSharpCode.NRefactory.CSharp/TypeSystem/ResolvedUsingScope.cs @@ -116,9 +116,15 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem CSharpResolver resolver = new CSharpResolver(parentContext.WithUsingScope(this)); result = new KeyValuePair[usingScope.UsingAliases.Count]; for (int i = 0; i < result.Count; i++) { + var rr = usingScope.UsingAliases[i].Value.Resolve(resolver); + if (rr is TypeResolveResult) { + rr = new AliasTypeResolveResult (usingScope.UsingAliases[i].Key, usingScope.UsingAliases[i].Value, (TypeResolveResult)rr); + } else if (rr is NamespaceResolveResult) { + rr = new AliasNamespaceResolveResult (usingScope.UsingAliases[i].Key, usingScope.UsingAliases[i].Value, (NamespaceResolveResult)rr); + } result[i] = new KeyValuePair( usingScope.UsingAliases[i].Key, - usingScope.UsingAliases[i].Value.Resolve(resolver) + rr ); } return LazyInit.GetOrSet(ref this.usingAliases, result); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/NameLookupTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/NameLookupTests.cs index 9eda66f4ba..326f941a3f 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/NameLookupTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/NameLookupTests.cs @@ -438,7 +438,7 @@ class TestClass { { NamespaceResolveResult ns; string program = "using COL = System.Collections;\r\nclass A {\r\n$.ArrayList a;\r\n}\r\n"; - ns = Resolve(program.Replace("$", "$COL$")); + ns = Resolve(program.Replace("$", "$COL$")); Assert.AreEqual("System.Collections", ns.NamespaceName, "COL"); ns = Resolve(program.Replace("$", "$COL.Generic$")); Assert.AreEqual("System.Collections.Generic", ns.NamespaceName, "COL.Generic"); @@ -455,7 +455,7 @@ class TestClass { } } "; - TypeResolveResult trr = Resolve(program.Replace("COL a", "$COL$ a")); + TypeResolveResult trr = Resolve(program.Replace("COL a", "$COL$ a")); Assert.AreEqual("System.Collections.ArrayList", trr.Type.FullName, "COL"); ResolveResult rr = Resolve(program.Replace("new COL()", "$new COL()$")); Assert.AreEqual("System.Collections.ArrayList", rr.Type.FullName, "a");