From b35f1f247c1f82a33e8d2cbe4ebbeea0662ac62b Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 11 Dec 2010 16:22:19 +0100 Subject: [PATCH] Handle 'a::b' as MemberType (move aliases out of SimpleType). --- .../CSharp/Resolver/SimpleNameLookupTests.cs | 2 +- .../Dom/GeneralScope/UsingDeclaration.cs | 9 +++--- .../CSharp/Dom/MemberType.cs | 2 ++ .../CSharp/Dom/SimpleType.cs | 17 ---------- .../CSharp/Parser/CSharpParser.cs | 10 ++---- .../CSharp/Parser/TypeSystemConvertVisitor.cs | 31 +++++++++++-------- 6 files changed, 27 insertions(+), 44 deletions(-) diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/SimpleNameLookupTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/SimpleNameLookupTests.cs index f99f6c45c6..caa66e0993 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/SimpleNameLookupTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/SimpleNameLookupTests.cs @@ -190,7 +190,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver Assert.AreSame(SharedTypes.UnknownType, result.Type); } - [Test, Ignore("not yet implemented (depends on distuishing types and expressions)")] + [Test, Ignore("not yet implemented (depends on distuishing types and expressions in the DOM)")] public void PropertyNameAmbiguousWithTypeName() { string program = @"class A { diff --git a/ICSharpCode.NRefactory/CSharp/Dom/GeneralScope/UsingDeclaration.cs b/ICSharpCode.NRefactory/CSharp/Dom/GeneralScope/UsingDeclaration.cs index 4d584a0696..b96a733e9b 100644 --- a/ICSharpCode.NRefactory/CSharp/Dom/GeneralScope/UsingDeclaration.cs +++ b/ICSharpCode.NRefactory/CSharp/Dom/GeneralScope/UsingDeclaration.cs @@ -55,16 +55,15 @@ namespace ICSharpCode.NRefactory.CSharp MemberType m = import as MemberType; if (m != null && !m.TypeArguments.Any()) { AppendName(b, m.Target); - b.Append('.'); + if (m.IsDoubleColon) + b.Append("::"); + else + b.Append('.'); b.Append(m.Identifier); return true; } SimpleType t = import as SimpleType; if (t != null && !t.TypeArguments.Any()) { - if (t.IsQualifiedWithAlias) { - b.Append(t.AliasIdentifier.Name); - b.Append("::"); - } b.Append(t.Identifier); return true; } diff --git a/ICSharpCode.NRefactory/CSharp/Dom/MemberType.cs b/ICSharpCode.NRefactory/CSharp/Dom/MemberType.cs index 8ef47f22a2..1af3de4b65 100644 --- a/ICSharpCode.NRefactory/CSharp/Dom/MemberType.cs +++ b/ICSharpCode.NRefactory/CSharp/Dom/MemberType.cs @@ -38,6 +38,8 @@ namespace ICSharpCode.NRefactory.CSharp } } + public bool IsDoubleColon { get; set; } + public DomNode Target { get { return GetChildByRole(Roles.TargetExpression) ?? DomNode.Null; } } diff --git a/ICSharpCode.NRefactory/CSharp/Dom/SimpleType.cs b/ICSharpCode.NRefactory/CSharp/Dom/SimpleType.cs index 23d51b8d20..fd8b1ed6b6 100644 --- a/ICSharpCode.NRefactory/CSharp/Dom/SimpleType.cs +++ b/ICSharpCode.NRefactory/CSharp/Dom/SimpleType.cs @@ -32,29 +32,12 @@ namespace ICSharpCode.NRefactory.CSharp { public class SimpleType : DomNode { - public const int AliasRole = 100; - public override NodeType NodeType { get { return NodeType.Type; } } - /// - /// Gets whether this simple type is qualified with an alias - /// - public bool IsQualifiedWithAlias { - get { - return GetChildByRole (AliasRole) != null; - } - } - - public Identifier AliasIdentifier { - get { - return (Identifier)GetChildByRole (AliasRole) ?? CSharp.Identifier.Null; - } - } - public Identifier IdentifierToken { get { return (Identifier)GetChildByRole (Roles.Identifier) ?? CSharp.Identifier.Null; diff --git a/ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs b/ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs index bf61792134..d8d026356c 100644 --- a/ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs +++ b/ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs @@ -123,16 +123,10 @@ namespace ICSharpCode.NRefactory.CSharp DomNode ConvertImport (MemberName memberName) { - if (memberName.IsDoubleColon && memberName.Left != null) { - // left::name - SimpleType t = new SimpleType(); - t.AddChild (new Identifier (memberName.Left.Name, Convert(memberName.Location)), SimpleType.AliasRole); - t.AddChild (new Identifier (memberName.Name, Convert(memberName.Location)), SimpleType.Roles.Identifier); - // TODO type arguments - return t; - } else if (memberName.Left != null) { + if (memberName.Left != null) { // left.name MemberType t = new MemberType(); + t.IsDoubleColon = memberName.IsDoubleColon; t.AddChild (ConvertImport (memberName.Left), MemberType.Roles.TargetExpression); t.AddChild (new Identifier (memberName.Name, Convert(memberName.Location)), MemberType.Roles.Identifier); return t; diff --git a/ICSharpCode.NRefactory/CSharp/Parser/TypeSystemConvertVisitor.cs b/ICSharpCode.NRefactory/CSharp/Parser/TypeSystemConvertVisitor.cs index bafabf2d22..327b4305d3 100644 --- a/ICSharpCode.NRefactory/CSharp/Parser/TypeSystemConvertVisitor.cs +++ b/ICSharpCode.NRefactory/CSharp/Parser/TypeSystemConvertVisitor.cs @@ -513,20 +513,15 @@ namespace ICSharpCode.NRefactory.CSharp foreach (var ta in s.TypeArguments) { typeArguments.Add(ConvertType(ta, parentTypeDefinition, parentMethodDefinition, parentUsingScope, isInUsingDeclaration)); } - if (s.IsQualifiedWithAlias) { - AliasNamespaceReference ar = new AliasNamespaceReference(s.AliasIdentifier.Name, parentUsingScope); - return new MemberTypeOrNamespaceReference(ar, s.Identifier, typeArguments, parentTypeDefinition, parentUsingScope); - } else { - if (typeArguments.Count == 0 && parentMethodDefinition != null) { - // SimpleTypeOrNamespaceReference doesn't support method type parameters, - // so we directly handle them here. - foreach (ITypeParameter tp in parentMethodDefinition.TypeParameters) { - if (tp.Name == s.Identifier) - return tp; - } + if (typeArguments.Count == 0 && parentMethodDefinition != null) { + // SimpleTypeOrNamespaceReference doesn't support method type parameters, + // so we directly handle them here. + foreach (ITypeParameter tp in parentMethodDefinition.TypeParameters) { + if (tp.Name == s.Identifier) + return tp; } - return new SimpleTypeOrNamespaceReference(s.Identifier, typeArguments, parentTypeDefinition, parentUsingScope, isInUsingDeclaration); } + return new SimpleTypeOrNamespaceReference(s.Identifier, typeArguments, parentTypeDefinition, parentUsingScope, isInUsingDeclaration); } PrimitiveType p = node as PrimitiveType; if (p != null) { @@ -567,7 +562,17 @@ namespace ICSharpCode.NRefactory.CSharp } MemberType m = node as MemberType; if (m != null) { - ITypeOrNamespaceReference t = ConvertType(m.Target, parentTypeDefinition, parentMethodDefinition, parentUsingScope, isInUsingDeclaration) as ITypeOrNamespaceReference; + ITypeOrNamespaceReference t; + if (m.IsDoubleColon) { + SimpleType st = m.Target as SimpleType; + if (st != null) { + t = new AliasNamespaceReference(st.Identifier, parentUsingScope); + } else { + t = null; + } + } else { + t = ConvertType(m.Target, parentTypeDefinition, parentMethodDefinition, parentUsingScope, isInUsingDeclaration) as ITypeOrNamespaceReference; + } if (t == null) return SharedTypes.UnknownType; List typeArguments = new List();